FHEM Forum

FHEM - Hausautomations-Systeme => MQTT => Thema gestartet von: Otto123 am 31 Mai 2020, 18:30:55

Titel: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 31 Mai 2020, 18:30:55
Es gibt jetzt zwei Wiki Artikel für die Einrichtung und die Ergebnisse aus diesem Thread:
https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Sonos2Mqtt
https://wiki.fhem.de/wiki/Sonos2mqtt

Dazu gibt es auch noch einen Beitrag in meinem Blog:
https://heinz-otto.blogspot.com/2020/05/sonos2mqtt-so-weit-bin-ich.html

########
Der folgende Text ist der Original Post und entspricht nach wenigen Tagen nicht mehr dem Stand der Entwicklungen
Viele Spaß beim Testen
########

Hallo liebe FHEM-Sonos User,

Für mich ist dies mehr so ein Versuch - aus Interesse. Vielleicht gibt es ja interessierte Mitstreiter oder die eine oder andere Idee vom Spezi :)

Ich verwende das Sonos Modul im minimalem Umfang, die Visualisierung spielt dabei für mich keine Rolle:
Ich habe eigentlich wenig Probleme damit, mich interessiert mehr so die Vereinheitlichung der Anbindung von Geräten.

sonos2mqtt  (https://www.npmjs.com/package/sonos2mqtt)ist (ein 2 Jahre altes?) Projekt welches aktiv entwickelt wird, offenbar primär für die Anbindung an Homeassistent. Aber von der Sache her ist es eine Bridge Sonos - MQTT.

Installation
Ich habe die lokale Installation gewählt, ich habe erstmal eine separate Linux Instanz verwendet. Aber aus meiner Sicht ist die Sache unkritisch, man kann es in jede Umgebung einbinden.  Falls noch kein nodejs existiert muss man das zuerst installieren (ab Pi2):
sudo bash -c "curl -sL https://deb.nodesource.com/setup_10.x | bash -"
sudo apt-get install nodejs

Dann sonos2mqtt installieren (siehe Projekt Webseite):
sudo npm install -g sonos2mqtt
sudo npm install pm2 -g

Mal schauen ob es geklappt hat
node /node_modules/sonos2mqtt/lib/index.js --version
Wenn man noch nicht hat, braucht man in FHEM eine MQTT Instanz, man könnte erstmal eine separate machen:
define sonosmqtt MQTT2_SERVER 1800 global

Erster Test
Dann kann man den nodejs Service schon mal zum Test starten (den automatischen Start würde ich später über pm2 machen):
node /node_modules/sonos2mqtt/lib/index.js --mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800
Per autocreate wird jetzt ein MQTT2_Device entstehen. Die CID lautet z.B. mqttjs_5d4378c3 - die 8-stellige Hexzahl ist zufällig. Ich habe noch keine Möglichkeit gefunden diese fest zu vergeben. So würde bei jedem Neustart ein neues Device entstehen.
Bei dem Ersten habe ich dann mit diesem bridgeRegExp experimentiert.
attr Device bridgeRegexp sonos/RINCON_([0-9A-F]+):.* "Sonos_$1"\
homeassistant/music_player/RINCON_([0-9A-F]+)/sonos/config:.* "Sonos_$1"

Danach entstehen getrennte MQTT2_Devices die, die jeweiligen Sonos Geräte repräsentieren.
Übrig bleibt noch ein Device mit Topics in der Art. Zusätzlich dem connect Status. 
sonos/status/kueche/renderingcontrol:.* { json2nameValue($EVENT) }
sonos/status/kueche/avtransport:.* { json2nameValue($EVENT) }

Hier habe ich erstmal keine Idee wie man diese Topics in die entstandenen Geräte "sortiert" - vielleicht auch gar nicht nötig?.
Ob man avtransport und renderingcontrol wirklich braucht? Es scheint, es sind ein Großteil redundante Informationen.

Sonos Player abbilden
Ich habe dann mal manuell Geräte gebaut.
defmod MQTT2_Sonos_347E5C82560801400 MQTT2_DEVICE Sonos_347E5C82560801400
attr MQTT2_Sonos_347E5C82560801400 IODev sonosmqtt
attr MQTT2_Sonos_347E5C82560801400 readingList homeassistant/music_player/RINCON_347E5C82560801400/sonos/config:.* { json2nameValue($EVENT) }\
sonos/RINCON_347E5C82560801400:.* { json2nameValue($EVENT) }\
sonos/status/arbeitszimmer/renderingcontrol:.* { json2nameValue($EVENT) }\
sonos/status/arbeitszimmer/avtransport:.* { json2nameValue($EVENT) }
attr MQTT2_Sonos_347E5C82560801400 room MQTT2_DEVICE
attr MQTT2_Sonos_347E5C82560801400 setList stop:noArg sonos/RINCON_347E5C82560801400/control { "command": "stop"}\
play:noArg sonos/RINCON_347E5C82560801400/control { "command": "play"}\
Volume:slider,0,1,100 sonos/RINCON_347E5C82560801400/control { "command": "volume",  "input": $EVTPART1}

Damit ist der Player verfügbar und ich kann erstmal pause,play und volume.

Aber da geht prinzipiell mehr, z.B einen Sound abspielen
set mqtt2s publish sonos/RINCON_B8E93743FCBE01400/control {
  "command": "notify",
  "input": {
    "trackUri": "https://cdn.smartersoft-group.com/various/pull-bell-short.mp3",
    "onlyWhenPlaying": false,
    "timeout": 10,
    "volume": 15,
    "delayMs": 700
  }
}

Aber die Beispiele sind sehr dürftig, die Beschreibung der Schnittstelle für mich nicht sehr aussagekräftig.

Da wären jetzt zwei Seiten zu betrachten:
Die Einbindung in MQTT und der Bau eines "bedienbaren" Players
Das Verständnis: Wie funktioniert diese Schnittstelle.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 31 Mai 2020, 18:53:23
Überflogen, bin dabei...!
Lese es aber nochmal in Ruhe. War aber beireits nach deiner Erwähnung von sonos2mqtt im anderen Thread damit am testen :)

Im Thema mqtt bin ich technisch drin. Was die fhem Umwandlung angeht würde ich so 50% sagen. Hier ist in meinen Augen Beta-User verantwortlich. Klingt hart aber zb bei der Umwandlung von meinen mqtt Test Skripten via powershell hat er sehr unterstützt. Ohne in den thread zu sehen, bin ich sicher du auch ;)
Ich weiß aber worauf das ganze hinaus läuft und freue mich unterstützen zu dürfen :)

Daumen hoch!

Gesendet von meinem LM-G810 mit Tapatalk
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 31 Mai 2020, 19:14:07
Ach ja...

ich glaube dein
node /node_modules/sonos2mqtt/lib/index.js --mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800
ist so einfach zufällig, wenn du die ID nicht mit gibst.

Options:
  --prefix           instance name. used as mqtt client id and as prefix for
                     connected topic


{
  "command": "adv-command",
  "input": {
    "cmd": "RenderingControlService.SetVolume",
    "val": {
      "InstanceID": 0,
      "Channel": "Master",
      "DesiredVolume": 20
    }
  },

}



EDIT: Jetzt sehe ich was du meinst! Ich glaube das ist egal. Wir sprechen ja zu dem Zweig sonos/status/... oder sonos/.... oder sonos/RINCON.*
Ich weis nicht warum die blablabla:hier/ist/der/eigentliche/zweig in FHEM immer davor stehen. In meinen Augen gibt es immer eine Bridge XY.
Diese (egal wie sie heißt nach neustart) sendet an den Zweig. --discoveryprefix sollte aber angepasst werden. Hier steht sonst eben homeassistant.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 31 Mai 2020, 20:52:40
Der --prefix ändert den Topic aber eben nicht die CID aus der dann die Form Devicename wird MQTT2_mqttjs_xxxxxxxx
Damit erzeugt MQTT2 immer ein neues Device.
Muss nochmal nachlesen was Rudi da genau implementiert hatte, stand irgendwo.


Wozu der --discoveryprefix ist habe ich nicht verstanden. Ja das führt zu dem Topic homeassistent - aber das ist mir irgendwie auch egal ob der jetzt Willi oder sonstwas heisst :)
Für HA muss der Topic ja offenbar wichtig sein, mir gelingt es auf die Schnelle nicht den HA zu bewegen mit sonos2mqtt etwas zu machen. Also automatisch ist offenbar nichts  ::)

Der HA kennt Sonos von sich aus (UPNP?) wozu braucht es dann denn dort überhaupt sonos2mqtt?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 31 Mai 2020, 21:25:26
Kenne den HA nicht... ist mir in dem Fall auch egal. Es  gibt so viele die ich noch testen muss :(

Wenn du die CID aus der readingslist entfernst, wird auch kein neues Gerät mehr angelegt. Also wäre es das Verhalten, wie aus jeder anderen Bridge. Müsste bei Erstellung der Bridge nur beachtet werden.

Beispiel bei mir...

sonos/connected:.* connected
homeassistant/music_player/RINCON_5CAAFD79D52801400/sonos/config:.* { json2nameValue($EVENT) }
homeassistant/music_player/RINCON_7828CAF4289001400/sonos/config:.* { json2nameValue($EVENT) }
homeassistant/music_player/RINCON_7828CAF427B201400/sonos/config:.* { json2nameValue($EVENT) }
sonos/status/wohnzimmer/renderingcontrol:.* { json2nameValue($EVENT) }
sonos/status/k\xc3\xbcche/renderingcontrol:.* { json2nameValue($EVENT) }
sonos/status/badezimmer/avtransport:.* { json2nameValue($EVENT) }
sonos/status/badezimmer/renderingcontrol:.* { json2nameValue($EVENT) }
sonos/RINCON_7828CAF427B201400:.* { json2nameValue($EVENT) }
sonos/RINCON_7828CAF4289001400:.* { json2nameValue($EVENT) }
sonos/RINCON_5CAAFD79D52801400:.* { json2nameValue($EVENT) }
sonos/status/wohnzimmer/avtransport:.* { json2nameValue($EVENT) }
sonos/status/k\xc3\xbcche/avtransport:.* { json2nameValue($EVENT) }



Jeder Player/jede Box liefert über diese Bridge:
1 x homeassistant/music_player/RINCON_ID/sonos/config:.* { json2nameValue($EVENT) }
1 x sonos/status/PLAYERNAME/SONOS_BOX_NAME/renderingcontrol:.* { json2nameValue($EVENT) }
1 x sonos/status/PLAYERNAME/SONOS_BOX_NAME/avtransport:.* { json2nameValue($EVENT) }
1 x sonos/RINCON_ID:.* { json2nameValue($EVENT) }

Geht ganz gut. Steuere noch nix und mache auch nur Tests bisher... Aber könnte man mit diversen Bridges vergleichen.

Hast du eine Version vom installierten sonos2mqtt oder aber einen online Status der Bridge? Leider habe ich das nicht.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 31 Mai 2020, 21:45:37
Ja hast Du Recht. Mein Fehler: beim bridgeregexp setzen wird ja die ReadingsList erstmal gelöscht.

ReadingsList wieder modfiziert einfügen und geht :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 31 Mai 2020, 22:13:07
Aber dein Part mit der regex ist ja eh schon 3/4 der arbeit! Danke!

Den Rest können wir abgucken vom eigentlichen Modul oder neu erfinden. Das waren aber lange 2stunden :-P

Gesendet von meinem LM-G810 mit Tapatalk

Titel: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: hoppel118 am 31 Mai 2020, 22:43:42
Ich lese hier auch mal mit.

Neulich habe ich mit Beta-User und Rudi meine Fröling Heizung per MQTT2-Server angebunden. Mehr Erfahrung habe ich auf dem Gebiet MQTT auch noch nicht.

Der MQTT Client der Open Source Software ,,p4d" zur Anbindung meiner Heizung war ursprünglich auch für homeassistant geschrieben. Der Entwickler dahinter war aber offen für alles mögliche und hat einige Anpassungen für FHEM und Openhab vorgenommen, so dass man nun den homeassistant spezifischen Kram deaktivieren kann.

Momentan bin ich erstmal ein paar Wochen unterwegs und nicht am Rechner.

Viele Grüße Hoppel
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 31 Mai 2020, 23:38:39
Zitat von: 87insane am 31 Mai 2020, 21:25:26

Hast du eine Version vom installierten sonos2mqtt oder aber einen online Status der Bridge? Leider habe ich das nicht.
Wie meinst Du das.

Die Bridge erzeugt ein Reading connected, da steht 0 oder 2 drin
Die Version zeigt er beim start mit --version

BTW: Ich bekomme beim HA das MQTT addon nicht konfiguriert. Das ist wieder ne andere Sprache, ne andere Philosophie, die Beschreibung und Doku vom Insider für Insider  :'( Ich hatte gehofft das geht ganz einfach  :-X

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 01 Juni 2020, 00:48:51
ZitatWie meinst Du das.
Hätte gerne in der Bridge ein Reading mit Version und dem Status ob online/offline. Haben bisher alle Bridges mit denen ich bei MQTT arbeite. Weiß nur noch nicht wie ich es bei sonos2mqtt rauß ziehen kann :\

Also ich hab HA schon ein paar mal bedient und auch bei Kollegen gesehen. Allerdings ist das in meinen Augen hier echt OT. Ich habe null gegen andere Plattformen aber das ist ggf echt einen eigenen Thread wert (das ich das mal sagen werde  ???). Sicher ist aber das die Kollegen auf einer der anderen Seiten sehr kooperativ sind! Hatte durch andere Projekte immer mal wieder Kontakt mit der "anderen Seite" :-P.
Spaß bei Seite. Das Modul kann wie alle anderen auch einen Schalter bekommen das die HA individuellen Dinge aus sind. Hat man z.B. sehr sichtbar auch in der SIDOH Bridge.

Ich spiele gerade noch mit den bridgeRegexp herum. Die gefallen mir so nicht.
Die bisherigen...
sonos/RINCON_([0-9A-F]+):.* "Sonos_$1"\
homeassistant/music_player/RINCON_([0-9A-F]+)/sonos/config:.* "Sonos_$1"



erzeugen diese Zweige:

Das bekommen wir ein mal:
sonos/connected:.* connected

Ab hier von jedem Player ein mal:
homeassistant/music_player/RINCON_5CAAFD79D52801400/sonos/config:.* { json2nameValue($EVENT) }
sonos/status/wohnzimmer/renderingcontrol:.* { json2nameValue($EVENT) }
sonos/status/wohnzimmer/avtransport:.* { json2nameValue($EVENT) }
sonos/RINCON_7828CAF427B201400:.* { json2nameValue($EVENT) }


Erzeugt wird dadurch:
- Jeder Player als: MQTT2_sonos_RINCON_HEX_ID_ und ReadingsList
- Ein Gerät mit dem Namen MQTT2_mqttjs_ID und ReadingsList homeassistant/music_player/RINCON_HEX_ID/sonos/config:.* { json2nameValue($EVENT) } ------ Für alle Player gemeinsam
- Ein Gerät mit dem Namen MQTT2_sonos_connected_ und ReadingsList sonos/connected:.* connected ------- In meinen Augen der Status der Bridge
- Ein Gerät mit dem Namen MQTT2_sonos_status_ und ReadingsList sonos/status/PLAYERNAME/avtransport:.* { json2nameValue($EVENT) } und sonos/status/PLAYERNAME/renderingcontrol:.* { json2nameValue($EVENT) } ------ Für alle Player gemeinsam


Jetzt müssten in meinen Augen zu den Playern auch:
- Die Komandos, diese sind im mqttjs_ID Gerät
Internals:
   CFGFN     
   CID        mqttjs_6ebdc533
   DEF        mqttjs_6ebdc533
   DEVICETOPIC MQTT2_mqttjs_6ebdc533
   FUUID      5ed428a3-f33f-fcb4-c175-e05d47dba7242d57
   IODev      sonosmqtt
   NAME       MQTT2_mqttjs_6ebdc533
   NR         6247
   STATE      ???
   TYPE       MQTT2_DEVICE
   READINGS:
     2020-05-31 23:58:59   availability_topic sonos/connected
     2020-05-31 23:58:59   available_commands_1 adv-command
     2020-05-31 23:58:59   available_commands_10 playmode
     2020-05-31 23:58:59   available_commands_11 previous
     2020-05-31 23:58:59   available_commands_12 queue
     2020-05-31 23:58:59   available_commands_13 seek
     2020-05-31 23:58:59   available_commands_14 selecttrack
     2020-05-31 23:58:59   available_commands_15 setavtransporturi
     2020-05-31 23:58:59   available_commands_16 sleep
     2020-05-31 23:58:59   available_commands_17 speak
     2020-05-31 23:58:59   available_commands_18 stop
     2020-05-31 23:58:59   available_commands_19 switchtoline
     2020-05-31 23:58:59   available_commands_2 command
     2020-05-31 23:58:59   available_commands_20 switchtoqueue
     2020-05-31 23:58:59   available_commands_21 switchtotv
     2020-05-31 23:58:59   available_commands_22 toggle
     2020-05-31 23:58:59   available_commands_23 unmute
     2020-05-31 23:58:59   available_commands_24 volume
     2020-05-31 23:58:59   available_commands_25 volumedown
     2020-05-31 23:58:59   available_commands_26 volumeup
     2020-05-31 23:58:59   available_commands_3 joingroup
     2020-05-31 23:58:59   available_commands_4 leavegroup
     2020-05-31 23:58:59   available_commands_5 mute
     2020-05-31 23:58:59   available_commands_6 next
     2020-05-31 23:58:59   available_commands_7 notify
     2020-05-31 23:58:59   available_commands_8 pause
     2020-05-31 23:58:59   available_commands_9 play
     2020-05-31 23:58:59   command_topic   sonos/RINCON_5CAAFD79D52801400/control
     2020-05-31 23:58:59   device_class    speaker
     2020-05-31 23:58:59   device_identifiers_1 RINCON_5CAAFD79D52801400
     2020-05-31 23:58:59   device_manufacturer Sonos
     2020-05-31 23:58:59   device_name     Badezimmer
     2020-05-31 23:58:59   icon            mdi:speaker
     2020-05-31 23:58:59   json_attributes true
     2020-05-31 23:58:59   json_attributes_topic sonos/RINCON_5CAAFD79D52801400
     2020-05-31 23:58:59   name            Badezimmer
     2020-05-31 23:58:59   payload_available 2
     2020-05-31 23:58:59   state_topic     sonos/RINCON_5CAAFD79D52801400
     2020-05-31 23:59:01   subscriptions   sonos/+/control sonos/cmd/+ sonos/set/+/+
     2020-05-31 23:58:59   unique_id       sonos2mqtt_RINCON_5CAAFD79D52801400_speaker
Attributes:
   IODev      sonosmqtt
   readingList mqttjs_6ebdc533:homeassistant/music_player/RINCON_7828CAF4289001400/sonos/config:.* { json2nameValue($EVENT) }
mqttjs_6ebdc533:homeassistant/music_player/RINCON_7828CAF427B201400/sonos/config:.* { json2nameValue($EVENT) }
mqttjs_6ebdc533:homeassistant/music_player/RINCON_5CAAFD79D52801400/sonos/config:.* { json2nameValue($EVENT) }
   room       MQTT2_DEVICE


- Die Einstellungen der Player und auch die Trackinfos. Diese sind im MQTT_sonos_status Gerät:
Internals:
   CFGFN     
   CID        sonos_status_
   DEF        sonos_status_
   DEVICETOPIC MQTT2_sonos_status_
   FUUID      5ed428a3-f33f-fcb4-d7cf-847acbc230c4f24e
   IODev      sonosmqtt
   NAME       MQTT2_sonos_status_
   NR         6248
   STATE      ???
   TYPE       MQTT2_DEVICE
   READINGS:
     2020-05-31 23:59:04   AVTransportURI  x-sonosapi-stream:s306651?sid=254&flags=8224&sn=0
     2020-05-31 23:59:00   AVTransportURIMetaData_AlbumArtUri https://img.ardmediathek.de/standard/00/42/92/13/72/-295433861/1x1/576?mandant=ard
     2020-05-31 23:59:04   AVTransportURIMetaData_ItemId -1
     2020-05-31 23:59:04   AVTransportURIMetaData_ParentId -1
     2020-05-31 23:59:04   AVTransportURIMetaData_Title DJ Mag Germany Radio by iloveradio.de
     2020-05-31 23:59:04   AVTransportURIMetaData_UpnpClass object.item.audioItem.audioBroadcast
     2020-05-31 23:59:04   AlarmRunning    false
     2020-05-31 23:59:01   Bass            0
     2020-05-31 23:59:04   CurrentCrossfadeMode false
     2020-05-31 23:59:04   CurrentMediaDuration NOT_IMPLEMENTED
     2020-05-31 23:59:04   CurrentPlayMode NORMAL
     2020-05-31 23:59:04   CurrentRecordQualityMode NOT_IMPLEMENTED
     2020-05-31 23:59:04   CurrentSection  0
     2020-05-31 23:59:04   CurrentTrack    1
     2020-05-31 23:59:04   CurrentTrackDuration 0:00:00
     2020-05-31 23:59:04   CurrentTrackMetaData_AlbumArtUri http://192.168.20.71:1400/getaa?s=1&u=x-sonosapi-stream:s306651%3fsid%3d254%26flags%3d8224%26sn%3d0
     2020-05-31 23:59:04   CurrentTrackMetaData_ItemId -1
     2020-05-31 23:59:04   CurrentTrackMetaData_ParentId -1
     2020-05-31 23:59:04   CurrentTrackMetaData_ProtocolInfo sonos.com-http:*:audio/mpeg:*
     2020-05-31 23:59:04   CurrentTrackMetaData_Title x-sonosapi-stream:s306651?sid=254&flags=8224&sn=0
     2020-05-31 23:59:04   CurrentTrackMetaData_TrackUri x-sonosapi-stream:s306651?sid=254&flags=8224&sn=0
     2020-05-31 23:59:04   CurrentTrackMetaData_UpnpClass object.item.audioItem.musicTrack
     2020-05-31 23:59:04   CurrentTrackURI aac://http://stream02.iloveradio.de/iloveradio4-aac.mp3
     2020-05-31 23:59:04   CurrentTransportActions Set, Stop, Play
     2020-05-31 23:59:00   CurrentValidPlayModes SHUFFLE,REPEAT,REPEATONE,CROSSFADE
     2020-05-31 23:59:04   DirectControlIsSuspended false
     2020-05-31 23:59:04   EnqueuedTransportURI x-sonosapi-stream:s306651?sid=254&flags=8224&sn=0
     2020-05-31 23:59:00   EnqueuedTransportURIMetaData_AlbumArtUri https://img.ardmediathek.de/standard/00/42/92/13/72/-295433861/1x1/576?mandant=ard
     2020-05-31 23:59:04   EnqueuedTransportURIMetaData_ItemId -1
     2020-05-31 23:59:04   EnqueuedTransportURIMetaData_ParentId -1
     2020-05-31 23:59:04   EnqueuedTransportURIMetaData_Title DJ Mag Germany Radio by iloveradio.de
     2020-05-31 23:59:04   EnqueuedTransportURIMetaData_UpnpClass object.item.audioItem.audioBroadcast
     2020-05-31 23:59:01   HeadphoneConnected false
     2020-05-31 23:59:01   Loudness        true
     2020-05-31 23:59:01   Mute_LF         false
     2020-05-31 23:59:01   Mute_Master     false
     2020-05-31 23:59:01   Mute_RF         false
     2020-05-31 23:59:04   NumberOfTracks  2
     2020-05-31 23:59:01   OutputFixed     false
     2020-05-31 23:59:04   PlaybackStorageMedium NETWORK
     2020-05-31 23:59:04   PossiblePlaybackStorageMedia NONE, NETWORK
     2020-05-31 23:59:04   PossibleRecordQualityModes NOT_IMPLEMENTED
     2020-05-31 23:59:04   PossibleRecordStorageMedia NOT_IMPLEMENTED
     2020-05-31 23:59:01   PresetNameList  FactoryDefaults
     2020-05-31 23:59:04   RecordMediumWriteStatus NOT_IMPLEMENTED
     2020-05-31 23:59:04   RecordStorageMedium NOT_IMPLEMENTED
     2020-05-31 23:59:04   RestartPending  false
     2020-05-31 23:59:04   SleepTimerGeneration 0
     2020-05-31 23:59:04   SnoozeRunning   false
     2020-05-31 23:59:01   SpeakerSize     5
     2020-05-31 23:59:01   SubCrossover    0
     2020-05-31 23:59:01   SubEnabled      true
     2020-05-31 23:59:01   SubGain         0
     2020-05-31 23:59:01   SubPolarity     0
     2020-05-31 23:59:04   TransportPlaySpeed NOT_IMPLEMENTED
     2020-05-31 23:59:04   TransportState  STOPPED
     2020-05-31 23:59:04   TransportStatus OK
     2020-05-31 23:59:01   Treble          0
     2020-05-31 23:59:01   Volume_LF       100
     2020-05-31 23:59:01   Volume_Master   18
     2020-05-31 23:59:01   Volume_RF       100
     2020-05-31 23:59:04   associatedWith  MQTT2_sonos_bridge
Attributes:
   IODev      sonosmqtt
   readingList sonos/status/wohnzimmer/avtransport:.* { json2nameValue($EVENT) }
sonos/status/badezimmer/avtransport:.* { json2nameValue($EVENT) }
sonos/status/wohnzimmer/renderingcontrol:.* { json2nameValue($EVENT) }
sonos/status/k\xc3\xbcche/renderingcontrol:.* { json2nameValue($EVENT) }
sonos/status/badezimmer/renderingcontrol:.* { json2nameValue($EVENT) }
sonos/status/k\xc3\xbcche/avtransport:.* { json2nameValue($EVENT) }
   room       MQTT2_DEVICE


Was ich noch noch nicht weiß, wie ich über bridgeRegexp die zusammenhängenden Infos auch zusammen führen kann.
- Beispielsweise trägt das mqttjs Gerät ein Reading (device_name) mit dem Playernamen als Inhalt. Bei mir sind das Raumnamen.
- Gleichzeitig trägt das Player Device ein Reading (name) mit dem Playernamen als Inhalt bei sich (Auch Player oder bei mir Raumname).
- Was mir noch sorgen macht ist das status Gerät. Hier steht kein Name oder so drin. Hier hat man in meinen Augen nur die IP als Indiz, welches Gerät hier gerade Party macht. Diese auch nicht direkt sondern aus dem Reading "CurrentTrackMetaData_AlbumArtUri" ausgefiltert.

Wenn wir das hinbekommen würden, hätten wir eine laufende Bridge und könnten das einfach zu einem Template umwandeln. So wie auch die SIDOH Bridge.
Ich glaube das die o.g. Zusammenhänge zwischen den Geräten sicher auch dafür sorgen können, das diese zu einem DEV werden via Regex. Aber die Regex packe ich nicht :(
Die beiden Geräte mit dem RINCON_.* bekomme ich noch hin aber die Zuordnung zu dem Playernamen?!

So sollte ein Gerät aussehen in meinen Augen:
Internals:
   CFGFN     
   CID        sonos_RINCON_7828CAF427B201400_
   DEF        sonos_RINCON_7828CAF427B201400_
   DEVICETOPIC MQTT2_sonos_RINCON_7828CAF427B201400_
   FUUID      5ed428a5-f33f-fcb4-47bf-1e8f246956108ee7
   IODev      sonosmqtt
   LASTInputDev sonosmqtt
   MSGCNT     4
   NAME       MQTT2_sonos_RINCON_7828CAF427B201400_
   NR         6249
   STATE      ???
   TYPE       MQTT2_DEVICE
   sonosmqtt_MSGCNT 4
   sonosmqtt_TIME 2020-06-01 00:40:14
   READINGS:
     2020-06-01 00:40:09   Bass            0
     2020-06-01 00:40:09   HeadphoneConnected false
     2020-06-01 00:40:09   Loudness        true
     2020-06-01 00:40:09   Mute_LF         false
     2020-06-01 00:40:09   Mute_Master     false
     2020-06-01 00:40:09   Mute_RF         false
     2020-06-01 00:40:09   OutputFixed     false
     2020-06-01 00:40:09   PresetNameList  FactoryDefaults
     2020-06-01 00:40:09   SpeakerSize     5
     2020-06-01 00:40:09   SubCrossover    0
     2020-06-01 00:40:09   SubEnabled      true
     2020-06-01 00:40:09   SubGain         0
     2020-06-01 00:40:09   SubPolarity     0
     2020-06-01 00:40:09   Treble          0
     2020-06-01 00:40:09   Volume_LF       100
     2020-06-01 00:40:09   Volume_Master   20
     2020-06-01 00:40:09   Volume_RF       100
     2020-05-31 23:59:01   associatedWith  MQTT2_sonos_bridge
     2020-06-01 00:40:09   availability_topic sonos/connected
     2020-06-01 00:40:09   available_commands_1 adv-command
     2020-06-01 00:40:09   available_commands_10 playmode
     2020-06-01 00:40:09   available_commands_11 previous
     2020-06-01 00:40:09   available_commands_12 queue
     2020-06-01 00:40:09   available_commands_13 seek
     2020-06-01 00:40:09   available_commands_14 selecttrack
     2020-06-01 00:40:09   available_commands_15 setavtransporturi
     2020-06-01 00:40:09   available_commands_16 sleep
     2020-06-01 00:40:09   available_commands_17 speak
     2020-06-01 00:40:09   available_commands_18 stop
     2020-06-01 00:40:09   available_commands_19 switchtoline
     2020-06-01 00:40:09   available_commands_2 command
     2020-06-01 00:40:09   available_commands_20 switchtoqueue
     2020-06-01 00:40:09   available_commands_21 switchtotv
     2020-06-01 00:40:09   available_commands_22 toggle
     2020-06-01 00:40:09   available_commands_23 unmute
     2020-06-01 00:40:09   available_commands_24 volume
     2020-06-01 00:40:09   available_commands_25 volumedown
     2020-06-01 00:40:09   available_commands_26 volumeup
     2020-06-01 00:40:09   available_commands_3 joingroup
     2020-06-01 00:40:09   available_commands_4 leavegroup
     2020-06-01 00:40:09   available_commands_5 mute
     2020-06-01 00:40:09   available_commands_6 next
     2020-06-01 00:40:09   available_commands_7 notify
     2020-06-01 00:40:09   available_commands_8 pause
     2020-06-01 00:40:09   available_commands_9 play
     2020-06-01 00:40:09   command_topic   sonos/RINCON_7828CAF427B201400/control
     2020-06-01 00:40:14   coordinatorUuid RINCON_7828CAF427B201400
     2020-06-01 00:40:14   currentTrack_AlbumArtUri http://192.168.20.70:1400/getaa?u=x-rincon-mp3radio:%2f%2fhttps:%2f%2fwdr-1live-live.icecastssl.wdr.de%2fwdr%2f1live%2flive%2fmp3%2f128%2fstream.mp3%3far-distributor%3df0e2&v=1
     2020-06-01 00:40:14   currentTrack_ItemId -1
     2020-06-01 00:40:14   currentTrack_ParentId -1
     2020-06-01 00:40:14   currentTrack_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-01 00:40:14   currentTrack_Title 1LIVE
     2020-06-01 00:40:14   currentTrack_TrackUri x-rincon-mp3radio://https://wdr-1live-live.icecastssl.wdr.de/wdr/1live/live/mp3/128/stream.mp3?ar-distributor=f0e2
     2020-06-01 00:40:14   currentTrack_UpnpClass object.item
     2020-06-01 00:40:09   device_class    speaker
     2020-06-01 00:40:09   device_identifiers_1 RINCON_7828CAF427B201400
     2020-06-01 00:40:09   device_manufacturer Sonos
     2020-06-01 00:40:09   device_name     Wohnzimmer
     2020-06-01 00:40:14   enqueuedMetadata_AlbumArtUri https://img.ardmediathek.de/standard/00/42/92/13/72/-295433861/1x1/576?mandant=ard
     2020-06-01 00:40:14   enqueuedMetadata_ItemId -1
     2020-06-01 00:40:14   enqueuedMetadata_ParentId -1
     2020-06-01 00:40:14   enqueuedMetadata_Title 1LIVE
     2020-06-01 00:40:14   enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-01 00:40:14   groupName       Wohnzimmer
     2020-06-01 00:40:09   icon            mdi:speaker
     2020-06-01 00:40:09   json_attributes true
     2020-06-01 00:40:09   json_attributes_topic sonos/RINCON_7828CAF427B201400
     2020-06-01 00:40:14   mute_LF         false
     2020-06-01 00:40:14   mute_Master     false
     2020-06-01 00:40:14   mute_RF         false
     2020-06-01 00:40:14   name            Wohnzimmer
     2020-06-01 00:40:09   payload_available 2
     2020-06-01 00:40:14   playmode        NORMAL
     2020-06-01 00:40:09   state_topic     sonos/RINCON_7828CAF427B201400
     2020-06-01 00:40:14   transportState  STOPPED
     2020-06-01 00:40:14   ts              1590964814183
     2020-06-01 00:40:09   unique_id       sonos2mqtt_RINCON_7828CAF427B201400_speaker
     2020-06-01 00:40:14   uuid            RINCON_7828CAF427B201400
     2020-06-01 00:40:14   volume_LF       100
     2020-06-01 00:40:14   volume_Master   20
     2020-06-01 00:40:14   volume_RF       100
Attributes:
   IODev      sonosmqtt
   alias      wz
   readingList sonos/RINCON_7828CAF427B201400:.* { json2nameValue($EVENT) }
sonos/status/wohnzimmer/renderingcontrol:.* { json2nameValue($EVENT) }
homeassistant/music_player/RINCON_7828CAF427B201400/sonos/config:.* { json2nameValue($EVENT) }
   room       MQTT2_DEVICE


Natürlich ist hier KEIN DESIGN oder so drin. Erstmal nur richtig zuordnen und zusammen führen...
setlist habe ich für heute mal weg gelassen. das ergibt sich dann ja eh. Du hattest damit auch schon angefangen, wie ich sah.

PS: Play, Pause, Vol gehen bei mir so nicht. Aber für heute ist auch genug

Soooooo.. gute Nacht zusammen :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 01 Juni 2020, 07:10:16
Moin zusammen,

habe auch diese Art Hardware nicht und auch keine Neigung, mir so ein Java-Gedönse ins Haus zu holen, aber trotzdem mal meine 2ct:

- Da JAva, wird wohl einmal mehr Paho genutzt werden zur MQTT-Anbindung. Das "liebt" randomized CIDs. Wie 87insane schon geschrieben hat, bekommt man die ignoriert, sobald man passende MQTT2_DEVICES hat ohne den CID-Präfix in der readingList oder der bridgeRegexp => mit letzterer ist schon alles gut :) .

- Der homeassistant-Teil verwirrt nur und dient ausschließlich der Konfiguration in HA. Empfehlung: IO mit einer ignoreRegexp ausstatten, es gibt ein attrTemplate dafür ;) (aufzurufen aber über ein M2-Device).
Anm.: Es gibt eine extended version,  die auch die "set"-Zweige für Tasmota-Devices "himmelt", was für Netze mit mehreren Quellen für Befehle an diesen Gerätetyp hilfreich ist ;) .

- Dass ein 2. Server nicht aus technischen Gründen erforderlich ist, dürfte klar sein?

- via bridgeRegexp auch Dinge aus unterschiedlichen Zweigen "zusammenzumischen" und in ein Device zu überführen, ist auch kein Problem. Wichtig ist, dass jeweils für das am Zeilenende (Pseudo-CID) was identisches rauskommt, vorne ist es eben (zeilenweise) regex.

(Den Rest - einschl. der Erstellung von attrTemplates - bekommt ihr sicher auch ohne mich hin, wenn es spezielle Fragen gibt: einfach melden :) ).

Schönen Feiertag,
Beta-User
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 Juni 2020, 17:29:55
87insane: Du kommst erstmal zum ähnlichen Ergebnis wie ich :) Du hast das vierte readingList außen vor gelassen: sonos/status/Playername/avtransport

Meine große Frage ist derzeit: Ob die Infos nicht so redundant sind, das man erstmal was weglässt.

ZitatWichtig ist, dass jeweils für das am Zeilenende (Pseudo-CID) was identisches rauskommt, vorne ist es eben (zeilenweise) regex.
Ja genau das bekomme ich nicht hin, bei sonos/status/"Playername" steht die die Pseudo-CID in den Werten/Readings bei den anderen ..../RINCON_xxxxx steht der Playername (auch eine mögliche pseudo-CID) auch wieder in den Werten/Readings
Wahrscheinlich muss man

Zitatder Erstellung von attrTemplates - bekommt ihr sicher auch ohne mich hin,
Du bist ein Optimist, ich habe fast keine Ahnung :)

Den 2. Server braucht man nicht, völlig richtig. Es ist überhaupt kein Teufelszeug, finde ich.  8)

Zitatdient ausschließlich der Konfiguration in HA. Empfehlung: IO mit einer ignoreRegexp ausstatten,
ich hatte gedacht genau da muss doch alles wichtig drin stehen um ein Gerät zu erzeugen :) Was HA kann können wir doch schon lange ;)

Ich mache jetzt mal für einen Player 4 einzel Devices mit den jeweiligen Topics, vielleicht sieht man da besser was los ist und kann ein Template extrahieren. Mal sehen wie weit mich die bisherige Beschreibung und "Erfahrung" treibt :)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 01 Juni 2020, 18:06:50
Nur Handy deswegen kurz...

Ich hatte das reading mit aufgelistet. Habe auch alle erstmal pro Dev manuell übernommen. Will erstmal reading Inhalt sammeln..

Gleichzeitig habe ich aber auch deine regex übernommen und probiere noch rum. Die infos aus dem Status Dev sind in meinen Augen nicht redundant. Allerdings geht es nur um announcen... Da ich aber davon ausgehe, dass wenn wir das hier aufbauen, nicht alles einfach abgucken sondern treu dem Motto "super geil" was neues und altags taugliches schaffen, passt das super
.. Ich sammel noch. Ggf spuckt Sonos noch mehr aus. Schreibe morgen den entwickler an. Er wird sicher eine bessere Erklärung im Kopf ala im Netz haben.

Heute war ich aber bis auf kleine Sachen faul. Hatte bis gerade Besuch und nun auch Sonnenbrand [emoji26][emoji12] hab heut Nacht aber in meinen Augen noch eine gute Sammlung an Infos gesammelt und hier auch eingestellt. Gleiche Ergebnisse wie du auch... Du hattest noch einen player gepostet. Bei mir geht das so nicht. Muss aber noch schauen warum. Innerhalb von mqtt und fhem können wir auf jeden Fall viel machen. Mqtt ist mir mit unter deswegen so lieb, da fhem da nicht immer ganz die Regeln einhält. Man kann und darf die Geräte verdrehen wie man will. Für so einige Aufgaben bräuchte man sonst einen dummy. Naja ...egal.... Sollen wir uns einen Plan erstellen und das als projekt aufnehmen? Ich hätte Lust, da ich aus den gleichen Gründen gerne über einheitliche Schnittstellen verfüge.
- leichter zu überwachen
- updates legen entweder alles lahm oder eben nichts. Bzw ist es eine fehlerquelle und nicht 5 oder 6
- einheitliche templates mit guter Qualitäts Überwachung
- erweiterbar (so wie mir scheint) bis ins unendliche. Immer mehr xyz2mqtt Schnittstellen kommen auf den Markt
- mqtt ist an sich einfach ein zu binden und die Selbstbau Geräte kann jeder "zusammen stecken" oder löten.


Die liste kann ich so weiter machen.

Ich weiß gerade du und die anderen "oberen/großen" haben super viel zu tun aber ich würde gerne so gut wie möglich helfen. Ich habe fhem damals über einen Arbeits Kollegen kennen gelernt. Ich hab die ersten drei Wochen nur an einen Befehl gedacht. UNINSTALL! Nun stehe ich aber um so mehr auf fhem und die weiter Entwicklung ist wichtig. HA ist zb dein neuer "freund" :-P Spaß bei Seite...lass uns los legen :)

Ps: bei den templates kann ich gerne helfen. Beta-user würde mich nach dem ganzen Text vermutlich suchen lassen und quälen, wenn ich da nicht so antworte. Habe schon bei ein, zwei templates geholfen. Deswegen hoffe ich das du quasi meine schwache seite übernimmst. :)



Gesendet von meinem LM-G810 mit Tapatalk
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 01 Juni 2020, 18:25:20
Zitat von: Otto123 am 01 Juni 2020, 17:29:55
Meine große Frage ist derzeit: Ob die Infos nicht so redundant sind, das man erstmal was weglässt.
Das könnte eine "Nebenwirkung" dieses autodiscovery-features sein. Kann also nur empfehlen, das zu ignorieren, FHEM macht meistens auch ohne vorher "viel zu wissen" "das richtige".

Wenn, dann würde ich empfehlen, den homeassistant-Zweig gesondert zu betrachten und dann die JSON "im Ganzen" anzusehen (also nicht mit json2nameValue() auszupacken). Vielleicht findest du ja einen cleveren Weg, das nutzbar zu machen ;) . (Imo sind das völlig überflüssige Infos, und das ganze ein verschwenderischer Ansatz, was insgesamt dazu führt, dass homeassistant dem Vernehmen nach 20 MB Speicher pro MQTT-Gerät braucht...

Zitat
Ja genau das bekomme ich nicht hin, bei sonos/status/"Playername" steht die die Pseudo-CID in den Werten/Readings bei den anderen ..../RINCON_xxxxx steht der Playername (auch eine mögliche pseudo-CID) auch wieder in den Werten/Readings
Das ist genau die Folge von dem "Super-JSON" für homeassistant. So wie ich das lese, ist alles zu einem Player auch nur unter einem Topic zu finden, von daher paßt das mit der bridgeRegexp vermutlich.

ZitatDu bist ein Optimist, ich habe fast keine Ahnung :)
Das mit der Erfahrung wird schon, believe me...
Und wenn du ein passendes bridge-Gerät hast, konfiguriert sich jedes einzel-Sub-Gerät dann (in FHEM) fast von selbst, wenn der Autor der MQTT-Software sich etwas bei dem Topic-Tree gedacht hat (und nicht den Sonderfall homeassistant vorrangig im Blick hatte). Es gibt ja in der attrTemplate-File zwischenzeitlich wirklich für fast jeden Anwendungsfall irgendein Bausteinchen, das man ggf. einfach nur "portieren" muß.

Und mit attrTemplate haben wir mMn. einen Mechanismus, der es mit der autodiscovery gut aufnehmen kann (sofern man attrTemplate überhaupt "braucht", um die logische Struktur des Gerätes sinnvoll zu erfassen, MQTT2_DEVICE macht schon von sich aus vieles "richtig", zumindest, was Readings angeht).

Bin mal gespannt, ob du mir da bald zustimmen wirst ;D .
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 Juni 2020, 18:42:02
Die Steuerbefehle waren aus meiner Sicht erstmal simpel. Musst natürlich die RINCON_ID richtig setzen.
set mqttserver publish sonos/RINCON_347E5C82560801400/control {  "command": "volume",  "input": 10}
set mqttserver publish sonos/RINCON_347E5C82560801400/control {  "command": "stop"}
set mqttserver publish sonos/RINCON_347E5C82560801400/control {  "command": "play"}

Der hier funktioniert nicht, nicht implementiert, obwohl die readings was anderes sagen
set mqttserver publish sonos/RINCON_B8E93743FCBE01400/control {  "command": "switchtotv"}

Wenn man die Topics einzeln zu Readings verarbeitet, hat man so ca 130. Kombiniert in einem Device dann bloß noch ca. 60 - da ist schon einiges doppelt :)

naja und Sonos "redet" wie der Teufel, deswegen muss man ja beim Sonos Modul verbose 1 machen :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 01 Juni 2020, 18:52:12
Wegen "stummschalten": Rudi hat heute was nettes gepostet, um News von Geplapper zu trennen... (In dem true-Thread).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 Juni 2020, 18:59:38
Ich habs schon gelesen - aber nicht verstanden ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 Juni 2020, 00:27:21
Mein Ergebnis vom Abend, ein bisschen Code für die Raw Def - als Einzeiler wäre es für die Kommandozeile etwas lang ;)
Lacht nicht, mir fiel nichts besseres ein. :)
Der Code erzeugt aus dem Device was sonos2mqtt anlegt (und in der ersten Zeile zunächst manuell eingegeben wird) alle Sonosplayer als MQTT Devices mit dem wichtigsten readingList und der setList.
{my $bridge='MQTT2_mqttjs_5d4378c3';;\
my @array=split("\n", AttrVal($bridge,'readingList',''));;\
my $server=AttrVal($bridge,'IODev','mqttserver');;\
foreach (@array) {\
   if ($_=~"sonos/RINCON_") {\
       my @line=split("/",$_);;\
   my $dev=(split(':',$line[1]))[0];;\
   fhem("define $dev MQTT2_DEVICE");;\
   fhem("attr $dev IODev $server");;\
   fhem("attr $dev readingList $_");;\
   fhem("attr $dev room SonosMQTT");;\
       fhem("attr $dev setList stop:noArg sonos/$dev/control { \"command\": \"stop\"}\
play:noArg sonos/$dev/control { \"command\": \"play\"}\
Volume:slider,0,1,100 sonos/$dev/control { \"command\": \"volume\",  \"input\": \$EVTPART1}");;\
  }\
}\
}


Die folgenden beiden Topics sind ziemlich statisch und werden eventuell nur einmalig beim Start von sonos2mqtt befüllt.
sonos/status/Playername/renderingcontrol
homeassistant/music_player/RINCON_PayerID/sonos/config


Man könnte jetzt wenn das Gerät fertig ist:

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 02 Juni 2020, 09:54:05
Zitat von: Otto123 am 01 Juni 2020, 18:59:38
Ich habs schon gelesen - aber nicht verstanden ;)
Das bewirkt in der einen Zeile dasselbe wie eventMap, event-on-change-reading .* und timestamp-on-change-reading .* zusammen. Man kann damit also (ohne das eventMap) einfach nur die Infos durchlassen, die unbekannt oder neu sind... Könnte helfen, das "Geplapper" von Sonos beim Eingang der Infos gleich soweit zu filtern, dass man nichts mehr an verbose rumschrauben muß (was ja auch nur den logging-Teil stummschaltet).

Im Gegenzug habe ich deinen Code nicht recht verstanden. Was hat der für Vorteile gg. einem attrTemplate-Setzen für jeden Player? (Außer, dass man es tun muß)?

Was ich meine verstanden zu haben: Der Autor des Java-Codes glaubt, es sei eine gute Idee, die Daten, die zu einem Endgerät gehören, sollten auf zwei oder drei (?) Topic-Pfade verteilt werden, bei dem einmal der "Klarname" verwendet wird, und an anderer Stelle ein "Technikname". Wir stehen also vor dem Problem feststellen zu müssen, was zu wem gehört...?
(MMn: Das ist keine optimale Entscheidung, und Umlaute im Topic-Pfad zu verwenden ist es auch nicht)

Wenn man also nicht das --discovery auf false setzen will, sollte man die Meldungen "as is" konservieren. Könnte (in dem Bridge-Gerät) so funktionieren:
attr DEVICE readingList\
  homeassistant/music_player/RINCON_([0-9A-Z]+):.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),; "config_$1") }
  sonos/connected:.* connected
(Generell wäre da ggf. mal der MQTT-"roh"-Verkehr beim Start des Dienstes interessant).

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 10:33:13
Zitat(MMn: Das ist keine optimale Entscheidung, und Umlaute im Topic-Pfad zu verwenden ist es auch nicht)
Stellt keine Probleme im 21. Jahrhundert da. Kann man bedenkenlos machen. Ich finde es auch nicht schön aber die Playernamen habe ich nicht ausgesucht. Es MUSS ein "ü" in Küche sein sonst bin ich mein SmartHome Amt los :-P

Ihr habt gestern ja noch richtig was geschafft. Ich hatte leider keine Zeit mehr. Wenn ich mir das so ansehe, sehe ich das Problem mit dem Technik und dem Gerätenamen als das nervigste. Soll ich den Kollegen mal anschreiben? (Programmierer des Moduls)

Was den Code des Devices angeht, würde ich das schonmal einfach umbauen in Richtung Template. Gucken ob ich das heute schaffe.

Anbei auch mal was beim start/stop so in FHEM passiert auf der Bridge:
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge connected: 2
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_13: seek
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_17: speak
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge availability_topic: sonos/connected
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_15: setavtransporturi
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_10: playmode
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_5: mute
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge json_attributes_topic: sonos/RINCON_7828CAF4289001400
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_19: switchtoline
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_26: volumeup
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_25: volumedown
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_16: sleep
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge device_manufacturer: Sonos
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge device_identifiers_1: RINCON_7828CAF4289001400
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_18: stop
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_4: leavegroup
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge name: Küche
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_9: play
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge payload_available: 2
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_12: queue
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_8: pause
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_22: toggle
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge icon: mdi:speaker
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_7: notify
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_21: switchtotv
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_24: volume
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge device_name: Küche
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_23: unmute
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge unique_id: sonos2mqtt_RINCON_7828CAF4289001400_speaker
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge json_attributes: true
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge state_topic: sonos/RINCON_7828CAF4289001400
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge command_topic: sonos/RINCON_7828CAF4289001400/control
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_3: joingroup
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_1: adv-command
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge device_class: speaker
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_2: command
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_6: next
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_14: selecttrack
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_20: switchtoqueue
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_11: previous
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_8: pause
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_22: toggle
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge payload_available: 2
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_12: queue
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge name: Badezimmer
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_9: play
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_4: leavegroup
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_24: volume
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_7: notify
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_21: switchtotv
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge icon: mdi:speaker
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge state_topic: sonos/RINCON_5CAAFD79D52801400
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge command_topic: sonos/RINCON_5CAAFD79D52801400/control
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge json_attributes: true
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge device_name: Badezimmer
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_23: unmute
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge unique_id: sonos2mqtt_RINCON_5CAAFD79D52801400_speaker
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_11: previous
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_6: next
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_2: command
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_14: selecttrack
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_20: switchtoqueue
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge device_class: speaker
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_3: joingroup
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_1: adv-command
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_17: speak
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_13: seek
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_5: mute
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_10: playmode
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge availability_topic: sonos/connected
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_15: setavtransporturi
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge device_manufacturer: Sonos
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_19: switchtoline
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_26: volumeup
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_25: volumedown
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_16: sleep
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge json_attributes_topic: sonos/RINCON_5CAAFD79D52801400
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge device_identifiers_1: RINCON_5CAAFD79D52801400
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_18: stop
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_UpnpClass: object.item
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge EnqueuedTransportURI: x-sonosapi-stream:s306651?sid=254&flags=8224&sn=0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_ParentId: -1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge SleepTimerGeneration: 0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge AlarmRunning: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentPlayMode: NORMAL
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge SnoozeRunning: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge AVTransportURI: x-sonosapi-stream:s306651?sid=254&flags=8224&sn=0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge NumberOfTracks: 1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge PossibleRecordStorageMedia: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTransportActions: Set, Stop, Play
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge RecordStorageMedium: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_Title: DJ Mag Germany Radio by iloveradio.de
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge AVTransportURIMetaData_Title: DJ Mag Germany Radio by iloveradio.de
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_ProtocolInfo: sonos.com-http:*:application/octet-stream:*
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_AlbumArtUri: http://192.168.20.71:1400/getaa?s=1&u=x-sonosapi-stream:s306651%3fsid%3d254%26flags%3d8224%26sn%3d0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge PlaybackStorageMedium: NETWORK
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge AVTransportURIMetaData_ItemId: -1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentRecordQualityMode: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge RestartPending: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge EnqueuedTransportURIMetaData_UpnpClass: object.item.audioItem.audioBroadcast
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge TransportStatus: OK
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrack: 1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge EnqueuedTransportURIMetaData_ItemId: -1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackURI: x-sonosapi-stream:s306651?sid=254&flags=8224&sn=0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge EnqueuedTransportURIMetaData_Title: DJ Mag Germany Radio by iloveradio.de
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentSection: 0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackDuration: 0:00:00
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge EnqueuedTransportURIMetaData_ParentId: -1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentMediaDuration: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge AVTransportURIMetaData_ParentId: -1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge TransportState: STOPPED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge AVTransportURIMetaData_UpnpClass: object.item.audioItem.audioBroadcast
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentCrossfadeMode: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge PossiblePlaybackStorageMedia: NONE, NETWORK
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge PossibleRecordQualityModes: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge TransportPlaySpeed: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge RecordMediumWriteStatus: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_TrackUri: x-sonosapi-stream:s306651?sid=254&flags=8224&sn=0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge DirectControlIsSuspended: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_ItemId: -1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_UpnpClass: object.item
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_ParentId: -1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge SleepTimerGeneration: 0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge AlarmRunning: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentPlayMode: NORMAL
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge SnoozeRunning: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge NumberOfTracks: 1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge AVTransportURIMetaData_ProtocolInfo: x-sonos-vli:*:audio:*
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge AVTransportURI: x-rincon-queue:RINCON_5CAAFD79D52801400#vli
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge PossibleRecordStorageMedia: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTransportActions: Set, Stop, Play
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge RecordStorageMedium: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_Title:
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge AVTransportURIMetaData_Title: Spotify
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_ProtocolInfo: :*:application/octet-stream:*
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge PlaybackStorageMedium: NETWORK
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge AVTransportURIMetaData_ItemId: spotify
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge TransportStatus: OK
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge RestartPending: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentRecordQualityMode: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrack: 1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackURI: x-sonos-vli:RINCON_5CAAFD79D52801400:2,spotify:87aecd8b75b2c1e626eecedb93db3e67
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentSection: 0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge AVTransportURIMetaData_TrackUri: x-sonos-vli:RINCON_5CAAFD79D52801400:2,spotify:87aecd8b75b2c1e626eecedb93db3e67
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge DirectControlClientID: spotify.connect.adapter
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentMediaDuration: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge AVTransportURIMetaData_ParentId: 0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge TransportState: PAUSED_PLAYBACK
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge AVTransportURIMetaData_UpnpClass: object.item.audioItem.linein
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge PossiblePlaybackStorageMedia: NONE, NETWORK
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentCrossfadeMode: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge PossibleRecordQualityModes: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge RecordMediumWriteStatus: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge TransportPlaySpeed: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_TrackUri: x-rincon-queue:RINCON_5CAAFD79D52801400#vli
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_ItemId: -1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge DirectControlIsSuspended: true
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge Mute_RF: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge Bass: 0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge Mute_Master: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge Treble: 0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge Loudness: true
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge SubEnabled: true
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge PresetNameList: FactoryDefaults
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge Volume_Master: 49
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge SubCrossover: 0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge HeadphoneConnected: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge SubPolarity: 0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge SubGain: 0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge Volume_LF: 100
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge OutputFixed: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge SpeakerSize: 5
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge Mute_LF: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge Volume_RF: 100
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge SleepTimerGeneration: 0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge AlarmRunning: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentPlayMode: SHUFFLE_NOREPEAT
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge NextTrackMetaData_Album: Zombie (Zombic & Felix Schorn Remix)
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge SnoozeRunning: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge AVTransportURI: x-rincon-queue:RINCON_7828CAF427B201400#0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge NumberOfTracks: 50
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge PossibleRecordStorageMedia: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_UpnpClass: object.item.audioItem.musicTrack
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge EnqueuedTransportURI: x-rincon-cpcontainer:0006002cspotify%3aplaylist%3a37i9dQZF1DX7ZUug1ANKRP?sid=9&flags=44&sn=3
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_Artist: F4ST
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_ParentId: -1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge NextTrackMetaData_AlbumArtUri: http://192.168.20.70:1400/getaa?s=1&u=x-sonos-spotify:spotify:track:3p07oZZpSNdVtN93M5yIY5%3fsid%3d9%26flags%3d8224%26sn%3d3
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge NextTrackMetaData_TrackUri: x-sonos-spotify:spotify:track:3p07oZZpSNdVtN93M5yIY5?sid=9&flags=8224&sn=3
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_ProtocolInfo: sonos.com-spotify:*:audio/x-spotify:*
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_AlbumArtUri: http://192.168.20.70:1400/getaa?s=1&u=x-sonos-spotify:spotify:track:7tNAeLkrsnOqKXWTmd8cQp%3fsid%3d9%26flags%3d8224%26sn%3d3
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge NextTrackMetaData_Duration: 0:02:40
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge NextTrackMetaData_ProtocolInfo: sonos.com-spotify:*:audio/x-spotify:*
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge PlaybackStorageMedium: NETWORK
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTransportActions: Set, Stop, Pause, Play, X_DLNA_SeekTime, Next, X_DLNA_SeekTrackNr
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge RecordStorageMedium: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_Title: Sweet Dreams
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge RestartPending: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentRecordQualityMode: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge EnqueuedTransportURIMetaData_UpnpClass: object.container.playlistContainer#playlistItem
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge TransportStatus: OK
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge NextTrackMetaData_UpnpClass: object.item.audioItem.musicTrack
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrack: 1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge EnqueuedTransportURIMetaData_ItemId: 0006002cspotify%3aplaylist%3a37i9dQZF1DX7ZUug1ANKRP
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge EnqueuedTransportURIMetaData_Artist: Spotify
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge NextTrackMetaData_Title: Zombie (Zombic & Felix Schorn Remix)
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_Duration: 0:02:08
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackURI: x-sonos-spotify:spotify%3atrack%3a7tNAeLkrsnOqKXWTmd8cQp?sid=9&flags=8224&sn=3
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge EnqueuedTransportURIMetaData_Title: Main Stage
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentValidPlayModes: SHUFFLE,REPEAT,REPEATONE,CROSSFADE
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge NextTrackMetaData_Artist: Besomorph
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge TransportState: STOPPED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge PossiblePlaybackStorageMedia: NONE, NETWORK
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentCrossfadeMode: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge TransportPlaySpeed: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge PossibleRecordQualityModes: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge RecordMediumWriteStatus: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_Album: Sweet Dreams
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_TrackUri: x-sonos-spotify:spotify:track:7tNAeLkrsnOqKXWTmd8cQp?sid=9&flags=8224&sn=3
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackMetaData_ItemId: -1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge DirectControlIsSuspended: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge NextTrackURI: x-sonos-spotify:spotify%3atrack%3a3p07oZZpSNdVtN93M5yIY5?sid=9&flags=8224&sn=3
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentSection: 0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge EnqueuedTransportURIMetaData_AlbumArtUri: https://i.scdn.co/image/ab67706f00000002aa995282d5635f79a4384b4c
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge EnqueuedTransportURIMetaData_ParentId: spotify%3aview%3ayour-heavy-rotation%5b0%5d
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge NextTrackMetaData_ItemId: -1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentTrackDuration: 0:02:08
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge NextTrackMetaData_ParentId: -1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge CurrentMediaDuration: NOT_IMPLEMENTED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge Treble: 0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge SubEnabled: true
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge Loudness: true
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge Bass: 0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge Mute_RF: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge Mute_Master: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge SubCrossover: 0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge PresetNameList: FactoryDefaults
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge Volume_Master: 9
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge HeadphoneConnected: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge SubPolarity: 0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge SubGain: 0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge Volume_RF: 100
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge Mute_LF: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge Volume_LF: 100
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge OutputFixed: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge SpeakerSize: 5
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge currentTrack_UpnpClass: object.item
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge groupName: Küche
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge playmode: NORMAL
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge name: Küche
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge mute_RF: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge currentTrack_ItemId: -1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge mute_Master: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge currentTrack_Title: DJ Mag Germany Radio by iloveradio.de
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge enqueuedMetadata_Title: DJ Mag Germany Radio by iloveradio.de
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge enqueuedMetadata_ItemId: -1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge enqueuedMetadata_UpnpClass: object.item.audioItem.audioBroadcast
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge transportState: STOPPED
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge uuid: RINCON_7828CAF4289001400
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge mute_LF: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge volume_RF: 100
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge currentTrack_ParentId: -1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge volume_LF: 100
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge volume_Master: 49
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge ts: 1591087299159
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge currentTrack_TrackUri: x-sonosapi-stream:s306651?sid=254&flags=8224&sn=0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge coordinatorUuid: RINCON_7828CAF4289001400
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge enqueuedMetadata_ParentId: -1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge currentTrack_ProtocolInfo: sonos.com-http:*:application/octet-stream:*
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge currentTrack_AlbumArtUri: http://192.168.20.71:1400/getaa?s=1&u=x-sonosapi-stream:s306651%3fsid%3d254%26flags%3d8224%26sn%3d0
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge ts: 1591087299186
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge currentTrack_TrackUri: x-rincon-queue:RINCON_5CAAFD79D52801400#vli
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge volume_Master: 9
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge volume_LF: 100
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge currentTrack_ParentId: -1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge coordinatorUuid: RINCON_5CAAFD79D52801400
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge currentTrack_ProtocolInfo: :*:application/octet-stream:*
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge currentTrack_ItemId: -1
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge mute_RF: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge name: Badezimmer
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge playmode: NORMAL
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge groupName: Badezimmer
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge currentTrack_UpnpClass: object.item
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge currentTrack_Title:
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge mute_Master: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge mute_LF: false
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge uuid: RINCON_5CAAFD79D52801400
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge transportState: PAUSED_PLAYBACK
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge volume_RF: 100
2020-06-02 10:41:59 MQTT2_DEVICE MQTT_sonos_bridge connected: 1
2020-06-02 10:41:59 MQTT2_DEVICE MQTT_sonos_bridge connected: 0


Kannst du mir das noch ein wenig übersetzen?
ZitatWenn man also nicht das --discovery auf false setzen will, sollte man die Meldungen "as is" konservieren. Könnte (in dem Bridge-Gerät) so funktionieren:
Code: [Auswählen]
attr DEVICE readingList\
  homeassistant/music_player/RINCON_([0-9A-Z]+):.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),; "config_$1") }
  sonos/connected:.* connected

homeassistant/music_player/RINCON_5CAAFD79D52801400/sonos/config:.* { json2nameValue($EVENT) }
sonos/status/wohnzimmer/renderingcontrol:.* { json2nameValue($EVENT) }
sonos/status/wohnzimmer/avtransport:.* { json2nameValue($EVENT) }
sonos/RINCON_7828CAF427B201400:.* { json2nameValue($EVENT) }

Das wären ja alle Readings pro Gerät. Ich habe noch nicht ganz mit bekommen welche ihr nun für die interessanten haltet...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: hoppel118 am 02 Juni 2020, 10:48:12
Zitat von: 87insane am 02 Juni 2020, 10:33:13
Es MUSS ein "ü" in Küche sein sonst bin ich mein SmartHome Amt los :-P

Beim Define eines Devices soll dies nicht sein. Dafür gibt es alias, siriName, alexaName, etc.

Mein Küchenplayer wurde vom Sonos Modul auch automatisch als ,,Sonos_Kueche" definiert und alias ,,Küche".

Gruß Hoppel
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 10:49:54
Zitat von: hoppel118 am 02 Juni 2020, 10:48:12
Beim Define eines Devices soll dies nicht sein. Dafür gibt es alias, siriName, alexaName, etc.

Mein Küchenplayer wurde vom Sonos Modul auch automatisch als ,,Sonos_Kueche" definiert und alias ,,Küche".

Gruß Hoppel
Damit alle beruhigt sind... MQTT TOPIC Pfad ist was anderes als ein Geräte Name... Mein Sonos hat in echt den Fhem-Namen k_sonos. Ich hoffe nun können alle wieder beruhigt die Sonne genießen :-P
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 02 Juni 2020, 11:04:10
Dass man Umlaute verwendet, ist an sich ok. FHEM kommt damit aber als Name leider derzeit nicht klar, und es passieren leider auch manchmal beim Konvertieren zwischen verschiedenen Namensräumen komische Sachen.

Aber wieso "sprechende Namen" Teil des Topic-Trees sein sollen, verstehe ich schlicht nicht (das gilt für zigbee2mqtt ganz genauso). Technische Namen sind unveränderlich, also sollte man die nehmen, alles andere kann man woanders regeln (alias, z.B.). Nur eben scheinbar bei homeasistant nicht :P . Kannst das ja gerne weitergeben, aber ich glaube nicht, dass ein homeassistant-"gepolter" (englischsprachiger) Coder das nachvollziehen kann...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 11:08:11
Zitat von: Beta-User am 02 Juni 2020, 11:04:10
Dass man Umlaute verwendet, ist an sich ok. FHEM kommt damit aber als Name leider derzeit nicht klar, und es passieren leider auch manchmal beim Konvertieren zwischen verschiedenen Namensräumen komische Sachen.

Aber wieso "sprechende Namen" Teil des Topic-Trees sein sollen, verstehe ich schlicht nicht (das gilt für zigbee2mqtt ganz genauso). Technische Namen sind unveränderlich, also sollte man die nehmen, alles andere kann man woanders regeln (alias, z.B.). Nur eben scheinbar bei homeasistant nicht :P . Kannst das ja gerne weitergeben, aber ich glaube nicht, dass ein homeassistant-"gepolter" (englischsprachiger) Coder das nachvollziehen kann...

Mal schauen.. hatte mal wegen was anderem Berührung mit denen und die waren ganz gut drauf :)
Die könnten ja eine Option oder mit einbauen um den Dienst in einem anderen Mode zu starten und dann hätten wir alles :)

Hast du meinen Beitrag weiter oben übersehen? Da hatte ich mal wieder viele Fragen an Dich :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 02 Juni 2020, 11:22:20
Zitat von: 87insane am 02 Juni 2020, 10:33:13
Anbei auch mal was beim start/stop so in FHEM passiert auf der Bridge:
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge connected: 2
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_13: seek
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_17: speak
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge availability_topic: sonos/connected
2020-06-02 10:41:41 MQTT2_DEVICE MQTT_sonos_bridge available_commands_15: setavtransporturi
[...]
Diese Events sind vorbearbeitet und nicht das, was mir vorschwebte - die JSON-Strukturen zu sehen. Das ginge z.B. mit raw-Events am Server, (mosquitto_sub&Co) oder eben mit "passenden" Reading-List-Einträgen
Zitat
Kannst du mir das noch ein wenig übersetzen?
homeassistant/music_player/RINCON_([0-9A-Z]+):.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),; "config_$1") }Das sollte bei der Bridge für jeden Player ein "Klartext-Reading" erzeugen, in dem dann der "autodiscovery-JSON" steht. Der erzeugt sonst irgendwelche Pseudo-Readings...
Zitathomeassistant/music_player/RINCON_5CAAFD79D52801400/sonos/config:.* { json2nameValue($EVENT) }
sonos/status/wohnzimmer/renderingcontrol:.* { json2nameValue($EVENT) }
sonos/status/wohnzimmer/avtransport:.* { json2nameValue($EVENT) }
sonos/RINCON_7828CAF427B201400:.* { json2nameValue($EVENT) }

Das wären ja alle Readings pro Gerät. Ich habe noch nicht ganz mit bekommen welche ihr nun für die interessanten haltet...
Nochmal: Das sind wegen diesem autodiscovery-Mist zu viele Readings...
Will man das auf Ebene des Einzelgeräts "filtern"/den "RAW-JSON", müßte das so in der rL klappen:
homeassistant/music_player/RINCON_5CAAFD79D52801400/sonos/config:.* HA_config
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 12:09:35
Also ich würde dir die RAWs ja gerne liefern aber bin dazu wohl nicht im Stande. Das sonos2mqtt Gerät hat kein rawEvents-Attribut.... wie könnte ich das noch erledigen?

homeassistant/music_player/RINCON_([0-9A-Z]+):.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),; "config_$1" }
erzeugt bei mir nichts... Du hattest auch ein ")"drin, was weg musste.... (homeassistant/music_player/RINCON_([0-9A-Z]+):.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),; "config_$1") })

homeassistant/music_player/RINCON_7828CAF4289001400/sonos/config:.* HA_config
erzeugt bei mir wie gewünscht HA_config mit folgendem Inhalt:
{"available_commands":["adv-command","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_7828CAF4289001400/control","device":{"identifiers":["RINCON_7828CAF4289001400"],"manufacturer":"Sonos","name":"Küche"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_7828CAF4289001400","name":"Küche","state_topic":"sonos/RINCON_7828CAF4289001400","unique_id":"sonos2mqtt_RINCON_7828CAF4289001400_speaker","availability_topic":"sonos/connected","payload_available":"2"}

Wohin die Reise gerade geht weiß ich nicht. Also was wollt ihr gerade genau machen, damit ich auch wieder helfen kann. Mail an Stephan van Rooij (sonos2mqtt) ist rauß. Bin mal gespannt was er sagt.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: rudolfkoenig am 02 Juni 2020, 12:27:03
ZitatAlso ich würde dir die RAWs ja gerne liefern aber bin dazu wohl nicht im Stande. Das sonos2mqtt Gerät hat kein rawEvents-Attribut.... wie könnte ich das noch erledigen?
attr MQTT2_SERVER verbose 5
oder
attr MQTT2_CLIENT verbose 5
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 02 Juni 2020, 12:31:21
Sorry wg. des Tpyo, und das mit dem config_$1 war auch "zu wenig" und konnte nicht funktionieren... Müßte eher so aussehen:
homeassistant/music_player/RINCON_([0-9A-Z]+):.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),; { "config_$1"=>$EVENT }}

Was man an dem Reading "HA_config" jetzt erkennen kann: Außer dass da mit "identifiers" und "name" die zwei Angaben "zusammen" drin stehen, die uns interessieren, steht da nichts wirklich neues, was man nicht auch via attrTemplate aus der API-Beschriebung erreichen/ablesen könnte.

Ansonsten ist das mit "rawEvents" was, das man am _IO_ einstellt (aus der cref zu SERVER):
Zitat
rawEvents <topic-regexp>
Send all messages as events attributed to this MQTT2_SERVER instance. Should only be used, if there is no MQTT2_DEVICE to process the topic.
Zitat von: 87insane am 02 Juni 2020, 12:09:35
Wohin die Reise gerade geht weiß ich nicht. Also was wollt ihr gerade genau machen, damit ich auch wieder helfen kann.
Ich will nur supporten, weil jemand an der Lampe gerieben hat ;) . Wenn dabei ein Satz attrTemplate rauskommt, wäre das für mich "völlig ok".

Wenn ich Otto richtig verstanden habe, will er a) MQTT weiter an einem praktischen Beispiel vertiefen und b) wissen, ob der MQTT-Weg ggf. eine Variante sein kann, wie man Sonos-Geräte gut in FHEM einbinden kann.

(@Otto: ggf. solltest du auch mal einen ESP32 mit OpenMQTTGateway ausstatten und dort das "autodiscovery"-feature _aktivieren_. Dann bekommst du ggf. ein besseres Gefühl dafür, warum ich es gut finde, dass man den Topic-Teil direkt am IO ins digitale Aufnimmerwiedersehen schicken kann...)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 12:43:38
verbose 5 habe ich in der Bridge mal angemacht und gehe dann davon aus, es müsste im FHEM LOG sein? Wenn, ja:
2020.06.02 12:38:28 4:  MQTT2_DEVICE_Parse: MQTT_sonos_bridge sonos/connected => connected
2020.06.02 12:38:28 4:  MQTT2_DEVICE_Parse: MQTT_sonos_bridge sonos/connected => connected
2020.06.02 12:38:36 4:  MQTT2_DEVICE_Parse: MQTT_sonos_bridge sonos/connected => connected
2020.06.02 12:38:36 4:  MQTT2_DEVICE_Parse: MQTT_sonos_bridge homeassistant/music_player/RINCON_5CAAFD79D52801400/sonos/config => { json2nameValue($EVENT) }
2020.06.02 12:38:36 4:  MQTT2_DEVICE_Parse: MQTT_sonos_bridge homeassistant/music_player/RINCON_5CAAFD79D52801400/sonos/config => { $TOPIC =~ m,(RINCON_[0-9A-Z]+),; { "config_$1"=>$EVENT }}
2020.06.02 12:38:36 4:  MQTT2_DEVICE_Parse: MQTT_sonos_bridge homeassistant/music_player/RINCON_7828CAF427B201400/sonos/config => { $TOPIC =~ m,(RINCON_[0-9A-Z]+),; { "config_$1"=>$EVENT }}
2020.06.02 12:38:36 4:  MQTT2_DEVICE_Parse: MQTT_sonos_bridge homeassistant/music_player/RINCON_7828CAF4289001400/sonos/config => { json2nameValue($EVENT) }
2020.06.02 12:38:36 4:  MQTT2_DEVICE_Parse: MQTT_sonos_bridge homeassistant/music_player/RINCON_7828CAF4289001400/sonos/config => { $TOPIC =~ m,(RINCON_[0-9A-Z]+),; { "config_$1"=>$EVENT }}
2020.06.02 12:38:36 4:  MQTT2_DEVICE_Parse: MQTT_sonos_bridge sonos/status/küche/renderingcontrol => { json2nameValue($EVENT) }
2020.06.02 12:38:36 4:  MQTT2_DEVICE_Parse: MQTT_sonos_bridge sonos/status/badezimmer/renderingcontrol => { json2nameValue($EVENT) }
2020.06.02 12:38:36 4:  MQTT2_DEVICE_Parse: MQTT_sonos_bridge sonos/RINCON_7828CAF4289001400 => { json2nameValue($EVENT) }
2020.06.02 12:38:37 4:  MQTT2_DEVICE_Parse: MQTT_sonos_bridge sonos/RINCON_5CAAFD79D52801400 => { json2nameValue($EVENT) }
2020.06.02 12:38:41 4:  MQTT2_DEVICE_Parse: MQTT_sonos_bridge sonos/status/wohnzimmer/avtransport => { json2nameValue($EVENT) }
2020.06.02 12:38:41 4:  MQTT2_DEVICE_Parse: MQTT_sonos_bridge sonos/status/küche/avtransport => { json2nameValue($EVENT) }
2020.06.02 12:38:41 4:  MQTT2_DEVICE_Parse: MQTT_sonos_bridge sonos/status/badezimmer/avtransport => { json2nameValue($EVENT) }
2020.06.02 12:38:42 4:  MQTT2_DEVICE_Parse: MQTT_sonos_bridge sonos/RINCON_7828CAF4289001400 => { json2nameValue($EVENT) }
2020.06.02 12:38:42 4:  MQTT2_DEVICE_Parse: MQTT_sonos_bridge sonos/RINCON_5CAAFD79D52801400 => { json2nameValue($EVENT) }


ZitatSorry wg. des Tpyo, und das mit dem config_$1 war auch "zu wenig" und konnte nicht funktionieren... Müßte eher so aussehen:
Code: [Auswählen]
homeassistant/music_player/RINCON_([0-9A-Z]+):.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),; { "config_$1"=>$EVENT }}
geht so auch nicht. Der Zweig ist länger. Hab es mal angepasst und dann geht es wie du das wolltest :) (es fehlt /sonos/config hinter dem RINCON_...)

Jo das weiter entwickeln hatte ich mitbekommen und unterstütze ich auch gerne. Hab heute auch noch zig andere xxxx2mqtt´s gefunden. Echt heftig wie viele es gibt ^^
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 02 Juni 2020, 12:47:38
Bei mir siehts mit rawEvents .* (.*weils nur das Device gibt bei dem Server) so aus:


2020-06-02 12:39:09 MQTT2_SERVER MQTT2_Server homeassistant/music_player/RINCON_000E58F7F67C01400/sonos/config:{"available_commands":["adv-command","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_000E58F7F67C01400/control","device":{"identifiers":["RINCON_000E58F7F67C01400"],"manufacturer":"Sonos","name":"Wohnzimmer"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_000E58F7F67C01400","name":"Wohnzimmer","state_topic":"sonos/RINCON_000E58F7F67C01400","unique_id":"sonos2mqtt_RINCON_000E58F7F67C01400_speaker","availability_topic":"sonos/connected","payload_available":"2"}

2020-06-02 12:39:15 MQTT2_SERVER MQTT2_Server sonos/status/wohnzimmer/avtransport:{"AVTransportURI":"x-rincon-mp3radio://http://opml.radiotime.com/Tune.ashx?id=e88185605&sid=s2485&formats=aac,mp3,hls&partnerId=rjyYMwEH&serial=AHFLNOA3T2XT6VWH2BAPMLPWOGLA","AVTransportURIMetaData":{"AlbumArtUri":"https://cdn-radiotime-logos.tunein.com/s2485q.png","Title":"102.8 Radio Regenbogen Heidelberg","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"-1","ParentId":"-1"},"AlarmRunning":false,"CurrentCrossfadeMode":false,"CurrentMediaDuration":"NOT_IMPLEMENTED","CurrentPlayMode":"NORMAL","CurrentRecordQualityMode":"NOT_IMPLEMENTED","CurrentSection":0,"CurrentTrack":1,"CurrentTrackDuration":"0:00:00","CurrentTrackMetaData":{"AlbumArtUri":"http://192.168.188.38:1400/getaa?u=x-rincon-mp3radio:%2f%2fhttp:%2f%2fopml.radiotime.com%2fTune.ashx%3fid%3de88185605%26sid%3ds2485%26formats%3daac,mp3,hls%26partnerId%3drjyYMwEH%26serial%3dAHFLNOA3T2XT6VWH2BAPMLPWOGLA&v=81","Title":"102.8 Radio Regenbogen Heidelberg","UpnpClass":"object.item","ItemId":"-1","ParentId":"-1","TrackUri":"x-rincon-mp3radio://http://opml.radiotime.com/Tune.ashx?id=e88185605&sid=s2485&formats=aac,mp3,hls&partnerId=rjyYMwEH&serial=AHFLNOA3T2XT6VWH2BAPMLPWOGLA","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},"CurrentTrackURI":"x-rincon-mp3radio://http://opml.radiotime.com/Tune.ashx?id=e88185605&sid=s2485&formats=aac,mp3,hls&partnerId=rjyYMwEH&serial=AHFLNOA3T2XT6VWH2BAPMLPWOGLA","CurrentTransportActions":"Set, Stop, Play","DirectControlIsSuspended":false,"EnqueuedTransportURI":"x-rincon-mp3radio://http://opml.radiotime.com/Tune.ashx?id=e88185605&sid=s2485&formats=aac,mp3,hls&partnerId=rjyYMwEH&serial=AHFLNOA3T2XT6VWH2BAPMLPWOGLA","EnqueuedTransportURIMetaData":{"AlbumArtUri":"https://cdn-radiotime-logos.tunein.com/s2485q.png","Title":"102.8 Radio Regenbogen Heidelberg","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"-1","ParentId":"-1"},"NumberOfTracks":1,"PlaybackStorageMedium":"NETWORK","PossiblePlaybackStorageMedia":"NONE, NETWORK","PossibleRecordQualityModes":"NOT_IMPLEMENTED","PossibleRecordStorageMedia":"NOT_IMPLEMENTED","RecordMediumWriteStatus":"NOT_IMPLEMENTED","RecordStorageMedium":"NOT_IMPLEMENTED","RestartPending":false,"SleepTimerGeneration":0,"SnoozeRunning":false,"TransportPlaySpeed":"NOT_IMPLEMENTED","TransportState":"STOPPED","TransportStatus":"OK"}

2020-06-02 12:39:15 MQTT2_SERVER MQTT2_Server sonos/status/wohnzimmer/renderingcontrol:{"Bass":3,"HeadphoneConnected":false,"Loudness":true,"Mute":{"Master":false,"LF":false,"RF":false},"OutputFixed":false,"PresetNameList":"FactoryDefaults","SpeakerSize":4,"SubCrossover":"0","SubEnabled":true,"SubGain":"0","SubPolarity":"0","Treble":-5,"Volume":{"Master":18,"LF":100,"RF":100}}

2020-06-02 12:39:15 MQTT2_SERVER MQTT2_Server sonos/RINCON_000E58F7F67C01400:{"uuid":"RINCON_000E58F7F67C01400","name":"Wohnzimmer","groupName":"Wohnzimmer","coordinatorUuid":"RINCON_000E58F7F67C01400","currentTrack":{"AlbumArtUri":"http://192.168.188.38:1400/getaa?u=x-rincon-mp3radio:%2f%2fhttp:%2f%2fopml.radiotime.com%2fTune.ashx%3fid%3de88185605%26sid%3ds2485%26formats%3daac,mp3,hls%26partnerId%3drjyYMwEH%26serial%3dAHFLNOA3T2XT6VWH2BAPMLPWOGLA&v=81","Title":"102.8 Radio Regenbogen Heidelberg","UpnpClass":"object.item","ItemId":"-1","ParentId":"-1","TrackUri":"x-rincon-mp3radio://http://opml.radiotime.com/Tune.ashx?id=e88185605&sid=s2485&formats=aac,mp3,hls&partnerId=rjyYMwEH&serial=AHFLNOA3T2XT6VWH2BAPMLPWOGLA","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},"enqueuedMetadata":{"AlbumArtUri":"https://cdn-radiotime-logos.tunein.com/s2485q.png","Title":"102.8 Radio Regenbogen Heidelberg","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"-1","ParentId":"-1"},"transportState":"STOPPED","playmode":"NORMAL","ts":1591094355330,"volume":{"Master":18,"LF":100,"RF":100},"mute":{"Master":false,"LF":false,"RF":false}}


Gruß

Thomas
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 13:01:11
Zitat von: TomLee am 02 Juni 2020, 12:47:38
Bei mir siehts mit rawEvents .* (.*weils nur das Device gibt bei dem Server) so aus:
....

Gruß

Thomas

Danke! Ich bin echt zu blöd dafür. Also wie ich das hinbekomme wird mir auf ewig ein Rätzel sein. Hab das schon x mal gefragt aber bekomme es einfach nicht so hin :(

Anbei mal meine aktuelle Readingslist der Bridge (Ist so ganz okay, denke ich oder?):
sonos/connected:.* connected
homeassistant/music_player/RINCON_([0-9A-Z]+)/sonos/config:.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),; { "config_$1"=>$EVENT }}
sonos/status/.*/avtransport:.* { json2nameValue($EVENT) }
sonos/status/.*/renderingcontrol:.* { json2nameValue($EVENT) }
sonos/RINCON_([0-9A-Z]+):.* { json2nameValue($EVENT) }
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 02 Juni 2020, 13:07:44
@TomLee: Danke!
Das gibt m.E. einen besseren Überblick, mit was man es zu tun hat.

Irgendwie unschön, dass alles doppelt und dreifach ist in den drei Zweigen, die eigentlich interessieren. Scheint aber so zu sein, dass man für eine vollständige Info wirklich "nicename" und "techname" braucht...

Aber "lc" von "name" scheint das zu sein, was nach "sonos/status/" gebraucht wird, um es zu vertemplaten, ohne auf den homeassistant-Zweig angewiesen zu sein? =>ReadingsVal sollte das liefern können... bridgeRegexp beim Zentralgerät auf den "techname" anzusetzen sollte also reichen?

(MAn. solltet ihr das "homeassistant" in die rignoreRegexp aufnehmen...).
Readingslist der Bridge könnte dann so passen:
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:.* {}

Erläuterungen:
- sonos/connected müssen wir uns gesondert ansehen, das scheint ähnlich zu ticken wie "announce" bei den shelly (one-for-all, muß per regex in jedem Gerät ausgewertet weeden, ob da was dabei ist (wie sieht das Reading dazu über der Zeit aus?).)
- avtransport und rederingcontrol interessieren eigentlich erst in den "Einzelgeräten". Damit das aber nicht immer wieder neu angelegt wird, und überhaupt Readings erzeugt werden, "himmeln" wir das direkt (in der Bridge) bzw. legen es dann gezielt in den sub-Geräten an (s.o.)...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 02 Juni 2020, 13:10:40
ZitatDanke! Ich bin echt zu blöd dafür. Also wie ich das hinbekomme wird mir auf ewig ein Rätzel sein. Hab das schon x mal gefragt aber bekomme es einfach nicht so hin

Komm ich nicht mit !? du meinst das hier jetzt nur die vier rawEvents schön untereinander aufgelistet sind ?
Die hab ich im Eventmonitor aus den normalen Events rausgepickt um sie hier einfach zum kopieren bereitzustellen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 13:35:39
@Beta-User: Hast du
sonos/RINCON_([0-9A-Z]+):.* { json2nameValue($EVENT) }
absichtlich weg gelassen?

ZitatAber "lc" von "name" scheint das zu sein, was nach "sonos/status/" gebraucht wird, um es zu vertemplaten, ohne auf den homeassistant-Zweig angewiesen zu sein? =>ReadingsVal sollte das liefern können... bridgeRegexp beim Zentralgerät auf den "techname" anzusetzen sollte also reichen?
du meinst lc (lowercase)? Auch hier kann ich deinen Gedanken nicht folgen :-\ Du sprichst manchmal aber auch ein Programmierer-Deutsch^^
Ich möchte die Bridge zuerst fertig machen und dann die Geräte. Habe aktuell also die Readingslist drin wie du sagtest + die eine Zeile mehr.

Zitatwie sieht das Reading dazu über der Zeit aus?
Im connected Reading steht immer eine gesamt Zahl der verbundenen Geräte. Also bei mir 3 oder aktuell 2 (eine ist aktuell abgeklemmt).

Zitatbzw. legen es dann gezielt in den sub-Geräten an (s.o.)
Auf welchen Beitrag, beziehst du dich?

aktuelles List:
Internals:
   CID        mqttjs_56a1977e
   DEF        mqttjs_56a1977e
   DEVICETOPIC MQTT_sonos_bridge
   FUUID      5ed60f7b-f33f-fcb4-5c80-665a5a1723b8fa51
   IODev      sonosmqtt
   LASTInputDev sonosmqtt
   MSGCNT     489
   NAME       MQTT_sonos_bridge
   NR         449
   STATE      offline
   TYPE       MQTT2_DEVICE
   sonosmqtt_MSGCNT 489
   sonosmqtt_TIME 2020-06-02 13:48:21
   OLDREADINGS:
   READINGS:
     2020-06-02 13:48:21   bridge_state    offline
     2020-06-02 13:48:16   config_RINCON_5CAAFD79D52801400 {"available_commands":["adv-command","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_5CAAFD79D52801400/control","device":{"identifiers":["RINCON_5CAAFD79D52801400"],"manufacturer":"Sonos","name":"Badezimmer"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_5CAAFD79D52801400","name":"Badezimmer","state_topic":"sonos/RINCON_5CAAFD79D52801400","unique_id":"sonos2mqtt_RINCON_5CAAFD79D52801400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-06-02 13:48:16   config_RINCON_7828CAF427B201400 {"available_commands":["adv-command","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_7828CAF427B201400/control","device":{"identifiers":["RINCON_7828CAF427B201400"],"manufacturer":"Sonos","name":"Wohnzimmer"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_7828CAF427B201400","name":"Wohnzimmer","state_topic":"sonos/RINCON_7828CAF427B201400","unique_id":"sonos2mqtt_RINCON_7828CAF427B201400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-06-02 13:48:16   config_RINCON_7828CAF4289001400 {"available_commands":["adv-command","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_7828CAF4289001400/control","device":{"identifiers":["RINCON_7828CAF4289001400"],"manufacturer":"Sonos","name":"Küche"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_7828CAF4289001400","name":"Küche","state_topic":"sonos/RINCON_7828CAF4289001400","unique_id":"sonos2mqtt_RINCON_7828CAF4289001400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-06-02 13:48:21   connected       0
     2020-06-02 13:45:22   coordinatorUuid RINCON_7828CAF4289001400
     2020-06-02 13:45:22   currentTrack_Album Sweet Dreams
     2020-06-02 13:45:22   currentTrack_AlbumArtUri http://192.168.20.71:1400/getaa?s=1&u=x-sonosapi-stream:s306651%3fsid%3d254%26flags%3d8224%26sn%3d0
     2020-06-02 13:45:22   currentTrack_Artist F4ST
     2020-06-02 13:45:22   currentTrack_Duration 0:02:08
     2020-06-02 13:45:22   currentTrack_ItemId -1
     2020-06-02 13:45:22   currentTrack_ParentId -1
     2020-06-02 13:45:22   currentTrack_ProtocolInfo sonos.com-http:*:application/octet-stream:*
     2020-06-02 13:45:22   currentTrack_Title DJ Mag Germany Radio by iloveradio.de
     2020-06-02 13:45:22   currentTrack_TrackUri x-sonosapi-stream:s306651?sid=254&flags=8224&sn=0
     2020-06-02 13:45:22   currentTrack_UpnpClass object.item
     2020-06-02 13:45:22   enqueuedMetadata_AlbumArtUri https://i.scdn.co/image/ab67706f00000002aa995282d5635f79a4384b4c
     2020-06-02 13:45:22   enqueuedMetadata_Artist Spotify
     2020-06-02 13:45:22   enqueuedMetadata_ItemId -1
     2020-06-02 13:45:22   enqueuedMetadata_ParentId -1
     2020-06-02 13:45:22   enqueuedMetadata_Title DJ Mag Germany Radio by iloveradio.de
     2020-06-02 13:45:22   enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-02 13:45:22   groupName       Küche
     2020-06-02 13:45:22   mute_LF         false
     2020-06-02 13:45:22   mute_Master     false
     2020-06-02 13:45:22   mute_RF         false
     2020-06-02 13:45:22   name            Küche
     2020-06-02 13:45:22   nextTrack_Album Zombie (Zombic & Felix Schorn Remix)
     2020-06-02 13:45:22   nextTrack_AlbumArtUri http://192.168.20.70:1400/getaa?s=1&u=x-sonos-spotify:spotify:track:3p07oZZpSNdVtN93M5yIY5%3fsid%3d9%26flags%3d8224%26sn%3d3
     2020-06-02 13:45:22   nextTrack_Artist Besomorph
     2020-06-02 13:45:22   nextTrack_Duration 0:02:40
     2020-06-02 13:45:22   nextTrack_ItemId -1
     2020-06-02 13:45:22   nextTrack_ParentId -1
     2020-06-02 13:45:22   nextTrack_ProtocolInfo sonos.com-spotify:*:audio/x-spotify:*
     2020-06-02 13:45:22   nextTrack_Title Zombie (Zombic & Felix Schorn Remix)
     2020-06-02 13:45:22   nextTrack_TrackUri x-sonos-spotify:spotify:track:3p07oZZpSNdVtN93M5yIY5?sid=9&flags=8224&sn=3
     2020-06-02 13:45:22   nextTrack_UpnpClass object.item.audioItem.musicTrack
     2020-06-02 13:45:22   playmode        NORMAL
     2020-06-02 13:45:22   transportState  STOPPED
     2020-06-02 13:45:22   ts              1591098320592
     2020-06-02 13:45:22   uuid            RINCON_7828CAF4289001400
     2020-06-02 13:45:22   volume_LF       100
     2020-06-02 13:45:22   volume_Master   49
     2020-06-02 13:45:22   volume_RF       100
Attributes:
   IODev      sonosmqtt
   devStateIcon online:10px-kreis-gruen offline:10px-kreis-rot
   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:.* {}
sonos/RINCON_([0-9A-Z]+):.* { json2nameValue($EVENT) }
   room       MQTT2_DEVICE
   stateFormat bridge_state
   userReadings bridge_state:connected:.* { ReadingsVal("$name","connected",0) > "0" ? "online" : "offline" }


Ach ja... Also gefakten online Stati der Bridge selber könnte man ein userReading nutzen in folgender Art:
bridge_state:connected:.* { ReadingsVal("$name","connected",0) > "0" ? "online" : "offline" }
Ansonsten müsste man den Dienst irgendwie abfragen. Woher bekommen die anderen Bridges ihren Stati?


@TomLee: Geil.. wie blöd man einfach sein kann.. ich hampel die ganze Zeit auf der Bridge rum anstelle des wirklichen Servers. Kein wunder das ich auch nichts angezeigt bekomme...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 02 Juni 2020, 14:06:23
Ja, das fehlt _in der Bridge_ absichtlich, das gehört jeweils zu den Sub-Devices, die via bridgeRegexp angelegt werden sollten.

Und es macht m.E. nicht den großen Sinn, bridge und Subgeräte separat "fertig" machen zu wollen; letztendlich soll jede Info ja irgendwo landen, und nur zusammen wird ein Schuh draus...

(Mein "Progammiererdeutsch" scheint ja zum Nachdenken anzuregen, und ja, mit "lc" ist lowercase gemeint (bzw. eben die Funktion lc); was das Ding unter "name" im JSON sendet, ist Groß geschrieben, in der readingList (als Bestandteil des topic-Trees) brauchen wir es aber "richtig" bzw. regex-konform, und da verwendet der sonos2-Programmierer scheinbar eben Kleinschreibung - warum auch immer... (unter diesem Gesichtspunkt wundert man sich noch mehr über Sonderzeichen).

Wenn "connected" sich tatsächlich nur auf die bridge bzw. die Anzahl der dort gerade angedockten Geräte bezieht, darf das selbstredend (nur) da bleiben, ein userReading braucht man m.E. nicht.

An dem list sieht man jetzt auch sehr schön, dass homeassistant (für uns) unnütz ist ;) (jedenfalls, wenn man unterstellt, dass wir "name" als Reading in den Sub-Devices bekommen, die bridgeRegexp anlegt).

Mit "s.o." war nur gemeint, dass bridgeRegexp _nur_ den kurzen Techname weiterleiten sollte (Otto hatte ursprünglich mal zwei Zeilen vorgeschlagen; hab's jetzt nochmal nachgesehen, bei der zweiten ging es um den (endlich zu streichenden/vergessenden/irgorierenden!) homeassistant-Zweig). Der muß also raus. Würde auch auf das Sonos verzichten, aus irgendeinem Grund steht ja überall das "RINCON_..." drin. Daher evtl. (bei dem von dir verwendeten Namen):
attr MQTT_sonos_bridge bridgeRegexp sonos/(RINCON_[0-9A-F]+):.* "$1"
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 Juni 2020, 15:15:46
Man Jungs, kaum macht man mal ne Radtour quer durch die Leipziger Seenplatte - muss man 100 Seiten lesen :) ;D ;D

@Beta-User mein "Scriptcode" für die Raw Def ist für mich sowas wie der lernende Übergang vom Perl zum Template. Du fragst so locker was daran besser sein soll: Kann ich Dir sagen: Ich kann noch kein Template :) Das war der Versuch bei einer halben Flasche Goldriesling zu verstehen was man am "Gerät erzeugen" überhaupt / wie machen könnte und muss.

Ich habe mir gestern für einen Player vier Device erstellt. Das hilft beim sehen und verstehen, was weg kann und was bleiben muss:
define MQTT2_Sonos_AZ_HA MQTT2_DEVICE Sonos_347E5C82560801400
attr MQTT2_Sonos_AZ_HA IODev sonosmqtt
attr MQTT2_Sonos_AZ_HA readingList homeassistant/music_player/RINCON_347E5C82560801400/sonos/config:.* { json2nameValue($EVENT) }
attr MQTT2_Sonos_AZ_HA room MQTT2_DEVICE

define MQTT2_Sonos_AZ_RINCON MQTT2_DEVICE Sonos_347E5C82560801400
attr MQTT2_Sonos_AZ_RINCON IODev sonosmqtt
attr MQTT2_Sonos_AZ_RINCON readingList sonos/RINCON_347E5C82560801400:.* { json2nameValue($EVENT) }
attr MQTT2_Sonos_AZ_RINCON room MQTT2_DEVICE

define MQTT2_Sonos_AZ_StatusAVT MQTT2_DEVICE Sonos_347E5C82560801400
attr MQTT2_Sonos_AZ_StatusAVT IODev sonosmqtt
attr MQTT2_Sonos_AZ_StatusAVT readingList sonos/status/arbeitszimmer/avtransport:.* { json2nameValue($EVENT) }
attr MQTT2_Sonos_AZ_StatusAVT room MQTT2_DEVICE

define MQTT2_Sonos_AZ_StatusRender MQTT2_DEVICE Sonos_347E5C82560801400
attr MQTT2_Sonos_AZ_StatusRender IODev sonosmqtt
attr MQTT2_Sonos_AZ_StatusRender readingList sonos/status/arbeitszimmer/renderingcontrol:.* { json2nameValue($EVENT) }
attr MQTT2_Sonos_AZ_StatusRender room MQTT2_DEVICE


Ich denke der sonos/RINCON_347E5C82560801400 Zweig ist der den man im praktischen Betrieb braucht. In zwei Stufen könnte man die Geräte anlegen und sprechend benennen. Also wahrscheinlich 3 mal ein Template anwenden, oder nur einmal und zwei notify einbauen die die Geräte konfigurieren.

@87insane Hast Du die Steuerung jetzt hinbekommen?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 02 Juni 2020, 15:46:11
Ja, das ist alles nicht so einfach zu verstehen, wenn man "alles in einen Topf" wirft... Das mit den 4 Geräten ist schon mal eine gute Sache, um das ganze zu ordnen, läuft ja in dieselbe Richtung.

Habe hier mal einen (ungetesteten) Vorschlag, wie man die hier vorhandenen Infos evtl. jetzt "sortieren" kann, hoffe, das hilft auf Basis der rieslinggestützten Erkenntnisse zur vollendeten Erleuchtung:
###########################################
# sonos2mqtt
# The sonos2mqtt bridge device (entire hex id of devices as bridgeRegexp)
name:sonos2mqtt_bridge
desc:The sonos2mqtt bridge device
filter:TYPE=MQTT2_DEVICE
order:M_01
par:BASE_TOPIC;base topic set in configuration.yaml of the sonos2mqtt bridge;{ AttrVal("DEVICE","devicetopic",AttrVal("DEVICE","readingList","")) =~ m,[\b]?([^/:]+)[/].+, ? $1 : undef }
attr DEVICE readingList\
  BASE_TOPIC/connected:.* connected\
  homeassistant/music_player/RINCON_([0-9A-Z]+)/sonos/config:.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),; { "config_$1"=>$EVENT }}\
  BASE_TOPIC/status/[^/]+/avtransport:.* {}\
  BASE_TOPIC/status/[^/]+/renderingcontrol:.* {}
attr DEVICE bridgeRegexp\
  BASE_TOPIC/(RINCON_[A-Za-z0-9._]*)[/]?.*:.* "$1"

name:sonos2mqtt_speaker
desc:A sonos2mqtt speaker device
filter:TYPE=MQTT2_DEVICE
order:M_02
par:BASE_TOPIC;base topic set in configuration.yaml of the sonos2mqtt bridge;{ AttrVal("DEVICE","devicetopic",AttrVal("DEVICE","readingList","")) =~ m,[\b]?([^/:]+)[/].+, ? $1 : undef }
par:DEV_ID;techname of the device ;{ AttrVal("DEVICE","readingList","") =~ m,[^/]+[/](RINCON_[0-9A-Z]+):.*, ? $1 : undef }
par:DEVNAME;friendly name as set in sonos gadget itself;{ lc(ReadingsVal("DEVICE","name","unknown")) }
attr DEVICE readingList\
  BASE_TOPIC/status/DEVNAME/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }\
  BASE_TOPIC/status/DEVNAME/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }\
  BASE_TOPIC/DEV_ID:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr DEVICE setList\
  stop:noArg BASE_TOPIC/DEV_ID/control { "command": "stop" }\
  play:noArg BASE_TOPIC/DEV_ID/control { "command": "play" }\
  volume:slider,0,1,100 BASE_TOPIC/DEV_ID/control { "command": "volume", "input": $EVTPART1 }"


Anmerkungen:
- Statt dreier Geräte sind die Readings jetzt mit einem Präfix versehen, die aus "avtransport" bzw. "renderingcontrol" kommen. Für den (nicht unwahrscheinlichen) Fall, dass da irgendwas brauchbares dabei ist, kann man das via jsonMap dann umbenennen und den Rest ins digitale Nirvana befördern;
- Habe auch mal pauschal $JSONMAP ermöglicht, damit wir ggf. etwas mehr Freiheiten haben, die Readings "schöner" zu benennen (z.B. Volume wirklich (einheitlich) groß zu schreiben);
- Falls zu häufig immer dieselben ungeänderten Infos kommen => siehe "true" ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 02 Juni 2020, 16:22:01
Wenn ich auf dieses automatisch angelegte Device

defmod MQTT2_mqttjs_70fe3e7c MQTT2_DEVICE mqttjs_70fe3e7c
attr MQTT2_mqttjs_70fe3e7c IODev MQTT2_Server
attr MQTT2_mqttjs_70fe3e7c readingList mqttjs_70fe3e7c:sonos/connected:.* connected\
mqttjs_70fe3e7c:homeassistant/music_player/RINCON_000E58F7F67C01400/sonos/config:.* { json2nameValue($EVENT) }\
mqttjs_70fe3e7c:sonos/status/wohnzimmer/avtransport:.* { json2nameValue($EVENT) }\
mqttjs_70fe3e7c:sonos/status/wohnzimmer/renderingcontrol:.* { json2nameValue($EVENT) }\
mqttjs_70fe3e7c:sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT) }
attr MQTT2_mqttjs_70fe3e7c room MQTT2_DEVICE

setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 AVTransportURI x-rincon-mp3radio://http://opml.radiotime.com/Tune.ashx?id=e88185605&amp;;sid=s2485&amp;;formats=aac,mp3,hls&amp;;partnerId=rjyYMwEH&amp;;serial=AHFLNOA3T2XT6VWH2BAPMLPWOGLA
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 AVTransportURIMetaData_AlbumArtUri https://cdn-radiotime-logos.tunein.com/s2485q.png
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 AVTransportURIMetaData_ItemId -1
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 AVTransportURIMetaData_ParentId -1
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 AVTransportURIMetaData_Title 102.8 Radio Regenbogen Heidelberg
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 AVTransportURIMetaData_UpnpClass object.item.audioItem.audioBroadcast
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 AlarmRunning false
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 Bass 3
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 CurrentCrossfadeMode false
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 CurrentMediaDuration NOT_IMPLEMENTED
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 CurrentPlayMode NORMAL
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 CurrentRecordQualityMode NOT_IMPLEMENTED
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 CurrentSection 0
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 CurrentTrack 1
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 CurrentTrackDuration 0:00:00
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 CurrentTrackMetaData_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-rincon-mp3radio:%2f%2fhttp:%2f%2fopml.radiotime.com%2fTune.ashx%3fid%3de88185605%26sid%3ds2485%26formats%3daac,mp3,hls%26partnerId%3drjyYMwEH%26serial%3dAHFLNOA3T2XT6VWH2BAPMLPWOGLA&v=81
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 CurrentTrackMetaData_ItemId -1
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 CurrentTrackMetaData_ParentId -1
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 CurrentTrackMetaData_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 CurrentTrackMetaData_Title 102.8 Radio Regenbogen Heidelberg
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 CurrentTrackMetaData_TrackUri x-rincon-mp3radio://http://opml.radiotime.com/Tune.ashx?id=e88185605&sid=s2485&formats=aac,mp3,hls&partnerId=rjyYMwEH&serial=AHFLNOA3T2XT6VWH2BAPMLPWOGLA
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 CurrentTrackMetaData_UpnpClass object.item
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 CurrentTrackURI x-rincon-mp3radio://http://opml.radiotime.com/Tune.ashx?id=e88185605&amp;;sid=s2485&amp;;formats=aac,mp3,hls&amp;;partnerId=rjyYMwEH&amp;;serial=AHFLNOA3T2XT6VWH2BAPMLPWOGLA
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 CurrentTransportActions Set, Stop, Play
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 DirectControlIsSuspended false
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 EnqueuedTransportURI x-rincon-mp3radio://http://opml.radiotime.com/Tune.ashx?id=e88185605&amp;;sid=s2485&amp;;formats=aac,mp3,hls&amp;;partnerId=rjyYMwEH&amp;;serial=AHFLNOA3T2XT6VWH2BAPMLPWOGLA
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 EnqueuedTransportURIMetaData_AlbumArtUri https://cdn-radiotime-logos.tunein.com/s2485q.png
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 EnqueuedTransportURIMetaData_ItemId -1
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 EnqueuedTransportURIMetaData_ParentId -1
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 EnqueuedTransportURIMetaData_Title 102.8 Radio Regenbogen Heidelberg
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 EnqueuedTransportURIMetaData_UpnpClass object.item.audioItem.audioBroadcast
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 HeadphoneConnected false
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 Loudness true
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 Mute_LF false
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 Mute_Master false
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 Mute_RF false
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 NumberOfTracks 1
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 OutputFixed false
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 PlaybackStorageMedium NETWORK
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 PossiblePlaybackStorageMedia NONE, NETWORK
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 PossibleRecordQualityModes NOT_IMPLEMENTED
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 PossibleRecordStorageMedia NOT_IMPLEMENTED
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 PresetNameList FactoryDefaults
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 RecordMediumWriteStatus NOT_IMPLEMENTED
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 RecordStorageMedium NOT_IMPLEMENTED
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 RestartPending false
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 SleepTimerGeneration 0
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 SnoozeRunning false
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 SpeakerSize 4
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 SubCrossover 0
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 SubEnabled true
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 SubGain 0
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 SubPolarity 0
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 TransportPlaySpeed NOT_IMPLEMENTED
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 TransportState STOPPED
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 TransportStatus OK
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 Treble -5
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 Volume_LF 100
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 Volume_Master 18
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:50 Volume_RF 100
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 availability_topic sonos/connected
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_1 adv-command
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_10 playmode
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_11 previous
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_12 queue
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_13 seek
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_14 selecttrack
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_15 setavtransporturi
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_16 sleep
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_17 speak
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_18 stop
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_19 switchtoline
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_2 command
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_20 switchtoqueue
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_21 switchtotv
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_22 toggle
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_23 unmute
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_24 volume
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_25 volumedown
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_26 volumeup
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_3 joingroup
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_4 leavegroup
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_5 mute
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_6 next
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_7 notify
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_8 pause
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 available_commands_9 play
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 command_topic sonos/RINCON_000E58F7F67C01400/control
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 connected 2
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 coordinatorUuid RINCON_000E58F7F67C01400
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 currentTrack_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-rincon-mp3radio:%2f%2fhttp:%2f%2fopml.radiotime.com%2fTune.ashx%3fid%3de88185605%26sid%3ds2485%26formats%3daac,mp3,hls%26partnerId%3drjyYMwEH%26serial%3dAHFLNOA3T2XT6VWH2BAPMLPWOGLA&v=81
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 currentTrack_ItemId -1
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 currentTrack_ParentId -1
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 currentTrack_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 currentTrack_Title 102.8 Radio Regenbogen Heidelberg
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 currentTrack_TrackUri x-rincon-mp3radio://http://opml.radiotime.com/Tune.ashx?id=e88185605&sid=s2485&formats=aac,mp3,hls&partnerId=rjyYMwEH&serial=AHFLNOA3T2XT6VWH2BAPMLPWOGLA
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 currentTrack_UpnpClass object.item
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 device_class speaker
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 device_identifiers_1 RINCON_000E58F7F67C01400
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 device_manufacturer Sonos
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 device_name Wohnzimmer
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 enqueuedMetadata_AlbumArtUri https://cdn-radiotime-logos.tunein.com/s2485q.png
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 enqueuedMetadata_ItemId -1
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 enqueuedMetadata_ParentId -1
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 enqueuedMetadata_Title 102.8 Radio Regenbogen Heidelberg
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 groupName Wohnzimmer
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 icon mdi:speaker
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 json_attributes true
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 json_attributes_topic sonos/RINCON_000E58F7F67C01400
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 mute_LF false
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 mute_Master false
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 mute_RF false
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 name Wohnzimmer
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 payload_available 2
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 playmode NORMAL
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 state_topic sonos/RINCON_000E58F7F67C01400
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 transportState STOPPED
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 ts 1591107290558
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:45 unique_id sonos2mqtt_RINCON_000E58F7F67C01400_speaker
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 uuid RINCON_000E58F7F67C01400
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 volume_LF 100
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 volume_Master 18
setstate MQTT2_mqttjs_70fe3e7c 2020-06-02 16:14:51 volume_RF 100


das sonos2mqtt_bridge-Template anwende dann wird das bridgeRegexp -Attribut angelegt aber keine rL, warum ist das so oder versteh ich was falsch, sehe es nicht.

attr DEVICE readingList\
  BASE_TOPIC/connected:.* connected\
  homeassistant/music_player/RINCON_([0-9A-Z]+)/sonos/config:.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),; { "config_$1"=>$EVENT }}\
  BASE_TOPIC/status/[^/]+/avtransport:.* {}\
  BASE_TOPIC/status/[^/]+/renderingcontrol:.* {}
attr DEVICE bridgeRegexp\
  BASE_TOPIC/(RINCON_[A-Za-z0-9._]*)[/]?.*:.* "$1"


defmod MQTT2_mqttjs_70fe3e7c MQTT2_DEVICE mqttjs_70fe3e7c
attr MQTT2_mqttjs_70fe3e7c IODev MQTT2_Server
attr MQTT2_mqttjs_70fe3e7c bridgeRegexp sonos/(RINCON_[A-Za-z0-9._]*)[/]?.*:.* "$1"
attr MQTT2_mqttjs_70fe3e7c room MQTT2_DEVICE
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 16:25:46
Ja hab ich.
Template übernehme ich wenn du dafür so fröhlich weiter machst.

Generell werden die templates pro Gerät gesetzt. Macht auch Sinn. Stell dir vor du kaufst morgen eine zusätzliche Sonos. Sie würde erkannt, erstellt und der user muss nur noch das Template auswählen.

Solange wir uns alle einig sind wie es am ende sein soll, kann ich anfangen. Am besten sollten wir mal genau festhalten in einem Beitrag wie wir es wollen. Bitte bitte aber so das ich mitkomme. Ich hab öfter das Problem beta-userranisch zu verstehen. Muss dann immer 4 mal lesen weil mir die Perl seite nicht so präsent ist. Wenigstens lc hatte ich noch im Kopf :-P

Was wir brauchen:
1 × Template Bridge
1 x temolate devices

Ich habe 2x Sonos one und einmal Sonos play 1.
Da sollten wir auch gucken wie sich andere Geräte verhalten. Was hast du/ihr?

Gesendet von meinem LM-G810 mit Tapatalk

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 16:29:09
Die rL landet im eigentlichen Player. Via Bridge werden diese raus geregext und an den Player weiter gegeben. Die Bridge selber bietet innerhalb dieses Modul leider keine Infos/readings wie online/offline zb. Aber es kann natürlich sein das man das noch aktivieren kann. Warte da noch auf Mail Antwort da das Wiki des Module, sagen wir mal dürftig ist.

Gesendet von meinem LM-G810 mit Tapatalk

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 02 Juni 2020, 16:30:06
Mist, die bridgeRegexp muß vor der readingList definiert werden, denn das löscht sonst die neue rL gleich wieder... so herum sollte es gehen:
###########################################
# sonos2mqtt
# The sonos2mqtt bridge device (entire hex id of devices as bridgeRegexp)
name:sonos2mqtt_bridge
desc:The sonos2mqtt bridge device
filter:TYPE=MQTT2_DEVICE
order:M_01
par:BASE_TOPIC;base topic set in configuration.yaml of the sonos2mqtt bridge;{ AttrVal("DEVICE","devicetopic",AttrVal("DEVICE","readingList","")) =~ m,[\b]?([^/:]+)[/].+, ? $1 : undef }
attr DEVICE bridgeRegexp\
  BASE_TOPIC/(RINCON_[A-Za-z0-9._]*)[/]?.*:.* "$1"
attr DEVICE readingList\
  BASE_TOPIC/connected:.* connected\
  homeassistant/music_player/RINCON_([0-9A-Z]+)/sonos/config:.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),; { "config_$1"=>$EVENT }}\
  BASE_TOPIC/status/[^/]+/avtransport:.* {}\
  BASE_TOPIC/status/[^/]+/renderingcontrol:.* {}

name:sonos2mqtt_speaker
desc:A sonos2mqtt speaker device
filter:TYPE=MQTT2_DEVICE
order:M_02
par:BASE_TOPIC;base topic set in configuration.yaml of the sonos2mqtt bridge;{ AttrVal("DEVICE","devicetopic",AttrVal("DEVICE","readingList","")) =~ m,[\b]?([^/:]+)[/].+, ? $1 : undef }
par:DEV_ID;techname of the device ;{ AttrVal("DEVICE","readingList","") =~ m,[^/]+[/](RINCON_[0-9A-Z]+):.*, ? $1 : undef }
par:DEVNAME;friendly name as set in sonos gadget itself;{ lc(ReadingsVal("DEVICE","name","unknown")) }
attr DEVICE readingList\
  BASE_TOPIC/status/DEVNAME/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }\
  BASE_TOPIC/status/DEVNAME/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }\
  BASE_TOPIC/DEV_ID:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr DEVICE setList\
  stop:noArg BASE_TOPIC/DEV_ID/control { "command": "stop" }\
  play:noArg BASE_TOPIC/DEV_ID/control { "command": "play" }\
  volume:slider,0,1,100 BASE_TOPIC/DEV_ID/control { "command": "volume", "input": $EVTPART1 }"
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 16:31:37
Okay dann ziehe ich meine aussage mal zurück. Hätte gedacht das es so okay ist.

Als ich das händisch getestet hatte war egal wie rum die rL weg. Aber ich will nicht sagen das die Hitze mir auf den Kopf geschlagen ist :-P teste es später nochmal. Aber bei dem Tempo kann ich das vermutlich bis dahin fertig aus dem SVN laden. Geil wie schnell das hier geht.

Gesendet von meinem LM-G810 mit Tapatalk
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 02 Juni 2020, 16:35:50
funzt, Danke. Weiter kann ich erst heute Aben wieder spielen.

defmod MQTT2_mqttjs_b2916b6c MQTT2_DEVICE mqttjs_b2916b6c
attr MQTT2_mqttjs_b2916b6c IODev MQTT2_Server
attr MQTT2_mqttjs_b2916b6c bridgeRegexp sonos/(RINCON_[A-Za-z0-9._]*)[/]?.*:.* "$1"
attr MQTT2_mqttjs_b2916b6c 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:.* {}
attr MQTT2_mqttjs_b2916b6c room MQTT2_DEVICE
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 02 Juni 2020, 16:48:45
Nur zur Vollständigkeit, war zu schnell, hab jetzt mal s2m neugestartet, es gibt mit dem Template jetzt 2 Readings.

defmod MQTT2_mqttjs_b2916b6c MQTT2_DEVICE mqttjs_b2916b6c
attr MQTT2_mqttjs_b2916b6c IODev MQTT2_Server
attr MQTT2_mqttjs_b2916b6c bridgeRegexp sonos/(RINCON_[A-Za-z0-9._]*)[/]?.*:.* "$1"
attr MQTT2_mqttjs_b2916b6c 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:.* {}
attr MQTT2_mqttjs_b2916b6c room MQTT2_DEVICE

setstate MQTT2_mqttjs_b2916b6c 2020-06-02 16:42:08 config_RINCON_000E58F7F67C01400 {"available_commands":["adv-command","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_000E58F7F67C01400/control","device":{"identifiers":["RINCON_000E58F7F67C01400"],"manufacturer":"Sonos","name":"Wohnzimmer"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_000E58F7F67C01400","name":"Wohnzimmer","state_topic":"sonos/RINCON_000E58F7F67C01400","unique_id":"sonos2mqtt_RINCON_000E58F7F67C01400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
setstate MQTT2_mqttjs_b2916b6c 2020-06-02 16:42:08 connected 2

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 17:01:03
Hey - Es geht soweit super...
Hat einer von Euch aber schonmal ins LOG vom Dienst gesehen? Hab da z.B.
2020-06-02T14:54:50.291Z [Warning] Error executing play for Badezimmer (RINCON_5CAAFD79D52801400)
SonosError: Sonos error on Play UPnPError 701
    at AVTransportService.handleErrorResponse (/usr/local/lib/node_modules/sonos2mqtt/node_modules/@svrooij/sonos/lib/services/base-service.js:209:23)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at async AVTransportService.handleRequest (/usr/local/lib/node_modules/sonos2mqtt/node_modules/@svrooij/sonos/lib/services/base-service.js:168:16)
    at async AVTransportService.SoapRequestWithBodyNoResponse (/usr/local/lib/node_modules/sonos2mqtt/node_modules/@svrooij/sonos/lib/services/base-service.js:104:16)
    at async AVTransportService.Play (/usr/local/lib/node_modules/sonos2mqtt/node_modules/@svrooij/sonos/lib/services/av-transport.service.js:91:32)
    at async SonosDevice.Play (/usr/local/lib/node_modules/sonos2mqtt/node_modules/@svrooij/sonos/lib/sonos-device.js:724:27)
    at async Function.ExecuteCommand (/usr/local/lib/node_modules/sonos2mqtt/lib/sonos-command-mapping.js:38:24)
    at async Function.ExecuteControl (/usr/local/lib/node_modules/sonos2mqtt/lib/sonos-command-mapping.js:7:20)
    at async EventEmitter.<anonymous> (/usr/local/lib/node_modules/sonos2mqtt/lib/sonos-to-mqtt.js:79:17) {
  Action: 'Play',
  FaultCode: 's:Client',
  Fault: 'UPnPError',
  UpnpErrorCode: 701
}


Aber an sich geht alles was bisher an Befehlen vorhanden ist.

Das sagt das Netz: a 701 error points to a general connectivity problem
Aber Netzwerkseitig ist an sich alles OK. Das kommt mit sogar mit LAN Kabel. Aber es kommt auch nicht immer.
Falls das jemand wissen mag. Bei mir kommt der ERROR immer dann wenn der Player an sich vorher noch keine Quelle hatte. Alle die SONOS nutzen kennen das.
Wenn man die Dinger neu an Strom steckt und auf Play drückt passiert nichts. Erst wenn einmal ein Stream oder so gestartet wurde geht play.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 02 Juni 2020, 17:02:42
Zitat von: TomLee am 02 Juni 2020, 16:48:45
Nur zur Vollständigkeit, war zu schnell, hab jetzt mal s2m neugestartet, es gibt mit dem Template jetzt 2 Readings.
MMn. sieht das gut aus (abgesehen davon, dass man über homeassistant weiter diskutieren kann...); hättest du mehr erwartet?

Zitat von: 87insane am 02 Juni 2020, 16:31:37
[...] kann ich das vermutlich bis dahin fertig aus dem SVN laden.
Ob es fertig ist, werden wir sehen, aber via svn verfügbar ist es jetzt...

Habe nur die bridgeRegexp noch geringfügig angepaßt.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 02 Juni 2020, 17:07:13
play und stop klappt auch mit dem Speaker-Template, nur volume nicht.

Seh aber keinen Unterschied zu dem Beispiel aus dem ersten Post von Otto zu dem Volume-setter.

defmod MQTT2_RINCON_000E58F7F67C01400 MQTT2_DEVICE RINCON_000E58F7F67C01400
attr MQTT2_RINCON_000E58F7F67C01400 IODev MQTT2_Server
attr MQTT2_RINCON_000E58F7F67C01400 readingList sonos/status/wohnzimmer/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }\
  sonos/status/wohnzimmer/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }\
  sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr MQTT2_RINCON_000E58F7F67C01400 room MQTT2_DEVICE
attr MQTT2_RINCON_000E58F7F67C01400 setList stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }\
  play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
  volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }"

setstate MQTT2_RINCON_000E58F7F67C01400 volume
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_CurrentCrossfadeMode false
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_CurrentPlayMode NORMAL
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_CurrentSection 0
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_CurrentTrack 1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_CurrentTrackDuration 0:00:00
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_CurrentTrackMetaData_AlbumArtUri https://cdn-radiotime-logos.tunein.com/s2485q.png
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_CurrentTrackMetaData_Artist DIE ÄRZTE
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_CurrentTrackMetaData_ItemId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_CurrentTrackMetaData_ParentId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_CurrentTrackMetaData_ProtocolInfo aac:*:application/octet-stream:*
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_CurrentTrackMetaData_Title M&amp;;F
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_CurrentTrackMetaData_TrackUri aac://http://streams.regenbogen.de/rr-mannheim-128-aac?usid=0-0-H-A-V-02
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_CurrentTrackMetaData_UpnpClass object.item
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_CurrentTrackURI aac://http://streams.regenbogen.de/rr-mannheim-128-aac?usid=0-0-H-A-V-02
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_EnqueuedTransportURI x-rincon-mp3radio://http://opml.radiotime.com/Tune.ashx?id=e88185605&amp;;sid=s2485&amp;;formats=aac,mp3,hls&amp;;partnerId=rjyYMwEH&amp;;serial=AHFLNOA3T2XT6VWH2BAPMLPWOGLA
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_EnqueuedTransportURIMetaData_AlbumArtUri https://cdn-radiotime-logos.tunein.com/s2485q.png
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_EnqueuedTransportURIMetaData_ItemId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_EnqueuedTransportURIMetaData_ParentId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_EnqueuedTransportURIMetaData_Title 102.8 Radio Regenbogen Heidelberg
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_EnqueuedTransportURIMetaData_UpnpClass object.item.audioItem.audioBroadcast
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_NumberOfTracks 1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 AV_TransportState PLAYING
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:39:12 associatedWith MQTT2_mqttjs_b2916b6c
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 coordinatorUuid RINCON_000E58F7F67C01400
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 currentTrack_AlbumArtUri https://cdn-radiotime-logos.tunein.com/s2485q.png
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 currentTrack_Artist DIE ÄRZTE
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 currentTrack_ItemId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 currentTrack_ParentId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 currentTrack_ProtocolInfo aac:*:application/octet-stream:*
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 currentTrack_Title M&amp;;F
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 currentTrack_TrackUri aac://http://streams.regenbogen.de/rr-mannheim-128-aac?usid=0-0-H-A-V-02
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 currentTrack_UpnpClass object.item
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 enqueuedMetadata_AlbumArtUri https://cdn-radiotime-logos.tunein.com/s2485q.png
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 enqueuedMetadata_ItemId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 enqueuedMetadata_ParentId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 enqueuedMetadata_Title 102.8 Radio Regenbogen Heidelberg
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 groupName Wohnzimmer
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 mute_LF false
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 mute_Master false
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 mute_RF false
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 name Wohnzimmer
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 playmode NORMAL
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:35 state volume
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 transportState PLAYING
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 ts 1591109902093
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 uuid RINCON_000E58F7F67C01400
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 volume_LF 100
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 volume_Master 18
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-02 16:58:22 volume_RF 100



Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 02 Juni 2020, 17:09:15
Jetzt seh ichs, das " am Ende der rL wars. Das kommt sus dem Template.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 17:11:42
Auch geil.. Ich lade mir die Templates manuell rein, mache noch kurz ein Update, Neustart und auf einmal sind die doppelt drin.
Hast die zeitgleich ins SVN gestellt.

Aber um so besser, muss ich das nicht manuell erledigen. Danke! Ich versuche mal zu schauen was wir noch an Befehlen rauß kitzeln können. Sprache ist hier auch wieder ein Thema. Denn ich hab darüber meine Klingel usw laufen. Bin gespannt ob wir das hinbekommen.

Aso... Ich kann das natürlich eben eingeben aber du schiebst es ja eh ins SVN. Anbei die möglichen befehle:

https://github.com/svrooij/sonos2mqtt/blob/master/README.md#supported-command

Unter Text 2 speach findet man noch weitere befehle wie Wecker stellen oder sowas.

Die connected Geschichte ist auch nicht wie ich sagte. Ich hab zufällig 2 Speakers angeschlossen. Deswegen ist die 2 aber nicht da

https://github.com/svrooij/sonos2mqtt/blob/master/README.md#connect-messages
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 02 Juni 2020, 17:26:16
Net manuell, über die Kommandozeile  ;)  :P

{ Svn_GetFile("FHEM/lib/AttrTemplate/mqtt2.template", "FHEM/lib/AttrTemplate/mqtt2.template", sub(){ AttrTemplate_Initialize() }) }
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 17:31:53
Jo das geht aber ich hatte ja eh ein Update gemacht.

@Beta-User: (OT) Info: Shelly hat x neue Firmwares raus geschoben. Es wurden diverse Readings geändert. Nicht wundern das da wieder eine Welle kommen könnte. Ich selber hab auch noch nicht alle erfasst. Kann man das was FHEM als change ansieht und sagt man solle speichern, da sonst weg nach Neustart - Auch irgendwo geschrieben sehen? Dann könnte ich dir das alles bereit stellen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 02 Juni 2020, 17:40:51
... den " beseitige ich bei Gelegenheit noch, aber so langsam aber sicher seid ihr wieder dran...

"speak" kann man wohl machen, man müßte vermutlich nur erst den $EVENT um den ersten Teil "säubern" (das Kommando) (und das eben alles in Perl machen; habe auf die Schnelle noch kein Beispiel im Kopf, wo das ähnlich wäre).

Zu "connected" fällt euch bestimmt auch was "hübsches" ein, für stateFormat z.B....

Zu OT: bitte gesondert (im shelly-MQTT2-Thread) adressieren und bitte gleich changelogs oä. von der Shelly-Seite her verlinken, dann kann ich mir ggf. schneller ein Bild machen. Prinzipiell sollte es immer so sein, dass die attrTemplate den letzten firmwarestand berücksichtigen, aber wenn man weder attrTemplate erneut andwendet und auch kein firmware-update macht, passiert auch nichts und alles sollte funktional bleiben...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 17:48:43
Bitte nicht doppelt arbeiten.. Als Info - ich tippe gerade die ganzen setlist befehle ein. Ich versuche erstmal was ich so aus dem Kopf kann. Den Rest bitte gemeinsam oder ich muss eben alles noch nachsehen, dass dauert dann aber ;)

Ich habe noch kein Changelog gefunden. Ggf kommt das gleich noch...Wollte dir auch nur schonmal die Info geben.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 18:17:29
Anbei sL und was ich so an Fragen habe ;)

Folgende Befehle sind mal durchgeklickt aber nicht wirklich getestet. Entsprechen aber der Logok und machen so umgesetzt in meinen Augen Sinn:

joingroup                      Join another group by name                           name of other device
leavegroup              Remove current device from the group it's in   
mute                            🔈   Mute the volume   
next                           ⏩   Go to next song in queue   
notify                   🔔   Play a notification sound and restore playback   see notifications
pause                      Pause playback   
play                           ▶️   Start playback   
playmode                   🔀   Change the playmode, when using queue           NORMAL, REPEAT_ALL, SHUFFLE or SHUFFLE_NOREPEAT.
previous                   ⏪   Go to previous song in queue   
queue                   ➕   Add a song to the queue                                   Track uri
seek                           🕞   Seek in the current track                                   Time like 0:02:45
selecttrack                      Select another track in the current queue             number
setavtransporturi   🔡   Set the current playback uri, for advanced cases.   playback or track uri (check out the trackUri topic to find the required value)
sleep                           💤   Set a sleeptimer for x minutes                           number
speak                   💬   Generate text-to-speech file and play as notification 🎉   see text-to-speech
stop                           🚫   Stop Playback   
switchtoline              Switch to line-in (on supported devices)   
switchtoqueue              Switch to queue   
switchtotv                      Switch to TV input (on supported devices, eg. playbar)   
toggle                      Toggle between pause and play   
unmute                   🔇   Unmute the volume   
volume                   🔈   Set the volume to a value   number (between 1 and 100)
volumedown          ➖   Decrease volume with 5 or number                 optional number
volumeup                  ➕   Increase volume with 5 or number                 optional number


stop:noArg sonos/RINCON_7828CAF427B201400/control { "command": "stop" }
  play:noArg sonos/RINCON_7828CAF427B201400/control { "command": "play" }
  volume:slider,0,1,100 sonos/RINCON_7828CAF427B201400/control { "command": "volume", "input": $EVTPART1 }
  leavegroup:noArg sonos/RINCON_7828CAF427B201400/control { "command": "leavegroup" }
  mute:on,off { $EVTPART1 eq "on" ? 'sonos/RINCON_7828CAF427B201400/control { "command": "mute" }' : 'sonos/RINCON_7828CAF427B201400/control { "command": "unmute" }'}
  next:noArg sonos/RINCON_7828CAF427B201400/control { "command": "next" }
  pause:noArg sonos/RINCON_7828CAF427B201400/control { "command": "pause" }
  playmode:NORMAL,REPEAT_ALL,SHUFFLE,SHUFFLE_NOREPEAT sonos/RINCON_7828CAF427B201400/control { "command": $EVTPART1 }
  previous:noArg sonos/RINCON_7828CAF427B201400/control { "command": "previous" }
  queue sonos/RINCON_7828CAF427B201400/control { "command": "queue", "input": $EVTPART1 }
  seek sonos/RINCON_7828CAF427B201400/control { "command": "seek", "input": $EVTPART1 }
  selecttrack sonos/RINCON_7828CAF427B201400/control { "command": "selecttrack", "input": $EVTPART1 }
  setavtransporturi sonos/RINCON_7828CAF427B201400/control { "command": "setavtransporturi", "input": $EVTPART1 }
  sleep sonos/RINCON_7828CAF427B201400/control { "command": "sleep", "input": $EVTPART1 }
  switchtoline:noArg sonos/RINCON_7828CAF427B201400/control { "command": "switchtoline" }
  switchtoqueue:noArg sonos/RINCON_7828CAF427B201400/control { "command": "switchtoqueue" }
  switchtotv:noArg sonos/RINCON_7828CAF427B201400/control { "command": "switchtotv" }
  toggle:noArg sonos/RINCON_7828CAF427B201400/control { "command": "toggle" }


Hier gibt es die Möglichkeit entweder nur den Befehl zu senden (+5/-5) oder man kann manuell eine Zahl eingeben. Bin mir nicht sicher wenn ich { "command": "volumedown" EVTPART1 } nutze ob dann EVTPART1 in dem Moment etwas enthalten könnte. Deswegen habe ich das gesplittet. Das wisst ihr aber sicher...
    volumedown_5:noArg sonos/RINCON_7828CAF427B201400/control { "command": "volumedown" }
  volumedown_5:noArg sonos/RINCON_7828CAF427B201400/control { "command": "volumedown" }
  volumedown_manuel noArg sonos/RINCON_7828CAF427B201400/control { "command": "volumedown", "input": $EVTPART1 }
  volumeup_5:noArg sonos/RINCON_7828CAF427B201400/control { "command": "volumeup" }
  volumeup_manuel noArg sonos/RINCON_7828CAF427B201400/control { "command": "volumeup", "input": $EVTPART1 }


Hier brauche ich Denkanstöße...
joingroup:So hatte ich mir das gedacht. Geht natürlich nicht. Ideen? Dropdown Menü, REGEX für alle Sonos sonos/RINCON_7828CAF427B201400/control { "command": $EVTPART1 }
notify: Ist die Payload aber übersteigt meine Ideen erstmal ohne zu gucken. Hier bräuchte man ja Text Felder, Dropdown usw{
  "command": "notify",
  "input": {
    "trackUri": "https://cdn.smartersoft-group.com/various/pull-bell-short.mp3",
    "onlyWhenPlaying": false,
    "timeout": 10,
    "volume": 8,
    "delayMs": 700
  }
}
speak Payload anbei. Befehl: sonos/RINCON_7828CAF427B201400/speak {
  "text": "Someone at the front-door",
  "endpoint": "https://your.tts.endpoint/api/generate",
  "lang": "en-US",
  "gender": "male",
  "volume": 50,
  "onlyWhenPlaying": false,
  "delayMs": 700
}


EDIT: BITTE BEACHTEN - Leichte Verbesserungen an sL List um 18:42 Uhr
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 02 Juni 2020, 18:55:10
Für die endgültige Fassung des Templates würd ich mir wünschen das das muten, wie auch im Sonos-Modul, mit einem setter mute umgesetzt wird. Dann aber nicht mit 1/0 sondern on/off, weil ich der Meinung bin das die Umsetzung mit 1/0 eher die Ausnahme ist. Bei LGTV_WebOS ist es bspw. auch on/off.

Also so in der Art, weiß aber erst mal nicht wie mans richtig macht:

mute:on,off { EVTPART1 eq "on"?"sonos/RINCON_7828CAF427B201400/control { "command": "mute" }":"sonos/RINCON_7828CAF427B201400/control { "command": "unmute" }"}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 19:08:14
Hey nochmal...

sonos2MQTT devstateicon Vorschlag für die Bridge mit Funktion, wenn man will ;)?
{ my $amp = ReadingsVal($name,"connected","0") eq "0" ? "rot" : ReadingsVal($name,"connected","0") eq "1" ? "gelb" : "gruen";;
my $stateinfo = ReadingsVal($name,"connected","0") eq "0" ? "sonos2MQTT Dienst ist aus" : ReadingsVal($name,"connected","0") eq "1" ? "sonos2MQTT findet kein SONOS Gerät" : "sonos2MQTT läuft!";;
my $show = "<a href=\"/fhem?cmd.dummy=set $name restart&XHR=1\">".FW_makeImage("10px-kreis-".$amp)."</a>";;
"<div> $show $stateinfo </div>" }


sL Idee für die Bridge:
restart:noArg {system ("sudo -u root /opt/fhem/FHEM/restart.sh &")}
start:noArg {system ("sudo -u root /opt/fhem/FHEM/start.sh &")}
stop:noArg {system ("sudo -u root /opt/fhem/FHEM/stop.sh &")}


Geht natürlich und sicher auch in einem Script mit Übergabe des Befehls aber ich wollte das nur mal kurz zeigen.
Auch wäre möglich den neustart Befehl des Dienstes z.B. direkt zu nutzen, denke ich.

Was passiert hier überhaupt?
Bei klicken auf den kleinen Kreis, der folgendes aussagt:
0 or missing is not connected (set by will functionality). = rot
1 is connected to mqtt, but not to any sonos device. = gelb
2 is connected to mqtt and at least one sonos speaker. (ultimate success!) = grün

wird der Dienst neugestartet.

Anbei mal ein schnelles Paint...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 19:19:30
Zitat von: TomLee am 02 Juni 2020, 18:55:10
Für die endgültige Fassung des Templates würd ich mir wünschen das das muten, wie auch im Sonos-Modul, mit einem setter mute umgesetzt wird. Dann aber nicht mit 1/0 sondern on/off, weil ich der Meinung bin das die Umsetzung mit 1/0 eher die Ausnahme ist. Bei LGTV_WebOS ist es bspw. auch on/off.

Also so in der Art, weiß aber erst mal nicht wie mans richtig macht:

mute:on,off { EVTPART1 eq "on"?"sonos/RINCON_7828CAF427B201400/control { "command": "mute" }":"sonos/RINCON_7828CAF427B201400/control { "command": "unmute" }"}

Habe es mal ausgebessert (war fast richtig :)) und mit aufgenommen. Guter Input!

  mute:on,off { $EVTPART1 eq "on" ? 'sonos/RINCON_7828CAF427B201400/control { "command": "mute" }' : 'sonos/RINCON_7828CAF427B201400/control { "command": "unmute" }'}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 Juni 2020, 19:47:37
Ihr seid hyperaktive :) da brauch ich erstmal meine letzte Flasche Goldriesling ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 20:00:33
Muss ehrlich gestehen, dass es eben auch einfach Spaß macht wenn alle mitmachen und beitragen was sie können.
Ich kann das nicht, egal jemand anderes hat das schon erledigt. Ich kann dafür das und jemand anders nicht usw.... T.E.A.M. lese ich hier im positiven :)

Wenn das so weiter geht, steht das Ding am Ende der Woche :) Gönn dir ruhig deinen Riesling. Ich bin auch beim Bier gelandet gerade. Für heute bin ich durch. Habe aber schon ein wenig Angst wie viele Seiten ich dann morgen lesen darf :-P

@Otto123: Macht es nicht Sinn, den ersten Beitrag auf aktuellem Stand zu halten? Dann findet jeder sofort was er sucht. Oder machst du am Ende nochmal einen anderen Thread auf?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 21:12:23
Kleine Idee doch noch....

Ist eine Idee und eine Fleißarbeit. Kann man aber aus den setList Befehlen komplett abgucken und ist fast nur copy & paste. Man könnte die ganzen Einträge in Untermenüs packen. z.B.
- controll =
  toggle:noArg sonos/RINCON_7828CAF427B201400/control { "command": "toggle" }
  volume:slider,0,1,100 sonos/RINCON_7828CAF427B201400/control { "command": "volume", "input": $EVTPART1 }"
  next:noArg sonos/RINCON_7828CAF427B201400/control { "command": "next" }
  previous:noArg sonos/RINCON_7828CAF427B201400/control { "command": "previous" }
  mute:on,off { $EVTPART1 eq "on" ? 'sonos/RINCON_7828CAF427B201400/control { "command": "mute" }' : 'sonos/RINCON_7828CAF427B201400/control { "command": "unmute" }'}
  play:noArg sonos/RINCON_7828CAF427B201400/control { "command": "play" }
  stop:noArg sonos/RINCON_7828CAF427B201400/control { "command": "stop" }
  pause:noArg sonos/RINCON_7828CAF427B201400/control { "command": "pause" }
 
- advanced control =
  seek sonos/RINCON_7828CAF427B201400/control { "command": "seek", "input": $EVTPART1 }
  selecttrack sonos/RINCON_7828CAF427B201400/control { "command": "selecttrack", "input": $EVTPART1 }
  setavtransporturi sonos/RINCON_7828CAF427B201400/control { "command": "setavtransporturi", "input": $EVTPART1 }
  leavegroup:noArg sonos/RINCON_7828CAF427B201400/control { "command": "leavegroup" }
  queue sonos/RINCON_7828CAF427B201400/control { "command": "queue", "input": $EVTPART1 }
  playmode:NORMAL,REPEAT_ALL,SHUFFLE,SHUFFLE_NOREPEAT sonos/RINCON_7828CAF427B201400/control { "command": $EVTPART1 }

- extras = 
  sleep sonos/RINCON_7828CAF427B201400/control { "command": "sleep", "input": $EVTPART1 }
  switchtoline:noArg sonos/RINCON_7828CAF427B201400/control { "command": "switchtoline" }
  switchtoqueue:noArg sonos/RINCON_7828CAF427B201400/control { "command": "switchtoqueue" }
  switchtotv:noArg sonos/RINCON_7828CAF427B201400/control { "command": "switchtotv" }
 

Ist nur so ne Idee... Hab das mal versucht, es für mich so halbwegs logisch auch in der Sortierung. Da will ich mich weder bei Benamung oder Reihenfolge festlegen aber ist ne Idee.... Wer will, kann anfangen :-P

Das ganze hat den Hintergrund, das niemand diese ganzen Optionen wirklich braucht. Deswegen würde ich das schon selektieren.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 Juni 2020, 21:23:23
Spontan kann ich sagen: switchtotv geht nicht: not implemented :(
habe ich vorgestern schon in mehreren Variationen probiert
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 21:51:32
also ich kann das nicht testen da ich kein Gerät habe was das kann.... Deswegen vorhin auch meine Frage wer hier was hat.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 Juni 2020, 22:18:42
Die Meldung kommt direkt von dem sonos2mqtt "im Fenster" ich habe das noch interaktiv gestartet.
Das ist aus meiner Sicht empfehlenswert beim testen :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juni 2020, 22:28:13
Me2... Würde das im Leben so nicht laufen lassen. Wobei das aktuell schon gehen würde.

Hätt ja auch mal ne Meldung direkt aus der Konsole gepostet. Hatte tatsächlich gerade "fenster" geschrieben [emoji33] (bis mir auffiel das du das sehr "neutral" erklärt hast...)

Was steht nun auf dem Aufgaben zettel?
Aus meinem Post sind noch dinge offen. Da weiß ich ad-hoc nicht weiter.

Gesendet von meinem LM-G810 mit Tapatalk
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 03 Juni 2020, 05:50:47
Vielleicht noch ein etwas generischerer Hinweis: Es sollte https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV (https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV) beachtet werden ;) .

Was das switchtotv angeht, wird das wohl nur bei wenigen Modellen unterstützt (stand irgendwo in der Doku).

Da wir vermutlich mehr Perl in der setList brauchen (wg. DevelopmentGuidelinesAV), würde ich vorschlagen, die eigentlichen Sendestrings erst ganz am Ende zusammenzubauen, dürfte effektiv kürzer werden, und das dann mit "qq" zu interpolieren. Damit ich nicht lange die Fachbegriffe erläutern muß ein Beispiel, das hoffentlich funktioniert:
mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute"; qq(
sonos/RINCON_7828CAF427B201400/control { "command": "$value" } ) }


Und statt Perl-devStateIcon würde ich hier zur multiline-stateFormat+regex-devStateIcon-Variante tendieren...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 03 Juni 2020, 13:00:35
Zitat von: Beta-User am 03 Juni 2020, 05:50:47
Was das switchtotv angeht, wird das wohl nur bei wenigen Modellen unterstützt (stand irgendwo in der Doku).
Ja, das dürften bei mir die playbase und die beam sein. zumindest heben beide den TV Knopf in der Sonos UI.
Ich wollte gestern damit nur sagen: Es gibt ne Liste und es gibt die Realität :)
Ich weiß auch nicht genau was da aufeinander aufbaut (mehrere node Module (node-sonos-ts)beteiligt?!)
Und es gab die Aussage: es ist nicht alles direkt implementiert, aber man kann sich "RAW" mit Sonos unterhalten -> adv-command - damit hab ich auch schon, leider bisher völlig erfolglos, rumprobiert. Da braucht man wieder einen Übersetzer :) für Doku.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 03 Juni 2020, 16:00:17
Bei mir kommt immer false zurück im Reading mute_Master, ist das bei euch auch so ?
muten on/off klappt aber ohne Probleme.

defmod MQTT2_SONOS_SPEAKER_WOHNZIMMER MQTT2_DEVICE RINCON_000E58F7F67C01400
attr MQTT2_SONOS_SPEAKER_WOHNZIMMER IODev MQTT2_Server
attr MQTT2_SONOS_SPEAKER_WOHNZIMMER jsonMap volume_Master:volume mute_Master:mute
attr MQTT2_SONOS_SPEAKER_WOHNZIMMER readingList sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr MQTT2_SONOS_SPEAKER_WOHNZIMMER room MQTT2_DEVICE
attr MQTT2_SONOS_SPEAKER_WOHNZIMMER setList mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }

setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER play
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 coordinatorUuid RINCON_000E58F7F67C01400
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 currentTrack_AlbumArtUri https://cdn-radiotime-logos.tunein.com/s2485q.png
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 currentTrack_Artist BENEE FEAT. GUS DAPPERTON
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 currentTrack_ItemId -1
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 currentTrack_ParentId -1
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 currentTrack_ProtocolInfo aac:*:application/octet-stream:*
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 currentTrack_Title SUPALONELY
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 currentTrack_TrackUri aac://http://streams.regenbogen.de/rr-mannheim-128-aac?usid=0-0-H-A-V-02
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 currentTrack_UpnpClass object.item
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 enqueuedMetadata_AlbumArtUri https://cdn-radiotime-logos.tunein.com/s2485q.png
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 enqueuedMetadata_ItemId -1
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 enqueuedMetadata_ParentId -1
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 enqueuedMetadata_Title 102.8 Radio Regenbogen Heidelberg
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 groupName Wohnzimmer
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 mute false
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 mute_LF false
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 mute_RF false
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 name Wohnzimmer
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 playmode NORMAL
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:40:05 state play
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 transportState PLAYING
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 ts 1591191759246
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:42:39 uuid RINCON_000E58F7F67C01400
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:31:31 volume 9
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:31:31 volume_LF 100
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 15:31:31 volume_RF 100
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 03 Juni 2020, 16:15:15
Wenn ich mich nicht täusche, hast du ohne Gruppen auch keinen Master.

Gesendet von meinem LM-G810 mit Tapatalk

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 03 Juni 2020, 16:24:52
Ok, versteh ich. Unabhängig davon wie das richtige Reading zu dem mute Kommando heißt, es ändert sich unter keinem anderen Topic irgendein Reading wenn ich mute, ist das bei dir auch so ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 03 Juni 2020, 16:28:09
Wie ich schrieb...
Hab das zwar gepflegt und alles abgetippt nach besten Wissen und Gewissen aber getestet nur grob. Schaue ich mir an. Bin aber noch auf der Arbeit.

Gesendet von meinem LM-G810 mit Tapatalk

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 03 Juni 2020, 16:36:07
Moment, versteh ich noch net ganz.

ZitatStatus message

We emit a single status message for each sonos speaker, on the sonos/uuid_of_speaker topic. This status message is a combination of all the sonos events we are listening for. Just create an issue (or PR) if you think there should be more data send to mqtt.

Topic: sonos/RINCON_000E5000000001400 this message is retained.

{
  "uuid" : "RINCON_000E5000000001400",
  "name" : "Kantoor",
  "groupName" : "Kantoor",
  "coordinatorUuid" : "RINCON_000E5000000001400",
  "currentTrack" : {
    "Album" : "Hard Bass 2012 Mixed by The Pitcher, Luna, Frontliner and Chris One",
    "Artist" : "Pavo",
    "AlbumArtUri" : "http://192.168.1.105:1400/getaa?s=1&u=x-sonos-spotify:spotify:track:3Je8RHcdTJ8NGG3krmCHUd%3fsid%3d9%26flags%3d8224%26sn%3d7",
    "Title" : "Let's Go! - Radio Edit",
    "UpnpClass" : "object.item.audioItem.musicTrack",
    "Duration" : "0:04:06",
    "ItemId" : "-1",
    "ParentId" : "-1",
    "TrackUri" : "x-sonos-spotify:spotify:track:3Je8RHcdTJ8NGG3krmCHUd?sid=9&flags=8224&sn=7",
    "ProtocolInfo" : "sonos.com-spotify:*:audio/x-spotify:*"
  },
  "enqueuedMetadata" : {
    "Artist" : "stephanvanrooij",
    "AlbumArtUri" : "https://mosaic.scdn.co/640/ab67616d0000b27323f45715a7ccccab470d29b2ab67616d0000b273819f90c805b6a4a816495df9ab67616d0000b273be8e9b832634616dcf14ca97ab67616d0000b273d2cb2c655c141aa8e7fff4f0",
    "Title" : "Hardstyle",
    "UpnpClass" : "object.container.playlistContainer",
    "ItemId" : "10062a6cspotify%3aplaylist%3a5e2KheF9qKRvqCwtFlKEme",
    "ParentId" : "00080024playlists"
  },
  "nextTrack" : {
    "Album" : "Renegades",
    "Artist" : "Frequencerz",
    "AlbumArtUri" : "http://192.168.1.105:1400/getaa?s=1&u=x-sonos-spotify:spotify:track:7iGbCV07PTIWpEBXUoIZG3%3fsid%3d9%26flags%3d8224%26sn%3d7",
    "Title" : "Renegades",
    "UpnpClass" : "object.item.audioItem.musicTrack",
    "Duration" : "0:04:52",
    "ItemId" : "-1",
    "ParentId" : "-1",
    "TrackUri" : "x-sonos-spotify:spotify:track:7iGbCV07PTIWpEBXUoIZG3?sid=9&flags=8224&sn=7",
    "ProtocolInfo" : "sonos.com-spotify:*:audio/x-spotify:*"
  },
  "transportState" : "PLAYING",
  "playmode" : "SHUFFLE",
  "ts" : 1586344373119,
 "volume" : {
    "Master" : 7,
    "LF" : 100,
    "RF" : 100
  },
  "mute" : {
    "Master" : false,
    "LF" : false,
    "RF" : false
  }
}

ändere ja auch mit dem volume Kommando volume_Master
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 03 Juni 2020, 16:47:49
Bin ja schon fast am pc.... Ruhig Blut :-P danke aber für das raus suchen...

Gesendet von meinem LM-G810 mit Tapatalk

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 03 Juni 2020, 17:56:42
Habs gefunden.. schreibe gleich was dazu... Muss nun noch zurück setzen und testen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 03 Juni 2020, 18:10:03
Ich habe mal Beta-Users AttrTemplate getestet. Funktioniert - wenn man das herum ludernde " Am Dateiende wieder löscht :)
Ich habe einfach alles was ich bisher an MQTT2_Devices hatte gelöscht.
Habe den sonos2mqtt beendet.
Dann habe ich define SonosBridge MQTT2_DEVICE ein leeres Device angelegt. AttrTemplate  sonos2mqtt_bridge angwendet, dabei musste ich sonos eingeben und fertig.
Nach dem Start von sonos2mqtt hat er die RINCON_ Devices angelegt. dort dann AttrTemplate sonos2mqtt_speaker angewendet. :)

Muss man die Template Datei auch reload machen wenn man sie mit nano geändert hat? Scheinbar ... aber wie geht das?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 03 Juni 2020, 18:25:50
{ AttrTemplate_Initialize() }

immer, weißt du doch.

Klar funzt das Template, bin mir aber nicht sicher ob da alle drei Topics in dem Gerät landen sollen oder jedes Topic in ein Gerät, darum hab ich in der obigen Definition nur den Rincon-Pfad drin, das gefällt mir erstmal besser.

Und ? ändert sich bei dir ein Reading auf true wenn du (die sL natürlich zuvor um den Befehl ergänzt) ein mute on ausführst ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 03 Juni 2020, 18:45:27
Und genau in die Richtung  (https://forum.fhem.de/index.php/topic,98925.msg922836.html#msg922836) geht unsere zukünftige Lösung mit dem speak Befehl, sagt mir mein Bauchgefühl, weil ich von der Materie keine Ahnung habe.

Beim echodevice-Modul gibts die tts-Lösung ja auch, das hab ich mir damals auch mal kurzzeitig angetan, mit Null Ahnung, was ich mich Frage ist, ssml nutzen wir auch mit dem Modul dazu war der ganze Kram mit Mini-Server nicht nötig und ssml erzeugt auch ne mp3 wenn man will.

Kann man diese Verbindung zu echodevice eventuell irgendwie nutzen ? angemeldet ist man ja schon.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 03 Juni 2020, 18:58:21
Jetzt machen wir mal was ganz lustiges Otto.. ;)
Wir fangen gleich mit einem neuen Objekt an, welches wir zuordnen und eingliedern dürfen.

Der Entwickler hat sich etwas ganz schönes einfallen lassen....

Mit den aktuellen Templates bist du ja nun vertraut. Bitte stoppe den Dienst bzw. den Prozess des Servers. Neue Parameter: node wo auch immer bei dir index.js --distinct --mqtt mqtt://"NUTZER":"PASSWORT"@IP:PORT

Ach ja und lass autocreate an.

Danach bekommst du sowas:
Internals:
   CFGFN     
   CID        mqttjs_9749c474
   DEF        mqttjs_9749c474
   DEVICETOPIC MQTT2_mqttjs_9749c474
   FUUID      5ed7cbf9-f33f-fcb4-264f-c8bca8f18011b7b2
   IODev      sonosmqtt
   LASTInputDev sonosmqtt
   MSGCNT     2
   NAME       MQTT2_mqttjs_9749c474
   NR         858
   STATE      STOPPED
   TYPE       MQTT2_DEVICE
   sonosmqtt_MSGCNT 2
   sonosmqtt_TIME 2020-06-03 18:14:45
   READINGS:
     2020-06-03 18:12:47   AVTransportURI  x-sonosapi-stream:s306651?sid=254&flags=8224&sn=0
     2020-06-03 18:12:47   AVTransportURIMetaData_ItemId -1
     2020-06-03 18:12:47   AVTransportURIMetaData_ParentId -1
     2020-06-03 18:12:47   AVTransportURIMetaData_Title DJ Mag Germany Radio by iloveradio.de
     2020-06-03 18:12:47   AVTransportURIMetaData_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-03 18:12:47   AlarmRunning    false
     2020-06-03 18:12:47   Album           Sweet Dreams
     2020-06-03 18:12:47   AlbumArtUri     http://192.168.20.70:1400/getaa?s=1&u=x-sonos-spotify:spotify:track:7tNAeLkrsnOqKXWTmd8cQp%3fsid%3d9%26flags%3d8224%26sn%3d3
     2020-06-03 18:12:47   Artist          F4ST
     2020-06-03 18:12:44   Bass            0
     2020-06-03 18:12:47   CurrentCrossfadeMode false
     2020-06-03 18:12:47   CurrentMediaDuration NOT_IMPLEMENTED
     2020-06-03 18:12:47   CurrentPlayMode NORMAL
     2020-06-03 18:12:47   CurrentRecordQualityMode NOT_IMPLEMENTED
     2020-06-03 18:12:47   CurrentSection  0
     2020-06-03 18:12:47   CurrentTrack    1
     2020-06-03 18:12:47   CurrentTrackDuration 0:00:00
     2020-06-03 18:12:47   CurrentTrackMetaData_AlbumArtUri http://192.168.20.71:1400/getaa?s=1&u=x-sonosapi-stream:s306651%3fsid%3d254%26flags%3d8224%26sn%3d0
     2020-06-03 18:12:47   CurrentTrackMetaData_ItemId -1
     2020-06-03 18:12:47   CurrentTrackMetaData_ParentId -1
     2020-06-03 18:12:47   CurrentTrackMetaData_ProtocolInfo sonos.com-http:*:application/octet-stream:*
     2020-06-03 18:12:47   CurrentTrackMetaData_Title DJ Mag Germany Radio by iloveradio.de
     2020-06-03 18:12:47   CurrentTrackMetaData_TrackUri x-sonosapi-stream:s306651?sid=254&flags=8224&sn=0
     2020-06-03 18:12:47   CurrentTrackMetaData_UpnpClass object.item
     2020-06-03 18:12:47   CurrentTrackURI x-sonosapi-stream:s306651?sid=254&flags=8224&sn=0
     2020-06-03 18:12:47   CurrentTransportActions Set, Stop, Play
     2020-06-03 18:12:47   DirectControlIsSuspended false
     2020-06-03 18:12:47   Duration        0:02:08
     2020-06-03 18:12:47   EnqueuedTransportURI x-sonosapi-stream:s306651?sid=254&flags=8224&sn=0
     2020-06-03 18:12:47   EnqueuedTransportURIMetaData_ItemId -1
     2020-06-03 18:12:47   EnqueuedTransportURIMetaData_ParentId -1
     2020-06-03 18:12:47   EnqueuedTransportURIMetaData_Title DJ Mag Germany Radio by iloveradio.de
     2020-06-03 18:12:47   EnqueuedTransportURIMetaData_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-03 18:12:44   HeadphoneConnected false
     2020-06-03 18:12:47   ItemId          -1
     2020-06-03 18:12:44   Loudness        true
     2020-06-03 18:12:44   Mute_LF         false
     2020-06-03 18:12:44   Mute_Master     false
     2020-06-03 18:12:44   Mute_RF         false
     2020-06-03 18:12:47   NumberOfTracks  1
     2020-06-03 18:12:44   OutputFixed     false
     2020-06-03 18:12:47   ParentId        -1
     2020-06-03 18:12:47   PlaybackStorageMedium NETWORK
     2020-06-03 18:12:47   PossiblePlaybackStorageMedia NONE, NETWORK
     2020-06-03 18:12:47   PossibleRecordQualityModes NOT_IMPLEMENTED
     2020-06-03 18:12:47   PossibleRecordStorageMedia NOT_IMPLEMENTED
     2020-06-03 18:12:44   PresetNameList  FactoryDefaults
     2020-06-03 18:12:47   ProtocolInfo    sonos.com-spotify:*:audio/x-spotify:*
     2020-06-03 18:12:47   RecordMediumWriteStatus NOT_IMPLEMENTED
     2020-06-03 18:12:47   RecordStorageMedium NOT_IMPLEMENTED
     2020-06-03 18:12:47   RestartPending  false
     2020-06-03 18:12:47   SleepTimerGeneration 0
     2020-06-03 18:12:47   SnoozeRunning   false
     2020-06-03 18:12:44   SpeakerSize     5
     2020-06-03 18:12:44   SubCrossover    0
     2020-06-03 18:12:44   SubEnabled      true
     2020-06-03 18:12:44   SubGain         0
     2020-06-03 18:12:44   SubPolarity     0
     2020-06-03 18:12:47   Title           Sweet Dreams
     2020-06-03 18:12:47   TrackUri        x-sonos-spotify:spotify:track:7tNAeLkrsnOqKXWTmd8cQp?sid=9&flags=8224&sn=3
     2020-06-03 18:12:47   TransportPlaySpeed NOT_IMPLEMENTED
     2020-06-03 18:12:47   TransportState  STOPPED
     2020-06-03 18:12:47   TransportStatus OK
     2020-06-03 18:12:44   Treble          0
     2020-06-03 18:12:47   UpnpClass       object.item.audioItem.musicTrack
     2020-06-03 18:12:44   Volume_LF       100
     2020-06-03 18:12:44   Volume_Master   49
     2020-06-03 18:12:44   Volume_RF       100
     2020-06-03 18:14:45   connected       0
     2020-06-03 18:12:47   state           STOPPED
     2020-06-03 18:12:47   trackUri        x-sonos-spotify:spotify%3atrack%3a7tNAeLkrsnOqKXWTmd8cQp?sid=9&flags=8224&sn=3
     2020-06-03 18:12:45   volume          15
Attributes:
   IODev      sonosmqtt
   readingList mqttjs_9749c474:sonos/connected:.* connected
mqttjs_9749c474:sonos/status/wohnzimmer/volume:.* volume
mqttjs_9749c474:sonos/status/k\xc3\xbcche/renderingcontrol:.* { json2nameValue($EVENT) }
mqttjs_9749c474:sonos/status/k\xc3\xbcche/volume:.* volume
mqttjs_9749c474:sonos/status/badezimmer/state:.* state
mqttjs_9749c474:sonos/status/badezimmer/trackUri:.* trackUri
mqttjs_9749c474:sonos/status/badezimmer/track:.* { json2nameValue($EVENT) }
mqttjs_9749c474:sonos/status/badezimmer/volume:.* volume
mqttjs_9749c474:sonos/status/k\xc3\xbcche/avtransport:.* { json2nameValue($EVENT) }
mqttjs_9749c474:sonos/status/k\xc3\xbcche/state:.* state
mqttjs_9749c474:sonos/status/k\xc3\xbcche/trackUri:.* trackUri
mqttjs_9749c474:sonos/status/k\xc3\xbcche/track:.* { json2nameValue($EVENT) }
mqttjs_9749c474:sonos/status/wohnzimmer/state:.* state
mqttjs_9749c474:sonos/status/wohnzimmer/trackUri:.* trackUri
mqttjs_9749c474:sonos/status/wohnzimmer/track:.* { json2nameValue($EVENT) }
   room       MQTT2_DEVICE

Das sind nun wirkliche Stati Anzeigen. Ich glaube wir müssen/haben mit dem Ergebnis:
A) Nochmal schauen ob wir eine sinnige Zuordnung der Readings hin bekommen.
B) das Ziel von mute false/true nicht erreicht. Bei mir kann ich dem Gerät keine Statusänderung entlocken.
C) schonmal saubere volume
D) Ich hab jetzt nur schnell testen können aber es geht noch ein wenig mehr.

https://www.npmjs.com/package/sonos2mqtt#distinct-messages    Einfach mal die paar Zeilen runter lesen...




@TomLee
Bitte erleutere deine Frage zu speak genauer.... Ich glaube Ahnung zu haben aber verstehe nicht was du sagen möchtest. Speak an sich wird gehen...wie, weiß ich noch nicht. Allerdings hat man im Sonos Modul z.B. einfach einen Pfad mit den Dateien und diese werden auch automatisch erzeugt. Deine Frage verstehe ich aber leider nicht.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 03 Juni 2020, 19:27:08
Und wo ist jetzt das reading zu mute on/off? sehe sie erst mal nicht, das hab ich vorhin nachdem du geschrieben hattest du kommst gleich nach Hause  ausprobiert !


defmod MQTT2_SONOS_SPEAKER_WOHNZIMMER MQTT2_DEVICE RINCON_000E58F7F67C01400
attr MQTT2_SONOS_SPEAKER_WOHNZIMMER IODev MQTT2_Server
attr MQTT2_SONOS_SPEAKER_WOHNZIMMER jsonMap volume_Master:volume mute_Master:mute
attr MQTT2_SONOS_SPEAKER_WOHNZIMMER readingList sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }\
sonos/status/RINCON_000E58F7F67C01400 { json2nameValue($EVENT,'',$JSONMAP) }
attr MQTT2_SONOS_SPEAKER_WOHNZIMMER room MQTT2_DEVICE
attr MQTT2_SONOS_SPEAKER_WOHNZIMMER setList mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }

setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER mute
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 coordinatorUuid RINCON_000E58F7F67C01400
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 currentTrack_Album Weihnachts CD
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 currentTrack_AlbumArtUri http://192.168.188.38:1400/getaa?s=1&u=x-sonos-http:library%2ftracks%2f35754a47-37ea-4c09-b522-8c3af89953fe%2f.mp3%3fsid%3d201%26flags%3d0%26sn%3d5
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 currentTrack_Artist Prinzessin
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 currentTrack_Duration 1:12:28
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 currentTrack_ItemId -1
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 currentTrack_ParentId -1
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 currentTrack_ProtocolInfo sonos.com-http:*:audio/mpeg:*
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 currentTrack_Title PrinzessinLillifeeunddaskleineEinhornDasOriginal-HörspielzumKinofilm_ep7_HhMVFs_dp65-zrBUJZhrIkDdS9
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 currentTrack_TrackUri x-sonos-http:library/tracks/35754a47-37ea-4c09-b522-8c3af89953fe/.mp3?sid=201&flags=0&sn=5
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 currentTrack_UpnpClass object.item.audioItem.musicTrack
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 16:01:33 enqueuedMetadata_Album Reggae Gold 1997
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 16:01:33 enqueuedMetadata_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-file-cifs:%2f%2f192.168.188.26%2fOwnMusic%2fTony%20Rebel%2fIf%20Jah.mp3&v=81
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 16:01:33 enqueuedMetadata_Artist Tony Rebel
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 17:20:58 enqueuedMetadata_ItemId
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 17:20:58 enqueuedMetadata_ParentId
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 17:20:58 enqueuedMetadata_Title
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 17:20:58 enqueuedMetadata_UpnpClass object.item.audioItem.musicTrack
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 groupName Wohnzimmer
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 mute false
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 mute_LF false
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 mute_RF false
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 name Wohnzimmer
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 nextTrack_Album Rasta Philosophy
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 nextTrack_AlbumArtUri http://192.168.188.38:1400/getaa?s=1&u=x-sonos-http:library%2ftracks%2f92c25731-b9a2-4bcf-a119-f78a9b2b965a%2f.mp3%3fsid%3d201%26flags%3d0%26sn%3d5
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 nextTrack_Artist Iqulah
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 nextTrack_Duration 0:05:06
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 nextTrack_ItemId -1
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 nextTrack_ParentId -1
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 nextTrack_ProtocolInfo sonos.com-http:*:audio/mpeg:*
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 nextTrack_Title Rasta Magic
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 nextTrack_TrackUri x-sonos-http:library/tracks/92c25731-b9a2-4bcf-a119-f78a9b2b965a/.mp3?sid=201&flags=0&sn=5
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 nextTrack_UpnpClass object.item.audioItem.musicTrack
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 playmode NORMAL
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 18:11:15 state mute
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 transportState PLAYING
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 ts 1591204444853
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 uuid RINCON_000E58F7F67C01400
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 volume 10
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 volume_LF 100
setstate MQTT2_SONOS_SPEAKER_WOHNZIMMER 2020-06-03 19:14:05 volume_RF 100



Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 03 Juni 2020, 19:29:54
Du hattest aber gelesen was ich bei
ZitatB) das Ziel von mute false/true nicht erreicht. Bei mir kann ich dem Gerät keine Statusänderung entlocken.
geschrieben habe?

Ich wollte jetzt mal die Advanced func testen. Ggf. geht es damit.


Ganz ehrlich das muss ein BUG sein. Die Werte, werden immer mit false gesendet. Also ich habe in der Sache, heute Mittag gedacht was gefunden zu haben. Aber das war ein verrutscher. Die Test Box neben mir, um auch zu hören ob das alles wirklich klappt, hat loudnes an. Das steht genau da drüber. Aber ich habe vorhin die komplette Bridge auseinander genommen und mir alles einzeln senden lassen. Ich bin fast verrückt geworden. Egal wie...die Werte kommen falsch.
Trotz allem ist das "neue" Device eine Sache die wir nutzen sollten.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 03 Juni 2020, 19:41:07
Ich habe etwas getestet, sowas hier funktioniert:
set sonosmqtt publish sonos/RINCON_347E5C82560801400/control {  "command": "adv-command", "input": { "cmd": "AVTransportService.Pause", "val": { "InstanceID": 0}}}
set sonosmqtt publish sonos/RINCON_347E5C82560801400/control {"command": "adv-command","input": {"cmd": "RenderingControlService.SetVolume","val": {"InstanceID": 0,"Channel": "Master","DesiredVolume": 20}}}
set sonosmqtt publish sonos/RINCON_347E5C82560801400/control {  "command": "joingroup",  "input": "BadWanne"}
set sonosmqtt publish sonos/RINCON_347E5C82560801400/control {  "command": "leavegroup",  "input": "BadWanne"}

set sonosmqtt publish sonos/RINCON_347E5C82560801400/control {  "command": "joingroup",  "input": "BadWanne"}
sleep 5;set sonosmqtt publish sonos/RINCON_347E5C82560801400/control {  "command": "leavegroup",  "input": "BadWanne"}
sleep 10;set sonosmqtt publish sonos/RINCON_347E5C82560801400/control {  "command": "play"}

Bei mute ändert sich leider nix.
Was ich versucht habe ist Radio oder so zu starten, das habe ich nicht hinbekommen. Die URI ist offenbar anders als im Reading angegeben.

Ich verstehe die letzte Übung noch nicht ganz  :-[
Edit: Ok neuer Parameter und damit neues Device. Das ist sowas wie minimal Readings?

Ah ok: Zum radio starten muss/kann man die Kurze TrackUri nehmen:
set sonosmqtt publish sonos/RINCON_347E5C82560801400/control {  "command": "setavtransporturi",  "input": "x-sonosapi-stream:s6628?sid=254&flags=8224&sn=0"}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 03 Juni 2020, 19:51:31
 >:(

Sry, zwei Fehler hatte ich gemacht  ::) ein .* unterschlagen und nicht richtig gelesen, name_of_speaker und nicht die uuid_of_speaker, trotzdem kamen Readings dazu mein ich, das muss ich mir aber später anschauen was genau jetzt rauskommt.

sonos/status/RINCON_000E58F7F67C01400 { json2nameValue($EVENT,'',$JSONMAP) }
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 03 Juni 2020, 20:17:09
ZitatIch verstehe die letzte Übung noch nicht ganz  :-[
Das war mehr ein gedanklicher Absturz meinerseits. Da dies für mich bedeutet, nochmal zu gucken was man nun nimmt. In dem letzteren sind meiner Meinung nach die sinnvollsten Readings.
Ich glaube ich bin heute aber mal früher rauß. Ich brauch mal ein paar Minuten leben :)

@TomLee: Ich bin mir zu 99% sicher das du das bei issues melden muss. Das wird nicht an FHEM liegen.

@Beta-User: Ist die Bridge so nicht etwas schöner?
Internals:
   CID        mqttjs_73ae6b29
   DEF        mqttjs_73ae6b29
   DEVICETOPIC MQTT_sonos_bridge
   FUUID      5ed667cd-f33f-fcb4-5f6d-7bea3adb84022d9c
   IODev      sonosmqtt
   LASTInputDev sonosmqtt
   MSGCNT     20
   NAME       MQTT_sonos_bridge
   NR         447
   STATE      restart
   TYPE       MQTT2_DEVICE
   sonosmqtt_MSGCNT 20
   sonosmqtt_TIME 2020-06-03 20:18:37
   OLDREADINGS:
   READINGS:
     2020-06-03 20:11:35   config_RINCON_5CAAFD79D52801400 {"available_commands":["adv-command","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_5CAAFD79D52801400/control","device":{"identifiers":["RINCON_5CAAFD79D52801400"],"manufacturer":"Sonos","name":"Badezimmer"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_5CAAFD79D52801400","name":"Badezimmer","state_topic":"sonos/RINCON_5CAAFD79D52801400","unique_id":"sonos2mqtt_RINCON_5CAAFD79D52801400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-06-03 20:11:35   config_RINCON_7828CAF427B201400 {"available_commands":["adv-command","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_7828CAF427B201400/control","device":{"identifiers":["RINCON_7828CAF427B201400"],"manufacturer":"Sonos","name":"Wohnzimmer"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_7828CAF427B201400","name":"Wohnzimmer","state_topic":"sonos/RINCON_7828CAF427B201400","unique_id":"sonos2mqtt_RINCON_7828CAF427B201400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-06-03 20:11:35   config_RINCON_7828CAF4289001400 {"available_commands":["adv-command","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_7828CAF4289001400/control","device":{"identifiers":["RINCON_7828CAF4289001400"],"manufacturer":"Sonos","name":"Küche"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_7828CAF4289001400","name":"Küche","state_topic":"sonos/RINCON_7828CAF4289001400","unique_id":"sonos2mqtt_RINCON_7828CAF4289001400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-06-03 20:18:37   connected       0
Attributes:
   IODev      sonosmqtt
   bridgeRegexp mqttjs_73ae6b29/(RINCON_[A-Za-z0-9._]*)[/]?.*:.* "$1"
mqttjs_73ae6b29/sonos/status/badezimmer/.*:.* "$1"
   devStateIcon { my $amp = ReadingsVal($name,"connected","0") eq "0" ? "rot" : ReadingsVal($name,"connected","0") eq "1" ? "gelb" : "gruen";;
my $stateinfo = ReadingsVal($name,"connected","0") eq "0" ? "sonos2MQTT Dienst ist aus" : ReadingsVal($name,"connected","0") eq "1" ? "sonos2MQTT findet kein SONOS Gerät" : "sonos2MQTT läuft!";;
my $show = "".FW_makeImage("10px-kreis-".$amp)."";;
"
$show $stateinfo
" }
   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:.* {}
   room       MQTT2_DEVICE
   setList    restart:noArg {system ("sudo -u root /opt/fhem/FHEM/restart.sh &")}
start:noArg {system ("sudo -u root /opt/fhem/FHEM/start.sh &")}
stop:noArg {system ("sudo -u root /opt/fhem/FHEM/stop.sh &")}


-devstateicon
-setlist ggf?
-stateformat wolltest lieber aber macht das wirklich einen Unterschied? Besser direkt so als man baut es in 3 Wochen wieder um.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 03 Juni 2020, 20:43:27
Was auch geht: vorhandene mp3 spielen:
set sonosmqtt publish sonos/RINCON_347E5C82560801400/control {  "command": "setavtransporturi",  "input": "x-file-cifs://192.168.56.83/SonosSpeak/RINCON_000E586BE2A201400_MR_Speak_46997c34b47c65d08088f6e6f011de47b09bea29.mp3"}
Das wäre ein Ansatz, die Ansagen vom TEXT2SPEECH Modul erzeugen lassen und dann über Sonos ausgeben. Das T2S hatte einen "Server Modus"
Jetzt hat man Steuerung stop play volume mute
Gruppierung
URI starten (radio oder Datei)

Eingänge umschalten fehlt mir noch. Da ist offenbar einfach der x-sonos-htastream nicht implementiert und ich bin zu doof das über adv-command zu machen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 03 Juni 2020, 20:48:04
Also ich hab durchaus mehr und es dürfen bitte und gerne alle mit testen und weiter machen... :)

https://forum.fhem.de/index.php/topic,111711.msg1060092.html#msg1060092

Mute usw geht ja auch nur eben das Reading kommt falsch. Volume könnte zb mit dem weiterem Parameter beim starten des Dienstes so übernommen werden. Es gibt leider zu wenig Details zu --distinct
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 03 Juni 2020, 21:36:29
Ich wollte damit sagen: Die habe ich getestet. :)

Und man braucht eventuell eine Abfrage von Sonos. Also "liefere mir die Favoriten" oder so. Alles was ich da mit get abrufen kann landet irgendwie im Nirwana.

Im sonos-command-mapping.js habe ich mMn einen Fehler gefunden (bez. switchtotv) aber wenn ich den behebe - wie es logisch aussieht - bessert sich nichts :(
Schluß jetzt :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 03 Juni 2020, 22:41:50
Zitat von: 87insane am 03 Juni 2020, 20:17:09
@Beta-User: Ist die Bridge so nicht etwas schöner?
-devstateicon
-setlist ggf?
-stateformat wolltest lieber aber macht das wirklich einen Unterschied? Besser direkt so als man baut es in 3 Wochen wieder um.
- devStateIcon bitte möglichst indirekt via stateFormat. Ich kämpfe grade mit seltsamen Effekten am tasmota_POW...
- Mit sh commands tue ich mich schwer. Da muß das Umfeld passen, und ich will niemandem erklären, wie man einem untergeordneten Dienst-user wie fhem Admin-Rechte verschafft. Ist meine Meinung, kann man drüber streiten, aber ich will es nicht. (Basta!)

Zitat von: Otto123 am 03 Juni 2020, 18:10:03Ich habe einfach alles was ich bisher an MQTT2_Devices hatte gelöscht.
[..]
Grundsätzlich sollte es reichen, nach dem Löschen "irgendwas" zu machen, es müßte reichen, die Lautstärke (an der Hardware direkt, z.B.) zu ändern, damit man das "Bridge-Device" per autocreate bekommt. Darauf denn das passende Template, dann wieder Lautstärke  und man sollte den Speaker automatisch bekommen. Nix händisch...

Jedenfalls habe ich den Zwischenstand (bzw. das, was ich davon verstanden zu haben glaube) eben mal wieder eingecheckt...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 03 Juni 2020, 22:54:54
Zitatmit seltsamen Effekten am
Kannst du die beschreiben? Habe alles mögliche im Einsatz und gerade bei diesen "komischen" Dingen, kann ich sicher mal ein paar alte Threads rauß ziehen - alle hielten mich für bekloppt! Aber hatte auch alles mit oder ohne Hilfe, irgendwann gefunden.
Es muss kein sh sein. Es könnte ja was besseres aus fhem ebene sein. Du bist selber doch auch kreativ :) Bin ich deinen Weg gegangen und wollte "durch die templates inspirieren", aua aua :-P

ZitatGrundsätzlich sollte es reichen, nach dem Löschen "irgendwas" zu machen, es müßte reichen, die Lautstärke (an der Hardware direkt, z.B.) zu ändern, damit man das "Bridge-Device" per autocreate bekommt. Darauf denn das passende Template, dann wieder Lautstärke  und man sollte den Speaker automatisch bekommen. Nix händisch...
Gerät löschen und einfach die Bridge eben neu starten. Ist am einfachsten...Ist das gleiche wie announce in diesem Moment.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 04 Juni 2020, 11:32:31
Gibts für npm update einen extra Parameter, das man mit sudo npm update -g sonos2mqtt auch die Pre-Release Version bekommt oder geht das nicht ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 04 Juni 2020, 11:37:30
ZitatGerät löschen und einfach die Bridge eben neu starten. Ist am einfachsten...Ist das gleiche wie announce in diesem Moment.
Das kann man machen, wenn man meint, alle Readings haben zu müssen, bevor man das attrTemplate anwendet.

Zur allg. Info aber noch ein paar Anmerkungen dazu:
Wenn man eine bridgeRegexp hinzufügt oder ändert, wird readingList gelöscht (hatten wir schon) und auch alle Readings. Ergo ist das Device eh "kaputt". Was man für das attrTemplate hier braucht, ist das "sonos", wie Otto ja schon ausgeführt hatte. Entweder man nutzt das Dialogfeld, oder man hat halt "irgendeinen" readingList-Eintrag, aus dem das extrahiert werden kann. Dafür sollte ein simples "lauter" oder "leiser" genügen, man braucht nicht "die große Wumme"...
Erst wenn das erste (Bridge-) Device "fertig" ist, macht es ggf. Sinn, den Dienst neu zu starten, weil man eventuell dann erst wieder alle Infos dazu gepublisht werden. Wer's braucht und nicht warten will, weiß also jetzt, wann es wirklich Sinn macht irgendwas neu zu starten... (Je nach der Funktionalität des Client (=sonos2mqtt) reicht es auch, den MQTT-Server (=FHEM) eine Zeitlang auszuschalten, aber wer will das schon?).

Zitat von: 87insane am 03 Juni 2020, 22:54:54
Kannst du die beschreiben?
Ist hier OT, bitte ggf. in diesen Thread einsteigen:
https://forum.fhem.de/index.php/topic,111576.0.html
Auch das hier scheint damit zusammenzuhängen, das devStateIcon bzw. das Symbol wird nicht angezeigt:
https://forum.fhem.de/index.php/topic,111779.msg1060238.html#msg1060238

Zitat
Es muss kein sh sein. Es könnte ja was besseres aus fhem ebene sein. Du bist selber doch auch kreativ :) Bin ich deinen Weg gegangen und wollte "durch die templates inspirieren", aua aua :-P
Nochmal: Admin-Tasks gehören nach meiner persönlichen Überzeugung nicht in den Rechtebereich des users fhem. Ende der Überlegung und Kreativität. Wenn der Dienst sich via MQTT-Command neu starten läßt (wie shelly/Tasmota), von mir aus; das ist aber von der Berechtigungs-Seite her was anderes!
Wenn du das anders siehst, ist das ok, und auch manche Entwickler bieten ja Module an, z.B. OS-updates über FHEM anzuschucken. Aber ich halte das für pinzipiell falsch und werde diese Art von Option nicht in Code einbauen, den ich zu verantworten habe.
Das war mit "Basta!" gemeint.
(Im Übrigen ist es so, dass hoffentlich auch gar kein Bedarf für Neustarts besteht und wenn, man sich an den Entwickler wendet, damit der das Problem beseitigt und wir nicht erklären müssen, wie man Symptombekämpfung betreibt...!)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 04 Juni 2020, 11:46:17
Jo ich schaue mal was man noch so machen kann. Aber hat noch keine Premisse.
Hab gesehen das du beim Entwickler 2 Updates erreichen konntest. Gut gut! Hattest du auch auf das Reading mute hingewiesen?
Sehe gerade er hatte auf meine Mail reagiert. Geil.

Sogar schon drin...
https://www.npmjs.com/package/sonos2mqtt/v/3.0.6-beta.2

https://github.com/svrooij/sonos2mqtt/issues
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 04 Juni 2020, 12:01:35
Zitat von: TomLee am 04 Juni 2020, 11:32:31
Gibts für npm update einen extra Parameter, das man mit sudo npm update -g sonos2mqtt auch die Pre-Release Version bekommt oder geht das nicht ?
Wie auf der Webseite steht npm i sonos2mqtt@3.0.6-beta.2Das installiert die Version in den Pfad wo Du stehst -> ./node_modules/

Eigentlich braucht man das alles nicht global, d.h. man sucht sich eine Pfad seiner Wahl und installiert das dorthin. Du kannst auch mehrere Versionen parallel haben.
Also es braucht auch kein sudo.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 04 Juni 2020, 12:07:45
Hat schon einer schauen können ob die Änderungen drin sind? Er hat sogar im issue den Link aus der Mail übernommen.^^
Das nenne ich mal kooperativ und schnell. Mail ging Dienstag rauß.

Man kann es nun so aussehen lassen:
sonos2mqtt:fhem/music_player/RINCON_7828CAF427B201400/sonos/config:.* { json2nameValue($EVENT) }
sonos2mqtt:fhem/music_player/RINCON_7828CAF4289001400/sonos/config:.* { json2nameValue($EVENT) }


node /usr/local/lib/node_modules/sonos2mqtt/lib/index.js --clientid sonos2mqtt --discoveryprefix fhem --mqtt mqtt://"BENUTZER":"PW"@IP:PORT
--client ID ist nun in der Beta neu und erzeugt sonst mqttjsxxxxxx - zum testen hier sonos2mqtt (was macht hier für euch am meisten Sinn?)
--discoveryprefix ist alt aber sonst stünde da homeassistant... Also dann lieber FHEM :) :-P
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 04 Juni 2020, 12:28:56
schaut so aus. Teste aber gerade was anderes :(


ich habe mal noch gleich bei github einen issue wegen mute und dem switchtotv aufgemacht. Mal sehen :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 04 Juni 2020, 12:55:17
Zitat von: 87insane am 04 Juni 2020, 12:07:45
Man kann es nun so aussehen lassen:
sonos2mqtt:fhem/music_player/RINCON_7828CAF427B201400/sonos/config:.* { json2nameValue($EVENT) }
sonos2mqtt:fhem/music_player/RINCON_7828CAF4289001400/sonos/config:.* { json2nameValue($EVENT) }


node /usr/local/lib/node_modules/sonos2mqtt/lib/index.js --clientid sonos2mqtt --discoveryprefix fhem --mqtt mqtt://"BENUTZER":"PW"@IP:PORT
--client ID ist nun in der Beta neu und erzeugt sonst mqttjsxxxxxx - zum testen hier sonos2mqtt (was macht hier für euch am meisten Sinn?)
--discoveryprefix ist alt aber sonst stünde da homeassistant... Also dann lieber FHEM :) :-P
Die Client ID ist im Prinzip beliebig, und sobald die Bridge "steht", ist es auch irrelevant, jedenfalls solange keiner neue Topic-Strukturelemente erzeugt...

Zu dem Discovery-shit nochmal in aller Deutlichkeit: ABSCHALTEN! Wenn, dann auf homeassistant lassen und den Mist auf IO-Ebene zur Nichtauswertung vorsehen. Das, was darüber kommt, bringt uns NICHTS außer Verwirrung! (Zu meinem eigenen Verständnis: gibt es an der Sachaussage irgendwelche Zweifel? Übersehe ich was wesentliches?!?)

Grundsätzlich zu den Änderungen bei den Topics noch:
Man kann attrTemplate "zur einfachen Verwendung" nur gestalten, wenn man irgendwas hat, an dem man sich "immer" ortientieren kann. Zu viel Freiheiten in der Topic-Gestaltung sind daher zweischneidig, wir brauchen "irgendwas" "irgendwo" (am besten in der readingList), das man nach eindeutigen Maßstäben auswerten kann und das es dann erlaubt, auch den Rest damit zusammenzubauen. Das scheint hier das "RINCON_[A-F0-9]+" zu sein. Bitte dann aber bei der Auswertung für die Parameter an Tasmota orientieren, da kann auch "tele" (&Co) irgendwo stehen.

"sonos" hatte ich jetzt gestern noch in die bridgeRegexp bei MQTT2_CLIENT_general_bridge eingebaut, wenn ihr das jetzt in euren Beispielen zur Disposition stellt, stolpert vermutlich bald der übernächste drüber, der unbedingt mosquitto einsetzen will... (ich schreibe nicht ganz umsonst ins Wiki, dass man möglichst die defaults nur da ändert, wo es einen tieferen Sinn macht ;) .)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 04 Juni 2020, 15:41:57
Hab mir die Readings zu den extra aktivierten --distinct-Messages jetzt genau angeschaut, die werden bei mir wieder deaktiviert.
Jeder einzelne Wert, ohne Ausnahme kommt auch in dem Rincon-Zweig vor.

Das "saubere" volume Reading bekommt man auch mit jsnMap im Rincon-Device.

defmod MQTT2_mqttjs_f5dbb5dd MQTT2_DEVICE mqttjs_f5dbb5dd
attr MQTT2_mqttjs_f5dbb5dd IODev MQTT2_Server
attr MQTT2_mqttjs_f5dbb5dd readingList sonos/status/wohnzimmer/state:.* state\
sonos/status/wohnzimmer/trackUri:.* trackUri\
sonos/status/wohnzimmer/track:.* { json2nameValue($EVENT) }\
sonos/status/wohnzimmer/volume:.* volume
attr MQTT2_mqttjs_f5dbb5dd room MQTT2_DEVICE

setstate MQTT2_mqttjs_f5dbb5dd STOPPED
setstate MQTT2_mqttjs_f5dbb5dd 2020-06-04 15:32:52 Album Batbox
setstate MQTT2_mqttjs_f5dbb5dd 2020-06-04 15:33:03 AlbumArtUri http://192.168.188.38:1400/getaa?u=x-file-cifs:%2f%2f192.168.188.26%2fOwnMusic%2fToene%2fDoorbell.mp3&v=81
setstate MQTT2_mqttjs_f5dbb5dd 2020-06-04 15:32:52 Artist Miss Kittin
setstate MQTT2_mqttjs_f5dbb5dd 2020-06-04 15:33:03 Duration 0:00:08
setstate MQTT2_mqttjs_f5dbb5dd 2020-06-04 15:33:03 ItemId -1
setstate MQTT2_mqttjs_f5dbb5dd 2020-06-04 15:33:03 ParentId -1
setstate MQTT2_mqttjs_f5dbb5dd 2020-06-04 15:33:03 ProtocolInfo x-file-cifs:*:audio/mpeg:*
setstate MQTT2_mqttjs_f5dbb5dd 2020-06-04 15:33:03 Title Doorbell.mp3
setstate MQTT2_mqttjs_f5dbb5dd 2020-06-04 15:33:03 TrackUri x-file-cifs://192.168.188.26/OwnMusic/Toene/Doorbell.mp3
setstate MQTT2_mqttjs_f5dbb5dd 2020-06-04 15:33:03 UpnpClass object.item.audioItem.musicTrack
setstate MQTT2_mqttjs_f5dbb5dd 2020-06-04 15:33:03 state STOPPED
setstate MQTT2_mqttjs_f5dbb5dd 2020-06-04 15:33:02 trackUri x-file-cifs://192.168.188.26/OwnMusic/Toene/Doorbell.mp3
setstate MQTT2_mqttjs_f5dbb5dd 2020-06-04 15:31:39 volume 3


defmod MQTT2_RINCON_000E58F7F67C01400 MQTT2_DEVICE RINCON_000E58F7F67C01400
attr MQTT2_RINCON_000E58F7F67C01400 IODev MQTT2_Server
attr MQTT2_RINCON_000E58F7F67C01400 icon audio_volume_low
attr MQTT2_RINCON_000E58F7F67C01400 jsonMap volume_Master:volume mute_Master:mute
attr MQTT2_RINCON_000E58F7F67C01400 model sonos2mqtt_speaker
attr MQTT2_RINCON_000E58F7F67C01400 readingList sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr MQTT2_RINCON_000E58F7F67C01400 room MQTT2_DEVICE
attr MQTT2_RINCON_000E58F7F67C01400 setList stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }\
  play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
  pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
  volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
  mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";;;; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
  next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
  previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }

setstate MQTT2_RINCON_000E58F7F67C01400 mute
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 coordinatorUuid RINCON_000E58F7F67C01400
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 currentTrack_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-file-cifs:%2f%2f192.168.188.26%2fOwnMusic%2fToene%2fDoorbell.mp3&v=81
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 currentTrack_Duration 0:00:08
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 currentTrack_ItemId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 currentTrack_ParentId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 currentTrack_ProtocolInfo x-file-cifs:*:audio/mpeg:*
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 currentTrack_Title Doorbell.mp3
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 currentTrack_TrackUri x-file-cifs://192.168.188.26/OwnMusic/Toene/Doorbell.mp3
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 currentTrack_UpnpClass object.item.audioItem.musicTrack
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 enqueuedMetadata_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-file-cifs:%2f%2f192.168.188.26%2fOwnMusic%2fToene%2fDoorbell.mp3&v=81
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 enqueuedMetadata_ItemId S://192.168.188.26/OwnMusic/Toene/Doorbell.mp3
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 enqueuedMetadata_ParentId A:TRACKS
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 enqueuedMetadata_Title Doorbell.mp3
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 enqueuedMetadata_UpnpClass object.item.audioItem.musicTrack
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 groupName Wohnzimmer
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 mute false
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 mute_LF false
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 mute_RF false
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 name Wohnzimmer
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 nextTrack_Duration 0:01:04
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 nextTrack_ItemId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 nextTrack_ParentId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 nextTrack_ProtocolInfo x-file-cifs:*:audio/mpeg:*
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 nextTrack_Title 00 - soundTrack.mp3
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 nextTrack_TrackUri x-file-cifs://192.168.188.26/OwnMusic/Unknown Artist/00 - soundTrack.mp3
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 nextTrack_UpnpClass object.item.audioItem.musicTrack
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 playmode NORMAL
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 state mute
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 transportState PAUSED_PLAYBACK
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 ts 1591277933199
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 15:38:53 uuid RINCON_000E58F7F67C01400


Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 04 Juni 2020, 15:58:08
Ich habe mal noch etwas mit dem Template gespielt und ein paar AddOns gemacht. Ich will jetzt Beta-User nicht jeden Tag ein neues Template überhelfen, deswegen hab ich erst mal etwas eigenes  (https://github.com/heinz-otto/scripts/blob/master/fhem/mein.template)gemacht (musste ja mal sein)
Für euch - wer will - zum probieren, das sollte so in der Raw Def gehen: :)
"wget -qO ./FHEM/lib/AttrTemplate/ottos.template https://raw.githubusercontent.com/heinz-otto/scripts/master/fhem/mein.template"
sleep 5;{ AttrTemplate_Initialize() }


Wenn das ne blöde Idee war dann haut mich ;)

@TomLee ich bin bisher auch der Meinung: eigentlich braucht man nur den RINCON Zweig.
ich überlege, ob es nicht Sinn macht so ein "Sonos Umgebung" Device zu machen, wo man die ganzen config Infos schön nach Devices reinordnet.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 04 Juni 2020, 16:07:25
Basierend auf deinem Beispiel mit dem joinGroup:textField-Widget-setter hätt ich ne Frage an Jörg.

Steht im textField immer EVTPART1 oder ist es möglich irgendwie EVTPARTX da raus zu holen? .

Also das man mehrere Parameter in einem Textfeld angeben kann, bspw. Leerzeichen getrennt wie bei Sonos-Modul der speak-Befehl,um sowas in der Art umzusetzen:

{
  "command": "notify",
  "input": {
    "trackUri": "https://cdn.smartersoft-group.com/various/pull-bell-short.mp3",
    "onlyWhenPlaying": false,
    "timeout": 10,
    "volume": 8,
    "delayMs": 700
  }
}


Otto das sleep 5, erscheint mir logisch (zumindest ne Pause), hab ich aber bisher merkwürdigerweise nie gebraucht.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 04 Juni 2020, 16:21:12
@Otto: paßt schon!

Irgendwie ist der MQTT-Verkehr in großen Teilen an mir vorbeigegangen, aber ich habe weiter den Verdacht, dass "immer alles" gesendet wird. Würde daher mal folgendes vorschlagen:
BASE_TOPIC/DEV_ID:.* { my $rets = json2nameValue($EVENT,'',$JSONMAP);; my %cleaned = map { $_,$rets->{$_} } grep { ReadingsVal($NAME,$_,"unknown") ne $rets->{$_} } keys %{$rets};; return \%cleaned }

Und dann eben noch das jsonMap näher ansehen, in die Richtung, die TomLee vorgeschlagen hat.

Zitat von: TomLee am 04 Juni 2020, 16:07:25
Steht im textField immer EVTPART1 oder ist es möglich irgendwie EVTPARTX da raus zu holen? .
Ähm, also: $EVENT ist hier der setter und das, was in das Textfeld eingegeben wurde. Also ist $EVTPART0 der setter, $EVTPART1 das erste Wort (Leerzeichen-getrennt) usw.. Wenn du also eine Sprachausgabe haben willst mit mehreren Worten, könnte das schwierig werden, da ich davon ausgehe, dass die Ausgabe/der Text selbst in der Regel (eine zuvor noch unbekannte Zahl von) Leerzeichen beinhaltet bzw. das jedenfalls nicht ausgeschlossen ist. Damit kann man spekulieren, ob $EVTPART4 vorhanden ist, die Lautstärke oder die Dauer beinhaltet usw.. Kurz: das ist fehlerträchtig, mit den $EVTPART-Elementen zu arbeiten

Deswegen hatte ich irgendwo hier mal geschrieben, dass man aus $EVENT den setter(+Leerzeichen) via regex-substitute entfernen muß und das irgendwie nachbearbeiten. Um da voranzukommen, würde ich mal in den Quelltext von anderen Modulen schauen, wie die das lösen und ggf. v.a. mal einen Blick auf parseParams werfen. Falls da was umfangreicheres erforderlich ist, kann man das auch in myUtils auslagern und z.B. aus contrib gezielt nachladen, wenn man z.B. die sonos-Bridge "attrTemplatet" (macht z.B. ebus auch so, aktuell Zeile 2543: { Svn_GetFile("contrib/AttrTemplate/99_attrTmqtt2_ebus_Utils.pm", "FHEM/99_attrTmqtt2_ebus_Utils.pm", sub(){ CommandReload(undef, "99_attrTmqtt2_ebus_Utils") }) }).)

(Ansonsten bin ich jetzt erst mal raus, es sei denn, ihr reibt wieder an der Lampe...)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 04 Juni 2020, 16:25:31
Der Spruch ist echt zutreffend. Aber ich hab schon mehr als drei mal dran gerieben :-P

Haben wir denn etwas, was der Programmierer ggf. noch anpassen kann für uns? Wenn ja übernehme ich das gern.
Ich wüsste aktuell nicht wie ich ansonsten helfen kann.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 04 Juni 2020, 16:27:12
Versuch macht kluch:
nachricht:textField sonos/RINCON_347E5C82560801400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}

set xxxx nachricht 30 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3
Dateien vom Server gehen auch, das wäre für mich die Vorstufe zur Sprachausgabe mit vorhandenen Mitteln ohne extra Sprach-Engine:
set player nachricht 15 x-file-cifs://ServerIP/SonosSpeak/Dateiname.mp3

Aber wie Beta-User schon schreibt mit dem Satz zur Ausgabe muss man das an andere Stelle machen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 04 Juni 2020, 16:33:04
Zitat von: TomLee am 04 Juni 2020, 16:07:25
Otto das sleep 5, erscheint mir logisch (zumindest ne Pause), hab ich aber bisher merkwürdigerweise nie gebraucht.
ich wohne hier mit 5Mbit Downloadrate - wenn das die 1 k Datei eine Sekunde zum Nachdenken braucht. Ich werfe ja beide Kommandos in die Raw Def da überholt doch der zweite Befehl den Ersten :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 04 Juni 2020, 16:38:51
Zitat von: 87insane am 04 Juni 2020, 16:25:31
Haben wir denn etwas, was der Programmierer ggf. noch anpassen kann für uns? Wenn ja übernehme ich das gern.
Ich wüsste aktuell nicht wie ich ansonsten helfen kann.

Falls (!) es so ist, dass alle Status-updates immer alle Infos beinhalten, hätte ich einen ersten Wunsch:
- abschalten bzw. abschaltbar, und nur Differenzmeldungen schicken;
- volle Infos nur auf Anforderung (ähnlich der Announce-Anfordung bei shelly, wenn ich das richtig verstanden habe).

Diese (von mir so empfundene) Neigung, Datenschleudern zu bauen, nur weil es mit JSON so easy ist, empfinde ich als echt nervige Unsitte... Jedenfalls habe ich den Sinn dahinter noch nicht verstanden. (Wofür gibt es "last will"?)

Damit wäre ich bei Wunsch 2:
"last will" unterstützen: Damit weiß man, dass die Verbindung steht, und braucht keine weiteren Infos, weil man davon ausgehen kann, dass sich nichts geändert hat und kann ganz bequem mit den reinen Differenzmeldungen (neuer Track, andere Lautstäre...) leben. Und man braucht keine weitere Überwachung, dass "das Ding noch lebt", hat saubere Events, wenn nicht (und kann das tracken, um den Entwickler zu nerven...), alles easy und "works as designed" (@MQTT-Prinzipien).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 04 Juni 2020, 16:40:22
Cool.

Hab ich irgendwas von Sprachausgabe geschrieben ? Im Prinzip gings mir nur darum die Lautstärke beim File abspielen mitzugeben.




War der ../music_player/... Zweig die ganze Zeit da oder kam der jetzt mit dem update ?

fhem/music_player/RINCON_000E58F7F67C01400/sonos/config:.* { json2nameValue($EVENT) }
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 04 Juni 2020, 16:43:10
Zitat- abschalten bzw. abschaltbar, und nur Differenzmeldungen schicken;
- volle Infos nur auf Anforderung (ähnlich der Announce-Anfordung bei shelly, wenn ich das richtig verstanden habe).

Wie ich es verstanden habe und weiter gebe:
- event on change so zu sagen...
- announce wie shelly/tasmota
- LWT Unterstützung
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 04 Juni 2020, 16:43:41
Auch eigentlich unnötig:

defmod MQTT2_mqttjs_bffaf22d MQTT2_DEVICE mqttjs_bffaf22d
attr MQTT2_mqttjs_bffaf22d IODev MQTT2_Server
attr MQTT2_mqttjs_bffaf22d readingList mqttjs_bffaf22d:fhem/music_player/RINCON_000E58F7F67C01400/sonos/config:.* { json2nameValue($EVENT) }
attr MQTT2_mqttjs_bffaf22d room MQTT2_DEVICE

setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 availability_topic sonos/connected
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_1 adv-command
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_10 playmode
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_11 previous
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_12 queue
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_13 seek
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_14 selecttrack
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_15 setavtransporturi
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_16 sleep
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_17 speak
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_18 stop
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_19 switchtoline
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_2 command
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_20 switchtoqueue
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_21 switchtotv
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_22 toggle
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_23 unmute
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_24 volume
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_25 volumedown
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_26 volumeup
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_3 joingroup
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_4 leavegroup
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_5 mute
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_6 next
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_7 notify
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_8 pause
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 available_commands_9 play
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 command_topic sonos/RINCON_000E58F7F67C01400/control
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 device_class speaker
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 device_identifiers_1 RINCON_000E58F7F67C01400
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 device_manufacturer Sonos
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 device_name Wohnzimmer
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 icon mdi:speaker
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 json_attributes true
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 json_attributes_topic sonos/RINCON_000E58F7F67C01400
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 name Wohnzimmer
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 payload_available 2
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 state_topic sonos/RINCON_000E58F7F67C01400
setstate MQTT2_mqttjs_bffaf22d 2020-06-04 16:11:45 unique_id sonos2mqtt_RINCON_000E58F7F67C01400_speaker
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 04 Juni 2020, 16:44:06
Zitat von: TomLee am 04 Juni 2020, 16:40:22
Cool.

Hab ich irgendwas von Sprachausgabe geschrieben ? Im Prinzip gings mir nur darum die Lautstärke beim File abspielen mitzugeben.




War der ../music_player/... Zweig die ganze Zeit da oder kam der jetzt mit dem update ?

fhem/music_player/RINCON_000E58F7F67C01400/sonos/config:.* { json2nameValue($EVENT) }

das ist weil du aus homeasistant = fhem gemacht hast...
Ich glaube die generelle Meinung war alles auf so zu lassen. Ansonsten müsstest du deine Bridge dementsprechend anpassen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 04 Juni 2020, 16:53:57
Ich mein diese available_commands hab ich bisher noch nicht gesehen.

Hab vorher mal einen auf klug gemacht. Ich mein es wird nicht mehr angelegt, ich will aber nochmal die Bestätigung haben das ich es richtig verstanden habe und so die rL der Bridge ergänzt um das für mich "auszuknipsen":

fhem/music_player/[^/]+/sonos/config:.* {}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 04 Juni 2020, 16:56:36
Zitat von: TomLee am 04 Juni 2020, 16:43:41
Auch eigentlich unnötig:
qed: Nicht nur ich empfinde diesen Unsinn (aus FHEM-Sicht) als unnötig...
Zitat von: 87insane am 04 Juni 2020, 16:44:06das ist weil du aus homeasistant = fhem gemacht hast...
Ich glaube die generelle Meinung war alles auf so zu lassen. Ansonsten müsstest du deine Bridge dementsprechend anpassen.
ABSCHALTEN (via yaml) war die richtig Vorgehensweise...
Oder (second-best..) am IO die ignoreRegexp ergänzen.

Ansonsten sollte man die par-Auswertung anpassen, dann klappt das jedenfalls mit dem Rest, den Topic-Aufbau an sich darf man wohl ergänzen, wenn (!) man einen eindeutigen Anhaltspunkt "für alles" ausmachen kann (RINCON_?).

Zitat von: 87insane am 04 Juni 2020, 16:43:10
Wie ich es verstanden habe und weiter gebe:
- event on change so zu sagen...
- announce wie shelly/tasmota
- LWT Unterstützung
Das paßt soweit, wobei: kennt Tasmota announce? (Da machen wir einen reboot, oder...?)

Falls er event-on-change in einem Projekt sehen will: sidoh hat das mit "delta update" hier gut beschrieben: https://github.com/sidoh/esp8266_milight_hub#updates (https://github.com/sidoh/esp8266_milight_hub#updates)

Gut wäre auch, wenn wir irgendwo pro speaker noch eine online/offline-Info hätten (oder habe ich die übersehen?).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 04 Juni 2020, 17:05:58
Zitat von: Beta-User am 04 Juni 2020, 16:56:36
Gut wäre auch, wenn wir irgendwo pro speaker noch eine online/offline-Info hätten (oder habe ich die übersehen?).
Das ist eventuell schwierig. Sonos registriert die Abwesenheit der Player nicht ? - sprich weg ist weg | da ist da :) müsste man extra bauen ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 04 Juni 2020, 17:09:01
Ah, wollts nicht sehen, 87insane hast Recht, daran lags.

Heißt doch dann, das man mit der jetzigen Bridge eigentlich nur noch ein/die RINCON-Device(s) angelegt bekommt, wenn man alles auf default-Werten beim einrichten lässt, richtig ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 04 Juni 2020, 17:12:47
Mail ist rauß...

Naja ich denke online/offline muss möglich sein. Immerhin zählt er in ..connected ja auch die Anzahl der Geräte. Aber das habe ich natürlich noch nicht drin gehabt. Ich warte erstmal bis er antwortet.

Zitatnur noch ein/die RINCON-Device(s) angelegt bekommt
Wenn man es so negativ belastet sagen, will ja :-P / Es sind schlicht weg die aktuell sinnigsten Zweige. Mal sehen was Stephan van Rooij zu unseren Wünschen sagt. Ggf ändert sich ja nochmal was. Solange könnte man aber die normalen Befehle weiter testen.
PS: Die Mute Geschichte schaut er auch nach.

EDIT: Das haben Otto und ich gemeldet. Otto sogar direkt im git. Hoffe die "FHEM-ler" nerven ihn nicht zu sehr :-P
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 04 Juni 2020, 17:18:58
Zitat von: Otto123 am 04 Juni 2020, 17:05:58
Das ist eventuell schwierig. Sonos registriert die Abwesenheit der Player nicht ? - sprich weg ist weg | da ist da :) müsste man extra bauen ?
...ich habe die Hardware (auch diese...) nicht, und kann da also auch nur theoretisch mitsprechen...

Was ich verstanden habe: Der Java-Code kommuniziert mit irgendwas. Bisher hatte ich angenommen, direkt via Netzwerk (HTTP?) mit jedem einzelnen Lautsprecher. Er weiß auch, ob ein Lautsprecher angemeldet ist, müßte also irgendwie "pingen" (z.B.). Wenn das so wäre, könnte er das Ergebnis auch mitteilen.
Scheint aber eine Fehlvorstellung zu sein, es gibt irgendwo ein Zentralgerät, über das alles läuft, das aber nichts weiß (bzw. nichts preisgibt)?

Zitat von: 87insane am 04 Juni 2020, 17:12:47
Naja ich denke online/offline muss möglich sein. Immerhin zählt er in ..connected ja auch die Anzahl der Geräte. Aber das habe ich natürlich noch nicht drin gehabt. Ich warte erstmal bis er antwortet.
(Nein, "connected" war anders belegt: 0=keine Verbindung (wohl zum Zentralgerät?), 1= Dienst läuft und ist verbunden 2= mind. irgendein Lautsprecher ist erreichbar).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 04 Juni 2020, 17:26:36
Sprachausgabe läuft - zumindest im Ansatz :)
defmod myTTS Text2Speech none
attr myTTS TTS_OutputFile /var/SonosSpeak/ansage.mp3
attr myTTS TTS_UseMP3Wrap 1

defmod myTTS_notify_1 notify myTTS:lastFilename:./var/SonosSpeak/ansage.mp3 set MQTT2_RINCON_347E5C82560801400 nachricht 10 x-file-cifs://192.168.56.186/SonosSpeak/ansage.mp3
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 04 Juni 2020, 17:28:41
Wenn man es so negativ belastet sagen, will ja :-P

Versteh ich schon wieder nicht, negativ belastet ? Damit wollte ich eigentlich zum Ausdruck bringen dass das Ziel (was die Bridge betrifft) mMn eigentlich schon erreicht ist ( wenn man nicht irgendwelche Zeige zusätzlich dazunimmt oder an den Pfaden spielt) und nachfragen ob ihr das genauso seht, nicht mehr und nicht weniger.

Sehe das so wie Otto weiter oben schon schrieb eigentlich braucht man ja nur das RINCON-Device, sind wir da oder nicht.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 04 Juni 2020, 17:30:29
Zitat von: 87insane am 04 Juni 2020, 17:12:47
EDIT: Das haben Otto und ich gemeldet. Otto sogar direkt im git. Hoffe die "FHEM-ler" nerven ihn nicht zu sehr :-P
Wenn das alles läuft spenden wir ihm ein Bier 🍻
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 04 Juni 2020, 17:31:45
jaein... Es zählt zwar nicht wie ich falscher Weise ursprünglich auch sagte aber es weiß ob kein Gerät oder mehr als eins verbunden ist. Also muss es da ja ein keepalive geben in einer Form.

https://github.com/svrooij/sonos2mqtt/blob/master/src/sonos-to-mqtt.ts
z.B. meine ich das hier passiert:
    if (success) {
      this.log.info('Found {numDevices} sonos speakers', this.sonosManager.Devices.length)


Im Code findet man auch noch ein paar Stellen von Ihm selber, bei denen es wohl noch nichts gibt von SONOS selber. z.B. Modell. Allerdings frage ich mich wie das SONOS Modul heraus findet was es für ein Player ist. Weiß das jemand? Ggf. ist das auch ein guter Hinweis.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 04 Juni 2020, 17:32:20
Zitat von: Otto123 am 04 Juni 2020, 17:30:29
Wenn das alles läuft spenden wir ihm ein Bier 🍻
Definitiv! Wir uns aber auch ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 04 Juni 2020, 17:42:59
Zitat von: 87insane am 04 Juni 2020, 17:32:20
Definitiv! Wir uns aber auch ;)
...ich laß euch dann bei Gelegenheit die Adresse des nächsten FHEM-Treffs bei uns in der Gegend zukommen, dann könnt ihr ja ein Kistchen hinschicken lassen oder mitbringen, damit ich an eurer Freude auch etwas teilhaben kann  8) ...

Zitat von: Otto123 am 04 Juni 2020, 17:26:36
Sprachausgabe läuft - zumindest im Ansatz :)
defmod myTTS Text2Speech none
attr myTTS TTS_OutputFile /var/SonosSpeak/ansage.mp3
attr myTTS TTS_UseMP3Wrap 1

defmod myTTS_notify_1 notify myTTS:lastFilename:./var/SonosSpeak/ansage.mp3 set MQTT2_RINCON_347E5C82560801400 nachricht 10 x-file-cifs://192.168.56.186/SonosSpeak/ansage.mp3

...das ist mal cool, sollte ich mir irgendwo aufschreiben, damit ich das irgendwann bei Bedarf auch wiederfinde... (Könnte ja ggf. mein Yamaha auch verstehen...).

@Otto: Falls du mal meinst, tief genug in der Materie drin zu sein: ich muß das mit den attrTemplates für MQTT2 nicht alleine gemacht haben...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 04 Juni 2020, 17:54:58
Ich schau mal, ich glaube ich habe es jetzt verstanden. Gib mir noch etwas :)

Wer noch ein bisschen UPNP schnüffeln will - damit ensteht eine Toolsammlung Developer Tools ....
https://www.meshcommander.com/upnptools

Ob das viel nutzt weiß ich noch nicht. :-\
Empfehlenswert zum Anschauen und Steuern mit aktuellen Werten: AV Media Controller
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 04 Juni 2020, 21:05:53
Nachricht von Stephan: ;D
ZitatMute will be fixed soon (see svrooij/node-sonos-ts#59)
SwitchToTv was a bug in the sonos-command-mapping, good spot!
ZitatThis issue has been resolved in version 3.0.6-beta.3
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 04 Juni 2020, 21:16:01
Oh da hast du was gefunden was er selber noch auf dem Schirm hatte. Geil. Immer wenn ich beta-user was zeigen kann in der Hinsicht freue ich mich :-P passiert nur leider selten. :-P

Meine Sachen hat er noch nicht aufgenommen. Denke das kommt morgen oder so.

Ich nutze selber kein HA aber das müssen die Kollegen doch gemerkt haben?

Gesendet von meinem LM-G810 mit Tapatalk
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: svrooij am 04 Juni 2020, 21:22:51
Hi guys,

Sorry for my english, my german isn't perfect (in reading/writing), I would be able to understand you guys if we would be talking.
Im the author of the sonos2mqtt bridge and I got a mail from Kai the other day that you guys want some bugs fixed.

The latest beta https://www.npmjs.com/package/sonos2mqtt/v/3.0.6-beta.3 solves the issue with the falsy mute readings and the switchtotv not working.

To get the speaker to say stuff you'll need an extra "server". the server will generate the correct mp3 on demand and then play it like a regular notification.
This is described here https://svrooij.github.io/node-sonos-ts/sonos-device/notifications-and-tts.html#text-to-speech

Technical stuff:
I'm also the developer of node-sonos-ts which is used by sonos2mqtt. Next to the commands implemented in sonos2mqtt you can also execute the commands that are available on the device library. Example: if you want to change the led state of a player https://svrooij.github.io/node-sonos-ts/sonos-device/services/devicepropertiesservice.html#setledstate
You can send the following message to sonos/RINCON_xxxx/control

This command is in the DevicePropertiesService and is called SetLEDState


{
  "command": "adv-command",
  "input": {
    "cmd": "DevicePropertiesService.SetLEDState",
    "val": {
      "DesiredLEDState": "On"
    }
  }
}


Since my german isn't very good, I would appreciate if you create an issue like https://github.com/svrooij/sonos2mqtt/issues/97 if you found a bug.
You can also create a feature request there, but for new features (or changes to current features) i'm not able to implement them straight away (since this is only build is my spare time).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 04 Juni 2020, 21:31:30
ZitatThis issue has been resolved in version 3.0.6-beta.3

Danke, funzt.


defmod MQTT2_RINCON_000E58F7F67C01400 MQTT2_DEVICE RINCON_000E58F7F67C01400
attr MQTT2_RINCON_000E58F7F67C01400 IODev MQTT2_Server
attr MQTT2_RINCON_000E58F7F67C01400 icon audio_volume_low
attr MQTT2_RINCON_000E58F7F67C01400 jsonMap volume_Master:volume mute_Master:mute
attr MQTT2_RINCON_000E58F7F67C01400 model sonos2mqtt_speaker
attr MQTT2_RINCON_000E58F7F67C01400 readingList sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr MQTT2_RINCON_000E58F7F67C01400 room MQTT2_DEVICE
attr MQTT2_RINCON_000E58F7F67C01400 setList stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }\
  play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
  pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
  volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
  mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";;;; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
  next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
  previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
nachricht:textField sonos/RINCON_000E58F7F67C01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}

setstate MQTT2_RINCON_000E58F7F67C01400 mute
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 coordinatorUuid RINCON_000E58F7F67C01400
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 currentTrack_Album Reggae Gold 1997
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 currentTrack_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-file-cifs:%2f%2f192.168.188.26%2fOwnMusic%2fTony%20Rebel%2fIf%20Jah.mp3&v=81
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 currentTrack_Artist Tony Rebel
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 currentTrack_Duration 0:03:48
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 currentTrack_ItemId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 currentTrack_ParentId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 currentTrack_ProtocolInfo x-file-cifs:*:audio/mpeg:*
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 currentTrack_Title If Jah
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 currentTrack_TrackUri x-file-cifs://192.168.188.26/OwnMusic/Tony Rebel/If Jah.mp3
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 currentTrack_UpnpClass object.item.audioItem.musicTrack
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 enqueuedMetadata_Album Reggae Gold 1997
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 enqueuedMetadata_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-file-cifs:%2f%2f192.168.188.26%2fOwnMusic%2fTony%20Rebel%2fIf%20Jah.mp3&v=81
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 enqueuedMetadata_Artist Tony Rebel
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 enqueuedMetadata_ItemId S://192.168.188.26/OwnMusic/Tony%20Rebel/If%20Jah.mp3
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 enqueuedMetadata_ParentId A:TRACKS
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 enqueuedMetadata_Title If Jah
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 enqueuedMetadata_UpnpClass object.item.audioItem.musicTrack
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 groupName Wohnzimmer
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 mute true
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 mute_LF false
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 mute_RF false
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 name Wohnzimmer
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 nextTrack_Album Batbox
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 nextTrack_AlbumArtUri http://192.168.188.38:1400/getaa?s=1&u=x-sonos-http:library%2ftracks%2f4fc25e3c-cb5c-4bb0-8dd7-382a7c8931c6%2f.mp3%3fsid%3d201%26flags%3d0%26sn%3d5
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 nextTrack_Artist Miss Kittin
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 nextTrack_Duration 0:03:20
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 nextTrack_ItemId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 nextTrack_ParentId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 nextTrack_ProtocolInfo sonos.com-http:*:audio/mpeg:*
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 nextTrack_Title BatBox
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 nextTrack_TrackUri x-sonos-http:library/tracks/4fc25e3c-cb5c-4bb0-8dd7-382a7c8931c6/.mp3?sid=201&flags=0&sn=5
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 nextTrack_UpnpClass object.item.audioItem.musicTrack
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 playmode NORMAL
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:29:27 state mute
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 transportState PLAYING
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 ts 1591299137908
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 uuid RINCON_000E58F7F67C01400
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:29:15 volume 10
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:29:15 volume_LF 100
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:29:15 volume_RF 100


Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 04 Juni 2020, 22:31:33
Zitatstraight away
we all do it as a hobby. I think it's absolutely okay if it's not done right now. Thanks for your quick support! Greetings, Kai
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 Juni 2020, 00:08:50
Wir sind in 4 Tagen ganz schön weit gekommen :)

Mal als Zwischenstufe (kommt mal noch an einen besseren Platz) eine Kurzanleitung.
Aktuelles FHEM als Voraussetzung!

Auf Systemebene:
setup nodejs (https://github.com/nodesource/distributions/blob/master/README.md)
sudo npm install -g sonos2mqtt@3.0.6-beta.3
In FHEM: (Wenn schon ein MQTT2 Instanz vorhanden entsprechen modifizieren)
define mqtt2s MQTT2_SERVER 1883 global
attr mqtt2s room MQTT2_IO

define SonosBridge MQTT2_DEVICE
attr SonosBridge IODev mqtt2s
attr SonosBridge room MQTT2_DEVICE
set SonosBridge attrTemplate sonos2mqtt_bridge
"pm2 start sonos2mqtt"
sleep 8;set MQTT2_RINCON_.* attrTemplate sonos2mqtt_speaker

define n_pm2 notify global:INITIALIZED "pm2 start sonos2mqtt"


Vielleicht ist es schräg den "pm2 start sonos2mqtt" aus FHEM heraus zu machen - aber es funktioniert :)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 05 Juni 2020, 08:33:46
Hi Zusammen,
ich habe gerade mal versucht, https://www.npmjs.com/package/sonos2mqtt#run-in-docker (https://www.npmjs.com/package/sonos2mqtt#run-in-docker) zum Laufen zu bringen - hat auch fast auf Anhieb geklappt!  :D
Lediglich das .env File musste etwas an den MQTT2-Server mit basic Auth angepasst werden...

Danach Autocreate on (am MQTT2-Server ist es immer an) und los gehts: Sofort wurden alle Player plus die Bridge angelegt.
attrTemplate gesetzt und zack - alle Player lassen sich steuern!  :)

Da ich das Problem mit den verschwundenen Playern - trotz mehrfachen stromlos machen bei Abwesenheit - nicht habe, werde ich hier nur
rein informativ mitlesen. Falls aber irgendwas in Richtung Docker getestet werden soll kann ich gerne einspringen  ;)

VG Sebastian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 05 Juni 2020, 09:26:06
So first @svrooij:

Welcome to our forum here!
Thanks for supporting us, too!

One question wrt. to the "LED state" thing you mentioned in your post. There the command "On" is used. Would also be "on" ok as part of the payload (or "off")?
Some background: In FHEM, state of switchable items historically have been written as "on" and "off", so having that type of payload (in sending or receiving) makes it much easier to switch things using timers ("on-till 23:30") and visualize state. So beeing able to send lowercase would be a nice thing beside the suggestions Kai most likely forwarded from one of my previous post (e.g. LWT). Best option wrt. to FHEM would be options to configure the payloads for on/off and other boolean values in sonos2mqtt (we use this option e.g. also when handling Tasmota flashed devices).

Feel free to ask back in case there's sth. to be discussed or unclear. (Or would you prefer german posts to english?)

@Otto:
Was die Anleitung angeht: Warum so viel manuell? Meine bisherige Erfahrung ist eher die, dass die User aus der Spur kommen, sobald mal eine Rückfrage seitens attrTemplate nach sinnhaftem Input kommt... Da ist autocreate+sinnvolles Auflösen der par-Anweisungen (für den Ersteller der Anleitung) stressfreier, und binford6000 hat das ja eben nochmal bestätigt. Bitte auch noch das Deaktivieren der "autodiscovery" aufnehmenaufnehmen (bzw. ignoreRegexp, wenn du schon eine eigene Server-Instanz dafür aufmachst) ::) .
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 05 Juni 2020, 09:34:44
@Beta-User hatte bei mute mal getestet false oder true zu senden, das ging auch. Es scheint also false/off usw bei einigen Befehlen zu klappen. Bin gespannt was er sagt.

Gesendet von meinem LM-G810 mit Tapatalk

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 05 Juni 2020, 09:48:50
Zitat von: 87insane am 05 Juni 2020, 09:34:44
@Beta-User hatte bei mute mal getestet false oder true zu senden, das ging auch. Es scheint also false/off usw bei einigen Befehlen zu klappen.
Thx, dann wird es wohl so sein, dass die Transformation (in Senderichtung) bei allen derartigen Befehlen klappt. Super wäre halt, wenn man es empfangsseitig auch gleich als "on" bzw. "off" bekäme, sonst müssen wir halt ein "clearing" davorsetzen, was immer das Risiko birgt, dass was schief geht, sind ja doch teils längere strings, die da kommen (in dem "true"-Thread war der JSON recht einfach gestrickt, so dass das egal war).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 05 Juni 2020, 09:50:07
Ja - stimmt.

Gesendet von meinem LM-G810 mit Tapatalk

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 Juni 2020, 09:52:45
SetLEDState tested: On ON Off OFF is working / on off unfortunately not.
But it's advanced mode! All cmd's should go directly - the UPNP Receiver is only responsable.

@Beta-User Wieso viel manuell? Die Server Definition ist für den der noch keinen hat (kann ja vorkommen)
Das Bridge Device kann man entweder anlegen lassen, ich würde es immer anlegen ;)

Und gerade der Rest ist doch vollautomatisch!? :-[

Meine Idee ist: Gar nichts manuell machen, alle Geräte automatisch konfigurieren wenn sie kommen (und löschen wenn sie gehen) Aber davor müssen noch andere Sachen gehen. Wenn man sich die UPNP Umgebung anschaut, da stehen alle Infos wunderbar drin, die muss man doch in FHEM nutzbar machen können!? Radio Listen, Favoriten usw.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 05 Juni 2020, 09:59:03
Also automatisch löschen finde ich nicht so gut. So wie es jetzt passiert...also autocreate > Bridge Template oder speaker wählen, wunderbar. Die templates sollen ja Inspiration sein und kein Zwang. Der eine brauch alle Befehle, der nächste nur 4 und der wieder nächste will nur das Album Cover ansehen..... Schwer das für alle....

Gesendet von meinem LM-G810 mit Tapatalk

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 Juni 2020, 10:03:35
sudo npm install -g sonos2mqtt@3.0.6-beta.4

Und switchtotv funktioniert!  :D
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 05 Juni 2020, 10:11:49
Zitat von: Otto123 am 05 Juni 2020, 09:52:45
SetLEDState tested: On ON Off OFF is working / on off unfortunately not.
But it's advanced mode!
Schade, but really: advanced mode...

Zitat@Beta-User Wieso viel manuell? Die Server Definition ist für den der noch keinen hat (kann ja vorkommen)
Das Bridge Device kann man entweder anlegen lassen, ich würde es immer anlegen ;)
Und gerade der Rest ist doch vollautomatisch!? :-[
Nun ja, der Reihe nach: Wenn man keinen Server hat, muß man einen definieren, stimmt. Die Frage wäre aber gleich: global? Oder lieber dann einen Hinweis auf "allowed"...?
Wir können das gerne diskutieren, ich _glaube_ aber, dass es für die User am einfachsten ist, sich "immer" an den "Praxisbeispielen" orientieren zu können (da (bzw. beim Server-Wiki?) fehlt allowed noch); also würde ich das mit dem Server gar nicht zum Teil der Anleitung machen, sondern voraussetzen, dass man einen hat (oder eben Client+General-Bridge).

Und wieso man das (sonos-) Bridge-Device manuell anlegen müßte oder sollte, erschließt sich mir nicht. Ist doch bei allen anderen unserer "Bridges" genauso (zigbee2mqtt, milight-hub, OpenMQTTGateway). Die erste Nachricht, die kommt, wird nur über die CID identifiziert, alles landet in dem Gerät. Hinterher ist es "kaputt", was aber nichts macht...
Und ja, der Rest geht dann so oder so vollautomatisch.

Zitat
Meine Idee ist: Gar nichts manuell machen, alle Geräte automatisch konfigurieren wenn sie kommen (und löschen wenn sie gehen) Aber davor müssen noch andere Sachen gehen. Wenn man sich die UPNP Umgebung anschaut, da stehen alle Infos wunderbar drin, die muss man doch in FHEM nutzbar machen können!? Radio Listen, Favoriten usw.
Das klingt in der Theorie ganz gut, mal schauen, wie weit du das vorantreiben kannst. Sehr skeptisch bin ich aber beim Löschen (und eigentlich auch beim automatischen Anwenden von attrTemplate). Viele wollen ihre Geräte trotz aller Hilfsmittel doch irgendwie "selber im Griff" haben, und ich wäre z.B. nicht einverstanden, wenn mir irgendwas (!) etwas aus der config löscht. Ist m.E. ein no-go.
Automatisches Neukonfigurieren hat uU. auch so seine Tücken, wenn unterschiedliche firmwares etc. dazukommen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 Juni 2020, 11:05:37
Beim Server gebe ich Dir völlig Recht. Die Bridge gleich erstmal anlegen ist für mich definierter, da muss ich auch nicht beschreiben: Suche in deinen 100 Geräten das gerade neu angelegte Bridge Device und dann klicke klacke :) - aber da akzeptiere ich jede Vorliebe :)

Viele User wollen einfach eine C&P Vorlage ohne Nachdenken - was ich immer problematisch finde - ohne viel gelaber. ::)

Die UPNP Umgebung ist von Grunde her so ausgelegt "automatisch" zu sein. Kommen und gehen... Ich denke da muss man "replizierte" Konfigurationen auch wieder löschen, aber muss man natürlich nicht.
Ich habe das beim Sonos gelernt: define Sonos SONOS legt alles an, delete Sonos löscht alles wieder. Aber beim Neuanlegen fehlen dann meine attribute, deswegen habe ich ein notify welches darauf reagiert und mein Sonos fertig konfiguriert und ich nicht erst in meine Notizen schauen muss :)
Also ich würde mein Framework teilen und niemanden zwingen es so zu tun :)
Die kurze Anleitung von gestern sollte vor allem auch meinen leicht geänderten Stand von der Installation und Konfiguration von nodejs dokumentieren und zur Diskussion stellen.

Und vielleicht ist ja jetzt ein Stand erreicht wo mal noch einer mehr testen will.

Final(schön) ist es glaube ich noch lange nicht ;)
Aber ich bin jetzt mindestens soweit, dass ich meine bisherigen Automatismen umsetzen kann.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 05 Juni 2020, 11:28:14
Na ja, über "das rote Fragezeichen" bekommst du eine Liste, und bei mir ist der Raum MQTT2_DEVICE in der Regel nicht lange vorhanden und daher ziemlich übersichtlich ;D ...

(Aber wie immer: viele Wege führen nach Rom :) ).

Und das mit dem Löschen finde ich irgendwie unschön. MQTT ist prinzipbedingt nicht abhängig davon, dass immer eine Verbindung besteht, da scheint das Sonos-Modul viel empfindlicher zu sein. Hier aber sollte man solche Umwege lassen können, ohne dass irgendwas blockiert.

Vielleicht beschäftigst du dich als nächstes mal mit "setStateList" => da geht es darum festzustellen, ob ein Befehl auch angekommen ist (sonst: set_xyz als Reading/state-Inhalt).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 Juni 2020, 11:38:23
Ich habe mal noch mit diesen Ergänzungen in der setList experimentiert, ich würde die zu diesem Zeitpunkt noch nicht unbedingt ins Template nehmen.
  switchToTv:noArg BASE_TOPIC/DEV_ID/control { "command": "switchtotv" }\
  adv-command:textField BASE_TOPIC/DEV_ID/control {"command":"adv-command","input":$EVTPART1}\
  joinGroup:textField BASE_TOPIC/DEV_ID/control {  "command": "joingroup",  "input": "$EVTPART1"}\
  leaveGroup:noArg { my $value = ReadingsVal("DEV_ID","groupName","all");; qq(BASE_TOPIC/DEV_ID/control { "command": "leavegroup",  "input": "$value" } ) }\
  setAVTUri:textField BASE_TOPIC/DEV_ID/control {  "command": "setavtransporturi",  "input": "$EVTPART1"}\
  notify:textField BASE_TOPIC/DEV_ID/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}

Beim advanced command muss man quasi den input im Textfeld übergeben, Beispiel mit der LED
{"cmd":"DevicePropertiesService.SetLEDState","val":{"DesiredLEDState":"Off"}}
Die ganze payload sieht so aus:
{"command":"adv-command","input":{"cmd":"DevicePropertiesService.SetLEDState","val":{"DesiredLEDState":"Off"}}}
Man muss also darauf achten keine Leerzeichen im String zu haben - ist jetzt eher für den advanced User gedacht :)

Bei setAVTuri und notify (Volume & Leerzeichen & String) gehen solche Strings:
x-sonos-htastream:RINCON_347E5C82560801400:spdif
x-sonosapi-stream:s6628?sid=254&flags=8224&sn=0
x-file-cifs://192.168.56.83/SonosSpeak/RINCON_000E586BE2A201400_MR_Speak_46997c34b47c65d08088f6e6f011de47b09bea29.mp3
https://cdn.smartersoft-group.com/various/pull-bell-short.mp3

leavegroup schmeisst den Player einfach aus seiner Gruppe
bei joinGroup gibt man den Player- Gruppennamen an.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 05 Juni 2020, 11:41:44
Ich verstehe noch nicht warum ein Player weg sein sollte? Wenn ein Play in den Müll geht, lösche ich ihn. Wenn ein Player offline ist, soll er als solches angezeigt werden aber nicht gelöscht. Ein Neues Gerät könnte am Ende mehrere Templates haben. Minimal nur für kleinen Player zb. oder aber ein großen Player mit Cover usw. Deswegen kann das nicht automatisch passieren.

ZitatViele User wollen einfach eine C&P Vorlage ohne Nachdenken
Das stimmt aber auch! Nun hätte man das mit den Templates. An sich ist die Idee mit dem notify super.
Aber spätestens bei mehreren möglichen Player Templates, wird es dann schwer.

Grundsätzlich ist das aber eine Inspiration für einige und ich würde das als optionale Sache mit in die Anleitung schreiben.
Hat jemand die ganze Befehlsliste schon durch geklickt? In den Templates ist ja noch nicht alles.

Ggf. macht es Sinn im ersten Beitrag (@Otto123), eine Zusammenfassung zu erstellen. Da kannst du auch die aktuell möglichen Befehle auflisten. So sehen wir genau welchen Stand wir alle haben :)

@Beta-User: Ich hatte beim spielen mit MiLight (zigbee2MQTT) gesehen, dass bei den RGB+CCT Templates z.B. so schick aussehende Knöpfe im devstate haben. Das würde ich gerne auch hier sehen. Leider ist mir bei Template-Prüfung nicht klar geworden wie du die dahin bekommen hast. Das wären super Player Button!
Du weiß ja, bei mir muss es nicht nur laufen, sondern es darf gern auch schick aussehen. Am Ende springt das einem Template-User auch als erstes auf ;) - Ich denke die C&P-ler, interessiert es auch nicht wie es umgesetzt wird. Schade aber die haben sicher andere Hobbies ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 05 Juni 2020, 11:51:51
Zu dem "advanced" ein Vorschlag, das zu entschärfen (dürfte auch für andere "Multi-EVTPART"-Bedarfe passen):
adv-command:textField { my $payload = $EVENT =~ s/$EVTPART0 //g; qq(BASE_TOPIC/DEV_ID/control {"command":"adv-command","input":$payload})}


Was das mit dem MiLight-Ding angeht, weiß ich nicht ganz genau, was du haben willst; miene Vermutung geht in Richtung webCmd/webCmdLabel (und ggf. cmdIcon):
attr DEVICE webCmd brightness:dim:hue:command:color_temp:program:saturation:mode
attr DEVICE webCmdLabel   brightness:dim\
  :hue:command\
  :color_temp:program\
  :saturation:mode
Am besten aufschreiben, was da sein soll.

(Mir fehlt auch noch ein "Wiki"-Baustein für die Konfiguration von MQTT2_DEVICE (als Beispiel). Also: Wie geht man am besten vor, wie gehört was zusammen. Mein Freiwilliger ist dazu leider schon länger stumm.
Anfangen mit webCmd (und sofern erforderlich eventMap), den Rest später...)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 05 Juni 2020, 12:02:41
ZitatWas das mit dem MiLight-Ding angeht, weiß ich nicht ganz genau, was du haben willst;
Hab leider aktuell keine Möglichkeit einen Screen zu machen. Man hat rechts neben den Slidern für Helligkeit usw noch so Knöpfe (sage ich mal dazu).
Ich würde vom lesen her denken, das sind das was du geschickt hast sollte es sein. Muss ich mal testen. Hab ich so noch nie benutzt, finde ich aber ganz schön. Man könnte ja so einen kleinen Player bauen.

ZitatMein Freiwilliger ist dazu leider schon länger stumm.
Das war aber hoffentlich nicht ich, oder? Ich fasse das mal als Gruppenarbeit am Ende dieses Aufbaus auf.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 05 Juni 2020, 12:09:16
Zitat von: 87insane am 05 Juni 2020, 12:02:41
Das war aber hoffentlich nicht ich, oder? Ich fasse das mal als Gruppenarbeit am Ende dieses Aufbaus auf.
Nein, keine Sorge.

Mein "Wunschgerät", bei dem man das ggf. mal "von Hand" nachvollzieht, was das attrTemplate macht, wäre ein shelly-plug-s, ggf. dann noch ein shellybulb oder so (wg. der "Knöpfe" und anderen Wigets).

Sonos hier finde ich etwas zu speziell, und das mit dem Shelly (+) ist eigentlich eher eine Fleißaufgabe und (mMn.) nichts besonders kompliziertes. Wäre top, wenn du das übernehmen wolltest, Rest ggf. dann in einem separaten Thread (Wiki?).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 Juni 2020, 12:14:19
Das mit den command testen ist ne Fleißaufgabe: das hilft dabei:
command:textField BASE_TOPIC/DEV_ID/control {"command":$EVTPART1}

Ich habe einiges getestet was sinnvoll für mich ist, das geht alles :) Ich vervollständige erstmal mein template auf github zum testen, wenn ich da durch bin kann man wieder was übernehmen?

Danke für den Code mit dem Mulitpart :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 05 Juni 2020, 12:19:50
ZitatWäre top, wenn du das übernehmen wolltest
Am besten machst du generell einen auf für sowas und ich melde mich einfach direkt und biete mich für den PlugS an. Habe ich sogar noch einen zuhause. Eine Bulb kann ich leider nicht bieten.

ZitatDas mit den command testen ist ne Fleißaufgabe: das hilft dabei:
Hatte mir einfach eine Box neben meinem Platz aufgestellt. So höre ich in den meisten Fällen ob es klappt :-P
Oder ich hab in der App geschaut ob die gewünschte Veränderung ankommt. Allerdings hatte ich nur basics getestet.

EDIT:
ZitatWas das mit dem MiLight-Ding angeht, weiß ich nicht ganz genau, was du haben willst
Ich bekomme die Worte zwar dahin aber bei MiLight waren da quasi so Kästchen drumherum. Die bekomme ich mit webcmd und webcmdlabel nicht hin.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 05 Juni 2020, 12:35:35
Das mit webCmdlabel interressiert mich, soweit war ich heute morgen noch nicht und kann erst später wieder spielen, hier sind schonmal erste cmdIcons  :)

defmod MQTT2_RINCON_000E58F7F67C01400 MQTT2_DEVICE RINCON_000E58F7F67C01400
attr MQTT2_RINCON_000E58F7F67C01400 IODev MQTT2_Server
attr MQTT2_RINCON_000E58F7F67C01400 cmdIcon mute:rc_MUTE previous:rc_PREVIOUS next:rc_NEXT play:rc_PLAY pause:rc_PAUSE stop:rc_STOP shuffleT:rc_SHUFFLE repeatT:rc_REPEAT
attr MQTT2_RINCON_000E58F7F67C01400 icon audio_volume_low
attr MQTT2_RINCON_000E58F7F67C01400 jsonMap volume_Master:volume mute_Master:mute
attr MQTT2_RINCON_000E58F7F67C01400 model sonos2mqtt_speaker
attr MQTT2_RINCON_000E58F7F67C01400 readingList sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr MQTT2_RINCON_000E58F7F67C01400 room MQTT2_DEVICE
attr MQTT2_RINCON_000E58F7F67C01400 setList stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }\
  play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
  pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
  volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
  mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";;;; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
  next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
  previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
nachricht:textField sonos/RINCON_000E58F7F67C01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
attr MQTT2_RINCON_000E58F7F67C01400 webCmd mute:previous:play:pause:stop

setstate MQTT2_RINCON_000E58F7F67C01400 mute
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 coordinatorUuid RINCON_000E58F7F67C01400
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 currentTrack_Album Weihnachts CD
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 currentTrack_AlbumArtUri http://192.168.188.38:1400/getaa?s=1&u=x-sonos-http:library%2ftracks%2f35754a47-37ea-4c09-b522-8c3af89953fe%2f.mp3%3fsid%3d201%26flags%3d0%26sn%3d5
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 currentTrack_Artist Prinzessin
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 currentTrack_Duration 1:12:28
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 currentTrack_ItemId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 currentTrack_ParentId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 currentTrack_ProtocolInfo sonos.com-http:*:audio/mpeg:*
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 currentTrack_Title PrinzessinLillifeeunddaskleineEinhornDasOriginal-HörspielzumKinofilm_ep7_HhMVFs_dp65-zrBUJZhrIkDdS9
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 currentTrack_TrackUri x-sonos-http:library/tracks/35754a47-37ea-4c09-b522-8c3af89953fe/.mp3?sid=201&flags=0&sn=5
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 currentTrack_UpnpClass object.item.audioItem.musicTrack
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 enqueuedMetadata_Album Reggae Gold 1997
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 enqueuedMetadata_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-file-cifs:%2f%2f192.168.188.26%2fOwnMusic%2fTony%20Rebel%2fIf%20Jah.mp3&v=81
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 enqueuedMetadata_Artist Tony Rebel
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 enqueuedMetadata_ItemId S://192.168.188.26/OwnMusic/Tony%20Rebel/If%20Jah.mp3
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 enqueuedMetadata_ParentId A:TRACKS
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 enqueuedMetadata_Title If Jah
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:32:18 enqueuedMetadata_UpnpClass object.item.audioItem.musicTrack
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 groupName Wohnzimmer
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 mute true
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 mute_LF false
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 mute_RF false
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 name Wohnzimmer
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 nextTrack_Album Rasta Philosophy
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 nextTrack_AlbumArtUri http://192.168.188.38:1400/getaa?s=1&u=x-sonos-http:library%2ftracks%2f92c25731-b9a2-4bcf-a119-f78a9b2b965a%2f.mp3%3fsid%3d201%26flags%3d0%26sn%3d5
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 nextTrack_Artist Iqulah
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 nextTrack_Duration 0:05:06
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 nextTrack_ItemId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 nextTrack_ParentId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 nextTrack_ProtocolInfo sonos.com-http:*:audio/mpeg:*
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 nextTrack_Title Rasta Magic
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 nextTrack_TrackUri x-sonos-http:library/tracks/92c25731-b9a2-4bcf-a119-f78a9b2b965a/.mp3?sid=201&flags=0&sn=5
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 nextTrack_UpnpClass object.item.audioItem.musicTrack
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 playmode NORMAL
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 21:29:27 state mute
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 transportState PLAYING
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 ts 1591306079324
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 uuid RINCON_000E58F7F67C01400
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 volume 10
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 volume_LF 100
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-04 23:27:59 volume_RF 100


Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 05 Juni 2020, 12:39:39
Was ich mich frage, wie man das hier jetzt mit mute löst, dazu müsste man ja toggeln können ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 Juni 2020, 12:47:58
@Beta-user Dein Code hat einen bug, der liefert bloß ein "1":
adv-command:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(BASE_TOPIC/DEV_ID/control {"command":"adv-command","input":$payload})}\
Oder geht das einfacher?

ZitatWas ich mich frage, wie man das hier jetzt mit mute löst, dazu müsste man ja toggeln können ?
Wieso? mute on und mute off oder ich versteh es falsch.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 05 Juni 2020, 12:54:37
Mach mal
webcmd:
previous:play:pause:next::::volumedown_5:volume:volumeup_5:mute

cmdIcon:
mute:rc_MUTE previous:rc_PREVIOUS next:rc_NEXT play:rc_PLAY pause:rc_PAUSE stop:rc_STOP shuffleT:rc_SHUFFLE repeatT:rc_REPEAT volumedown_5:rc_VOLDOWN volumeup_5:rc_VOLUP

Haste einen kleinen Player. Mute übernimmt er aus der setList. Also wäre das in dem Fall ein Dropdown Menü. Ansonsten eben den Befehl anpassen.

Ich bin mir noch nicht sicher wie "mein" Player am Ende aussehen soll. Aber so sind die Basics schonmal da.
@Beta-User: Das webcmdlabel macht ja nur den Text davor. Der ist mir aber erstmal egal: Ich möchte diese kleinen Schaltflächen^^
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 05 Juni 2020, 12:55:57
Das mit dem toggle klappt afaik nur, wenn man es via devStateIcon löst.

@87insane: Mmn. brauche ich dazu keinen Thread aufzumachen, es gehört thematisch im weiteren Sinne zu dem hier: https://forum.fhem.de/index.php/topic,95897.0.html (https://forum.fhem.de/index.php/topic,95897.0.html).

Ziel ist einfach, "manuell" (in der "richtigen Reihenfolge") zu erläutern, welche Optionen dass es gibt (bei dem shelly eben dann mit dem "Bonus", dass es ggf. eben Einfluss auf die Funktionalität hat), passende screenshots bereitzustellen, damit man das "sieht", was da passiert (und ggf. leichter auf andere Fälle übertragen kann). Die "Krux" mit dem jetzigen Artikel "Device Overview anpassen" ist, dass er zu speziell geraten ist, und die Hardware nicht mehr so verbreitet (unter Einsteigern). Ich hatte halt nichts passenderes als diese virtuellen Kontakte...

@Otto: doppel mal die ";". Einfacher sehe ich im Moment nicht wirklich (außer direkt $EVENT zu manipulieren).




@87insane
volumeup_5 ist vermutlich nicht Development-Module-AV-API konform. Bitte setter usw. von dort nehmen und nichts erfinden, was dort schon irgendwie vorhanden/vorgeschlagen ist. Und "mehr" bitte zur Abstimmung stellen (es gibt irgendwo in der Perl-Ecke einen Thread dazu).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 05 Juni 2020, 13:00:55
Das oben mit den cmdIcons klappt aber nur wenn man dem setter nix mitgeben muss, cmdIcons war das erste an was ich heute morgen gedacht habe das war schnell mal definiert und das wars, beschäftigt hab ich mich noch nicht wirklich mit.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 05 Juni 2020, 13:15:57
ZitatDas oben mit den cmdIcons klappt aber nur wenn man dem setter nix mitgeben muss, cmdIcons war das erste an was ich heute morgen gedacht habe das war schnell mal definiert und das wars, beschäftigt hab ich mich noch nicht wirklich mit.
Ist einfach aber Perl ist hier eben immer geiler in meinen Augen :) Aber das kann ja jeder halten wie er mag. Je nach Ziel geht es ja auch ab und an nicht anders.

Zitatvolumeup_5 ist vermutlich nicht Development-Module-AV-API konform
Das ist mir komplett egal! Es ist erstmal nur ein Test. Am Ende ist die Benamung erstmal nur so, damit sie
A) Auffällig ist
B) Zum testen schneller als zu gucken was es schon gibt
C) Am Ende muss es ja für jeden erkennbar sein. Denke bis dahin muss erstmal der Weg bekannt sein :)

Ich habe mir die Regeln dort nicht angesehen und habe es auch nicht vor. Wenn ich so tief drin stecke wie ihr, die auch hoch laden ins SVN, dann wäre das was anderes.
Soll nun aber auch keine Diskussion auslösen. Denke die Gründe kann man zum TESTEN verstehen. Es sollte natürlich sobald sinnig auch angepasst werden, nachdem was du hier sagtest.
Will gar nicht wissen wie "krum" mein FHEM aus Sicht der Development-Module-AV-API ist.... haha

ZitatZiel ist einfach, "manuell" (in der "richtigen Reihenfolge") zu erläutern,
Hmmm... Ich gebe mein Bestes. Ich weiß nicht wie schnell ich das schaffe. Sagte sowas die Tage ja schon mal. Schaue mir mal an was da aktuell drin steht und versuche das "leichter" zu beschreiben. Ich kenne aber einige Sachen auch nicht. Wie z.B. diese LED Lampe, die aufeinmal aus dem nichts kam und nun aber wundervoll in ein paar Templates ist (devStateIcon, welches Helligkeit und Farbe anzeigt). Oder wie jetzt gerade die Geschichte mit den Rahmen um den Button, wie im Template https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/lib/AttrTemplate/mqtt2.template#L2762.

Kannst du mir (am besten sicher via PN) die nötigen Links senden? Dann sende ich dir, nach Fertigstellung die Doku. So kannst du kurz drüber fliegen und direkt meine Fragen beantworten :) und dazu prüfen ob das "konform" ist.


EDIT: Ach ja - Im "original" SONOS Player gibt es noch:
Favourites:LastActionResult.*?GetFavouritesWithCovers.* { if (ReadingsVal($name, "LastActionResult", "") =~ m/.*?: (.*)/) { return $1; } }, Radios:LastActionResult.*?GetRadiosWithCovers.* { if (ReadingsVal($name, "LastActionResult", "") =~ m/.*?: (.*)/) { return $1; } }, Playlists:LastActionResult.*?GetPlaylistsWithCovers.* { if (ReadingsVal($name, "LastActionResult", "") =~ m/.*?: (.*)/) { return $1; } }, Queue:LastActionResult.*?GetQueueWithCovers.* { if (ReadingsVal($name, "LastActionResult", "") =~ m/.*?: (.*)/) { return $1; } }, currentTrackPosition:LastActionResult.*?GetCurrentTrackPosition.* { if (ReadingsVal($name, "LastActionResult", "") =~ m/.*?: (.*)/) { return $1; } }
Glaube Otto123 hatte hier auch schon was zu geschrieben. Das es möglich sein sollte am Ende die Favoriten usw ab zu fragen. Ggf. bringt das ja was. Poste es erstmal nur hier rein als Gedankenstütze.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 05 Juni 2020, 13:49:32
ZitatIch bekomme die Worte zwar dahin aber bei MiLight waren da quasi so Kästchen drumherum. Die bekomme ich mit webcmd und webcmdlabel nicht hin.

Du meinst sicher uzsuToggle uzsuSelect und uzsuSelectRadio (https://wiki.fhem.de/wiki/FHEMWEB/Widgets)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 05 Juni 2020, 14:32:05
Muss ich schauen...

Hab mal ein wenig vor gearbeitet. Habe den "mini-Player" mal als Perl / devstateicon Variante gebaut. Absichtlich auch so, das man es versteht und sehr einfach.
Den Volume Slider hätte ich gern noch drin aber ich kann hier nicht testen aktuell und im Kopf habe ich leider nicht wie ich einen Slider erzeuge.

{
my $previouspic = 'rc_PREVIOUS';;
my $playpic = 'rc_PLAY';;
my $pausepic = 'rc_PAUSE';;
my $nextpic = 'rc_NEXT';;
my $voldownpic = 'rc_VOLDOWN';;
my $voluppic = 'rc_VOLUP';;
my $mutepic = 'rc_MUTE';;
"<div>
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>
<a href=\"/fhem?cmd.dummy=set $name play&XHR=1\">".FW_makeImage($playpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name pause&XHR=1\">".FW_makeImage($pausepic)."</a>
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a href=\"/fhem?cmd.dummy=set $name volumedown_5&XHR=1\">".FW_makeImage($voldownpic)."</a>
HIER SOLLTE DER VOL SLIDER SEIN
<a href=\"/fhem?cmd.dummy=set $name volumeup_5&XHR=1\">".FW_makeImage($voluppic)."</a>
<a href=\"/fhem?cmd.dummy=set $name mute&XHR=1\">".FW_makeImage($mutepic)."</a>
</div>"
}



Für einen erweiterten Player oder aber wenn gewünscht auch schon bei dem mini-Player wäre das hier ggf. schon mal ein kleines Grundgerüst.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 05 Juni 2020, 14:37:21
Nochmal: Es wird einfacher, wenn wir nicht devStateIcon in Perl machen (und wenn, sollte man dann ggf. für solche Zuordnungslisten Hashes verwenden, siehe e-go-charger).

Und den Hinweis auf die AV-Developer-API hatte ich ernst gemeint! Das kann man ohne große Vorkenntnisse verstehen, und wenn man es gleich beherzigt, gibt es ggf. auch gleich sinnvolle Symbole usw.. (Genau dafür gibt es diese Konventionen, und wenn es noch nicht funktioniert, muß man es ggf. an einer zentralen Stelle anpassen, damit es überall geht...).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 05 Juni 2020, 15:16:11
Kann man in stateformat bzw dann devstateicon über normalen weg bilder rein packen?

Allgemein, wie würde ich da in Perl einen slider machen?

Zu den Richtlinien.. Sicher haben die ihren nutzen, sagte ich ja auch.

Gesendet von meinem LM-G810 mit Tapatalk

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 05 Juni 2020, 15:42:23
Zitat von: 87insane am 05 Juni 2020, 15:16:11
Kann man in stateformat bzw dann devstateicon über normalen weg bilder rein packen?
Jein. Multiline wäre das Stichwort... Wenn man Perl-stateFormat macht, eben mit \n (siehe den verlinkten "Problem"-Thread).

ZitatAllgemein, wie würde ich da in Perl einen slider machen?
Das geht bestimmt, aber da weiß ich auch nicht wie; der Slider u.ä. gehören mMn. nach webCmd; da ist es dann easy (vorausgesetzt, man bekommt die response vom Gerät her auch wieder auf das Reading gemappt).

ZitatZu den Richtlinien.. Sicher haben die ihren nutzen, sagte ich ja auch.
Ich bin nur irritiert, dass du pauschal behauptest, das wäre nichts, was man auf Anhieb verstehen kann (das impliziert das "soll sich später jemand anderes drum kümmern..."). Es sind da grade mal ~20 typische Kommando/Readingnamen und deren Bedeutung gelistet (https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV#Kommandos). Was spricht also dagegen, statt "volumeup_5" den dort gelisteten "volumeUp"-Befehl zu nehmen - da sind die 5% als default hinterlegt (und um die kompliziertere Variante kann sich dann ggf. später jemand kümmern, der es "noch fancier" haben will, falls das das Zielgerät auch versteht, wenn man z.B. (nach einer Umwandlung) "volume_up 10" als payload senden würde oder eben daraus ein errechnetes Volume ermitteln usw.)...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 05 Juni 2020, 16:35:55
ZitatDas mit dem toggle klappt afaik nur, wenn man es via devStateIcon löst.

Die 1 am Anfang bei einer Zeile braucht man nicht ich weiß.
War das so gemeint ? würdest das so lösen, wenn die cmdIcons wirklich ins Template kommen sollten ?

defmod MQTT2_RINCON_000E58F7F67C01400 MQTT2_DEVICE RINCON_000E58F7F67C01400
attr MQTT2_RINCON_000E58F7F67C01400 IODev MQTT2_Server
attr MQTT2_RINCON_000E58F7F67C01400 cmdIcon previous:rc_PREVIOUS next:rc_NEXT play:rc_PLAY pause:rc_PAUSE stop:rc_STOP
attr MQTT2_RINCON_000E58F7F67C01400 devStateIcon 1.true:rc_MUTE:mute+off 1.false:rc_MUTE:mute+on
attr MQTT2_RINCON_000E58F7F67C01400 icon audio_volume_low
attr MQTT2_RINCON_000E58F7F67C01400 jsonMap volume_Master:volume mute_Master:mute
attr MQTT2_RINCON_000E58F7F67C01400 model sonos2mqtt_speaker
attr MQTT2_RINCON_000E58F7F67C01400 readingList sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr MQTT2_RINCON_000E58F7F67C01400 room MQTT2_DEVICE
attr MQTT2_RINCON_000E58F7F67C01400 setList stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }\
  play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
  pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
test:true,false sonos/RINCON_000E58F7F67C01400/control { "command": "mute", "input": $EVTPART1 }\
  volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";;;; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
  next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
  previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
nachricht:textField sonos/RINCON_000E58F7F67C01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
attr MQTT2_RINCON_000E58F7F67C01400 stateFormat 1:mute
attr MQTT2_RINCON_000E58F7F67C01400 webCmd previous:play:pause:stop

setstate MQTT2_RINCON_000E58F7F67C01400 1:false
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:29:22 coordinatorUuid RINCON_000E58F7F67C01400
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 currentTrack_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 currentTrack_AlbumArtUri http://192.168.188.38:1400/getaa?s=1&u=x-sonos-http:library%2ftracks%2fa4e8b0d9-c416-431b-96f2-448d1230972d%2f.mp3%3fsid%3d201%26flags%3d0%26sn%3d5
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 currentTrack_Artist Johannes Ackner
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 currentTrack_Duration 0:14:23
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 currentTrack_ItemId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 currentTrack_ParentId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 currentTrack_ProtocolInfo sonos.com-http:*:audio/mpeg:*
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 currentTrack_Title Der Struwwelpeter
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 currentTrack_TrackUri x-sonos-http:library/tracks/a4e8b0d9-c416-431b-96f2-448d1230972d/.mp3?sid=201&flags=0&sn=5
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 currentTrack_UpnpClass object.item.audioItem.musicTrack
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 15:48:52 enqueuedMetadata_Album Reggae Gold 1997
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 15:48:52 enqueuedMetadata_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-file-cifs:%2f%2f192.168.188.26%2fOwnMusic%2fTony%20Rebel%2fIf%20Jah.mp3&v=81
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 15:48:52 enqueuedMetadata_Artist Tony Rebel
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 15:48:52 enqueuedMetadata_ItemId S://192.168.188.26/OwnMusic/Tony%20Rebel/If%20Jah.mp3
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 15:48:52 enqueuedMetadata_ParentId A:TRACKS
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 15:48:52 enqueuedMetadata_Title If Jah
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 15:48:52 enqueuedMetadata_UpnpClass object.item.audioItem.musicTrack
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:29:22 groupName Wohnzimmer
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:29:22 mute false
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:29:22 mute_LF false
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:29:22 mute_RF false
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:29:22 name Wohnzimmer
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 nextTrack_Album Unknown Album
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 nextTrack_AlbumArtUri http://192.168.188.38:1400/getaa?s=1&u=x-sonos-http:library%2ftracks%2fdb2e40d8-1706-4c8b-b623-c8ddc37dbf34%2f.mp3%3fsid%3d201%26flags%3d0%26sn%3d5
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 nextTrack_Artist Unknown Artist
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 nextTrack_Duration 0:00:03
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 nextTrack_ItemId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 nextTrack_ParentId -1
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 nextTrack_ProtocolInfo sonos.com-http:*:audio/mpeg:*
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 nextTrack_Title Doorbell.mp3
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 nextTrack_TrackUri x-sonos-http:library/tracks/db2e40d8-1706-4c8b-b623-c8ddc37dbf34/.mp3?sid=201&flags=0&sn=5
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 nextTrack_UpnpClass object.item.audioItem.musicTrack
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 playmode NORMAL
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:55 state mute
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:27:56 transportState PLAYING
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:29:22 ts 1591367361736
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:29:22 uuid RINCON_000E58F7F67C01400
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:17:29 volume 13
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:17:29 volume_LF 100
setstate MQTT2_RINCON_000E58F7F67C01400 2020-06-05 16:17:29 volume_RF 100

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 05 Juni 2020, 17:10:22
So war es in etwa gemeint.
Wie es optimal ist, kann ich auch nicht sagen, etwas "ungeschickt" ist, dass man STATE (devStateIcon-Bereich) und webCmd-Bereich nicht wirklich gut "zusammenkleben" kann (man kann aber die Zeilenausrichtung für STATE ändern, dann ist es etwas besser, ich weiß nur leider grade nicht mehr, wie... EDIT: devStateStyle style="text-align:right;;").

Meine weiteren Gedanken (ausdrücklich: noch nicht ausgegoren!):
- "1" ist testweise ok, aber "in echt" fände ich sprechendere Namen besser; man kann nur aus naheliegenden Gründen nicht "mute" verwenden; "mted" ist aber auch nicht so dolle?
- alles, was irgendwie "toggelt" würde ich eher über devStateIcon lösen, also insbesondere play/pause dorthin verschieben und nur stop nach webCmd? (kann aber sein, dass man dann Perl in stateFormat braucht. Bitte dann darauf achten, dass es möglichst "menschenlesbar" ist, es gibt auch User mit screenreadern, und die mögen aus guten Gründen nicht zu viel html-Code in stateFormat...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 05 Juni 2020, 17:33:19
Zitat- alles, was irgendwie "toggelt" würde ich

Du, haben wir das auch vor ? das mit den Icons war vorhin noch ein Vorschlag, ich hab bloß ein Beispiel gezeigt in welche Richtung es gehen könnte  (eventuell wie ich es mir bei meinem Device vorstellen könnte), wie sehen denn die anderen die DeviceOverview für das Template ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 Juni 2020, 17:44:44
@Beta-User Du hast mich weiter oben "gerügt" ich soll die ";" verdoppeln. Es ist doch so - oder irre ich?
Also zumindest funktioniert mein Code im Template mit einem  {bla;bla} aber bei Dir sind immer zwei drin  {bla;;bla} und in der Raw Def dann 4  ???

Mit setStateList hast Du mir ja eine Aufgabe gegeben :( das wird ja für einen Befehl schon schwierig - aber für die Liste! ;D
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 05 Juni 2020, 17:53:36
@Otto:
was die ";" angeht, bin ich auch immer am rätseln und übersehe vermutlich auch hin und wieder, wenn mir zu viele geliefert werden... Grundsätzlich ist aber RAW=attrTemplate.
(War nur irritiert, dass scheinbar nichts passiert).

setStateList ist einfacher als du denkst: im Zweifel Unsinn reinschreiben ;) . Bzw. eben nur die Dinge, die man auch in state haben will, wobei ich noch nicht weiß, was das sein soll (play/stop/pause?).

(Und an sich ist es so, dass ihr bestimmen könnt und dürft, wie das am Ende aussehen soll, ich versuche nur die Bausteinchen zu liefern, die man nutzen _kann_ - eben so, wie mir das sinnvoll erscheint, was aber keinesfalls "richtig" oder "besser" sein muß...)



Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 Juni 2020, 18:33:19
ZitatGrundsätzlich ist aber RAW=attrTemplate.
@Beta-User Ich wäre da jetzt hartnäckig und würde behaupten Attribute setList = attrTemplate
(nur bezüglich der semikolon!) was wirklich verwirrend ist, denn die \ müssen sein wie bei Raw Def.  :o

Ich habe mal noch etwas Code ausprobiert:
define Titel dummy
define MQTT2_RINCON_347E5C82560801400_notify_1 notify MQTT2_RINCON_347E5C82560801400:currentTrack_Title:.* {my $title=ReadingsVal($NAME,"enqueuedMetadata_Title","");;$title=~s/\s/_/g;;my $uri=ReadingsVal($NAME,"currentTrack_TrackUri","");;fhem("setreading Titel $title $uri") }


Da füllen sich dann Readings, wenn man etwas umspielt und danach geht dann sowas.
Radio starten
set MQTT2_RINCON.*:FILTER=name=Arbeitszimmer setAVTUri [Titel:Deutschlandfunk_Kultur];set MQTT2_RINCON.*:FILTER=name=Arbeitszimmer play

Ist jetzt ein sehr rudimentärer Ansatz - aber immerhin :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 05 Juni 2020, 20:10:46
Otto, etwas kürzer  :P:

setAVTUri:textField BASE_TOPIC/DEV_ID/control {  "command": "setavtransporturi",  "input": "$EVTPART1","command": "play"}

Bei mir klappt zwar (noch?) nicht das abspielen eines Radiosenders mit der Uri aus currentTrack_TrackUri, aber mit einer lokalen Uri funzt das Beispiel oben.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 Juni 2020, 20:50:20
@TomLee Deine Variante funktioniert bei mir nicht. Setzen und play danach funktioniert .
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 05 Juni 2020, 21:02:31
Gerade auch gemerkt, mal klappts mal nicht. Habs noch nicht verstanden.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 06 Juni 2020, 02:06:10
Zitatmal klappts mal nicht
meist alt besetzte oder nachgelagerte events/readings - Steht also was altes drin, deswegen klappt´s/oder nicht.

Sorry für meine Abwesenheit.
Haben wir ein weiteres vorgehen? Aktuell glaube ich ein wenig, wir laufen überall hin. @Otto123, deine Versuche sind immer sehr interessant und impulsiv. Was passiert heute? :)
Mir geht es darum das wir teils doppelte Dinge machen. Sollen wir nicht irgendwo eine kleine Checkliste machen, von den Dingen, die wir aktuell wissen und wollen? Erweitern kann man die immer noch.

Geil wie weit das Projekt hier, bisher gekommen ist! Danke - Auch für die Peitsche (@lass ich mal lieber).

Gute Nacht!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Wuppi68 am 06 Juni 2020, 12:31:26
Respekt !!!!

Tolle Arbeit.

5 Tage und gefühlt fast fertig.

Nur noch als Zusatzinfo: Das Commando Topic existiert zwei mal

- sonos/RINCON.../COMMAND
- sonos/set/Dusche/play

Die 2. Variante ist noch die alte Version, welche aber weiter funktionieren soll :-)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: hoppel118 am 06 Juni 2020, 13:27:25
Ja, echt krass, was ihr hier in kürzester Zeit schon erreicht habt. Ich genieße gerade fernab von Bildschirmen (mal abgesehen vom Smartphone) mein Leben. ;)

Viel Spaß noch!

Gruß Hoppel
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 06 Juni 2020, 18:55:36
ZitatKann man in stateformat bzw dann devstateicon über normalen weg bilder rein packen?

Basierend auf deinem Vorschlag oben hab ich etwas weiter gespielt, hasse eigentlich HTML, manchmal beschäftige ich mich aber auch gerne damit.

Mit diesen http-Kommandos hab ich mich nie mit beschäftigt, mir ist völlig unklar wie man das jetzt mit mute macht.

Wenns mir jetzt noch gelingt die überlangen Texte  in dem zweiten div ohne viel Aufwand abzuschneiden dann wäre es in der Höhe auch fix, was ein Problem an der u. a. Lösung ist.
Mir ist klar das es irgendwie mit einer style Angabe span {white-space: nowrap; overflow: hidden;} iVm text-overflow: ellipsis; irgendwo im Code gehen muss, bekomms aber net hin. Kann da wer weiterhelfen ?

Mir gefällts bisher  :)

defmod Test1 MQTT2_DEVICE RINCON_000E58F7F67C01400
attr Test1 IODev MQTT2_Server
attr Test1 devStateIcon {my $img = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");;;;\
my $ctitle = ReadingsVal($name,"state","") eq "PLAYING" ? ReadingsVal($name,"currentTrack_Title","no title"):ReadingsVal($name,"state","");;;;\
my $ititle = ReadingsVal($name,"state","") eq "PLAYING" ? ReadingsVal($name,"currentTrack_Artist","no title"):ReadingsVal($name,"state","");;;;\
my $atitle = ReadingsVal($name,"currentTrack_ProtocolInfo","") =~ ".*radio.*" ?\
ReadingsVal($name,"enqueuedMetadata_Title","no title") :ReadingsVal($name,"state","") eq "PLAYING" ? ReadingsVal($name,"currentTrack_Album","no title") : ReadingsVal($name,"state","");;;;\
my $nctitle = ReadingsVal($name,"state","") eq "PLAYING" ? ReadingsVal($name,"nextTrack_Title","no title"):ReadingsVal($name,"state","");;;;\
my $nititle = ReadingsVal($name,"state","") eq "PLAYING" ? ReadingsVal($name,"nextTrack_Artist","no title"):ReadingsVal($name,"state","");;;;\
my $natitle = ReadingsVal($name,"state","") eq "PLAYING" ? ReadingsVal($name,"nextTrack_Album","no title"):ReadingsVal($name,"state","");;;;\
"<div style=\'float: left;;padding: 10px;;\'><img src='$img' style='width:250px;;;;height:250px;;;;'>\
</div>\
<div style=\'text-align: left;; float: left;;padding: 10px;; width:200px;;height:250px;;\'>\
<span>Titel:'$ctitle'</span><br>\
<span>Interpret:'$ititle'</span><br>\
<span>Album:'$atitle'</span><br><br>\
<span>Nächster Titel</span><br>\
<span>Titel:'$nctitle'</span><br>\
<span>Interpret:'$nititle'</span><br>\
<span>Album:'$natitle'</span><br><br>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage("rc_PREVIOUS")."</a>\
<a href=\"/fhem?cmd.dummy=set $name play&XHR=1\">".FW_makeImage("rc_PLAY")."</a>\
<a href=\"/fhem?cmd.dummy=set $name pause&XHR=1\">".FW_makeImage("rc_PAUSE")."</a>\
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage("rc_NEXT")."</a>\
</span><br>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name volumedown&XHR=1\">".FW_makeImage("rc_VOLDOWN")."</a>\
<a href=\"/fhem?cmd.dummy=set $name mute&XHR=1\">".FW_makeImage("rc_MUTE")."</a>\
<a href=\"/fhem?cmd.dummy=set $name volumeup&XHR=1\">".FW_makeImage("rc_VOLUP")."</a>\
<a href=\"/fhem?cmd.dummy=set $name stop&XHR=1\">".FW_makeImage("rc_STOP")."</a>\
</span>\
</div>\
"}
attr Test1 event-on-change-reading .*
attr Test1 icon audio_volume_low
attr Test1 jsonMap volume_Master:volume mute_Master:mute volume_LF:0 volume_RF:0 mute_LF:0 mute_RF:0 enqueuedMetadata_ItemId:0 enqueuedMetadata_ParentId:0 currentTrack_ItemId:0 currentTrack_ParentId:0 coordinatorUuid:0 transportState:state nextTrack_ItemId:0 nextTrack_ParentId:0
attr Test1 model sonos2mqtt_speaker
attr Test1 readingList sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr Test1 room MQTT2_DEVICE
attr Test1 setList stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }\
play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
test:true,false sonos/RINCON_000E58F7F67C01400/control { "command": "mute", "input": $EVTPART1 }\
volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";;;; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
  previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
nachricht:textField sonos/RINCON_000E58F7F67C01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}\
volumedown:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumedown" }\
volumeup:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumeup" }\
setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control {  "command": "setavtransporturi", "input": "$EVTPART1"}

setstate Test1 PLAYING
setstate Test1 2020-06-06 17:59:23 currentTrack_Album The Mission
setstate Test1 2020-06-06 18:40:17 currentTrack_AlbumArtUri https://cdn-profiles.tunein.com/s57109/images/logoq.png
setstate Test1 2020-06-06 18:40:17 currentTrack_Artist Jason Derulo
setstate Test1 2020-06-06 17:59:23 currentTrack_Duration 0:03:27
setstate Test1 2020-06-06 18:40:17 currentTrack_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate Test1 2020-06-06 18:40:17 currentTrack_Title Want to want me
setstate Test1 2020-06-06 18:40:17 currentTrack_TrackUri x-rincon-mp3radio://http://hr-edge-2048.dus-lg.cdn.addradio.net/hr/hr3/live/mp3/128/stream.mp3?ar-distributor=f0a1
setstate Test1 2020-06-06 18:40:17 currentTrack_UpnpClass object.item
setstate Test1 2020-06-06 17:59:23 enqueuedMetadata_Album The Mission
setstate Test1 2020-06-06 18:40:17 enqueuedMetadata_AlbumArtUri https://cdn-profiles.tunein.com/s57109/images/logoq.png
setstate Test1 2020-06-06 17:59:23 enqueuedMetadata_Artist Iqulah
setstate Test1 2020-06-06 18:40:17 enqueuedMetadata_Title 89.3 hr 3 Frankfurt
setstate Test1 2020-06-06 18:40:17 enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate Test1 2020-06-06 18:40:17 groupName Wohnzimmer
setstate Test1 2020-06-06 18:40:17 name Wohnzimmer
setstate Test1 2020-06-06 17:59:23 nextTrack_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test1 2020-06-06 17:59:23 nextTrack_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-file-cifs:%2f%2f192.168.188.26%2fOwnMusic%2fH%c3%b6rb%c3%bccher%2fDer%20Struwwelpeter.mp3&v=81
setstate Test1 2020-06-06 17:59:23 nextTrack_Artist Johannes Ackner
setstate Test1 2020-06-06 17:59:23 nextTrack_Duration 0:14:23
setstate Test1 2020-06-06 17:59:23 nextTrack_ProtocolInfo x-file-cifs:*:audio/mpeg:*
setstate Test1 2020-06-06 17:59:23 nextTrack_Title Der Struwwelpeter
setstate Test1 2020-06-06 17:59:23 nextTrack_TrackUri x-file-cifs://192.168.188.26/OwnMusic/Hörbücher/Der Struwwelpeter.mp3
setstate Test1 2020-06-06 17:59:23 nextTrack_UpnpClass object.item.audioItem.musicTrack
setstate Test1 2020-06-06 18:40:17 playmode NORMAL
setstate Test1 2020-06-06 18:40:17 state PLAYING
setstate Test1 2020-06-06 18:40:17 ts 1591461617037
setstate Test1 2020-06-06 18:40:17 uuid RINCON_000E58F7F67C01400
setstate Test1 2020-06-06 18:40:17 volume 10


Anmerkung: Der Code zu devstateIcon ist von dem jsonMap transportState:state abhängig

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 07 Juni 2020, 10:55:28
Moin,

kurz mal eine Info zum Thema "Sonos disappeared"
heute morgen:
2020.06.07 09:39:33 0: SONOS0: Das Lauschen auf der Schnittstelle wurde beendet. Prozess endet nun auch...
Sonos System in meiner produktiven Umgebung tot :( hatte ich jetzt witzigerweise genau so lange nicht wie wir an dem sonos2mqtt Thema probieren.

Die neuen sonos2mqtt Systeme (ich habe gerade 2 Testsysteme damit parallel laufen) funktionieren nach wie vor :) die liefen seit ein paar Tagen durch.

Was auch immer dazu führt das der normale SONOS UPNP Sub-Prozess abraucht, sonos2mqtt war davon unbeeindruckt :)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 07 Juni 2020, 11:01:02
Es wird gerade untersucht ob die Ping Typen nicht laufen. Vermutlich wird das Problem auch bald behoben sein. Ich stehe aber eh auf mqtt. Wenn das alles rund ist, würde ich umsteigen. Ich teste sonos2mqtt parallel im aktuell snapshot, des prod Systems. Schönen Sonntag :)

Gesendet von meinem LM-G810 mit Tapatalk

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Wuppi68 am 07 Juni 2020, 17:13:43
da die klassische Sonos Lösung nie wirklich stabil lief bin ich relativ für  früh auf s2m umgestiegen - und im Notify dann einfach den mqtt publish hard gecoded ;-)

und das Teil lief immer problemlos durch ...

einziger Unterschied von der Anbindung:

mein FHEM Server hat mehrere Netzwerke verbunden inclusive Media VLAN und der Raspberry mit s2m hat nur das Media VLAN als Interface. Aber auch den FHEM Sonos Controller auf diesen gestartet brachte das gleiche undeterminische Disconnected ...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 07 Juni 2020, 19:17:15
Bitte bedenke... Es geht grundsätzlich sind die Arbeiten aber noch nicht abgeschlossen. Freut einen aber wenn es schon Anklang findet! Otto123 und beta-user haben einiges vorgelegt hier.
Viel Spaß damit und bitte wünsche hier lassen :)

Gesendet von meinem LM-G810 mit Tapatalk

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Wuppi68 am 07 Juni 2020, 20:29:41
ich benutze den schon sehr lange. Play, Stop und wenig anderes hatte ich schon "fertig". Die ersten Schritte hätte ich schon aus dem Ärmel gezogen, aber Ihr wart einfach zu schnell :-)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 07 Juni 2020, 20:35:38
Wie sieht deine Bridge denn aus? Kannst ggf ja noch was ergänzen.

Kein Wunder...gibt man bei google einfach mal 2mqtt ein findet man alles. Toaster2mqtt fehlt nur noch :-P


Gesendet von meinem LM-G810 mit Tapatalk

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 07 Juni 2020, 20:55:06
Denkst Du, die Toaster App in der Cloud läuft ohne MQTT :) ;D
ZitatDieser Toaster brennt per App Bilder aufs Brot
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 07 Juni 2020, 21:04:53
Omg! Dann ginge da ja auch mqtt. Also haben wir das auch geklärt. .*2mqtt = alles ist möglich :) kranker Mist :-P ich lache mich weg. Was es für "sinnlosen Kram" gibt.

Gesendet von meinem LM-G810 mit Tapatalk

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 08 Juni 2020, 15:31:23
 :) Schön, dass die community der "MQTT2-Device-Versteher" kontinuierlich wächst und wir auch "komplizierte" Geräte in den Griff zu bekommen scheinen!

Da ich eh' die Tage mal wieder ein paar Bausteinchen zusammensammeln muß und die attrTemplate-file überarbeiten: Gibt's sowas wie einen konsolidierten Stand zu einem Player-Device?
(Oder brauchen wir zwei attrTemplate-Versionen für "einfache" und "advanced" Modelle?)
Ich hätte kein Problem damit, einfach wieder eine verbesserte Zwischenversion einzustellen.

Falls es viele Spezialitäten gibt, wäre es evtl. eine Sache, dazu kurz einen Link in die "Praxisbeispiele" aufzunehmen und das ggf. mit diversen Varianten/ergänzungen/notify-"add-ons" auf eine eigene Seite im Wiki zu packen; muß ja nix großes werden, aber den "finalen" Stand wiedergeben?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 08 Juni 2020, 15:50:27
Also ich bin kurz davor 2 Templates fürs einchecken zu liefern :)
Eines für hier und eines für den Rasenmäher! ;) Hast Du sicher schon gesehen wie ich Dich kenne.
Lass mich heut abend noch mal drüber schauen?

Ich denke aber für mich ist es guter Zwischenstand ;) Die Funktionen sind aus meiner Sicht erstmal fertig. Jetzt muss es noch schön werden und status fehlt mir noch ein bisschen. Aber das wäre Step 2 und 3 zumal ich das vielleicht auch modular machen würde. Ich finde so ein "ALLES PLATSCH" Template erschlägt vielleicht auch den Einsteiger?

(Ich bin auch noch an einer ebus Überarbeitung dran, aber das dauert vielleicht noch)

Mir ist da noch aufgefallen: Du kennst ja sicher das Thema unescaped Backslash ...https://regex101.com/ meckert da auch an unseren Topic regExen rum. Ich habe die mal bei mir mal alle auf "konform" umgestellt.
Falls Du am überarbeiten bist, vielleicht bildest Du Dir ein Meinung dazu ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 08 Juni 2020, 16:16:27
Sagt mal, Sonos hat ja heute seine App aufgesplittet (eine für die älteren Geräte, eine für die neueren). Hat das irgendwelche Auswirkungen auf Sonos2mqtt oder habt ihr da noch nichts beobachten können?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 08 Juni 2020, 16:23:28
Zitat von: Otto123 am 08 Juni 2020, 15:50:27
Also ich bin kurz davor [...]
Super!

Wollte nur mal nachhören, was der Stand ist, nachdem's irgendwie jetzt doch wieder sehr ruhig wurde, aber manches an Bausteinchen im Raum stand.

Was die anderen Themen angeht: ich mache auch (zuhauf) Fehler und weiß bei weitem nicht alles... (wird zwar immer mal wieder besser, aber grade bei den Dingen von "am Anfang" frage ich mich manchmal auch, wer denn darauf gekommen ist...)
Bin also für alle Arten von Verbesserungsvorschlägen offen. Es geht ja grade drum, Kopierfehler möglichst zu vermeiden ;) .

Ansonsten drehen sich meine derzeitigen Gedanken eher um tasmota_POW und pm-shelly (da gab es neben dem (neuen) em3-list auch noch einen Edit von 87insane, den ich bisher übersehen hatte). Vielleicht baue ich noch das eine oder andere zwei-Kanalige@shelly um, mal schauen...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Wuppi68 am 08 Juni 2020, 18:38:36
Habe heute nur vom Firmenrechner mitgelesen ;-)

meine Config ist folgende

s2m --> mosquito --> MQTT2_DEVICE als Bridge --> Sonos Player

Bridge regex für Sonos (noch für die 2.x Version von s2m):

sonos/status/([A-Za-z0-9._]*)[/]+.*:.* "sonos_$1"
sonos/set/([A-Za-z0-9._]*)[/]+.*:.* "sonos_$1"

geht immer noch
das "aktuelle" Template auf meine Devices angewandt (RINCON von Hand eingefügt)

Werde in den nächsten Tagen aber noch mal genauer an die Bridge gehen

Danke das s2m Ball im Spiel ist ;-)



PS.: imho sollte doch der FHEM MQTT Server die Client ID gar nicht vor das Topic hängen. Die sehe ich doch auch gar nicht bei einem extern Broker in dem entsprechenden referenzierten Topic
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 08 Juni 2020, 21:17:38
Zitat von: kjmEjfu am 08 Juni 2020, 16:16:27
Sagt mal, Sonos hat ja heute seine App aufgesplittet (eine für die älteren Geräte, eine für die neueren). Hat das irgendwelche Auswirkungen auf Sonos2mqtt oder habt ihr da noch nichts beobachten können?
Ich habe gerade Update gemacht. Bei mir steht überall S1 - sicher weil ich noch einen Play5 im Bestand habe, obwohl der derzeit nicht aktiv ist.

Wenn Du S2 hast: Mut zur Lücke, probier es einfach aus mit sonos2mqtt. Es ist unkompliziert und läuft hervorragend parallel.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 08 Juni 2020, 22:27:57
Hab s2..alles schön.

Es wurde die App neu entworfen aber erstmal nur übernommen. Änderungen sollen wohl noch kommen. Soweit ich dem Beta Test entnehmen konnte, wird nix weg fallen, nur dazu kommen und eigentlich auch nur für die neuen Geräte.
Bin aber auf die nächsten Updates gespannt. Die App an sich ist mal ganz nebenbei, einfach nur ne Icon Änderungen aus User Sicht. Auf androiden aber sollte sie doppelt so schnell sein. Apple kann ich nicht bestätigen.
Bei denen die mehrere in einem Raum nutzen sollte sich aber einiges gebessert haben. Hab überall nur eine aber bin gespannt ob sich dazu hier jemand mal nebenbei und OT zu Wort meldet. Kein Spam aber interesse halber :)

Gesendet von meinem LM-G810 mit Tapatalk

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 08 Juni 2020, 22:48:42
Ich habe mal ein funktionales Template gemacht. Und hier eingereicht:
https://forum.fhem.de/index.php/topic,94495.msg1062306.html#msg1062306

Gut so?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kumue am 09 Juni 2020, 02:55:33
Zitat von: Otto123 am 08 Juni 2020, 22:48:42
Ich habe mal ein funktionales Template gemacht. Und hier eingereicht:
https://forum.fhem.de/index.php/topic,111711.msg1062302.html#msg1062302

Gut so?

irgendwie hab ich ein problem mit dem link... ???
wo hast du das template eingereicht..?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 09 Juni 2020, 07:38:36
Es gibt einmal SVN und dann noch Ottos git.

Gesendet von meinem LM-G810 mit Tapatalk

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 09 Juni 2020, 09:58:13
Vielleicht noch eine "kleine Knobelaufgabe" im Hinblick auf https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV#Kommandos (https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV#Kommandos)...

Wenn ich die Bedeutung der Befehle richtig erfaßt habe, sollte das hier
switchToQueue:noArg BASE_TOPIC/DEV_ID/control { "command": "switchtoqueue" }\
switchToTv:noArg BASE_TOPIC/DEV_ID/control { "command": "switchtotv" }\
switchToLine:noArg BASE_TOPIC/DEV_ID/control { "command": "switchtoline" }\

eigentlich zuinput:Queue,TV,LineIn ...
werden.

Vermutlich bedeutet das, dass auf der Auswerteseite der betreffenden Rückmeldung dann auch was geändert werden muss ;) ...

(EDIT: ggf. können wir den $JSONMAP-Hash missbrauchen, um die Zuordnung darüber zu machen (außerhalb json2nameValue())?)



Grundsätzlich auch nochmal die an anderer Stelle angedeutete Frage: Wann gibt es welche/wieviele Events? Müssen/sollten wir da ggf. was ausdünnen?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 09 Juni 2020, 10:09:52
Info: Demnach müssten die Kollegen das sonos und Echo Modul anpassen. Steak dürfte nicht sein. Müsste sayText sein.

Kannst du genauer sagen wie das mit dem Input als Beispiel meinst? Verstehe die angefragte knobelaufgabe nicht. Normal mag ich textaufgaben :)

Gesendet von meinem LM-G810 mit Tapatalk

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 09 Juni 2020, 10:24:49
Zitat von: 87insane am 09 Juni 2020, 10:09:52
Info: Demnach müssten die Kollegen das sonos und Echo Modul anpassen. Steak dürfte nicht sein. Müsste sayText sein.
Kann ich nix zu sagen, wie üblich habe ich die Hardware nicht. Mir geht es darum, dass wir @mqtt2.template Devices anbieten, die die Vorgaben unserer Developer-Guidlines möglichst einhalten.

ZitatKannst du genauer sagen wie das mit dem Input als Beispiel meinst? Verstehe die angefragte knobelaufgabe nicht. Normal mag ich textaufgaben :)
So wie ich es verstanden habe, schalten alle drei Kommandos den Eingang um. Dach der verlinkten Vorgabe hat das Kommando zum Umschalten des Eingangs "input" (lowercase!) zu heißen. Das bedeutet, dass wir
- nicht noArg für einzelne setter nehmen, sondern einen für alle mit Auswahlmöglichkeit;
- Perl brauchen, um $EVTPART1 auszuwerten und den richtigen "command" zu ermitteln...

In Senderichtung ist das kein Hexenwerk, und du findest sicher in der mqtt2.template auch ein passendes Bausteinchen (oder im Wiki@tasmota-on-for-timer) ;) .

Empfangsseitig fehlt mir noch die Vorstellung, was da nach "Vollzug" via MQTT zurückkommt. Da muß man bestimmt auch irgendwas eventMap-pen oder userReadings festlegen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 09 Juni 2020, 11:21:29
Zitat von: kumue am 09 Juni 2020, 02:55:33
irgendwie hab ich ein problem mit dem link... ???
wo hast du das template eingereicht..?
Sorry da war beim copy & paste der Kopf nicht dazwischen :)
Ich habe den Link in meinem Post korrigiert. mittlerweile alles schon Schnee von gestern, siehe nächster Post :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 09 Juni 2020, 11:25:11
Oder statt des Links jetzt schon die weiter aktualisierte Fasung direkt aus dem svn:
Zitat von: TomLee am 02 Juni 2020, 17:26:16
{ Svn_GetFile("FHEM/lib/AttrTemplate/mqtt2.template", "FHEM/lib/AttrTemplate/mqtt2.template", sub(){ AttrTemplate_Initialize() }) }
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 09 Juni 2020, 16:47:02
kleines update


defmod Test10 MQTT2_DEVICE RINCON_000E58F7F67C01400
attr Test10 IODev MQTT2_Server
attr Test10 devStateIcon {sub trim30 { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...';; };;\
my $imgct = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");;\
my $imgnt = ReadingsVal($name,"nextTrack_AlbumArtUri","");;\
my $ctitle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"currentTrack_Title","no title"))) : ReadingsVal($name,"state","");;\
my $ititle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"currentTrack_Artist","no artist"))) : ReadingsVal($name,"state","");;\
my $atitle = ReadingsVal($name,"currentTrack_ProtocolInfo","") =~ ".*radio.*" ?\
(trim30(ReadingsVal($name,"enqueuedMetadata_Title","no title"))) : ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"currentTrack_Album","no title"))) : ReadingsVal($name,"state","");;\
my $nctitle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"nextTrack_Title","no title"))) : ReadingsVal($name,"state","");;\
my $nititle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"nextTrack_Artist","no artist"))) : ReadingsVal($name,"state","");;\
my $natitle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"nextTrack_Album","no album"))) : ReadingsVal($name,"state","");;\
my $duration = ReadingsVal($name,"state","") eq "PLAYING" ? ReadingsVal($name,"nextTrack_Duration","no duration") : ReadingsVal($name,"state","");;\
"<div style='float:left;;padding:10px;;'>\
<img src='$imgct' style='width:265px;;height:265px;;border-radius:5px;;'>\
</div>\
<div style='text-align:left;;float:left;;padding:10px;;width:300px;;height:265px;;'>\
<span>Titel:&nbsp$ctitle</span><br>\
<span>Interpret:&nbsp$ititle</span><br>\
<span>Album:&nbsp$atitle</span><br><br>\
<span>Nächster&nbspTitel:</span><br>\
<span>Titel:&nbsp$nctitle</span><br>\
<span>Interpret:&nbsp$nititle</span><br>\
<span>Album:&nbsp$natitle</span><br>\
<span>Dauer:&nbsp$duration</span><br><br>\
<div style='float: left;;padding-right:25px;;'>\
<img src='$imgnt' style='width:75px;;height:75px;;border-radius:3px;;'>\
</div>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage("rc_PREVIOUS")."</a>\
<a href=\"/fhem?cmd.dummy=set $name play&XHR=1\">".FW_makeImage("rc_PLAY")."</a>\
<a href=\"/fhem?cmd.dummy=set $name pause&XHR=1\">".FW_makeImage("rc_PAUSE")."</a>\
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage("rc_NEXT")."</a>\
</span><br>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage("rc_VOLDOWN")."</a>\
<a href=\"/fhem?cmd.dummy=set $name mute&XHR=1\">".FW_makeImage("rc_MUTE")."</a>\
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage("rc_VOLUP")."</a>\
<a href=\"/fhem?cmd.dummy=set $name stop&XHR=1\">".FW_makeImage("rc_STOP")."</a>\
</span>\
</div>"}
attr Test10 event-on-change-reading .*
attr Test10 icon audio_volume_low
attr Test10 jsonMap volume_Master:volume mute_Master:mute volume_LF:0 volume_RF:0 mute_LF:0 mute_RF:0 enqueuedMetadata_ItemId:0 enqueuedMetadata_ParentId:0 currentTrack_ItemId:0 currentTrack_ParentId:0 coordinatorUuid:0 transportState:state nextTrack_ItemId:0 nextTrack_ParentId:0
attr Test10 model sonos2mqtt_speaker
attr Test10 readingList sonos/status/unknown/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }\
  sonos/status/unknown/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }\
  sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr Test10 room Test,MQTT2_DEVICE
attr Test10 setList stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }\
  play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
  pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
  toggle:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "toggle" }\
  volumeUp:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumeup" }\
  volumeDown:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumedown" }\
  switchToQueue:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoqueue" }\
  switchToTv:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtotv" }\
  switchToLine:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoline" }\
  volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
  mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
  next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
  previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
  x_raw_payload:textField { my $payload = $EVENT;;$payload =~ s/$EVTPART0 //g;; qq(sonos/RINCON_000E58F7F67C01400/control $payload)}\
  joinGroup:textField sonos/RINCON_000E58F7F67C01400/control { "command": "joingroup",  "input": "$EVTPART1"}\
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_000E58F7F67C01400","groupName","all");; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "leavegroup",  "input": "$value" } ) }\
  setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
  notify:textField sonos/RINCON_000E58F7F67C01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}

setstate Test10 PLAYING
setstate Test10 2020-06-09 16:08:07 currentTrack_Album Batbox
setstate Test10 2020-06-09 16:35:45 currentTrack_AlbumArtUri https://cdn-profiles.tunein.com/s57109/images/logoq.png
setstate Test10 2020-06-09 16:35:45 currentTrack_Artist Cyndi Lauper
setstate Test10 2020-06-09 16:08:07 currentTrack_Duration 0:03:03
setstate Test10 2020-06-09 16:35:45 currentTrack_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate Test10 2020-06-09 16:35:45 currentTrack_Title Time after time
setstate Test10 2020-06-09 16:35:45 currentTrack_TrackUri x-rincon-mp3radio://http://hr-edge-204b.fra-lg.cdn.addradio.net/hr/hr3/live/mp3/128/stream.mp3?ar-distributor=f0a1
setstate Test10 2020-06-09 16:35:45 currentTrack_UpnpClass object.item
setstate Test10 2020-06-09 16:08:00 enqueuedMetadata_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test10 2020-06-09 16:35:45 enqueuedMetadata_AlbumArtUri https://cdn-profiles.tunein.com/s57109/images/logoq.png
setstate Test10 2020-06-09 16:08:00 enqueuedMetadata_Artist Johannes Ackner
setstate Test10 2020-06-09 16:35:45 enqueuedMetadata_Title 89.3 hr 3 Frankfurt
setstate Test10 2020-06-09 16:35:45 enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate Test10 2020-06-09 16:35:45 groupName Wohnzimmer
setstate Test10 2020-06-09 16:35:45 name Wohnzimmer
setstate Test10 2020-06-09 16:08:07 nextTrack_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test10 2020-06-09 16:08:07 nextTrack_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-file-cifs:%2f%2f192.168.188.26%2fOwnMusic%2fH%c3%b6rb%c3%bccher%2fDer%20Struwwelpeter.mp3&v=81
setstate Test10 2020-06-09 16:08:07 nextTrack_Artist Johannes Ackner
setstate Test10 2020-06-09 16:08:07 nextTrack_Duration 0:14:23
setstate Test10 2020-06-09 16:08:07 nextTrack_ProtocolInfo x-file-cifs:*:audio/mpeg:*
setstate Test10 2020-06-09 16:08:07 nextTrack_Title Der Struwwelpeter
setstate Test10 2020-06-09 16:08:07 nextTrack_TrackUri x-file-cifs://192.168.188.26/OwnMusic/Hörbücher/Der Struwwelpeter.mp3
setstate Test10 2020-06-09 16:08:07 nextTrack_UpnpClass object.item.audioItem.musicTrack
setstate Test10 2020-06-09 16:35:45 playmode NORMAL
setstate Test10 2020-06-09 16:35:45 state PLAYING
setstate Test10 2020-06-09 16:35:45 ts 1591713344697
setstate Test10 2020-06-09 16:35:45 uuid RINCON_000E58F7F67C01400
setstate Test10 2020-06-09 16:35:45 volume 8


Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 09 Juni 2020, 17:38:35
Sehr schön, an der Schönheit wird auch gearbeitet  :D

ich habe auch noch eine Idee: playUri in der setList
playUri:textField {fhem("sleep 1; set $NAME play"); qq(sonos/RINCON_347E5C82560801400/control { "command": "setavtransporturi",  "input": "$EVTPART1"})}
Wäre das ein Weg? Oder gibt es da was besseres?

ich habe viel probiert, in einer payload bekommt man das irgendwie nicht gebacken. Zwei Befehle hintereinander funktionieren. So in der Art.
set MQTT2_RINCON.*:FILTER=name=Arbeitszimmer setAVTUri [Titel:Deutschlandfunk_Kultur];set MQTT2_RINCON.*:FILTER=name=Arbeitszimmer play
Wie weit ist es legitim in der setList noch "allerlei" Perl Code auszuführen?

Damit würde man vielleicht auch den speak Befehl mit Text2Speech realisieren können? Da bin ich am Basteln.  8)

BTW: Unser holländischer Freund hat 3.0.6 released :) 👍
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 09 Juni 2020, 18:01:21
Zitat von: Otto123 am 09 Juni 2020, 17:38:35
Sehr schön, an der Schönheit wird auch gearbeitet  :D
Ermuntert dadurch, dass das mit der sub so toll klappt, habe ich mich mal durch die widgets gewühlt ;) . Kann aber noch falsch rum sein...:attr Test10 readingList [...]
  mute:iconSwitch,on,rc_MUTE,off,rc_VOLUP { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
[...]
attr Test10 webCmd mute
Zitatich habe auch noch eine Idee: playUri in der setList
[...]
Wie weit ist es legitim in der setList noch "allerlei" Perl Code auszuführen?
Ich war da bisher auch immer teils zögerlich, weil es tendenziell fehleranfällig ist. Andererseits bekommt man vermutlich nur so wirklich funktionale Geräte, und wenn man Module dafür bauen würde, würde man auch subs bauen usw..

Wenn es insgesamt zu viel wird, wäre ich eher geneigt, die ganzen "Longplayer" in eine myUtils auszulagern und die dann aus dem contrib zu holen, wenn man das (Basis-) attrTemplate anwendet. (Und da dann ggf. sogar packages zu definieren, auch, damit man am Aufruf leichter sieht, wo der Code eigentlich herkommt).

Je nachdem, wie viel da zusammenkommt, ist das hier vermutlich die "bessere" Lösung. (Ich fürchte auch, dass die User das viele "sichtbare Perl" teils "erschreckend finden". Andererseits: so hat man Gelegenheit, tatsächlich mal den Code zu sehen...)

ZitatBTW: Unser holländischer Freund hat 3.0.6 released
Scheint allen Beteiligten Spaß zu machen. (Auch wenn ich etwas irritiert bin, dass manche die Entwicklungsgeschwindigkeit@diesem attrTemplate als sehr schnell empfinden. Ist zwar im Detail etwas kniffelig, aber nichts revolutionär neues, wenn man von dem sehr komplexen devStateIcon von TomLee absieht... (ausdrücklich: Thumbs up!))
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 09 Juni 2020, 18:37:20
ZitatErmuntert dadurch, dass das mit der sub so toll klappt,

Enttäuschung  ;D, auf der Suche warum dein mute Befehl noch nicht klappt, hab ich folgendes im Log bemerkt:

2020.06.09 18:30:28 1: PERL WARNING: Subroutine trim30 redefined at (eval 11212) line 1.
2020.06.09 18:30:28 3: eval: my $name='1';my $state='1';my $type='1';{return undef; {sub trim30 { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...'; };
my $imgct = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");
my $imgnt = ReadingsVal($name,"nextTrack_AlbumArtUri","");
my $ctitle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"currentTrack_Title","no title"))) : ReadingsVal($name,"state","");
my $ititle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"currentTrack_Artist","no artist"))) : ReadingsVal($name,"state","");
my $atitle = ReadingsVal($name,"currentTrack_ProtocolInfo","") =~ ".*radio.*" ?
(trim30(ReadingsVal($name,"enqueuedMetadata_Title","no title"))) : ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"currentTrack_Album","no title"))) : ReadingsVal($name,"state","");
my $nctitle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"nextTrack_Title","no title"))) : ReadingsVal($name,"state","");
my $nititle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"nextTrack_Artist","no artist"))) : ReadingsVal($name,"state","");
my $natitle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"nextTrack_Album","no album"))) : ReadingsVal($name,"state","");
my $duration = ReadingsVal($name,"state","") eq "PLAYING" ? ReadingsVal($name,"nextTrack_Duration","no duration") : ReadingsVal($name,"state","");
"<div style='float:left;padding:10px;'>
<img src='$imgct' style='width:265px;height:265px;border-radius:5px;'>
</div>
<div style='text-align:left;float:left;padding:10px;width:300px;height:265px;'>
<span>Titel: $ctitle</span><br>
<span>Interpret: $ititle</span><br>
<span>Album: $atitle</span><br><br>
<span>Nächster Titel:</span><br>
<span>Titel: $nctitle</span><br>
<span>Interpret: $nititle</span><br>
<span>Album: $natitle</span><br>
<span>Dauer: $duration</span><br><br>
<div style='float: left;padding-right:25px;'>
<img src='$imgnt' style='width:75px;height:75px;border-radius:3px;'>
</div>
<span>
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage("rc_PREVIOUS")."</a>
<a href=\"/fhem?cmd.dummy=set $name play&XHR=1\">".FW_makeImage("rc_PLAY")."</a>
<a href=\"/fhem?cmd.dummy=set $name pause&XHR=1\">".FW_makeImage("rc_PAUSE")."</a>
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage("rc_NEXT")."</a>
</span><br>
<span>
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage("rc_VOLDOWN")."</a>
<a href=\"/fhem?cmd.dummy=set $name mute&XHR=1\">".FW_makeImage("rc_MUTE")."</a>
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage("rc_VOLUP")."</a>
<a href=\"/fhem?cmd.dummy=set $name stop&XHR=1\">".FW_makeImage("rc_STOP")."</a>
</span>
</div>"}}
2020.06.09 18:30:28 1: PERL WARNING: Subroutine trim30 redefined at (eval 11213) line 1.
2020.06.09 18:30:28 1: PERL WARNING: Subroutine trim30 redefined at (eval 11214) line 1.
2020.06.09 18:30:29 1: PERL WARNING: Subroutine trim30 redefined at (eval 11215) line 1.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 10 Juni 2020, 00:55:10
Der speak Befehl mit "Boardmitteln"

Voraussetzung: Samba installiert, Freigabe SonosSpeak auf /var/SonosSpeak.
Empfohlen: Paket mp3wrap für TTS installiert

Syntax (fast) wie "bisher": set Player speak <volume> text
Man nehme: 1 x Text2Speech, 
define SonosTTS Text2Speech none
attr SonosTTS TTS_CacheFileDir /var/SonosSpeak
attr SonosTTS TTS_UseMP3Wrap 1
attr SonosTTS userReadings cifsName {my $hostip=(split(' ', qx(hostname -I)))[0];my $lastFileName=ReadingsVal($name,"lastFilename","");$lastFileName=~s/\/var/x-file-cifs:\/\/$hostip/g;$lastFileName}
ein notify
define n_SonosSpeak notify SonosTTS:playing:.0 {fhem("set ".ReadingsVal($NAME,"Player","")." notify ".ReadingsVal($NAME,"volume","")." ".ReadingsVal($NAME,"cifsName",""))}
und eine Ergänzung setList beim Player
speak:textField { my $tts="SonosTTS";my $payload = $EVENT;$payload =~ s/$EVTPART0 $EVTPART1 //g; fhem("setreading $tts Player $NAME;setreading $tts volume $EVTPART1;set $tts tts $payload");"{}"}

Ich weiß - die Sprachauswahl -  :-X das bekommen wir sicher auch noch kompatibel :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 10 Juni 2020, 09:51:59
(moser) ...das mit Samba gefällt mir gar nicht. Hat mMn. auf einem FHEM-Server nicht wirklich was verloren (nur meine 2ct). Müßte doch auch linux-kompatibel mit den richtigen Rechten auf das Verzeichnis gehen?
Sonst: Cool!
Zitat von: TomLee am 09 Juni 2020, 18:37:20
Enttäuschung  ;D , auf der Suche warum dein mute Befehl noch nicht klappt, hab ich folgendes im Log bemerkt:
Falls uns wg. der sub nichts besseres einfällt, wäre die Frage, ob wir nicht wirklich Richtung myUtils gehen. Davor wäre evtl. noch zu checken, ob es nicht eine (generischere) Kürzungsfunktion irgendwo in den vorhandenen Perl-libs gibt? (who dunnit?)

Schade auch, dass das mit dem mute nicht auf Anhieb geklappt hat (ich habe das nur auf dem Testsystem ohne MQTT-Anbindung angesehen, und der optische Effekt war das, was m.E. zu erreichen sein sollte; sonst wäre die Frage, ob man das in devStateIcon mit einer 3. Tabellenspalte hinbekäme?).



Was anderes noch:
Jemand (wuppie68?) hatte hier mal eine readingList gepostet, in der auch die "set"-Zweige drin waren. Würde mich interessieren, warum.

Zum Hintergrund:
Ich halte das für falsch, kann aber noch nicht sagen, ob es ein Problem von sonos2mqtt ist, oder ob es ein Mißverständnis auf User-Seite ist.
Meine Erwartung - was Anweisungen angeht - ist die: Irgend ein Client sendet einen Befehl an den Broker, der gibt es (nur) an das eigentliche Ziel (hier: sonos2mqtt) weiter, der Client verarbeitet das und gibt dann eine Vollzugsmeldung an den Broker zurück, der verteilt es dann wieder an alle anderen Clients.

Falls das hier nicht so sein sollte, wäre das ein Design-Wunsch an @svrooij.

Zur Frage des "User-Mißverständnisses":
Wer "die Abkürzung" nimmt und seinen Client die Anweisung bereits als Ausführungsbestätigung behandeln läßt, bekommt nicht (gleich) den zutreffenden Status zurück. Deswegen sollte man mMn. bei mehr als FHEM als "weisungsbefugtem Client" jeweils alle "set" (oder cmnd)-Zweige direkt am IO abschneiden. Das ist z.B. der tiefere Sinn hinter dem attrTemplate "MQTT2_IO_ignoreRegexp_basic": Das verwirft alle "typischen" Shelly- und Tasmota-set-Anweisungen direkt am IO.

Falls dazu Fragen sind, bitte melden!

(Ich schreibe das erst mal hier, weil doch einige Multiplikatoren hier zu Gange sind; muß mal überlegen, wie ich das beizeiten ins Wiki bringe, bin aber nicht traurig, wenn jemand anderes das übernimmt...)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 10 Juni 2020, 10:01:59
ZitatMüßte doch auch linux-kompatibel mit den richtigen Rechten auf das Verzeichnis gehen?
Eventuell Deine Unkenntnis: der Sonosplayer muss ja die Datei erreichen/laden können die man ihm anbietet.
Zitat(moser) ...das mit Samba gefällt mir gar nicht.
ist aber quasi Standard bei dem bisherigen Sonos Modul.
UND: ich wollte auch umstellen/parallel betreiben. ;)

Für die Ausgabe von Sprachnachrichten gibt es sicher Alternativen.
Aber meines Wissens kann man über FHEMWEB keine Dateien ausliefern, bedeutet zusätzlicher HTPP Server auf dem FHEM Server? Klar kann man einen anderen smb Server im Netz nehmen - wenn man hat. Das ist was für die Zukunft. Man kann auch irgendwas anderes einbinden, Stephan bietet ja eine eigene TTS an.
Ist das alles schöner als Samba?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 10 Juni 2020, 10:08:47
minidlna?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 10 Juni 2020, 11:01:15
Zitat von: TomLee am 09 Juni 2020, 18:37:20
Enttäuschung  ;D , auf der Suche warum dein mute Befehl noch nicht klappt, hab ich folgendes im Log bemerkt:
Kannst du mal checken, ob das hier ohne Fehlermeldung läuft (ungetestet...):
attr Test10 devStateIcon { my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...';; };;\
my $imgct = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");;\
my $imgnt = ReadingsVal($name,"nextTrack_AlbumArtUri","");;\
my $ctitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Title","no title")) : ReadingsVal($name,"state","");;\
my $ititle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Artist","no artist")) : ReadingsVal($name,"state","");;\
my $atitle = ReadingsVal($name,"currentTrack_ProtocolInfo","") =~ ".*radio.*" ?\
$trim30->(ReadingsVal($name,"enqueuedMetadata_Title","no title")) : ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Album","no title")) : ReadingsVal($name,"state","");;\
my $nctitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Title","no title")) : ReadingsVal($name,"state","");;\
my $nititle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Artist","no artist")) : ReadingsVal($name,"state","");;\
my $natitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Album","no album")) : ReadingsVal($name,"state","");;\
my $duration = ReadingsVal($name,"state","") eq "PLAYING" ? ReadingsVal($name,"nextTrack_Duration","no duration") : ReadingsVal($name,"state","");;\
"<div style='float:left;;padding:10px;;'>\
<img src='$imgct' style='width:265px;;height:265px;;border-radius:5px;;'>\
</div>\
<div style='text-align:left;;float:left;;padding:10px;;width:300px;;height:265px;;'>\
<span>Titel:&nbsp$ctitle</span><br>\
<span>Interpret:&nbsp$ititle</span><br>\
<span>Album:&nbsp$atitle</span><br><br>\
<span>Nächster&nbspTitel:</span><br>\
<span>Titel:&nbsp$nctitle</span><br>\
<span>Interpret:&nbsp$nititle</span><br>\
<span>Album:&nbsp$natitle</span><br>\
<span>Dauer:&nbsp$duration</span><br><br>\
<div style='float: left;;padding-right:25px;;'>\
<img src='$imgnt' style='width:75px;;height:75px;;border-radius:3px;;'>\
</div>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage("rc_PREVIOUS")."</a>\
<a href=\"/fhem?cmd.dummy=set $name play&XHR=1\">".FW_makeImage("rc_PLAY")."</a>\
<a href=\"/fhem?cmd.dummy=set $name pause&XHR=1\">".FW_makeImage("rc_PAUSE")."</a>\
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage("rc_NEXT")."</a>\
</span><br>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage("rc_VOLDOWN")."</a>\
<a href=\"/fhem?cmd.dummy=set $name mute&XHR=1\">".FW_makeImage("rc_MUTE")."</a>\
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage("rc_VOLUP")."</a>\
<a href=\"/fhem?cmd.dummy=set $name stop&XHR=1\">".FW_makeImage("rc_STOP")."</a>\
</span>\
</div>"}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 10 Juni 2020, 11:30:42
Die Warnung kam immer beim aufrufen des Raumes in dem sich das Device befindet und der Detail-Ansicht des Device selbst.
Ich mein, nach kurzem testen, die Warnung kommt nicht mehr nach Änderung auf my $trim30 = sub
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 10 Juni 2020, 11:37:03
 :)

...dann bliebe jetzt noch das toggelnde Icon (bzw. zwei: play/pause und mute/unmute)...

Im Code sollte sich das mit 2*2 Variablen lösen lassen für $cmnd_pp/$icon_pp bzw. $cmnd_mute/$icon_mute?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 10 Juni 2020, 12:20:14
und der optische Effekt war das, was m.E. zu erreichen sein sollte;

ja der ist ja auch gegeben, s. Bild i. A, allerdings werden die Kommandos nicht ausgeführt und sind auch nicht falschrum wie man sieht.
Es passiert einfach nichts (mit verbose 5 am Server geprüft) beim betätigen des Icon.
Auch wird in der DeviceOverview kein Icon angezeigt mit webCmd mute, mit der alten Version mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) } schon.

Im Code sollte sich das mit 2*2 Variablen lösen lassen für $cmnd_pp/$icon_pp bzw. $cmnd_mute/$icon_mute?

Weiß ehrlich gesagt nicht auf was du aus bist, eventuell steh ich auch nur auf dem Schlauch und die Erleuchtung kommt erst etwas später.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 10 Juni 2020, 12:32:40
Das mit 2*2 Variablen war so gemeint, dass man statt zwei Einträgen (hier erst mal für play/pause)
<a href=\"/fhem?cmd.dummy=set $name play&XHR=1\">".FW_makeImage("rc_PLAY")."</a>\
<a href=\"/fhem?cmd.dummy=set $name pause&XHR=1\">".FW_makeImage("rc_PAUSE")."</a>\

nur einen schreibt:
<a href=\"/fhem?cmd.dummy=set $name $cmnd_pp&XHR=1\">".FW_makeImage($icon_pp)."</a>\
$cmnd_pp etc. muß dann eben vorher ermittelt werden ;) ...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 10 Juni 2020, 12:40:38
Welches Ziel haben wir denn jetzt überhaupt, die Kommandos aus devstateIcon nach webcmd verlagern oder beibehalten ?
Das man eine Lösung für beides findet schadet ja nicht, bin bloß irritiert, mal so mal so.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 10 Juni 2020, 13:41:11
...mir ist das im Prinzip egal; letztlich sollte es hübsch aussehen.

Meine _Vermutung_ wäre, dass es in webCmd eigentlich hübscher und einfacher wäre, weil man z.B. einen volume-Slider  dort einfacher darstellen könnte; dazu müßte aber das mit webCmd/webCmdLabel/cmdIcon irgendwie besser funktionieren. Tut es aber nicht, ich bekomme auch keine Events :o ...

Mal mein modifiziertes Test-Gerät:
defmod Test10 MQTT2_DEVICE RINCON_000E58F7F67C01400
attr Test10 IODev m2server
attr Test10 cmdIcon volumeUp:rc_VOLUP volumeDown:rc_VOLDOWN previous:rc_PREVIOUS next:rc_NEXT stop:rc_STOP
attr Test10 devStateIcon { my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...';; };;\
my $imgct = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");;\
my $imgnt = ReadingsVal($name,"nextTrack_AlbumArtUri","");;\
my $ctitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Title","no title")) : ReadingsVal($name,"state","");;\
my $ititle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Artist","no artist")) : ReadingsVal($name,"state","");;\
my $atitle = ReadingsVal($name,"currentTrack_ProtocolInfo","") =~ ".*radio.*" ?\
$trim30->(ReadingsVal($name,"enqueuedMetadata_Title","no title")) : ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Album","no title")) : ReadingsVal($name,"state","");;\
my $nctitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Title","no title")) : ReadingsVal($name,"state","");;\
my $nititle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Artist","no artist")) : ReadingsVal($name,"state","");;\
my $natitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Album","no album")) : ReadingsVal($name,"state","");;\
my $duration = ReadingsVal($name,"state","") eq "PLAYING" ? ReadingsVal($name,"nextTrack_Duration","no duration") : ReadingsVal($name,"state","");;\
"<div style='float:left;;padding:10px;;'>\
<img src='$imgct' style='width:265px;;height:265px;;border-radius:5px;;'>\
</div>\
<div style='text-align:left;;float:left;;padding:10px;;width:300px;;height:265px;;'>\
<span>Titel:&nbsp$ctitle</span><br>\
<span>Interpret:&nbsp$ititle</span><br>\
<span>Album:&nbsp$atitle</span><br><br>\
<span>Nächster&nbspTitel:</span><br>\
<span>Titel:&nbsp$nctitle</span><br>\
<span>Interpret:&nbsp$nititle</span><br>\
<span>Album:&nbsp$natitle</span><br>\
<span>Dauer:&nbsp$duration</span><br><br>\
<div style='float: left;;padding-right:25px;;'>\
<img src='$imgnt' style='width:75px;;height:75px;;border-radius:3px;;'>\
</div>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage("rc_PREVIOUS")."</a>\
<a href=\"/fhem?cmd.dummy=set $name play&XHR=1\">".FW_makeImage("rc_PLAY")."</a>\
<a href=\"/fhem?cmd.dummy=set $name pause&XHR=1\">".FW_makeImage("rc_PAUSE")."</a>\
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage("rc_NEXT")."</a>\
</span><br>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage("rc_VOLDOWN")."</a>\
<a href=\"/fhem?cmd.dummy=set $name mute&XHR=1\">".FW_makeImage("rc_MUTE")."</a>\
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage("rc_VOLUP")."</a>\
<a href=\"/fhem?cmd.dummy=set $name stop&XHR=1\">".FW_makeImage("rc_STOP")."</a>\
</span>\
</div>"}
attr Test10 event-on-change-reading .*
attr Test10 icon audio_volume_low
attr Test10 jsonMap volume_Master:volume mute_Master:mute volume_LF:0 volume_RF:0 mute_LF:0 mute_RF:0 enqueuedMetadata_ItemId:0 enqueuedMetadata_ParentId:0 currentTrack_ItemId:0 currentTrack_ParentId:0 coordinatorUuid:0 transportState:state nextTrack_ItemId:0 nextTrack_ParentId:0
attr Test10 model sonos2mqtt_speaker
attr Test10 readingList sonos/status/unknown/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }\
  sonos/status/unknown/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }\
  sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr Test10 room Test,MQTT2_DEVICE
attr Test10 setList stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }\
  play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
  pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
  toggle:iconSwitch,PLAYING,rc_PAUSE,PAUSED,rc_PLAY sonos/RINCON_000E58F7F67C01400/control { "command": "toggle" }\
  volumeUp:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumeup" }\
  volumeDown:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumedown" }\
  switchToQueue:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoqueue" }\
  switchToTv:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtotv" }\
  switchToLine:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoline" }\
  volume:colorpicker,BRI,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
  mute:iconSwitch,on,rc_MUTE,off,rc_VOLUP { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";;;; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
  next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
  previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
  x_raw_payload:textField { my $payload = $EVENT;;$payload =~ s/$EVTPART0 //g;; qq(sonos/RINCON_000E58F7F67C01400/control $payload)}\
  joinGroup:textField sonos/RINCON_000E58F7F67C01400/control { "command": "joingroup",  "input": "$EVTPART1"}\
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_000E58F7F67C01400","groupName","all");; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "leavegroup",  "input": "$value" } ) }\
  setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
  notify:textField sonos/RINCON_000E58F7F67C01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
attr Test10 setStateList play pause stop
attr Test10 webCmd volume:volumeDown:volumeUp:mute:pause:previous:next

setstate Test10 set_pause
setstate Test10 2020-06-09 16:08:07 currentTrack_Album Batbox
setstate Test10 2020-06-09 16:35:45 currentTrack_AlbumArtUri https://cdn-profiles.tunein.com/s57109/images/logoq.png
setstate Test10 2020-06-09 16:35:45 currentTrack_Artist Cyndi Lauper
setstate Test10 2020-06-09 16:08:07 currentTrack_Duration 0:03:03
setstate Test10 2020-06-09 16:35:45 currentTrack_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate Test10 2020-06-09 16:35:45 currentTrack_Title Time after time
setstate Test10 2020-06-09 16:35:45 currentTrack_TrackUri x-rincon-mp3radio://http://hr-edge-204b.fra-lg.cdn.addradio.net/hr/hr3/live/mp3/128/stream.mp3?ar-distributor=f0a1
setstate Test10 2020-06-09 16:35:45 currentTrack_UpnpClass object.item
setstate Test10 2020-06-09 16:08:00 enqueuedMetadata_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test10 2020-06-09 16:35:45 enqueuedMetadata_AlbumArtUri https://cdn-profiles.tunein.com/s57109/images/logoq.png
setstate Test10 2020-06-09 16:08:00 enqueuedMetadata_Artist Johannes Ackner
setstate Test10 2020-06-09 16:35:45 enqueuedMetadata_Title 89.3 hr 3 Frankfurt
setstate Test10 2020-06-09 16:35:45 enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate Test10 2020-06-09 16:35:45 groupName Wohnzimmer
setstate Test10 2020-06-10 13:07:26 mute set on
setstate Test10 2020-06-09 16:35:45 name Wohnzimmer
setstate Test10 2020-06-10 13:30:53 next set
setstate Test10 2020-06-09 16:08:07 nextTrack_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test10 2020-06-09 16:08:07 nextTrack_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-file-cifs:%2f%2f192.168.188.26%2fOwnMusic%2fH%c3%b6rb%c3%bccher%2fDer%20Struwwelpeter.mp3&v=81
setstate Test10 2020-06-09 16:08:07 nextTrack_Artist Johannes Ackner
setstate Test10 2020-06-09 16:08:07 nextTrack_Duration 0:14:23
setstate Test10 2020-06-09 16:08:07 nextTrack_ProtocolInfo x-file-cifs:*:audio/mpeg:*
setstate Test10 2020-06-09 16:08:07 nextTrack_Title Der Struwwelpeter
setstate Test10 2020-06-09 16:08:07 nextTrack_TrackUri x-file-cifs://192.168.188.26/OwnMusic/Hörbücher/Der Struwwelpeter.mp3
setstate Test10 2020-06-09 16:08:07 nextTrack_UpnpClass object.item.audioItem.musicTrack
setstate Test10 2020-06-09 16:35:45 playmode NORMAL
setstate Test10 2020-06-10 13:30:52 previous set
setstate Test10 2020-06-10 13:30:51 state set_pause
setstate Test10 2020-06-09 16:35:45 ts 1591713344697
setstate Test10 2020-06-09 16:35:45 uuid RINCON_000E58F7F67C01400
setstate Test10 2020-06-10 13:29:08 volume set 78
setstate Test10 2020-06-10 13:32:00 volumeDown set
setstate Test10 2020-06-10 13:32:02 volumeUp set

Strippe ich das runter auf
defmod Test10 MQTT2_DEVICE RINCON_000E58F7F67C01400
attr Test10 IODev m2server
attr Test10 devStateIcon { my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...';; };;\
my $imgct = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");;\
my $imgnt = ReadingsVal($name,"nextTrack_AlbumArtUri","");;\
my $ctitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Title","no title")) : ReadingsVal($name,"state","");;\
my $ititle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Artist","no artist")) : ReadingsVal($name,"state","");;\
my $atitle = ReadingsVal($name,"currentTrack_ProtocolInfo","") =~ ".*radio.*" ?\
$trim30->(ReadingsVal($name,"enqueuedMetadata_Title","no title")) : ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Album","no title")) : ReadingsVal($name,"state","");;\
my $nctitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Title","no title")) : ReadingsVal($name,"state","");;\
my $nititle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Artist","no artist")) : ReadingsVal($name,"state","");;\
my $natitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Album","no album")) : ReadingsVal($name,"state","");;\
my $duration = ReadingsVal($name,"state","") eq "PLAYING" ? ReadingsVal($name,"nextTrack_Duration","no duration") : ReadingsVal($name,"state","");;\
"<div style='float:left;;padding:10px;;'>\
<img src='$imgct' style='width:265px;;height:265px;;border-radius:5px;;'>\
</div>\
<div style='text-align:left;;float:left;;padding:10px;;width:300px;;height:265px;;'>\
<span>Titel:&nbsp$ctitle</span><br>\
<span>Interpret:&nbsp$ititle</span><br>\
<span>Album:&nbsp$atitle</span><br><br>\
<span>Nächster&nbspTitel:</span><br>\
<span>Titel:&nbsp$nctitle</span><br>\
<span>Interpret:&nbsp$nititle</span><br>\
<span>Album:&nbsp$natitle</span><br>\
<span>Dauer:&nbsp$duration</span><br><br>\
<div style='float: left;;padding-right:25px;;'>\
<img src='$imgnt' style='width:75px;;height:75px;;border-radius:3px;;'>\
</div>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage("rc_PREVIOUS")."</a>\
<a href=\"/fhem?cmd.dummy=set $name play&XHR=1\">".FW_makeImage("rc_PLAY")."</a>\
<a href=\"/fhem?cmd.dummy=set $name pause&XHR=1\">".FW_makeImage("rc_PAUSE")."</a>\
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage("rc_NEXT")."</a>\
</span><br>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage("rc_VOLDOWN")."</a>\
<a href=\"/fhem?cmd.dummy=set $name mute&XHR=1\">".FW_makeImage("rc_MUTE")."</a>\
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage("rc_VOLUP")."</a>\
<a href=\"/fhem?cmd.dummy=set $name stop&XHR=1\">".FW_makeImage("rc_STOP")."</a>\
</span>\
</div>"}
attr Test10 event-on-change-reading .*
attr Test10 icon audio_volume_low
attr Test10 jsonMap volume_Master:volume mute_Master:mute volume_LF:0 volume_RF:0 mute_LF:0 mute_RF:0 enqueuedMetadata_ItemId:0 enqueuedMetadata_ParentId:0 currentTrack_ItemId:0 currentTrack_ParentId:0 coordinatorUuid:0 transportState:state nextTrack_ItemId:0 nextTrack_ParentId:0
attr Test10 model sonos2mqtt_speaker
attr Test10 readingList sonos/status/unknown/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }\
  sonos/status/unknown/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }\
  sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr Test10 room Test,MQTT2_DEVICE
attr Test10 setList stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }\
  play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
  pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
  toggle:iconSwitch,PLAYING,rc_PAUSE,PAUSED,rc_PLAY sonos/RINCON_000E58F7F67C01400/control { "command": "toggle" }\
  volumeUp:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumeup" }\
  volumeDown:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumedown" }\
  switchToQueue:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoqueue" }\
  switchToTv:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtotv" }\
  switchToLine:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoline" }\
  volume:colorpicker,BRI,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
  mute:iconSwitch,on,rc_MUTE,off,rc_VOLUP { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";;;; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
  next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
  previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
  x_raw_payload:textField { my $payload = $EVENT;;$payload =~ s/$EVTPART0 //g;; qq(sonos/RINCON_000E58F7F67C01400/control $payload)}\
  joinGroup:textField sonos/RINCON_000E58F7F67C01400/control { "command": "joingroup",  "input": "$EVTPART1"}\
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_000E58F7F67C01400","groupName","all");; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "leavegroup",  "input": "$value" } ) }\
  setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
  notify:textField sonos/RINCON_000E58F7F67C01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
attr Test10 setStateList play pause stop
attr Test10 webCmd mute

setstate Test10 set_pause
setstate Test10 2020-06-09 16:08:07 currentTrack_Album Batbox
setstate Test10 2020-06-09 16:35:45 currentTrack_AlbumArtUri https://cdn-profiles.tunein.com/s57109/images/logoq.png
setstate Test10 2020-06-09 16:35:45 currentTrack_Artist Cyndi Lauper
setstate Test10 2020-06-09 16:08:07 currentTrack_Duration 0:03:03
setstate Test10 2020-06-09 16:35:45 currentTrack_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate Test10 2020-06-09 16:35:45 currentTrack_Title Time after time
setstate Test10 2020-06-09 16:35:45 currentTrack_TrackUri x-rincon-mp3radio://http://hr-edge-204b.fra-lg.cdn.addradio.net/hr/hr3/live/mp3/128/stream.mp3?ar-distributor=f0a1
setstate Test10 2020-06-09 16:35:45 currentTrack_UpnpClass object.item
setstate Test10 2020-06-09 16:08:00 enqueuedMetadata_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test10 2020-06-09 16:35:45 enqueuedMetadata_AlbumArtUri https://cdn-profiles.tunein.com/s57109/images/logoq.png
setstate Test10 2020-06-09 16:08:00 enqueuedMetadata_Artist Johannes Ackner
setstate Test10 2020-06-09 16:35:45 enqueuedMetadata_Title 89.3 hr 3 Frankfurt
setstate Test10 2020-06-09 16:35:45 enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate Test10 2020-06-09 16:35:45 groupName Wohnzimmer
setstate Test10 2020-06-10 13:37:55 mute on
setstate Test10 2020-06-09 16:35:45 name Wohnzimmer
setstate Test10 2020-06-10 13:30:53 next set
setstate Test10 2020-06-09 16:08:07 nextTrack_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test10 2020-06-09 16:08:07 nextTrack_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-file-cifs:%2f%2f192.168.188.26%2fOwnMusic%2fH%c3%b6rb%c3%bccher%2fDer%20Struwwelpeter.mp3&v=81
setstate Test10 2020-06-09 16:08:07 nextTrack_Artist Johannes Ackner
setstate Test10 2020-06-09 16:08:07 nextTrack_Duration 0:14:23
setstate Test10 2020-06-09 16:08:07 nextTrack_ProtocolInfo x-file-cifs:*:audio/mpeg:*
setstate Test10 2020-06-09 16:08:07 nextTrack_Title Der Struwwelpeter
setstate Test10 2020-06-09 16:08:07 nextTrack_TrackUri x-file-cifs://192.168.188.26/OwnMusic/Hörbücher/Der Struwwelpeter.mp3
setstate Test10 2020-06-09 16:08:07 nextTrack_UpnpClass object.item.audioItem.musicTrack
setstate Test10 2020-06-09 16:35:45 playmode NORMAL
setstate Test10 2020-06-10 13:30:52 previous set
setstate Test10 2020-06-10 13:30:51 state set_pause
setstate Test10 2020-06-09 16:35:45 ts 1591713344697
setstate Test10 2020-06-09 16:35:45 uuid RINCON_000E58F7F67C01400
setstate Test10 2020-06-10 13:29:08 volume set 78
setstate Test10 2020-06-10 13:32:00 volumeDown set
setstate Test10 2020-06-10 13:32:02 volumeUp set

und setze ein setreading Test10 mute on ab, kann ich das Ding gut am Web-IF toggeln - bis ich einen Browser-refresh machen...

(Nicht schön. Glaube, wir sollten lieber eine dritte eigene Spalte nach devStateIcon basteln und den Vol.-slider da irgendwie via Perl generieren, falls das geht; sonst eben nur volume in webCmd?)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 10 Juni 2020, 13:58:41
Cool, Pause/Play mute/unmute klappt in DevstateIcon.

Hab jetzt nicht nochmal geschaut, meine hatte ich schonmal, es gibt kein Pendant zu rc_MUTE !?
Habs erstmal mit einer Farbangabe gelöst  :P

defmod Test11 MQTT2_DEVICE RINCON_000E58F7F67C01400
attr Test11 IODev MQTT2_Server
attr Test11 devStateIcon {
my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...';; };;\
my $imgct = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");;\
my $imgnt = ReadingsVal($name,"nextTrack_AlbumArtUri","");;\
my $cmnd_pp = ReadingsVal($name,"state","") eq "PLAYING" ? "pause" : "play";;\
my $icon_pp = ReadingsVal($name,"state","") eq "PLAYING" ? "rc_PAUSE" : "rc_PLAY";;\
my $cmnd_mu = ReadingsVal($name,"mute","") eq "false" ? "mute on" : "mute off";;\
my $icon_mu = ReadingsVal($name,"mute","") eq "true" ? "rc_MUTE\@red" : "rc_MUTE\@green";;\
my $ctitle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"currentTrack_Title","no title"))) : ReadingsVal($name,"state","");;\
my $ititle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"currentTrack_Artist","no artist"))) : ReadingsVal($name,"state","");;\
my $atitle = ReadingsVal($name,"currentTrack_ProtocolInfo","") =~ ".*radio.*" ?\
(trim30(ReadingsVal($name,"enqueuedMetadata_Title","no title"))) : ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"currentTrack_Album","no title"))) : ReadingsVal($name,"state","");;\
my $nctitle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"nextTrack_Title","no title"))) : ReadingsVal($name,"state","");;\
my $nititle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"nextTrack_Artist","no artist"))) : ReadingsVal($name,"state","");;\
my $natitle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"nextTrack_Album","no album"))) : ReadingsVal($name,"state","");;\
my $duration = ReadingsVal($name,"state","") eq "PLAYING" ? ReadingsVal($name,"nextTrack_Duration","no duration") : ReadingsVal($name,"state","");;\
"<div style='float:left;;padding:10px;;'>\
<img src='$imgct' style='width:265px;;height:265px;;border-radius:5px;;'>\
</div>\
<div style='text-align:left;;float:left;;padding:10px;;width:300px;;height:265px;;'>\
<span>Titel:&nbsp$ctitle</span><br>\
<span>Interpret:&nbsp$ititle</span><br>\
<span>Album:&nbsp$atitle</span><br><br>\
<span>Nächster&nbspTitel:</span><br>\
<span>Titel:&nbsp$nctitle</span><br>\
<span>Interpret:&nbsp$nititle</span><br>\
<span>Album:&nbsp$natitle</span><br>\
<span>Dauer:&nbsp$duration</span><br><br>\
<div style='float: left;;padding-right:25px;;'>\
<img src='$imgnt' style='width:75px;;height:75px;;border-radius:3px;;'>\
</div>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage("rc_PREVIOUS")."</a>\
<a href=\"/fhem?cmd.dummy=set $name $cmnd_pp&XHR=1\">".FW_makeImage($icon_pp)."</a>\\
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage("rc_NEXT")."</a>\
<a href=\"/fhem?cmd.dummy=set $name stop&XHR=1\">".FW_makeImage("rc_STOP")."</a>\
</span><br>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage("rc_VOLDOWN")."</a>\
<a href=\"/fhem?cmd.dummy=set $name $cmnd_mu&XHR=1\">".FW_makeImage($icon_mu)."</a>\
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage("rc_VOLUP")."</a>\
</span>\
</div>"}
attr Test11 event-on-change-reading .*
attr Test11 icon audio_volume_low
attr Test11 jsonMap volume_Master:volume mute_Master:mute volume_LF:0 volume_RF:0 mute_LF:0 mute_RF:0 enqueuedMetadata_ItemId:0 enqueuedMetadata_ParentId:0 currentTrack_ItemId:0 currentTrack_ParentId:0 coordinatorUuid:0 transportState:state nextTrack_ItemId:0 nextTrack_ParentId:0
attr Test11 model sonos2mqtt_speaker
attr Test11 readingList sonos/status/unknown/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }\
  sonos/status/unknown/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }\
  sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr Test11 room Test,MQTT2_DEVICE
attr Test11 setList stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }\
  play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
  pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
  toggle:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "toggle" }\
  volumeUp:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumeup" }\
  volumeDown:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumedown" }\
  switchToQueue:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoqueue" }\
  switchToTv:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtotv" }\
  switchToLine:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoline" }\
  volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
  mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
  next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
  previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
  x_raw_payload:textField { my $payload = $EVENT;;$payload =~ s/$EVTPART0 //g;; qq(sonos/RINCON_000E58F7F67C01400/control $payload)}\
  joinGroup:textField sonos/RINCON_000E58F7F67C01400/control { "command": "joingroup",  "input": "$EVTPART1"}\
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_000E58F7F67C01400","groupName","all");; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "leavegroup",  "input": "$value" } ) }\
  setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
  notify:textField sonos/RINCON_000E58F7F67C01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}

setstate Test11 PLAYING
setstate Test11 2020-06-10 13:10:27 currentTrack_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test11 2020-06-10 13:49:53 currentTrack_AlbumArtUri https://cdn-profiles.tunein.com/s20293/images/logoq.png?t=1
setstate Test11 2020-06-10 13:49:53 currentTrack_Artist Ich wachte auf / Gilbert
setstate Test11 2020-06-10 13:10:27 currentTrack_Duration 0:14:23
setstate Test11 2020-06-10 13:49:53 currentTrack_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate Test11 2020-06-10 13:49:53 currentTrack_Title stream.mp3?ar-distributor=f0a1
setstate Test11 2020-06-10 13:49:53 currentTrack_TrackUri x-rincon-mp3radio://http://swr-edge-2028.dus-lg.cdn.addradio.net/swr/swr4/bw/mp3/128/stream.mp3?ar-distributor=f0a1
setstate Test11 2020-06-10 13:49:53 currentTrack_UpnpClass object.item
setstate Test11 2020-06-10 13:10:27 enqueuedMetadata_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test11 2020-06-10 13:49:53 enqueuedMetadata_AlbumArtUri https://cdn-profiles.tunein.com/s20293/images/logoq.png?t=1
setstate Test11 2020-06-10 13:10:27 enqueuedMetadata_Artist Johannes Ackner
setstate Test11 2020-06-10 13:49:53 enqueuedMetadata_Title 90.1 SWR4 Baden-Württemberg Stuttgart
setstate Test11 2020-06-10 13:49:53 enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate Test11 2020-06-10 13:49:53 groupName Wohnzimmer
setstate Test11 2020-06-10 13:49:53 mute true
setstate Test11 2020-06-10 13:49:53 name Wohnzimmer
setstate Test11 2020-06-10 13:10:27 nextTrack_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test11 2020-06-10 13:10:27 nextTrack_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-file-cifs:%2f%2f192.168.188.26%2fOwnMusic%2fH%c3%b6rb%c3%bccher%2fDer%20Struwwelpeter.mp3&v=81
setstate Test11 2020-06-10 13:10:27 nextTrack_Artist Johannes Ackner
setstate Test11 2020-06-10 13:10:27 nextTrack_Duration 0:14:23
setstate Test11 2020-06-10 13:10:27 nextTrack_ProtocolInfo x-file-cifs:*:audio/mpeg:*
setstate Test11 2020-06-10 13:10:27 nextTrack_Title Der Struwwelpeter
setstate Test11 2020-06-10 13:10:27 nextTrack_TrackUri x-file-cifs://192.168.188.26/OwnMusic/Hörbücher/Der Struwwelpeter.mp3
setstate Test11 2020-06-10 13:10:27 nextTrack_UpnpClass object.item.audioItem.musicTrack
setstate Test11 2020-06-10 13:49:53 playmode NORMAL
setstate Test11 2020-06-10 13:49:53 state PLAYING
setstate Test11 2020-06-10 13:49:53 ts 1591789793178
setstate Test11 2020-06-10 13:49:53 uuid RINCON_000E58F7F67C01400
setstate Test11 2020-06-10 13:34:07 volume 12


Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 10 Juni 2020, 14:07:09
...Farbe ist bäh...
(*lach*)
Im Ernst: aus der Stellung zwischen den beiden anderen ergibt sich eigentlich schon die Funktion. Wie wäre ein weiterer "rc_VOLDOWN" denn nicht irgendwie eleganter (ein "rc"-Speaker ohne Bogen wäre das Optimum...)?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 10 Juni 2020, 14:20:21
wie wärs mit neuen icons (rc_VOLPLUS/rc_VOLMINUS) für volume up/down und für mute rc_VOLDOWN/rc_MUTE  ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 10 Juni 2020, 16:15:31
Im Sonos-Modul gibts auch keinen Slider, sind zwei zusätzliche Custom-VolumeUP/DOWN-Kommando-Icons die die Lautstärke ><10+ stellen eventuell eine alternative zum Slider ? Die äußeren für +/- 5 die inneren für +/- 10+
Braucht man wieder ein unmute-Icon, wenn jemand frägt bekommen wir ja vlt. eines  :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: svrooij am 10 Juni 2020, 16:29:32
This question also might interest you, I'm looking for feedback:
https://github.com/svrooij/sonos2mqtt/issues/101

Google translate (sorry for my Deutsch):
Ich suche Feedback zu folgender Idee. Es geht darum, die Daten von Befehlen abzurufen
https://github.com/svrooij/sonos2mqtt/issues/101
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 10 Juni 2020, 16:35:29
Bin immer noch eher für den slider. Habe mich daher mal in FHEMWEB umgesehen, und irgendwie scheinen die Zeilen 3429f interessant zu sein.

Noch nicht funktional (ist erst mal einfach ein harter Wert hinterlegt), noch nicht schön, aber es wird ein slider angezeigt 8) (ich finde aber den normalen slider nicht optimal, weil der irgendwie "in der Luft" hängt und würde eher was aus colorpicker nehmen):
attr Test10 devStateIcon { my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...';; };;\
my $imgct = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");;\
my $imgnt = ReadingsVal($name,"nextTrack_AlbumArtUri","");;\
my $ctitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Title","no title")) : ReadingsVal($name,"state","");;\
my $ititle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Artist","no artist")) : ReadingsVal($name,"state","");;\
my $atitle = ReadingsVal($name,"currentTrack_ProtocolInfo","") =~ ".*radio.*" ?\
$trim30->(ReadingsVal($name,"enqueuedMetadata_Title","no title")) : ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Album","no title")) : ReadingsVal($name,"state","");;\
my $nctitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Title","no title")) : ReadingsVal($name,"state","");;\
my $nititle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Artist","no artist")) : ReadingsVal($name,"state","");;\
my $natitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Album","no album")) : ReadingsVal($name,"state","");;\
my $duration = ReadingsVal($name,"state","") eq "PLAYING" ? ReadingsVal($name,"nextTrack_Duration","no duration") : ReadingsVal($name,"state","");;\
"<div style='float:left;;padding:10px;;'>\
<img src='$imgct' style='width:265px;;height:265px;;border-radius:5px;;'>\
</div>\
<div style='text-align:left;;float:left;;padding:10px;;width:300px;;height:265px;;'>\
<span>Titel:&nbsp$ctitle</span><br>\
<span>Interpret:&nbsp$ititle</span><br>\
<span>Album:&nbsp$atitle</span><br><br>\
<span>Nächster&nbspTitel:</span><br>\
<span>Titel:&nbsp$nctitle</span><br>\
<span>Interpret:&nbsp$nititle</span><br>\
<span>Album:&nbsp$natitle</span><br>\
<span>Dauer:&nbsp$duration</span><br><br>\
<div style='float: left;;padding-right:25px;;'>\
<img src='$imgnt' style='width:75px;;height:75px;;border-radius:3px;;'>\
</div>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage("rc_PREVIOUS")."</a>\
<a href=\"/fhem?cmd.dummy=set $name play&XHR=1\">".FW_makeImage("rc_PLAY")."</a>\
<a href=\"/fhem?cmd.dummy=set $name pause&XHR=1\">".FW_makeImage("rc_PAUSE")."</a>\
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage("rc_NEXT")."</a>\
</span><br>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage("rc_VOLDOWN")."</a>\
<a href=\"/fhem?cmd.dummy=set $name mute&XHR=1\">".FW_makeImage("rc_MUTE")."</a>\
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage("rc_VOLUP")."</a>\
<a href=\"/fhem?cmd.dummy=set $name stop&XHR=1\">".FW_makeImage("rc_STOP")."</a>\
</span>\
<span>\
<td><div class='fhemWidget' cmd='volume' reading='volume' dev='$name' arg='slider,0,1,100' current='10'></div></td>\
</span>\
</div>"}

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 10 Juni 2020, 16:42:32
Zitat von: svrooij am 10 Juni 2020, 16:29:32
This question also might interest you, I'm looking for feedback:
https://github.com/svrooij/sonos2mqtt/issues/101 (https://github.com/svrooij/sonos2mqtt/issues/101)

To be honest, I'm not able to really answer your question due to the lack of any sonos hardware, otherwise I'd answer @ github. In General, I tend to recommend to use not to deeply nested JSON structures, so variant 2 might be the better choice wrt to FHEM. But perhaps with deeper knowledge when this type of message is generated I'd state the opposite...

In general, FHEM is rather flexible wrt. to dealing with whatever message structure a device uses. So to some extend it's just the question how long mapping names have to be and so on :) .
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 10 Juni 2020, 17:52:35
Bin irritiert, auf meinem normalen System,mit der letzten Definition von oben wird kein devstateicon angezeigt, es läuft kein s2m aber die Readings hab ich ja durch das RAW, im Log steht hier jetzt:


2020.06.10 17:45:11 1: devStateIcon Test11: Undefined subroutine &main::trim30 called at (eval 29167031) line 8.

defmod Test11 MQTT2_DEVICE RINCON_000E58F7F67C01400
attr Test11 IODev MQTT2_Server
attr Test11 devStateIcon {my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...';; };;\
my $imgct = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");;\
my $imgnt = ReadingsVal($name,"nextTrack_AlbumArtUri","");;\
my $cmnd_pp = ReadingsVal($name,"state","") eq "PLAYING" ? "pause" : "play";;\
my $icon_pp = ReadingsVal($name,"state","") eq "PLAYING" ? "rc_PAUSE" : "rc_PLAY";;\
my $cmnd_mu = ReadingsVal($name,"mute","") eq "false" ? "mute on" : "mute off";;\
my $icon_mu = ReadingsVal($name,"mute","") eq "true" ? "rc_MUTE\@red" : "rc_MUTE\@green";;\
my $ctitle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"currentTrack_Title","no title"))) : ReadingsVal($name,"state","");;\
my $ititle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"currentTrack_Artist","no artist"))) : ReadingsVal($name,"state","");;\
my $atitle = ReadingsVal($name,"currentTrack_ProtocolInfo","") =~ ".*radio.*" ?\
(trim30(ReadingsVal($name,"enqueuedMetadata_Title","no title"))) : ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"currentTrack_Album","no title"))) : ReadingsVal($name,"state","");;\
my $nctitle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"nextTrack_Title","no title"))) : ReadingsVal($name,"state","");;\
my $nititle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"nextTrack_Artist","no artist"))) : ReadingsVal($name,"state","");;\
my $natitle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"nextTrack_Album","no album"))) : ReadingsVal($name,"state","");;\
my $duration = ReadingsVal($name,"state","") eq "PLAYING" ? ReadingsVal($name,"nextTrack_Duration","no duration") : ReadingsVal($name,"state","");;\
"<div style='float:left;;padding:10px;;'>\
<img src='$imgct' style='width:265px;;height:265px;;border-radius:5px;;'>\
</div>\
<div style='text-align:left;;float:left;;padding:10px;;width:300px;;height:265px;;'>\
<span>Titel:&nbsp$ctitle</span><br>\
<span>Interpret:&nbsp$ititle</span><br>\
<span>Album:&nbsp$atitle</span><br><br>\
<span>Nächster&nbspTitel:</span><br>\
<span>Titel:&nbsp$nctitle</span><br>\
<span>Interpret:&nbsp$nititle</span><br>\
<span>Album:&nbsp$natitle</span><br>\
<span>Dauer:&nbsp$duration</span><br><br>\
<div style='float: left;;padding-right:25px;;'>\
<img src='$imgnt' style='width:75px;;height:75px;;border-radius:3px;;'>\
</div>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage("rc_PREVIOUS")."</a>\
<a href=\"/fhem?cmd.dummy=set $name $cmnd_pp&XHR=1\">".FW_makeImage($icon_pp)."</a>\\
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage("rc_NEXT")."</a>\
<a href=\"/fhem?cmd.dummy=set $name stop&XHR=1\">".FW_makeImage("rc_STOP")."</a>\
</span><br>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage("rc_VOLDOWN")."</a>\
<a href=\"/fhem?cmd.dummy=set $name $cmnd_mu&XHR=1\">".FW_makeImage($icon_mu)."</a>\
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage("rc_VOLUP")."</a>\
</span>\
</div>"}
attr Test11 event-on-change-reading .*
attr Test11 icon audio_volume_low
attr Test11 jsonMap volume_Master:volume mute_Master:mute volume_LF:0 volume_RF:0 mute_LF:0 mute_RF:0 enqueuedMetadata_ItemId:0 enqueuedMetadata_ParentId:0 currentTrack_ItemId:0 currentTrack_ParentId:0 coordinatorUuid:0 transportState:state nextTrack_ItemId:0 nextTrack_ParentId:0
attr Test11 model sonos2mqtt_speaker
attr Test11 readingList sonos/status/unknown/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }\
  sonos/status/unknown/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }\
  sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr Test11 room Test,MQTT2_DEVICE
attr Test11 setList stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }\
  play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
  pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
  toggle:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "toggle" }\
  volumeUp:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumeup" }\
  volumeDown:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumedown" }\
  switchToQueue:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoqueue" }\
  switchToTv:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtotv" }\
  switchToLine:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoline" }\
  volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
  mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
  next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
  previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
  x_raw_payload:textField { my $payload = $EVENT;;$payload =~ s/$EVTPART0 //g;; qq(sonos/RINCON_000E58F7F67C01400/control $payload)}\
  joinGroup:textField sonos/RINCON_000E58F7F67C01400/control { "command": "joingroup",  "input": "$EVTPART1"}\
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_000E58F7F67C01400","groupName","all");; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "leavegroup",  "input": "$value" } ) }\
  setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
  notify:textField sonos/RINCON_000E58F7F67C01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}

setstate Test11 PLAYING
setstate Test11 2020-06-10 13:10:27 currentTrack_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test11 2020-06-10 13:49:53 currentTrack_AlbumArtUri https://cdn-profiles.tunein.com/s20293/images/logoq.png?t=1
setstate Test11 2020-06-10 13:49:53 currentTrack_Artist Ich wachte auf / Gilbert
setstate Test11 2020-06-10 13:10:27 currentTrack_Duration 0:14:23
setstate Test11 2020-06-10 13:49:53 currentTrack_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate Test11 2020-06-10 13:49:53 currentTrack_Title stream.mp3?ar-distributor=f0a1
setstate Test11 2020-06-10 13:49:53 currentTrack_TrackUri x-rincon-mp3radio://http://swr-edge-2028.dus-lg.cdn.addradio.net/swr/swr4/bw/mp3/128/stream.mp3?ar-distributor=f0a1
setstate Test11 2020-06-10 13:49:53 currentTrack_UpnpClass object.item
setstate Test11 2020-06-10 13:10:27 enqueuedMetadata_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test11 2020-06-10 13:49:53 enqueuedMetadata_AlbumArtUri https://cdn-profiles.tunein.com/s20293/images/logoq.png?t=1
setstate Test11 2020-06-10 13:10:27 enqueuedMetadata_Artist Johannes Ackner
setstate Test11 2020-06-10 13:49:53 enqueuedMetadata_Title 90.1 SWR4 Baden-Württemberg Stuttgart
setstate Test11 2020-06-10 13:49:53 enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate Test11 2020-06-10 13:49:53 groupName Wohnzimmer
setstate Test11 2020-06-10 13:49:53 mute true
setstate Test11 2020-06-10 13:49:53 name Wohnzimmer
setstate Test11 2020-06-10 13:10:27 nextTrack_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test11 2020-06-10 13:10:27 nextTrack_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-file-cifs:%2f%2f192.168.188.26%2fOwnMusic%2fH%c3%b6rb%c3%bccher%2fDer%20Struwwelpeter.mp3&v=81
setstate Test11 2020-06-10 13:10:27 nextTrack_Artist Johannes Ackner
setstate Test11 2020-06-10 13:10:27 nextTrack_Duration 0:14:23
setstate Test11 2020-06-10 13:10:27 nextTrack_ProtocolInfo x-file-cifs:*:audio/mpeg:*
setstate Test11 2020-06-10 13:10:27 nextTrack_Title Der Struwwelpeter
setstate Test11 2020-06-10 13:10:27 nextTrack_TrackUri x-file-cifs://192.168.188.26/OwnMusic/Hörbücher/Der Struwwelpeter.mp3
setstate Test11 2020-06-10 13:10:27 nextTrack_UpnpClass object.item.audioItem.musicTrack
setstate Test11 2020-06-10 13:49:53 playmode NORMAL
setstate Test11 2020-06-10 13:49:53 state PLAYING
setstate Test11 2020-06-10 13:49:53 ts 1591789793178
setstate Test11 2020-06-10 13:49:53 uuid RINCON_000E58F7F67C01400
setstate Test11 2020-06-10 13:34:07 volume 12


Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 10 Juni 2020, 22:17:55
Zitat von: Beta-User am 10 Juni 2020, 10:08:47
minidlna?
Du findest immer neue Aufgaben.  ;)
Also: Ich mach mal noch das Setup fertig (als Beschreibung) vielleicht hüpft noch jemand auf die Testphase auf.
Dann fahr ich erstmal gemütlich den Oder-Neiße Radweg von Zittau nach Ahlbeck - und wenn ich mich dann noch an alles erinnere schau ich mir minidlna an. Ich bin auch nicht böse wenn einer "die Schublade aufzieht" :) und mir sagt was zu tun ist.

Stephan überlegt jetzt wie er die get's verarbeitet :) wie ich ihn jetzt einschätze, haben wir in Kürze die Möglichkeit jede Menge Informationen von den Playern und die Response auf unsere set's zu bekommen.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 11 Juni 2020, 05:53:32
Zitat von: Otto123 am 10 Juni 2020, 22:17:55
Du findest immer neue Aufgaben.  ;)
...immer wieder gerne...
Zitat
Also: Ich mach mal noch das Setup fertig (als Beschreibung) vielleicht hüpft noch jemand auf die Testphase auf.
Dann fahr ich erstmal gemütlich den Oder-Neiße Radweg von Zittau nach Ahlbeck - und wenn ich mich dann noch an alles erinnere schau ich mir minidlna an. Ich bin auch nicht böse wenn einer "die Schublade aufzieht" :) und mir sagt was zu tun ist.
Dann erst mal viel Freude am Radeln (hier regnet es, nur Fr. soll gut werden...)!

minidlna (oder neuerdings ReadyMedia) ist schnell eingerichtet: Das (und die Abhängigkeiten) installieren, das Medienverzeichnis in der minidlna.conf angeben, den Dienst neu starten, fertig die Laube... Damit stehen die Mediendateien (oder nut Audio, Video oder Bilder) jedem upnp-fähigen "Lesern" im Netzwerk zur Verfügung, und sollten eigentlich auch von einer Sonos-Box ohne weiteres abgespielt werden können.

Dauert keine 10 Minuten (also wesentlich kürzer als die Einarbeitung in samba!), ich kann nur nicht sagen, wie unsicher das ist (das Binding an eine bestimmte Hardwareschnittstelle scheint "kaputt" zu sein, sonst was wenig dazu zu finden, der Dienst selbst ist aber sehr verbreitet).
ZitatStephan überlegt jetzt wie er die get's verarbeitet :) wie ich ihn jetzt einschätze, haben wir in Kürze die Möglichkeit jede Menge Informationen von den Playern und die Response auf unsere set's zu bekommen.
Das klingt gut!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 11 Juni 2020, 10:10:55
ZitatBin irritiert, auf meinem normalen System,mit der letzten Definition von oben wird kein devstateicon angezeigt, es läuft kein s2m aber die Readings hab ich ja durch das RAW, im Log steht hier jetzt:

Wenn ich die Definition einmal zu sub trim30 ändere und dann wieder zurück auf sub trim30 gehts.



Allerdings hab ich jetzt festgestellt das das devstateIcon mit my $trim30 = sub nur bis zu einem Neustart von FHEM (ohne Warnungen im Log) angezeigt wird, danach nicht mehr, auf beiden Systemen.

Nach dem Neustart wird direkt, ohne das Device selbst aufgerufen zu haben und immer wenn man es in FHEMWEB aufruft, folgendes ins Log geschrieben:

2020.06.11 09:47:14 1: devStateIcon Test11: Undefined subroutine &main::trim30 called at (eval 348) line 8.


Mit sub trim30 wird devstateIcon immer angezeigt auf beiden Systemen, allerdings halt mit der bekannten Warnung wenn man den Raum der Definition oder das Device selbst aufruft.

2020.06.11 09:39:18 1: PERL WARNING: Subroutine trim30 redefined at (eval 893) line 1.

Das ist auf dem Test und Hauptsystem so.

Hab ich in einem Raum zwei Definitionen eine mit my $trim30 = sub und eine mit sub trim30 werden beide devstateIcon nach einem Neustart angezeigt  ;D , im Log steht die Warnung zu sub trim30

2020.06.11 10:00:04 1: PERL WARNING: Subroutine trim30 redefined at (eval 95) line 1.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 11 Juni 2020, 10:58:23
Zeige bitte den vollständigen code. Vorab bitte Zeile 8 ansehen ;) .
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 11 Juni 2020, 11:05:19
Zeile 8 sagt mir erstmal nix.

defmod Test11 MQTT2_DEVICE RINCON_000E58F7F67C01400
attr Test11 IODev MQTT2_Server
attr Test11 devStateIcon { my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...';; };;\
my $imgct = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");;\
my $imgnt = ReadingsVal($name,"nextTrack_AlbumArtUri","");;\
my $cmnd_pp = ReadingsVal($name,"state","") eq "PLAYING" ? "pause" : "play";;\
my $icon_pp = ReadingsVal($name,"state","") eq "PLAYING" ? "rc_PAUSE" : "rc_PLAY";;\
my $cmnd_mu = ReadingsVal($name,"mute","") eq "false" ? "mute on" : "mute off";;\
my $icon_mu = ReadingsVal($name,"mute","") eq "true" ? "rc_MUTE\@red" : "rc_MUTE\@green";;\
my $ctitle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"currentTrack_Title","no title"))) : ReadingsVal($name,"state","");;\
my $ititle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"currentTrack_Artist","no artist"))) : ReadingsVal($name,"state","");;\
my $atitle = ReadingsVal($name,"currentTrack_ProtocolInfo","") =~ ".*radio.*" ?\
(trim30(ReadingsVal($name,"enqueuedMetadata_Title","no title"))) : ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"currentTrack_Album","no title"))) : ReadingsVal($name,"state","");;\
my $nctitle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"nextTrack_Title","no title"))) : ReadingsVal($name,"state","");;\
my $nititle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"nextTrack_Artist","no artist"))) : ReadingsVal($name,"state","");;\
my $natitle = ReadingsVal($name,"state","") eq "PLAYING" ? (trim30(ReadingsVal($name,"nextTrack_Album","no album"))) : ReadingsVal($name,"state","");;\
my $duration = ReadingsVal($name,"state","") eq "PLAYING" ? ReadingsVal($name,"nextTrack_Duration","no duration") : ReadingsVal($name,"state","");;\
"<div style='float:left;;padding:10px;;'>\
<img src='$imgct' style='width:265px;;height:265px;;border-radius:5px;;'>\
</div>\
<div style='text-align:left;;float:left;;padding:10px;;width:300px;;height:265px;;'>\
<span>Titel:&nbsp$ctitle</span><br>\
<span>Interpret:&nbsp$ititle</span><br>\
<span>Album:&nbsp$atitle</span><br><br>\
<span>Nächster&nbspTitel:</span><br>\
<span>Titel:&nbsp$nctitle</span><br>\
<span>Interpret:&nbsp$nititle</span><br>\
<span>Album:&nbsp$natitle</span><br>\
<span>Dauer:&nbsp$duration</span><br><br>\
<div style='float: left;;padding-right:25px;;'>\
<img src='$imgnt' style='width:75px;;height:75px;;border-radius:3px;;'>\
</div>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage("rc_PREVIOUS")."</a>\
<a href=\"/fhem?cmd.dummy=set $name $cmnd_pp&XHR=1\">".FW_makeImage($icon_pp)."</a>\
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage("rc_NEXT")."</a>\
<a href=\"/fhem?cmd.dummy=set $name stop&XHR=1\">".FW_makeImage("rc_STOP")."</a>\
</span><br>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage("rc_VOLDOWN")."</a>\
<a href=\"/fhem?cmd.dummy=set $name $cmnd_mu&XHR=1\">".FW_makeImage($icon_mu)."</a>\
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage("rc_VOLUP")."</a>\
</span>\
<div class='fhemWidget' cmd='volume' reading='volume' dev='$name' arg='slider,0,1,100' current='10'></div></td>\\
</div>"}
attr Test11 event-on-change-reading .*
attr Test11 icon audio_volume_low
attr Test11 jsonMap volume_Master:volume mute_Master:mute volume_LF:0 volume_RF:0 mute_LF:0 mute_RF:0 enqueuedMetadata_ItemId:0 enqueuedMetadata_ParentId:0 currentTrack_ItemId:0 currentTrack_ParentId:0 coordinatorUuid:0 transportState:state nextTrack_ItemId:0 nextTrack_ParentId:0
attr Test11 model sonos2mqtt_speaker
attr Test11 readingList sonos/status/unknown/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }\
  sonos/status/unknown/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }\
  sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr Test11 room Test,MQTT2_DEVICE
attr Test11 setList stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }\
  play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
  pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
  toggle:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "toggle" }\
  volumeUp:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumeup" }\
  volumeDown:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumedown" }\
  switchToQueue:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoqueue" }\
  switchToTv:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtotv" }\
  switchToLine:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoline" }\
  volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
  mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
  next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
  previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
  x_raw_payload:textField { my $payload = $EVENT;;$payload =~ s/$EVTPART0 //g;; qq(sonos/RINCON_000E58F7F67C01400/control $payload)}\
  joinGroup:textField sonos/RINCON_000E58F7F67C01400/control { "command": "joingroup",  "input": "$EVTPART1"}\
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_000E58F7F67C01400","groupName","all");; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "leavegroup",  "input": "$value" } ) }\
  setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
  notify:textField sonos/RINCON_000E58F7F67C01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
attr Test11 webCmd mute

setstate Test11 PLAYING
setstate Test11 2020-06-11 10:58:31 currentTrack_Album Sprachdurchsagen
setstate Test11 2020-06-11 10:58:32 currentTrack_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-rincon-mp3radio:%2f%2fhttp:%2f%2fopml.radiotime.com%2fTune.ashx%3fid%3de125649567%26sid%3ds20293%26formats%3daac,mp3,hls%26partnerId%3drjyYMwEH%26serial%3dAHFLNOA3T2XT6VWH2BAPMLPWOGLA&v=81
setstate Test11 2020-06-11 11:03:07 currentTrack_Artist Alle Stau
setstate Test11 2020-06-11 10:58:31 currentTrack_Duration 0:00:01
setstate Test11 2020-06-11 11:03:07 currentTrack_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate Test11 2020-06-11 11:03:07 currentTrack_Title Infos auch unter swr4.de und in der SWR4 App
setstate Test11 2020-06-11 11:03:07 currentTrack_TrackUri x-rincon-mp3radio://http://swr-edge-2028.dus-lg.cdn.addradio.net/swr/swr4/bw/mp3/128/stream.mp3?ar-distributor=f0a1
setstate Test11 2020-06-11 11:03:07 currentTrack_UpnpClass object.item
setstate Test11 2020-06-10 13:10:27 enqueuedMetadata_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test11 2020-06-11 10:18:07 enqueuedMetadata_AlbumArtUri https://cdn-profiles.tunein.com/s20293/images/logoq.png?t=1
setstate Test11 2020-06-10 13:10:27 enqueuedMetadata_Artist Johannes Ackner
setstate Test11 2020-06-11 11:03:07 enqueuedMetadata_Title
setstate Test11 2020-06-11 10:58:31 enqueuedMetadata_UpnpClass object.item.audioItem.musicTrack
setstate Test11 2020-06-11 11:03:07 groupName Wohnzimmer
setstate Test11 2020-06-11 09:09:10 mute false
setstate Test11 2020-06-11 11:03:07 name Wohnzimmer
setstate Test11 2020-06-10 13:10:27 nextTrack_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test11 2020-06-10 13:10:27 nextTrack_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-file-cifs:%2f%2f192.168.188.26%2fOwnMusic%2fH%c3%b6rb%c3%bccher%2fDer%20Struwwelpeter.mp3&v=81
setstate Test11 2020-06-10 13:10:27 nextTrack_Artist Johannes Ackner
setstate Test11 2020-06-10 13:10:27 nextTrack_Duration 0:14:23
setstate Test11 2020-06-10 13:10:27 nextTrack_ProtocolInfo x-file-cifs:*:audio/mpeg:*
setstate Test11 2020-06-10 13:10:27 nextTrack_Title Der Struwwelpeter
setstate Test11 2020-06-10 13:10:27 nextTrack_TrackUri x-file-cifs://192.168.188.26/OwnMusic/Hörbücher/Der Struwwelpeter.mp3
setstate Test11 2020-06-10 13:10:27 nextTrack_UpnpClass object.item.audioItem.musicTrack
setstate Test11 2020-06-11 11:03:07 playmode NORMAL
setstate Test11 2020-06-11 11:03:07 state PLAYING
setstate Test11 2020-06-11 11:03:07 ts 1591866187232
setstate Test11 2020-06-11 11:03:07 uuid RINCON_000E58F7F67C01400
setstate Test11 2020-06-11 11:03:07 volume 6


Du musst doch das gleiche Verhalten haben, auf meinem Hauptsystem läuft auch kein s2m ?

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 11 Juni 2020, 11:15:55
Ab Zeile 8 in devStateIcon war der Aufruf noch in Form des benannten sub-Aufrufs. Das muß anders aussehen. (Jetzt) ungetestet:
attr Test11 devStateIcon { my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...';; };;\
my $imgct = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");;\
my $imgnt = ReadingsVal($name,"nextTrack_AlbumArtUri","");;\
my $cmnd_pp = ReadingsVal($name,"state","") eq "PLAYING" ? "pause" : "play";;\
my $icon_pp = ReadingsVal($name,"state","") eq "PLAYING" ? "rc_PAUSE" : "rc_PLAY";;\
my $cmnd_mu = ReadingsVal($name,"mute","") eq "false" ? "mute on" : "mute off";;\
my $icon_mu = ReadingsVal($name,"mute","") eq "true" ? "rc_MUTE\@red" : "rc_MUTE\@green";;\
my $ctitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Title","no title")) : ReadingsVal($name,"state","");;\
my $ititle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Artist","no artist")) : ReadingsVal($name,"state","");;\
my $atitle = ReadingsVal($name,"currentTrack_ProtocolInfo","") =~ ".*radio.*" ?\
$trim30->(ReadingsVal($name,"enqueuedMetadata_Title","no title")) : ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Album","no title")) : ReadingsVal($name,"state","");;\
my $nctitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Title","no title")) : ReadingsVal($name,"state","");;\
my $nititle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Artist","no artist")) : ReadingsVal($name,"state","");;\
my $natitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Album","no album")) : ReadingsVal($name,"state","");;\
my $duration = ReadingsVal($name,"state","") eq "PLAYING" ? ReadingsVal($name,"nextTrack_Duration","no duration") : ReadingsVal($name,"state","");;\
"<div style='float:left;;padding:10px;;'>\
<img src='$imgct' style='width:265px;;height:265px;;border-radius:5px;;'>\
</div>\
<div style='text-align:left;;float:left;;padding:10px;;width:300px;;height:265px;;'>\
<span>Titel:&nbsp$ctitle</span><br>\
<span>Interpret:&nbsp$ititle</span><br>\
<span>Album:&nbsp$atitle</span><br><br>\
<span>Nächster&nbspTitel:</span><br>\
<span>Titel:&nbsp$nctitle</span><br>\
<span>Interpret:&nbsp$nititle</span><br>\
<span>Album:&nbsp$natitle</span><br>\
<span>Dauer:&nbsp$duration</span><br><br>\
<div style='float: left;;padding-right:25px;;'>\
<img src='$imgnt' style='width:75px;;height:75px;;border-radius:3px;;'>\
</div>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage("rc_PREVIOUS")."</a>\
<a href=\"/fhem?cmd.dummy=set $name $cmnd_pp&XHR=1\">".FW_makeImage($icon_pp)."</a>\
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage("rc_NEXT")."</a>\
<a href=\"/fhem?cmd.dummy=set $name stop&XHR=1\">".FW_makeImage("rc_STOP")."</a>\
</span><br>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage("rc_VOLDOWN")."</a>\
<a href=\"/fhem?cmd.dummy=set $name $cmnd_mu&XHR=1\">".FW_makeImage($icon_mu)."</a>\
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage("rc_VOLUP")."</a>\
</span>\
<div class='fhemWidget' cmd='volume' reading='volume' dev='$name' arg='slider,0,1,100' current='10'></div></td>\\
</div>"}


Zeile 8 neu:
my $ctitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Title","no title")) : ReadingsVal($name,"state","");;\
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 11 Juni 2020, 12:08:28
Super, Danke.

Keine Warnungen mehr im Log nach Neustart und aufrufen des Devices  :)

Hier nochmal die Definition weil die vorhergehende noch mit Farbe bei mute war:

defmod Test11 MQTT2_DEVICE RINCON_000E58F7F67C01400
attr Test11 IODev MQTT2_Server
attr Test11 devStateIcon { my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...';; };;\
my $imgct = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");;\
my $imgnt = ReadingsVal($name,"nextTrack_AlbumArtUri","");;\
my $cmnd_pp = ReadingsVal($name,"state","") eq "PLAYING" ? "pause" : "play";;\
my $icon_pp = ReadingsVal($name,"state","") eq "PLAYING" ? "rc_PAUSE" : "rc_PLAY";;\
my $cmnd_mu = ReadingsVal($name,"mute","") eq "true" ? "mute off" : "mute on";;\
my $icon_mu = ReadingsVal($name,"mute","") eq "true" ? "rc_VOLDOWN" : "rc_MUTE";;\
my $ctitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Title","no title")) : ReadingsVal($name,"state","");;\
my $ititle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Artist","no artist")) : ReadingsVal($name,"state","");;\
my $atitle = ReadingsVal($name,"currentTrack_ProtocolInfo","") =~ ".*radio.*" ?\
$trim30->(ReadingsVal($name,"enqueuedMetadata_Title","no title")) : ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Album","no title")) : ReadingsVal($name,"state","");;\
my $nctitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Title","no title")) : ReadingsVal($name,"state","");;\
my $nititle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Artist","no artist")) : ReadingsVal($name,"state","");;\
my $natitle = ReadingsVal($name,"state","") eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Album","no album")) : ReadingsVal($name,"state","");;\
my $duration = ReadingsVal($name,"state","") eq "PLAYING" ? ReadingsVal($name,"nextTrack_Duration","no duration") : ReadingsVal($name,"state","");;\
"<div style='float:left;;padding:10px;;'>\
<img src='$imgct' style='width:265px;;height:265px;;border-radius:5px;;'>\
</div>\
<div style='text-align:left;;float:left;;padding:10px;;width:300px;;height:265px;;'>\
<span>Titel:&nbsp$ctitle</span><br>\
<span>Interpret:&nbsp$ititle</span><br>\
<span>Album:&nbsp$atitle</span><br><br>\
<span>Nächster&nbspTitel:</span><br>\
<span>Titel:&nbsp$nctitle</span><br>\
<span>Interpret:&nbsp$nititle</span><br>\
<span>Album:&nbsp$natitle</span><br>\
<span>Dauer:&nbsp$duration</span><br><br>\
<div style='float: left;;padding-right:25px;;'>\
<img src='$imgnt' style='width:75px;;height:75px;;border-radius:3px;;'>\
</div>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage("rc_PREVIOUS")."</a>\
<a href=\"/fhem?cmd.dummy=set $name $cmnd_pp&XHR=1\">".FW_makeImage($icon_pp)."</a>\
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage("rc_NEXT")."</a>\
<a href=\"/fhem?cmd.dummy=set $name stop&XHR=1\">".FW_makeImage("rc_STOP")."</a>\
</span><br>\
<span>\
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage("rc_VOLDOWN")."</a>\
<a href=\"/fhem?cmd.dummy=set $name $cmnd_mu&XHR=1\">".FW_makeImage($icon_mu)."</a>\
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage("rc_VOLUP")."</a>\
</span>\
<div class='fhemWidget' cmd='volume' reading='volume' dev='$name' arg='slider,0,1,100' current='10'></div></td>\\
</div>"}
attr Test11 event-on-change-reading .*
attr Test11 icon audio_volume_low
attr Test11 jsonMap volume_Master:volume mute_Master:mute volume_LF:0 volume_RF:0 mute_LF:0 mute_RF:0 enqueuedMetadata_ItemId:0 enqueuedMetadata_ParentId:0 currentTrack_ItemId:0 currentTrack_ParentId:0 coordinatorUuid:0 transportState:state nextTrack_ItemId:0 nextTrack_ParentId:0
attr Test11 model sonos2mqtt_speaker
attr Test11 readingList sonos/status/unknown/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }\
  sonos/status/unknown/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }\
  sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr Test11 room Test,MQTT2_DEVICE
attr Test11 setList stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }\
  play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
  pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
  toggle:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "toggle" }\
  volumeUp:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumeup" }\
  volumeDown:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumedown" }\
  switchToQueue:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoqueue" }\
  switchToTv:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtotv" }\
  switchToLine:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoline" }\
  volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
  mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
  next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
  previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
  x_raw_payload:textField { my $payload = $EVENT;;$payload =~ s/$EVTPART0 //g;; qq(sonos/RINCON_000E58F7F67C01400/control $payload)}\
  joinGroup:textField sonos/RINCON_000E58F7F67C01400/control { "command": "joingroup",  "input": "$EVTPART1"}\
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_000E58F7F67C01400","groupName","all");; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "leavegroup",  "input": "$value" } ) }\
  setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
  notify:textField sonos/RINCON_000E58F7F67C01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}

setstate Test11 PLAYING
setstate Test11 2020-06-11 10:58:31 currentTrack_Album Sprachdurchsagen
setstate Test11 2020-06-11 10:58:32 currentTrack_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-rincon-mp3radio:%2f%2fhttp:%2f%2fopml.radiotime.com%2fTune.ashx%3fid%3de125649567%26sid%3ds20293%26formats%3daac,mp3,hls%26partnerId%3drjyYMwEH%26serial%3dAHFLNOA3T2XT6VWH2BAPMLPWOGLA&v=81
setstate Test11 2020-06-11 11:52:19 currentTrack_Artist Was woll&apos;;n wir wetten / Ingrid Peters
setstate Test11 2020-06-11 10:58:31 currentTrack_Duration 0:00:01
setstate Test11 2020-06-11 11:52:19 currentTrack_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate Test11 2020-06-11 11:52:19 currentTrack_Title stream.mp3?ar-distributor=f0a1
setstate Test11 2020-06-11 11:52:19 currentTrack_TrackUri x-rincon-mp3radio://http://swr-edge-2028.dus-lg.cdn.addradio.net/swr/swr4/bw/mp3/128/stream.mp3?ar-distributor=f0a1
setstate Test11 2020-06-11 11:52:19 currentTrack_UpnpClass object.item
setstate Test11 2020-06-10 13:10:27 enqueuedMetadata_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test11 2020-06-11 10:18:07 enqueuedMetadata_AlbumArtUri https://cdn-profiles.tunein.com/s20293/images/logoq.png?t=1
setstate Test11 2020-06-10 13:10:27 enqueuedMetadata_Artist Johannes Ackner
setstate Test11 2020-06-11 11:52:19 enqueuedMetadata_Title
setstate Test11 2020-06-11 10:58:31 enqueuedMetadata_UpnpClass object.item.audioItem.musicTrack
setstate Test11 2020-06-11 11:52:19 groupName Wohnzimmer
setstate Test11 2020-06-11 11:52:19 mute false
setstate Test11 2020-06-11 11:52:19 name Wohnzimmer
setstate Test11 2020-06-10 13:10:27 nextTrack_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test11 2020-06-10 13:10:27 nextTrack_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-file-cifs:%2f%2f192.168.188.26%2fOwnMusic%2fH%c3%b6rb%c3%bccher%2fDer%20Struwwelpeter.mp3&v=81
setstate Test11 2020-06-10 13:10:27 nextTrack_Artist Johannes Ackner
setstate Test11 2020-06-10 13:10:27 nextTrack_Duration 0:14:23
setstate Test11 2020-06-10 13:10:27 nextTrack_ProtocolInfo x-file-cifs:*:audio/mpeg:*
setstate Test11 2020-06-10 13:10:27 nextTrack_Title Der Struwwelpeter
setstate Test11 2020-06-10 13:10:27 nextTrack_TrackUri x-file-cifs://192.168.188.26/OwnMusic/Hörbücher/Der Struwwelpeter.mp3
setstate Test11 2020-06-10 13:10:27 nextTrack_UpnpClass object.item.audioItem.musicTrack
setstate Test11 2020-06-11 11:52:19 playmode NORMAL
setstate Test11 2020-06-11 11:52:19 state PLAYING
setstate Test11 2020-06-11 11:52:19 ts 1591869138812
setstate Test11 2020-06-11 11:52:19 uuid RINCON_000E58F7F67C01400
setstate Test11 2020-06-11 11:13:01 volume 6


Weiter gehts bei #211. Der Slider ist ja schon drin, verschwindet aber immer sobald ein Reading reinkommt, auch wenn mir das wsl. nichts sagen wird will ich jetzt mal die Zeilen 3429ff anschauen oder bist du schon weiter ?


[OT glaub ich]2020.06.11 11:43:06 1: PERL WARNING: Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.30), passed through in regex; marked by <-- HERE in m/^d.{ <-- HERE my$/ at fhem.pl line 3013, <$fh> line 248.
Seh ich im Log auf dem aktuellen Testsystem, da gibts nur nen MQTT2_Server und Test-DEVICEs ?
[OT]




Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 11 Juni 2020, 12:29:17
OK, aber auch mit my $vol = ReadingsVal($name,"volume","");
<div class='fhemWidget' cmd='volume' reading='volume' dev='$name' arg='slider,0,1,100' current='$vol'></div>
verschwindet der Slider sobald Readings eintreffen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 11 Juni 2020, 13:17:15
Positioniert ist er schon, mit tricksen, bin mir aber nicht sicher ob das so korrekt ist.

Jetzt darf er nur nicht mehr verschwinden wenn Readings eintrefffen.

"<div style='float:left;padding:10px;'>
<img src='$imgct' style='width:265px;height:265px;border-radius:5px;'>
</div>
<div style='text-align:left;float:left;padding:10px;width:280px;height:265px;'>
<span>Titel:&nbsp$ctitle</span><br>
<span>Interpret:&nbsp$ititle</span><br>
<span>Album:&nbsp$atitle</span><br>
<span>Nächster&nbspTitel:</span><br>
<span>Titel:&nbsp$nctitle</span><br>
<span>Interpret:&nbsp$nititle</span><br>
<span>Album:&nbsp$natitle</span><br>
<span>Dauer:&nbsp$duration</span><br>
<div style='padding:5px 5px;'>
<div  class='fhemWidget' cmd='volume' reading='volume' dev='$name' arg='colorpicker,BRI,0,1,100' current='$vol'></div></div>
<div style='float: left;'>
<img src='$imgnt' style='width:75px;height:75px;border-radius:3px;padding-right:25px;'>
</div>
<span>
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage("rc_PREVIOUS")."</a>
<a href=\"/fhem?cmd.dummy=set $name $cmnd_pp&XHR=1\">".FW_makeImage($icon_pp)."</a>
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage("rc_NEXT")."</a>
<a href=\"/fhem?cmd.dummy=set $name stop&XHR=1\">".FW_makeImage("rc_STOP")."</a>
</span><br>
<span>
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage("rc_VOLDOWN")."</a>
<a href=\"/fhem?cmd.dummy=set $name $cmnd_mu&XHR=1\">".FW_makeImage($icon_mu)."</a>
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage("rc_VOLUP")."</a>
</span>
</div>"
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 11 Juni 2020, 18:42:01
Es liegt doch tatsächlich an der Spalte <td> die ich nicht übernommen habe. <p> hab ich spaßeshalber probiert klappt nicht.

Dann kümmerts ihn aber nicht mehr das er in meinen Divs ist und rutscht an ? die Stelle wo er normal stehen sollte ?

Lass ich die <td> weg kann ich ihn positionieren wo ich will, zeigt sich aber egal wo ich das Device in FHEMWEB aufrufe nur solange bis das erste Reading reinkommt.

Es bringt auch nix wenn ich nochmal ein div rummache.

Der Slider hat erst den Wert 0 ändere ich über den volume-setter die Lautstärke übernimmt er den neuen Wert.

defmod Test15 MQTT2_DEVICE RINCON_000E58F7F67C01400
attr Test15 IODev MQTT2_Server
attr Test15 devStateIcon { my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...';; };;\
my $state = ReadingsVal($name,"state","unknown");;\
my $imgct = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");;\
my $vol = ReadingsVal($name,"volume_Master","");;\
my $imgnt = ReadingsVal($name,"nextTrack_AlbumArtUri","");;\
my $cmnd_pp = $state eq "PLAYING" ? "pause" : "play";;\
my $icon_pp = $state eq "PLAYING" ? "rc_PAUSE" : "rc_PLAY";;\
my $cmnd_mu = ReadingsVal($name,"mute","") eq "true" ? "mute off" : "mute on";;\
my $icon_mu = ReadingsVal($name,"mute","") eq "true" ? "rc_VOLDOWN" : "rc_MUTE";;\
my $ctitle = $state eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Title","no title")) : $state;;\
my $ititle = $state eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Artist","no artist")) : $state;;\
my $atitle = ReadingsVal($name,"currentTrack_ProtocolInfo","") =~ ".*radio.*" ?\
$trim30->(ReadingsVal($name,"enqueuedMetadata_Title","no title")) : $state eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Album","no title")) : $state;;\
my $nctitle = $state eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Title","no title")) : $state;;\
my $nititle = $state eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Artist","no artist")) : $state;;\
my $natitle = $state eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Album","no album")) : $state;;\
my $duration = $state eq "PLAYING" ? ReadingsVal($name,"nextTrack_Duration","no duration") : $state;;\
"<div style='float:left;;padding:10px;;'>\
<img src='$imgct' style='width:265px;;height:265px;;border-radius:5px;;'></div>\
<div style='float:left;;padding:10px;;width:285px;;height:265px;;border: 1px solid blue;;'>\
<div style='text-align:left;;border: 1px solid pink;;'>\
<span>Titel:&nbsp$ctitle</span><br>\
<span>Interpret:&nbsp$ititle</span><br>\
<span>Album:&nbsp$atitle</span><br>\
<span>Nächster&nbspTitel:</span><br>\
<span>Titel:&nbsp$nctitle</span><br>\
<span>Interpret:&nbsp$nititle</span><br>\
<span>Album:&nbsp$natitle</span><br>\
<span>Dauer:&nbsp$duration</span>\
</div>\
<div style='float: left;;border: 1px solid red;;padding:5px 5px;;'>\
<img src='$imgnt' style='width:75px;;height:75px;;border-radius:3px;;'></div>\
<div style='float: right;;border: 1px solid yellow;;padding:5px 20px 0px 0px;;'>\
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage("rc_PREVIOUS")."</a>\
<a href=\"/fhem?cmd.dummy=set $name $cmnd_pp&XHR=1\">".FW_makeImage($icon_pp)."</a>\
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage("rc_NEXT")."</a>\
<a href=\"/fhem?cmd.dummy=set $name stop&XHR=1\">".FW_makeImage("rc_STOP")."</a>\
<br>\
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage("rc_VOLDOWN")."</a>\
<a href=\"/fhem?cmd.dummy=set $name $cmnd_mu&XHR=1\">".FW_makeImage($icon_mu)."</a>\
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage("rc_VOLUP")."</a>\
</div>\
<td>\
<div style='border: 3px solid green;;' class='fhemWidget' cmd='volume' reading='volume' dev='$name' arg='colorpicker,BRI,0,1,100' current='$vol'></div></td>\
</div>"}
attr Test15 event-on-change-reading .*
attr Test15 icon audio_volume_low
attr Test15 jsonMap volume_Master:volume mute_Master:mute volume_LF:0 volume_RF:0 mute_LF:0 mute_RF:0 enqueuedMetadata_ItemId:0 enqueuedMetadata_ParentId:0 currentTrack_ItemId:0 currentTrack_ParentId:0 coordinatorUuid:0 transportState:state nextTrack_ItemId:0 nextTrack_ParentId:0
attr Test15 model sonos2mqtt_speaker
attr Test15 readingList sonos/status/unknown/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }\
  sonos/status/unknown/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }\
  sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr Test15 room Test,MQTT2_DEVICE
attr Test15 setList stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }\
  play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
  pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
  toggle:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "toggle" }\
  volumeUp:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumeup" }\
  volumeDown:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumedown" }\
  switchToQueue:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoqueue" }\
  switchToTv:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtotv" }\
  switchToLine:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoline" }\
  volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
  mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
  next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
  previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
  x_raw_payload:textField { my $payload = $EVENT;;$payload =~ s/$EVTPART0 //g;; qq(sonos/RINCON_000E58F7F67C01400/control $payload)}\
  joinGroup:textField sonos/RINCON_000E58F7F67C01400/control { "command": "joingroup",  "input": "$EVTPART1"}\
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_000E58F7F67C01400","groupName","all");; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "leavegroup",  "input": "$value" } ) }\
  setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
  notify:textField sonos/RINCON_000E58F7F67C01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}

setstate Test15 PLAYING
setstate Test15 2020-06-11 17:38:27 currentTrack_Album Struwwel
setstate Test15 2020-06-11 18:35:04 currentTrack_AlbumArtUri https://cdn-profiles.tunein.com/s20293/images/logoq.png?t=1
setstate Test15 2020-06-11 18:35:04 currentTrack_Artist SWR4 am Abend mit Jens Vogt
setstate Test15 2020-06-11 17:38:27 currentTrack_Duration 0:14:23
setstate Test15 2020-06-11 18:35:04 currentTrack_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate Test15 2020-06-11 18:35:04 currentTrack_Title stream.mp3?ar-distributor=f0a1
setstate Test15 2020-06-11 18:35:04 currentTrack_TrackUri x-rincon-mp3radio://http://swr-edge-202e.fra-lg.cdn.addradio.net/swr/swr4/bw/mp3/128/stream.mp3?ar-distributor=f0a1
setstate Test15 2020-06-11 18:35:04 currentTrack_UpnpClass object.item
setstate Test15 2020-06-11 18:35:04 enqueuedMetadata_AlbumArtUri https://cdn-profiles.tunein.com/s20293/images/logoq.png?t=1
setstate Test15 2020-06-11 18:35:04 enqueuedMetadata_Title 90.1 SWR4 Baden-Württemberg Stuttgart
setstate Test15 2020-06-11 18:35:04 enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate Test15 2020-06-11 18:35:04 groupName Wohnzimmer
setstate Test15 2020-06-11 17:54:43 mute false
setstate Test15 2020-06-11 18:35:04 name Wohnzimmer
setstate Test15 2020-06-11 17:38:27 nextTrack_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test15 2020-06-11 17:38:27 nextTrack_AlbumArtUri http://192.168.188.38:1400/getaa?s=1&u=x-sonos-http:library%2ftracks%2fa4e8b0d9-c416-431b-96f2-448d1230972d%2f.mp3%3fsid%3d201%26flags%3d0%26sn%3d5
setstate Test15 2020-06-11 17:38:27 nextTrack_Artist Johannes Ackner
setstate Test15 2020-06-11 17:38:27 nextTrack_Duration 0:14:23
setstate Test15 2020-06-11 17:38:27 nextTrack_ProtocolInfo sonos.com-http:*:audio/mpeg:*
setstate Test15 2020-06-11 17:38:27 nextTrack_Title Der Struwwelpeter
setstate Test15 2020-06-11 17:38:27 nextTrack_TrackUri x-sonos-http:library/tracks/a4e8b0d9-c416-431b-96f2-448d1230972d/.mp3?sid=201&flags=0&sn=5
setstate Test15 2020-06-11 17:38:27 nextTrack_UpnpClass object.item.audioItem.musicTrack
setstate Test15 2020-06-11 18:35:04 playmode NORMAL
setstate Test15 2020-06-11 18:35:04 state PLAYING
setstate Test15 2020-06-11 18:35:04 ts 1591893304478
setstate Test15 2020-06-11 18:35:04 uuid RINCON_000E58F7F67C01400
setstate Test15 2020-06-11 18:35:04 volume 5


Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 11 Juni 2020, 22:40:31
Stephan hat eine neue Beta herausgebracht https://www.npmjs.com/package/sonos2mqtt/v/3.0.7-beta.2
Damit sind jetzt get Befehle möglich :) Beispiel: liefert die RadioStationen zurück...
Kann man leicht über x-raw-payload testen. Er erzeugt damit einen neuen Topic.
{
  "command": "adv-command",
  "input": {
    "cmd": "GetFavoriteRadioStations",
    "reply": "DougRadio"
  }
}


Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 12 Juni 2020, 07:49:32
@Otto123:
Brauchst du Unterstützung, was das get-Thema angeht? Bzgl. Getter ist die Syntax ggf. noch erklärungsbedürftig...

@TomLee:
In dem letzten List war keine setStateList drin. Das ist als Schritt 1 vermutlich notwendig, um bereits beim Setzen den Readingwert zu verändern, hatte da in meinem ersten Vorschlag play,pause,stop,toggle vorgesehen (?).
Ansonsten wäre es sinnvoll, nochmal näher in den Ausgangscode zu sehen und ggf. in FHEMWEB-Bereich gezielt nachzufragen, wie die Syntax sein muß? Das ist auch nicht für mich selbsterklärend, weil danach js-Code angeflanscht ist; ich hatte nur erst mal harte Werte übernommen, um das widget auf die Schnelle angzeigt zu bekommen, was ganz falsch sein kann...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 12 Juni 2020, 15:43:17
Zitat von: Otto123 am 11 Juni 2020, 22:40:31
Damit sind jetzt get Befehle möglich :) Beispiel: liefert die RadioStationen zurück...
Kann man leicht über x-raw-payload testen. Er erzeugt damit einen neuen Topic.
{
  "command": "adv-command",
  "input": {
    "cmd": "GetFavoriteRadioStations",
    "reply": "DougRadio"
  }
}


Gruß Otto

Bin ich zu doof zu, du gibst den Json so in x-raw-payload ein ?

Dann seh ich mit verbose 5 am Server im Log nur das ausgehende Kommando, es kommt nix zurück.

2020.06.12 15:10:57 3: MQTT2_DEVICE set Test15 x_raw_payload { "command": "adv-command", "input": { "cmd": "GetFavoriteRadioStations", "reply": "DougRadio" } }
2020.06.12 15:10:57 5: MQTT2_Server: PUBLISH sonos/RINCON_000E58F7F67C01400/control { "command": "adv-command", "input": { "cmd": "GetFavoriteRadioStations", "reply": "DougRadio" } }
2020.06.12 15:10:57 5:   MQTT2_Server_192.168.188.67_54054 mqttjs_f5fd4532 => sonos/RINCON_000E58F7F67C01400/control:{ "command": "adv-command", "input": { "cmd": "GetFavoriteRadioStations", "reply": "DougRadio" } }
2020.06.12 15:10:57 5: out: PUBLISH: 0(138)(1)(0)&sonos/RINCON_000E58F7F67C01400/control{ "command": "adv-command", "input": { "cmd": "GetFavoriteRadioStations", "reply": "DougRadio" } }


Im s2m Log steht dann:

2020-06-12T13:10:57.362Z [Debug] Mqtt parsing adv-command for rincon_000e58f7f67c01400
2020-06-12T13:10:57.516Z [Debug] Executed adv-command for Wohnzimmer (RINCON_000E58F7F67C01400)


Auch hier nicht:

{   "command": "adv-command",   "input": {     "cmd": "GetFavoriteRadioShows",     "reply": "DougRadio"   } }
{   "command": "adv-command",   "input": {     "cmd": "GetFavoriteRadioStations",     "reply": "DougRadio"   } }
{ "command": "adv-command", "input": { "cmd": "GetFavorites", "reply": "DougRadio" } }


Es gibt aber sicher, nicht nur, Radio-Favoriten, die seh ich mit get <Devicname> Favourites im Sonos-Modul

Und ja ich hab ein update auf 3.0.7 gemacht.




Was eigentlich mit dem Pfad muss der dann nicht mit in die RL des RINCON-Device ?

sonos/RINCON_000E58F7F67C01400/error

Gruß

Thomas







Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: svrooij am 12 Juni 2020, 16:47:24
Hi guys,

Apart from version 3.0.7.beta.2, I also created some documentation about the bridge, It's in English but google translate should bring you pretty far.
Here is the documentation about the getting data part: https://svrooij.github.io/sonos2mqtt/control/advanced.html#fetch-data

This is a first try on how it could work. Feedback is appreciated https://github.com/svrooij/sonos2mqtt/issues/101

For now you specify the reply topic and it will then send a message to sonos/RINCON_00000/{reply} as stated in the docs.

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 12 Juni 2020, 17:07:08
Zitat von: TomLee am 12 Juni 2020, 15:43:17
Bin ich zu doof zu, du gibst den Json so in x-raw-payload ein ?
Hallo Tomas,

genau so werfe ich das in die payload.
Er ergänzt von selbst die readingsList
sonos/RINCON_347E5C82560801400/DougRadio:.* { json2nameValue($EVENT) }
Dann kommt bei mir das zurück:
     2020-06-11 22:34:17   Result_10_ItemId R:0/0/21
     2020-06-11 22:34:17   Result_10_ParentId R:0/0
     2020-06-11 22:34:17   Result_10_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_10_Title MDR JUMP
     2020-06-11 22:34:17   Result_10_TrackUri x-sonosapi-stream:s6634?sid=254&flags=32&sn=0
     2020-06-11 22:34:17   Result_10_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_11_ItemId R:0/0/3
     2020-06-11 22:34:17   Result_11_ParentId R:0/0
     2020-06-11 22:34:17   Result_11_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_11_Title Nostalgie Jazz
     2020-06-11 22:34:17   Result_11_TrackUri x-sonosapi-stream:s143747?sid=254&flags=32
     2020-06-11 22:34:17   Result_11_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_12_ItemId R:0/0/20
     2020-06-11 22:34:17   Result_12_ParentId R:0/0
     2020-06-11 22:34:17   Result_12_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_12_Title Radio Caprice Symphonic Rock
     2020-06-11 22:34:17   Result_12_TrackUri x-sonosapi-stream:s180009?sid=254&flags=32
     2020-06-11 22:34:17   Result_12_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_13_ItemId R:0/0/10
     2020-06-11 22:34:17   Result_13_ParentId R:0/0
     2020-06-11 22:34:17   Result_13_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_13_Title Radio Mafia
     2020-06-11 22:34:17   Result_13_TrackUri x-sonosapi-stream:s105557?sid=254&flags=32
     2020-06-11 22:34:17   Result_13_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_14_ItemId R:0/0/1
     2020-06-11 22:34:17   Result_14_ParentId R:0/0
     2020-06-11 22:34:17   Result_14_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_14_Title Radio PSR 102.9 (Pop)
     2020-06-11 22:34:17   Result_14_TrackUri x-sonosapi-stream:s6649?sid=254&flags=32
     2020-06-11 22:34:17   Result_14_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_15_ItemId R:0/0/22
     2020-06-11 22:34:17   Result_15_ParentId R:0/0
     2020-06-11 22:34:17   Result_15_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_15_Title Radio Weihnacht
     2020-06-11 22:34:17   Result_15_TrackUri x-sonosapi-stream:s213060?sid=254&flags=32&sn=0
     2020-06-11 22:34:17   Result_15_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_16_ItemId R:0/0/2
     2020-06-11 22:34:17   Result_16_ParentId R:0/0
     2020-06-11 22:34:17   Result_16_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_16_Title RAM FM
     2020-06-11 22:34:17   Result_16_TrackUri x-sonosapi-stream:s120965?sid=254&flags=32
     2020-06-11 22:34:17   Result_16_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_17_ItemId R:0/0/9
     2020-06-11 22:34:17   Result_17_ParentId R:0/0
     2020-06-11 22:34:17   Result_17_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_17_Title Relax FM
     2020-06-11 22:34:17   Result_17_TrackUri x-sonosapi-stream:s1472?sid=254&flags=32
     2020-06-11 22:34:17   Result_17_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_18_ItemId R:0/0/24
     2020-06-11 22:34:17   Result_18_ParentId R:0/0
     2020-06-11 22:34:17   Result_18_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_18_Title ROCK ANTENNE Classic Perlen
     2020-06-11 22:34:17   Result_18_TrackUri x-sonosapi-stream:s125938?sid=254&flags=32&sn=0
     2020-06-11 22:34:17   Result_18_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_19_ItemId R:0/0/19
     2020-06-11 22:34:17   Result_19_ParentId R:0/0
     2020-06-11 22:34:17   Result_19_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_19_Title The Beatles HQ
     2020-06-11 22:34:17   Result_19_TrackUri x-sonosapi-stream:s222105?sid=254&flags=32
     2020-06-11 22:34:17   Result_19_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_1_ItemId R:0/0/7
     2020-06-11 22:34:17   Result_1_ParentId R:0/0
     2020-06-11 22:34:17   Result_1_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_1_Title  CruiseOne
     2020-06-11 22:34:17   Result_1_TrackUri x-sonosapi-stream:s113694?sid=254&flags=32
     2020-06-11 22:34:17   Result_1_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_20_ItemId R:0/0/8
     2020-06-11 22:34:17   Result_20_ParentId R:0/0
     2020-06-11 22:34:17   Result_20_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_20_Title Tropical 100 Bolero
     2020-06-11 22:34:17   Result_20_TrackUri x-sonosapi-stream:s143417?sid=254&flags=32
     2020-06-11 22:34:17   Result_20_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_2_ItemId R:0/0/6
     2020-06-11 22:34:17   Result_2_ParentId R:0/0
     2020-06-11 22:34:17   Result_2_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_2_Title  Deluxe Radio
     2020-06-11 22:34:17   Result_2_TrackUri x-sonosapi-stream:s8254?sid=254&flags=32
     2020-06-11 22:34:17   Result_2_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_3_ItemId R:0/0/15
     2020-06-11 22:34:17   Result_3_ParentId R:0/0
     2020-06-11 22:34:17   Result_3_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_3_Title  Deutschlandfunk
     2020-06-11 22:34:17   Result_3_TrackUri x-sonosapi-stream:s42828?sid=254&flags=32
     2020-06-11 22:34:17   Result_3_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_4_ItemId R:0/0/5
     2020-06-11 22:34:17   Result_4_ParentId R:0/0
     2020-06-11 22:34:17   Result_4_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_4_Title  Hitradio RTL Sachsen
     2020-06-11 22:34:17   Result_4_TrackUri x-sonosapi-stream:s96270?sid=254&flags=32
     2020-06-11 22:34:17   Result_4_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_5_ItemId R:0/0/25
     2020-06-11 22:34:17   Result_5_ParentId R:0/0
     2020-06-11 22:34:17   Result_5_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_5_Title  Indian Ocean Waves Radio
     2020-06-11 22:34:17   Result_5_TrackUri x-sonosapi-stream:s137946?sid=254&flags=32&sn=0
     2020-06-11 22:34:17   Result_5_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_6_ItemId R:0/0/14
     2020-06-11 22:34:17   Result_6_ParentId R:0/0
     2020-06-11 22:34:17   Result_6_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_6_Title  J-Last Radio
     2020-06-11 22:34:17   Result_6_TrackUri x-sonosapi-stream:s158908?sid=254&flags=32
     2020-06-11 22:34:17   Result_6_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_7_ItemId R:0/0/13
     2020-06-11 22:34:17   Result_7_ParentId R:0/0
     2020-06-11 22:34:17   Result_7_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_7_Title  LPK7SSD
     2020-06-11 22:34:17   Result_7_TrackUri x-rincon-mp3radio://192.168.178.70:5901/stream/swyh.mp3
     2020-06-11 22:34:17   Result_7_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_8_ItemId R:0/0/16
     2020-06-11 22:34:17   Result_8_ParentId R:0/0
     2020-06-11 22:34:17   Result_8_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_8_Title  MDR INFO
     2020-06-11 22:34:17   Result_8_TrackUri x-sonosapi-stream:s8668?sid=254&flags=32
     2020-06-11 22:34:17   Result_8_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-11 22:34:17   Result_9_ItemId R:0/0/18
     2020-06-11 22:34:17   Result_9_ParentId R:0/0
     2020-06-11 22:34:17   Result_9_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-11 22:34:17   Result_9_Title  mdr info direkt
     2020-06-11 22:34:17   Result_9_TrackUri x-rincon-mp3radio://c22033-ls.i.core.cdn.streamfarm.net/QpZptC4ta9922033/22033mdr/live/app2128740352/w2128904192/live_de_56.mp3
     2020-06-11 22:34:17   Result_9_UpnpClass object.item.audioItem.audioBroadcast


Den Topic mit error habe ich nicht, da läuft also bei Dir was falsch?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 12 Juni 2020, 17:24:17
Genau wie du beschreibst hab ich es auch verstanden, reply (DougRadio) kann man nennen wie man will.

Deshalb das verbose 5 Log weil ich nicht verstehe das nichts zurück kommt.
Das debug-Log ist aber auch dürftig.




das mit dem error-Topic hat denk ich nichts mit der Sache zu tun.
Hab das automatisch dazu angelegt Device nur heute erst bemerkt.
Ursache waren wohl falsche Kommandos die ich vor 1-2 Tagen absetzte.

https://svrooij.github.io/sonos2mqtt/topics.html#error-message (https://svrooij.github.io/sonos2mqtt/topics.html#error-message)

If you tried to execute a command and it failed, you will get a message at sonos/uuid_of_speaker/error that looks like:

{
  "command":"executed_command",
  "error": {
    "...": ""
  }
}




Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 12 Juni 2020, 17:47:59
Nochmal blöd gefragt: nach dem install von 3.0.7@beta-2 hast Du auch ein restart von sonos2mqtt gemacht? Das hat er bei mir nämlich nicht automatisch getan  ::)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 12 Juni 2020, 17:56:10
restart mach ich öfters, allerdings mit v3.0.7 nicht mit der 3.0.7@beta-2  :P
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 12 Juni 2020, 18:26:38
Sorry, der Name war falsch npm i sonos2mqtt@3.0.7-beta.2
#bzw:
npm -g i sonos2mqtt@3.0.7-beta.2
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 12 Juni 2020, 18:38:29
beta.2 ist doch von vorgestern, ist doch jetzt 3.07 oder versteh ich was falsch, so wie es oben rechts auch auf der npm-Seite steht ?




Kann bitte mal wer sich das devstateIcon anschauen und schauen ob er drauf kommt warum bei Interpret Es spielt: ($ititle) manchmal, wenn das Reading sich beim Radio hören ändert, nicht gekürzt wird oder an was es sonst liegen könnte.

Für den Raw-Import:

attr Test16 devStateIcon { my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...';; };;\
my $state = ReadingsVal("$name","state","unknown");;\
my $imgct = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");;\
my $vol = ReadingsVal($name,"volume_Master","");;\
my $imgnt = ReadingsVal($name,"nextTrack_AlbumArtUri","");;\
my $cmnd_pp = $state eq "PLAYING"  ? "pause" : "play";;\
my $icon_pp = $state eq "PLAYING" ? "rc_PAUSE" : "rc_PLAY";;\
my $cmnd_mu = ReadingsVal($name,"mute","") eq "true" ? "mute off" : "mute on";;\
my $icon_mu = ReadingsVal($name,"mute","") eq "true" ? "rc_VOLDOWN" : "rc_MUTE";;\
my $ctitle = $state eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Title","no title")) : $state;;\
my $ititle = $state eq "PLAYING" ? "Es spielt: ".$trim30->(ReadingsVal($name,"currentTrack_Artist","no artist")) : $state;;\
my $atitle = ReadingsVal($name,"currentTrack_ProtocolInfo","") =~ ".*radio.*" ?\
$trim30->(ReadingsVal($name,"enqueuedMetadata_Title","no data")) : $state eq "PLAYING" ? $trim30->(ReadingsVal($name,"currentTrack_Album","no album")) : $state;;\
my $nctitle = $state eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Title","no title")) : $state;;\
my $nititle = $state eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Artist","no artist")) : $state;;\
my $natitle = $state eq "PLAYING" ? $trim30->(ReadingsVal($name,"nextTrack_Album","no album")) : $state;;\
my $duration = $state eq "PLAYING" ? ReadingsVal($name,"nextTrack_Duration","no duration") : $state;;\
"<div style='float:left;;padding:10px;;'>\
<img src='$imgct' style='width:265px;;height:265px;;border-radius:5px;;'></div>\
<div style='float:left;;padding:10px 0px 10px;;width:290px;;height:265px;;'>\
<div style='text-align:left;;'>\
<span>Titel:&nbsp$ctitle</span><br>\
<span>$ititle</span><br>\
<span>Album:&nbsp$atitle</span><br>\
<span>Nächster&nbspTitel:</span><br>\
<span>Titel:&nbsp$nctitle</span><br>\
<span>Interpret:&nbsp$nititle</span><br>\
<span>Album:&nbsp$natitle</span><br>\
<span>Dauer:&nbsp$duration</span>\
</div>\
<div style='float: left;;padding:5px 5px;;'>\
<img src='$imgnt' style='width:75px;;height:75px;;border-radius:3px;;'></div>\
<div style='float: right;;padding:5px 20px 0px 0px;;'>\
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage("rc_PREVIOUS")."</a>\
<a href=\"/fhem?cmd.dummy=set $name $cmnd_pp&XHR=1\">".FW_makeImage($icon_pp)."</a>\
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage("rc_NEXT")."</a>\
<a href=\"/fhem?cmd.dummy=set $name stop&XHR=1\">".FW_makeImage("rc_STOP")."</a>\
<br>\
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage("rc_VOLDOWN")."</a>\
<a href=\"/fhem?cmd.dummy=set $name $cmnd_mu&XHR=1\">".FW_makeImage($icon_mu)."</a>\
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage("rc_VOLUP")."</a>\
</div>\
<td>\
<div style='border: 3px solid green;;' class='fhemWidget' cmd='volume' reading='volume' dev='$name' arg='colorpicker,BRI,0,1,100' current='$vol'></div></td>\
</div>"}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 12 Juni 2020, 18:59:16
Ja :)
Also bei mir tut seit gestern Nacht pi@raspib2:~ $ npm -g list sonos2mqtt
/usr/lib
└── sonos2mqtt@3.0.7-beta.2

3.07 ist von gestern
und beta 2 von gestern 17:00 Uhr

https://github.com/svrooij/sonos2mqtt/releases

Ok jetzt hab ichs auch begriffen, Stephan ist zu schnell für mich :)

Nein ich verstehe es nicht. Also Fakt ist: die Version
sonos2mqtt@3.0.7-beta.2
tut es.
Die Version
sonos2mqtt@3.0.7
tut es nicht. :o

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 12 Juni 2020, 19:14:30
ich auch ;D  es geht nicht mit der 3.0.7 mit der beta schon  ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 12 Juni 2020, 19:24:31
Und du beschwerst dich über den Holländer er sei zu schnell, Sekunden später nachdem wir den Bug feststellen machst du nen issue auf  ;D
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 12 Juni 2020, 19:30:48
Das mit dem kürzen mein ich gefunden zu haben, muss ich später testen, täuscht einfach nur wenn viele Zahlen und Großbuchstaben vorkommen.

Jetzt weiß ich nicht ob noch weiter kürzen oder das div größer machen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 12 Juni 2020, 19:50:14
Zum nachvollziehen für unseren blinden Helfer ( aber wsl. ist dir das eh klar):

Dieses Device wurde bei mir angelegt nach einem {   "command": "adv-command",   "input": {     "cmd": "GetFavoriteRadioStations",     "reply": "DougRadio"   } }


defmod MQTT2_mqttjs_22a2aa0e MQTT2_DEVICE mqttjs_22a2aa0e
attr MQTT2_mqttjs_22a2aa0e IODev MQTT2_Server
attr MQTT2_mqttjs_22a2aa0e readingList mqttjs_22a2aa0e:sonos/RINCON_000E58F7F67C01400/DougRadio:.* { json2nameValue($EVENT) }
attr MQTT2_mqttjs_22a2aa0e room MQTT2_DEVICE

setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 NumberReturned 7
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_1_ItemId R:0/0/27
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_1_ParentId R:0/0
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_1_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_1_Title 011.FM - Non Stop 60s
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_1_TrackUri x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_1_UpnpClass object.item.audioItem.audioBroadcast
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_2_ItemId R:0/0/33
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_2_ParentId R:0/0
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_2_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_2_Title DASDING 92.5 (Euro-Hits)
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_2_TrackUri x-sonosapi-stream:s76488?sid=254&flags=8224&sn=0
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_2_UpnpClass object.item.audioItem.audioBroadcast
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_3_ItemId R:0/0/23
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_3_ParentId R:0/0
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_3_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_3_Title Nota Masria (Gemeinden)
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_3_TrackUri x-sonosapi-stream:s290159?sid=254&flags=8224&sn=0
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_3_UpnpClass object.item.audioItem.audioBroadcast
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_4_ItemId R:0/0/25
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_4_ParentId R:0/0
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_4_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_4_Title PsyRadio Chillout
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_4_TrackUri x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_4_UpnpClass object.item.audioItem.audioBroadcast
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_5_ItemId R:0/0/3
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_5_ParentId R:0/0
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_5_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_5_Title Radio Regenbogen
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_5_TrackUri x-sonosapi-stream:s272334?sid=254&flags=8224&sn=0
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_5_UpnpClass object.item.audioItem.audioBroadcast
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_6_ItemId R:0/0/5
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_6_ParentId R:0/0
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_6_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_6_Title SWR4 Baden-Württemberg
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_6_TrackUri x-sonosapi-stream:s20293?sid=254&flags=8224&sn=0
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_6_UpnpClass object.item.audioItem.audioBroadcast
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_7_ItemId R:0/0/1
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_7_ParentId R:0/0
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_7_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_7_Title SWR4 Rheinland-Pfalz
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_7_TrackUri x-sonosapi-stream:s1563?sid=254&flags=8224&sn=0
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 Result_7_UpnpClass object.item.audioItem.audioBroadcast
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 TotalMatches 7
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 UpdateID 1
setstate MQTT2_mqttjs_22a2aa0e 2020-06-12 19:11:25 subscriptions sonos/+/control sonos/cmd/+ sonos/set/+/+


Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 12 Juni 2020, 23:06:51
Stephan war doch zu schnell :)
Zur info
ZitatIf you check the actions, you'll see that I did something wrong.
https://github.com/svrooij/sonos2mqtt/actions

So actually 3.0.7 is the version before the reply feature. And 3.0.7.beta.2 is a newer version and should actually be called 3.0.8.beta.1

I wanted the release the documentation and not the new reply feature so I cancelled a build, but I was to late.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 15 Juni 2020, 10:56:55
Zitat von: TomLee am 12 Juni 2020, 19:50:14
Zum nachvollziehen für unseren blinden Helfer ( aber wsl. ist dir das eh klar):

Dieses Device wurde bei mir angelegt nach einem {   "command": "adv-command",   "input": {     "cmd": "GetFavoriteRadioStations",     "reply": "DougRadio"   } }
Falls das an meine Adresse ging: Das war mir nicht klar, und ich finde den Mechanismus auch irgendwie irritierend. Mir ist nicht klar, welchen Sinn es hat, den Rückmeldepfad konfigurieren zu können. Topic-Trees sind in meinem Weltbild eher was statisches, aber vermutlich übersehe ich in dem Gesamtkontext grade mal wieder was...

Es dürfte auch nicht so einfach werden, was mit den Readings anzufangen, aber auch dazu fehlen mir vermutlich die Zusammenhänge, so dass ich grade nicht glaube, eine große Hilfe sein zu können.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 15 Juni 2020, 14:10:51
ZitatFalls das an meine Adresse ging: Das war mir nicht klar, und ich finde den Mechanismus auch irgendwie irritierend. Mir ist nicht klar, welchen Sinn es hat, den Rückmeldepfad konfigurieren zu können. Topic-Trees sind in meinem Weltbild eher was statisches, aber vermutlich übersehe ich in dem Gesamtkontext grade mal wieder was...

Ob der Pfad nun konfigurierbar ist oder nicht, ist das am Ende nicht egal, man gibt ihn einmal an und ändert ihn doch nicht mehr.
Kann mans nicht auch auch von der anderen Seite sehen, das wir so den Pfad nennen können wir möchten.

Es dürfte auch nicht so einfach werden, was mit den Readings anzufangen, aber auch dazu fehlen mir vermutlich die Zusammenhänge, so dass ich grade nicht glaube, eine große Hilfe sein zu können.

Wenn man den Readings noch einen Namen gibt {json2nameValue($EVENT,'FavoriteRadioStation',$JSONMAP) } aber schon oder verstehe ich dich bloß nicht.

Ich sehe die Result_4_Title und Result_5_TrackUri in einem select-setter, mir ist nur nicht klar ob und wenn dann wie das überhaupt geht.

Nur die TrackUri ins select-Widget zu bekommen, das krieg ich (mit etwas Hirnschmalz) noch hin, mein ich.
Aber das die Titel in der Auswahl zu sehen sind, die TrackUri aber ausgeführt werden, das mir völlig unklar ob das gehen könnte.

Und weiter stell ich mir die Frage, sry für meine Unwissenheit, ob und wenn wie, es möglich ist alle anderen Readings aus dem Pfad gar nicht erst anzulegen. jsonMap macht hier ja wenig Sinn.

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 15 Juni 2020, 14:37:42
Zitat von: TomLee am 15 Juni 2020, 14:10:51
Kann mans nicht auch auch von der anderen Seite sehen, das wir so den Pfad nennen können wir möchten.
Kann man. Aber die Erfahrung lehrt: Wenn es zu flexibel ist, gibt's kreative Nutzer, die es übertreiben und genau deswegen darüber stolpern. (War nicht auf jemanden konkreten gemünzt).

ZitatWenn man den Readings noch einen Namen gibt {json2nameValue($EVENT,'FavoriteRadioStation',$JSONMAP) } aber schon oder verstehe ich dich bloß nicht.
Nun ja, wenn man jsonMap nutzt, machen (zu) lange Präfixe m.E. wenig Sinn

ZitatIch sehe die Result_4_Title und Result_5_TrackUri in einem select-setter, mir ist nur nicht klar ob und wenn dann wie das überhaupt geht.
Wie üblich dürfte auch das "irgendwie" gehen, aber eigentlich kommt mir das sehr kompliziert vor. Einfacher wäre es, man wählt einfach eine Stationstaste und würde die Tastennummer übermitteln und sonos2mqtt den Rest erledigen lassen. Weiß aber nicht, ob das geht oder vorgesehen ist. In Widgets (https://wiki.fhem.de/wiki/FHEMWEB/Widgets) sieht es mir jedenfalls so aus, als könnte man den label für 23iconLabel irgendwie per Perl festlegen?

ZitatUnd weiter stell ich mir die Frage, sry für meine Unwissenheit, ob und wenn wie, es möglich ist alle anderen Readings aus dem Pfad gar nicht erst anzulegen. jsonMap macht hier ja wenig Sinn.
Na ja, man müßte mal wieder etwas Perl bemühen und ggf. die Daten filtern. Aber auch hier stelle ich mir die Frage, ob es nicht besser wäre, einfach weniger/anders zu senden? (Das müßtet ihr aber entsprechend aufarbeiten, so dass Stefan weiß, was eigentlich gewollt ist - mir ist das im Moment eine Spur zu abstrakt...).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 18 Juni 2020, 10:38:39
Hab nun lange nicht mehr rein gesehen (Zeit :-\).
Nun habe ich heute mal ein FHEM Update gemacht und alles neu erstellt.

Dabei ist mir aufgefallen das es noch keine wirkliche Anzeige (die schön ist) zur Steuerung gibt.
Da ich hier mal an Beta-Users Worte dachte habe ich das mal OHNE PERL umgesetzt. Die Icons gehen sicher besser aber ich finde das erstmal okay.
Hinzu habe ich das mal mit mute angepasst, das es auch drin steht wenn es aktiv ist.

Anbei mal die attr des Gerätes...
Attributes:
   IODev      sonosmqtt
   alias      Badezimmer
   cmdIcon    mute:rc_MUTE previous:rc_PREVIOUS next:rc_NEXT play:rc_PLAY pause:rc_PAUSE stop:rc_STOP shuffleT:rc_SHUFFLE repeatT:rc_REPEAT volumeDown:rc_VOLDOWN volumeUp:rc_VOLUP
   devStateIcon (pause|stop):rc_STOP@red:play STOPPED:rc_PLAY@green:play PLAYING:rc_STOP@red:stop play:rc_PLAY:stop TRANSITIONING:rc_PLAY@yellow:stop mute:audio_volume_mute@yellow volume:audio_volume_mid@yellow volumeDown:audio_volume_low@yellow volumeUp:audio_volume_high@yellow
   icon       audio_volume_low
   jsonMap    volume_Master:volume mute_Master:mute transportState:state
   model      sonos2mqtt_speaker
   readingList sonos/status/badezimmer/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }
  sonos/status/badezimmer/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }
  sonos/RINCON_5CAAFD79D52801400:.* { json2nameValue($EVENT,'',$JSONMAP) }
   room       MQTT2_DEVICE
   setList    stop:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "stop" }
  play:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "play" }
  pause:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "volumedown" }
  switchToQueue:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "switchtoqueue" }
  switchToTv:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "switchtotv" }
  switchToLine:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "switchtoline" }
  volume:slider,0,1,100 sonos/RINCON_5CAAFD79D52801400/control { "command": "volume", "input": $EVTPART1 }
  mute:true,false { my $value = $EVTPART1 eq "true" ? "mute" : "unmute"; qq(sonos/RINCON_5CAAFD79D52801400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "next" }
  previous:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "previous" }
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_5CAAFD79D52801400/control $payload)}
  joinGroup:textField sonos/RINCON_5CAAFD79D52801400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_5CAAFD79D52801400","groupName","all"); qq(sonos/RINCON_5CAAFD79D52801400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_5CAAFD79D52801400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  notify:textField sonos/RINCON_5CAAFD79D52801400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
  webCmd     previous:play:pause:next::::volumeDown:volume:volumeUp:mute
  webCmdLabel     ::::::::::Mute


Finde das so ein wenig schöner und gut zu verwalten... Habe die X Seiten hierzwischen nicht nachgelesen. Ich freue mich über Feedback. Danke

HINWEIS: Habe um 11:32 nochmal was angepasst (verschiedene Player sprechen verschieden. Die Play ONE hat bei mir z.B. kein TRANSITIONING. Die Play 1 aber schon).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 18 Juni 2020, 12:53:56
Diese Ansicht finde ich auch nett!

Vielleicht noch das hier:
Zitat von: Beta-User am 09 Juni 2020, 18:01:21
attr Test10 readingList [...]
  mute:iconSwitch,on,rc_MUTE,off,rc_VOLUP { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
[...]
und setStateList?

Ich bin mir auch nicht sicher, ob wir play/stop/pause nicht irgendwie in "state" bekommen sollten (dann könnte man auch iconSwitch für play/pause verwenden?), aber da fehlt mir grade auch der Überblick, wie da was dazu zurückkommt...(?)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 18 Juni 2020, 14:10:46
Weil keiner mehr was zu dem Status-Icon ohne Perl in devstateIcon der Bridge sagte hab ich mir was ausgedacht wie man einen Text passend zum Icon anzeigt, wenn man überhaupt einen will.
Mit der Umsetzung kann ich aber auch völlig auf dem Holzweg sein.

Ganz ohne Perl gings aber nicht, dafür aber in der RL.
Habs versucht direkt im connected-Readinglist-Eintrag umzusetzen aber nicht hinbekommen.

defmod MQTT2_SONOS_BRIDGE MQTT2_DEVICE mqttjs_77e3f505
attr MQTT2_SONOS_BRIDGE IODev MQTT2_Server
attr MQTT2_SONOS_BRIDGE bridgeRegexp sonos/(RINCON_[A-Z0-9]+):.* "$1"
attr MQTT2_SONOS_BRIDGE devStateIcon icon.2:10px-kreis-gruen icon.1:10px-kreis-gelb icon.0:10px-kreis-rot
attr MQTT2_SONOS_BRIDGE icon mqtt_bridge_2
attr MQTT2_SONOS_BRIDGE model sonos2mqtt_bridge
attr MQTT2_SONOS_BRIDGE readingList sonos/connected:.* connected\
sonos/connected:.* {my $var = $EVENT == 0 ? "offline" : $EVENT == 1 ? "online": "connected";;{'state' => $var}}\
homeassistant/music_player/RINCON_([0-9A-Z]+)/sonos/config:.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),;; { "config_$1"=>$EVENT }}\
  sonos/status/[^/]+/avtransport:.* {}\
  sonos/status/[^/]+/renderingcontrol:.* {}
attr MQTT2_SONOS_BRIDGE room MQTT2_DEVICE
attr MQTT2_SONOS_BRIDGE stateFormat icon:connected\
state

setstate MQTT2_SONOS_BRIDGE icon:2\
connected
setstate MQTT2_SONOS_BRIDGE 2020-06-18 14:04:14 config_RINCON_000E58F7F67C01400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_000E58F7F67C01400/control","device":{"identifiers":["RINCON_000E58F7F67C01400"],"manufacturer":"Sonos","name":"Wohnzimmer"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_000E58F7F67C01400","name":"Wohnzimmer","state_topic":"sonos/RINCON_000E58F7F67C01400","unique_id":"sonos2mqtt_RINCON_000E58F7F67C01400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
setstate MQTT2_SONOS_BRIDGE 2020-06-18 14:04:14 connected 2
setstate MQTT2_SONOS_BRIDGE 2020-06-18 14:04:14 state connected


edit:

bezogen auf die letzte Frage hier (https://forum.fhem.de/index.php/topic,111711.msg1065662.html#msg1065662) dann so:

defmod MQTT2_SONOS_BRIDGE MQTT2_DEVICE mqttjs_77e3f505
attr MQTT2_SONOS_BRIDGE IODev MQTT2_Server
attr MQTT2_SONOS_BRIDGE bridgeRegexp sonos/(RINCON_[A-Z0-9]+):.* "$1"
attr MQTT2_SONOS_BRIDGE comment {my $var = ReadingsVal($name,"connected","no artist") eq "0" ? "not connected" : ReadingsVal($name,"connected","no artist") eq "1" ? "no SONOS Device" : "connected";;\
{qq(connected<br>$var)};;}
attr MQTT2_SONOS_BRIDGE devStateIcon icon.2:10px-kreis-gruen icon.1:10px-kreis-gelb icon.0:10px-kreis-rot
attr MQTT2_SONOS_BRIDGE icon mqtt_bridge_2
attr MQTT2_SONOS_BRIDGE model sonos2mqtt_bridge
attr MQTT2_SONOS_BRIDGE readingList sonos/connected:.* connected\
sonos/connected:.* {my $var = $EVENT == 0 ? "disconnected" : "running";;{'state' => $var}}\
homeassistant/music_player/RINCON_([0-9A-Z]+)/sonos/config:.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),;;;; { "config_$1"=>$EVENT }}\
homeassistant/music_player/RINCON_([0-9A-Z]+)/sonos/config:.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),;; { "config_$1"=>$EVENT }}\
  homeassistant/music_player/RINCON_([0-9A-Z]+)/sonos/config:.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),;; { "config_$1"=>$EVENT }}\
  sonos/status/[^/]+/avtransport:.* {}\
  sonos/status/[^/]+/renderingcontrol:.* {}
attr MQTT2_SONOS_BRIDGE room MQTT2_DEVICE
attr MQTT2_SONOS_BRIDGE stateFormat icon:connected\
state

setstate MQTT2_SONOS_BRIDGE icon:2\
running
setstate MQTT2_SONOS_BRIDGE 2020-06-19 12:28:11 config_RINCON_000E58F7F67C01400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_000E58F7F67C01400/control","device":{"identifiers":["RINCON_000E58F7F67C01400"],"manufacturer":"Sonos","name":"Wohnzimmer"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_000E58F7F67C01400","name":"Wohnzimmer","state_topic":"sonos/RINCON_000E58F7F67C01400","unique_id":"sonos2mqtt_RINCON_000E58F7F67C01400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
setstate MQTT2_SONOS_BRIDGE 2020-06-19 12:28:11 connected 2
setstate MQTT2_SONOS_BRIDGE 2020-06-19 12:28:11 state running

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 18 Juni 2020, 14:44:13
Zitat von: Beta-User am 18 Juni 2020, 12:53:56
Diese Ansicht finde ich auch nett!

Vielleicht noch das hier:und setStateList?

Ich bin mir auch nicht sicher, ob wir play/stop/pause nicht irgendwie in "state" bekommen sollten (dann könnte man auch iconSwitch für play/pause verwenden?), aber da fehlt mir grade auch der Überblick, wie da was dazu zurückkommt...(?)

Hab mir mal Mühe gegeben und hab etwas ganz ohne Perl gebaut. Aber nochmal anders als vorhin und alles in devstateicon gepackt. So kann ich auch ein/ausblenden.
Ich weiß nur nicht wie ich den Slider da noch rein bekomme (deswegen aktuell zusätzlich in webcmd). Das ist nur ein erster Entwurf und auch die 1px Schummelei, da ich kein Perl nutzen kann und keine bessere Idee hab. Aber in diese Richtung wird sich das bei mir bewegen. Track Info usw wollte ich noch einbauen...

Attributes:
   IODev      sonosmqtt
   alias      Küche
   devStateIcon STOPPED:rc_PLAY@green:play
(pause|stop):rc_STOP@red:play
PLAYING:rc_STOP@red:stop
(TRANSITIONING|play):rc_PLAY@yellow:stop
mute:audio_volume_mute@yellow
volume:audio_volume_mid@yellow
volumeDown:audio_volume_low@yellow
volumeUp:audio_volume_high@yellow
next:rc_NEXT@yellow:stop
previous:rc_PREVIOUS@yellow:stop
(next|mute|volumeDown|volumeUp|previous|pause|volume|STOPPED|TRANSITIONING|play|stop).(false|previous|next|volumeDown|volumeUp|[0-9]+):1px-spacer
PLAYING.previous:rc_PREVIOUS:previous
PLAYING.next:rc_NEXT:next
PLAYING.volumeDown:rc_VOLDOWN:volumeDown
PLAYING.volumeUp:rc_VOLUP:volumeUp
PLAYING.false:audio_volume_high:mute+true
PLAYING.true:audio_volume_mute:mute+false
   icon       audio_volume_low
   jsonMap    volume_Master:volume mute_Master:mute transportState:state
   model      sonos2mqtt_speaker
   readingList sonos/status/küche/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }
  sonos/status/küche/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }
  sonos/RINCON_7828CAF4289001400:.* { json2nameValue($EVENT,'',$JSONMAP) }
   room       MQTT2_DEVICE
   setList    stop:noArg sonos/RINCON_7828CAF4289001400/control { "command": "stop" }
  play:noArg sonos/RINCON_7828CAF4289001400/control { "command": "play" }
  pause:noArg sonos/RINCON_7828CAF4289001400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_7828CAF4289001400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_7828CAF4289001400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_7828CAF4289001400/control { "command": "volumedown" }
  switchToQueue:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtoqueue" }
  switchToTv:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtotv" }
  switchToLine:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtoline" }
  volume:slider,0,1,100 sonos/RINCON_7828CAF4289001400/control { "command": "volume", "input": $EVTPART1 }
  mute:true,false { my $value = $EVTPART1 eq "true" ? "mute" : "unmute"; qq(sonos/RINCON_7828CAF4289001400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_7828CAF4289001400/control { "command": "next" }
  previous:noArg sonos/RINCON_7828CAF4289001400/control { "command": "previous" }
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_7828CAF4289001400/control $payload)}
  joinGroup:textField sonos/RINCON_7828CAF4289001400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_7828CAF4289001400","groupName","all"); qq(sonos/RINCON_7828CAF4289001400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_7828CAF4289001400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  notify:textField sonos/RINCON_7828CAF4289001400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
   stateFormat [$name:state]
[$name:state].previous
[$name:state].next
[$name:state].volumeDown
[$name:state].[$name:volume]
[$name:state].volumeUp
[$name:state].[$name:mute]
   webCmd     volume


Hier werden auch die ganzen zwischenstati mitgenommen. Also wenn z.B. Play gedrückt wird, buffert er erstmal und das wird gelblich dargestellt. Das erste Icon nehme ich zur Anzeige aller Befehel. Also wenn z.B. volumeUp genutzt wird, wird das erste Icon kurz gelb und zeigt ein entsprechendes Icon an. So hat man auch direkt Feedback ob man getroffen hat und was.

Dazu sieht man einen laufenden Player sofort.

EDIT: IST ABER AUCH NOCH NICHT GANZ FERTIG!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 18 Juni 2020, 14:48:47
? Mein vorheriger Post macht doch nicht mehr Perl? Er stellt eben nur entweder ein mute oder ein unmute-Symbol in webCmd dar...?

Und bitte klärt asap, was in setStateList soll. Erst danach macht es Sinn, über devStateIcon und die dortigen Ersetzungsregexe zu spekulieren (ohne Perl).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 18 Juni 2020, 14:54:41
Zitat von: Beta-User am 18 Juni 2020, 14:48:47
? Mein vorheriger Post macht doch nicht mehr Perl? Er stellt eben nur entweder ein mute oder ein unmute-Symbol in webCmd dar...?

Und bitte klärt asap, was in setStateList soll. Erst danach macht es Sinn, über devStateIcon und die dortigen Ersetzungsregexe zu spekulieren (ohne Perl).

Das mit dem "kein Perl" ist darauf bezogen das du dir das mal gewünscht hattest und ich an dem Tag keine Zeit und Lust mehr hatte. Was deine Zeile genau macht, habe ich auf die Schnelle nicht erkennen können.

Ich finde es gut wenn alles über state kommt. Ich finde man muss hier nichts auslagern. Ich möchte ja die zwischen Stati von mqtt2sonos nutzen und brauche keine mit Rückinfo von FHEM. (wenn ich nicht verstehe wofür du es genau siehst, sag bitte warum....).


EDIT: Weiß jemand wie ich den Slider in devStateIcon bekomme? Da steht aktuell im Bild z.B. "PLAYING.6"
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 18 Juni 2020, 15:02:46
Ich finde es selten gut, wenn Anweisungen, die sich auf Readings beziehen, nicht _dort_ als "set_.*" auftauchen, sondern über state laufen.

Ist sicher auch Geschmackssache, aber spätestens dann, wenn man nur Differenzupdates bekommt, steht veraltete Info in state, wenn man das nicht so macht. Von daher stellt sich mir die Frage, warum man den Kreis nicht an der Stelle von vornherein sauber schließt...

Und die "einfache" Form finde ich (auch) eine elegante Sache, von daher fände ich es gut, wenn der User die Wahl zwischen beiden Varianten hat.

Zitat von: 87insane am 18 Juni 2020, 14:54:41
Was deine Zeile genau macht, habe ich auf die Schnelle nicht erkennen können.
Dann teste es halt, ob es macht, was ich schreibe:
Zitat von: Beta-User am 18 Juni 2020, 14:48:47
Er stellt eben nur entweder ein mute oder ein unmute-Symbol in webCmd dar.
ZitatEDIT: Weiß jemand wie ich den Slider in devStateIcon bekomme? Da steht aktuell im Bild z.B. "PLAYING.6"
Das geht nur mit Perl, sonst kann man slider nur via webCmd "rechts" sichtbar machen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 18 Juni 2020, 15:08:21
ZitatEr stellt eben nur entweder ein mute oder ein unmute-Symbol in webCmd dar.
Ich habe ein mute und unmute Symbol... Das ist da alles schon drin.

Was setStateList angeht, diskutiere ich gerne mit aber habe nach ein wenig testen echt besser Infos bekommen in dieser Form.
Ich werde mal weiter basteln und ggf. findet sich jemand der anhand dessen beurteilen kann, was er lieber so oder so hätte. Dann könnte man das quasi anders rum erschlagen, wenn gewünscht..

ZitatDas geht nur mit Perl, sonst kann man slider nur via webCmd "rechts" sichtbar machen.
Okay - So hab ichs ja..
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 18 Juni 2020, 15:27:17
Zitat von: 87insane am 18 Juni 2020, 15:08:21
Ich habe ein mute und unmute Symbol... Das ist da alles schon drin.
Und ich schlage nur _ein_ mute _oder_ unmute Symbol vor... Man braucht immer nur eines der beiden, nämlich das, das grade passend ist ;) .

Zitat von: 87insane am 18 Juni 2020, 15:08:21
Was setStateList angeht, diskutiere ich gerne mit aber habe nach ein wenig testen echt besser Infos bekommen in dieser Form.
Was besser ist, hängt eben auch davon ab, was zurückkommt, und da bin ich ziemlich blind. Ich _glaube_ aber, dass wir eine sehr viel feinere Weiterverarbeitung bräuchten als das derzeit der Fall ist, von daher ist das in der jetzigen Form vermutlich eben nur "soso lala" bzw. "ganz ok", aber eben nicht "top cool" bzw. "akkurat", und es wäre sinnvoll, die Energie eher in die weitere Aufarbeitung zu stecken, bevor man die Feinarbeiten macht... (ihr kennt ja meine Ansprüche und hattet an der Lampe gerieben  :P ...)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 18 Juni 2020, 15:33:15
Dann reibe ich noch mehr dran und bitte um Beispiele. Du weißt das unsere Sprachen nicht immer so ganz kompatibel sind ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 18 Juni 2020, 15:55:47
...dann also nochmal:
1. Tausche die Zeile für mute aus.
2. Vorläufig mal "play pause stop" nach setStateList schreiben, (evtl. noch toggle, falls das zwischen play und pause wechselt?).

Zum Rest würde ich "traffic" benötigen. Um es mal auf zwei Sachverhalte runterzubrechen:

a) Setzt man volume (auf 65), wird der Readingwert (mit obiger setStateList) zu "set_65". Kommt Vollzug zurück, wird "volume" auf "65" gesetzt => alles gut...

b) Ich gehe z.B. davon aus, dass wenn man "volumeUp" schaltet, man irgendwas zurückbekommt, aber die Frage ist: Was? Nur "volume", oder kommt auch (?) was auf "volumeup" (bzw. das via jsonMap umgeleitete passende Reading) zurück? Wenn da z.B. "done" oder der neue volume-Wert nach ->volumeup zurückkommt, ist der Kreis geschlossen. Also: User-Anweisung macht "volumeUp set_volumeUp", via MQTT kommt '"volumeup":70' zurück, jsonMap macht daraus "70" als neuen Wert von "volumeUp" => mMn. alles bestens. Kommt der Befehl nicht an, sieht man, welcher dass es war, und der wird auch nicht durch "offline" oä. überschrieben.

Klarer jetzt?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 18 Juni 2020, 17:11:30
Hab das den setList Eintrag angepasst. Bei mir ändert sich dann nur das Symbol wenn ich im Gerät auf set mute gehe. Dann steht da eben nicht true/false sondern ist dieses Icon.

Das mit setStateList soll bitte jemand machen, der sich damit auskennt. Ich verstehe die Beschreibung und gebe mir echt mühe dem zu folgen aber hier bin ich wohl zu blöd für!
Aladin möchte also eigentlich sowas wie einen internen "Bug-Finder"... So verstehe ich das zumindest. Ich lösche bis heute immer die ganzen setStateList aus allen Templates rauß... Ich komme da nicht in deiner Welt aus .-\
Verstehe das mit z.B. Volumen. Habe es ja auch oft schon gesehen... naja :-\

Wenn man volumeUp schaltet, geht es um 5 höher oder so. Man bekommt aber im Reading REND_Volume_Master .... auch einfach die PCT. Das ist bei fast allen Sachen so.


Hab aber mal ein wenig rum gebastelt und bin wieder ein wenig weiter gekommen. Man muss die Menge ja auch animieren weiter zu machen :)
@Beta-User: Bitte keine Schläge....

@alle Anderen... Bitte sagt was dazu und ggf. geht ihr noch auf die Anforderungen von Beta-User ein. Das Projekt soll nicht einschlafen :)

Anbei attr. List:
Attributes:
   IODev      sonosmqtt
   alias      Küche
   devStateIcon STOPPED:rc_PLAY@green:play
(pause|stop):rc_STOP@red:play
PLAYING:rc_STOP@red:stop
(TRANSITIONING|play):rc_PLAY@yellow:stop
mute:audio_volume_mute@yellow
volume:audio_volume_mid@yellow
volumeDown:audio_volume_low@yellow
volumeUp:audio_volume_high@yellow
next:rc_NEXT@yellow:stop
previous:rc_PREVIOUS@yellow:stop
STOPPED.(false|previous|next|volumeDown|volumeUp|[0-9]+|CURRENT.*|NEXT.*):rc_BLANK
\b(?!STOPPED\b)\w+.previous:rc_PREVIOUS:previous
\b(?!STOPPED\b)\w+.next:rc_NEXT:next
\b(?!STOPPED\b)\w+.volumeDown:rc_VOLDOWN:volumeDown
\b(?!STOPPED\b)\w+.volumeUp:rc_VOLUP:volumeUp
\b(?!STOPPED\b)\w+.false:rc_VOLUP:mute+true
\b(?!STOPPED\b)\w+.true:rc_MUTE:mute+false
   icon       audio_volume_low
   jsonMap    volume_Master:volume mute_Master:mute transportState:state
   model      sonos2mqtt_speaker
   readingList sonos/status/küche/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }
  sonos/status/küche/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }
  sonos/RINCON_7828CAF4289001400:.* { json2nameValue($EVENT,'',$JSONMAP) }
   room       MQTT2_DEVICE
   setList    stop:noArg sonos/RINCON_7828CAF4289001400/control { "command": "stop" }
  play:noArg sonos/RINCON_7828CAF4289001400/control { "command": "play" }
  pause:noArg sonos/RINCON_7828CAF4289001400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_7828CAF4289001400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_7828CAF4289001400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_7828CAF4289001400/control { "command": "volumedown" }
  switchToQueue:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtoqueue" }
  switchToTv:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtotv" }
  switchToLine:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtoline" }
  volume:slider,0,1,100 sonos/RINCON_7828CAF4289001400/control { "command": "volume", "input": $EVTPART1 }
  mute:iconSwitch,true,rc_MUTE,false,rc_VOLUP { my $value = $EVTPART1 eq "true" ? "mute" : "unmute";; qq(sonos/RINCON_7828CAF4289001400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_7828CAF4289001400/control { "command": "next" }
  previous:noArg sonos/RINCON_7828CAF4289001400/control { "command": "previous" }
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_7828CAF4289001400/control $payload)}
  joinGroup:textField sonos/RINCON_7828CAF4289001400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_7828CAF4289001400","groupName","all"); qq(sonos/RINCON_7828CAF4289001400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_7828CAF4289001400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  notify:textField sonos/RINCON_7828CAF4289001400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
   stateFormat [$name:state]
[$name:state].previous
[$name:state].next
[$name:state].volumeDown
[$name:state].volumeUp
[$name:state].[$name:mute]
<br>
[$name:state] CURRENT: [$name:AV_CurrentTrackMetaData_Artist] - [$name:AV_CurrentTrackMetaData_Title]
<br>
[$name:state] NEXT: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[$name:AV_NextTrackMetaData_Artist] - [$name:AV_NextTrackMetaData_Title]



So wie im Bild zu sehen, reagiert meine Version aktuell auf alle Befehle. So sieht man im ersten Icon immer was man geklickt hat. Dies verschwindet nach kurzer Zeit und wird wieder zum normalem Play Button.....usw
Man sieht vermutlich in der Programmierung auch wo ich gefudelt habe. Aber das wäre Perl freies devstateicon mit stateformat.

EDIT: MUTE Symbol ist in den Bildern noch das falsche aber ist korrigiert.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 18 Juni 2020, 17:41:45
ZitatIch finde es gut wenn alles über state kommt. Ich finde man muss hier nichts auslagern. Ich möchte ja die zwischen Stati von mqtt2sonos nutzen und brauche keine mit Rückinfo von FHEM. (wenn ich nicht verstehe wofür du es genau siehst, sag bitte warum....).

Sehe das genauso, es kommt doch über transportState zu jedem Befehl immer eine Rückmeldung.
Und nein da kommt nix extra zurück bei volumeup/down, immer der komplette Json vom Rincon-Pfad und dort dann in volume_Master +/-4 nicht 5.

Setze ich ein play ab steht zuerst der Befehl play in state, dann kommt solange über transportState TRANSITIONING zurück  bis das spielen wirklich beginnt was dann mit einem PLAYING zurückkommt. Darum zeig ich in meinem devstateIcon-Beispiel in jedem span den state an wenn er nicht PLAYING ist.

bei einem stop erst der Befehl stop dann kommt STOPPED zurück.

bei einem pause erst wieder der Befehl pause dann kommt STOPPED zurück

bei einem toggle, toggle dann solange TRANSITIONING bis Playing zurückkommt.

man hat doch immer eine Rückmeldung.

Ich würde ja auch gerne Beta-User verstehen und hab mir das mit der setstateList hier  wieder mal angeschaut, komm aber auch nicht mit auf was er aus ist, liegt einfach daran das er in dieser Beziehung blind ist und wir bisher wohl nicht fähig die richtigen Daten zu liefern, die zum Verständnis hätten beitragen können.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 18 Juni 2020, 17:52:36
Vorab mal: Den Bilden nach ist das optisch schwer ok und auch die Funktionalität ist m.E. gut gelungen!
Vor allem, dass in dem Vorschlag jetzt schon je nach "Zustand" sehr unterschiedliche Icon-Listen erscheinen, ist super! (Wie immer gefällt mir nur das mit der Einfärberei nicht; das ist hier aber eher von untergeordneter Relevanz).

Bei setStateList geht es nicht nur um einen Bug-Finder, sondern z.B. auch darum, dass man on-for-timer usw. sauber visualisieren kann (vielleicht kann man zukünftig ja Sonos-Geräte darüber ja auch mal ausschalten?), und eben alles dahin "aufgeräumt wird", wo es m.E. nach hingehört. Und "volume"-Anweisungen gehören jedenfalls meiner Meinung nach einfach nicht in "state", that's all... Aber wenn ihr entscheidet, dass das (hier) nicht wichtig ist: auch ok, und jedenfalls kein Anlaß, irgendjemand zu verhauen ;D ...

Dass die Rückmeldungen ggf. nicht 1:1 zu den settern passen, ist unschön, aber letztlich kein Grund um aus dem Fenster zu springen, dann bliebe eben volumeUp ewig auf "set_volumeUp" und nur der Zeitstempel wird aktualisiert. Und "auskennen" muß man sich mit setStateList nicht wirklich, darüber wird nur entschieden, welche set-Commands im state landen und welche eben nicht (nämlich alle anderen). Ist nicht wirklich kompliziert, oder? (Aber nochmal: gelobt sei, was funktioniert und ordentlich aussieht ;) ).

Zitat von: 87insane am 18 Juni 2020, 17:11:30
Hab das den setList Eintrag angepasst. Bei mir ändert sich dann nur das Symbol wenn ich im Gerät auf set mute gehe. Dann steht da eben nicht true/false sondern ist dieses Icon.
Das war ja genau beabsichtigt. Die Frage ist nur, ob immer ein (passendes) Icon angezeigt wird, oder ob es Lücken gibt (dann macht das keinen Sinn, wenn wir keinen Weg fänden, das zu ändern; aber auch dazu brächte ich dann Futter/Infos/traffic).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 18 Juni 2020, 18:01:21
ZitatVorab mal: Den Bilden nach ist das optisch schwer ok und auch die Funktionalität ist m.E. gut gelungen!
Vor allem, dass in dem Vorschlag jetzt schon je nach "Zustand" sehr unterschiedliche Icon-Listen erscheinen, ist super! (Wie immer gefällt mir nur das mit der Einfärberei nicht; das ist hier aber eher von untergeordneter Relevanz).
Danke!
Einfärben hat hier folgende Prio (wobei gelb echt doof ist! [kontrast])...
gelb ist Info und verschwindet nach ca. 1er Sekunde wieder
grün ist wenn der Player aus ist
rot ist wenn der Player an ist
hinzu sind Aktueller und nächster Titel gefudelt unsichtbar
alle Icons sind nur da, wenn die auch sinn machen

Das war an sich so mein Wunsch. Wenn Speak jetzt noch ginge würde ich umstellen! Ein Cover wie im Sonos Modul wäre geil aber für mich kein muss. Ich ziele hier beabsichtigt auf Statusänderungen im ersten Symbol, denn wenn ich ein Handy nutze und ggf nicht treffe, sehe ich wenigstens was ich getroffen habe, weil der finger auf einem der nebenliegenden Icons liegt.

ZitatBei setStateList geht es..
Ggf. sagst du was du genau brauchst und baust das? Ich würde dir alles rauß suchen mit genauer Anleitung durch dich.. Von mir aus auch Teamviewer..

ZitatDass die Rückmeldungen ggf. nicht 1:1 zu den settern passen, ist unschön, aber letztlich kein Grund um aus dem Fenster zu springen, dann bliebe eben volumeUp ewig auf "set_volumeUp" und nur der Zeitstempel wird aktualisiert. Und "auskennen" muß man sich mit setStateList nicht wirklich, darüber wird nur entschieden, welche set-Commands im state landen und welche eben nicht (nämlich alle anderen). Ist nicht wirklich kompliziert, oder? (Aber nochmal: gelobt sei, was funktioniert und ordentlich aussieht ;) ).
Ja mit dem Stempel wollte ich auch erst arbeiten. Ist in meinem Fall sogar nur ein :t mehr. Aber ich bin noch nicht ganz dabei (vom Verstand her...). Ist in meinen Augen mehr Aufwand für das gleiche Ziel, ohne Vorteile.

ZitatDas war ja genau beabsichtigt. Die Frage ist nur, ob immer ein (passendes) Icon angezeigt wird, oder ob es Lücken gibt (dann macht das keinen Sinn, wenn wir keinen Weg fänden, das zu ändern; aber auch dazu brächte ich dann Futter/Infos/traffic).
Naja... ich frage mich wofür ich das überhaupt tun sollte. Über sie setter in dem menu geh ich so gut wie nie. Denke mit einem guten Design im Stateformat/devStateIcon, braucht man die nicht mehr. Alles andere geht eh über notify/doif oder sonst was. Aber dann lese ich lieber 1zu1 wie der Befehl heißt. Dafür müsste ich mit der Lösung auf dem Symbol bleiben mit der Maus und den Tooltip abwarten. Ist ne lustige Sache aber an der Stelle mMn. unnütz. (ich weiß das list oder sonst was auch gingen.. aber wieder Umwege?)
Antw auf deine Frage: Ja, wenn es so aussieht:
mute:iconSwitch,false,rc_MUTE,true,rc_VOLUP { my $value = $EVTPART1 eq "true" ? "mute" : "unmute";; qq(sonos/RINCON_7828CAF4289001400/control { "command": "$value" } ) }

Hat eigentlich jemand sowas wie aktuelle Zeit des gespielten Titels gesehen? Ich finde nur Insgesamtlänge aktuell/nächster.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 18 Juni 2020, 20:25:34
@beta-user: eine online/offline Verknüpfung zur Bridge...gibt es sowas bisher? Hätte gerne das wenn die bridge nicht da ist, auch nix schaltbar ist oder in allen Geräten angezeigt wird das die bridge off ist. Für gewöhnlich schiebt man die bridge(s) ja in hidden oder sonst was...

Sonst würde ich den connect zweig übernehmen. Aber das wäre sicher nicht das beste. Kann man bestimmt was in der bridge selber weiter geben ...oder wie genau würde das laufen?
Geht mir auch um Bug fixing. Eine Bridge läuft für normal immer. Aber wenn mal nicht guckt man danach als User vermutlich auch als letztes. Deswegen würde ich das auch generell ggf übernehmen, wenn nichts dagegen spricht.

PS: Das hier wollte ich mal erwähnen, wenn es jemand noch nicht kennen sollte. Ist ganz interessant für die, die hier Module bauen :)
https://github.com/hobbyquaker/xyz2mqtt-skeleton
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 18 Juni 2020, 21:57:02
Das min online/offline war das LWT-Thema. Afaik gibt es dazu bisher nichts, auch nicht an der Bridge, es sei denn, die "0" wäre das entsprechend dem (über die von dir verlinkte Seite zu erreichende Empfehlung von hier: https://github.com/mqtt-smarthome/mqtt-smarthome/blob/master/Architecture.md
ZitatIt should ensure that this is set to 0 using MQTT's Last Will and Testament functionality upon a disconnect.

(sonst könnte man diesen Topic einfach auch in allen Sub-Devices abonnieren).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 18 Juni 2020, 22:01:25
Schön wie du es drehst :-P
Also der lastwill vom Server kann weitervererbt werden. Okay. Mal sehen was da geht.

Hat jemand den Dienst schon dauerhaft am rennen?

Edit: so hab ich ja auch meine Bridge eingerichtet. Wie geht das weiterverwenden nach Schema " wie gewünscht?" einfach überall mit übernehmen?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 18 Juni 2020, 23:06:38
Ach ja und wir haben einen Zweig übersehen...

sonos2mqtt:sonos/RINCON_1A2B3EblaHex/error:.* { json2nameValue($EVENT) }

Was mich auch daran denken lässt, wenn man eine hinzu fügt. Für uns kein Thema aber die Bridge legt kein neues Gerät an via autocreate. Sonst hätte sie auch die neuen readings rüber geschuppst..
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 19 Juni 2020, 07:51:05
Zitat von: 87insane am 18 Juni 2020, 23:06:38
Ach ja und wir haben einen Zweig übersehen...
sonos2mqtt:sonos/RINCON_1A2B3EblaHex/error:.* { json2nameValue($EVENT) }
Kannst du mal schauen, ob das diese bridgeRegexp  beseitigt:
  BASE_TOPIC/(RINCON_[A-Z0-9]+)[:/].* "$1"


Zitat von: 87insane am 18 Juni 2020, 22:01:25
Also der lastwill vom Server kann weitervererbt werden. Okay. Mal sehen was da geht.
Einfach auch BASE_TOPIC/connected:.* connected\nutzen. Wobei wir hier ja nicht wissen, ob sich eine "2" auf den konkreten Speaker bezieht oder einen anderen. Von daher wäre es evtl. besser, hier eine andere Readingbenennung ("bridgeConnected" ?) zu verwenden und ggf. nur zwischen "disconnected" (=> 0) und "running" (=> 1 oder 2) zu unterscheiden?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 19 Juni 2020, 11:37:29
ZitatKannst du mal schauen, ob das diese bridgeRegexp  beseitigt:
Code: [Auswählen]
  BASE_TOPIC/(RINCON_[A-Z0-9]+)[:/].* "$1"
Ergibt im korrektem Device:
error_Action  Next  2020-06-19 11:31:11
error_Fault  UPnPError  2020-06-19 11:31:11
error_FaultCode  s:Client  2020-06-19 11:31:11
error_UpnpErrorCode  701  2020-06-19 11:31:11
error_name  SonosError  2020-06-19 11:31:11

Diesen Fehler habe ich provoziert indem ich Radio gestreamt habe und auf next drückte. Kommt also an wo es soll.... Danke!


ZitatBASE_TOPIC/connected:.* connected\
Habe es hinzugefügt und muss noch nachdenken. An sich kann man das ja ruhig komplett auswerten.
0 = Dienst aus
1 = Dienst an aber keine Endgeräte gefunden
2 = Dienst läuft und Endgeräte gefunden. (normal Status)

Ich teste mal ein wenig...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 19 Juni 2020, 12:13:56
Hab nun alles soweit... Denke das finde ich gut so und auch noch ohne Perl...

attr List:
Attributes:
   IODev      sonosmqtt
   alias      Küche
   devStateIcon 0:10px-kreis-rot
1:10px-kreis-gelb
2:10px-kreis-gruen
(0|1).(STOPPED|PAUSED_PLAYBACK):rc_BLANK
2.(STOPPED|PAUSED_PLAYBACK):rc_PLAY@green:play
2.(pause|stop):rc_STOP@red:play
2.PLAYING:rc_STOP@red:stop
2.(TRANSITIONING|play):rc_PLAY@yellow:stop
2.mute:audio_volume_mute@yellow:stop
2.volume:audio_volume_mid@yellow:stop
2.volumeDown:audio_volume_low@yellow:stop
2.volumeUp:audio_volume_high@yellow:stop
2.next:rc_NEXT@yellow:stop
2.previous:rc_PREVIOUS@yellow:stop
(STOPPED|PAUSED_PLAYBACK).(false|previous|next|volumeDown|volumeUp|[0-9]+|CURRENT.*|NEXT.*|PAUSED_PLAYBACK):rc_BLANK
\b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.previous:rc_PREVIOUS:previous
\b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.next:rc_NEXT:next
\b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.volumeDown:rc_VOLDOWN:volumeDown
\b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.volumeUp:rc_VOLUP:volumeUp
\b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.false:rc_VOLUP:mute+true
\b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.true:rc_MUTE:mute+false
   icon       audio_volume_low
   jsonMap    volume_Master:volume mute_Master:mute transportState:state
   model      sonos2mqtt_speaker
   readingList sonos/status/küche/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }
  sonos/status/küche/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }
  sonos/RINCON_7828CAF4289001400:.* { json2nameValue($EVENT,'',$JSONMAP) }
  sonos/connected:.* bridgeConnected
sonos/RINCON_7828CAF4289001400/error:.* { json2nameValue($EVENT) }
   room       Küche,MQTT2_DEVICE
   setList    stop:noArg sonos/RINCON_7828CAF4289001400/control { "command": "stop" }
  play:noArg sonos/RINCON_7828CAF4289001400/control { "command": "play" }
  pause:noArg sonos/RINCON_7828CAF4289001400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_7828CAF4289001400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_7828CAF4289001400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_7828CAF4289001400/control { "command": "volumedown" }
  switchToQueue:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtoqueue" }
  switchToTv:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtotv" }
  switchToLine:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtoline" }
  volume:slider,0,1,100 sonos/RINCON_7828CAF4289001400/control { "command": "volume", "input": $EVTPART1 }
  mute:iconSwitch,false,rc_MUTE,true,rc_VOLUP { my $value = $EVTPART1 eq "true" ? "mute" : "unmute";; qq(sonos/RINCON_7828CAF4289001400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_7828CAF4289001400/control { "command": "next" }
  previous:noArg sonos/RINCON_7828CAF4289001400/control { "command": "previous" }
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_7828CAF4289001400/control $payload)}
  joinGroup:textField sonos/RINCON_7828CAF4289001400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_7828CAF4289001400","groupName","all"); qq(sonos/RINCON_7828CAF4289001400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_7828CAF4289001400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  notify:textField sonos/RINCON_7828CAF4289001400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
   stateFormat [$name:bridgeConnected]
[$name:bridgeConnected].[$name:state]
[$name:state].previous
[$name:state].next
[$name:state].volumeDown
[$name:state].volumeUp
&nbsp;&nbsp;&nbsp;
[$name:state].[$name:mute]
<br>
[$name:state] CURRENT: [$name:AV_CurrentTrackMetaData_Artist] - [$name:AV_CurrentTrackMetaData_Title] - ([$name:currentTrack_Duration])
<br>
[$name:state] NEXT: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[$name:AV_NextTrackMetaData_Artist] - [$name:AV_NextTrackMetaData_Title] - ([$name:nextTrack_Duration])


Kürze Erklärung:
roter / gelber Punkt: Das Design habe ich untereinander komplett in Abhängigkeiten gesetzt. Wenn die Bride offline ist oder aber keine Geräte gefunden hat, gibt es auch keinen Play Button.
grüner Punkt: Bridge ist online und hat Geräte gefunden. Play Button erscheint.
Den Rest kennt ihr ja schon.... Anbei auch mal ein Bild.
Wenn die Bridge online ist und Geräte gefunden hat
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 19 Juni 2020, 16:42:01
Werd's mal im wesentlichen so einchecken.

Für mich noch offene Fragen:
- Geben wir den Geschwistern mit und ohne Cover-devStateIcon unterschiedliche Namen und bieten beides an?
- Was ist mit "input"?
Das ist doch eigentlich eine Auswahl von einem Element aus vielen? Dann sollte das mMn. in einen Setter mit etwas Perl, um den richtigen Command draus zu machen. Damit das nicht wieder wegen "Chinesisch" versandet, ungetestet in etwa:
input:Queue,TV,Line_In { my $value = $EVTPART1 eq "Queue" ? "queue" : $EVTPART1 eq "TV" ? "tv" : "line";; qq(sonos/RINCON_7828CAF4289001400/control { "command": "switchto$value" } ) }
Das könnte man dann in webCmd verarbeiten und entsprechende cmdIcon setzen?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 19 Juni 2020, 17:47:22
Jetzt weiß ich wieder warum ich setStateList nie genutzt habe....

Hatte in dem Template mit dem Design einen Fehler gefunden. Es ist so, dass wenn der Player nichts spielt und man am Slider für Vol spielt, die Symbole kurz eingeblendet werden.
Nun dachte ich mir.. Beta-User wird schon wissen warum. Also setStateList genommen und "play pause stop next" rein gesteckt.
Das verhalten ist dann aber doof... zum testen next drin und previous nicht.

Nun ist es so das ich im erstem Symbol immer mitgeben will was geklickt wurde. Geht aber mit setStateList nicht, da diese den ganzen state überschreibt und dann ist stateFormat quasi unnütz. Somit wird dann alles ausgeblendet und nur noch das geklickte Symbol angezeigt. Wenn ich aber mehrstufige devSatetIcon nutzen will...wie? Was mache ich falsch?
Wenn ich auf next klicke,was mit in setStateList steht, bekomme ich es hin das dieses Symbol in gelb dargestellt wird aber alle anderen sind in dem Moment weg. Wenn ich z.B. previous klicke, was nicht in setStateList steht, bekomme ich nun nix mehr. Also wird das gelbe Symbol am Anfang nicht gezeigt aber er macht den Track weiter. So gesehen nicht schlimm. Aber dann behalte ich aus Design Gründen lieber den Bug und ohne setStateList.

Hoffe man versteht was ich meine.....
Bitte noch nicht einchecken! Will das Ding erst komplett haben.
Input kann ich nicht checken. Das kann nur Otto123. Ich habe nur Sonos Play 1 und Sonos Play One. Die können das nicht.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 19 Juni 2020, 18:10:44
Ähm, also:
- next war nicht für setStateList vorgeschlagen; wenn man was reinnimmt (was ich für next nach wie vor nicht sehe), sollte man es "paarig" machen.
- Geschrieben wird das Reading "state" bzw. nach setzen des Attributs eben teilweise nicht. stateFormat greift potentiell auf alle Readings zu nach jedem Event. Es ist also eher eine Frage des Codes, und es ist mAn. logisch, dass der komplexer werden muß, wenn mehr Elemente als nur "state" im Spiel sind.
Das muß man nicht mögen, und vermutlich geht es nur mit "etwas mehr Perl"; das ist aber auch kein Beinbruch, nur eben teilweise für die user nicht mehr so gut nachvollzieh- und anpassbar. Da es hier aber "sowieso" tricky ist, werden das die wenigstens auch nur in Erwägung ziehen...

Was das input-Thema angeht, deutet das darauf hin, dass wir mehrere attrTemplate haben sollten, weil setter, die nichts bewirken suboptimal sind.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 19 Juni 2020, 18:35:00
Zitatnext war nicht für setStateList vorgeschlagen; wenn man was reinnimmt (was ich für next nach wie vor nicht sehe), sollte man es "paarig" machen.
War zum testen und verstehen. Deswegen previous auch nicht.

Ich sehe setStateList als Unterstützer für "nicht Perl" Code. Das macht auch hier und da Sinn. Aber zuerst hatte ich in PERL angefangen, sollte nicht... Jetzt drehe ich das alles um und versuche was schönes drauß zu machen, geht aber nicht komplett und man munkelt über PERL.
Klar geht alles irgendwie. Aber die setter sollten doch auch Sinn machen?!

Wenn ich setStateList nutze und es gibt mir am Ende ein relatives Ergebnis zu anderen Ereignissen, ist das doch nicht konsistent! Entweder überschreibe ich alles oder inkrementell oder oder oder... Mich macht das gerade eher traurig, dass man immer wieder bei sowas hängen bleibt, weil einfach nichts Standard ist.
Ich würde jetzt, wo ich mich eh über dieses attr aufrege, gerne mal die Inspiration dazu hören.
Was ich verstanden habe ist warum volume nicht dahin gehört. Wenn ich aber über dieses attr "zusatz"-Möglichkeiten bekommen soll, warum nimmt es mir auch welche? Ich glaube, eigentlich sollte setStateList in zwei Varianten aufgeteilt werden. Die eine so wie jetzt, die andere, das sie eben nicht alles überschreibt.

Wenn du Zeit und Lust hast, lass uns das mal durchgehen. Es ist für diesen Zweck teilweise gut aber auch eben kontra. Ich kann Dir / Euch auch einen Player geben mit setStateList und ohne Veränderung des ersten Icons. Aber das finde ich eben ka***.




Anbei noch eben das wie Beta-User es vermutlich haben und auch machen würde... Soll nicht negativ oder so gemeint sein aber ich bin nach wie vor über setStateList in der Form negativ begeistert und kann mich nicht so wirklich freuen. Die List anbei macht leider nicht die Symbole am Anfang im ersten Icon sondern einfach stupide was der Player machen soll. Das entspricht aber so ziemlich den standard Templates. Was geblieben ist, ist das Ausblenden und Einblenden von Icons die nicht notwendig sind.

Mein Problem ist:
Entweder lebe ich damit, das man ohne setStateList das erste icon als Feedback nutzen kann aber wenn der Player offline ist oder nicht läuft und man spielt am (webcmd) Slider für VOL, schreibt dieser auch volume in state und somit werden kurzzeitig die Symbole alle eingeblendet. Wenn die Bridge aber zudem noch offline ist oder es keinen Player gibt (Zustand 0 oder 1), gibt es auch kein Feedback und alle Symbole bleiben eingeblendet. Das ist nicht sooo mega tragisch aber in meinen Augen sehr unschön, wenn man das nicht im Kopf hat.
Oder ich mache es so wie jetzt gleich angefügt und ich habe das Problem mit den Symbolen nicht mehr. Dafür aber eben meinen heiß geliebten Feedback Button verloren. Damit verschwindet natürlich einiges aus devStateicon und es ist nicht mehr so "komplex" aber es geht auch vieles verloren was in FHEM sicher gern mal gesehen würde... :)
Zumindest habe ich mit der Übung gelernt, wie genau setStateList aktuell läuft. Warum du es so gerne nutzt, bleibt für mich noch immer ein offenes Geheimnis. Denn es hilft ein wenig was zu umgehen und ggf. auch Fehler zu finden. Aber es sollte dann noch ein setstateList geben... Denke das ist die Bessere Übersetzung, für den Versuch oben.

Genug gejammert...

attrList:
Attributes:
   IODev      sonosmqtt
   alias      Küche
   devStateIcon 0:10px-kreis-rot
1:10px-kreis-gelb
2:10px-kreis-gruen
(0|1).(STOPPED|PAUSED_PLAYBACK):rc_BLANK
2.(STOPPED|PAUSED_PLAYBACK):rc_PLAY@green:play
2.(TRANSITIONING|play):rc_PLAY@yellow
(2.set_play|set_play):rc_PLAY@yellow
(2.set_stop|set_stop):rc_STOP@yellow
2.(pause|stop):rc_STOP@red:play
2.PLAYING:rc_STOP@red:stop
(STOPPED|PAUSED_PLAYBACK|set_stop).(false|previous|next|volumeDown|volumeUp|CURRENT.*|NEXT.*|PAUSED_PLAYBACK):rc_BLANK
\b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.previous:rc_PREVIOUS:previous
\b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.next:rc_NEXT:next
\b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.volumeDown:rc_VOLDOWN:volumeDown
\b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.volumeUp:rc_VOLUP:volumeUp
\b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.false:rc_VOLUP:mute+true
\b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.true:rc_MUTE:mute+false
\b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.set.false:rc_VOLUP:mute+true
\b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.set.true:rc_MUTE:mute+false
   icon       audio_volume_low
   jsonMap    volume_Master:volume mute_Master:mute transportState:state
   model      sonos2mqtt_speaker
   readingList sonos/status/küche/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }
  sonos/status/küche/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }
  sonos/RINCON_7828CAF4289001400:.* { json2nameValue($EVENT,'',$JSONMAP) }
  sonos/connected:.* bridgeConnected
sonos/RINCON_7828CAF4289001400/error:.* { json2nameValue($EVENT) }
   room       Küche,MQTT2_DEVICE
   setList    stop:noArg sonos/RINCON_7828CAF4289001400/control { "command": "stop" }
  play:noArg sonos/RINCON_7828CAF4289001400/control { "command": "play" }
  pause:noArg sonos/RINCON_7828CAF4289001400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_7828CAF4289001400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_7828CAF4289001400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_7828CAF4289001400/control { "command": "volumedown" }
  switchToQueue:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtoqueue" }
  switchToTv:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtotv" }
  switchToLine:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtoline" }
  volume:slider,0,1,100 sonos/RINCON_7828CAF4289001400/control { "command": "volume", "input": $EVTPART1 }
  mute:iconSwitch,false,rc_MUTE,true,rc_VOLUP { my $value = $EVTPART1 eq "true" ? "mute" : "unmute";; qq(sonos/RINCON_7828CAF4289001400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_7828CAF4289001400/control { "command": "next" }
  previous:noArg sonos/RINCON_7828CAF4289001400/control { "command": "previous" }
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_7828CAF4289001400/control $payload)}
  joinGroup:textField sonos/RINCON_7828CAF4289001400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_7828CAF4289001400","groupName","all"); qq(sonos/RINCON_7828CAF4289001400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_7828CAF4289001400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  notify:textField sonos/RINCON_7828CAF4289001400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
   setStateList play pause stop
   stateFormat [$name:bridgeConnected]
[$name:bridgeConnected].[$name:state]
[$name:state].previous
[$name:state].next
[$name:state].volumeDown
[$name:state].volumeUp
&nbsp;&nbsp;&nbsp;
[$name:state].[$name:mute]
<br>
[$name:state] CURRENT: [$name:AV_CurrentTrackMetaData_Artist] - [$name:AV_CurrentTrackMetaData_Title] - ([$name:currentTrack_Duration])
<br>
[$name:state] NEXT: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[$name:AV_NextTrackMetaData_Artist] - [$name:AV_NextTrackMetaData_Title] - ([$name:nextTrack_Duration])


(Ach ja.. Ist mit S1 und S2 getestet... Deswegen auch verschiedene STOP Infos zb.)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 19 Juni 2020, 20:33:22
Hmmm, also nur erst mal kurz:

Sinn und Zweck von setStateList ist mAn., bei Devices, die viele "Nebenreadings" haben, den "Hauptschalter" (=>state) und den "Rest" sauber auseinanderzuhalten.

Das ist eigentlich kein debugging-feature, sondern hat v.a. auch damit zu tun, dass ein "gutes" MQTT-Device auf eine "kleine" Anweisung auch nur eine "kleine" Rückmeldung geben sollte. Also für volume eine volume-Rückmeldung geben. Und spätestens dann steht "Unsinn" in "state", wenn das Senden state verändert, aber die Rückmeldung nur volume. Man sieht das hier scheinbar nur deswegen nicht, weil der Dienst immer eine "große" Rückmeldung gibt, die alle Infos enthält.
Das ist imo ein Designfehler, unter dem auch die Shellys leiden, und den wir Tasmota nur mühsam abgewöhnt haben. (Meine Meinung, Basta... Und bei Tasmota ist der "Vorwurf"  auch nicht ganz so pauschal gerechtfertigt...)

Daher versuche ich hier im FHEM-Kontext, IMMER setStateList zu verwenden, wenn es "Hauptschalter" und "Nebenreadings" gibt. Leider ist es mir in Teilen noch raus, aber grade bei Devices mit vielen Readings und settern ist das mMn. besonders wichtig.

Ergo das sollte mMn. der Standard sein, und genau deswegen, weil dieses "kleine" Detail das Gesamtdesign wesentlich beeinflußt, stelle ich die Frage auch hier immer wieder, WAS da rein soll. OB steht m.E. nicht wirklich zur Debatte bzw. eben nur gegen meinen hiermit nochmals erklärten Wunsch.

(Ich kann mich leider grade nicht so intensiv eindenken, dass ich zur Lösung des Problems mit der selektiven Anzeige der Icons was sagen könnte; ggf. leben wir halt hier mit der Lösung ohne setStateList oder nehmen "etwas Perl" (in devStateIcon?) - das ist auch nicht per se verwerflich, auch wenn es schön wäre, ein paar mehr multiline-stateFormat-Lösungen präsentieren zu können).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 19 Juni 2020, 21:48:07
Okay..

Nur kurz wegen Zeit..

Dann nimm das letzte OHNE Bugs als Vorzeige Temp OHNE Perl.
Das mit PERL hatte ich eh schon halb fertig. Mal sehen wann ich es beenden kann. Hatte das nur aufgehört, da es anfangs nicht sein sollte. Ich meine - KLAR - was ich hier mache und im Forum zeige.... Aber mal ehrlich. Ich finde es sollte eine Einheit geben. Wenn du so argumentierst, welchen Sinn hat dann stateFormat und dann noch mehrzeilig usw? Dieses wird komplett ignoriert mit setStateList. Ich finde die Funktion an sich gut. Ich habe sie auch durch die Übung verstehe gelernt. Aber sie darf nicht stateFormat beeinflussen! Fakt! Dann müsste es ein anderes stateFormat geben, welches eine höhere Prio hätte o.ä. Jeder der stateFormat definiert, wird vermutlich kein Perl nutzen wollen, da es bei den meisten Dingen einfach über FHEM in fast Klartext geht. Aber dieser "jeder" wird dann von diesem side effect verwundert sein. Ich weiß nicht ob ich das schlecht beschreibe oder wie ich einen CR einreichen kann, aber das wird vermutlich jeder Tester verstehen können.

Wie oben schon gesagt, es sollte eine Prio oder eine Trennung geben...DANN wäre setStateList ein mächtiges Werkzeug! Aktuell kann man es nutzen und damit Dinge beseitigen aber damit verschwindet mit dieser Funktionalität auch das 21 Jahrhundert. Ich würde gerne helfen bei der Verbesserung aber dafür brauche ich noch einige Lese-Stunden... Ich hoffe aber Anreiz liefern zu können und ggf. auf Verständnis  zu stoßen!

PS: Ich finde es super das die kleinen Biester so gesprächig sind! Gerade deswegen mag ich auch MQTT. Das zieht nichts und geht in Netzen wo eigentlich schon nichts mehr ankommen sollte. Das ganze auch Verschlüsselt. Ich glaube, wir müssen gucken wie wir in allen FHEM MQTT Instanzen diese ganzen Infos, wie der User das wünscht, am besten bereit stellen. Wenn das alles eine gesamte Einheit wäre....träume das ganze gerade ein wenig durch... Du hast aber mit den Templates begonnen und immer weiter gemacht. Nun ist es mit der Sprachsteuerung auch langsam grade usw... Ich weiß du hast unendlich viel Zeit hier rein gesteckt. Aber wenn gut, dann richtig :) Ich kann nicht "nicht" sagen ich habe nicht an der Flasche gerieben aber ich wünsche mir dann auch das "perfekte" Ergebnis :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 20 Juni 2020, 18:05:52
Hallo Zusammen,
ich habe heute mal etwas getestet und dabei sind mir einige Dinge aufgefallen und auch noch etwas
schleierhaft...


Ansonsten tolle Arbeit!
VG Sebastian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 21 Juni 2020, 09:57:13
Kurz weil Handy...

Die Bridge soll eigentlich nur weiter reichen bzw neue Player erzeugen. Was hast du da, wo genau eingetragen?

Das mit dem gruppieren muss ich mal nachstellen. Welche Version vom Player hast du genommen? Die mit Feedback im ersten Button oder ohne?

Das er bei tunein next behält ist für mich okay gewesen. Es wird nicht unterschieden ob es Radio ist oder nicht. Es läuft was also werden die Button eingeblendet. Muss mal schauen ob man es logisch ändern kann.

Mich freut aber das du direkt mal die Player probiert hast :) danke
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 21 Juni 2020, 19:32:02
ZitatDafür aber eben meinen heiß geliebten Feedback Button verloren

ist er nicht weiterhin vorhanden wenn man alle Befehle in setstateList einträgt wo nix zurückkommt ?
Dann kann man das set_... in state für das Feedback-Icon nutzen solange bis was zurückkommt und es wird kein Reading angelegt in dem immer nur set steht.

Hab mich gefragt ob man in devstateIcon wenn stateformat multiline verwendet wird auch irgendwie HTML reinbekommt um das Image aus enqueuedMetadata_AlbumArtUri darzustellen, gelingt mir aber nicht. Dazu hab ich devstateIcon auf Perl umgestellt. ( \ sind escaped, die Farbangaben hätte man auch escapen können hab sie aber entfernt und bei den Feedback-Icons teilweise einfach refresh-Icon genommen)
HTML geht bei mehrzeiligem stateformat wohl nicht mehr oder doch irgendwie ?
Hab mit Inline und Block Elementen gespielt nichts klappt.

Beim Mute-Feedback-Icon hab ich getrickst, auch wenns nicht richtig ist und auch mute mit in setstateList aufgenommen so kann man das set_mute ausnutzen fürs Feedback-Icon und dann halt das refresh-Icon anzeigen.

edit: Weiterhin mit dem Nachteil das alle Symbole eingeblendet bleiben wenn die Bridge offline ist oder es keinen Player gibt.

defmod Test99 MQTT2_DEVICE RINCON_000E58F7F67C01400
attr Test99 IODev MQTT2_Server
attr Test99 devStateIcon {my $imgct = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");;\
"0:10px-kreis-rot 1:10px-kreis-gelb 2:10px-kreis-gruen\
(0|1).(STOPPED|PAUSED_PLAYBACK|PLAYING):rc_BLANK\
2.(STOPPED|PAUSED_PLAYBACK):rc_PLAY:play\
2.TRANSITIONING:refresh\
(2.set_play|set_play):refresh\
(2.set_stop|set_stop):refresh\
set_mute:refresh\
2.PLAYING:rc_STOP:stop\
(STOPPED|PAUSED_PLAYBACK|set_stop).(false|previous|next|volumeDown|volumeUp|CURRENT.*|NEXT.*|PAUSED_PLAYBACK):rc_BLANK\
\\b(?!(STOPPED|PAUSED_PLAYBACK)\\b)\\w+.previous:rc_PREVIOUS:previous\
\\b(?!(STOPPED|PAUSED_PLAYBACK)\\b)\\w+.next:rc_NEXT:next\
\\b(?!(STOPPED|PAUSED_PLAYBACK)\\b)\\w+.volumeDown:rc_VOLDOWN:volumeDown\
\\b(?!(STOPPED|PAUSED_PLAYBACK)\\b)\\w+.volumeUp:rc_VOLUP:volumeUp\
\\b(?!(STOPPED|PAUSED_PLAYBACK)\\b)\\w+.false:rc_VOLUP:mute+true\
\\b(?!(STOPPED|PAUSED_PLAYBACK)\\b)\\w+.true:rc_MUTE:mute+false\
\b(?!(STOPPED|PAUSED_PLAYBACK)\\b)\\w+.set.false:rc_VOLUP:mute+true\
\\b(?!(STOPPED|PAUSED_PLAYBACK)\\b)\\w+.set.true:rc_MUTE:mute+false\
\\b(?!(STOPPED|PAUSED_PLAYBACK)\\b)\\w+.set.false:rc_MUTE:mute+false\
<div style='float:left;;padding:10px;;'>\
<img src='$imgct' style='width:265px;;height:265px;;border-radius:5px;;'></div>"}
attr Test99 devStateStyle style='text-align:left'
attr Test99 event-on-change-reading .*
attr Test99 getList getFavourites:noArg sonos/RINCON_000E58F7F67C01400/Favourites
attr Test99 icon audio_volume_low
attr Test99 jsonMap volume_Master:volume mute_Master:mute volume_LF:0 volume_RF:0 mute_LF:0 mute_RF:0 enqueuedMetadata_ItemId:0 enqueuedMetadata_ParentId:0 currentTrack_ItemId:0 currentTrack_ParentId:0 coordinatorUuid:0 transportState:state nextTrack_ItemId:0 nextTrack_ParentId:0
attr Test99 model sonos2mqtt_speaker
attr Test99 readingList sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }\
sonos/RINCON_000E58F7F67C01400/error:.* { json2nameValue($EVENT) }\
sonos/RINCON_000E58F7F67C01400/Favourites:.* {json2nameValue($EVENT,'Favourite_',$JSONMAP) }\
sonos/connected:.* connected
attr Test99 room Test,MQTT2_DEVICE
attr Test99 setList stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }\
  play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
  pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
  toggle:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "toggle" }\
  volumeUp:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumeup" }\
  volumeDown:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumedown" }\
  switchToQueue:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoqueue" }\
  switchToTv:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtotv" }\
  switchToLine:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoline" }\
  volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
mute:iconSwitch,false,rc_MUTE,true,rc_VOLUP { my $value = $EVTPART1 eq "true" ? "mute" : "unmute";;;; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
  next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
  previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
  x_raw_payload:textField { my $payload = $EVENT;;$payload =~ s/$EVTPART0 //g;; qq(sonos/RINCON_000E58F7F67C01400/control $payload)}\
  joinGroup:textField sonos/RINCON_000E58F7F67C01400/control { "command": "joingroup",  "input": "$EVTPART1"}\
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_000E58F7F67C01400","groupName","all");; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "leavegroup",  "input": "$value" } ) }\
  setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
  notify:textField sonos/RINCON_000E58F7F67C01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
attr Test99 setStateList play pause stop volumeUp volumeDown next previous mute toggle
attr Test99 stateFormat [$name:connected]\
[$name:connected].[$name:state]\
[$name:state].previous\
[$name:state].next\
[$name:state].volumeDown\
[$name:state].volumeUp\
&nbsp;;&nbsp;;&nbsp;;\
[$name:state].[$name:mute]\
<br>\
[$name:state] CURRENT: [$name:currentTrack_Artist] - [$name:currentTrack_Title] - ([$name:currentTrack_Duration])\
<br>\
[$name:state] NEXT: &nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;[$name:nextTrack_Artist] - [$name:nextTrack_Title] - ([$name:nextTrack_Duration])
attr Test99 webCmd volume

setstate Test99 2\
2.PLAYING\
PLAYING.previous\
PLAYING.next\
PLAYING.volumeDown\
PLAYING.volumeUp\
&nbsp;;&nbsp;;&nbsp;;\
PLAYING.false\
<br>\
PLAYING CURRENT: Ava Max - Kings &amp;; Queens - (0:14:23)\
<br>\
PLAYING NEXT: &nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;Iqulah - Revelation Time - (0:03:09)
setstate Test99 2020-06-21 18:26:24 connected 2
setstate Test99 2020-06-21 18:20:13 currentTrack_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test99 2020-06-21 18:26:34 currentTrack_AlbumArtUri https://cdn-profiles.tunein.com/s57109/images/logoq.png
setstate Test99 2020-06-21 18:26:34 currentTrack_Artist Ava Max
setstate Test99 2020-06-21 18:20:13 currentTrack_Duration 0:14:23
setstate Test99 2020-06-21 18:26:34 currentTrack_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate Test99 2020-06-21 18:26:34 currentTrack_Title Kings &amp;; Queens
setstate Test99 2020-06-21 18:26:34 currentTrack_TrackUri x-rincon-mp3radio://http://hr-edge-2048.dus-lg.cdn.addradio.net/hr/hr3/live/mp3/128/stream.mp3?ar-distributor=f0a1
setstate Test99 2020-06-21 18:26:34 currentTrack_UpnpClass object.item
setstate Test99 2020-06-21 18:20:13 enqueuedMetadata_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test99 2020-06-21 18:26:34 enqueuedMetadata_AlbumArtUri https://cdn-profiles.tunein.com/s57109/images/logoq.png
setstate Test99 2020-06-21 18:20:13 enqueuedMetadata_Artist Johannes Ackner
setstate Test99 2020-06-21 18:26:34 enqueuedMetadata_Title 89.3 hr 3 Frankfurt
setstate Test99 2020-06-21 18:26:34 enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate Test99 2020-06-21 18:26:34 groupName Wohnzimmer
setstate Test99 2020-06-21 18:26:34 mute false
setstate Test99 2020-06-21 18:26:34 name Wohnzimmer
setstate Test99 2020-06-21 18:20:13 nextTrack_Album The Mission
setstate Test99 2020-06-21 18:19:59 nextTrack_AlbumArtUri http://192.168.188.38:1400/getaa?u=x-file-cifs:%2f%2f192.168.188.26%2fOwnMusic%2fH%c3%b6rb%c3%bccher%2fDer%20Struwwelpeter.mp3&v=82
setstate Test99 2020-06-21 18:20:13 nextTrack_Artist Iqulah
setstate Test99 2020-06-21 18:20:13 nextTrack_Duration 0:03:09
setstate Test99 2020-06-21 18:20:13 nextTrack_ProtocolInfo x-file-cifs:*:audio/aiff:*
setstate Test99 2020-06-21 18:20:13 nextTrack_Title Revelation Time
setstate Test99 2020-06-21 18:20:13 nextTrack_TrackUri x-file-cifs://192.168.188.26/OwnMusic/Iqulah/05 - Revelation Time.aif
setstate Test99 2020-06-21 18:20:13 nextTrack_UpnpClass object.item.audioItem.musicTrack
setstate Test99 2020-06-21 18:26:34 playmode NORMAL
setstate Test99 2020-06-21 18:26:34 state PLAYING
setstate Test99 2020-06-21 18:26:34 ts 1592756793313
setstate Test99 2020-06-21 18:26:34 uuid RINCON_000E58F7F67C01400
setstate Test99 2020-06-21 18:26:34 volume 16
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 22 Juni 2020, 08:51:59
Mit Perl hätte ich da auch Ideen aber hatte am WE keine Zeit mehr. Den simplen Player hatte ich aber (glaube ich) mal gepostet.
Baue ich aber noch aus...

Bei dem aktuellem, ich nenne ihn mal "mini Player", ist setStateList, so wie Beta-User sagte das beste Ergebnis. Allerdings kann man natürlich die Zeitstempel der Readings nutzen. Finde ich aber etwas unschön.

Wenn du multiline devStateIcon nutzt, bitte stateFormat ganz löschen. Guck dir als Beispiel mal die Templates für mqtt2 an.... Ist verhältnismäßig einfach. Nur den Slider wüsste ich nicht wie der gehen soll. Den würde ich wieder über webcmd machen müssen, in erster Instanz...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kumue am 22 Juni 2020, 08:53:57
bevor ich mir die 19 Seiten durchlese, wollte ich mal fragen, ob man darüber dann auch den Sonos-Wecker steuern kann.
Ich habe mal grob in der sonosmqtt-doc nach alarm gesucht, wurde aber nicht fündig..
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 22 Juni 2020, 09:02:04
Zum aktuellen Zeitpunkt noch nicht... Bauen ja gerade noch an den "Grundfunktionen". Wenn die perfekt sind, bin ich sicher kommt auch der Rest :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 22 Juni 2020, 10:04:23

Moin,
Die Bridge soll eigentlich nur weiter reichen bzw neue Player erzeugen. Was hast du da, wo genau eingetragen?
Hab versuchsweise die Bridge als IODev in den Playern eingetragen...  :o

Das mit dem gruppieren muss ich mal nachstellen. Welche Version vom Player hast du genommen? Die mit Feedback im ersten Button oder ohne?
Die mit Feedback.

Das er bei tunein next behält ist für mich okay gewesen. Es wird nicht unterschieden ob es Radio ist oder nicht. Es läuft was also werden die Button eingeblendet. Muss mal schauen ob man es logisch ändern kann.
Das ist ja auch nur kosmetisch. Wichtig wäre mE. dass die Anzeige mit und ohne Gruppen passt  ;)

VG Sebastian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 22 Juni 2020, 10:33:27
Dass die "bridge" nur die Funktion hätte, neue Player zu erzeugen, ist m.E. etwas kurz gegriffen. Dafür würde es genügen, bei einem der Player eine bridgeRegexp zu ergänzen.
Funktional repräsentiert die bridge - übrigens bei allen diesen Konstruktionen, in denen es irgendein zentrales "Ding" gibt (einen Dienst wie zigbee2mqtt, sonos2mqtt, ebus-mqtt ... oder eine Hardware wie OpenMQTTGateway oder Sidoh-MiLight-Hub) - genau dieses zentrale Element, über das alle Daten "gebrückt" werden, und das meistens noch irgendwelche Zusatzfunktionalität bietet.
Ich finde es daher schlicht übersichtlicher, diese Art der klaren Kennzeichnung der zentralen Komponente überall zu machen, und bei mir finden sich diese dann auch im Raum "Steuerung->Interfaces".



Ich hatte gestern noch die templates upgedatet und den einfachen Speaker ohne die input-Wahl, dafür aber mit der dynamischen-Icon-Variante von 87insane eingecheckt und ein weiteres template, das den "input"-selector hat (und ansonsten den bisherigen Vorschlag konserviert).
Die Weiterentwicklung mit dem Vorschlag, alles, was keine sinnvollen Readings erzeugt in setStateList zu packen, gefällt mir übrigens recht gut; vielleicht kann dann jemand das am Ende als template(s) so zusammenfassen, dass ich das ab jetzt nicht mehr "halbblind" einchecke?



Zur "Gesprächigkeit" von manchen MQTT-Devices allgemein:
Vermutlich gibt es keine wirklichen Vorgaben dazu, ich kann mich daher nur auf mein "Bauchgefühl" berufen, und das sagt mir ziemlich eindeutig, dass das Dauersenden von allen Infos schlicht und ergreifend eine Unsitte ist. In dem "Holzscheitkessel-Thread" hatte ich dazu etwas mehr geschrieben. Das Problem ist, dass "immeralles" dazu führt, dass man keine vernünftigen Zeitstempel hat. Man kann das reparieren, indem man den auch noch mitschickt (siehe den Vorschlag von https://github.com/mqtt-smarthome/mqtt-smarthome/blob/master/Architecture.md#message-format zu "lc", wobei ich das auch nicht als "Bibel" ansehen würde), aber mMn. ist es besser, von vornherein nur jeweils "delta-updates" zu schicken und für "kaputte Kommunikation" (bzw. beendete) den LWT-Mechanismus zu nutzen.

Ich zitiere dazu mal die Selbstdarstellung von mqtt.org:
ZitatMQTT is a machine-to-machine (M2M)/"Internet of Things" connectivity protocol. It was designed as an extremely lightweight publish/subscribe messaging transport. It is useful for connections with remote locations where a small code footprint is required and/or network bandwidth is at a premium.
Ziel sollte daher sein, bei der Datenübertragung IMMER alles wegzulassen, was man NICHT braucht. Wer "menschenlesbare" Formate haben will, kann http nutzen, um normale Webseiten darzustellen.
Ein MQTT2_DEVICE sollte daraus dann wieder im FHEM-Kontext menschenlesbares Format herstellen, kein Thema. Aber eben mit möglichst wenigen sinnlosen "Events" bzw. ohne größeren Aufwand, (sinnlose) Events zu unterdrücken...

Just my2ct.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 22 Juni 2020, 10:53:06
Zitat von: Beta-User am 22 Juni 2020, 10:33:27
Funktional repräsentiert die bridge - übrigens bei allen diesen Konstruktionen, in denen es irgendein zentrales "Ding" gibt (einen Dienst wie zigbee2mqtt, sonos2mqtt, ebus-mqtt ... oder eine Hardware wie OpenMQTTGateway oder Sidoh-MiLight-Hub) - genau dieses zentrale Element, über das alle Daten "gebrückt" werden, und das meistens noch irgendwelche Zusatzfunktionalität bietet.
Ich finde es daher schlicht übersichtlicher, diese Art der klaren Kennzeichnung der zentralen Komponente überall zu machen, und bei mir finden sich diese dann auch im Raum "Steuerung->Interfaces".

+1
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 22 Juni 2020, 13:21:42
Was mich interessiert ob es zu bestimmten Zeitpunkten Vorteile hat Titel und Artist aus dem AV-Zweig zu nehmen (wie das 87insane bisher macht) oder es nicht ausreichend ist diese aus dem Rincon-Pfad zu nehmen ?
Selbst versuche ich nur mit dem Rincon-Zweig auszukommen, renderingcontrol und avtransport nehm ich erst gar nicht in die RL mit auf, braucht man die (bisher) wirklich ?




Zitat von: Otto123 am 31 Mai 2020, 18:30:55
Ich verwende das Sonos Modul im minimalem Umfang, die Visualisierung spielt dabei für mich keine Rolle:

Mit den letzten Seiten bewegen wir uns überwiegend in dem Bereich Visualisierung, wäre dafür nicht eigentlich ein eigener Thread angebracht ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 25 Juni 2020, 09:56:00
Hey,

ich hab einfach irgend ein vorhandenes Reading genommen, welches so kam wie ich das brauchte. Du kannst aber auch ein anderes nehmen.... Was genau die "Besten" sind, ist für mich noch nicht ganz klar.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 25 Juni 2020, 20:26:43
Abend....

Anbei ein attrList. Dieses beinhaltet den Player mit komplettem Feedback, setStateList (wie sie hierfür Sinn macht) usw. Es ist komplettes Feedback enthalten usw. In meinen Augen der beste Player bisher (von mir).
Attributes:
   IODev      sonosmqtt
   alias      Wohnzimmer
   devStateIcon {
my $mystate = ReadingsVal($name,"state","FEHLER");
my $amp = ReadingsVal($name,"bridgeConnected","0") eq "0"
? "rot"
: ReadingsVal($name,"bridgeConnected","0") eq "1"
? "gelb"
: "gruen";
my $playpic = $mystate eq "PLAYING"
? 'rc_PAUSE@red'
: $mystate eq "PAUSED_PLAYBACK"
? 'rc_PLAY@green'
: $mystate eq "TRANSITIONING"
? 'rc_PLAY@yellow'
: $mystate eq "set_next"
? 'rc_NEXT@yellow'
: $mystate eq "set_previous"
? 'rc_PREVIOUS@yellow'
: $mystate eq "set_volumeUp"
? 'rc_VOLUP@yellow'
: $mystate eq "set_volumeDown"
? 'rc_VOLDOWN@yellow'
: $mystate eq "set_mute"
? 'rc_MUTE@yellow'
: $mystate;
my $mutecmd = ReadingsVal($name,"mute","0") eq "false"
? "true"
: "false";
my $mutepic = ReadingsVal($name,"mute","0") eq "false"
? 'rc_MUTE'
: 'rc_VOLUP';
my $show = "FEHLER";
my $currentTrack = $mystate eq "TRANSITIONING"
? "Puffern..."
: ReadingsVal($name,"currentTrack_Artist","FEHLER")." - ".ReadingsVal($name,"currentTrack_Title","FEHLER");
my $nextTrack = ReadingsVal($name,"nextTrack_Artist","FEHLER")." - ".ReadingsVal($name,"nextTrack_Title","FEHLER");
my $previouspic = 'rc_PREVIOUS';
my $nextpic = 'rc_NEXT';
my $voldownpic = 'rc_VOLDOWN';
my $voluppic = 'rc_VOLUP';

if (ReadingsVal($name,"bridgeConnected","0") ne "2") {
$show = " ".FW_makeImage("rc_BLANK")." ";}

elsif (($mystate eq "PLAYING")
|| ($mystate eq "TRANSITIONING" )
|| ($mystate eq "set_next" )
|| ($mystate eq "set_previous" )
|| ($mystate eq "set_volumeUp" )
|| ($mystate eq "set_volumeDown" )
|| ($mystate eq "set_mute" )) {
$show = "".FW_makeImage($playpic)."
".FW_makeImage($previouspic)."
".FW_makeImage($nextpic)."
".FW_makeImage($voldownpic)."
".FW_makeImage($voluppic)."
   
".FW_makeImage($mutepic)."

Aktueller Track: $currentTrack

Nächster Track: $nextTrack";}

else {$show = "".FW_makeImage($playpic)."";}

"

".FW_makeImage("10px-kreis-".$amp)."
$show
"
}
   icon       audio_volume_low
   jsonMap    volume_Master:volume mute_Master:mute transportState:state
   model      sonos2mqtt_speaker
   readingList sonos/connected:.* bridgeConnected
sonos/status/wohnzimmer/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }
  sonos/status/wohnzimmer/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }
  sonos/RINCON_7828CAF427B201400:.* { json2nameValue($EVENT,'',$JSONMAP) }
sonos/RINCON_7828CAF427B201400/error:.* { json2nameValue($EVENT) }
   room       MQTT2_DEVICE
   setList    stop:noArg sonos/RINCON_7828CAF427B201400/control { "command": "stop" }
  play:noArg sonos/RINCON_7828CAF427B201400/control { "command": "play" }
  pause:noArg sonos/RINCON_7828CAF427B201400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_7828CAF427B201400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_7828CAF427B201400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_7828CAF427B201400/control { "command": "volumedown" }
  switchToQueue:noArg sonos/RINCON_7828CAF427B201400/control { "command": "switchtoqueue" }
  switchToTv:noArg sonos/RINCON_7828CAF427B201400/control { "command": "switchtotv" }
  switchToLine:noArg sonos/RINCON_7828CAF427B201400/control { "command": "switchtoline" }
  volume:slider,0,1,100 sonos/RINCON_7828CAF427B201400/control { "command": "volume", "input": $EVTPART1 }
  mute:iconSwitch,false,rc_MUTE,true,rc_VOLUP { my $value = $EVTPART1 eq "true" ? "mute" : "unmute";; qq(sonos/RINCON_7828CAF427B201400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_7828CAF427B201400/control { "command": "next" }
  previous:noArg sonos/RINCON_7828CAF427B201400/control { "command": "previous" }
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_7828CAF427B201400/control $payload)}
  joinGroup:textField sonos/RINCON_7828CAF427B201400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_7828CAF427B201400","groupName","all"); qq(sonos/RINCON_7828CAF427B201400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_7828CAF427B201400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  notify:textField sonos/RINCON_7828CAF427B201400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
   setStateList play pause stop next previous volumeUp volumeDown mute
   webCmd     volume


(Nicht wundern aber wegen der Übersicht habe ich das Format so gelassen. Auch weil sicher viele Verbesserungs-Ideen kommen könnten...)

Der Player hat quasi alle Vorteile aus meinen Versionen. Hinzu kommen ein par kleine Design Verbesserungen. Sowas wie CURRENT oder NEXT gibt es nicht mehr. Puffern wird besser angezeigt usw.
PS: Auch die Readings habe ich von AV_.* entfernt und auf normal gesetzt. Und der Player ist kompakter wenn er nicht genutzt wird da man mit Perl besser ausblenden kann.




Was ich nicht knacken konnte ist der Slider.... Ich bekomme x Slider dar gestellt aber leider keinen Output/Input vom oder zum Slider. Deswegen hier erstmal weiter mit webcmd.

Mal ein Auszug aus dem HTML von FHEM..
<td><div class=col3><div style=display:inline-block tabindex=0 class=slider_widget informid=MQTT2_RINCON_7828CAF427B201400-volume title='volume'><div class=slider id=slider.MQTT2_RINCON_7828CAF427B201400><div class=handle style=left:0px;>0</div></div></div></div></td>

Zudem gibt es eine Funktion mit der ich aber auch nicht klar komme (FW_createSlider).

Auch habe ich im Netz schöne HTML Slider gefunden die auch alle an zu sehen sind oder zumindest beweglich. Aber ich bekomme keinen set volume 123 damit hin oder eben die Rückmeldung damit er da steht wo auch Volume ist.
<label for="fader">Volume</label>
<input type="range" min="0" max="100" value="50" id="fader"
step="1" oninput="outputUpdate(value)">
<output for="fader" id="volume">50</output>


Für Hilfe zu dem Slider wäre ich dankbar!
Für Feedback und Verbesserungs-Wünsche zum Player auch.

Viel Spaß beim testen!

PS: Wie ist der aktuelle speak Status?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 25 Juni 2020, 21:00:03
Hey,

ZitatPS: Wie ist der aktuelle speak Status?

Im ersten Satz vom ersten Post hat Otto seinen Stand verlinkt, denke  keiner hat bisher eine andere Lösung.




Kenne attrList bisher nicht und auch noch nicht mit beschäftigt, würde das gerne ab und an direkt nachvollziehen was du postest, das geht am Tablet, Handy oder auch am PC mit der Darstellung nur umständlich, kannst das eventuell mal auf RAW-Code umstellen ?
Wie würdest du das mit deinem bereitgestellten Code machen ? Doch nur auf Umwegen ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 25 Juni 2020, 21:42:05
Hey und guten Abend...

Das ist nur ein list bei dem ich alles bis auf die Attribute gelöscht habe, da unwichtig.
Du übernimmst einfach das was bei dir an Attributen anders ist. Und löscht was zu viel ist. Einfach kopieren...Finde das gut so, sa jedes Attribut einzelne angezeigt wird.
Zudem (da es ein list ist) müsstes du den rincon Namen zb auf deinen anpassen. Es ist ja noch kein template.
Also ist es fast nur copy & paste.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 26 Juni 2020, 15:00:32
Hey zusammen,

wegen Speak habe ich mir nochmal Gedanken gemacht. Aktuell läuft es bei mir ja im SONOS Modul über den SMB usw. So wie auch in Ottos Blog beschrieben.
Ich sehe nur noch nicht ganz das notify und die Einstellungen in einem separatem Device.

Wäre es nicht sinnig:
A) Den Speak Befehl in der Bridge oder aber im Player selber komplett mit unterzubringen?
B) Damit verbunden auch die setter wie das Verzeichnis usw. Das macht man im Sonos Modul auch im Hauptgerät.

Ich weiß leider nicht wie das SONOS Modul den Speach Prozess macht. Denke aber Otto123 wird sicher dort auch nachgesehen haben. Das ganze hier wühlt mich nur deswegen so auf, da es der letzte Schritt zur Umstellung wäre :)

Hat schon jemand den neuen "mini-Player" getestet? Anregungen?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 26 Juni 2020, 16:09:19
Würd gern, bekomms aber nicht hin  ;D

Bekomme nur den state angezeigt:

Hier mal ein List :

Internals:
   CFGFN     
   CID        RINCON_000E58F7F67C01400
   DEF        RINCON_000E58F7F67C01400
   DEVICETOPIC Test26
   FUUID      5ef5f974-f33f-0353-204d-fa22727b8ab32ab8
   IODev      MQTT2_Server
   LASTInputDev MQTT2_Server
   MQTT2_Server_MSGCNT 49
   MQTT2_Server_TIME 2020-06-26 16:07:56
   MSGCNT     49
   NAME       Test26
   NR         105
   STATE      PLAYING
   TYPE       MQTT2_DEVICE
   JSONMAP:
     mute_Master mute
     transportState state
     volume_Master volume
   OLDREADINGS:
   READINGS:
     2020-06-26 16:07:55   coordinatorUuid RINCON_000E58F7F67C01400
     2020-06-26 16:03:44   currentTrack_Album Sprachdurchsagen
     2020-06-26 16:07:55   currentTrack_AlbumArtUri https://cdn-profiles.tunein.com/s20293/images/logoq.png?t=1
     2020-06-26 16:07:55   currentTrack_Artist SWR4 BW aus dem Studio Stuttgart mit Verena Neuhausen
     2020-06-26 16:03:44   currentTrack_Duration 0:00:01
     2020-06-26 16:07:55   currentTrack_ItemId -1
     2020-06-26 16:07:55   currentTrack_ParentId -1
     2020-06-26 16:07:55   currentTrack_ProtocolInfo x-rincon-mp3radio:*:*:*
     2020-06-26 16:07:55   currentTrack_Title stream.mp3?ar-distributor=f0a1
     2020-06-26 16:07:55   currentTrack_TrackUri x-rincon-mp3radio://http://swr-edge-2025.dus-lg.cdn.addradio.net/swr/swr4/bw/mp3/128/stream.mp3?ar-distributor=f0a1
     2020-06-26 16:07:55   currentTrack_UpnpClass object.item
     2020-06-26 15:49:42   enqueuedMetadata_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
     2020-06-26 16:07:55   enqueuedMetadata_AlbumArtUri https://cdn-profiles.tunein.com/s20293/images/logoq.png?t=1
     2020-06-26 15:49:42   enqueuedMetadata_Artist Johannes Ackner
     2020-06-26 16:07:55   enqueuedMetadata_ItemId -1
     2020-06-26 16:07:55   enqueuedMetadata_ParentId -1
     2020-06-26 16:07:55   enqueuedMetadata_Title 90.1 SWR4 Baden-Württemberg Stuttgart
     2020-06-26 16:07:55   enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-26 16:07:55   groupName       Wohnzimmer
     2020-06-26 16:03:34   mute            false
     2020-06-26 16:03:34   mute_LF         false
     2020-06-26 16:03:34   mute_RF         false
     2020-06-26 16:07:55   name            Wohnzimmer
     2020-06-26 16:07:55   playmode        NORMAL
     2020-06-26 16:07:55   state           PLAYING
     2020-06-26 16:07:55   ts              1593180473532
     2020-06-26 16:07:55   uuid            RINCON_000E58F7F67C01400
     2020-06-26 16:07:55   volume          13
     2020-06-26 16:07:55   volume_LF       100
     2020-06-26 16:07:55   volume_RF       100
Attributes:
   IODev      MQTT2_Server
   devStateIcon {
my $mystate = ReadingsVal($name,"state","FEHLER");
my $amp = ReadingsVal($name,"bridgeConnected","0") eq "0"
? "rot"
: ReadingsVal($name,"bridgeConnected","0") eq "1"
? "gelb"
: "gruen";
my $playpic = $mystate eq "PLAYING"
? 'rc_PAUSE@red'
: $mystate eq "PAUSED_PLAYBACK"
? 'rc_PLAY@green'
: $mystate eq "TRANSITIONING"
? 'rc_PLAY@yellow'
: $mystate eq "set_next"
? 'rc_NEXT@yellow'
: $mystate eq "set_previous"
? 'rc_PREVIOUS@yellow'
: $mystate eq "set_volumeUp"
? 'rc_VOLUP@yellow'
: $mystate eq "set_volumeDown"
? 'rc_VOLDOWN@yellow'
: $mystate eq "set_mute"
? 'rc_MUTE@yellow'
: $mystate;
my $mutecmd = ReadingsVal($name,"mute","0") eq "false"
? "true"
: "false";
my $mutepic = ReadingsVal($name,"mute","0") eq "false"
? 'rc_MUTE'
: 'rc_VOLUP';
my $show = "FEHLER";
my $currentTrack = $mystate eq "TRANSITIONING"
? "Puffern..."
: ReadingsVal($name,"currentTrack_Artist","FEHLER")." - ".ReadingsVal($name,"currentTrack_Title","FEHLER");
my $nextTrack = ReadingsVal($name,"nextTrack_Artist","FEHLER")." - ".ReadingsVal($name,"nextTrack_Title","FEHLER");
my $previouspic = 'rc_PREVIOUS';
my $nextpic = 'rc_NEXT';
my $voldownpic = 'rc_VOLDOWN';
my $voluppic = 'rc_VOLUP';

if (ReadingsVal($name,"bridgeConnected","0") ne "2") {
$show = " ".FW_makeImage("rc_BLANK")." ";}

elsif (($mystate eq "PLAYING")
|| ($mystate eq "TRANSITIONING" )
|| ($mystate eq "set_next" )
|| ($mystate eq "set_previous" )
|| ($mystate eq "set_volumeUp" )
|| ($mystate eq "set_volumeDown" )
|| ($mystate eq "set_mute" )) {
$show = "".FW_makeImage($playpic)."
".FW_makeImage($previouspic)."
".FW_makeImage($nextpic)."
".FW_makeImage($voldownpic)."
".FW_makeImage($voluppic)."
   
".FW_makeImage($mutepic)."

Aktueller Track: $currentTrack

Nächster Track: $nextTrack";}

else {$show = "".FW_makeImage($playpic)."";}

"

".FW_makeImage("10px-kreis-".$amp)."
$show
"
}
   event-on-change-reading .*
   icon       audio_volume_low
   jsonMap    volume_Master:volume mute_Master:mute transportState:state
   model      sonos2mqtt_speaker
   readingList sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
sonos/RINCON_000E58F7F67C01400/error:.* { json2nameValue($EVENT) }
sonos/RINCON_000E58F7F67C01400/Favourites:.* {json2nameValue($EVENT,'Favourite_',$JSONMAP) }
sonos/connected:.* bridgeConnected
   room       Test,MQTT2_DEVICE
   setList    stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }
  play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }
  pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumedown" }
  switchToQueue:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoqueue" }
  switchToTv:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtotv" }
  switchToLine:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "switchtoline" }
  volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }
  mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute"; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }
  previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_000E58F7F67C01400/control $payload)}
  joinGroup:textField sonos/RINCON_000E58F7F67C01400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_000E58F7F67C01400","groupName","all"); qq(sonos/RINCON_000E58F7F67C01400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  notify:textField sonos/RINCON_000E58F7F67C01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
   setStateList play pause stop next previous volumeUp volumeDown mute
   webCmd     volume
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 26 Juni 2020, 16:20:03
Okaaayyyy....

devstateicon:
{
my $mystate = ReadingsVal($name,"state","FEHLER");
my $amp = ReadingsVal($name,"bridgeConnected","0") eq "0"
? "rot"
: ReadingsVal($name,"bridgeConnected","0") eq "1"
? "gelb"
: "gruen";
my $playpic = $mystate eq "PLAYING"
? 'rc_PAUSE@red'
: $mystate eq "PAUSED_PLAYBACK"
? 'rc_PLAY@green'
: $mystate eq "STOPPED"
? 'rc_PLAY@green'
: $mystate eq "TRANSITIONING"
? 'rc_PLAY@yellow'
: $mystate eq "set_next"
? 'rc_NEXT@yellow'
: $mystate eq "set_previous"
? 'rc_PREVIOUS@yellow'
: $mystate eq "set_volumeUp"
? 'rc_VOLUP@yellow'
: $mystate eq "set_volumeDown"
? 'rc_VOLDOWN@yellow'
: $mystate eq "set_mute"
? 'rc_MUTE@yellow'
: $mystate;
my $mutecmd = ReadingsVal($name,"mute","0") eq "false"
? "true"
: "false";
my $mutepic = ReadingsVal($name,"mute","0") eq "false"
? 'rc_MUTE'
: 'rc_VOLUP';
my $show = "FEHLER";
my $currentTrack = $mystate eq "TRANSITIONING"
? "Puffern..."
: ReadingsVal($name,"currentTrack_Artist","FEHLER")." - ".ReadingsVal($name,"currentTrack_Title","FEHLER");
my $nextTrack = ReadingsVal($name,"nextTrack_Artist","FEHLER")." - ".ReadingsVal($name,"nextTrack_Title","FEHLER");
my $previouspic = 'rc_PREVIOUS';
my $nextpic = 'rc_NEXT';
my $voldownpic = 'rc_VOLDOWN';
my $voluppic = 'rc_VOLUP';

if (ReadingsVal($name,"bridgeConnected","0") ne "2") {
$show = " ".FW_makeImage("rc_BLANK")." ";}

elsif (($mystate eq "PLAYING")
|| ($mystate eq "TRANSITIONING" )
|| ($mystate eq "set_next" )
|| ($mystate eq "set_previous" )
|| ($mystate eq "set_volumeUp" )
|| ($mystate eq "set_volumeDown" )
|| ($mystate eq "set_mute" )) {
$show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>
Aktueller Track: $currentTrack<br>
Nächster Track: $nextTrack";}

else {$show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>";}

"<div>
".FW_makeImage("10px-kreis-".$amp)."
$show
</div>"
}


readinglist:

sonos/status/küche/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }
  sonos/status/küche/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }
  sonos/RINCON_7828CAF4289001400:.* { json2nameValue($EVENT,'',$JSONMAP) }
  sonos/connected:.* bridgeConnected
sonos/RINCON_7828CAF4289001400/error:.* { json2nameValue($EVENT) }


setlist:
stop:noArg sonos/RINCON_7828CAF4289001400/control { "command": "stop" }
  play:noArg sonos/RINCON_7828CAF4289001400/control { "command": "play" }
  pause:noArg sonos/RINCON_7828CAF4289001400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_7828CAF4289001400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_7828CAF4289001400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_7828CAF4289001400/control { "command": "volumedown" }
  switchToQueue:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtoqueue" }
  switchToTv:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtotv" }
  switchToLine:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtoline" }
  volume:slider,0,1,100 sonos/RINCON_7828CAF4289001400/control { "command": "volume", "input": $EVTPART1 }
  mute:iconSwitch,false,rc_MUTE,true,rc_VOLUP { my $value = $EVTPART1 eq "true" ? "mute" : "unmute";; qq(sonos/RINCON_7828CAF4289001400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_7828CAF4289001400/control { "command": "next" }
  previous:noArg sonos/RINCON_7828CAF4289001400/control { "command": "previous" }
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_7828CAF4289001400/control $payload)}
  joinGroup:textField sonos/RINCON_7828CAF4289001400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_7828CAF4289001400","groupName","all"); qq(sonos/RINCON_7828CAF4289001400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_7828CAF4289001400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  notify:textField sonos/RINCON_7828CAF4289001400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}


setstatelist:
play pause stop next previous volumeUp volumeDown mute

webcmd:
volume

List komplett:
Internals:
   CID        RINCON_5CAAFD79D52801400
   DEF        RINCON_5CAAFD79D52801400
   DEVICETOPIC MQTT2_RINCON_5CAAFD79D52801400
   FUUID      5eeb1d9d-f33f-fcb4-ab98-dbc03111307301d2
   IODev      sonosmqtt
   LASTInputDev sonosmqtt
   MSGCNT     28
   NAME       MQTT2_RINCON_5CAAFD79D52801400
   NR         452
   STATE      STOPPED
   TYPE       MQTT2_DEVICE
   sonosmqtt_MSGCNT 28
   sonosmqtt_TIME 2020-06-26 16:15:15
   JSONMAP:
     mute_Master mute
     transportState state
     volume_Master volume
   READINGS:
     2020-06-26 16:11:26   AV_AVTransportURI x-rincon-mp3radio://http://opml.radiotime.com/Tune.ashx?id=e90371712&sid=s84203&formats=aac,mp3,hls&partnerId=rjyYMwEH&serial=AEEFQQRWWI4G4HZAKADDPLRBZVXQ
     2020-06-26 16:11:26   AV_AVTransportURIMetaData_AlbumArtUri https://cdn-profiles.tunein.com/s84203/images/logoq.png
     2020-06-26 16:11:26   AV_AVTransportURIMetaData_ItemId -1
     2020-06-26 16:11:26   AV_AVTransportURIMetaData_ParentId -1
     2020-06-26 16:11:26   AV_AVTransportURIMetaData_Title 89.5 bigFM Deutschland Stuttgart
     2020-06-26 16:11:26   AV_AVTransportURIMetaData_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-26 16:11:26   AV_AlarmRunning false
     2020-06-26 16:15:14   AV_CurrentCrossfadeMode false
     2020-06-26 16:11:26   AV_CurrentMediaDuration NOT_IMPLEMENTED
     2020-06-26 16:15:14   AV_CurrentPlayMode NORMAL
     2020-06-26 16:11:26   AV_CurrentRecordQualityMode NOT_IMPLEMENTED
     2020-06-26 16:15:14   AV_CurrentSection 0
     2020-06-26 16:15:14   AV_CurrentTrack 1
     2020-06-26 16:15:14   AV_CurrentTrackDuration 0:00:00
     2020-06-25 17:12:51   AV_CurrentTrackMetaData_Album Sprachdurchsagen
     2020-06-26 16:15:14   AV_CurrentTrackMetaData_AlbumArtUri https://cdn-profiles.tunein.com/s84203/images/logoq.png
     2020-06-26 16:15:03   AV_CurrentTrackMetaData_Artist ZPSTR_BUFFERING
     2020-06-25 17:12:51   AV_CurrentTrackMetaData_Duration 0:00:01
     2020-06-26 16:15:14   AV_CurrentTrackMetaData_ItemId -1
     2020-06-26 16:15:14   AV_CurrentTrackMetaData_ParentId -1
     2020-06-26 16:15:14   AV_CurrentTrackMetaData_ProtocolInfo aac:*:application/octet-stream:*
     2020-06-26 16:15:14   AV_CurrentTrackMetaData_Title bigfm-deutschland-128-aac?usid=0-0-H-A-D-02
     2020-06-26 16:15:14   AV_CurrentTrackMetaData_TrackUri aac://http://streams.bigfm.de/bigfm-deutschland-128-aac?usid=0-0-H-A-D-02
     2020-06-26 16:15:14   AV_CurrentTrackMetaData_UpnpClass object.item
     2020-06-26 16:15:14   AV_CurrentTrackURI aac://http://streams.bigfm.de/bigfm-deutschland-128-aac?usid=0-0-H-A-D-02
     2020-06-26 16:11:26   AV_CurrentTransportActions Set, Stop, Play
     2020-06-25 17:12:51   AV_CurrentValidPlayModes CROSSFADE
     2020-06-25 16:56:02   AV_DirectControlClientID alexa.bridge
     2020-06-26 16:11:26   AV_DirectControlIsSuspended false
     2020-06-26 16:15:14   AV_EnqueuedTransportURI x-rincon-mp3radio://http://opml.radiotime.com/Tune.ashx?id=e90371712&sid=s84203&formats=aac,mp3,hls&partnerId=rjyYMwEH&serial=AEEFQQRWWI4G4HZAKADDPLRBZVXQ
     2020-06-26 16:15:14   AV_EnqueuedTransportURIMetaData_AlbumArtUri https://cdn-profiles.tunein.com/s84203/images/logoq.png
     2020-06-26 16:15:14   AV_EnqueuedTransportURIMetaData_ItemId -1
     2020-06-26 16:15:14   AV_EnqueuedTransportURIMetaData_ParentId -1
     2020-06-26 16:15:14   AV_EnqueuedTransportURIMetaData_Title 89.5 bigFM Deutschland Stuttgart
     2020-06-26 16:15:14   AV_EnqueuedTransportURIMetaData_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-25 16:56:02   AV_MuseSessions 54.154.205.104:443
     2020-06-26 16:15:14   AV_NumberOfTracks 1
     2020-06-26 16:11:26   AV_PlaybackStorageMedium NETWORK
     2020-06-26 16:11:26   AV_PossiblePlaybackStorageMedia NONE, NETWORK
     2020-06-26 16:11:26   AV_PossibleRecordQualityModes NOT_IMPLEMENTED
     2020-06-26 16:11:26   AV_PossibleRecordStorageMedia NOT_IMPLEMENTED
     2020-06-26 16:11:26   AV_RecordMediumWriteStatus NOT_IMPLEMENTED
     2020-06-26 16:11:26   AV_RecordStorageMedium NOT_IMPLEMENTED
     2020-06-26 16:11:26   AV_RestartPending false
     2020-06-26 16:11:26   AV_SleepTimerGeneration 0
     2020-06-26 16:11:26   AV_SnoozeRunning false
     2020-06-26 16:11:26   AV_TransportPlaySpeed NOT_IMPLEMENTED
     2020-06-26 16:15:14   AV_TransportState STOPPED
     2020-06-26 16:11:26   AV_TransportStatus OK
     2020-06-26 16:11:27   REND_Bass       0
     2020-06-26 16:11:27   REND_HeadphoneConnected false
     2020-06-26 16:11:27   REND_Loudness   true
     2020-06-26 16:11:27   REND_Mute_LF    false
     2020-06-26 16:11:27   REND_Mute_Master false
     2020-06-26 16:11:27   REND_Mute_RF    false
     2020-06-26 16:11:27   REND_OutputFixed false
     2020-06-26 16:11:27   REND_PresetNameList FactoryDefaults
     2020-06-26 16:11:27   REND_SpeakerSize 5
     2020-06-26 16:11:27   REND_SubCrossover 0
     2020-06-26 16:11:27   REND_SubEnabled true
     2020-06-26 16:11:27   REND_SubGain    0
     2020-06-26 16:11:27   REND_SubPolarity 0
     2020-06-26 16:11:27   REND_Treble     0
     2020-06-26 16:12:21   REND_Volume_LF  100
     2020-06-26 16:12:21   REND_Volume_Master 37
     2020-06-26 16:12:21   REND_Volume_RF  100
     2020-06-18 09:54:05   associatedWith  MQTT2_sonos2mqtt
     2020-06-18 09:55:40   attrTemplateVersion 20200609
     2020-06-26 16:11:26   bridgeConnected 2
     2020-06-26 16:15:15   coordinatorUuid RINCON_5CAAFD79D52801400
     2020-06-25 17:12:51   currentTrack_Album Sprachdurchsagen
     2020-06-26 16:15:15   currentTrack_AlbumArtUri https://cdn-profiles.tunein.com/s84203/images/logoq.png
     2020-06-26 16:15:04   currentTrack_Artist ZPSTR_BUFFERING
     2020-06-25 17:12:51   currentTrack_Duration 0:00:01
     2020-06-26 16:15:15   currentTrack_ItemId -1
     2020-06-26 16:15:15   currentTrack_ParentId -1
     2020-06-26 16:15:15   currentTrack_ProtocolInfo aac:*:application/octet-stream:*
     2020-06-26 16:15:15   currentTrack_Title bigfm-deutschland-128-aac?usid=0-0-H-A-D-02
     2020-06-26 16:15:15   currentTrack_TrackUri aac://http://streams.bigfm.de/bigfm-deutschland-128-aac?usid=0-0-H-A-D-02
     2020-06-26 16:15:15   currentTrack_UpnpClass object.item
     2020-06-26 16:15:15   enqueuedMetadata_AlbumArtUri https://cdn-profiles.tunein.com/s84203/images/logoq.png
     2020-06-26 16:15:15   enqueuedMetadata_ItemId -1
     2020-06-26 16:15:15   enqueuedMetadata_ParentId -1
     2020-06-26 16:15:15   enqueuedMetadata_Title 89.5 bigFM Deutschland Stuttgart
     2020-06-26 16:15:15   enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
     2020-06-26 16:15:15   groupName       Badezimmer
     2020-06-26 16:11:47   mute            false
     2020-06-26 16:11:47   mute_LF         false
     2020-06-18 09:54:05   mute_Master     false
     2020-06-26 16:11:47   mute_RF         false
     2020-06-26 16:15:15   name            Badezimmer
     2020-06-26 16:15:15   playmode        NORMAL
     2020-06-26 16:15:15   state           STOPPED
     2020-06-26 16:15:14   toggle          set
     2020-06-18 09:54:05   transportState  STOPPED
     2020-06-26 16:15:15   ts              1593180914827
     2020-06-26 16:15:15   uuid            RINCON_5CAAFD79D52801400
     2020-06-26 16:15:15   volume          37
     2020-06-26 16:15:15   volume_LF       100
     2020-06-18 09:54:05   volume_Master   10
     2020-06-26 16:15:15   volume_RF       100
Attributes:
   IODev      sonosmqtt
   alias      Badezimmer
   devStateIcon {
my $mystate = ReadingsVal($name,"state","FEHLER");
my $amp = ReadingsVal($name,"bridgeConnected","0") eq "0"
? "rot"
: ReadingsVal($name,"bridgeConnected","0") eq "1"
? "gelb"
: "gruen";
my $playpic = $mystate eq "PLAYING"
? 'rc_PAUSE@red'
: $mystate eq "PAUSED_PLAYBACK"
? 'rc_PLAY@green'
: $mystate eq "STOPPED"
? 'rc_PLAY@green'
: $mystate eq "TRANSITIONING"
? 'rc_PLAY@yellow'
: $mystate eq "set_next"
? 'rc_NEXT@yellow'
: $mystate eq "set_previous"
? 'rc_PREVIOUS@yellow'
: $mystate eq "set_volumeUp"
? 'rc_VOLUP@yellow'
: $mystate eq "set_volumeDown"
? 'rc_VOLDOWN@yellow'
: $mystate eq "set_mute"
? 'rc_MUTE@yellow'
: $mystate;
my $mutecmd = ReadingsVal($name,"mute","0") eq "false"
? "true"
: "false";
my $mutepic = ReadingsVal($name,"mute","0") eq "false"
? 'rc_MUTE'
: 'rc_VOLUP';
my $show = "FEHLER";
my $currentTrack = $mystate eq "TRANSITIONING"
? "Puffern..."
: ReadingsVal($name,"currentTrack_Artist","FEHLER")." - ".ReadingsVal($name,"currentTrack_Title","FEHLER");
my $nextTrack = ReadingsVal($name,"nextTrack_Artist","FEHLER")." - ".ReadingsVal($name,"nextTrack_Title","FEHLER");
my $previouspic = 'rc_PREVIOUS';
my $nextpic = 'rc_NEXT';
my $voldownpic = 'rc_VOLDOWN';
my $voluppic = 'rc_VOLUP';

if (ReadingsVal($name,"bridgeConnected","0") ne "2") {
$show = " ".FW_makeImage("rc_BLANK")." ";}

elsif (($mystate eq "PLAYING")
|| ($mystate eq "TRANSITIONING" )
|| ($mystate eq "set_next" )
|| ($mystate eq "set_previous" )
|| ($mystate eq "set_volumeUp" )
|| ($mystate eq "set_volumeDown" )
|| ($mystate eq "set_mute" )) {
$show = "".FW_makeImage($playpic)."
".FW_makeImage($previouspic)."
".FW_makeImage($nextpic)."
".FW_makeImage($voldownpic)."
".FW_makeImage($voluppic)."
   
".FW_makeImage($mutepic)."

Aktueller Track: $currentTrack

Nächster Track: $nextTrack";}

else {$show = "".FW_makeImage($playpic)."";}

"

".FW_makeImage("10px-kreis-".$amp)."
$show
"
}
   icon       audio_volume_low
   jsonMap    volume_Master:volume mute_Master:mute transportState:state
   model      sonos2mqtt_speaker
   readingList sonos/connected:.* bridgeConnected
sonos/status/badezimmer/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }
  sonos/status/badezimmer/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }
  sonos/RINCON_5CAAFD79D52801400:.* { json2nameValue($EVENT,'',$JSONMAP) }
   room       MQTT2_DEVICE
   setList    stop:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "stop" }
  play:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "play" }
  pause:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "volumedown" }
  switchToQueue:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "switchtoqueue" }
  switchToTv:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "switchtotv" }
  switchToLine:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "switchtoline" }
  volume:slider,0,1,100 sonos/RINCON_5CAAFD79D52801400/control { "command": "volume", "input": $EVTPART1 }
  mute:iconSwitch,false,rc_MUTE,true,rc_VOLUP { my $value = $EVTPART1 eq "true" ? "mute" : "unmute";; qq(sonos/RINCON_5CAAFD79D52801400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "next" }
  previous:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "previous" }
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_5CAAFD79D52801400/control $payload)}
  joinGroup:textField sonos/RINCON_5CAAFD79D52801400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_5CAAFD79D52801400","groupName","all"); qq(sonos/RINCON_5CAAFD79D52801400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_5CAAFD79D52801400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  notify:textField sonos/RINCON_5CAAFD79D52801400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
   setStateList play pause stop next previous volumeUp volumeDown mute
   webCmd     volume


PS: Sieht aus als hättest du keinen online Stati. Der kommt vom Dienst. Einfach mal neustarten.... Wenn das irgendwann fest mit drin ist braucht man das nicht mehr.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 26 Juni 2020, 16:34:03
Okaaayyyy....

hatte zuvor alle readings gelöscht weil ich den avtransport und renderingcontrol-Pfad aus der RL genommen hatte, vorher war der Online-Status da, auch da hats nicht geklappt.

Aber jetzt  :)  mit dem devstateIcon-Code den du jetzt zeigst klappts auf Anhieb mit dem oberen nicht, probiers aus.

mit RAW-Code passiert das erst gar nicht.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 26 Juni 2020, 17:09:32
Nachvollziehen kann ich das nicht. Geht wunderbar. Hatte im letzten nur ein status hinzugefügt, der Rest blieb gleich.
Komisch komisch.

Wenn ich 1zu1 aus dem devstateicon kopiere, dann muss man das nur 1zu1 da einfügen. Raw geht natürlich aber werde ich nicht tun. Jedes mal wenn man das bei solchen Dingen macht, kommt mindestens von dreien die Anfrage warum das nicht geht.
Beim kopieren einzelner Attribute fällt es eher auf wenn man manuell was ändern muss wie zb den rincon Pfad/Namen.
Du bist erfahren also sollte das ja kein Problem sein.

Lange rede kurzer Sinn....
Was noch fehlen kann sind stati die meine Geräte nicht haben. Zb hat eine Sonos play 1 stopped auch bei Pause im state. Die play one macht aber paused_playback bei Pause. Ich arbeite aktuelle mit s2 und hatte s1 aber noch anfangs getestet. Sollten also stati fehlen, sollten diese neben dem Punkt angezeigt werden.
Diese bräuchte ich noch, wenn jemand was findet.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 26 Juni 2020, 17:36:53
Resdingslist: Ach ja ... Ich glaube man braucht eigentlich echt nur den solo Pfad. Zumindest bei der Version von Player. Ich hatte bisher schlicht weg keine Lust das weiter zu comparen. Wer sowas mag darf sich frei fühlen :)

Ideen sind gern willkommen. Wir können das auch weiter ausbauen. Find es mit (ich nenne es mal so) "full Feedback" echt gut und auch auf Handy/Tablet super zu bedienen. Daumen auf zb nächster Track aber das erste Symbol zeigt kurz weiter an. Da geht aber sicher noch mehr mit euch allen :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 26 Juni 2020, 17:54:30
Warum hast noch kein Album-Bild mit reingenommen oder willst das  jetzt nicht mehr und was hältst davon die Readings von den Titel und Artist-Readings zu kürzen wie ich das gemacht hatte ?
Mag das nicht wenn die DeviceOverview in der Höhe rumzappelt, wenn das Reading überlang ist wie das bspw. der Fall ist wenn man Radiosender spielt.

Soll das zentriert ausgerichtet bleiben oder ist das nur ein Beispiel ?

Mir gefällt die Variante es mit Perl in devstateIcon zu lösen auf jedenfall besser, auch wenn das wie ich es bisher verstanden habe nicht der präferierte Weg sein soll, sondern so wie du es zuvor in devstateIcon mit mehrzeiligem stateformat gemacht hast.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 26 Juni 2020, 18:16:27
Schlicht weg hab ich in meinen Augen alles gegeben eine "ohne perl" Variante zu liefern. Mehr kann ich da nicht machen. Hab das Ding bei mir aber nicht am laufen. War quasi nur für hier ein Abend testen..sicher auch nicht zu 100% perfekt.

Die Perl variante liefert mehr und gewollter. Nicht wundern das ich alles gemischt hab. Hab da immer beta-users worte im Hinterkopf. Er mag example gern und das sollen die templates ja sein. Klar ist es geil wenn es perfekte gibt und man nichts mehr ändern will....

Wollte einen Mini Player. Denke aber in entsprechender Größe sollte das locker daneben passen. Was auch die Position dann wieder ändert. Das zappeln ist in dem frühen Stadium für mich erträglich. Bau es mal ein und dann sind wir schon ein Level weiter :) bin gespannt wie du das genau meinst.

Ich finde die Cover bzw bild Geschichte sollte als auswählbare Option rein. Baue ich gern ein aber bitte schick kurz die Zeile wie ihr das gelöst hattet. Habe viele Seiten nicht gelesen da es in Menge zu viel und monoton war. Sicher für die Leser, unser Text auch :-/ :-P
Finde das man eben wählen können sollte. Der eine mag mit der andere ohne. Oder nur in gewissen Fällen x mit und y ohne...usw. Würde es vermutlich morgen einbauen können.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 26 Juni 2020, 18:46:53
ZitatBau es mal ein und dann sind wir schon ein Level weiter :) bin gespannt wie du das genau meinst.
attr Test26 devStateIcon {\
my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...';; };;\
my $mystate = ReadingsVal($name,"state","FEHLER");;\
my $amp = ReadingsVal($name,"bridgeConnected","0") eq "0"\
? "rot"\
: ReadingsVal($name,"bridgeConnected","0") eq "1"\
? "gelb"\
: "gruen";;\
my $playpic = $mystate eq "PLAYING"\
? 'rc_PAUSE@red'\
: $mystate eq "PAUSED_PLAYBACK"\
? 'rc_PLAY@green'\
: $mystate eq "STOPPED"\
? 'rc_PLAY@green'\
: $mystate eq "TRANSITIONING"\
? 'rc_PLAY@yellow'\
: $mystate eq "set_next"\
? 'rc_NEXT@yellow'\
: $mystate eq "set_previous"\
? 'rc_PREVIOUS@yellow'\
: $mystate eq "set_volumeUp"\
? 'rc_VOLUP@yellow'\
: $mystate eq "set_volumeDown"\
? 'rc_VOLDOWN@yellow'\
: $mystate eq "set_mute"\
? 'rc_MUTE@yellow'\
: $mystate;;\
my $mutecmd = ReadingsVal($name,"mute","0") eq "false"\
? "true"\
: "false";;\
my $mutepic = ReadingsVal($name,"mute","0") eq "false"\
? 'rc_MUTE'\
: 'rc_VOLUP';;\
my $show = "FEHLER";;\
my $currentTrack = $mystate eq "TRANSITIONING"\
? "Puffern..."\
: $trim30->(ReadingsVal($name,"currentTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"currentTrack_Title","FEHLER"));;\
my $nextTrack = $trim30->(ReadingsVal($name,"nextTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"nextTrack_Title","FEHLER"));;\
my $previouspic = 'rc_PREVIOUS';;\
my $nextpic = 'rc_NEXT';;\
my $voldownpic = 'rc_VOLDOWN';;\
my $voluppic = 'rc_VOLUP';;\
\
if (ReadingsVal($name,"bridgeConnected","0") ne "2") {\
$show = " ".FW_makeImage("rc_BLANK")." ";;}\
\
elsif (($mystate eq "PLAYING")\
|| ($mystate eq "TRANSITIONING" )\
|| ($mystate eq "set_next" )\
|| ($mystate eq "set_previous" )\
|| ($mystate eq "set_volumeUp" )\
|| ($mystate eq "set_volumeDown" )\
|| ($mystate eq "set_mute" )) {\
$show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>\
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>\
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>\
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>\
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>\
&nbsp;;&nbsp;;&nbsp;;&nbsp;;\
<a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>\
Aktueller Track: $currentTrack<br>\
Nächster Track: $nextTrack";;}\
\
else {$show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>";;}\
\
"<div>\
".FW_makeImage("10px-kreis-".$amp)."\
$show\
</div>"\
}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 26 Juni 2020, 19:05:13
Gut..

Hast du die Cover Zeile parat für morgen?

Hab mir auch die Gruppen Dynamik angesehen. Das wird lustig. Ohne CR in meinen Augen nur ungenau machbar. Der gruppenname ist immer Name vom Master + 1,2,3,xxxx.
Nur wer mit wem verbunden ist, bekomme ich nicht raus. Jetzt könnte man gucken welcher player noch läuft aber was wenn eine weitere Zone läuft? Es gibt über die aktuellen readings keine Zuordnung der Gruppen oder gruppenname oder aber Geräte im Detail. Ich glaube jede Umsetzung mit aktueller konfig wäre sinnfrei. Wir müssen den Programmierer (Stephan @svrooij) nochmal anschreiben. Sieht jemand einen anderen weg?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 26 Juni 2020, 19:10:29
my $img = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");
<img src='$img' style='width:200px;height:250px;border-radius:5px;'>


Mach mal, mit so wenig HTML wie nötig  ;D

Ich weiß auch nicht was richtig ist, hatte mich für divs entschieden.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 26 Juni 2020, 19:27:42
Auf den ersten Blick schön. Einzig müsste ich gucken (html) wie ich das variabel in devstateicon bekomme. Es solle maximal so groß sein wie eben der Content vorher. Das zu fixen in Pixel ist dann suboptimal. Aber da muss ich auch erst lesen. Sicher gibt es da was...
An sich würde ich das auch in div packen außer man hätte noch einen Link zum album oder so. Dann würde ich den dahinter setzen. Was mich an fhem und Sonos auch immer stört, gescheit kann man es eigentlich nicht nutzen. So wie die App o.ä. ist es eben nicht. Denke aber man kann bohren.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 27 Juni 2020, 10:24:03
Moin,

nicht perfekt aber was sagst du/ihr dazu?
{
my $img = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");
my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...'; };
my $mystate = ReadingsVal($name,"state","FEHLER");
my $amp = ReadingsVal($name,"bridgeConnected","0") eq "0"
? "rot"
: ReadingsVal($name,"bridgeConnected","0") eq "1"
? "gelb"
: "gruen";
my $playpic = $mystate eq "PLAYING"
? 'rc_PAUSE@red'
: $mystate eq "PAUSED_PLAYBACK"
? 'rc_PLAY@green'
: $mystate eq "STOPPED"
? 'rc_PLAY@green'
: $mystate eq "TRANSITIONING"
? 'rc_PLAY@yellow'
: $mystate eq "set_next"
? 'rc_NEXT@yellow'
: $mystate eq "set_previous"
? 'rc_PREVIOUS@yellow'
: $mystate eq "set_volumeUp"
? 'rc_VOLUP@yellow'
: $mystate eq "set_volumeDown"
? 'rc_VOLDOWN@yellow'
: $mystate eq "set_mute"
? 'rc_MUTE@yellow'
: $mystate;
my $mutecmd = ReadingsVal($name,"mute","0") eq "false"
? "true"
: "false";
my $mutepic = ReadingsVal($name,"mute","0") eq "false"
? 'rc_MUTE'
: 'rc_VOLUP';
my $show = "FEHLER";
my $currentTrack = $mystate eq "TRANSITIONING"
? "Puffern..."
: $trim30->(ReadingsVal($name,"currentTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"currentTrack_Title","FEHLER"));
my $nextTrack = $trim30->(ReadingsVal($name,"nextTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"nextTrack_Title","FEHLER"));
my $previouspic = 'rc_PREVIOUS';
my $nextpic = 'rc_NEXT';
my $voldownpic = 'rc_VOLDOWN';
my $voluppic = 'rc_VOLUP';

if (ReadingsVal($name,"bridgeConnected","0") ne "2") {
$show = " ".FW_makeImage("rc_BLANK")." ";}

elsif (($mystate eq "PLAYING")
|| ($mystate eq "TRANSITIONING" )
|| ($mystate eq "set_next" )
|| ($mystate eq "set_previous" )
|| ($mystate eq "set_volumeUp" )
|| ($mystate eq "set_volumeDown" )
|| ($mystate eq "set_mute" )) {
$show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>
Aktueller Track: $currentTrack<br>
Nächster Track: $nextTrack";}

else {$show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>";}

"<div>
<table>
  <tr>
    <td><div style='display: inline-block; margin-right: 5px; border: 1px solid lightgray; height: 4.00em; width: 4.00em; background-image: url($img);background-size: contain;'></div>
</td>
    <td>".FW_makeImage("10px-kreis-".$amp)."
$show</td>
   </tr>
</table>
</div>"
}


Hab das ganze gedöns in eine kleine Tabelle gepackt, Trimm mit rein genommen und ein kleines Cover (kann man ja auf Belieben anpassen).
Jetzt muss nur noch der Slider aus webcmd. Hatte von @TomLee ein paar Versuche zum Slider gesehen. Bist du da weiter?
Wenn ich den nutze, setzt er zwar auch VOL aber ist nach einmal nutzen weg....

PS: Das Gruppenverhalten muss noch komplett untersucht werden. Das ist mega "komisch" aktuell. Aber das liegt nicht am Player sondern an dem, was geliefert wird.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 27 Juni 2020, 11:00:08
Zitat... ein paar Versuche zum Slider gesehen. Bist du da weiter?

Den Stand dazu kannst du in etwa hier (https://forum.fhem.de/index.php/topic,112225.msg1065841.html#msg1065841) den folgenden Beiträgen entnehmen.

Ich frag nicht an kompetenter Stelle, wenn ich nichtmal eine kompetente Frage bzw. Antworten liefern kann, dazu hab ich, bis jetzt, zu wenig verstanden.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 27 Juni 2020, 11:14:54
Interessanter Thread!

Aber wie da schon gesagt, es muss gehen - Nur wie?
Ich teste auch noch ein wenig weiter. Denke der Player kann so aber komplett genutzt werden, oder was meinst du?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 27 Juni 2020, 15:32:04
Können wir uns darauf verständigen das hier ein "Mini-Player" entstehen soll der ins SVN soll, persönliche Ansichten hinten anstellen.

Ich würde

Bei deinem Beispiel wird das Album-Cover immer angezeigt auch wenn disconnected, gefällt mir nicht, wolltest das so oder nur noch nicht fertig ?
Das mit dem zappeln in der Höhe der DeviceOverview ist jetzt erledigt, aber : Tippel selbst nix am Handy, was denn wenn du einen Button betätigen willst und  in dem Moment ändern sich die Readings zu Artist und Titel dann kanns doch passieren das je nach Länge des Readings vorbei tippst weil in der waagrechten auch gezappelt wird ?

Meine Gedanken dazu: Wir sollten die Breite der Zeilen Aktueller Track/Nächster Track auf die Breite begrenzen die die Icons zusammen haben, das dann aber dann zu wenig Platz um Artist den Titel mit - anzuhängen.
Was dann machen ? Das Album Cover ist klein, gefällt mir, denke aber es ist zu klein, wenn wir das größer machen, ist wieder Platz für eine Neue Zeile für den Titel (evtl. mit Duration ?), wenn wir es noch größer machen noch mehr Platz für den slider (der hoffentlich kommt) der dann über den Icons oder unter den Artist/Titel-Zeilen platziert werden kann.

Ich bleib bei divs, du hast ja jetzt div und table verwendet, das mir zuviel mit den Reihen und Spalten, hab etwas gespielt, ausgerichtet oder irgendwas geändert hab ich nicht nur auf div umgestellt und es so gelöst das kein Album-Cover angezeigt wird wenn disconnected, die border sind nur zum Verständnis da, das viel Code der wieder entfällt:


{
my $img = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");
my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...'; };
my $mystate = ReadingsVal($name,"state","unavailable");
my $amp = ReadingsVal($name,"bridgeConnected","0") eq "0" ? "rot" : ReadingsVal($name,"bridgeConnected","0") eq "1" ? "gelb" : "gruen";
my $playpic = $mystate eq "PLAYING"
? 'rc_PAUSE'
: $mystate eq "PAUSED_PLAYBACK"
? 'rc_PLAY'
: $mystate eq "STOPPED"
? 'rc_PLAY'
: $mystate eq "TRANSITIONING"
? 'rc_PLAY'
: $mystate eq "set_next"
? 'rc_NEXT'
: $mystate eq "set_previous"
? 'rc_PREVIOUS'
: $mystate eq "set_volumeUp"
? 'rc_VOLUP'
: $mystate eq "set_volumeDown"
? 'rc_VOLDOWN'
: $mystate eq "set_mute"
? 'rc_MUTE'
: $mystate;
my $mutecmd = ReadingsVal($name,"mute","0") eq "false"
? "true"
: "false";
my $mutepic = ReadingsVal($name,"mute","0") eq "false"
? 'rc_MUTE'
: 'rc_VOLUP';
my $show = "error";
my $currentTrack = $mystate eq "TRANSITIONING"
? "Puffern..."
: $trim30->(ReadingsVal($name,"currentTrack_Artist","unavailable"))." - ".$trim30->(ReadingsVal($name,"currentTrack_Title","FEHLER"));
my $nextTrack = $trim30->(ReadingsVal($name,"nextTrack_Artist","unavailable"))." - ".$trim30->(ReadingsVal($name,"nextTrack_Title","unavailable"));
my $previouspic = 'rc_PREVIOUS';
my $nextpic = 'rc_NEXT';
my $voldownpic = 'rc_VOLDOWN';
my $voluppic = 'rc_VOLUP';

if (ReadingsVal($name,"bridgeConnected","0") ne "2") {
$show = "<div style='float: left;border: 1px solid red;margin-right: 5px;'>".FW_makeImage("10px-kreis-".$amp)."</div> ".FW_makeImage("rc_BLANK")." ";}

elsif (($mystate eq "PLAYING")
|| ($mystate eq "TRANSITIONING" )
|| ($mystate eq "set_next" )
|| ($mystate eq "set_previous" )
|| ($mystate eq "set_volumeUp" )
|| ($mystate eq "set_volumeDown" )
|| ($mystate eq "set_mute" )) {
$show = "<div style='float:left;padding:10px;border: 1px solid blue;'>
<div style='float: left;border: 1px solid red;'>
<div style='float: left;border: 1px solid red;margin-right: 5px;'>".FW_makeImage("10px-kreis-".$amp)."</div>
<img src='$img' style='width:80px;height:80px;'></div>
<div style='float: right;border: 1px solid yellow;padding:5px 20px 0px 0px;'><a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>
Aktueller Track: $currentTrack<br>
Nächster Track: $nextTrack</div>
</div></div>";}

else {$show = "<div style='float: left;border: 1px solid red;margin-right: 5px;'>".FW_makeImage("10px-kreis-".$amp)."</div><a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>";}
"<div>$show</div>"
}


Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 28 Juni 2020, 10:44:55
Starte den Dienst auf dem Test-System mit
node node_modules/sonos2mqtt/lib/index.js --log "debug" --mqtt mqtt://user:pwd@192.168.188.67:1884

wenn ich das vom Terminalfenster vom Tablet aus mache und die Wlan-Verbindung verliere weil ein WLAN-Wechsel stattfand, wird auch das Terminalfenster geschlossen.

Kann mir bitte jemand sagen wie der Befehl lautet den Dienst dann zu beenden, wenn ich mich in einem neuen Fenster anmelde ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 28 Juni 2020, 12:33:12
Hab mir einfach einen normalen Service draus gemacht.
So kann ich nach Belieben starten und stoppen. Wenn man den player mal "hart" bedient ist mir aufgefallen, dass der Dienst dann hängt bzw gewisse readings nicht mehr ausspuckt. Weiß leider noch nicht warum.

Zu der Gruppen Thematik schreibe ich Stephan im Laufe der kommenden Woche noch an.

Wenn du im Terminal arbeitest, meinst du sicher putty...da kann man für normal die Session wieder aufbauen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 28 Juni 2020, 17:39:57
Zitat von: TomLee am 28 Juni 2020, 10:44:55
Starte den Dienst auf dem Test-System mit
node node_modules/sonos2mqtt/lib/index.js --log "debug" --mqtt mqtt://user:pwd@192.168.188.67:1884

wenn ich das vom Terminalfenster vom Tablet aus mache und die Wlan-Verbindung verliere weil ein WLAN-Wechsel stattfand, wird auch das Terminalfenster geschlossen.

Kann mir bitte jemand sagen wie der Befehl lautet den Dienst dann zu beenden, wenn ich mich in einem neuen Fenster anmelde ?
Hi,

oh Mann echt viel zu lesen nach knapp 14 Tagen :)

Meine Empfehlung nach wie vor: Start des sonos2mqtt mittels pm2 wie von mir beschrieben (https://heinz-otto.blogspot.com/2020/05/sonos2mqtt-so-weit-bin-ich.html).
Ich habe auch bisher keinen Nachteil gefunden es direkt aus FHEM zu machen.
define n_pm2 notify global:INITIALIZED "pm2 start sonos2mqtt"

Will man den Dienst "per Hand" überprüfen, muss man es als user fhem tun!
sudo -su fhem pm2 list
Oder direkt in FHEM
{qx(pm2 list)}

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 28 Juni 2020, 17:53:23
Meine Überlegungen zum Speak Befehl:
Es ist immerhin ein komplexer, zeitabhängiger (wenn auch kurzer) Prozess. Es macht aus meiner Sicht keinen Sinn den in ein MQTT2 Device quetschen zu wollen. Es macht aus meiner Sicher gerade Sinn die Modularität von FHEM konsequent zu nutzen.

BTW: Ich bin auch sehr dafür die Templates minimalistisch zum machen. Mir sind ehrlich gesagt viel zu viele kunterbunte Templates vorhanden, die im Zweifelsfall
- nicht gefallen
- nicht mehr funktionieren
- zu speziell auf "eine Zielperson" zugeschnitten sind.

Man kann doch die ganzen "bunten" extra beschreiben und im Wiki ablegen. Der User der beginnt, sollte einfach erstmal etwas schlichtes und funktionales bekommen.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 28 Juni 2020, 19:18:47
Das mit dem pm2 hab ich schon gelesen, nur nicht verstanden wo das herkommt und nicht weiter mit beschäftigt.
Das wohl bei der Installation von Nodejs dabei ?

Einfach so eingeben ohne irgendwas zu installieren ? Probier ich später aus.




Was speak angeht würd ich die verlinkte Polly-Lösung mit SSML gerne mal ausprobieren (wenn ich eh schon einen Amazon-Account hab) ob das klappt, auch wenn ich das bisher mit Alexa (echodevice) gar nicht nutze, interessiert mich aber obs geht und auf der Sonos wär das auch nochmal ein anderes Erlebnis  :D

Ist aber bisher allein schon  daran gescheitert das ich pip nicht auf dem Pi-Zero ( da wird wieder eine andere Version benötigt) installiert bekomme um boto zu installieren.

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 28 Juni 2020, 19:25:20
Naja dabei nicht direkt, aber ein nodejs package oder wie immer das genau heisst :)
sudo npm install pm2 -g
Ist sowas wie die Prozesse Steuerung von nodejs.

Ok, ich glaube ich habe das bisher immer vorausgesetzt - muss ich also noch in meine Doku besser einarbeiten. ✅
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 28 Juni 2020, 20:25:37
Ich habe das "Problem" mit den Gruppen noch nicht verstanden. Ich habe allerdings auch die Logik im normalen Sonos Modul nicht verstanden.

In groupName steht doch einfach der Gruppenname plus die Anzahl der Mitglieder. Wenn ich also die Gruppe steuern will frag ich den groupName ab und steuere die? Mit einem split oder regExp ist das doch simpel?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 29 Juni 2020, 07:59:04
Das Problem ist das der Name in dem Feld immer Master+1 oder +2 oder sonst was ist. Selbst (wie du auch sagst) in der App ist das "merkwürdig".
Wenn du z.B. eine Gruppe aus WZ und K machst, und WZ ist der Master... Dann zeigt dir WZ an was gespielt wird. K zeigt dir dann das er am spielen ist aber nicht was. Da würde ich in diesem Moment gerne etwas mehr Info am Player anzeigen. Zumindest wer hier den Takt angibt.

Das mit dem Templates betrachte ich etwas anders....
Ohne diese ab und an total überflüssigen Dinge in den Templates, wüsste ich von vielen Funktionen nicht. Deswegen finde ich das super, wenn diese auch mehr können als nur on/off.
Hinzu macht es das Plug&Play einfacher. Die Kollegen von anderen Automatisierungssystemen, sind in einigen Dingen "moderner". Egal ob es schlicht ums Design geht oder aber um die Umsetzung von verschiedenen Szenarien. Genau deswegen finde ich die Inspiration durch die Templates genial. Ich schaue ab und an sogar in der Datei nach, wenn ich was probieren will. Gern findet man da auch schon was...

Gruß :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Wuppi68 am 29 Juni 2020, 08:57:06
noch ein kleines Helferlein um einige Dinge vom S2M auf der Kommandozeile zu testen ;-)

sonos-cli

benutzt die gleiche Library und einfach via npm zu installieren (npm install sonos-cli ...  npm start)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 29 Juni 2020, 09:24:16
ZitatWenn du z.B. eine Gruppe aus WZ und K machst, und WZ ist der Master... Dann zeigt dir WZ an was gespielt wird. K zeigt dir dann das er am spielen ist aber nicht was. Da würde ich in diesem Moment gerne etwas mehr Info am Player anzeigen.

Kann auch daneben liegen, kanns nicht testen hab nur einen Player, wenn du den --distinct Pfad aktivierst, kommen dann die zusätzlichen Infos zu K die du erwarten würdest ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 29 Juni 2020, 09:47:41
Zitat von: Otto123 am 28 Juni 2020, 17:53:23
BTW: Ich bin auch sehr dafür die Templates minimalistisch zum machen. Mir sind ehrlich gesagt viel zu viele kunterbunte Templates vorhanden, die im Zweifelsfall
- nicht gefallen
- nicht mehr funktionieren
- zu speziell auf "eine Zielperson" zugeschnitten sind.
Ist zwar hier OT und wir können das gerne auch woanders mal intensiver beleuchten:
- Wenn was nicht (mehr) funktioniert, wäre ich für eine Rückmeldung dankbar (bzw. @HTTPMOD, wo das tatsächlich ein Problem darstellt und auch im entsprechenden "template-Thread" von meiner Seite aktiv angesprochen wurde: Für konkrete Verbesserungsvorschläge...).

Was "nicht-gefallen", indiviuelle Vorlieben und die Frage  angeht, wie man "Bausteinchen" am effektivsten bereithält und präsentiert:
- ich wäre auch nicht unglücklich, wenn wir bei Tasmota und Shelly je eine "Classic-line" ins Angebot aufnehmen könnten, die im stateFormat=>devStateIcon ein simples offline/off/on (bzw. incl. der set_on...-Varianten) macht, that's it...
Diese (übrigens nicht nur von Einzelpersonen gewünschten!) Ampel-Sachen sind zwar nett anzuschauen und eher nahe bei dem was vielleicht irgendwelche "moderneren Konkurrenten" im Angebot haben, aber die Stärke von FHEM liegt eigentlich eher auf kleinem Overhead. Vermutlich ist "das bißchen Perl" kein großes Problem, aber "back to basics" würde m.E. teils trotzdem helfen, dass Einsteiger sich da auch zurechtfinden und dann darauf basierend "ihre Lösung" finden können.
Was Tasmota angeht, gab's mal eine Initiative, den Baukasten weiter zu modularisieren. Damit könnte man das m.E. mit überschaubarem Aufwand erreichen. Da man dann beide (oder noch mehr) Varianten abbilden könnte, wäre allen Genüge getan, den "Ampel-Fans" und den "Puristen"  ;) .
Für Shelly würde ich mir wünschen, dass wir denen erst mal noch das unnötige Aktualisieren von Statusreadings (insbes. on/off) abgewöhnen, dann wäre das auch dort ein Thema... (Ich habe zwischenzeitlich auch einen Shelly, aber das Thema ist für mich selbst low prio; im Web-IF habe ich jedenfalls bisher keine Option gefunden, an diesem Verhalten irgendwas zu ändern).

- Das mit dem Wiki kann man ja ergänzend bzw. trotzdem machen... Es hat sich nur bisher kein Freiwilliger gefunden, der das tatsächlich erledigt hätte :P . Und für Rückverweise ins Wiki betr. Alternativen und allg. Vorgehensweisen wäre in desc: immer Raum ;) .
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 29 Juni 2020, 10:22:47
Zitat von: TomLee am 29 Juni 2020, 09:24:16
Kann auch daneben liegen, kanns nicht testen hab nur einen Player, wenn du den --distinct Pfad aktivierst, kommen dann die zusätzlichen Infos zu K die du erwarten würdest ?

Müsste ich testen... Ggf. hat aber auch jemand eine andere Idee oder was gesehen, was ich nicht sah.
Eigentlich suche ich nur einen Weg, Gruppen sauber anzeigen zu können bzw zu sehen wer mit wem spielt usw.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 29 Juni 2020, 11:05:10
Das Classic Sonos Modul zeigt auch nicht mehr. Die App bildet lediglich die Gruppe, aber in bestimmten Fällen auch bloß den Masterplayer. Ich denke die Gruppenmitglieder kann man bloß wieder aus "allen" auflösen - also wer spielt nicht mit sich selbst.

Vielleicht macht man das mit einem Extra Teil zur Gruppen Anzeige? "ReadingsDINGSBUMS" als ReadingsGroup oder Proxy oder sowas? Ich kann damit leider nicht viel.  :-[
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 30 Juni 2020, 14:22:23
Hey,

anbei mal ein Player (devstateicon) mit Gruppen-Logik. Er zeigt an wer Master ist und schaltet Tasten ab, die in dem Moment nur der Master macht.
Man sieht also wer gerade die Hoheit hat usw. Zudem ist das so aufgebaut, das auch bei mehreren Gruppen eine Unterteilung sauber statt findet.

{
my $vol = ReadingsVal($name,"volume","");
my $img = ReadingsVal($name,"currentTrack_AlbumArtUri","");
my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...'; };
my $mystate = ReadingsVal($name,"state","FEHLER");
my $amp = ReadingsVal($name,"bridgeConnected","0") eq "0"
? "rot"
: ReadingsVal($name,"bridgeConnected","0") eq "1"
? "gelb"
: "gruen";
my $playpic = $mystate eq "PLAYING"
? 'rc_PAUSE@red'
: $mystate eq "PAUSED_PLAYBACK"
? 'rc_PLAY@green'
: $mystate eq "STOPPED"
? 'rc_PLAY@green'
: $mystate eq "TRANSITIONING"
? 'rc_PLAY@blue'
: $mystate eq "set_next"
? 'rc_NEXT@blue'
: $mystate eq "set_previous"
? 'rc_PREVIOUS@blue'
: $mystate eq "set_volumeUp"
? 'rc_VOLUP@blue'
: $mystate eq "set_volumeDown"
? 'rc_VOLDOWN@blue'
: $mystate eq "set_mute"
? 'rc_MUTE@blue'
: $mystate;
my $mutecmd = ReadingsVal($name,"mute","0") eq "false"
? "true"
: "false";
my $mutepic = ReadingsVal($name,"mute","0") eq "false"
? 'rc_MUTE'
: 'rc_VOLUP';
my $show = "FEHLER";
my $currentTrack = $mystate eq "TRANSITIONING"
? "Puffern..."
: $trim30->(ReadingsVal($name,"currentTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"currentTrack_Title","FEHLER"));
my $nextTrack = $trim30->(ReadingsVal($name,"nextTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"nextTrack_Title","FEHLER"));
my $previouspic = 'rc_PREVIOUS';
my $nextpic = 'rc_NEXT';
my $voldownpic = 'rc_VOLDOWN';
my $voluppic = 'rc_VOLUP';
my $groupname = ReadingsVal($name,"groupName","0");
my $sgroupname = (split(" ",ReadingsVal($name,"groupName","")))[0];

if (ReadingsVal($name,"bridgeConnected","0") ne "2") {
$show = " ".FW_makeImage("rc_BLANK")." ";}

elsif (($mystate eq "PLAYING")
|| ($mystate eq "TRANSITIONING" )
|| ($mystate eq "set_next" )
|| ($mystate eq "set_previous" )
|| ($mystate eq "set_volumeUp" )
|| ($mystate eq "set_volumeDown" )
|| ($mystate eq "set_mute" )) {

my $shownp = ReadingsVal($name,"name","0") eq $sgroupname ? "<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>" : "";

$show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>
$shownp
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>";

if (ReadingsVal($name,"name","0") eq $sgroupname) {
$show = "$show
Aktueller Track: $currentTrack<br>
Nächster Track: $nextTrack";}

elsif (ReadingsVal($name,"name","0") ne $groupname) {
$show = "$show
Master: $sgroupname<br>";}
}
else {$show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>";}

"<div>
<table>
  <tr>
    <td><div style='display: inline-block; margin-right: 5px; border: 1px solid lightgray; height: 4.00em; width: 4.00em; background-image: url($img);background-size: contain;'></div>
</td>
    <td>".FW_makeImage("10px-kreis-".$amp)."
$show</td>
   </tr>
</table>
</div>"
}


Ich habe jetzt aber nicht die DIVs getauscht... Geht mir gerade erstmal um die Logik.

Was ich noch nicht weiß... Wenn man eine Gruppe erstellt, sendet nur noch der Master einer Gruppe via MQTT Infos. Die Slaves sind in dem Moment komplett still.
Somit stimmt State bei diesen nicht sauber. Nun müsste ich im Gruppen Modus OHNE notify und co die Daten des Masters auslesen. Ich habe aber noch keine Idee...

EDIT: Denke das gehört eher ins Modul. Habe Stephan angeschrieben: https://github.com/svrooij/sonos2mqtt/issues/110

Was sagt ihr denn erstmal zum Player? :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 Juli 2020, 11:51:17
Hi 87insane,

ich habe jetzt etwas gebraucht bis dein Player lief, ich musste ja ein paar Änderungen nacharbeiten :)
Das devStateIcon find ich gut ;)
Was für mich noch etwas zweifelhaft ist, ist der rote/grüne Punkt für die Bridge im Player - aber vielleicht bin ich nur skeptisch ;)

Was für mich etwas unnatürlich ist, ist das Volume mute Icon im set Befehl. Mich verwirrt es: man muss das Icon drücken, das ändert sich und nichts passiert - klar das macht er erst nach dem drücken von set.
Ich glaube  hier wäre die Auswahl mit Wort oder Zahl besser.

Danke für die Arbeit!
Ich mach jetzt mal mein Testsystem platt und schau mir den aktuellen Stand vom scratch an :)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 01 Juli 2020, 12:37:14
Hey zusammen,

ZitatWas für mich etwas unnatürlich ist, ist das Volume mute Icon im set Befehl. Mich verwirrt es: man muss das Icon drücken, das ändert sich und nichts passiert - klar das macht er erst nach dem drücken von set.
Ich glaube  hier wäre die Auswahl mit Wort oder Zahl besser.
Finde ich auch... Habs so gelassen, da ich nicht genau weiß was Beta-User vor hat damit ....

Zitatich habe jetzt etwas gebraucht bis dein Player lief, ich musste ja ein paar Änderungen nacharbeiten :)
Was denn? Vermutlich alles andere bis auf devStateIcon was hier in den Seiten unter ging?

ZitatWas für mich noch etwas zweifelhaft ist, ist der rote/grüne Punkt für die Bridge im Player
Habe die Bridge in hidden liegen. Würde also (warum auch immer) die Bridge spinnen, sehe ich sofort was Sache ist:
grün: alles toll (Dienst läuft und es wurden Player gefunden)
gelb: Dienst läuft aber KEINE Player gefunden
rot: Dienst aus

Hab auch schon was neues gebaut (devStateIcon):
{
my $groupname = ReadingsVal($name,"groupName","0");
my $sgroupname = (split(" ",ReadingsVal($name,"groupName","")))[0];
my $uuidtoname = "MQTT2_".ReadingsVal($name,"coordinatorUuid","0");
my $vol = ReadingsVal($name,"volume","");
my $img = ReadingsVal($name,"currentTrack_AlbumArtUri","");
my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...'; };
my $mystate = $name eq $uuidtoname ? ReadingsVal($name,"state","FEHLER") : ReadingsVal($uuidtoname,"state","");
my $amp = ReadingsVal($name,"bridgeConnected","0") eq "0"
? "rot"
: ReadingsVal($name,"bridgeConnected","0") eq "1"
? "gelb"
: "gruen";
my $playpic = $mystate eq "PLAYING"
? 'rc_PAUSE@red'
: $mystate eq "PAUSED_PLAYBACK"
? 'rc_PLAY@green'
: $mystate eq "STOPPED"
? 'rc_PLAY@green'
: $mystate eq "TRANSITIONING"
? 'rc_PLAY@blue'
: $mystate eq "set_next"
? 'rc_NEXT@blue'
: $mystate eq "set_previous"
? 'rc_PREVIOUS@blue'
: $mystate eq "set_volumeUp"
? 'rc_VOLUP@blue'
: $mystate eq "set_volumeDown"
? 'rc_VOLDOWN@blue'
: $mystate eq "set_mute"
? 'rc_MUTE@blue'
: $mystate;
my $mutecmd = ReadingsVal($name,"mute","0") eq "false"
? "true"
: "false";
my $mutepic = ReadingsVal($name,"mute","0") eq "false"
? 'rc_MUTE'
: 'rc_VOLUP';
my $show = "FEHLER";
my $currentTrack = $mystate eq "TRANSITIONING"
? "Puffern..."
: $trim30->(ReadingsVal($name,"currentTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"currentTrack_Title","FEHLER"));
my $nextTrack = $trim30->(ReadingsVal($name,"nextTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"nextTrack_Title","FEHLER"));
my $previouspic = 'rc_PREVIOUS';
my $nextpic = 'rc_NEXT';
my $voldownpic = 'rc_VOLDOWN';
my $voluppic = 'rc_VOLUP';

if (ReadingsVal($name,"bridgeConnected","0") ne "2") {
$show = " ".FW_makeImage("rc_BLANK")." ";}

elsif (($mystate eq "PLAYING")
|| ($mystate eq "TRANSITIONING" )
|| ($mystate eq "set_next" )
|| ($mystate eq "set_previous" )
|| ($mystate eq "set_volumeUp" )
|| ($mystate eq "set_volumeDown" )
|| ($mystate eq "set_mute" )) {

my $shownp = ReadingsVal($name,"name","0") eq $sgroupname ? "<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>" : "";

$show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>
$shownp
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>";

if (ReadingsVal($name,"name","0") eq $sgroupname) {
$show = "$show
Aktueller Track: $currentTrack<br>
Nächster Track: $nextTrack";}

elsif (ReadingsVal($name,"name","0") ne $groupname) {
$show = "$show
Master: $sgroupname";}
}
else {
$show = $name eq $uuidtoname
? "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>"
: "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a><br>Master: $sgroupname";}

"<div>
<table>
  <tr>
    <td><div style='display: inline-block; margin-right: 5px; border: 1px solid lightgray; height: 4.00em; width: 4.00em; background-image: url($img);background-size: contain;'></div>
</td>
    <td>".FW_makeImage("10px-kreis-".$amp)."
$show</td>
   </tr>
</table>
</div>"
}


Das hier kann auch den Status von Gruppen-Playern abbilden. Solange es keine Ideen gibt für das sonos2mqtt Modul habe ich keine besseren...
Nun geht er hin und:
my $mystate = $name eq $uuidtoname ? ReadingsVal($name,"state","FEHLER") : ReadingsVal($uuidtoname,"state","");
liest den State im Gruppenmodus vom Master und im normalem Modus von sich selber. An sich finde ich das ok aber man muss leider F5 / aktualisieren anklicken damit der passive Player auch korrekt angezeigt wird. (vermutlich wegen longpoll usw?)

PS: Nicht meckern wegen dem Code. Da wir ja immer weiter testen, mache ich den nicht jedes mal neu und sauber. Sauber machen können wir bei Fertigstellung. Gerade jetzt mit den Gruppen, würde ich ein wenig anders machen. Ich brauche noch jemanden der Dolby oder Stereo Paare testen kann. Das verhält sich wieder anders als normale Gruppen.

Wenn das hier alles sauber und zufriedenstellend läuft, mache ich auch eine saubere Erklärung. Ich mag es selber nicht immer x Seiten zu lesen um diese eine Zeile noch zu finden...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 01 Juli 2020, 12:44:49
Zitat von: 87insane am 01 Juli 2020, 12:37:14
Hey zusammen,
Finde ich auch... Habs so gelassen, da ich nicht genau weiß was Beta-User vor hat damit ....
Da ich "blind" bin (bzw. diese Geräte nicht habe und vermutlich auch nicht anschaffen werde, ich habe rechtzeitig in paar Kabel verlegt ;) ), dürft ihr das machen, wie ihr wollt.
Falls es da um webCmd und igendwelche sich (hoffentlich) abwechselnden Icons ging, war meine Intention v.a. klarzustellen, dass es bereits entsprechende Funktionalitäten gibt und man nicht unbedingt das Rad neu erfinden muß. Wenn's anders (besser) geht, ist mir das auch recht ;) .
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 Juli 2020, 13:07:21
Zitat von: Beta-User am 01 Juli 2020, 12:44:49
Falls es da um webCmd und igendwelche sich (hoffentlich) abwechselnden Icons ging, war meine Intention v.a. klarzustellen, dass es bereits entsprechende Funktionalitäten gibt und man nicht unbedingt das Rad neu erfinden muß. Wenn's anders (besser) geht, ist mir das auch recht ;) .
Das ist auch absolut hilfreich sowas zu sehen :) - kann man eigentlich zwei Parameter/widgets in der setList hintereinander machen? Wenn Du das aus dem Ärmel schüttelst für slider und ne checkbox :)

ZitatWas denn? Vermutlich alles andere bis auf devStateIcon was hier in den Seiten unter ging?
genau ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 Juli 2020, 13:17:04
ZitatIch brauche noch jemanden der Dolby oder Stereo Paare testen kann. Das verhält sich wieder anders als normale Gruppen.
Wie meinst Du das? Ich habe eine 5.1 Kombi aus Playbase Sub und 2x Sonos1 - im Gegensatz zum classic Sonos Modul und analog zur Player App sehe ich die Mitglieder aber gar nicht. Und das finde ich gut so. ;)

Ok - vielleicht weiß ich was Du meinst. Ich bekomme das devStateIcon 10 mal angezeigt 🥴
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 01 Juli 2020, 13:41:23
ZitatDa ich "blind" bin (bzw. diese Geräte nicht habe und vermutlich auch nicht anschaffen werde, ich habe rechtzeitig in paar Kabel verlegt ;) ), dürft ihr das machen, wie ihr wollt.
Nach der Antwort von Stephan, denke ich macht ein spezieller Eintrag (wenn das geht) in Readingslist Sinn.
Aktuell sieht der gemeinte Eintrag so aus:
sonos/RINCON_7828CAF427B201400:.* { json2nameValue($EVENT,'',$JSONMAP) }

Könnte man diesen anpassen wie z.B. announce bei Shelly? ( Du bist ggf. blind aber kannst sicher helfen :) )
Er müsste gucken ob uuid != coordinatorUuid.
Wenn uuid und coordinatorUuid gleich sind, soll er das tun: sonos/RINCON_7828CAF427B201400:.* { json2nameValue($EVENT,'',$JSONMAP) }
Wenn unterschiedlich, das: sonos/%coordinatorUuid%:.* { json2nameValue($EVENT,'',$JSONMAP) }

Im einzel Modus ist uuid == coordinatorUuid.
Im Gruppenmodus ist uuid != coordinatorUuid. In coordinatorUuid steht immer sowas wie: RINCON_7828CAF4289001400 (also perfekt um einen variablen Readingslist-Eintrag zu erzeugen, wenn das geht.
Mit einem solchen Eintrag könnte ich den Player weiter bauen und das Aktualisierung Problem wäre weg.

Ggf geht es auch nur mit einem Abo gegen alles (sonos/+:.) und dann muss gefiltert werden.
Am Ende soll er selber erkennen - Bin ich Master? Wenn ja dann nimm meinen RINCON Pfad und sonst den, des Masters. Der Name des Masters ist immer im Reading DEVICE coordinatorUuid (in jedem Player DEVICE).

Hatte an sowas gedacht:
sonos/+:.* { $EVENT =~ m,.* VERGLEICH, ? { json2nameValue($EVENT,'',$JSONMAP) } : undef }
(nur in funktionierend).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 01 Juli 2020, 13:58:55
Harte Nüsse habt ihr hier zu knacken...

Zwei Widgets für einen setList-Eintrag geht afaik nicht, man müßte ggf. zwei setter daraus machen und eben dann nur via devStateIcon etc. anzeigen, was jeweils Sinn macht...

Was das rausfiltern bestimmter Messages auf Basis der Analyse von Topic und Message angeht: müßte gehen, ist aber ziemlich aufwändig. Am ehesten in diese Richtung geht das, was bei OpenMQTTGateway_BT_gtag (und drumrum) stattfindet; da ist jedenfalls u.a. auch "wildcards@Topic" umgesetzt. Evtl. müßte man dann gleich noch den gemappten Hash auf Aktualisierung nachbearbeiten (6channel_ethernet_board_6input_split). Das aber erst mal nur als erste Gedanken dazu, das ganze ist "höhere Schule", und irgendwie riecht es eher nach myUtils...

(Das announce bei Shelly ist übrigens ein gutes Stichwort: Da ist zum einen der Teil der Suche durch Event drin, zum anderen kann das vermutlich aus den shelly-templates wieder raus, weil announce seit einigen fw-Versionen wieder auch auf das Device geht, oder? Teil 2 ist hier aber OT, bitte ggf. im anderen Thread antworten).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Wuppi68 am 01 Juli 2020, 13:59:55
Zitat von: Otto123 am 01 Juli 2020, 13:17:04

Ok - vielleicht weiß ich was Du meinst. Ich bekomme das devStateIcon 10 mal angezeigt 🥴

na dann sei mal froh, dass Sonos noch kein 7.1.4 kann ***duckundganzschnellverkrümel***
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 01 Juli 2020, 14:03:50
Zitat von: Otto123 am 01 Juli 2020, 13:17:04
Wie meinst Du das? Ich habe eine 5.1 Kombi aus Playbase Sub und 2x Sonos1 - im Gegensatz zum classic Sonos Modul und analog zur Player App sehe ich die Mitglieder aber gar nicht. Und das finde ich gut so. ;)

Ok - vielleicht weiß ich was Du meinst. Ich bekomme das devStateIcon 10 mal angezeigt 🥴

Das ist gut! Erstmal. Dann brauchen wir das nicht beachten. Allerdings geht in die Richtung laut Sonos und Stephans Doku mehr. Ich würde mir die auch nicht einzeln anzeigen lassen wollen. Aber man kann die Einstellungen bis ins Detail anpassen. Das würde ich ggf noch mit Anzeigen lassen. Also bei Dolby wie laut welcher Kanal ist und die Möglichkeit bieten alle einzeln in master zu steuern zb. Aber das können wir dann ja beruhigt nach hinten schieben.

Aso...überlesen...
Stateformat löschen, dann ist es nur einmal.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 Juli 2020, 14:32:19
Zitat von: 87insane am 01 Juli 2020, 14:03:50
Aso...überlesen...
Stateformat löschen, dann ist es nur einmal.
Eh komm so einfach :)

Ich glaub man muss die derzeitigen Templates überarbeiten ;)

Ich sag mal: gefällt mir besser als classic.
Was noch etwas stört ist der nächste Track, der passt nicht beim Radio

Und: Man muss nicht alles machen was geht. Ich brauch das Ding primär zum automatisieren, für schön und "alles was geht" gibt es doch die App. Die muss man nicht nachbauen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 Juli 2020, 14:53:45
In dieser Datei http://192.168.56.222:1400/xml/device_description.xml stehen weitere Infos zum Player.
Dort steht auch die Adresse vom Icon zum Player drin und man könnte es direkt laden
http://192.168.56.222:1400/img/icon-S14.png

Nur so zum Nachdenken :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 01 Juli 2020, 15:54:01
ZitatWas noch etwas stört ist der nächste Track, der passt nicht beim Radio
sehe da kein Problem.. bekomme ich weg.

ZitatIn dieser Datei http://192.168.56.222:1400/xml/device_description.xml stehen weitere Infos zum Player.
Dort steht auch die Adresse vom Icon zum Player drin und man könnte es direkt laden
http://192.168.56.222:1400/img/icon-S14.png
Worauf bezogen?

ZitatIch glaub man muss die derzeitigen Templates überarbeiten ;)
Warum? Normal ist das nur wenn man ein Gerät immer wieder ändert. Da ich aktuell viel dran rum spiele habe ich auch noch kein Template gebaut. Würde zuerst einen Player fertig haben wollen an dem ich nicht jeden Tag bastel....

@Beta-User: Ich weiß du zeigst den Leuten gerne wo sie nachlesen können... Ich bastel auch immer gerne alles Mögliche und lese x Dinge. In diesem speziellen Fall, macht es ggf. Sinn, wenn du direkt (blind) mit einsteigst? An sich weiß du ja was gemeint ist und bevor ich wieder 6 Stunden wegen suchen verliere...Wäre super genial, wenn du bei der Idee mit dem Readingslist-Eintrag hilfst. Ggf. gibt es auch noch eine bessere Idee?

ZitatEh komm so einfach :)
Hab ja schon viele Stunden damit verbringen dürfen. Als ich das, das erste mal hatte, habe ich locker 4 Stunden gebraucht um den Zusammenhang zu bemerken^^.
Ist eben auch sehr speziell diese Art von devStateIcon. An sich schon fast ein Modul.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 Juli 2020, 15:57:21
Bezogen auf den Sonos Player :)
IP des Players
http://192.168.56.222
Port
:1400
XML
/xml/device_description.xml
dort steht dann die relative URL zum Icon.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 01 Juli 2020, 16:00:41
Meinst du mit "Icon" = "Album Cover / Track Cover usw?

Wenn Ja:
Zu dem Thema denke ich eh noch nach. Wenn du von extern versuchen würdest deine FHEM Seite auf zu rufen, werden sich Personen wundern. Denn natürlich werden interne IP Adresse aus einem externen Netz nicht angezeigt /aufgelöst. Und somit würden die Bilder nicht erscheinen können.
Am liebsten hätte ich die Netz Quelle von SONOS.


Ach ja...danke für das schöner als classic :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 01 Juli 2020, 16:20:34
Zitat von: 87insane am 01 Juli 2020, 15:54:01
@Beta-User: Ich weiß du zeigst den Leuten gerne wo sie nachlesen können... Ich bastel auch immer gerne alles Mögliche und lese x Dinge. In diesem speziellen Fall, macht es ggf. Sinn, wenn du direkt (blind) mit einsteigst? An sich weiß du ja was gemeint ist [...]
Ja, hmm, also:

Das Problem fängt damit an, dass ich das hier irgendwie interpretieren muß, und leider keinen Schimmer habe, wie der MQTT-Verkehr (v.a. die konkreten Payloads) aussieht:
Zitat von: 87insane am 01 Juli 2020, 13:41:23
Nach der Antwort von Stephan, denke ich macht ein spezieller Eintrag (wenn das geht) in Readingslist Sinn.
Aktuell sieht der gemeinte Eintrag so aus:
sonos/RINCON_7828CAF427B201400:.* { json2nameValue($EVENT,'',$JSONMAP) }

Könnte man diesen anpassen wie z.B. announce bei Shelly? ( Du bist ggf. blind aber kannst sicher helfen :) )
Er müsste gucken ob uuid != coordinatorUuid.
Wenn uuid und coordinatorUuid gleich sind, soll er das tun: sonos/RINCON_7828CAF427B201400:.* { json2nameValue($EVENT,'',$JSONMAP) }
Wenn unterschiedlich, das: sonos/%coordinatorUuid%:.* { json2nameValue($EVENT,'',$JSONMAP) }

Im einzel Modus ist uuid == coordinatorUuid.
Im Gruppenmodus ist uuid != coordinatorUuid. In coordinatorUuid steht immer sowas wie: RINCON_7828CAF4289001400 (also perfekt um einen variablen Readingslist-Eintrag zu erzeugen, wenn das geht.
Daher könnte man jetzt hergehen, und dem Blinden den ganzen MQTT-Verkehr zum Fraß/zur Analyse und zum "selber-Testen" vor die Füße werfen. Ist mir im Moment ehrlich gesagt zu komplex.

Oder wir nähern uns der Sache eher mit Bruchstücken:
1. Feststellung: wenn wir das "on the fly" anpassen wollten, müßten wir jedes Mal Attribute ändern. Ginge, ist aber mAn. unschön.
2. Feststellung: Wenn wir das vermeiden wollen, brauchen wir
a) eine Möglichkeit um festzustellen, ob wir aa) solo bzw. der Master sind oder bb) unter einem anderen Master stehen. Dafür würde ich ein Reading (an jedem Gerät) generieren, das man im Weiteren auch dann auswerten kann; Inhalt vermutlich 0 (autonom) oder die ID des Masters. Sollte anhand des shelly-announce-Beispiels leistbar sein? Ansonsten bräuchte ich die dazu passenden "verdaubaren" Infos zum MQTT-Verkehr/Payload...
b) wir müssen dann beide Zweige abonnieren, also den "wildcard"-Zweig und den "normalen RINCON", und dann erst prüfen, ob wir eingehende Messages auf dem Zweig überhaupt auswerten dürfen (dann werden die auf dem speziellen RINCON kommenden Infos auch grundsätzlich verworfen (?) oder nur bestimmte??? ). Ggf. kann man an ein "master_"-Präfix (?) denken, falls man das auseinanderhalten muß; ; Präfix-Bestimmung ginge ggf. auch dynamisch, wir sind da auf der Perl-Ebene... Dann müßte aber das JSONMAPPING auch passen, was schwierig ist, wenn es zu individualisiert ist).

Sorry, aber das ist auch für mich von hier aus eine einzige Blackbox, ohne Zuarbeit des einen oder anderen Bauteils oder gemeinsame Weiterentwicklung wird das nicht gehen...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 Juli 2020, 18:14:47
Zitat von: 87insane am 01 Juli 2020, 16:00:41
Meinst du mit "Icon" = "Album Cover / Track Cover usw?
Nein ich meine die Original Icon der Player Geräte - schau doch auf mein Bild mit Sonos Classic.
Damit dort nicht bloß überall das gleiche Lautsprecher Symbol Icon steht ;)
das was mit attr <player> icon gesetzt wird ::)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 01 Juli 2020, 18:46:00
Folgende Erkenntnisse konnte ich beim erstellen des Players machen und helfen hier vermutlich weiter...

Es gibt folgende interessante Readings:
groupName beinhaltet den Playernamen. Wenn es aber eine Gruppe ist, steht dort MASTER + x(Anzahl) - Beispiel Wohnzimmer + 2
coordinatorUuid beinhaltet z.B. RINCON_7828CAF427B201400 (Ist die eigene wenn es keine Gruppe ist. In einer Gruppe steht da RINCON_1A2B3C... ID des Masters)
uuid beinhaltet z.B. RINCON_7828CAF427B201400 - (Ist immer die eigene ID)
name beinhaltet z.B. Wohnzimmer (Ist der Playername)

1. Ja - Sehe ich auch so! Nervt jetzt schon...

2. a)
aa)
Woher weiß ich ob ein Player in einer Gruppe ist? Wenn name != groupName [if (ReadingsVal($name,"name","0") ne (ReadingsVal($name,"groupName","0")] [Wohnzimmer != Wohnzimmer + 2]

Hier könnte man auch $name mit dem dem Reading coordinatorUuid (natürlich dann mit MQTT2_ vor gesetzt) vergleichen. [my $uuidtoname = "MQTT2_".ReadingsVal($name,"coordinatorUuid","0");]. Finde ich aber schlecht. Zu unflexibel, wenn einer doch mal ein rename macht.


bb1)
Woher weiß ich wer Master ist (lesbar für den Benutzer)? gorupName nach dem ersten Leerzeichen splitten [my $sgroupname = (split(" ",ReadingsVal($name,"groupName","")))[0];] [Wohnzimmer + 2 = Wohnzimmer]

bb2)
Woher weiß ich wer Master ist (um Daten zu übernehmen)? Gerät mit dem Reading uuid und dem Inhalt aus coordinatorUuid (des Slaves) suchen [.*:FILTER=uuid=coordinatorUuid]


cc) [benenne ich das jetzt mal]
Thema Payload. Hier kommen wir wohl nie weiter... Ich stelle die Frage echt oft aber eine gute Antwort gab es noch nicht. Wie fangen wir diesen Verkehr am besten ab. Verbose @all finde ich keine Option! Hier wäre eine grundlegende Logging Definition gut. So das man immer wieder, einfach mal so..... Was ist aktuell "best practice"?

Info zu 2. a): Mit der Art und Weise würden auch mehrere Gruppen erkannt werden und die Slaves sauber zugeordnet.

b)
Ich denke das eigentlich alle Fragen an sich durch 2. a) beantworten werden konnten und das sogar flexibel.
An sich (https://github.com/svrooij/sonos2mqtt/issues/110#issuecomment-652288934) sollte dies die weiteren beantworten.
Also haben wir nur ein + in allen Playern auf den Zweig und WENN = GRUPPE [aa)], DANN nimm die Daten vom MASTER [bb2)]


So läuft das ca auch im devStateIcon ab. Wundere mich das du das so nicht gecheckt hast. Immerhin kann ich das alles (und das sage ich gerne), größten Teils von Dir ;)
Wie dem auch seie... Ich helfe gerne weiter um den Zweig als Essenz zu erarbeiten. Denn dann, kann ich den Player (in meinen Augen) nahezu komplett fertig stellen. Dazu würden Die Gruppen auch logisch angezeigt usw.

ABER ich überlege auch noch eine weitere Ansicht zu bauen. Ich denke nicht jeder hat alle Player in jedem Raum (FHEM). Also wäre ein Slave in einem Raum ungünstig so wie es aktuell ist. Ich müsste also A) bestimmte set´s auf dem Master ausführen lassen.
Oder B) Für Gruppen ggf. eine separate ReadingsGroup. Aber das finde ich wieder unschön....
Oder C) Ideen @all? :)

Info: Liegt daran, das z.B. next oder previous auf dem Slave / Child nicht ausgeführt werden können. Play/Pause/Stop gilt an allen Playern in einer Gruppe. Deswegen blende ich die beiden Button auf den Slaves auch aus. Zudem gibt es noch einen Unterschied zwischen der Player Lautstärke und der Gruppenlautstärke. Sieht man auch in der App immer ganz schön. Wenn z.B.
Wohnzimmer Lautstärke 50%
Arbeitszimmer Lautstärke 30%

und man dann an der Gruppen-Lautstärke dreht, gehen die einzelnen Player mit Ihrer eigenen Lautstärke mit. Also es bleibt harmonisch und nicht alle Player sind identisch der Gruppenlautstärke. In meinem Player geht aktuell nur die Lautstärke des jeweiligem Players. Da ich das eigentlich auch nur zur Automatisierung nutze aber es auch schön haben will, steigere ich mich da auch so rein. Wir reden hier ja auch nicht gerade über ein Mini-Projekt... Mal sehen wo wir in 4 Wochen stehen :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 01 Juli 2020, 18:46:55
Zitat von: Otto123 am 01 Juli 2020, 18:14:47
Nein ich meine die Original Icon der Player Geräte - schau doch auf mein Bild mit Sonos Classic.
Damit dort nicht bloß überall das gleiche Lautsprecher Symbol Icon steht ;)
das was mit attr <player> icon gesetzt wird ::)

Oh die schmeiße ich am Ende eh immer rauß.. Nutze die aber gern als devStateIcon in passender Form. Danke!
Anbei mal OT Bild... Aber damit man weiß was ich meine... hehe
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 01 Juli 2020, 19:50:09
Zitat von: Otto123 am 01 Juli 2020, 14:32:19
Was noch etwas stört ist der nächste Track, der passt nicht beim Radio

Teste mal den hier...(devStateicon)
{
my $groupname = ReadingsVal($name,"groupName","0");
my $sgroupname = (split(" ",ReadingsVal($name,"groupName","")))[0];
my $uuidtoname = "MQTT2_".ReadingsVal($name,"coordinatorUuid","0");
my $vol = ReadingsVal($name,"volume","");
my $img = ReadingsVal($name,"currentTrack_AlbumArtUri","");
my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...'; };
my $mystate = $name eq $uuidtoname ? ReadingsVal($name,"state","FEHLER") : ReadingsVal($uuidtoname,"state","");
my $amp = ReadingsVal($name,"bridgeConnected","0") eq "0"
? "rot"
: ReadingsVal($name,"bridgeConnected","0") eq "1"
? "gelb"
: "gruen";
my $playpic = $mystate eq "PLAYING"
? 'rc_PAUSE@red'
: $mystate eq "PAUSED_PLAYBACK"
? 'rc_PLAY@green'
: $mystate eq "STOPPED"
? 'rc_PLAY@green'
: $mystate eq "TRANSITIONING"
? 'rc_PLAY@blue'
: $mystate eq "set_next"
? 'rc_NEXT@blue'
: $mystate eq "set_previous"
? 'rc_PREVIOUS@blue'
: $mystate eq "set_volumeUp"
? 'rc_VOLUP@blue'
: $mystate eq "set_volumeDown"
? 'rc_VOLDOWN@blue'
: $mystate eq "set_mute"
? 'rc_MUTE@blue'
: $mystate;
my $mutecmd = ReadingsVal($name,"mute","0") eq "false"
? "true"
: "false";
my $mutepic = ReadingsVal($name,"mute","0") eq "false"
? 'rc_MUTE'
: 'rc_VOLUP';
my $show = "FEHLER";
my $currentTrack = $mystate eq "TRANSITIONING"
? "Puffern..."
: $trim30->(ReadingsVal($name,"currentTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"currentTrack_Title","FEHLER"));
my $nextTrack = $trim30->(ReadingsVal($name,"nextTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"nextTrack_Title","FEHLER"));
my $previouspic = 'rc_PREVIOUS';
my $nextpic = 'rc_NEXT';
my $voldownpic = 'rc_VOLDOWN';
my $voluppic = 'rc_VOLUP';

if (ReadingsVal($name,"bridgeConnected","0") ne "2") {
$show = " ".FW_makeImage("rc_BLANK")." ";}

elsif (($mystate eq "PLAYING")
|| ($mystate eq "TRANSITIONING" )
|| ($mystate eq "set_next" )
|| ($mystate eq "set_previous" )
|| ($mystate eq "set_volumeUp" )
|| ($mystate eq "set_volumeDown" )
|| ($mystate eq "set_mute" )) {

my $shownp = ReadingsVal($name,"name","0") eq $sgroupname ? "<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>" : "";

$show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>
$shownp
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>";

if (ReadingsVal($name,"name","0") eq $sgroupname) {
$show = ReadingsVal($name,"enqueuedMetadata_UpnpClass","FEHLER") ne "object.item.audioItem.audioBroadcast"
? "$show Aktueller Track: $currentTrack<br>Nächster Track: $nextTrack"
: "$show Radio: $currentTrack";}

elsif (ReadingsVal($name,"name","0") ne $groupname) {
$show = "$show
Master: $sgroupname";}
}
else {
$show = $name eq $uuidtoname
? "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>"
: "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a><br>Master: $sgroupname";}

"<div>
<table>
  <tr>
    <td><div style='display: inline-block; margin-right: 5px; border: 1px solid lightgray; height: 4.00em; width: 4.00em; background-image: url($img);background-size: contain;'></div>
</td>
    <td>".FW_makeImage("10px-kreis-".$amp)."
$show</td>
   </tr>
</table>
</div>"
}


Bei mir geht der so super. Puffern... bleibt ;)
Spaß bei Seite... Hab Sender mit Anzeige von nächster Track. Aber Tatsächlich ist mir das beim Radio echt egal. Dazu hat auch nicht jeder Moderator einen next Track. Ist je nachdem wie die Streamen. Denke aber so ist es ganz gut.

Teste(t) mal und berichtet.. :)

EDIT:
Bild angehangen

PS: Für mich hat es NOCH keine PRIO das es verschoben ist. Aber @TomLee ist da fit! Denke wir machen hier was schönes drauß....
Ach ja und meine Paint Künste bitte nicht direkt verurteilen. Denke man erkennt was man soll ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 Juli 2020, 21:31:14
Danke, da ist jetzt der nächste Track immer weg, aber es steht auch immer Radio. Aber lass erstmal, meine Player sind bestimmt noch nicht auf dem Stand. Ich muss neu machen. Wird erst morgen. ;D

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juli 2020, 00:20:32
Hatte es so verstanden das du das bei Radio so wolltest.
Lass uns die zusammen bauen. Am ende zählen die Ideen nicht der, der es realisiert. Das sind am ende eh wir alle :)

Ne so erkennt er ob Radio oder Playlist. Nächster Track ist weg aber er zeigt wie im Auto, wenn du willst auch rds an.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 Juli 2020, 09:02:12
Nein, das Problem liegt in den Readings. Wechselt man die Quellen dann hat man irgendwann auch Reste.
Man spielt eine Play list dann hat man den nächsten Titel.
Dann spielt man Radio ohne die Übertragung nächster Titel (offenbar sind die Sender unterschiedlich) damit steht der nächste Titel der vorherigen Playlist noch drin. Also nicht mehr aktuell.
Eventuell muss man auch mal Readings löschen anwerfen wenn man die Quelle wechselt?

Ich wollte das nur als Feedback geben, wie gesagt mir ist momentan die Anzeige nicht so wichtig :)

Ich habe mich gestern noch mit minidlna beschäftigt (89 Pakete und 672 MB Plattenplatz klang dann nicht nach mini ::) )
Das funktioniert dann auch erstmal - aber...
Ich bekommen es nicht hin, eine url zur Übertragung zu bestimmen.
Ich werfe eine Datei willi.mp3 ins dlna-medien Verzeichnis, wenn ich die in einem Mediaplayer aufrufe, heißt die dort 22.mp3 . Diese Zahl ist fortlaufend :o
So ist das erstmal nicht brauchbar, es sei denn einer kann mir sagen wie ich an eine vorbestimmten url komme.
Die Idee wäre ja, ich werfe die "Speakdatei" ins Media Verzeichnis vom dlna und übergebe  sonos die url zum abspielen. Dazu muss ich die url aber wissen können.

Für mich sieht nach dem Versuch erstmal samba viel einfacher, viel schlanker und viel beherrschbarer aus! Zumal ich irgendwas von Datenbank beim dlna gelesen habe.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 02 Juli 2020, 09:51:32
Ups, 672MB sind in der Tat nicht wenig (ich habe den vor einiger Zeit auf meinem Wohnzimmer-Rechner installiert, und da sind sowieso die ganzen libs zum Umgang mit Mediendateien usw. schon drauf gewesen, da war das wirklich "fast nichts", was zusätzlich zu installieren war.
Was das Abspielen angeht, vermute ich, dass es über den Umweg einer Playlist gehen müßte, aber wenn der Overhead so riesig ist, dann ist das wohl eher ein Irrweg, sorry für den Hinweis.


Löschen der bzw. einzelner Readings könnte man über den input-setList Eintrag mit erledigen, das war in meiner Variante afaik sowieso Perl. Sonst über einen userReadings-Eintrag, der dann am Ende ggf. schlicht ein "undef" zurückgeben kann - dann wird das betr. Reading nicht angelegt (jedenfalls, soweit ich mich entsinne).



Was das mit der "dynamischen readingList" angeht:
Erst mal sollte das mit "Master oder nicht?" in einem eigenen Reading landen, ggf. auch der Name des Masters (der sollte ggf. eher indirekt über devspec2array und der CID abgeleitet werden? Kommt aber auch darauf an, was damit gemacht werden soll).
Auch hier wäre ggf. ein userReadings-Eintrag denkbar (Code-Fragment hattest du ja über die ReadingsVal-Abfrage geliefert, über den Namen würde ich eher nicht gehen) oder eben eine "Spezialauswertung" des wirklich zum Gerät gehörenden RINCON-Topics (als eigenständiger rL-Eintrag) denkbar. Da ich aber den MQTT-Verkehr nicht wirklich kenne...

(Und nein, ich bin weder allwissend, noch in der Lage, beim Überfliegen längerer devStateIcon-Codes zu erkennen, was es alles gibt und wo es herkommt...).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juli 2020, 09:52:47
Also mich stören die "Reste" nicht. Man kann auch einfach den Sendernamen anzeigen oder so.
Hatte das nun ja so eingestellt, das bei Tracklist nächster und aktueller Track kommt und bei Radio eben Radio...Aber haste recht. Erstmal keine Tragödie.

Ich habe ein synology NAS. Auf diesem läuft seit Jahren ein DLNA Server. Bei diesem habe ich normale Namen und nicht irgendwelche fortlaufenden Nummern.
DLNA funktioniert an sich ja ganz einfach. Es ist immer eine indizierte DB notwendig. In dieser DB werden die Streams erfasst und auch die Formate (wenn gewollt), angepasst
für ggf. Kompatibilität oder aber Mobile Geräte usw. Für mich wäre DLNA trotz dessen, das ich damit gut klar komme, KEINE Option aufgrund der minimal höheren Latenzen gegen SMB/CIFS.

Leider habe ich aktuell auch wenig Ideen. Was spricht in deinen Augen gegen eine Netzwerkfreigabe in Form von SMB o.ä.?
Ansonsten würde man auch noch z.B. FTP nehmen können. Finde ich aber auch semi wegen geringerer Geschwindigkeit im Vergleich.

INFO: Bei mir sagt nicht nur die Waschmaschine Hallo sondern auch die Schellen. Wenn die Schelle zu langsam wäre, wäre der Paket Bote lange weg bevor ich an der Tür wäre. Deswegen zählt mit dem SONOS Modul wirklich jede Sekunde. Mit sonos2mqtt habe ich mich bisher nicht in das Thema "Speak" eingearbeitet. Da bist du aktuell Feder führend.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 02 Juli 2020, 10:02:42
smb ist ein Winbäh-Protokoll, schon alleine das würde an sich einen Bann rechtfertigen... Schade, dass die sonos scheinbar sowas "brauchen" (sch... Monokultur!). Ob was anderes mit anderen Latenzen verbunden wäre, kann ich mangels HW nicht sagen.

Außerdem muß sich derjenige, der es installiert&configuriert, etwas detaillierter mit den diversen Rechtethemen beschäftigen. Meine Vermutung: Genau das wird nicht gemacht, stattdessen ist am Ende alles "777", und das ist auch sowas wie eine "number of the beast"...

minidlna hätte halt den Charme gehabt, dem User das Rechtethema weitestgehend abzunehmen, und eben nur ein bestimmtes Verzeichnis bzw. die Mediendateien da drin verfügbar zu machen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juli 2020, 10:03:02
ZitatLöschen der bzw. einzelner Readings könnte man über den input-setList Eintrag mit erledigen, das war in meiner Variante afaik sowieso Perl. Sonst über einen userReadings-Eintrag, der dann am Ende ggf. schlicht ein "undef" zurückgeben kann - dann wird das betr. Reading nicht angelegt (jedenfalls, soweit ich mich entsinne).
Wie geht das? Beispiel(e)?

Zitatder sollte ggf. eher indirekt über devspec2array und der CID abgeleitet werden?
Da habe ich aktuell nicht mal eine Vorstellung was du genau machen willst bzw würdest.

Ich dachte ich habe die Daten so gut wie möglich versucht zu erklären....Wenn ich da was nachliefern muss, bitte sagen was...

cc) Hat da noch einer einen heißen Tipp?

Joa aber einen Freigabe Ordner in dem einfach nur mp3 Daten liegen ... Naja das ist mir egal. Wenn jemand da jemals was löschen würde, wäre die Datei beim nächsten nutzen wieder da. Stimmt aber das die Rechtevergabe ein heißes Eisen ist. Sollte aber JEDER der FHEM bzw einen Raspi nutzt mal den ein oder anderen Artikel dazu lesen, denke ich zumindest.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 02 Juli 2020, 10:22:04
Zitat von: 87insane am 02 Juli 2020, 10:03:02
Wie geht das? Beispiel(e)?
Für das "beliebige Absenden irgendwelcher Befehle":
https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/lib/AttrTemplate/mqtt2.template#L46
userReadings: bitte selbst testen, das geht schneller wie meine Suche ;) .
ZitatDa habe ich aktuell nicht mal eine Vorstellung was du genau machen willst bzw würdest.
In https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/lib/AttrTemplate/mqtt2.template#L2787 und L2788 findest du z.B. eine Methode um den Namen eines bestimmten (ersten) Devices zu erfahren, das einer bestimmten devspec entspricht (darunter den passenden FILTER für ein CID-matching), $devices[0] wäre das, was du suchst.

ZitatIch dachte ich habe die Daten so gut wie möglich versucht zu erklären....Wenn ich da was nachliefern muss, bitte sagen was...
Erklärt im Prinzip schon, aber wenn ich was nachstellen soll, brauche ich einen halbwegs aktuellen, vollständigen Satz an Daten, also im mindesten Fall zwei RAW-list von einem "slave" und einem "master". Aber selbst damit muß ich mir dann hinterher eventuell noch zusammenreimen, auf welchem Pfad denn jetzt welche Daten ggf. reingekommen sind und wie genau denn eine regex ausschauen müßte, um bestimmte Infos aus dem JSON zu lesen und "spezielle" Readings usw. draus zu basteln.
Ehrlich: das geht schneller, wenn es jemand macht, der es im laufenden Betrieb auch austesten kann :P . Und Beispielcode für das Parsen von $TOPIC bzw. payload (=$EVENT) hatte ich verlinkt, insbesondere Tasmota-RF/IR kann man notfalls selber kurz zusammenstöpseln oder eben einen ESP32 als OpenMQTTGateway besorgen (@Otto: hatte ich nicht irgendwo anders mal geschrieben, dass das Ding für Fortgeschrittene MQTT2-User praktisch Pflichtprogramm ist...?  ;) Ernsthaft: Besorgt euch so ein Ding (besser: zwei), selbst wenn ihr es nicht wirklich produktiv nutzen wollt: Nachzuvollziehen, wie die eingehenden Daten da verarbeitet werden und was man daraus machen kann, ist mAn. wirklich lehrreich!)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 Juli 2020, 10:55:44
Die Latenz ist ein wesentliches Argument, ich verspreche ich designe / beschreibe es in Zukunft ordentlich (ohne 777 :) )
ZitatBei diesem habe ich normale Namen und nicht irgendwelche fortlaufenden Nummern.
Das stimmt für die dlna Anzeige in diversen Applikationen, das ist bei minidlna auch so. Aber schau mal ob Du da eine vernünftige URL raus bekommst. geh mal im Mediaplayer auf Eigenschaften.
DLNA scheint mir etwas "Usergetriebenes" zu sein. Präsentieren und teilen. Für Automatisierung (sage jemanden "nicht interaktiv": spiele diesen Titel) ist das offenbar nicht gedacht.

Ich  habe eine ESP32 in der Schublade liegen - mal schauen :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 02 Juli 2020, 11:24:30
Zitat von: Otto123 am 02 Juli 2020, 10:55:44
ich verspreche ich designe / beschreibe es in Zukunft ordentlich (ohne 777 :) )
:)

ZitatDLNA scheint mir etwas "Usergetriebenes" zu sein. Präsentieren und teilen. Für Automatisierung (sage jemanden "nicht interaktiv": spiele diesen Titel) ist das offenbar nicht gedacht.
Deswegen auch die Idee mit der Playlist: Darüber sollte es auch möglich sein, im Hintergrund Dateien auszutauschen bzw. zu aktualisieren. Aber auch da gilt: Habe die sonos Hardware nicht und bisher auch nichts in Richtung Sprachausgabe gemacht.

ZitatIch  habe eine ESP32 in der Schublade liegen - mal schauen :)
:) Bin mal gespannt, was du dazu sagst. Die Flasherei ist etwas spezieller als beim "kleinen Bruder", aber die Anleitung auf den Projekt-Wiki-Seiten ist sehr gut (man muß es nur auf command-line Befehle anpassen, wenn man es mit einem Linux-System machen will).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juli 2020, 13:13:16
Zitat von: Otto123 am 02 Juli 2020, 10:55:44
..vernünftige URL raus bekommst...

Angaben bei DLNA sind immer so in der Art:
http://192.168.20.2:50002/v/NDLNA/2285.mkv?WMContentFeatures=DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01700000000000000000000000000000&WMHME=1&WMDuration=54160000000&WMHMETitle=NAAwADAAIABEAGEAeQBzACAAWwAxADAAO

Im Content selber steht dann der "Titel". Denn jedes Gerät mit dem du DLNA eigentlich anschaust ruft den Content auf und nimmt aus der DB die nötigen Infos. z.B. Titel, Länge, stelle an der du diesen Titel zuletzt pausiert hast usw. DLNA ist nichts anderes als ein wählbarer Stream in Form von einer Mediothek. In meinen Augen ist das nur was für Geräte die einen Stream hören/gucken wollen. Es macht aber keinen Sinn das als Abfragequelle für wiederkehrende Aufgaben zu nutzen. Natürlich kann man sich nun immer die IDs rauß suchen und diese dann nutzen aber das + Latenz... nä!

ZitatFür Automatisierung (sage jemanden "nicht interaktiv": spiele diesen Titel) ist das offenbar nicht gedacht.
Genau!

Zitatsmb ist ein Winbäh-Protokoll, schon alleine das würde an sich einen Bann rechtfertigen
Das Windoof-Protokoll muss du ja nicht nehmen. Kannst doch ein beliebiges Protokoll mit Freigabe nutzen... SMB ist in dem Fall aber doch echt gut. In diesem einen Ordner muss es weder Sicherheit geben noch irgendwas. Man gibt ja quasi nur ein Temp Verzeichnis frei. Darin darf dann jeder lesen/schreiben im schlimmsten Fall. Aber dieser "Jeder" kann an der Stelle nichts kaputt machen. Die Dateien würden ja sonst eh neu erzeugt werden. Wenn man es noch eingrenzt und nur dem einen User die Rechte gibt, ist das auch noch ein wenig sicherer. Aber ehrlich.. Ist hier in meinen Augen komplett egal. Man könnte das auch auf einen USB Stick oder so auslagern und diesen nur als Temp nehmen. Dann wäre es nicht mal aktiv auf der System Partition.

EDIT: Was mir beim schreiben so kam... Warum wird die Freigabe überhaupt gebraucht? Eigentlich müsste es doch reichen den Datei Pfad direkt vom System zu nehmen....? Wir müssen die Datei ja nur an die Sonos bekommen und das geht sicher auch direkt. Oder FTP/SCP oder so. Müsste man mal im DEV Guide von Sonos schauen.. interessant...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 Juli 2020, 14:36:34
Irgendwie und jedes Protokoll geht eben nicht!
Schau doch was Sonos in der App an lesbaren Freigaben unterstützt - aus meiner Sicht nur SMB (1.0)

Man schickt ja nicht die Datei zu Sonos man sendet Sonos die Info wo er die Datei lesen kann.

Da geht aus meiner Sicht nur HTTP oder SMB.

Ob FTP geht habe ich nie probiert - ist aber für mich auch bäh. Würde ich also gar nicht versuchen.

Was auch geht ist ein "DLNA Befehl" - aber das ist anders als das notify was sonos2mqtt kann. Das beendet das aktuelle Play vom Player, wirft ihn aus der Gruppe, gibt den Titel wieder und dann ist Schluss. Also auch unbrauchbar, ganz davon abgesehen das ich nicht weiß wie.

Es gibt damit aus meiner Sicht zwei gangbare Lösungen:
TTS von Stephan (mit Bier ;) ) oder Text2Speech und SMB Share.

Und Windows Protokoll hin und her, das ist mittlerweile in der Linux Community lange angekommen. Das wird seit Jahren intensiv entwickelt und untersucht - ich weiß nicht ob sich so viele mit der Sicherheit und Zuverlässigkeit bei DLNA beschäftigen. Peinlich ist, das Sonos es nicht schafft eine aktuelle Version zu unterstützen  :'(
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 02 Juli 2020, 14:48:38
Stimme im Großen zu...!

Aber HTTP ist doch schon super. Nur lesbar und sonst nix. Naja ich finde gut das er das anbietet aber wenn man es selber bauen kann, dann will ich vorher scheitern  :o 8) ;D
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 02 Juli 2020, 17:00:07
Zitat von: Otto123 am 02 Juli 2020, 14:36:34
Es gibt damit aus meiner Sicht zwei gangbare Lösungen:
TTS von Stephan (mit Bier ;) ) oder Text2Speech und SMB Share.

Aber die Variante von Stephan gibt es doch für einen selbst: https://github.com/svrooij/node-sonos-tts-polly#run-your-own-server (sogar als Docker-Container)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 Juli 2020, 17:18:12
Ja ich weiß - mein Lapsus: es gibt 1.a und 1.b :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 03 Juli 2020, 20:11:59
Habs hinbekommen mit dem Aktuell halten des Stati bei (aktuell) allen RINCON_ Geräten. (Baue noch einen besseren filter. Bitte gern auch [umsetzbare] ideen)
Ohne großen Hick Hack mit Arrays (die ich im übrigen hasse wie sonst was. Brauche echt mal jemand der mir das gut und in meiner Sprache erklärt).

Nun triggert der Master in einer Gruppe den State von allen rincon_ geeäten. So brauch man kein F5 oder so mehr drücken!
Was noch kommt:
- Icons müssen angepasst werden damit der Slave nicht auch z.B. VolUp anzeigt obwohl es nur am Master passiert
- Wenn ich das mit dem Slider hin bekomme, wird es einen sauberen Gruppen Vol Slider geben
- Es wird noch ein leave Group Button hinzu kommen. Brauchte ich immer wieder und ist praktisch
- ich überlege ein automatisches Auswahlmenü zu erstellen für joingroup. Das sollte machbar und relativ einfach sein.

Anbei das devStateIcon:
{
my $groupname = ReadingsVal($name,"groupName","0");
my $sgroupname = (split(" ",ReadingsVal($name,"groupName","")))[0];
my $uuidtoname = "MQTT2_".ReadingsVal($name,"coordinatorUuid","0");
my $vol = ReadingsVal($name,"volume","");
my $img = ReadingsVal($name,"currentTrack_AlbumArtUri","");
my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...'; };
my $mystate = $name eq $uuidtoname ? ReadingsVal($name,"state","FEHLER") : ReadingsVal($uuidtoname,"state","");
my $amp = ReadingsVal($name,"bridgeConnected","0") eq "0"
? "rot"
: ReadingsVal($name,"bridgeConnected","0") eq "1"
? "gelb"
: "gruen";
my $playpic = $mystate eq "PLAYING"
? 'rc_PAUSE@red'
: $mystate eq "PAUSED_PLAYBACK"
? 'rc_PLAY@green'
: $mystate eq "STOPPED"
? 'rc_PLAY@green'
: $mystate eq "TRANSITIONING"
? 'rc_PLAY@blue'
: $mystate eq "set_next"
? 'rc_NEXT@blue'
: $mystate eq "set_previous"
? 'rc_PREVIOUS@blue'
: $mystate eq "set_volumeUp"
? 'rc_VOLUP@blue'
: $mystate eq "set_volumeDown"
? 'rc_VOLDOWN@blue'
: $mystate eq "set_mute"
? 'rc_MUTE@blue'
: $mystate;
my $mutecmd = ReadingsVal($name,"mute","0") eq "false"
? "true"
: "false";
my $mutepic = ReadingsVal($name,"mute","0") eq "false"
? 'rc_MUTE'
: 'rc_VOLUP';
my $show = "FEHLER";
my $currentTrack = $mystate eq "TRANSITIONING"
? "Puffern..."
: $trim30->(ReadingsVal($name,"currentTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"currentTrack_Title","FEHLER"));
my $nextTrack = $trim30->(ReadingsVal($name,"nextTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"nextTrack_Title","FEHLER"));
my $previouspic = 'rc_PREVIOUS';
my $nextpic = 'rc_NEXT';
my $voldownpic = 'rc_VOLDOWN';
my $voluppic = 'rc_VOLUP';

if (ReadingsVal($name,"bridgeConnected","0") ne "2") {
$show = " ".FW_makeImage("rc_BLANK")." ";}

elsif (($mystate eq "PLAYING")
|| ($mystate eq "TRANSITIONING" )
|| ($mystate eq "set_next" )
|| ($mystate eq "set_previous" )
|| ($mystate eq "set_volumeUp" )
|| ($mystate eq "set_volumeDown" )
|| ($mystate eq "set_mute" )) {

my $shownp = ReadingsVal($name,"name","0") eq $sgroupname ? "<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>" : "";

$show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>
$shownp
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>";

if (ReadingsVal($name,"name","0") eq $sgroupname) {
$show = ReadingsVal($name,"enqueuedMetadata_UpnpClass","FEHLER") ne "object.item.audioItem.audioBroadcast"
? "$show Aktueller Track: $currentTrack<br>Nächster Track: $nextTrack"
: "$show Radio: $currentTrack";}

elsif (ReadingsVal($name,"name","0") ne $groupname) {
$show = "$show
Master: $sgroupname";}

} else {
if ($name eq $uuidtoname) {
if (ReadingsVal($name,"name","0") ne $groupname) {
fhem("trigger .*:FILTER=uuid=RINCON_.* state");
}
$show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>";
} else {
$show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a><br>Master: $sgroupname";
}
}

"<div>
<table>
  <tr>
    <td><div style='display: inline-block; margin-right: 5px; border: 1px solid lightgray; height: 4.00em; width: 4.00em; background-image: url($img);background-size: contain;'></div>
</td>
    <td>".FW_makeImage("10px-kreis-".$amp)."
$show</td>
   </tr>
</table>
</div>"
}


Da ich im Ausland bin und sehr schlechten Empfang ist das nur grob getestet.


EDIT: Code nochmal angepasst. Es war ein Fehler drin, der dafür sorgte das im Kreis getriggert wurde. Ist nun behoben...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 08 Juli 2020, 10:36:08
@Beta-User
Eigentlich eine allgemeinere Frage, aber da der use-case erstmal hier ist: Ist es legitim auf die Art ein Template zu machen welches eine setList erweitert? Oder erschlägst Du mich für die Idee? Oder ist das besser gelöst und ich habe es nicht gefunden?

Der Code ist jetzt reduziert auf das Minimum - aber ich würde dort gern weiter machen: Gerade jetzt im Aufbau/Entwicklung wäre es mir lieb die Templates etwas modular zu machen. Am Ende dann eines was alle Fälle abdeckt (eventuell den Player erkennt usw). Du musst das so nie einchecken :)
Funktionieren tut es :)
#
name:sonos2mqtt_speakCommand1
{\
  my $nn='DEVICE';\
  my @arr=split("\n",AttrVal($nn,'setList',''));\
  push @arr , q(  speak:textField { my $tts="SonosTTS";my $payload = $EVENT;$payload =~ s/$EVTPART0 $EVTPART1 //g; fhem("setreading $tts Player $NAME;setreading $tts volume $EVTPART1;set $tts tts $payload");"{}"});\
  my $newVal=join "\n",@arr;\
  $newVal=~s/;/;;/g;\
  fhem("attr $nn setList $newVal")\
}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 08 Juli 2020, 10:59:21
Na ja, in die Richtung funktionieren schon einige der attrTemplate, nur eben meistens weniger bezogen auf die Erweiterung eines Attributs...

Ein paar Anmerkungen:
- Da ist ein bestimmter Name "SonosTTS" hartvercoded, der nicht in allen Installationen so vorhanden sein muß. Wenn es z.B. via devspec machbar ist, ein bestimmtes Device zu ermitteln, ist es mMn. besser, daraus eine par:-Zeile abzuleiten (=> die Sprachsteuerungstemplates machen das z.B. so);
- Der Perl-Code macht da ein paar Transformationen, die mir "suspekt" sind, v.a. das mit dem Verdoppeln der ";" - das wirkt sich ja auch auf alle vorhandenen Einträge aus. Zu viele (paarige) SeMiCoLoN sind zwar in der Regel unschädlich, aber nötig ist das nur, weil der neue Eintrag nicht gleich "richtig" geschrieben wurde, oder?
- Ob man erst splittet und dann wieder join macht oder (ungetestet) ein schlichtes concat, beginnend mit "\n  ", ist eine Philosophiefrage. Ich würde es eher einfach halten, wenn's geht...

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 08 Juli 2020, 11:41:49
Parallel zu dem Thread kämpfe ich mit der Extraktion der JSONs für die ReadingList: https://forum.fhem.de/index.php/topic,112737.msg1070639.html#msg1070639

@Otto123: Eine Veränderung der setList bringt doch ein "Save" mit sich oder kann man das "ausblenden"?
Für mich ist eine klickbare Option, die mir eine Struktur-Änderung in FHEM mit bringt, nicht so dolle. Ich bin noch einer von den verrückten, da darf auf dem iPhone/Androiden (um die Diskussion dazu zu unterdrücken einfach beides) auf keinen Fall eine 1 oder so auf dem Bildschirm sein... Das wäre so zu sagen eine unerledigte Aufgabe :-P

Aber um das zu betonen. Sehr schön das du dich so in die Sprachsteuerung hängst! Danke! Finde es gut das hier wirklich Modular abgearbeitet werden. Auch wenn es keine Reihenfolge gibt, macht hier jeder eine schöne Ecke und das ist super!

Versuche aktuell devStateIcon kleiner zu bekommen und auch sinniger. Dazu aber die readingList auch endlich mal sauber zu machen.... Lerne gerade aber dadurch auch wieder einige neue Dinge kennen und bin damit natürlich erstmal am kämpfen....
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 08 Juli 2020, 21:05:57
Ich weiß SonosTTS hart vercoded. Ich würde da die komplette Einrichtung reinpacken. Und ehrlich an der Stelle erstelle ich eine extra Instanz dafür, ob die jeder per C&P erzeugt oder ich gleich Fakten mit Namen mache? Aber mal sehen.

Das mit den Arrays: Ja erscheint kompliziert, kommt daher, dass ich ursprünglich komplizierter gedacht habe. Aber ein concat wird auch nicht kürzer ;)

Das mit den Semikolons:
BTW: Da ist mir attrTemplate an sich noch suspekt. Es hat den Syntax wie Raw Def (Zeilenenden) aber die Semikolon müssen im Code direkt nicht verdoppelt werden.
Anders beim perl Code im fhem("attr...") Befehl, der wandert in den Interpreter/Parser und da müssen sie verdoppelt werden. Ich lese ja die setList aus, ergänze und schreibe zurück. Das bedeutet im vorhandenem (ausgelesenem) und neuen Code müssen die semikolon verdoppelt werden.

@insane set attrTemplate ... an sich bringt ein rotes Fragezeichen mit sich, also ist alles konsequent ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 09 Juli 2020, 08:45:14
achso...du meinst einmalig und nicht immer wieder... :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 17 Juli 2020, 16:04:51
Hallo Mitstreiter,

Nach dem es etwas ruhig geworden ist, würde ich gern mal einen Stand erzeugen, der irgendwie an den Mann gebracht werden kann.
Das jetzige Template für die speaker und line_in_speaker gefällt mir nicht. Es erzeugt vor allem bezüglich des devStateIcon einen "komischen Stand"
Da wir mit dem devStateicon noch beim entwickeln sind würde ich dies einfach erstmal weglassen.
Mein Idee wären ein paar inkrementelle Templates die man irgendwann nochmal revidieren kann.

Vorschlag:

name:sonos2mqtt_speaker
desc:A basic sonos2mqtt speaker device
filter:TYPE=MQTT2_DEVICE
order:M_05b
par:BASE_TOPIC;base topic set in configuration.yaml of the sonos2mqtt bridge;{ AttrVal("DEVICE","devicetopic",AttrVal("DEVICE","readingList","")) =~ m,[\b]?([^\/:]+)[\/].+, ? $1 : undef }
par:DEV_ID;techname of the device ;{ AttrVal("DEVICE","readingList","") =~ m,[^\/]+[\/](RINCON_[0-9A-Z]+):.*, ? $1 : undef }
par:ALIAS;friendly name as set in sonos gadget itself;{ ReadingsVal("DEVICE","name","unknown") }
par:DEVNAME;friendly name, used for topic in lowercase;{ lc(ReadingsVal("DEVICE","name","unknown")) }
par:ICON;ICON as set, defaults to audio_volume_low;{ AttrVal("DEVICE","icon","audio_volume_low") }
attr DEVICE icon ICON
attr DEVICE jsonMap volume_Master:volume mute_Master:mute transportState:state
attr DEVICE readingList\
  BASE_TOPIC/DEV_ID:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr DEVICE setList\
  stop:noArg BASE_TOPIC/DEV_ID/control { "command": "stop" }\
  play:noArg BASE_TOPIC/DEV_ID/control { "command": "play" }\
  pause:noArg BASE_TOPIC/DEV_ID/control { "command": "pause" }\
  toggle:noArg BASE_TOPIC/DEV_ID/control { "command": "toggle" }\
  volumeup:noArg BASE_TOPIC/DEV_ID/control { "command": "volumeup" }\
  volumedown:noArg BASE_TOPIC/DEV_ID/control { "command": "volumedown" }\
  volume:slider,0,1,100 BASE_TOPIC/DEV_ID/control { "command": "volume", "input": $EVTPART1 }\
  mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute"; qq(BASE_TOPIC/DEV_ID/control { "command": "$value" } ) }\
  next:noArg BASE_TOPIC/DEV_ID/control { "command": "next" }\
  previous:noArg BASE_TOPIC/DEV_ID/control { "command": "previous" }\
  joinGroup:textField BASE_TOPIC/DEV_ID/control { "command": "joingroup",  "input": "$EVTPART1"}\
  leaveGroup:noArg { my $value = ReadingsVal("DEV_ID","groupName","all"); qq(BASE_TOPIC/DEV_ID/control { "command": "leavegroup",  "input": "$value" } ) }\
  setAVTUri:textField BASE_TOPIC/DEV_ID/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
  playUri:textField {fhem("set $NAME setAVTUri $EVTPART1; sleep 1; set $NAME play")}\
  switchtoqueue:noArg BASE_TOPIC/DEV_ID/control { "command": "switchtoqueue" }\
  notify:textField BASE_TOPIC/DEV_ID/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}\
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(BASE_TOPIC/DEV_ID/control $payload)}
attr DEVICE model sonos2mqtt_speaker
attr DEVICE alias ALIAS


Die alte Idee, dass die drei switchto_xx irgendwie "zusammen" gehören, ist mMn falsch.
Mein Ziel, Player abfragen und MQTT2_ Device weiter konfigurieren.

Den Typ und die Ausstattung kann man abfragen, da bin ich gerade dabei. Dieses Kommando über x_raw_payload liefert u.a. IPAdresse zurück.
{
  "command": "adv-command",
  "input": {
    "cmd": "GetZoneInfo",
    "reply": "ZoneInfo"
  }
}

Über http://IPAdresse:1400/xml/device_description.xml bekommt man ein Konfigurations Dokument. Dort kann man weitere Dinge abfragen. Vielleicht geht das aber auch direkt über sonos2mqtt adv Kommandos.

Das devStateIcon könnte man jetzt auch mal mit einem vertretbaren Stand als Zusatz Template veröffentlichen. Vielleicht auch eine 99_mySonos.pm ausliefern?
Das Speak Kommando würde ich derzeit auch über einen Zusatz Template oder Anleitung machen. Da gibt es ja sowieso unterschiedliche Ansätze.

Die Basis: Bridge und Device - ist eigentlich auf einem guten Stand. Das würd ich gern "rausbringen". Beide habe ich jetzt relativ umfassend getestet.
Das Grundsetup ist auch klar, das kann man in wenigen Sätzen beschreiben (Gerüst).

Den Rest kann man noch ein wenig entwickeln und verschönern.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 17 Juli 2020, 16:40:34
Vorab:
Das sieht durchdacht aus, ich schiebe ins svn, was ihr mir zuruft (=> demnächst kommt dann also dieser Vorschlag als nächste Iteration).

Die Erweiterungen ggf. über addon-Templates zu machen, finde ich zielführend, gibt sicher mehrere Varianten, wie man das umsetzen könnte.

myUtils zu verwenden, dürfte angesichts der Komplexität diverser Codes (zu devStateIcon etc.) angebracht sein. Mir stellt sich dann nur die Frage, ob das dann gleich in ein eigenes package wandern sollte. Meine Tendenz: ja.

Was "switchto..." angeht: Es wird der input gewechselt, oder? Das spräche für mich dafür, das auch so zu benennen, dann aber eben nur die Auswahl anzubieten, die jeweils vorhanden ist, also "input:queue,lineIn" bzw. "input:queue,spdif" (wording ungeprüft). Aber auch da gilt: Ihr entscheidet.

[partly OT1]
Mir fehlt immer noch die Info, was ein sich abmeldender Speaker an JSON wohin sendet, also wenn er unter einen Master geht (https://forum.fhem.de/index.php/topic,112737.msg1071556.html#msg1071556).

[OT2]
Was Doku (Wiki) angeht, wird es insgesamt lustig und Zeit für...
- Das hier sprengt dann vermutlich auch den Rahmen der "Praxisbeispiele", es wäre dann aber demnächst an der Zeit, dazu eine "Baustelle" aufzumachen und (ähnlich ebus) aus den Praxisbeispielen raus zu verlinken? (Freiwillige?!?)
- OpenMQTTGateway erfreut sich auch einer zunehmenden Beliebtheit, mit dem stub in "MQTT" bin ich aber auch nicht glücklich. Eigentlich sollte man damit ähnlich verfahren (werde ich wohl bei Gelegenheit übernehmen, falls sich niemand vordrängt; da habe ich wenigstens Hardware...)
- tasmota2zigbee ist auch so eine neue Lösung, die wir irgendwie koordiniert unterbringen sollte, bevor es jemand "igendwohin" tut (ohne deutlich darauf hinzuweisen, dass das eine Lösung für max. 13 (?) Geräte ist). Habe aber weder Veranlassung noch große Lust, dazu Hardware zu verstöpseln und das auszutesten (template-mäßig dürfte das (hoffentlich) eine eher kleine Übung werden).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 17 Juli 2020, 17:28:36
Zitat von: Beta-User am 17 Juli 2020, 16:40:34
Was "switchto..." angeht: Es wird der input gewechselt, oder? Das spräche für mich dafür, das auch so zu benennen, dann aber eben nur die Auswahl anzubieten, die jeweils vorhanden ist, also "input:queue,lineIn" bzw. "input:queue,spdif" (wording ungeprüft). Aber auch da gilt: Ihr entscheidet.
Ja das ist ein Argument :) ich habe vielleicht zu simpel gedacht.
Ich liefere einen Vorschlag :)
die Zeile mit switchtoqueue raus und die rein ?
  input:Queue { my $value = $EVTPART1 eq "TV" ? "tv" : $EVTPART1 eq "Line_In" ? "line" : "queue"; qq(BASE_TOPIC/DEV_ID/control { "command": "switchto$value" } ) }\

Wäre quasi die Vorbereitung zur Erweiterung auf Queue,TV usw.

BTW: Line_In ist komplizierter - da kann man jeden Line_In jedem Player zuweisen. Bei TV geht das nicht!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 18 Juli 2020, 14:42:22
Hab's jetzt mal so eingecheckt (mit der neuen Queue-Fassung).

Das mit line_in habe ich noch nicht verstanden. Bedeutet das, dass jeder Player seinen analogen Input an einen anderen Player weiterleiten kann?
Ansonsten wäre die Frage, ob man das "2. Ding" als "external_Source" (Arbeitstitel) kennzeichnet und dann anhand eines Readings entscheidet, ob man das dann in dem Perl-Code als line_in oder spdif interpretiert? (Setzt halt voraus, dass wir erkennen können, mit welchem Model wir es zu tun haben. Ggf. könnte man dazu aber auch ein userAttribut generieren (mit Perl?) und das dann auswerten?)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 18 Juli 2020, 16:18:26
Du pochst darauf sich an die DevelopmentGuidelinesAV zu halten und änderst jetzt volumeUp/Down wieder auf Kleinschreibung, bewusst ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 18 Juli 2020, 16:23:47
Nein, nicht bewußt. Bin davon ausgegangen, dass das klar wäre...

@Otto: Kannst du das bitte bei der nächsten Iteration auch  beachten?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Juli 2020, 00:32:41
Zitat von: Beta-User am 18 Juli 2020, 14:42:22
Das mit line_in habe ich noch nicht verstanden. Bedeutet das, dass jeder Player seinen analogen Input an einen anderen Player weiterleiten kann?
Genauso ist es! Und witzigerweise geht das wohl mit dem digital Eingang nur über Gruppenbildung.

Das mit dem volumeUp/Down habe ich übersehen. Ich achte in Zukunft darauf.

Die Modellerkennung habe ich fast im Griff. Eine Codevariante ist fertig, aber die muss ich noch gesellschaftsfähig machen. ;)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 19 Juli 2020, 17:34:32
Nur kurz da Handy:

@beta-user: liefere ich dir wie gewünscht. Hab aktuell nur keine Zeit am pc zu sitzen.

Habe das alles hier gerade auch nur überflogen aber wollte sagen das ich noch da bin und auch direkt, bei Zeit, weiter mache.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: andre07 am 23 Juli 2020, 17:39:01
Da ich das hier mitlese wollte ich die Player mal neu anlegen um eventuelle Änderungen einzupflegen
nur leider sind jetzt alle Bedienfelder verschwunden also erst mal zurück auf alt

Alt:
define MQTT2_RINCON_5CAAFD243CDE01400 MQTT2_DEVICE RINCON_5CAAFD243CDE01400
attr MQTT2_RINCON_5CAAFD243CDE01400 DbLogExclude .*
attr MQTT2_RINCON_5CAAFD243CDE01400 IODev mqtt2server
attr MQTT2_RINCON_5CAAFD243CDE01400 alias Wohnzimmer
attr MQTT2_RINCON_5CAAFD243CDE01400 devStateIcon 0:10px-kreis-rot 1:10px-kreis-gelb 2:10px-kreis-gruen (0|1).(STOPPED|PAUSED_PLAYBACK):rc_BLANK 2.(STOPPED|PAUSED_PLAYBACK):rc_PLAY@green:play 2.(pause|stop):rc_STOP@red:play 2.PLAYING:rc_STOP@red:stop 2.(TRANSITIONING|play):rc_PLAY@yellow:stop 2.mute:audio_volume_mute@yellow:stop 2.volume:audio_volume_mid@yellow:stop 2.volumeDown:audio_volume_low@yellow:stop 2.volumeUp:audio_volume_high@yellow:stop 2.next:rc_NEXT@yellow:stop 2.previous:rc_PREVIOUS@yellow:stop (STOPPED|PAUSED_PLAYBACK).(false|previous|next|volumeDown|volumeUp|[0-9]+|CURRENT.*|NEXT.*|PAUSED_PLAYBACK):rc_BLANK \b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.previous:rc_PREVIOUS:previous \b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.next:rc_NEXT:next \b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.volumeDown:rc_VOLDOWN:volumeDown \b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.volumeUp:rc_VOLUP:volumeUp \b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.false:rc_VOLUP:mute+true \b(?!(STOPPED|PAUSED_PLAYBACK)\b)\w+.true:rc_MUTE:mute+false
attr MQTT2_RINCON_5CAAFD243CDE01400 icon audio_volume_low
attr MQTT2_RINCON_5CAAFD243CDE01400 jsonMap volume_Master:volume mute_Master:mute transportState:state
attr MQTT2_RINCON_5CAAFD243CDE01400 model sonos2mqtt_speaker
attr MQTT2_RINCON_5CAAFD243CDE01400 readingList sonos/status/wohnzimmer/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }\
  sonos/status/wohnzimmer/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }\
  sonos/RINCON_5CAAFD243CDE01400:.* { json2nameValue($EVENT,'',$JSONMAP) }\
  sonos/connected:.* bridgeConnected\
  sonos/RINCON_5CAAFD243CDE01400/error:.* { json2nameValue($EVENT) }
attr MQTT2_RINCON_5CAAFD243CDE01400 room MQTT2_DEVICE
attr MQTT2_RINCON_5CAAFD243CDE01400 setList stop:noArg sonos/RINCON_5CAAFD243CDE01400/control { "command": "stop" }\
  play:noArg sonos/RINCON_5CAAFD243CDE01400/control { "command": "play" }\
  pause:noArg sonos/RINCON_5CAAFD243CDE01400/control { "command": "pause" }\
  toggle:noArg sonos/RINCON_5CAAFD243CDE01400/control { "command": "toggle" }\
  volumeUp:noArg sonos/RINCON_5CAAFD243CDE01400/control { "command": "volumeup" }\
  volumeDown:noArg sonos/RINCON_5CAAFD243CDE01400/control { "command": "volumedown" }\
  volume:slider,0,1,100 sonos/RINCON_5CAAFD243CDE01400/control { "command": "volume", "input": $EVTPART1 }\
  mute:iconSwitch,false,rc_MUTE,true,rc_VOLUP { my $value = $EVTPART1 eq "true" ? "mute" : "unmute";;;; qq(sonos/RINCON_5CAAFD243CDE01400/control { "command": "$value" } ) }\
  next:noArg sonos/RINCON_5CAAFD243CDE01400/control { "command": "next" }\
  previous:noArg sonos/RINCON_5CAAFD243CDE01400/control { "command": "previous" }\
  joinGroup:textField sonos/RINCON_5CAAFD243CDE01400/control { "command": "joingroup",  "input": "$EVTPART1"}\
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_5CAAFD243CDE01400","groupName","all");; qq(sonos/RINCON_5CAAFD243CDE01400/control { "command": "leavegroup",  "input": "$value" } ) }\
  setAVTUri:textField sonos/RINCON_5CAAFD243CDE01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
  notify:textField sonos/RINCON_5CAAFD243CDE01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}\
  x_raw_payload:textField { my $payload = $EVENT;;$payload =~ s/$EVTPART0 //g;; qq(sonos/RINCON_5CAAFD243CDE01400/control $payload)}\
  playUri:textField {fhem("sleep 1;; set $NAME play");; qq(sonos/RINCON_5CAAFD243CDE01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"})}\
  speak:textField { my $tts="SonosTTS";;my $payload = $EVENT;;$payload =~ s/$EVTPART0 $EVTPART1 //g;; fhem("setreading $tts Player $NAME;;setreading $tts volume $EVTPART1;;set $tts tts $payload");;"{}"}
attr MQTT2_RINCON_5CAAFD243CDE01400 stateFormat [$name:bridgeConnected]\
[$name:bridgeConnected].[$name:state]\
[$name:state].previous\
[$name:state].next\
[$name:state].volumeDown\
[$name:state].volumeUp\
&nbsp;;&nbsp;;&nbsp;;\
[$name:state].[$name:mute]\
<br>[$name:state] CURRENT: [$name:AV_CurrentTrackMetaData_Artist] - [$name:AV_CurrentTrackMetaData_Title] - ([$name:currentTrack_Duration])\
<br>[$name:state] NEXT: &nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;[$name:AV_NextTrackMetaData_Artist] - [$name:AV_NextTrackMetaData_Title] - ([$name:nextTrack_Duration])
----------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------
Neu
defmod MQTT2_RINCON_5CAAFD243CDE01400 MQTT2_DEVICE RINCON_5CAAFD243CDE01400
attr MQTT2_RINCON_5CAAFD243CDE01400 DbLogExclude .*
attr MQTT2_RINCON_5CAAFD243CDE01400 IODev mqtt2server
attr MQTT2_RINCON_5CAAFD243CDE01400 alias Wohnzimmer
attr MQTT2_RINCON_5CAAFD243CDE01400 icon audio_volume_low
attr MQTT2_RINCON_5CAAFD243CDE01400 jsonMap volume_Master:volume mute_Master:mute transportState:state
attr MQTT2_RINCON_5CAAFD243CDE01400 model sonos2mqtt_speaker
attr MQTT2_RINCON_5CAAFD243CDE01400 readingList sonos/RINCON_5CAAFD243CDE01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr MQTT2_RINCON_5CAAFD243CDE01400 room MQTT2_DEVICE
attr MQTT2_RINCON_5CAAFD243CDE01400 setList stop:noArg sonos/RINCON_5CAAFD243CDE01400/control { "command": "stop" }\
  play:noArg sonos/RINCON_5CAAFD243CDE01400/control { "command": "play" }\
  pause:noArg sonos/RINCON_5CAAFD243CDE01400/control { "command": "pause" }\
  toggle:noArg sonos/RINCON_5CAAFD243CDE01400/control { "command": "toggle" }\
  volumeUp:noArg sonos/RINCON_5CAAFD243CDE01400/control { "command": "volumeup" }\
  volumeDown:noArg sonos/RINCON_5CAAFD243CDE01400/control { "command": "volumedown" }\
  volume:slider,0,1,100 sonos/RINCON_5CAAFD243CDE01400/control { "command": "volume", "input": $EVTPART1 }\
  mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";; qq(sonos/RINCON_5CAAFD243CDE01400/control { "command": "$value" } ) }\
  next:noArg sonos/RINCON_5CAAFD243CDE01400/control { "command": "next" }\
  previous:noArg sonos/RINCON_5CAAFD243CDE01400/control { "command": "previous" }\
  joinGroup:textField sonos/RINCON_5CAAFD243CDE01400/control { "command": "joingroup",  "input": "$EVTPART1"}\
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_5CAAFD243CDE01400","groupName","all");; qq(sonos/RINCON_5CAAFD243CDE01400/control { "command": "leavegroup",  "input": "$value" } ) }\
  setAVTUri:textField sonos/RINCON_5CAAFD243CDE01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
  playUri:textField {fhem("set $NAME setAVTUri $EVTPART1;; sleep 1;; set $NAME play")}\
  input:Queue { my $value = $EVTPART1 eq "TV" ? "tv" : $EVTPART1 eq "Line_In" ? "line" : "queue";; qq(sonos/RINCON_5CAAFD243CDE01400/control { "command": "switchto$value" } ) }\
  notify:textField sonos/RINCON_5CAAFD243CDE01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}\
  x_raw_payload:textField { my $payload = $EVENT;;$payload =~ s/$EVTPART0 //g;; qq(sonos/RINCON_5CAAFD243CDE01400/control $payload)}\
  speak:textField { my $tts="SonosTTS";;my $payload = $EVENT;;$payload =~ s/$EVTPART0 $EVTPART1 //g;; fhem("setreading $tts Player $NAME;;setreading $tts volume $EVTPART1;;set $tts tts $payload");;"{}"}

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 23 Juli 2020, 20:50:39
mit Bedienfelder meinst Du jetzt genau was? Das devStateIcon? Das ist im Basistemplate nicht drin. Leider habe ich noch keines was konsistent ist ;)

Das dropdown Menü sollte  komplett sein.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 24 Juli 2020, 15:24:38
Hey zusammen,

leider ist die Zeit bisher nicht besser geworden aber anbei mal die Payloads aus dem Zweig "sonos/RINCON_123HEX:.*"...
Diese sollte ich schon ewig mal hier hochladen... :-\ Hoffe das ist soweit noch okay..

payload wenn Single und play
{"uuid":"RINCON_7828CAF427B201400","name":"Wohnzimmer","groupName":"Wohnzimmer","coordinatorUuid":"RINCON_7828CAF427B201400","currentTrack":{"Artist":"1LIVE mit Larissa Rieß und Philipp Isterewicz","AlbumArtUri":"https://img.ardmediathek.de/standard/00/42/92/13/72/-295433861/1x1/576?mandant=ard","Title":"stream.mp3?ar-distributor=f0e2&amp;_art=dj0yJmlwPTkzLjIzNy4xNzMuMTQ1JmlkPWljc2N4bC1lazY3N3ZkbmImdD0xNTk1NjgxNzk3JnM9Nzg2NmYyOWMjYmFiMDQ4M2U2MjRiNDcwNWQ2ZGQ5ZWI1NGU5YjYzZGY","UpnpClass":"object.item","ItemId":"-1","ParentId":"-1","TrackUri":"x-rincon-mp3radio://https://wdr-edge-2020-fra-lg-cdn.cast.addradio.de/wdr/1live/live/mp3/128/stream.mp3?ar-distributor=f0e2&_art=dj0yJmlwPTkzLjIzNy4xNzMuMTQ1JmlkPWljc2N4bC1lazY3N3ZkbmImdD0xNTk1NjgxNzk3JnM9Nzg2NmYyOWMjYmFiMDQ4M2U2MjRiNDcwNWQ2ZGQ5ZWI1NGU5YjYzZGY","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},"enqueuedMetadata":{"AlbumArtUri":"https://img.ardmediathek.de/standard/00/42/92/13/72/-295433861/1x1/576?mandant=ard","Title":"1LIVE","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"-1","ParentId":"-1"},"transportState":"PLAYING","playmode":"NORMAL","ts":1595595401660,"volume":{"Master":11,"LF":100,"RF":100},"mute":{"Master":false,"LF":false,"RF":false}}

Payload wenn joinGroup Wohnzimmer
Master: {"uuid":"RINCON_7828CAF427B201400","name":"Wohnzimmer","groupName":"Wohnzimmer + 1","coordinatorUuid":"RINCON_7828CAF427B201400","volume":{"Master":11,"LF":100,"RF":100},"mute":{"Master":false,"LF":false,"RF":false},"ts":1595596556496,"currentTrack":{"AlbumArtUri":"http://192.168.20.70:1400/getaa?u=x-rincon-mp3radio:%2f%2fhttps:%2f%2fwdr-1live-live.icecastssl.wdr.de%2fwdr%2f1live%2flive%2fmp3%2f128%2fstream.mp3%3far-distributor%3df0e2&v=1","Title":"1LIVE","UpnpClass":"object.item","ItemId":"-1","ParentId":"-1","TrackUri":"x-rincon-mp3radio://https://wdr-1live-live.icecastssl.wdr.de/wdr/1live/live/mp3/128/stream.mp3?ar-distributor=f0e2","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},"enqueuedMetadata":{"AlbumArtUri":"https://img.ardmediathek.de/standard/00/42/92/13/72/-295433861/1x1/576?mandant=ard","Title":"1LIVE","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"-1","ParentId":"-1"},"transportState":"STOPPED","playmode":"NORMAL"}
Slave: {"uuid":"RINCON_7828CAF4289001400","name":"Küche","groupName":"Wohnzimmer + 1","coordinatorUuid":"RINCON_7828CAF427B201400","transportState":"PLAYING","playmode":"NORMAL","ts":1595596556496,"volume":{"Master":14,"LF":100,"RF":100},"mute":{"Master":false,"LF":false,"RF":false}}

Payload wenn Gruppe (Wohnzimmer + 1) und dann wird play gedrückt
Master: {"uuid":"RINCON_7828CAF427B201400","name":"Wohnzimmer","groupName":"Wohnzimmer + 1","coordinatorUuid":"RINCON_7828CAF427B201400","volume":{"Master":11,"LF":100,"RF":100},"mute":{"Master":false,"LF":false,"RF":false},"ts":1595596701688,"currentTrack":{"Artist":"1LIVE mit Larissa Rieß und Philipp Isterewicz","AlbumArtUri":"https://img.ardmediathek.de/standard/00/42/92/13/72/-295433861/1x1/576?mandant=ard","Title":"stream.mp3?ar-distributor=f0e2&amp;_art=dj0yJmlwPTkzLjIzNy4xNzMuMTQ1JmlkPWljc2N4bC1lazY3N3ZkbmImdD0xNTk1NjgzMDE0JnM9Nzg2NmYyOWMjZTVjM2I2ZWY4ZTExOTBmNDM3OTRlNjI1NGE1YzM1OTE","UpnpClass":"object.item","ItemId":"-1","ParentId":"-1","TrackUri":"x-rincon-mp3radio://https://wdr-edge-2020-fra-lg-cdn.cast.addradio.de/wdr/1live/live/mp3/128/stream.mp3?ar-distributor=f0e2&_art=dj0yJmlwPTkzLjIzNy4xNzMuMTQ1JmlkPWljc2N4bC1lazY3N3ZkbmImdD0xNTk1NjgzMDE0JnM9Nzg2NmYyOWMjZTVjM2I2ZWY4ZTExOTBmNDM3OTRlNjI1NGE1YzM1OTE","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},"enqueuedMetadata":{"AlbumArtUri":"https://img.ardmediathek.de/standard/00/42/92/13/72/-295433861/1x1/576?mandant=ard","Title":"1LIVE","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"-1","ParentId":"-1"},"transportState":"PLAYING","playmode":"NORMAL"}
Slave: bekommt nichts mehr.

Payload wenn leaveGroup ausgeführt wird
Master: {"uuid":"RINCON_7828CAF427B201400","name":"Wohnzimmer","groupName":"Wohnzimmer","coordinatorUuid":"RINCON_7828CAF427B201400","volume":{"Master":11,"LF":100,"RF":100},"mute":{"Master":false,"LF":false,"RF":false},"ts":1595596930687,"currentTrack":{"AlbumArtUri":"https://img.ardmediathek.de/standard/00/42/92/13/72/-295433861/1x1/576?mandant=ard","Title":"stream.mp3?ar-distributor=f0e2&amp;_art=dj0yJmlwPTkzLjIzNy4xNzMuMTQ1JmlkPWljc2N4bC1lazY3N3ZkbmImdD0xNTk1NjgzMDE0JnM9Nzg2NmYyOWMjZTVjM2I2ZWY4ZTExOTBmNDM3OTRlNjI1NGE1YzM1OTE","UpnpClass":"object.item","ItemId":"-1","ParentId":"-1","TrackUri":"x-rincon-mp3radio://https://wdr-edge-2020-fra-lg-cdn.cast.addradio.de/wdr/1live/live/mp3/128/stream.mp3?ar-distributor=f0e2&_art=dj0yJmlwPTkzLjIzNy4xNzMuMTQ1JmlkPWljc2N4bC1lazY3N3ZkbmImdD0xNTk1NjgzMDE0JnM9Nzg2NmYyOWMjZTVjM2I2ZWY4ZTExOTBmNDM3OTRlNjI1NGE1YzM1OTE","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},"enqueuedMetadata":{"AlbumArtUri":"https://img.ardmediathek.de/standard/00/42/92/13/72/-295433861/1x1/576?mandant=ard","Title":"1LIVE","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"-1","ParentId":"-1"},"transportState":"STOPPED","playmode":"NORMAL"}
Slave: {"uuid":"RINCON_7828CAF4289001400","name":"Küche","groupName":"Küche","coordinatorUuid":"RINCON_7828CAF4289001400","transportState":"STOPPED","playmode":"NORMAL","ts":1595596930687,"volume":{"Master":39,"LF":100,"RF":100}}

Gruß,
87Insane
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: andre07 am 24 Juli 2020, 18:58:16
ja das devStateIcon  beim ersten automatischen Anlegen der Sonosplayer war das vorhanden da war nichts mit manuell ergänzen
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 24 Juli 2020, 23:22:21
Ja wie schon geschreiben devStateIcon habe ich da noch nicht drin - das ist quasi noch in Entwicklung.
Man kann,wen man will das hier nehmen, aber wahrscheinlich fehlt da wieder was für den state:
STOPPED:rc_PLAY@green:play
(pause|stop):rc_STOP@red:play
PLAYING:rc_STOP@red:stop
(TRANSITIONING|play):rc_PLAY@yellow:stop
mute:audio_volume_mute@yellow
volume:audio_volume_mid@yellow
volumeDown:audio_volume_low@yellow
volumeUp:audio_volume_high@yellow
next:rc_NEXT@yellow:stop
previous:rc_PREVIOUS@yellow:stop
(next|mute|volumeDown|volumeUp|previous|pause|volume|STOPPED|TRANSITIONING|play|stop).(false|previous|next|volumeDown|volumeUp|[0-9]+):1px-spacer
PLAYING.previous:rc_PREVIOUS:previous
PLAYING.next:rc_NEXT:next
PLAYING.volumeDown:rc_VOLDOWN:volumeDown
PLAYING.volumeUp:rc_VOLUP:volumeUp
PLAYING.false:audio_volume_high:mute+true
PLAYING.true:audio_volume_mute:mute+false
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 24 Juli 2020, 23:59:42
ich habe noch etwas an der automatischen Einrichtung gebastelt. Ich beschreibe es mal später noch komplett, ich habe jetzt mal den Part der automatischen Anlage der Player gemacht.
Das soll eher eine Idee sein wie man es machen kann, sicher noch nicht im Status "fertig" :)

Vorausetzung

zwei notify machen den Job:
defmod n_configSonos1 notify global:DEFINED.MQTT2_RINCON_.* sleep 4;;set $EVTPART1 attrTemplate sonos2mqtt_speaker;;set $EVTPART1 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}

defmod n_configSonos2 notify MQTT2_RINCON_.*:IPAddress:.* {\
  use XML::Simple qw(:strict);;\
  no warnings 'experimental::smartmatch';;\
  my @tv = ("S14","S11");;\
  my $url="http://$EVTPART1:1400";;\
  my $xmltext = GetFileFromURL("$url/xml/device_description.xml");;\
  my $ref = XMLin($xmltext, KeyAttr => { }, ForceArray => [ ]);;\
  my $mn=$ref->{device}{modelNumber};;\
  my $img=$ref->{device}{iconList}{icon}{url};;\
  my $icon="Sonos2mqtt_icon-$mn";;\
  my $setList=AttrVal($NAME,'setList','');;\
  fhem("setreading $NAME modelNumber $mn");;\
  fhem("\"wget -qO ./www/images/default/$icon.png $url$img\"");;\
  fhem("attr $NAME icon $icon;;sleep 4 WI;;set WEB rereadicons");;\
  if ($mn ~~ @tv) {$setList=~s/input:Queue \{/input:Queue,TV \{/};;\
  my @arr=split("\n",$setList);;\
  if ($setList!~m/speak:textField/) {\
    push @arr , q(  speak:textField { my $tts="SonosTTS";;my $payload = $EVENT;;$payload =~ s/$EVTPART0 $EVTPART1 //g;; fhem("setreading $tts Player $NAME;;setreading $tts volume $EVTPART1;;set $tts tts $payload");;"{}"});;\
  }\
  $setList=join "\n",@arr;;\
  $setList=~s/;;/;;;;/g;;\
  fhem("attr $NAME setList $setList")\
}

Das Erste wird getriggert wenn ein Player durch autocreate erzeugt wird.
Das Zweite wird gettriggert wenn die ZoneInfos eintreffen (IP Adresse)
Das kann natürlich ausgebaut werden. Vielleicht hat jemand ne Meinung oder Idee dazu.
Auf die Art kann man die vorhandenen Player jederzeit löschen:
delete MQTT2_RINCON_.*

Die MQTT Events vom Player oder ein "pm2 restart sonos2mqtt" erzeugen die Player wieder komplett automatisch.

Ich hätte das XML parsen lieber mit XML::LibXML gemacht, hab es aber nicht hinbekommen.  Ist für mich ziemlich unverständlich. Falls da jemand eine Hilfe hat.  ;)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 25 Juli 2020, 01:29:22
Zum devStateIcon:
Mir ist nach wie vor nicht klar wozu der bridgeConnected Status beim Player sein soll. Zumal der MQTT Event mMn niemals kommt wenn der Player von sich aus angelegt wird. Damit ist der Status Leer und der Event müsste irgendwie von der Bridge initiiert werden.
Warum den Status nicht in der Bridge abfragen? Und warum den Status im devStateIcon 3 mal abfragen? Hab ich da was übersehen?
Die Variante funktioniert bei mir:
{
my $groupname = ReadingsVal($name,"groupName","0");
my $sgroupname = (split(" ",ReadingsVal($name,"groupName","")))[0];
my $uuidtoname = "MQTT2_".ReadingsVal($name,"coordinatorUuid","0");
my $vol = ReadingsVal($name,"volume","");
my $img = ReadingsVal($name,"currentTrack_AlbumArtUri","");
my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...'; };
my $mystate = $name eq $uuidtoname ? ReadingsVal($name,"state","FEHLER") : ReadingsVal($uuidtoname,"state","");
my $bridgestate = ReadingsNum((devspec2array('model=sonos2mqtt_bridge'))[0],'connected',0);
my $amp = $bridgestate eq "0"
? "rot"
: $bridgestate eq "1"
? "gelb"
: "gruen";
my $playpic = $mystate eq "PLAYING"
? 'rc_PAUSE@red'
: $mystate eq "PAUSED_PLAYBACK"
? 'rc_PLAY@green'
: $mystate eq "STOPPED"
? 'rc_PLAY@green'
: $mystate eq "TRANSITIONING"
? 'rc_PLAY@blue'
: $mystate eq "set_next"
? 'rc_NEXT@blue'
: $mystate eq "set_previous"
? 'rc_PREVIOUS@blue'
: $mystate eq "set_volumeUp"
? 'rc_VOLUP@blue'
: $mystate eq "set_volumeDown"
? 'rc_VOLDOWN@blue'
: $mystate eq "set_mute"
? 'rc_MUTE@blue'
: $mystate;
my $mutecmd = ReadingsVal($name,"mute","0") eq "false"
? "true"
: "false";
my $mutepic = ReadingsVal($name,"mute","0") eq "false"
? 'rc_MUTE'
: 'rc_VOLUP';
my $show = "FEHLER";
my $currentTrack = $mystate eq "TRANSITIONING"
? "Puffern..."
: $trim30->(ReadingsVal($name,"currentTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"currentTrack_Title","FEHLER"));
my $nextTrack = $trim30->(ReadingsVal($name,"nextTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"nextTrack_Title","FEHLER"));
my $previouspic = 'rc_PREVIOUS';
my $nextpic = 'rc_NEXT';
my $voldownpic = 'rc_VOLDOWN';
my $voluppic = 'rc_VOLUP';

if ($bridgestate ne "2") {
$show = " ".FW_makeImage("rc_BLANK")." ";}

elsif (($mystate eq "PLAYING")
|| ($mystate eq "TRANSITIONING" )
|| ($mystate eq "set_next" )
|| ($mystate eq "set_previous" )
|| ($mystate eq "set_volumeUp" )
|| ($mystate eq "set_volumeDown" )
|| ($mystate eq "set_mute" )) {

my $shownp = ReadingsVal($name,"name","0") eq $sgroupname ? "<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>" : "";

$show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>
$shownp
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>";

if (ReadingsVal($name,"name","0") eq $sgroupname) {
$show = ReadingsVal($name,"enqueuedMetadata_UpnpClass","FEHLER") ne "object.item.audioItem.audioBroadcast"
? "$show Aktueller Track: $currentTrack<br>Nächster Track: $nextTrack"
: "$show Radio: $currentTrack";}

elsif (ReadingsVal($name,"name","0") ne $groupname) {
$show = "$show
Master: $sgroupname";}
}
else {
$show = $name eq $uuidtoname
? "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>"
: "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a><br>Master: $sgroupname";}

"<div>
<table>
  <tr>
    <td><div style='display: inline-block; margin-right: 5px; border: 1px solid lightgray; height: 4.00em; width: 4.00em; background-image: url($img);background-size: contain;'></div>
</td>
    <td>".FW_makeImage("10px-kreis-".$amp)."
$show</td>
   </tr>
</table>
</div>"
}

bzw. etwas bearbeitet für "Alle Player nachrüsten"
attr MQTT2_RINCON_.* devStateIcon {\
my $groupname = ReadingsVal($name,'groupName','0');;\
my $sgroupname = (split(' ',ReadingsVal($name,'groupName','')))[0];;\
my $uuidtoname = "MQTT2_".ReadingsVal($name,'coordinatorUuid','0');;\
my $vol = ReadingsVal($name,'volume','');;\
my $img = ReadingsVal($name,'currentTrack_AlbumArtUri','');;\
my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...';; };;\
my $mystate = $name eq $uuidtoname ? ReadingsVal($name,'state','FEHLER') : ReadingsVal($uuidtoname,'state','');;\
my $bridgestate = ReadingsNum((devspec2array('model=sonos2mqtt_bridge'))[0],'connected',0);;\
my $amp = $bridgestate == 0?'rot':$bridgestate == 1?'gelb':'gruen';;\
my $playpic = $mystate eq 'PLAYING'\
  ? 'rc_PAUSE@red'    : $mystate eq 'PAUSED_PLAYBACK'\
  ? 'rc_PLAY@green'   : $mystate eq 'STOPPED'\
  ? 'rc_PLAY@green'   : $mystate eq 'TRANSITIONING'\
  ? 'rc_PLAY@blue'    : $mystate eq 'set_next'\
  ? 'rc_NEXT@blue'    : $mystate eq 'set_previous'\
  ? 'rc_PREVIOUS@blue': $mystate eq 'set_volumeUp'\
  ? 'rc_VOLUP@blue'   : $mystate eq 'set_volumeDown'\
  ? 'rc_VOLDOWN@blue' : $mystate eq 'set_mute'\
  ? 'rc_MUTE@blue'    : 'rc_PLAY@yellow';;\
my $mutecmd = ReadingsVal($name,'mute','0') eq 'false'?'on':'off';;\
my $mutepic = $mutecmd eq 'on'? 'rc_MUTE': 'rc_VOLUP';;\
my $show = 'FEHLER';;\
my $currentTrack = $mystate eq 'TRANSITIONING'\
  ? 'Puffern...'\
  : $trim30->(ReadingsVal($name,'currentTrack_Artist','FEHLER')).' - '.$trim30->(ReadingsVal($name,'currentTrack_Title','FEHLER'));;\
my $nextTrack = $trim30->(ReadingsVal($name,'nextTrack_Artist','FEHLER')).' - '.$trim30->(ReadingsVal($name,'nextTrack_Title','FEHLER'));;\
my $previouspic = 'rc_PREVIOUS';;\
my $nextpic = 'rc_NEXT';;\
my $voldownpic = 'rc_VOLDOWN';;\
my $voluppic = 'rc_VOLUP';;\
\
if ($bridgestate ne '2') {\
$show = ' '.FW_makeImage('rc_BLANK').' '}\
\
elsif (($mystate eq 'PLAYING')\
|| ($mystate eq 'TRANSITIONING' )\
|| ($mystate eq 'set_next' )\
|| ($mystate eq 'set_previous' )\
|| ($mystate eq 'set_volumeUp' )\
|| ($mystate eq 'set_volumeDown' )\
|| ($mystate eq 'set_mute' )) {\
\
  my $shownp = ReadingsVal($name,'name','') eq $sgroupname ? "<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>\
  <a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>" : "";;\
\
  $show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>\
  <a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>\
  $shownp\
  <a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>\
  &nbsp;;&nbsp;;&nbsp;;&nbsp;;\
  <a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>";;\
\
  if (ReadingsVal($name,'name','') eq $sgroupname) {\
    $show = ReadingsVal($name,'enqueuedMetadata_UpnpClass','FEHLER') ne 'object.item.audioItem.audioBroadcast'\
? "$show Aktueller Track: $currentTrack<br>Nächster Track: $nextTrack"\
: "$show Radio: $currentTrack"}\
\
elsif (ReadingsVal($name,'name','') ne $groupname) {\
  $show = "$show Master: $sgroupname"}\
}\
else {\
  $show = $name eq $uuidtoname\
  ? "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>"\
  : "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a><br>Master: $sgroupname"\
}\
\
"<div>\
<table>\
  <tr>\
    <td><div style='display: inline-block;; margin-right: 5px;; border: 1px solid lightgray;; height: 4.00em;; width: 4.00em;; background-image: url($img);;background-size: contain;;'></div>\
</td>\
    <td>".FW_makeImage("10px-kreis-".$amp)."\
$show</td>\
   </tr>\
</table>\
</div>"\
}


Nachtrag:
Mute funktioniert in der Version / Kombination mit dem aktuelle Template nicht. Korrigiert ;)
Fragen:
Die Abhängigkeit des devStateIcon in seiner generellen Funktion vom Status der Bridge würde ich eigentlich nicht so machen. Wozu der Status der Bridge und der Status vom Player sind doch unabhängig voneinander?
Ob man bei mute mit on und off oder besser mit true false arbeitet? Letzteres vereinfacht die Logik
Wie liefert man das jetzt alles aus? Vor allem während der Entwicklung. Extra Template für devStateIcon? Die notify in ein Template? Alles in eine Art Komforttemplate?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 25 Juli 2020, 17:37:54
Was das ausliefern usw. angeht, habe ich auch nicht den zündenden Gedanken, da darf gerne auch jeder was zu sagen, der das nutzt (z.B. im ebus-template-package ist auch manches drin, das man auch anders machen könnte. Wenn das alles zu speziell ist und ggf. sinnvollerweise Perl-Code ausgelagert werden sollte, ist es mMn. einfacher, dazu eine myUtils und "Extra-Templates" auszuliefern.

Bestimmte Dinge von einer Namenswahl abhängig zu machen, sollte man aber mMn vermeiden, lieber mit devspec (model?, readingList=~, ...) arbeiten. Aber grundsätzlich sollte so eine "Generaländerung" eher vom User durchgeführt werden, und templates eher auf das einzelne Device beschränkt bleiben, alles andere wird immer mal wieder nicht verstanden (warum erzeugen bestimmte OMG-templates weitere Devices, z.B.. Dabei ist es eigentlich klar, sobald man es kurz erklärt...).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 26 Juli 2020, 13:28:26
Zitat von: Beta-User am 25 Juli 2020, 17:37:54
Bestimmte Dinge von einer Namenswahl abhängig zu machen, sollte man aber mMn vermeiden, lieber mit devspec (model?, readingList=~, ...) arbeiten.
Stimme Dir völlig zu, war ein Schnellschuss von mir und hatte keine andere Idee. Du meinst so?:
my $bridgestate = ReadingsNum((devspec2array('model=sonos2mqtt_bridge'))[0],'connected',0);Habs oben mal so geändert. ;)

Wenn ich mir define Sonos SONOS anschaue da passiert auch wesentlich mehr als ein Device ...
Warum sollte Template nicht auch ein umfangreicheres Setup erledigen?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: andre07 am 26 Juli 2020, 15:54:39
Als Player wird jetzt sowas angelegt
defmod MQTT2_mqttjs_d73ad64a MQTT2_DEVICE mqttjs_d73ad64a
attr MQTT2_mqttjs_d73ad64a DbLogExclude .*
attr MQTT2_mqttjs_d73ad64a IODev mqtt2server
attr MQTT2_mqttjs_d73ad64a alias Wohnzimmer
attr MQTT2_mqttjs_d73ad64a icon audio_volume_low
attr MQTT2_mqttjs_d73ad64a jsonMap volume_Master:volume mute_Master:mute transportState:state
attr MQTT2_mqttjs_d73ad64a model sonos2mqtt_speaker
attr MQTT2_mqttjs_d73ad64a readingList sonos/RINCON_5CAAFD243CDE01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr MQTT2_mqttjs_d73ad64a room MQTT2_DEVICE

Da dürften deine notify so auch nicht mehr funktionieren
Irgendwie scheint bei mir jetzt gar nichts mehr zu funktionieren ???
Andre
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 26 Juli 2020, 17:16:26
Zitat von: Otto123 am 26 Juli 2020, 13:28:26
Stimme Dir völlig zu, war ein Schnellschuss von mir und hatte keine andere Idee. Du meinst so?:
my $bridgestate = ReadingsNum((devspec2array('model=sonos2mqtt_bridge'))[0],'connected',0);Habs oben mal so geändert. ;)
Oben ging's mal drum, dass mehrere Devices mit einer bestimmten Namenskonvention adressiert werden, von daher war das etwas anderes, aber so in der Richtung kann man die Anregung auch verstehen. Das war btw. auch nur ein Schnellschuß aus der Hüfte.

Zitat
Wenn ich mir define Sonos SONOS anschaue da passiert auch wesentlich mehr als ein Device ...
Warum sollte Template nicht auch ein umfangreicheres Setup erledigen?
Letztlich geht es immer darum, möglichst die (vermutete) Erwartung des Users zu erfüllen. Wird dieses Ziel erreicht, ist eigentlich alles gut :) . Da v.a. Attribute aber ein "offenes System" sind, ist es andererseits recht einfach, Fehlerquellen einzubauen, bzw. Dinge, die nur unter bestimmten Rahmenbedingungen (wie eben die Beibehaltung automatisch vergebener Namen in diesem Fall). Ging nur darum, dieses "Einfallstor" möglichst zu vermeiden. (Was SONOS da macht, kenne ich nicht und kann daher nichts dazu sagen, ob das jetzt"gut" bzw. "verbesserungsfähig" gelöst ist).
Was User-Erwartungen angeht, ist meine Erfahrung leider teils die, dass selbst wenn dann mal ein entsprechender Hinweistext vorhanden und das Verhalten eigentlich (mMn.) "logisch" ist, trotzdem noch Rückfragen kommen, und wenn man was falsch machen kann, dann gibt es eben auch früher oder später jemanden, der ....

Bzgl. "Einrichtungsassistent": Was im Bereich der Sprachsteuerungs-Erweiterungen stattfindet, ist mMn. genau das - ein Einrichtungs-"Baukasten", der - abhängig von den vorhandenen Rahmenbedingungen - interaktiv das konfiguriert, was dem User in seiner konkreten Umgebung hilft.
Von daher: feel free, den Baukasten so zu nutzen! (Theoretisch könnte man darüber auch sinnvolle "global"-Attribute usw. als Ersteinrichtungshilfe abfragen usw... Die Frage bliebe allerdings, ob das wirklich hilfreich für den Einstieg in FHEM wäre - habe da starke Zweifel.)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 26 Juli 2020, 17:49:10
Hallo Andre,

was da jetzt bei Dir "angelegt" wird ist für mich nicht ganz nachvollziehbar.
Die MQTT2 Device werden mit anderer Regel angelegt, weiß nicht genau warum. Eigentlich ist es doch MQTT2_<CID> Du hast keinen MQTT2_SERVER ?

Edit: Das Device was Du gezeigt hast ist doch ohne die Bridge? Hast Du keine Bridge erzeugt?!?

Ein Template wurde angewendet, aber nicht komplett - die setList fehlt komplett?

Klar damit geht von meinen notify nichts  :'(

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 26 Juli 2020, 22:10:21
Zitat von: Beta-User am 26 Juli 2020, 17:16:26
Oben ging's mal drum, dass mehrere Devices mit einer bestimmten Namenskonvention adressiert werden, von daher war das etwas anderes, aber so in der Richtung kann man die Anregung auch verstehen.
Ich habe jetzt etwas rumprobiert, nachgedacht und versucht die notify so "scharf" wie möglich und so allgemein wie nötig zu triggern.
Die Benennung der MQTT2_ Devices ist hartcodiert hat Rudi mal gesagt (https://forum.fhem.de/index.php/topic,108761.msg1027454.html#msg1027454): MQTT2_<CID>
Da die CID von den Playern vorgegeben wird, ist doch die initiale Benennung auch vorgegeben?! Oder sehe ich das falsch?

Ich würde ungern auf MQTT2_.* triggern. Beim DEFINE ist das noch relativ selten, aber beim abfragen der danach folgenden ZoneInfos fällt mir nix so richtig ein.
Der Fall oben von Andre ist doch eigentlich ein Fehler der so gar nicht auftreten kann - oder?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 27 Juli 2020, 07:01:27
Zitat von: Otto123 am 26 Juli 2020, 22:10:21
Ich habe jetzt etwas rumprobiert, nachgedacht und versucht die notify so "scharf" wie möglich und so allgemein wie nötig zu triggern.
Die Benennung der MQTT2_ Devices ist hartcodiert hat Rudi mal gesagt (https://forum.fhem.de/index.php/topic,108761.msg1027454.html#msg1027454): MQTT2_<CID>
Da die CID von den Playern vorgegeben wird, ist doch die initiale Benennung auch vorgegeben?! Oder sehe ich das falsch?

Ich würde ungern auf MQTT2_.* triggern. Beim DEFINE ist das noch relativ selten, aber beim abfragen der danach folgenden ZoneInfos fällt mir nix so richtig ein.
Ähm, sorry, wenn ich da alles in einen Topf geworfen hatte: Mir ging es v.a. darum, im laufenden Betrieb nicht Namen zu verwenden, die veränderlich sind (devStateIcon, tendenziell auch attrTemplate-Anweisungen). Die "defined"-notify sind da etwas anderes, da kann man schon den (erst mal vorgegebenen) Namen verwenden. (Ob das insgesamt Sinn macht, ist eine andere (Geschmacks-)Frage).

Ohne das intensiver geprüft zu haben, tendiere ich aber weiter dazu, insgesamt eher über eine devspec mit "RINCON_"-Matching zu gehen; man muß damit rechnen, dass "irgendwer" auch automatisch Devices bei autocreate umbenennt und dann 4 Sekunden schon wieder eine Ewigkeit sind...
(k.A., warum "man" sowas macht, aber es gibt nichts, was es nicht gibt.)

(Das Einrichten der Clients könnte man dann übrigens auch als "Erweiterung" an das Anwenden des Bridge-Templates hängen, dann bräuchte man evtl. kein notify, oder interpretiere ich da was rein; es scheint ja eine Art "presentation"-Option für den sonos2mqtt-Dienst zu geben oder man wertet die subscriptions aus?

Zitat
Der Fall oben von Andre ist doch eigentlich ein Fehler der so gar nicht auftreten kann - oder?
Ohne jetzt nochmal den ganzen Thread durchgegangen zu sein vermute ich, dass er schlicht und einfach kein "bridge"-Gerät angelegt hat?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 27 Juli 2020, 09:36:45
Zitat von: Beta-User am 27 Juli 2020, 07:01:27
(Das Einrichten der Clients könnte man dann übrigens auch als "Erweiterung" an das Anwenden des Bridge-Templates hängen, dann bräuchte man evtl. kein notify, oder interpretiere ich da was rein; es scheint ja eine Art "presentation"-Option für den sonos2mqtt-Dienst zu geben oder man wertet die subscriptions aus?
Direkt im Template geht es nicht, denn die Sache ist ja zeitlich ein Ablauf:
Klar könnte man FHEM auch für ein paar Sekunden beim Setup blockieren (kann man nicht!) man kann alternativ dasitzen und warten und schauen und klicken.  :-[

Mit den beiden notify funktioniert das Setup der Player voll automatisch - auch wenn man sich zu Weihnachten eine Erweiterung kauft!

Aber man kann die notify im Bridge Template einfach ins System werfen ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 27 Juli 2020, 09:56:00
In attrTemplate hast du auch die Option, Perl-Commands abzusetzen (einschl. fhem("sleep2;;...")), von daher: geht nicht, gibt's nicht, man könnte damit auch zeitlich Abläufe (nachlaufend zu publish-Anweisungen an das IO) realisieren....

Aber mir ging es weniger um das/die notify, sondern eher um sowas:
my $uuidtoname = "MQTT2_".ReadingsVal($name,'coordinatorUuid','0');;\Hier sollte man entweder die coordinatorUuid in ein eigenes Attribut (des "Zieldevices") packen (userattr oder devicetopic?) und dann via devspec weiterarbeiten ;) .

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 27 Juli 2020, 10:14:28
Ok verstanden: devStateIcon -> Komfortbaustelle ;) -> wenn die Grundkonfig mal stabil steht.
Ich habe noch einen Vorschlag für ein gaanz einfaches "Basic devStateIcon".

Mir geht es mit den notify primär darum: " das Setup der Player voll automatisch - auch wenn man sich zu Weihnachten eine Erweiterung kauft"

ok kann man unterschiedlicher Meinung sein. Ich würde das Angebot machen - wer alles selbst konfigurieren will, kann ja im Template abgucken.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 27 Juli 2020, 12:44:51
Das wäre mein Vorschlag für das Template "Bridge Comfort" (den Namen kannst Du gern ändern)
name:sonos2mqtt_bridge_comfort
desc:The sonos2mqtt bridge including automated setup for speaker devices
filter:TYPE=MQTT2_DEVICE
order:M_05c
set DEVICE attrTemplate sonos2mqtt_bridge
define n_configSonos1 notify global:DEFINED.MQTT2_RINCON_[A-Z0-9]+ sleep 1;set $EVTPART1 attrTemplate sonos2mqtt_speaker;set $EVTPART1 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
define n_configSonos2 notify MQTT2_RINCON_[A-Z0-9]+:IPAddress:.* {\
  no warnings 'experimental::smartmatch';\
  my @tv = ("S14","S11");\
  my $url="http://$EVTPART1:1400";\
  my $xmltext = GetFileFromURL("$url/xml/device_description.xml");\
  my ($mn)=$xmltext =~ /<modelNumber>(S[0-9]+)/;\
  my ($img)=$xmltext =~ /<url>(.*)<\/url>/;\
  my $icon="Sonos2mqtt_icon-$mn";\
  my $setList=AttrVal($NAME,'setList','');\
  fhem("setreading $NAME modelNumber $mn");\
  fhem("\"wget -qO ./www/images/default/$icon.png $url$img\"");\
  fhem("attr $NAME icon $icon;sleep 4 WI;set WEB rereadicons");\
  if ($mn ~~ @tv) {$setList=~s/input:Queue \{/input:Queue,TV \{/};\
  $setList=~s/;/;;/g;\
  fhem("attr $NAME setList $setList")\
}
setreading DEVICE attrTemplateVersion 20200727

Ich bin nach wie vor der Meinung: Man sollte die Bridge als erstes "per Hand" anlegen.
Codevorschlag für die Raw Def:
define SonosBridge MQTT2_DEVICE
attr SonosBridge IODev <Name des MQTT2 Server>
attr SonosBridge room MQTT2_DEVICE
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort

Man wird nach dem Topic gefragt, den tippt man ein (sonos)
* und damit ist man fertig. 👍
Der Rest ist magic :)
Sobald ein Player aktiv ist, wird er angelegt und konfiguriert.

Gibt es eine Erklärung warum aus dem Template beim define die Semikolon eins zu eins in die Konfig wandern? Ich würde ja gern die Notwendigkeit für dritte Syntaxvariante verstehen.  ;)
Zeilenende/fortsetzung
1. DEF ;
2. Raw Def ;;\
3. Template ;\
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 27 Juli 2020, 14:00:32
Hab's mal (fast) so eingecheckt.

Ob man die Bridge von Hand anlegt oder nicht: bin da leidenschaftslos; vermutlich wird das Ding aber automatisch angelegt, wenn man autocreate aktiv hat, MQTT2_SERVER im Einsatz und den Dienst startet ;) . Wichtig ist halt, dass man das Template dann auch andwendet, denn sonst gibt's halt keine "speaker"-Sub-Geräte ;D .

Zur Syntax kann ich wenig sagen, ich habe das nicht erfunden, sondern einfach die Templates "gesammelt" (und komme bekanntermaßen auch immer ins Straucheln, wenn ich ungetestet irgendwas zur Syntax sage, völlig egal, ob es als RAW oder vertemplated oder sonst wie ist ::) ...)

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 27 Juli 2020, 14:28:32
Danke!
Zitat von: Beta-User am 27 Juli 2020, 14:00:32
...vermutlich wird das Ding aber automatisch angelegt, wenn man autocreate aktiv hat, MQTT2_SERVER im Einsatz und den Dienst startet ;) .
Wenn "das Ding" schon da ist wird es aber nicht nochmal angelegt.
Insofern wenn man "das Ding" anlegt und dann erst den Dienst startet werden sofort die Player angelegt ;)

Aber egal, wenn es schon da ist muss man halt das Template anwenden sonst keine Player. Ist wirklich egal und man kann auch alles zu Fuß machen (oder per Hand)  ;D ;D ;D
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 27 Juli 2020, 14:39:20
Zitat von: Otto123 am 27 Juli 2020, 14:28:32
Insofern wenn man "das Ding" anlegt und dann erst den Dienst startet werden sofort die Player angelegt ;)
...auch nett...
Gibt es evtl. die Möglichkeit, eine Art "Präsentation" zu starten? (Z.B. ein MQTT-Command, der den Dienst neu startet?)

(Man könnte auch die vorhandene readingList als Array ausmosten und dann die einzelnen Player über eine Schleife anlegen; zumindest DEV_ID und BASE_TOPIC für die Speaker wären damit bekannt...) (duckundweg)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: andre07 am 27 Juli 2020, 15:31:03
Hab es bei mir nochmal gelöscht mein mqtt2client deaktiviert und neu angelegt Player werden erzeugt auch speak funktioniert.
Das devStateIcon noch eingefügt jetzt scheint es wieder zu gehen auch die Namen der Player passen wieder.
Auf meinen Haupt Fhem läuft noch das Sonos Modul mit dem ich aber immer wieder  Probleme habe deshalb wollte ich es mal
auf meinen Test Fhem ordentlich zum laufen bekommen bevor ich es ersetzte.
Beide Systeme sind per mqtt2client (fhem2) miteinander verbunden.

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 27 Juli 2020, 17:52:23
Hey zusammen,

kümmere mich um die komfort Baustelle sobald ich wieder Zeit hab. Der Vergleich oben für myuuid war nur einer von vielen versuchen. Soweit ich das überflogen habe, habt ihr mir aber neue wege eröffnet und ich kann das alles anpassen. Devstateicon (meine variante) ist maximal beta Test aktuell. Die Richtung und Funktionen wird bleiben und noch ein wenig aufgebohrt. Nur ist das testen aller Konstellationen echt zeitaufwendig und ich muss mich darauf konzentrieren können. Aktuell hab ich ne kleine Baustelle zuhause und muss das zuerst fertig bekommen. Seid mir nicht böse.

Ggf macht es Sinn, den aktuellen status im ersten Post zu Zeigen. Dann müsste ich zb nicht 25 Beiträge lesen und wüsste direkt was passiert ist. Glaube otto123 hatte das nach seinem UL auch....
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 27 Juli 2020, 21:49:50
Ich pflege aktuell "meinen Stand" in meinem Blog Artikel, insofern ist die erste Seite des Threads aktuell ;)
(muss ich natürlich noch auf die heutige/morgige Neuerung anpassen - neues Template verfügbar ;) )
ZitatBis es eine fertige Installations-Anleitung gibt, bitte ich diesen Link zu meinem Blog zu folgen:
https://heinz-otto.blogspot.com/2020/05/sonos2mqtt-so-weit-bin-ich.html
Ich würde aber jetzt schon gern für die Grundlage einen Artikel im Wiki machen.
Hier https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele oder separat?

An dem devStateIcon kann man sicher ewig verbessern, auch hier sehe ich eigentlich einen ganz guten Stand erreicht. ;)

@Beta-User Den Dienst neu starten, leider (weiß ich es) nicht per MQTT - aber einfach so in der FHEM Kommandozeile:
"pm2 restart sonos2mqtt"
Mal schauen, vielleicht gibt es doch was ... ;)
Ansonsten reicht es im laufenden Betrieb den Player einfach zu bedienen, wenn er selbst den Titel wechselt reicht es auch.

Oder meinst Du ohne autocreate?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 28 Juli 2020, 08:14:54
Zitat von: Otto123 am 27 Juli 2020, 21:49:50
Hier https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele (https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele) oder separat?
Tendiere zu einer Mischform ähnlich wie beim EBus. Hängt aber auch davon ab, wie umfangreich das am Ende wird, aber bereits dein Mitschrieb hat ja einen "gewissen Umfang".

Zitat@Beta-User [...]
Oder meinst Du ohne autocreate?
Schon mit autocreate. Das mit dem restart war nur als Beispiel gedacht (so machen wir das bei Tasmota), es ginge z.B. auch ein "mache alle leiser" oä. (Wildcard-publish?). Aber so wichtig ist das am Ende auch nicht, das ganze ist auch so schon sehr komfortabel, und Weihnachten wird ja schließlich auch immer mal wieder ;) ...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 28 Juli 2020, 11:19:38
Ich glaube auch Mischform:  die Wiki Seite hat ja schon jetzt einen leicht unübersichtlichen Umfang.
Ich mache einen Extra Artikel und den können wir in einem kurzem Überblick Abschnitt verlinken.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 28 Juli 2020, 11:59:55
Vermutlich ist es das beste, einfach mal loszulegen.

Was die "Praxisbeispiele" selbst angeht, wäre es evtl. auch an der Zeit, das aufzubrechen; z.B. Tasmota hätte evtl. etwas mehr Pflege verdient (wie sind die attrTemplate aufgebaut? Warum bestimmte jsonMaps,...), OpenMQTTGateway fehlt noch bzw. ist unvollständig & am falschen Ort, ...
(Grade habe ich dazu aber nicht die große Lust und/oder durchschlagende Idee).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 29 Juli 2020, 09:09:26
Moin,

ich habe gestern mal noch was fürs Auge getan ;) zwei Dinge könnte man vielleicht einfach im Basistemplate mit ausliefern:
Ein ganz minimalistisches devStateIcon für die Player.
attr MQTT2_RINCON_.* devStateIcon (STOPPED|PAUSED_PLAYBACK):rc_PLAY:toggle PLAYING:rc_PAUSE:pause .*:refresh:play
und auch für die Bridge
attr SonosBridge devStateIcon 0:10px-kreis-rot 1:10px-kreis-gelb 2:10px-kreis-gruen
attr SonosBridge stateFormat connected


Die aufwendige Variante von 87insane habe ich mal etwas abgeändert/erweitert/gekürzt ;) :
Grund: Der Bridge Zustand wird eigentlich nie übertragen wenn im laufenden Betrieb ein Player hinzugefügt wird. Das devStateIcon funktioniert damit erstmal nicht.
attr MQTT2_RINCON_.* devStateIcon {\
my $groupname = ReadingsVal($name,'groupName','0');;\
my $sgroupname = (split(' ',ReadingsVal($name,'groupName','')))[0];;\
my $uuidtoname = (devspec2array('DEF='.ReadingsVal($name,'coordinatorUuid','0')))[0];;\
my $vol = ReadingsVal($name,'volume','');;\
my $img = ReadingsVal($name,'currentTrack_AlbumArtUri','');;\
my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...';; };;\
my $mystate = $name eq $uuidtoname ? ReadingsVal($name,'state','FEHLER') : ReadingsVal($uuidtoname,'state','');;\
my $playpic = $mystate eq 'PLAYING'\
  ? 'rc_PAUSE@red'    : $mystate eq 'PAUSED_PLAYBACK'\
  ? 'rc_PLAY@green'   : $mystate eq 'STOPPED'\
  ? 'rc_PLAY@green'   : $mystate eq 'TRANSITIONING'\
  ? 'rc_PLAY@blue'    : $mystate eq 'set_next'\
  ? 'rc_NEXT@blue'    : $mystate eq 'set_previous'\
  ? 'rc_PREVIOUS@blue': $mystate eq 'set_volumeUp'\
  ? 'rc_VOLUP@blue'   : $mystate eq 'set_volumeDown'\
  ? 'rc_VOLDOWN@blue' : $mystate eq 'set_mute'\
  ? 'rc_MUTE@blue'    : 'rc_PLAY@yellow';;\
my $mutecmd = ReadingsVal($name,'mute','0') eq 'false'?'on':'off';;\
my $mutepic = $mutecmd eq 'on'? 'rc_MUTE': 'rc_VOLUP';;\
my $show = 'FEHLER';;\
my $currentTrack = $mystate eq 'TRANSITIONING'\
  ? 'Puffern...'\
  : $trim30->(ReadingsVal($name,'currentTrack_Artist','FEHLER')).' - '.$trim30->(ReadingsVal($name,'currentTrack_Title','FEHLER'));;\
my $nextTrack = $trim30->(ReadingsVal($name,'nextTrack_Artist','FEHLER')).' - '.$trim30->(ReadingsVal($name,'nextTrack_Title','FEHLER'));;\
my $previouspic = 'rc_PREVIOUS';;\
my $nextpic = 'rc_NEXT';;\
my $voldownpic = 'rc_VOLDOWN';;\
my $voluppic = 'rc_VOLUP';;\
\
if (($mystate eq 'PLAYING')\
  || ($mystate eq 'TRANSITIONING' )\
  || ($mystate eq 'set_next' )\
  || ($mystate eq 'set_previous' )\
  || ($mystate eq 'set_volumeUp' )\
  || ($mystate eq 'set_volumeDown' )\
  || ($mystate eq 'set_mute' )) {\
  \
    my $shownp = ReadingsVal($name,'name','') eq $sgroupname ? "<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>\
    <a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>" : "";;\
  \
    $show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>\
    <a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>\
    $shownp\
    <a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>\
    &nbsp;;&nbsp;;&nbsp;;&nbsp;;\
    <a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>";;\
  \
    if (ReadingsVal($name,'name','') eq $sgroupname) {\
      $show = ReadingsVal($name,'currentTrack_TrackUri','') =~ 'spdif'\
     ? 'TV': ReadingsVal($name,'enqueuedMetadata_UpnpClass','FEHLER') ne 'object.item.audioItem.audioBroadcast'\
     ? "$show Aktueller Track: $currentTrack<br>Nächster Track: $nextTrack"\
     : "$show Radio: $currentTrack"}\
    \
  elsif (ReadingsVal($name,'name','') ne $groupname) {\
    $show = "$show Master: $sgroupname"}\
  }\
  else {\
    $show = $name eq $uuidtoname\
    ? "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>"\
    : "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a><br>Master: $sgroupname"\
  }\
\
"<div>\
<table>\
  <tr>\
    <td><div style='display: inline-block;; margin-right: 5px;; border: 1px solid lightgray;; height: 4.00em;; width: 4.00em;; background-image: url($img);;background-size: contain;;'></div>\
    </td>\
    <td>$show</td>\
   </tr>\
</table>\
</div>"\
}


Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 29 Juli 2020, 09:50:17
Moin, die minimalistischen kommen bei Gelegenheit via svn.

Was das komplexe angeht: Bitte um Info, wenn ich das (wie?) ins svn schubsen soll. (? als separates template, das dann das Basistemplate aufruft und anschließend nur devStateIcon anders setzt?)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 29 Juli 2020, 09:51:44
Zu dem blog/doku: das ist gut! Danke!

Mein devstateicon mit "trigger" sollte mit den aktuellen readings so nicht klar kommen u diverse fehler machen. Ich würde das ganze gerne nochmal komplett überarbeiten.

Hatte mal eine Auflistung (einige Seiten zuvor) erstellt, wo meine Ideen aufgelistet sind. Die baue ich dann auch direkt mit ein. Jeder der "nur" einen single player nutzt, sollte mit dem player schon gut arbeiten können.

Mein Beweggrund für den zustand der bridge im Player ist die schnelle Erkennung was los ist. Ich finde es auch nicht so toll in rL überall den connect topic mit zu nehmen. Ggf macht es aber Sinn das die Bridge den Status direkt an die player vererbt? (Wenn das geht)
Dazu kann man so die Tasten schöner aus/einblenden. Jetzt kann man natürlich streiten ob das sein muss. An sich habe ich aber zb auch mal player an, die ich gar nicht höre. Um den status aber genau zu erkennen, fand ich diesen Weg am schnellsten. Wenn ich in mein fhem sehe, möchte ich nicht noch überlegen oder in ein gerät rein um das zu prüfen. Wenn ich vor dem Code bzw den Playern sitze, würde mir auch noch mehr einfallen.....
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 29 Juli 2020, 10:15:49
Die komplexe Variante ist eigentlich die leichte Abwandlung von 87insanes Letzer und funktioniert mit den aktuellen Readings.
Wie wir die mal ausliefern weiß ich auch noch nicht, da hatte ich mir jetzt vor allem Tests und Codehinweise erhofft  8)

Zum Zustand/State der Bridge:
Die hat doch erstmal rein garnichts mit dem Player zu tun? Klar wen der sonos2mqtt nicht läuft geht gar nichts, aber auch wirklich nix. Ob ich das jetzt am Zustand der Bridge oder an jedem Player sehe...
Andersrum der Zustand des einzelnen Players hat in gar keinem Fall was mit dem Zustand der Bridge zu tun. Wenn ich z.B. einen Player vom Netz nehme ist das der Bridge völlig egal. Hier könnte man eine Überwachung des Players einbauen, da habe ich schon ein paar Experimente gemacht. Das kann man vielleicht am Besten über sonos2mqtt rausbekommen - mit einer extra Abfrage.

Die Tasten blenden sich doch ein und aus je nach Betriebszustand des jeweiligen Player (ich meine den Code halbwegs verstanden zu haben ;) )

Es gibt ja jetzt folgende Setupschritte
Überwachung der Player wäre meine nächste Baustelle. Vielleicht kommt ja noch mehr.

Ich finde mit 1. und 2. sind wir auf einem guten Stand den man irgendwann "einfrieren" und Jedermann empfehlen kann.

@Beta-User Wenn Du die minimalen ins SVN schubst wäre es aus meiner Sicht gut die mute Geschichte noch auf true/false zu ändern. Falls nichts dagegen spricht.
  mute:true,false { my $value = $EVTPART1 eq "true" ? "mute" : "unmute"; qq(BASE_TOPIC/DEV_ID/control { "command": "$value" } ) }\
 

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: carlos am 29 Juli 2020, 12:01:58
Hallo,
Also ich habe 2 Probleme mit den aktuellen templates:
Die player werden angelegt, aber das 2. notify wird nicht getriggert.

1. Bei alias steht by mir ALIAS und nicht der Name des players.
2. Das 2. notify wird getriggert nach folgender Änderung:
    defmod n_configSonos2 notify MQTT2_RINCON_[A-Z0-9]+:ZoneInfo_IPAddress:.* {\
  no warnings 'experimental::smartmatch';;\
  my @tv = ("S14","S11","S9");;\
....


Außerdem habe ich S9 die Sonos Playbar noch dazu genommen
Gruß

Carlos
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 29 Juli 2020, 12:32:31
Hallo carlos,

danke für den Test und das Feedback. Solche Infos wie S9 sind für die Vervollständigung wertvoll. Ich glaube da fehlen mindest noch 2 (ARC, amp?)

Das er bei Dir das Reading so anlegt ZoneInfo_IPAddress hätte ich ursprünglich erwartet, warum er das bei mir bisher nicht getan hat, hatte mich gewundert. Das muss ich mal noch untersuchen.

Hast Du es völlig neu gemacht? Oder hattest Du die Bridge schon und hast überschrieben?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 29 Juli 2020, 12:40:20
Ich bin mit dem Speak Befehl nochmal vorangekommen ;)
Man kann ja in FHEM einen Webserver definieren, damit wird die Auslieferung der mp3 wesentlich einfacher. Spricht da was dagegen?

Damit braucht es kein samba mehr! :)

Hier der komplette Code zum testen für die Raw Def:
defmod SonosTTS Text2Speech none
attr SonosTTS TTS_UseMP3Wrap 1
attr SonosTTS userReadings httpName:lastFilename.* {'http://'.ReadingsVal($name,'host','set host first').':8083/fhem/'.ReadingsVal($name,'lastFilename','')}
setreading SonosTTS host {(qx(hostname -s|tr -d '\n'))}
deleteattr SonosTTS TTS_CacheFileDir

defmod SonosSpeakWeb HTTPSRV cache ./cache SonosSpeakWeb

defmod n_SonosSpeak notify SonosTTS:playing:.0 {fhem("set ".ReadingsVal($NAME,"Player","")." notify ".ReadingsVal($NAME,"volume","")." ".ReadingsVal($NAME,"httpName",""))}

{my @list = devspec2array('MQTT2_RINCON_.*');;\
foreach (@list) {\
   my $setList=AttrVal($_,'setList','');;\
   my @arr=split("\n",$setList);;\
   if ($setList!~m/speak:textField/) {\
     push @arr , q(  speak:textField { my $tts="SonosTTS";;my $payload = $EVENT;;$payload =~ s/$EVTPART0 $EVTPART1 //g;; fhem("setreading $tts Player $NAME;;setreading $tts volume $EVTPART1;;set $tts tts $payload");;"{}"});;\
   }\
   $setList=join "\n",@arr;;\
   $setList=~s/;;/;;;;/g;;\
   fhem("attr $_ setList $setList")\
}}


Für Test und Feedback bin ich wie immer dankbar!

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Reinerlein am 29 Juli 2020, 13:36:34
Hi Otto,

das fände ich auch für das Sonos-Modul interessant. Ist ja schließlich immer eine Hürde mit diesem Samba usw...
Damals hatte ich nur festgestellt, dass der Sonos-Player manchmal sehr lange braucht, um die Datei dann zu laden, und FHEMWEB solange blockiert ist...
Außerdem wurde bei mir immer der falsche Mimetype gesendet...

Hast du diese Probleme nicht (mehr)? Meine Tests dahingehend sind ja schließlich auch mal so sechs bis sieben Jahre her :)

Grüße
Reiner
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 29 Juli 2020, 13:55:30
Hallo Reiner,

schön das Du hier auch mit liest. :)

Ich finde die Datei wird vom Player fast ohne Verzögerung angenommen. Eine Blockade von FHEM oder auch vom FHEMWEB kann ich nicht erkennen. Hab jetzt extra mal einen 1,5 min langen Text genommen :)

Dabei habe ich nur festgestellt, der timeout Wert von dem notify Befehl des sonos2mqtt Moduls wird wirklich als Limit gesetzt. Da sind die 10 sec die jetzt im Template stehen wohl oft zu kurz  :-[ Ich denke den Wert muss man einfach hochsetzen, ich weiß noch nicht genau wann der helfend wirken soll. Am Ende der mp3 kehrt ja der Player zum normalen Programm zurück.

Aus meiner Sicht, kann man Dein Modul und sonos2mqtt ohne Probleme parallel betreiben.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: carlos am 29 Juli 2020, 13:59:28
Hallo Otto,
Ich habe jetzt noch mal alles gelöscht und neu gemacht nach deiner blog Anleitung:

1. define SonosBridge
2. template sonos2mqtt_bridge_comfort anwenden
Internals:
   CFGFN     
   DEVICETOPIC SonosBridge
   FUUID      5f215e02-f33f-0a14-2deb-2764cf9cd7a2ed68
   IODev      m2s
   LASTInputDev m2s
   MSGCNT     22
   NAME       SonosBridge
   NR         69702
   STATE      2
   TYPE       MQTT2_DEVICE
   m2s_MSGCNT 22
   m2s_TIME   2020-07-29 13:40:18
   .attraggr:
   .attrminint:
   OLDREADINGS:
   READINGS:
     2020-07-29 13:33:08   attrTemplateVersion 20200603
     2020-07-29 13:35:50   config_RINCON_5CAAFDD0159601400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_5CAAFDD0159601400/control","device":{"identifiers":["RINCON_5CAAFDD0159601400"],"manufacturer":"Sonos","name":"Büro"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_5CAAFDD0159601400","name":"Büro","state_topic":"sonos/RINCON_5CAAFDD0159601400","unique_id":"sonos2mqtt_RINCON_5CAAFDD0159601400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-07-29 13:35:50   config_RINCON_949F3ED8EAD101400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_949F3ED8EAD101400/control","device":{"identifiers":["RINCON_949F3ED8EAD101400"],"manufacturer":"Sonos","name":"Fernsehzimmer"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_949F3ED8EAD101400","name":"Fernsehzimmer","state_topic":"sonos/RINCON_949F3ED8EAD101400","unique_id":"sonos2mqtt_RINCON_949F3ED8EAD101400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-07-29 13:35:50   config_RINCON_B8E93772BD5701400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_B8E93772BD5701400/control","device":{"identifiers":["RINCON_B8E93772BD5701400"],"manufacturer":"Sonos","name":"Kinderzimmer"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_B8E93772BD5701400","name":"Kinderzimmer","state_topic":"sonos/RINCON_B8E93772BD5701400","unique_id":"sonos2mqtt_RINCON_B8E93772BD5701400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-07-29 13:35:50   connected       2
Attributes:
   IODev      m2s
   bridgeRegexp sonos/(RINCON_[A-Z0-9]+)[:/].* "$1"
   devStateIcon 0:10px-kreis-rot 1:10px-kreis-gelb 2:10px-kreis-gruen
   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:.* {}
   room       MQTT2_Sonos
   stateFormat connected


Alles so gelassen wie im template.
Folgende player sind bei mir enstanden entstanden:

1. Fernsehzimmer (Sonos Beam S14):
Internals:
   CFGFN     
   CID        RINCON_949F3ED8EAD101400
   DEF        RINCON_949F3ED8EAD101400
   DEVICETOPIC MQTT2_RINCON_949F3ED8EAD101400
   FUUID      5f215f17-f33f-0a14-f7b4-8ab425c5f7d36476
   IODev      m2s
   NAME       MQTT2_RINCON_949F3ED8EAD101400
   NR         69927
   STATE      x_raw_payload
   TYPE       MQTT2_DEVICE
   .attraggr:
   .attrminint:
   JSONMAP:
     mute_Master mute
     transportState state
     volume_Master volume
   READINGS:
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_coordinatorUuid RINCON_949F3ED8EAD101400
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_currentTrack_Album Mad Love
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_currentTrack_AlbumArtUri http://192.168.178.84:1400/getaa?s=1&u=x-sonos-spotify:spotify:track:3soOPBuMK8YMdWnV7xpEyf%3fsid%3d9%26flags%3d8224%26sn%3d5
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_currentTrack_Artist Sean Paul
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_currentTrack_Duration 0:03:19
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_currentTrack_ItemId -1
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_currentTrack_ParentId -1
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_currentTrack_ProtocolInfo sonos.com-spotify:*:audio/x-spotify:*
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_currentTrack_Title Mad Love
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_currentTrack_TrackUri x-sonos-spotify:spotify:track:3soOPBuMK8YMdWnV7xpEyf?sid=9&flags=8224&sn=5
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_currentTrack_UpnpClass object.item.audioItem.musicTrack
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_enqueuedMetadata_AlbumArtUri https://i.scdn.co/image/cbe4585034c3c6f7d700b2c0e963b4f2d7798581
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_enqueuedMetadata_ItemId 10032020spotify%3atrack%3a3soOPBuMK8YMdWnV7xpEyf
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_enqueuedMetadata_ParentId 1006206cspotify%3auser%3aspotify%3aplaylist%3a37i9dQZF1DX4jP4eebSWR9
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_enqueuedMetadata_Title Mad Love
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_enqueuedMetadata_UpnpClass object.item.audioItem.musicTrack.sonos-favorite
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_groupName Fernsehzimmer
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_mute_LF false
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_mute_Master false
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_mute_RF false
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_name Fernsehzimmer
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_playmode NORMAL
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_transportState PAUSED_PLAYBACK
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_ts 1596022550606
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_uuid RINCON_949F3ED8EAD101400
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_volume_LF 100
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_volume_Master 19
     2020-07-29 13:35:51   RINCON_949F3ED8EAD101400_volume_RF 100
     2020-07-29 13:35:52   ZoneInfo_CopyrightInfo © 2003-2019, Sonos, Inc. All rights reserved.
     2020-07-29 13:35:52   ZoneInfo_DisplaySoftwareVersion 12.0.3
     2020-07-29 13:35:52   ZoneInfo_ExtraInfo
     2020-07-29 13:35:52   ZoneInfo_Flags  0
     2020-07-29 13:35:52   ZoneInfo_HTAudioIn 21
     2020-07-29 13:35:52   ZoneInfo_HardwareVersion 1.23.1.9-2.2
     2020-07-29 13:35:52   ZoneInfo_IPAddress 192.168.178.84
     2020-07-29 13:35:52   ZoneInfo_MACAddress 94:9F:3E:D8:EA:D1
     2020-07-29 13:35:52   ZoneInfo_SerialNumber 94-9F-3E-D8-EA-D1:7
     2020-07-29 13:35:52   ZoneInfo_SoftwareVersion 58.1-79200
     2020-07-29 13:35:52   associatedWith  SonosBridge
     2020-07-29 13:35:52   attrTemplateVersion 20200718
     2020-07-29 13:35:52   control_command adv-command
     2020-07-29 13:35:52   control_input_cmd GetZoneInfo
     2020-07-29 13:35:52   control_input_reply ZoneInfo
     2020-07-29 13:35:52   state           x_raw_payload
Attributes:
   IODev      m2s
   alias      unknown
   icon       audio_volume_low
   jsonMap    volume_Master:volume mute_Master:mute transportState:state
   model      sonos2mqtt_speaker
   readingList sonos/RINCON_949F3ED8EAD101400:.* { json2nameValue($EVENT,'',$JSONMAP) }
sonos/RINCON_949F3ED8EAD101400/control:.* { json2nameValue($EVENT, 'control_', $JSONMAP) }
sonos/RINCON_949F3ED8EAD101400/ZoneInfo:.* { json2nameValue($EVENT, 'ZoneInfo_', $JSONMAP) }
   room       MQTT2_DEVICE
   setList    stop:noArg sonos/RINCON_949F3ED8EAD101400/control { "command": "stop" }
  play:noArg sonos/RINCON_949F3ED8EAD101400/control { "command": "play" }
  pause:noArg sonos/RINCON_949F3ED8EAD101400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_949F3ED8EAD101400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_949F3ED8EAD101400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_949F3ED8EAD101400/control { "command": "volumedown" }
  volume:slider,0,1,100 sonos/RINCON_949F3ED8EAD101400/control { "command": "volume", "input": $EVTPART1 }
  mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute"; qq(sonos/RINCON_949F3ED8EAD101400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_949F3ED8EAD101400/control { "command": "next" }
  previous:noArg sonos/RINCON_949F3ED8EAD101400/control { "command": "previous" }
  joinGroup:textField sonos/RINCON_949F3ED8EAD101400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_949F3ED8EAD101400","groupName","all"); qq(sonos/RINCON_949F3ED8EAD101400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_949F3ED8EAD101400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  playUri:textField {fhem("set $NAME setAVTUri $EVTPART1; sleep 1; set $NAME play")}
  input:Queue { my $value = $EVTPART1 eq "TV" ? "tv" : $EVTPART1 eq "Line_In" ? "line" : "queue"; qq(sonos/RINCON_949F3ED8EAD101400/control { "command": "switchto$value" } ) }
  notify:textField sonos/RINCON_949F3ED8EAD101400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_949F3ED8EAD101400/control $payload)}


2: Büro (Sonos Move S17)
Internals:
   CFGFN     
   CID        RINCON_5CAAFDD0159601400
   DEF        RINCON_5CAAFDD0159601400
   DEVICETOPIC MQTT2_RINCON_5CAAFDD0159601400
   FUUID      5f215d56-f33f-0a14-b58f-826384c7429fdf52
   IODev      m2s
   LASTInputDev m2s
   MSGCNT     29
   NAME       MQTT2_RINCON_5CAAFDD0159601400
   NR         69551
   STATE      PLAYING
   TYPE       MQTT2_DEVICE
   m2s_MSGCNT 29
   m2s_TIME   2020-07-29 13:46:41
   .attraggr:
   .attrminint:
   JSONMAP:
     mute_Master mute
     transportState state
     volume_Master volume
   READINGS:
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_coordinatorUuid RINCON_5CAAFDD0159601400
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_currentTrack_AlbumArtUri http://192.168.178.65:1400/getaa?s=1&u=x-sonosapi-stream:9479%3fsid%3d303%26flags%3d8224%26sn%3d7
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_currentTrack_Artist SOMMERRADIO AUF TOUR
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_currentTrack_ItemId -1
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_currentTrack_ParentId -1
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_currentTrack_ProtocolInfo sonos.com-http:*:*:*
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_currentTrack_Title x-sonosapi-stream:9479?sid=303&flags=8224&sn=7
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_currentTrack_TrackUri x-sonosapi-stream:9479?sid=303&flags=8224&sn=7
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_currentTrack_UpnpClass object.item
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_enqueuedMetadata_ItemId -1
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_enqueuedMetadata_ParentId -1
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_enqueuedMetadata_Title SWR3
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_groupName Büro
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_mute_LF false
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_mute_Master false
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_mute_RF false
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_name Büro
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_playmode NORMAL
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_transportState PLAYING
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_ts 1596022102528
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_uuid RINCON_5CAAFDD0159601400
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_volume_LF 100
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_volume_Master 15
     2020-07-29 13:28:22   RINCON_5CAAFDD0159601400_volume_RF 100
     2020-07-29 13:28:24   ZoneInfo_CopyrightInfo © 2003-2019, Sonos, Inc. All rights reserved.
     2020-07-29 13:28:24   ZoneInfo_DisplaySoftwareVersion 12.0.3
     2020-07-29 13:28:24   ZoneInfo_ExtraInfo
     2020-07-29 13:28:24   ZoneInfo_Flags  0
     2020-07-29 13:28:24   ZoneInfo_HTAudioIn 0
     2020-07-29 13:28:24   ZoneInfo_HardwareVersion 1.25.1.6-2.2
     2020-07-29 13:28:24   ZoneInfo_IPAddress 192.168.178.65
     2020-07-29 13:28:24   ZoneInfo_MACAddress 5C:AA:FD:D0:15:96
     2020-07-29 13:28:24   ZoneInfo_SerialNumber 5C-AA-FD-D0-15-96:3
     2020-07-29 13:28:24   ZoneInfo_SoftwareVersion 58.1-79200
     2020-07-29 13:28:24   associatedWith  SonosBridge
     2020-07-29 13:28:23   attrTemplateVersion 20200718
     2020-07-29 13:28:23   control_command adv-command
     2020-07-29 13:28:23   control_input_cmd GetZoneInfo
     2020-07-29 13:28:23   control_input_reply ZoneInfo
     2020-07-29 13:46:41   coordinatorUuid RINCON_5CAAFDD0159601400
     2020-07-29 13:46:41   currentTrack_AlbumArtUri http://192.168.178.65:1400/getaa?s=1&u=x-sonosapi-stream:9479%3fsid%3d303%26flags%3d8224%26sn%3d7
     2020-07-29 13:46:41   currentTrack_Artist *** SWR3
     2020-07-29 13:46:41   currentTrack_ItemId -1
     2020-07-29 13:46:41   currentTrack_ParentId -1
     2020-07-29 13:46:41   currentTrack_ProtocolInfo sonos.com-http:*:*:*
     2020-07-29 13:46:41   currentTrack_Title x-sonosapi-stream:9479?sid=303&flags=8224&sn=7
     2020-07-29 13:46:41   currentTrack_TrackUri x-sonosapi-stream:9479?sid=303&flags=8224&sn=7
     2020-07-29 13:46:41   currentTrack_UpnpClass object.item
     2020-07-29 13:46:41   enqueuedMetadata_ItemId -1
     2020-07-29 13:46:41   enqueuedMetadata_ParentId -1
     2020-07-29 13:46:41   enqueuedMetadata_Title SWR3
     2020-07-29 13:46:41   enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
     2020-07-29 13:46:41   groupName       Büro
     2020-07-29 13:28:24   modelNumber     S17
     2020-07-29 13:46:41   mute            false
     2020-07-29 13:46:41   mute_LF         false
     2020-07-29 13:46:41   mute_RF         false
     2020-07-29 13:46:41   name            Büro
     2020-07-29 13:46:41   playmode        NORMAL
     2020-07-29 13:46:41   state           PLAYING
     2020-07-29 13:46:41   ts              1596023200644
     2020-07-29 13:46:41   uuid            RINCON_5CAAFDD0159601400
     2020-07-29 13:46:41   volume          15
     2020-07-29 13:46:41   volume_LF       100
     2020-07-29 13:46:41   volume_RF       100
Attributes:
   IODev      m2s
   alias      unknown
   icon       Sonos2mqtt_icon-S17
   jsonMap    volume_Master:volume mute_Master:mute transportState:state
   model      sonos2mqtt_speaker
   readingList sonos/RINCON_5CAAFDD0159601400:.* { json2nameValue($EVENT,'',$JSONMAP) }
sonos/RINCON_5CAAFDD0159601400/control:.* { json2nameValue($EVENT, 'control_', $JSONMAP) }
sonos/RINCON_5CAAFDD0159601400/ZoneInfo:.* { json2nameValue($EVENT, 'ZoneInfo_', $JSONMAP) }
   room       MQTT2_DEVICE
   setList    stop:noArg sonos/RINCON_5CAAFDD0159601400/control { "command": "stop" }
  play:noArg sonos/RINCON_5CAAFDD0159601400/control { "command": "play" }
  pause:noArg sonos/RINCON_5CAAFDD0159601400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_5CAAFDD0159601400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_5CAAFDD0159601400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_5CAAFDD0159601400/control { "command": "volumedown" }
  volume:slider,0,1,100 sonos/RINCON_5CAAFDD0159601400/control { "command": "volume", "input": $EVTPART1 }
  mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute"; qq(sonos/RINCON_5CAAFDD0159601400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_5CAAFDD0159601400/control { "command": "next" }
  previous:noArg sonos/RINCON_5CAAFDD0159601400/control { "command": "previous" }
  joinGroup:textField sonos/RINCON_5CAAFDD0159601400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_5CAAFDD0159601400","groupName","all"); qq(sonos/RINCON_5CAAFDD0159601400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_5CAAFDD0159601400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  playUri:textField {fhem("set $NAME setAVTUri $EVTPART1; sleep 1; set $NAME play")}
  input:Queue { my $value = $EVTPART1 eq "TV" ? "tv" : $EVTPART1 eq "Line_In" ? "line" : "queue"; qq(sonos/RINCON_5CAAFDD0159601400/control { "command": "switchto$value" } ) }
  notify:textField sonos/RINCON_5CAAFDD0159601400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_5CAAFDD0159601400/control $payload)}


3: Kinderzimmer (Sonos PlayBar S9) hier sind noch 2 Sonos Play:1 als Stereo dabei)
Internals:
   CFGFN     
   CID        RINCON_B8E93772BD5701400
   DEF        RINCON_B8E93772BD5701400
   DEVICETOPIC MQTT2_RINCON_B8E93772BD5701400
   FUUID      5f215f16-f33f-0a14-4197-ef024f7c1d0878af
   IODev      m2s
   LASTInputDev m2s
   MSGCNT     1
   NAME       MQTT2_RINCON_B8E93772BD5701400
   NR         69925
   STATE      PLAYING
   TYPE       MQTT2_DEVICE
   m2s_MSGCNT 1
   m2s_TIME   2020-07-29 13:35:54
   .attraggr:
   .attrminint:
   JSONMAP:
     mute_Master mute
     transportState state
     volume_Master volume
   READINGS:
     2020-07-29 13:35:51   RINCON_B8E93772BD5701400_coordinatorUuid RINCON_B8E93772BD5701400
     2020-07-29 13:35:51   RINCON_B8E93772BD5701400_groupName Kinderzimmer
     2020-07-29 13:35:51   RINCON_B8E93772BD5701400_mute_LF false
     2020-07-29 13:35:51   RINCON_B8E93772BD5701400_mute_Master false
     2020-07-29 13:35:51   RINCON_B8E93772BD5701400_mute_RF false
     2020-07-29 13:35:51   RINCON_B8E93772BD5701400_name Kinderzimmer
     2020-07-29 13:35:51   RINCON_B8E93772BD5701400_ts 1596022550574
     2020-07-29 13:35:51   RINCON_B8E93772BD5701400_uuid RINCON_B8E93772BD5701400
     2020-07-29 13:35:51   RINCON_B8E93772BD5701400_volume_LF 100
     2020-07-29 13:35:51   RINCON_B8E93772BD5701400_volume_Master 18
     2020-07-29 13:35:51   RINCON_B8E93772BD5701400_volume_RF 100
     2020-07-29 13:35:52   ZoneInfo_CopyrightInfo © 2003-2019, Sonos, Inc. All rights reserved.
     2020-07-29 13:35:52   ZoneInfo_DisplaySoftwareVersion 12.0.3
     2020-07-29 13:35:52   ZoneInfo_ExtraInfo OTP:
     2020-07-29 13:35:52   ZoneInfo_Flags  0
     2020-07-29 13:35:52   ZoneInfo_HTAudioIn 33554434
     2020-07-29 13:35:52   ZoneInfo_HardwareVersion 1.9.1.10-2.0
     2020-07-29 13:35:52   ZoneInfo_IPAddress 192.168.178.41
     2020-07-29 13:35:52   ZoneInfo_MACAddress B8:E9:37:72:BD:57
     2020-07-29 13:35:52   ZoneInfo_SerialNumber B8-E9-37-72-BD-57:3
     2020-07-29 13:35:52   ZoneInfo_SoftwareVersion 58.1-79200
     2020-07-29 13:35:52   associatedWith  SonosBridge
     2020-07-29 13:35:52   attrTemplateVersion 20200718
     2020-07-29 13:35:52   control_command adv-command
     2020-07-29 13:35:52   control_input_cmd GetZoneInfo
     2020-07-29 13:35:52   control_input_reply ZoneInfo
     2020-07-29 13:35:54   coordinatorUuid RINCON_B8E93772BD5701400
     2020-07-29 13:35:54   currentTrack_ItemId -1
     2020-07-29 13:35:54   currentTrack_ParentId -1
     2020-07-29 13:35:54   currentTrack_ProtocolInfo x-sonos-htastream:*:*:*
     2020-07-29 13:35:54   currentTrack_Title
     2020-07-29 13:35:54   currentTrack_TrackUri x-sonos-htastream:RINCON_B8E93772BD5701400:spdif
     2020-07-29 13:35:54   currentTrack_UpnpClass object.item
     2020-07-29 13:35:54   groupName       Kinderzimmer
     2020-07-29 13:35:54   mute            false
     2020-07-29 13:35:54   mute_LF         false
     2020-07-29 13:35:54   mute_RF         false
     2020-07-29 13:35:54   name            Kinderzimmer
     2020-07-29 13:35:54   playmode        NORMAL
     2020-07-29 13:35:54   state           PLAYING
     2020-07-29 13:35:54   ts              1596022554552
     2020-07-29 13:35:54   uuid            RINCON_B8E93772BD5701400
     2020-07-29 13:35:54   volume          18
     2020-07-29 13:35:54   volume_LF       100
     2020-07-29 13:35:54   volume_RF       100
Attributes:
   IODev      m2s
   alias      unknown
   icon       audio_volume_low
   jsonMap    volume_Master:volume mute_Master:mute transportState:state
   model      sonos2mqtt_speaker
   readingList sonos/RINCON_B8E93772BD5701400:.* { json2nameValue($EVENT,'',$JSONMAP) }
sonos/RINCON_B8E93772BD5701400/control:.* { json2nameValue($EVENT, 'control_', $JSONMAP) }
sonos/RINCON_B8E93772BD5701400/ZoneInfo:.* { json2nameValue($EVENT, 'ZoneInfo_', $JSONMAP) }
   room       MQTT2_DEVICE
   setList    stop:noArg sonos/RINCON_B8E93772BD5701400/control { "command": "stop" }
  play:noArg sonos/RINCON_B8E93772BD5701400/control { "command": "play" }
  pause:noArg sonos/RINCON_B8E93772BD5701400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_B8E93772BD5701400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_B8E93772BD5701400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_B8E93772BD5701400/control { "command": "volumedown" }
  volume:slider,0,1,100 sonos/RINCON_B8E93772BD5701400/control { "command": "volume", "input": $EVTPART1 }
  mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute"; qq(sonos/RINCON_B8E93772BD5701400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_B8E93772BD5701400/control { "command": "next" }
  previous:noArg sonos/RINCON_B8E93772BD5701400/control { "command": "previous" }
  joinGroup:textField sonos/RINCON_B8E93772BD5701400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_B8E93772BD5701400","groupName","all"); qq(sonos/RINCON_B8E93772BD5701400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_B8E93772BD5701400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  playUri:textField {fhem("set $NAME setAVTUri $EVTPART1; sleep 1; set $NAME play")}
  input:Queue { my $value = $EVTPART1 eq "TV" ? "tv" : $EVTPART1 eq "Line_In" ? "line" : "queue"; qq(sonos/RINCON_B8E93772BD5701400/control { "command": "switchto$value" } ) }
  notify:textField sonos/RINCON_B8E93772BD5701400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_B8E93772BD5701400/control $payload)}



Vielleicht kannst du damit etwas besser analysieren.

Gruß

Carlos
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 29 Juli 2020, 14:23:15
Hallo Carlos,

Dein m2s hat eventuell complex als autocreate?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: carlos am 29 Juli 2020, 14:32:51
Ja, hat er.
Verstehe, ist vielleicht besser wenn ich den auf simple setzte.
Probiere ich mal aus.

Edit: Habe es mit simple probiert und da sieht es gut aus.
Es wird alles richtig angelegt.

Vielleicht sollte man das in die Doku mit aufnehmen.

Gruß

Carlos
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 29 Juli 2020, 21:21:00
Heute ein kleines devStateIcon Update auf der letzten Version. Es beinhaltet einen leaveGroup Button für Player innerhalb einer Gruppe. Ist getestet und läuft gut.

{
my $groupname = ReadingsVal($name,"groupName","0");
my $sgroupname = (split(" ",ReadingsVal($name,"groupName","")))[0];
my $uuidtoname = "MQTT2_".ReadingsVal($name,"coordinatorUuid","0");
my $vol = ReadingsVal($name,"volume","");
my $img = ReadingsVal($name,"currentTrack_AlbumArtUri","");
my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...'; };
my $mystate = $name eq $uuidtoname ? ReadingsVal($name,"state","FEHLER") : ReadingsVal($uuidtoname,"state","");
my $bridgestate = ReadingsNum((devspec2array('model=sonos2mqtt_bridge'))[0],'connected',0);
my $amp = $bridgestate eq "0"
? "rot"
: $bridgestate eq "1"
? "gelb"
: "gruen";
my $playpic = $mystate eq "PLAYING"
? 'rc_PAUSE@red'
: $mystate eq "PAUSED_PLAYBACK"
? 'rc_PLAY@green'
: $mystate eq "STOPPED"
? 'rc_PLAY@green'
: $mystate eq "TRANSITIONING"
? 'rc_PLAY@blue'
: $mystate eq "set_next"
? 'rc_NEXT@blue'
: $mystate eq "set_previous"
? 'rc_PREVIOUS@blue'
: $mystate eq "set_volumeUp"
? 'rc_VOLUP@blue'
: $mystate eq "set_volumeDown"
? 'rc_VOLDOWN@blue'
: $mystate eq "set_mute"
? 'rc_MUTE@blue'
: $mystate;
my $mutecmd = ReadingsVal($name,"mute","0") eq "false"
? "true"
: "false";
my $mutepic = ReadingsVal($name,"mute","0") eq "false"
? 'rc_MUTE'
: 'rc_VOLUP';
my $show = "FEHLER";
my $currentTrack = $mystate eq "TRANSITIONING"
? "Puffern..."
: $trim30->(ReadingsVal($name,"currentTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"currentTrack_Title","FEHLER"));
my $nextTrack = $trim30->(ReadingsVal($name,"nextTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"nextTrack_Title","FEHLER"));
my $previouspic = 'rc_PREVIOUS';
my $nextpic = 'rc_NEXT';
my $voldownpic = 'rc_VOLDOWN';
my $voluppic = 'rc_VOLUP';
my $leavegrouppic = 'rc_LEFT';
my $showlg = ReadingsVal($name,"name","0") ne $groupname ? "<a href=\"/fhem?cmd.dummy=set $name leaveGroup&XHR=1\">".FW_makeImage($leavegrouppic)."</a>" : "";

if ($bridgestate ne "2") {
$show = " ".FW_makeImage("rc_BLANK")." ";}

elsif (($mystate eq "PLAYING")
|| ($mystate eq "TRANSITIONING" )
|| ($mystate eq "set_next" )
|| ($mystate eq "set_previous" )
|| ($mystate eq "set_volumeUp" )
|| ($mystate eq "set_volumeDown" )
|| ($mystate eq "set_mute" )) {

my $shownp = ReadingsVal($name,"name","0") eq $sgroupname ? "<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>" : "";

$show = "$showlg
<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>
$shownp
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>";

if (ReadingsVal($name,"name","0") eq $sgroupname) {
$show = ReadingsVal($name,"enqueuedMetadata_UpnpClass","FEHLER") ne "object.item.audioItem.audioBroadcast"
? "$show Aktueller Track: $currentTrack<br>Nächster Track: $nextTrack"
: "$show Radio: $currentTrack";}

elsif (ReadingsVal($name,"name","0") ne $groupname) {
$show = "$show
Master: $sgroupname";}
}
else {
$show = $name eq $uuidtoname
? "$showlg
<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>"
: "$showlg
<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a><br>Master: $sgroupname";}

"<div>
<table>
  <tr>
    <td><div style='display: inline-block; margin-right: 5px; border: 1px solid lightgray; height: 4.00em; width: 4.00em; background-image: url($img);background-size: contain;'></div>
</td>
    <td>".FW_makeImage("10px-kreis-".$amp)."
$show</td>
   </tr>
</table>
</div>"
}


Gruß,
87Insane
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 29 Juli 2020, 21:27:26
Zitat von: carlos am 29 Juli 2020, 14:32:51

Vielleicht sollte man das in die Doku mit aufnehmen.
Danke für die Bestätigung, habe ich in der Doku schon notiert ;)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 30 Juli 2020, 09:53:39
Moin 87insane,

Du kannst noch die "neutralisierte" Zeile für den Gruppenmeister von mir übernehmen:
my $uuidtoname = (devspec2array('DEF='.ReadingsVal($name,'coordinatorUuid','0')))[0];
Und bei der zusätzlichen Erkennung ob der TV Eingang aktiv ist fand ich mich auch nicht schlecht :)
    if (ReadingsVal($name,'name','') eq $sgroupname) {\
      $show = ReadingsVal($name,'currentTrack_TrackUri','') =~ 'spdif'\
     ? 'TV': ReadingsVal($name,'enqueuedMetadata_UpnpClass','FEHLER') ne 'object.item.audioItem.audioBroadcast'\
     ? "$show Aktueller Track: $currentTrack<br>Nächster Track: $nextTrack"\
     : "$show Radio: $currentTrack"}\


Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 30 Juli 2020, 10:13:48
Hey,

hatte das letzte genommen was ich gefunden hatte.. Hab auf der Grundlage weiter gemacht. Natürlich kann das rein :) - Habe ich also einen doch nicht ganz aktuellen Stand erwischt.
Würde das ganze am Ende noch ein wenig optimieren. Aber zuerst mal so weiter machen. Es wird sicher noch die eine oder andere Prüfung eingebaut werden müssen oder eine andere Weg fallen.

Habe aber noch ein paar Baustellen.

- Bisher gibt es keine sauber laufende Lösung für Gruppen (Master / Slave verhalten - TrackInfo usw).
- Ich hätte gerne in jedem Player anstelle von "joinGroup - Frei Textfeld", ein Dropdown Menu mit allen Player Namen drin (Also ein Menu aus allen existierenden Playern und angezeigt, soll der Name werden).
Wäre bei mir im Moment: Badezimmer, Wohnzimmer, Küche
- Direkte Aktualisierung vom Slave Player in FHEM Web. Das geht immer nur bei dem Player der auch Master ist, da Slave ja keine Readings mehr erhält.
Der erste und dritte Punkt könnte ggf. hier erschlagen werden: https://forum.fhem.de/index.php/topic,112737.0.html

Ach ja, ich möchte am liebsten KEINE notify/doif. Das habe ich ja schon öfter gesagt. Alles geht irgendwie immer auch ohne die kleinen Helfer. Ich habe (leider) schon öfter hier erlebt, man muss nur lang genug jammern und auf einmal geht es doch :-P
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 30 Juli 2020, 11:03:55
Naja die devStateIcon Entwicklung läuft quasi auseinander. Das zeigt mir ganz deutlich, dass sowas (wenn überhaupt) nur als Angebot ausgeliefert werden kann. Da wird es pro Anwender 3 Meinungen dazu geben ;)

Zur Gruppenauswahl ein Codeschnipsel (für die FHEM Kommandozeile):
{my @list = devspec2array('model=sonos2mqtt_speaker');;
my @arr = ();;
foreach (@list) { my $gn = (split(' ',ReadingsVal($_,'groupName','')))[0];;
  if (!grep(/$gn/, @arr)){push @arr,$gn}
  }
return join ',',@arr}
Muss man jetzt bloß in die setList bauen. Ich weiß, Du magst auch keine Arrays - das wird irgendwann eng :)

Als bekennender notiphobiker kannst Du doch mit dem Code aus meinen beiden notifys einfach eine Setup Routine mit Warteschleifen bauen.  ;D
Das war meine erste Variante der Entwicklung:
{my @list = devspec2array('model=sonos2mqtt_speaker');; foreach (@list) {...}}



Edit: geändert MQTT2_RINCON_.* > model=sonos2mqtt_speaker
Edit: smartmatch ersetzt

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 30 Juli 2020, 11:10:13
Aua.

Könntet ihr bitte möglichst folgendes vermeiden:
- namensbezogene Auswertungen (hatten wir schon; lieber über das readingList-Attribut auswerten)
- Smartmatch (das geht nicht mit allen Perl-Versionen und ich gehe davon aus, dass es mittelfristig wieder ausgebaut wird; ein Perl-Spezialist hatte mich mal gebeten, das aus RandomTimer auszubauen...).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 30 Juli 2020, 11:16:05
wobei wir uns auch geeinigt hatten das MQTT2_RINCON_.* legitim wäre :) habe es geändert.
hast Du für meinen Smartmatch Test eine Alternative? Ist nämlich so schön einfach :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 30 Juli 2020, 11:55:16
Legitim zu der Zeit des Anlegens der Devices. "Irgendwann" später dann nicht mehr, und hier ging es um devStateIcon.



Das mit der Prüfung sollte mit einem grep gehen, auf die Schnelle müßte eigentlich sowas wie https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/98_WeekdayTimer.pm#L1317 ein Anfang sein:
  push @newt, grep { $_ !~ m{\A$wp_name\b}xms } @t;Falls es etwas komplexer werden muss: https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/00_MYSENSORS.pm#L752 ff; das sollte das Verwenden von anonymen subs erlauben...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 30 Juli 2020, 14:51:51
Danke fürs Beispiel -hab es "unsmartmatched" ;)
Habe einem Syntax genommen den ich verstehe, mit deinem bekomme ich es nicht hin. Auf manchen Perl Syntax schau ich drauf, es gruselt mich und ich wende mich ab  :) aber jedesmal wird es besser.

Bei der Warnmeldung dachte ich mir schon man sollte nicht die Warnung abschalten (  no warnings 'experimental::smartmatch';) sondern der Code hat es seit Generationen von Perl nicht aus dem Experimentierstadium heraus geschafft - es wird seinen Grund haben.

Jetzt muss ich das zweite notify noch ändern. Ich teste das noch und geb Dir den Code fürs SVN

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 30 Juli 2020, 15:05:46
Zitat von: Otto123 am 30 Juli 2020, 14:51:51
Auf manchen Perl Syntax schau ich drauf, es gruselt mich und [...]
So ähnlich geht mir das auch immer; als ich das mit smartSleep in MySensors eingebaut habe (jetzt: https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/10_MYSENSORS_DEVICE.pm#L1095 ff), hatte ich auch oft das Gefühl, dass ich das nie hinbekomme, das war einfach zu abstrakt...
Na ja, es wird langsam weniger schlecht...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 30 Juli 2020, 15:46:18
@Beta-User Falls Du am SVN vorbeikommst :)
TV Model erweitert
smartmatch raus
Formatierung

sonos2mqtt_bridge_comfort
set DEVICE attrTemplate sonos2mqtt_bridge
defmod n_configSonos1 notify global:DEFINED.MQTT2_RINCON_[A-Z0-9]+ sleep 1;;\
set $EVTPART1 attrTemplate sonos2mqtt_speaker;;\
set $EVTPART1 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
defmod n_configSonos2 notify MQTT2_RINCON_[A-Z0-9]+:IPAddress:.* {\
  my @tv = ("S14","S11","S9");;\
  my $url="http://$EVTPART1:1400";;\
  my $xmltext = GetFileFromURL("$url/xml/device_description.xml");;\
  my ($mn)=$xmltext =~ /<modelNumber>(S[0-9]+)/;;\
  my ($img)=$xmltext =~ /<url>(.*)<\/url>/;;\
  my $icon="Sonos2mqtt_icon-$mn";;\
  my $setList=AttrVal($NAME,'setList','');;\
  fhem("setreading $NAME modelNumber $mn");;\
  fhem("\"wget -qO ./www/images/default/$icon.png $url$img\"");;\
  fhem("attr $NAME icon $icon;;sleep 4 WI;;set WEB rereadicons");;\
    if (grep(/$mn/, @tv)) {$setList=~s/input:Queue \{/input:Queue,TV \{/};;\
  $setList=~s/;;/;;;;/g;;\
  fhem("attr $NAME setList $setList")\
}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 30 Juli 2020, 16:04:21
...kommt bei Gelegenheit...

Sonst noch Wünsche?

[OT: falls jemand mit zigbee2mqtt hier mitliest und homeBridgeMapping für einen Taster oä. austesten mag: https://forum.fhem.de/index.php/topic,113224.0.html; vermutlich könnte man das ähnlich für Fernbedienungen usw. verwenden. Weiß nur nicht, ob das via attrTemplate überhaupt Sinn macht und wenn ja, in welcher Form bzw. ob man irgendwelche Vorbedingungen definieren sollte; Antwort ggf. bitte dort.]
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 30 Juli 2020, 22:44:19
Ich hab mal noch etwas versucht devStateIcon zu verstehen und etwas rumgebastelt:
etwas nach meinem Gusto Strukturiert...
leavegroup eingebaut
Laufschrift statt Einkürzung auf 30 Zeichen
kein currentTrack_Title wenn er nicht existiert (bei mir öfters bei Radio)

<marquee> wird als abgekündigt gehandelt - aber ich habe nichts vergleichbar einfaches gefunden. Tipps?

{
my $wpix = '250px';
my $groupname = ReadingsVal($name,'groupName','0');
my $sgroupname = (split(' ',ReadingsVal($name,'groupName','')))[0];
my $uuidtoname = (devspec2array('DEF='.ReadingsVal($name,'coordinatorUuid','0')))[0];
my $vol = ReadingsVal($name,'volume','');
my $img = ReadingsVal($name,'currentTrack_AlbumArtUri','');
my $mystate = $name eq $uuidtoname
  ? ReadingsVal($name,'state','FEHLER') : ReadingsVal($uuidtoname,'state','');
my $playpic = $mystate eq 'PLAYING'
  ? 'rc_PAUSE@red'    : $mystate eq 'PAUSED_PLAYBACK'
  ? 'rc_PLAY@green'   : $mystate eq 'STOPPED'
  ? 'rc_PLAY@green'   : $mystate eq 'TRANSITIONING'
  ? 'rc_PLAY@blue'    : $mystate eq 'set_next'
  ? 'rc_NEXT@blue'    : $mystate eq 'set_previous'
  ? 'rc_PREVIOUS@blue': $mystate eq 'set_volumeUp'
  ? 'rc_VOLUP@blue'   : $mystate eq 'set_volumeDown'
  ? 'rc_VOLDOWN@blue' : $mystate eq 'set_mute'
  ? 'rc_MUTE@blue'    : 'rc_PLAY@yellow';
my $mutecmd = ReadingsVal($name,'mute','0') eq 'false'?'on':'off';
my $mutepic = $mutecmd eq 'on'?'rc_MUTE':'rc_VOLUP';
my $show = 'FEHLER';
my $currentTrack_Artist = ReadingsVal($name,'currentTrack_Artist','FEHLER');
my $currentTrack_Title = ReadingsVal($name,'currentTrack_Title','FEHLER');
if ($currentTrack_Title =~ 'x-sonosapi-stream:'){$currentTrack_Title=''};
my $currentTrack = $mystate eq 'TRANSITIONING'
  ? 'Puffern...' : $currentTrack_Artist.' - '.$currentTrack_Title;
my $nextTrack_Artist = ReadingsVal($name,'nextTrack_Artist','FEHLER');
my $nextTrack_Title = ReadingsVal($name,'nextTrack_Title','FEHLER');
my $nextTrack = $nextTrack_Artist.' - '.$nextTrack_Title;
my $previouspic = 'rc_PREVIOUS';
my $nextpic = 'rc_NEXT';
my $voldownpic = 'rc_VOLDOWN';
my $voluppic = 'rc_VOLUP';
my $leavegrouppic = 'rc_LEFT';
my $showlg = ReadingsVal($name,"name","0") ne $groupname ? "<a href=\"/fhem?cmd.dummy=set $name leaveGroup&XHR=1\">".FW_makeImage($leavegrouppic)."</a>" : "";
if (($mystate eq 'PLAYING')
  || ($mystate eq 'TRANSITIONING' )
  || ($mystate eq 'set_next' )
  || ($mystate eq 'set_previous' )
  || ($mystate eq 'set_volumeUp' )
  || ($mystate eq 'set_volumeDown' )
  || ($mystate eq 'set_mute' )) {
    my $shownp = ReadingsVal($name,'name','') eq $sgroupname
    ? "<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>
       <a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>" : ""; 
    $show = "$showlg <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>
    <a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>
    $shownp
    <a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>";
 
    if (ReadingsVal($name,'name','') eq $sgroupname) {
      $show = ReadingsVal($name,'currentTrack_TrackUri','') =~ 'spdif'
      ? 'TV': ReadingsVal($name,'enqueuedMetadata_UpnpClass','FEHLER') ne 'object.item.audioItem.audioBroadcast'
      ? "$show<marquee style='width: $wpix'>Aktueller Track: $currentTrack<br>Nächster Track: $nextTrack</marquee>"
      : "$show<marquee style='width: $wpix'>Radio: $currentTrack</marquee>"
    }
    elsif (ReadingsVal($name,'name','') ne $groupname) {
      $show = "$show Master: $sgroupname"}
    }
    else {
      $show = $name eq $uuidtoname
      ? "$showlg <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>"
      : "$showlg <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a><br>Master: $sgroupname"
    }
  "<div>
   <table>
     <tr>
       <td><div style='display: inline-block; margin-right: 5px; border: 1px solid lightgray;
              height: 4.00em; width: 4.00em; background-image: url($img); background-size: contain;'></div></td>
       <td>$show</td>
     </tr>
   </table>
   </div>"
}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 31 Juli 2020, 09:24:59
Guten Morgen,

ZitatdevStateIcon Entwicklung läuft quasi auseinander
Naja ich bin aktuell nur nicht so schnell wie ihr ^^ - Bemühe mich hinterher zu kommen. Lauftext ist auf jeden Fall geiler!

Zitatkein Next Track wenn er nicht existiert
War doch bei mir auch schon drin...

Das jemand mit etwas mehr Wissen über den Quellcode schaut und diesen anpasst finde ich gut. So lerne ich auch was! Hatte die Veränderungen auch im letzten Code schon bemerkt aber die waren gut und logisch. Ich selber hätte eben erst ganz fertig gemacht und dann nochmal bereinigt. Mich kostet es vermutlich auch etwas mehr Zeit sowas zu bauen, da ich eben kein Programmierer bin und mich immer Stück für Stück weiter rein fuchsen muss.

Ja, ich mag keine Arrays. Aber ich komme nicht dran vorbei. Das ist mir klar. Aber dafür gibt es euch ja.. So lerne ich das zwangsläufig. Nur weil ich sie nicht mag, heißt es ja nicht das sie hier keinen Sinn machen.

Danke schon mal für die ganzen Ideen und Code Beispiele.

Bisher habe ich nicht weiter testen können mit rL und dem rauß filtern. Das wird ja quasi auch etwas neben diesem Thread bearbeitet.

Bevor ich aber Zeit verschwende...
- Was ist aus Sicht von Euch wirklich der beste Weg dafür?
- Was haben wir als Ziel?

Meine Ziele hatte ich oben kurz aufgeschlüsselt. Habt ihr noch weitere?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 31 Juli 2020, 10:13:25
Zitat von: Otto123 am 30 Juli 2020, 15:46:18
@Beta-User Falls Du am SVN vorbeikommst :)
Diesen Stand habe ich jetzt mal eingecheckt.

Wie wollen wir es jetzt mit den devStateIcon halten? Separates myUtils-file mit passendem Code, das ganze ggf. in package und der einfachen Option, zwischen verschiedenen Varianten zu tauschen (über einen Parameter?)? Das würde mMn. dann Sinn machen, wenn es mehr als 2 Varianten geben soll oder man z.B. für diverse Modell-Varianten unterschiedliche Ergebnisse haben will.

Oder lieber "nur" den "erweiterten" Code direkt als 2. Variante/2. template anbieten und "gut ist"? (Ggf. mit Link auf diesen Thread oder das Wiki zum selber weiterbauen?)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: WumpE am 31 Juli 2020, 10:58:35
grüße in die runde,

ich lese auch schon eine geraume zeit mit und finde es klasse, das ihr das mit den Templates voran treibt.

kurz zu meinem setup:
ich habe s2m als DockerContainer seit ca 6 Monaten in Betrieb. Dazu EMQX als mqtt Broker in nem DockerContainer und FHEM läuft auch im Docker.

im FHEM habe ich dann ein MQTT2_CLIENT device , der die Verbindung zum Broker aufbaut.
s2m wurde dann jeder Player als MQTT2_DEVICE angelegt, welcher auch das Topic sonos/connection beherbergt.

Diese konstelation läuft seit 6 monaten fehlerfrei, ohne die lästigen verbindungsfehler mit dem nativen sonos-modul.

nun habe ich mal nen bisl mit den attrTemplates für s2m rumgespielt und möchte euch meine erkenntnisse mitteilen:

1. Ich würde den transportState nicht auf den state mappen, da der state auch kurzzeitig den Befehlsstate annimmt. brigt unschöne nebeneffekte wenn man logiken drauf laufen hat!
2. Das DevStateIcon stand "29 Juli 2020, 21:21:00" funktioniert nicht out of the box, selbst wenn man die bridge aus dem Template s2m bridge_comfort anlegt stand "27 Juli 2020". Fehler bei $bridgestate und bei split groups. auch s2m_bridge und die speaker per s2m_speaker, erzeugen dasselbe fehlerbild. (scheinbar weil die readings nicht existieren, wenn man noch keine gruppen gebildet hat, beim bridgestate konnte ich den fehler noch nicht herausfinden, da steht bei mir nen connected = 2)
3. das devstateicon würde ich nicht über das template mit ausliefern, der gedanke über ne seperate utils.pm ist glaub ausreichend. ich denke das viele  fhem nur als datensammler und logikschicht benutzen, für ne ordentliche visu, gibts andere tools.

grüße und schönes wochenende
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 31 Juli 2020, 11:43:13
Zu 1) vermutlich meinst du set_123 ... Das wären die setlist Einträge. War bisher auch gewollt. Dafür sind nur noch nicht alle Dinge angepasst.

Zu 2) bei mir ist es so, dass ich meist einmal den Dienst neu starten muss wenn sowas passiert. Generell sollte es so laufen. Da hilft aber ggf ein list des Gerätes.

Zu 3) devstateicon wird fast immer mit gegeben. Ansonsten hättest du einen nackten Player. Wer ein anderes will, kann das anpassen oder einfach löschen. An sich ist das ja nice to have. So sieht jemand der ggf nicht so tief drin steckt, wie es gehen könnte.

Danke für dein Feedback und dein Lob an die Gemeinde :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 31 Juli 2020, 12:20:32
Naja, mMn ist ein nackter Player besser als ein devStateIcon was nicht funktioniert: je komplizierter umso mehr besteht genau diese Gefahr.
Deswegen nur die simple Variante aus #390 oder so etwas in der Art ausliefern. Der Rest ... irgendwie anders später...
@WumpE
Zu 2. ist klar, hab ich ja auch schon gesagt
Zu 3. Zustimmung

@87insane
Sorry, ich meinte currentTrack_Title und nicht next_track - habe es in meinem Post korrigiert.

Ich habe heute noch ein anders Experiment angestoßen: Die Favoriten lesbar auslesen :) Das hat mir im Sonos Modul von Reiner auch irgendwie immer gefehlt oder ich habe es nicht verstanden.

Meine Codeschnipsel erzeugen ein Sammeldevice (ob das der richtige Weg ist weiß ich noch nicht genau):
Durch die Abfrage eines Players entsteht dort ein Reading mit den Favoriten. Siehe auch hier https://svrooij.io/sonos2mqtt/control/browse.html
defmod SonosControl MQTT2_DEVICE
attr SonosControl IODev mqtt2s
attr SonosControl readingList sonos/RINCON_([0-9A-Z]+)/Reply:.* Replykomplett
attr SonosControl room MQTT2_DEVICE

set alias=Büro x_raw_payload {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Reply"}}

das kann man abfragen, z.B. einen bestimmten Namen suchen (ich weiß, das ist so alles Fehleranfällig - aber ich bin erstmal froh json geparsed zu haben - Danke  (https://forum.fhem.de/index.php?topic=73329.0)):
{
use JSON;;
my $s = ReadingsVal('SonosControl','Replykomplett','');;
my $decoded = decode_json($s);;
my @arr  = @{$decoded->{'Result'}};;
foreach (@arr) {if ($_->{'Title'} =~ /Deutschlandfunk Kultur RP/){return $_->{'TrackUri'} }} ;;
}


Damit kann man dann auch einfach in der FHEM Kommandozeile mit set magic testen (beachte die zusätzlichen () die Zeilenumbrüche stören nicht) :)
set alias=Arbeitszimmer playUri {(
use JSON;;
my $s = ReadingsVal('SonosControl','Replykomplett','');;
my $decoded = decode_json($s);;
my @arr  = @{$decoded->{'Result'}};;
foreach (@arr) {if ($_->{'Title'} =~ /Deutschlandfunk Kultur RP/){return $_->{'TrackUri'} }} ;;
)}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 31 Juli 2020, 12:23:16
Zitat von: Beta-User am 31 Juli 2020, 10:13:25
Diesen Stand habe ich jetzt mal eingecheckt.
Danke sieht glaube ich gut aus :) #390 hast Du mit eingebaut ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 31 Juli 2020, 12:59:39
Zitat von: Otto123 am 31 Juli 2020, 12:23:16
Danke sieht glaube ich gut aus :) #390 hast Du mit eingebaut ;)
...hatte wie üblich etwas gesammelt und dann eben irgendwann eingecheckt; vermutlich, weil ich germerkt hatte, dass zum einen überhaupt erst mal irgendein devStateIcon wohl Sinn macht, und zum anderen, dass ich smartmatch zuerst übersehen hatte, und zu guter Letzt wollte ich einen Merker haben für das (völlig unabhängige) homebridgemapping-Thema von hier (https://forum.fhem.de/index.php/topic,113224.msg1075311.html#msg1075311)...

Generell wäre es für mich aber einfacher, wenn hin und wieder alles im Zusammenhang käme ;) . Dann müßte ich nicht (potentiell fehleranfällig) raten bzw. puzzlen...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 31 Juli 2020, 14:23:56
Bin am neu installieren/üben, immer noch am Test Pi.

Was das starten mit pm2 angeht steh ich immer noch auf dem Schlauch.

Wo nehm ich denn die Einstellungen vor mit denen pm2 starten soll ?

In der config.js in lib, klappt nämlich nicht ?

Oder muss ich eine config.json unter /data/config.json selbst anlegen, wo überschreibe ich dann CONFIG_PATH beim einstellen ?

Gruß

Thomas

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 31 Juli 2020, 15:00:07
Hallo Thomas,

habe ich ganz unten dokumentiert
ZitatNicht einfach default
Hat man den MQTT2_SERVER anders definiert, nicht lokal bzw. mit allowed abgesichert, muss beim Start von sonos2mqtt der Parameter --mqtt übergeben werden.
Dem pm2 Befehl folgenden durch die Angabe "--" die weiteren Parameter für sonos2mqtt.
"pm2 start sonos2mqtt -- --mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800"
Mit dem Parameter --prefix könnte man den Basistopic setzen (default: sonos).

Liest sich vielleicht schwierig aber nach pm2 start sonos2mqtt -- kommen ab hier die ganz normalen sonos2mqtt Parameter.

Was fehlt Dir noch?

Oder meinst Du pm2 an sich? Das starte ich einfach in FHEM, dass läuft prima.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 31 Juli 2020, 15:22:55
Danke, das wars. Das steht aber noch nicht lange da mein ich  :P

Alles gut, das starten klappt so auch aus FHEM heraus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 31 Juli 2020, 15:31:50
Sicher nicht wichtig würds aber trotzdem gerne rückgängig machen, kannst du mir bitte noch sagen was per default in lib/config.js an der rot markierten Stelle in mqtt steht, den Eintrag hatte ich geändert.

Zitat...
const yargs_1 = __importDefault(require("yargs"));
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const static_logger_1 = require("./static-logger");
const defaultConfig = {
    mqtt: 'mqtt://bla:bla@192.168.188.67:1884',
    prefix: 'sonos',
    distinct: false,
    discovery: true,
    discoveryprefix: 'homeassistant',
    log: 'information',
    friendlynames: 'name'
}; ...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 31 Juli 2020, 16:44:54
const defaultConfig = {
    mqtt: 'mqtt://127.0.0.1',
    prefix: 'sonos',
    distinct: false,
    discovery: true,
    discoveryprefix: 'homeassistant',
    log: 'information',
    friendlynames: 'name'
};


Ich hatte diese Erkenntnis mit pm2 und dem -- irgendwie vor Wochen. Ich behaupte seit dem steht das da :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 31 Juli 2020, 19:23:59
Zitatset alias=Büro x_raw_payload {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Reply"}}

statt setter geht auch ein getter.

defmod SonosControl MQTT2_DEVICE
attr SonosControl IODev m2s
attr SonosControl getList Favorites:noArg Replykomplett sonos/RINCON_000E58F7F67C01400/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Reply"}}
attr SonosControl readingList sonos/RINCON_([0-9A-Z]+)/Reply:.* Replykomplett
attr SonosControl room MQTT2_DEVICE


Ich weiß nicht ob das so korrekt definiert ist, es kommt aber im Dialogfeld der Wert des Reading Replykomplett zurück (kein timeout) und das Reading aktualisiert sich auch gleich.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 01 August 2020, 09:14:09
Zitat von: Otto123 am 31 Juli 2020, 12:20:32
Naja, mMn ist ein nackter Player besser als ein devStateIcon was nicht funktioniert: je komplizierter umso mehr besteht genau diese Gefahr.
Deswegen nur die simple Variante aus #390 oder so etwas in der Art ausliefern. Der Rest ... irgendwie anders später...
@WumpE
Zu 2. ist klar, hab ich ja auch schon gesagt
Zu 3. Zustimmung

@87insane
Sorry, ich meinte currentTrack_Title und nicht next_track - habe es in meinem Post korrigiert.

Ich habe heute noch ein anders Experiment angestoßen: Die Favoriten lesbar auslesen :) Das hat mir im Sonos Modul von Reiner auch irgendwie immer gefehlt oder ich habe es nicht verstanden.

Meine Codeschnipsel erzeugen ein Sammeldevice (ob das der richtige Weg ist weiß ich noch nicht genau):
Durch die Abfrage eines Players entsteht dort ein Reading mit den Favoriten. Siehe auch hier https://svrooij.io/sonos2mqtt/control/browse.html
defmod SonosControl MQTT2_DEVICE
attr SonosControl IODev mqtt2s
attr SonosControl readingList sonos/RINCON_([0-9A-Z]+)/Reply:.* Replykomplett
attr SonosControl room MQTT2_DEVICE

set alias=Büro x_raw_payload {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Reply"}}

das kann man abfragen, z.B. einen bestimmten Namen suchen (ich weiß, das ist so alles Fehleranfällig - aber ich bin erstmal froh json geparsed zu haben - Danke  (https://forum.fhem.de/index.php?topic=73329.0)):
{
use JSON;;
my $s = ReadingsVal('SonosControl','Replykomplett','');;
my $decoded = decode_json($s);;
my @arr  = @{$decoded->{'Result'}};;
foreach (@arr) {if ($_->{'Title'} =~ /Deutschlandfunk Kultur RP/){return $_->{'TrackUri'} }} ;;
}


Damit kann man dann auch einfach in der FHEM Kommandozeile mit set magic testen (beachte die zusätzlichen () die Zeilenumbrüche stören nicht) :)
set alias=Arbeitszimmer playUri {(
use JSON;;
my $s = ReadingsVal('SonosControl','Replykomplett','');;
my $decoded = decode_json($s);;
my @arr  = @{$decoded->{'Result'}};;
foreach (@arr) {if ($_->{'Title'} =~ /Deutschlandfunk Kultur RP/){return $_->{'TrackUri'} }} ;;
)}


Sehe das mit der Funktion genau so. Aber es ist hier ja auch noch nix komplett fertig. Es funktioniert alles in der Konstellation wie es zu dem Zeitpunkt gepostet wurde. Wir hatten aber x Lösungen die interessant waren und zur lösung bei getragen haben.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 August 2020, 12:05:42
Hallo 87insane,

das sehe ich nicht so: Aus meiner Sicht ist der jetzige Stand der drei Templates zu sonos2mqtt in sich konsistent, fertig und so von jedermann verwendbar.
Den würde ich als Basis setzen, bugfixing betreiben und erstmal so lassen.
Alle weiteren Posts werde ich immer mit diesem Stand testen.
Weitere Entwicklungen kann man ja zunächst immer als Veränderung dieses Standes posten. Man könnte sogar Templates dazu machen.

Ich übertrage noch die Doku, die jetzt nur aktuell in meinem Blog steht, wie schon abgesprochen ins Wiki.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 01 August 2020, 12:49:15
Konsistent mag es sein. Aber ich glaube da geht noch was und auch das in der rL noch was passiert und somit auch eine große Änderung an devstateicon. Klar läuft das so erstmal alles. Aber du baust zb noch Funktionen aus und ich bastel die so gut es geht mit in devstateicon. Will damit nur sagen das man sich nicht wundern muss, wenn hier "test" Versionen eingestellt werden, diese ggf eben nicht zu 100% laufen oder, wie ich selber schon lernen durfte, side effect nicht sofort auffallen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 August 2020, 13:23:32
@Beta-User bugfixing  :-X
Sorry in meinem Post # 412 hat sich der Semikolon Fehler eingeschlichen. (das ist wirklich hart ;) )
sonos2mqtt_bridge_comfort
set DEVICE attrTemplate sonos2mqtt_bridge
define n_configSonos1 notify global:DEFINED.MQTT2_RINCON_[A-Z0-9]+ sleep 1;\
  set $EVTPART1 attrTemplate sonos2mqtt_speaker;\
  set $EVTPART1 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
define n_configSonos2 notify MQTT2_RINCON_[A-Z0-9]+:IPAddress:.* {\
  my @tv = ("S14","S11","S9");\
  my $url="http://$EVTPART1:1400";\
  my $xmltext = GetFileFromURL("$url/xml/device_description.xml");\
  my ($mn)=$xmltext =~ /<modelNumber>(S[0-9]+)/;\
  my ($img)=$xmltext =~ /<url>(.*)<\/url>/;\
  my $icon="Sonos2mqtt_icon-$mn";\
  my $setList=AttrVal($NAME,'setList','');\
  fhem("setreading $NAME modelNumber $mn");\
  fhem("\"wget -qO ./www/images/default/$icon.png $url$img\"");\
  fhem("attr $NAME icon $icon;sleep 4 WI;set WEB rereadicons");\
  if (grep(/$mn/, @tv)) {$setList=~s/input:Queue \{/input:Queue,TV \{/};\
  $setList=~s/;/;;/g;\
  fhem("attr $NAME setList $setList")\
}

Kannst Du das bitte ändern?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: PatrickR am 01 August 2020, 14:36:24
Mahlzeit!

Beschäftige mich aktuell intensiv mit sonos2mqtt, um meine Freezes loszuwerden. Habe aktuell leider das Problem, dass sonos2mqtt keine Events mehr sendet, wenn sich die Topologie ändert (mein Connect wird bspw. regelmäßig aus- und eigeschaltet, damit er nicht heizt, wenn er nicht benötigt wird.) Habe auch eine Issue erstellt. Hat jemand von Euch vielleicht ein ähnliches Problem und einen Workaround gefunden?

Patrick
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 August 2020, 14:58:44
Hallo Patrick,

ja ich habe so etwas ähnliches. Ich habe aber bisher den Eindruck, es hat nicht nur was mit dem Player zu tun der kommt und geht sondern es tritt bei oder in Kombination mit Gruppenänderung über sonos2mqtt  auf?

Ich habe das Gefühl, dass Problem tritt auf wenn man ein set ... playUri an einen Player sendet der einen Master hat. Der Player fliegt in dem Moment aus der Gruppe. Danach gibt es das Problem mit Events für Topologie Änderungen.

Aber ich habe das noch nicht so weit untersucht, das ist bisher ein "Bauchgefühl"

Nur Player aus und zwei Stunden wieder an funktioniert.
Edit: Nein funktioniert aktuell nicht - gerade probiert player war aus, angemacht in sonos2mqtt wird die topologie nicht aktualisiert :(
Ich dachte das hat schon funktioniert  ???

Ein pm2 restart sonos2mqtt behebt das Problem in jedem Fall.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 01 August 2020, 15:32:57
Zitat von: Otto123 am 01 August 2020, 13:23:32
Kannst Du das bitte ändern?
Gerne, done!
($light@shelly/tasmota ist bei der Gelegenheit auch vollständig rausgeflogen).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 01 August 2020, 22:11:18
Habs geschafft aus dem Json
{"Result":[{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s296020q.png","Title":"011.FM-NonStop60s","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/26","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://dtu8ldmaopof3.cloudfront.net/i/https:%2F%2Fderpimagecache.s3.amazonaws.com%2Fimage%2F475_288x162_2020-01-22-10-30-00-920.png_180.jpg","Title":"1A Deutsche Hits","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/41","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:rpde_svc_475?sid=232&flags=32&sn=4","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://dtu8ldmaopof3.cloudfront.net/i/https:%2F%2Fderpimagecache.s3.amazonaws.com%2Fimage%2F1944_288x162_2019-02-12-13-40-09-357.png_640.jpg","Title":"COSMO Chillout","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/30","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s20295/images/logoq.png","Title":"DASDING 92.5 (Euro-Hits)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/34","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s76488?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s84548/images/logoq.jpg","Title":"die neue welle 101.8 (Rock)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/39","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s84548?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s65628q.png","Title":"FM نجوم 100.6 (Arabisch)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/29","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s65628?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"Hitradio Ö3 99.9 (Österreichisch)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/37","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s8007?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"Hörbücher","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/32","ParentId":"FV:2","TrackUri":"x-rincon-playlist:RINCON_000E58F7F67C01400#S://192.168.188.26/OwnMusic/Hörbücher","ProtocolInfo":"x-rincon-playlist:*:*:*"},{"Title":"Ordner","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/31","ParentId":"FV:2"},{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s97066q.png","Title":"PsyRadioChillout","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/15","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"Tony Rebel","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/28","ParentId":"FV:2","TrackUri":"undefined"}],"NumberReturned":11,"TotalMatches":11,"UpdateID":1}


welcher von einem sonos/RINCON_000E58F7F67C01400/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Reply"}} zurückkommt, die Favoritennamen und dazugehörigen TrackUris in einer sortierten Liste jeweils in eigene Readings zu schreiben.

Sortiert heißt beide Listen sind gleich sortiert, am Beispiel unten steht im Reply_Favorites Reading 1A Deutsche Hits an Position 3 der Liste, die zugehörige TrackUri steht dann auch an dritter Position von Reply_TrackUris.

Zum einfachen nachvollziehen empfiehlt sich erstmal in dem push {push (@a, "$value")}} $key mit reinzunehmen, zu schauen was passiert und dann das my @s = sort @a; rauszunehmen um zu sehen was es bedeutet eine unsortierte Liste zu haben.

defmod SonosControl MQTT2_DEVICE
attr SonosControl IODev m2s
attr SonosControl getList Favorites:noArg Reply_Favorites sonos/RINCON_000E58F7F67C01400/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Reply"}}\

attr SonosControl readingList sonos/RINCON_([0-9A-Z]+)/Reply:.* { json2nameValue($EVENT,'',$JSONMAP,'TrackUri')}\
sonos/RINCON_([0-9A-Z]+)/Reply:.* { json2nameValue($EVENT,'',$JSONMAP,'Title')}\
sonos/RINCON_([0-9A-Z]+)/Reply:.* {my $werte = json2nameValue($EVENT);;my @a =0;; while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._Title,g){push (@a, "$value")}};;my @s = sort @a;; my $g =join (',',@s);;{"Reply_Favorites"=>$g}}\
sonos/RINCON_([0-9A-Z]+)/Reply:.* {my $werte = json2nameValue($EVENT);;my @a =0;; while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._TrackUri,g){push (@a, "$value")}};;my @s = sort @a;;;; my $g =join (',',@s);;{"Reply_TrackUris"=>$g}}
attr SonosControl room MQTT2_DEVICE
attr SonosControl setList playUri:textField {fhem("set $NAME setAVTUri $EVTPART1;; sleep 1;; set $NAME play")}\
setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
StartRadio:select,{ "1,2,3";;}

setstate SonosControl play
setstate SonosControl 2020-08-01 21:11:55 Reply_Favorites 0,011.FM-NonStop60s,1A Deutsche Hits,COSMO Chillout,DASDING 92.5 (Euro-Hits),FM نجوم 100.6 (Arabisch),Hitradio Ö3 99.9 (Österreichisch),Hörbücher,Ordner,die neue welle 101.8 (Rock)
setstate SonosControl 2020-08-01 21:11:55 Reply_TrackUris 0,x-rincon-playlist:RINCON_000E58F7F67C01400#S://192.168.188.26/OwnMusic/Hörbücher,x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4,x-sonosapi-stream:rpde_svc_475?sid=232&flags=32&sn=4,x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0,x-sonosapi-stream:s65628?sid=254&flags=8224&sn=0,x-sonosapi-stream:s76488?sid=254&flags=8224&sn=0,x-sonosapi-stream:s8007?sid=254&flags=8224&sn=0,x-sonosapi-stream:s84548?sid=254&flags=8224&sn=0
setstate SonosControl 2020-08-01 21:11:55 Result_10_Title PsyRadioChillout
setstate SonosControl 2020-08-01 21:11:56 Result_10_TrackUri x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0
setstate SonosControl 2020-08-01 21:11:55 Result_11_Title Tony Rebel
setstate SonosControl 2020-08-01 21:11:56 Result_11_TrackUri undefined
setstate SonosControl 2020-08-01 21:11:55 Result_1_Title 011.FM-NonStop60s
setstate SonosControl 2020-08-01 21:11:56 Result_1_TrackUri x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0
setstate SonosControl 2020-08-01 21:11:55 Result_2_Title 1A Deutsche Hits
setstate SonosControl 2020-08-01 21:11:56 Result_2_TrackUri x-sonosapi-stream:rpde_svc_475?sid=232&flags=32&sn=4
setstate SonosControl 2020-08-01 21:11:55 Result_3_Title COSMO Chillout
setstate SonosControl 2020-08-01 21:11:56 Result_3_TrackUri x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4
setstate SonosControl 2020-08-01 21:11:55 Result_4_Title DASDING 92.5 (Euro-Hits)
setstate SonosControl 2020-08-01 21:11:56 Result_4_TrackUri x-sonosapi-stream:s76488?sid=254&flags=8224&sn=0
setstate SonosControl 2020-08-01 21:11:55 Result_5_Title die neue welle 101.8 (Rock)
setstate SonosControl 2020-08-01 21:11:56 Result_5_TrackUri x-sonosapi-stream:s84548?sid=254&flags=8224&sn=0
setstate SonosControl 2020-08-01 21:11:55 Result_6_Title FM نجوم 100.6 (Arabisch)
setstate SonosControl 2020-08-01 21:11:56 Result_6_TrackUri x-sonosapi-stream:s65628?sid=254&flags=8224&sn=0
setstate SonosControl 2020-08-01 21:11:55 Result_7_Title Hitradio Ö3 99.9 (Österreichisch)
setstate SonosControl 2020-08-01 21:11:56 Result_7_TrackUri x-sonosapi-stream:s8007?sid=254&flags=8224&sn=0
setstate SonosControl 2020-08-01 21:11:55 Result_8_Title Hörbücher
setstate SonosControl 2020-08-01 21:11:56 Result_8_TrackUri x-rincon-playlist:RINCON_000E58F7F67C01400#S://192.168.188.26/OwnMusic/Hörbücher
setstate SonosControl 2020-08-01 21:11:55 Result_9_Title Ordner



attr SonosControl readingList sonos/RINCON_([0-9A-Z]+)/Reply:.* { json2nameValue($EVENT,'',$JSONMAP,'TrackUri')}\
sonos/RINCON_([0-9A-Z]+)/Reply:.* { json2nameValue($EVENT,'',$JSONMAP,'Title')}\


Ist nur zum Test was die neue option Filter daraus macht.

Mein Gedanke ist jetzt einen setter  (entsprechend dem setter playUri) zu erstellen bspw. StartFavorit der mit Hilfe des select widget alle Favoritennamen zur Verfügung stellt, die in Reply_Favorites stehen.
Mit Auswahl eines Favoritennamen soll geprüft an welcher Position der Favorit in der Liste von Reply_Favorites steht und der setter mit der zugehörigen Position aus Reply_TrackUris ausgeführt werden.

Meine erste bescheidene Frage zum ersten Schritt dahin, wie bekomme ich im ersten Schritt die Liste aus ReadingsVal($NAME,"Reply_Favorites","unknown") select angehangen, bekomm es nicht hin ?

Sowas oder auch exotischere Varianten klappen bisher nicht:

StartRadio:select,{ ReadingsVal($NAME,"Reply_Favorites","unknown") }
StartRadio:{my $rf = ReadingsVal("SonosControl","Reply_Favorites","unknown");"select,".$rf." bla"}
StartRadio:{"select,".$rf." bla";my $rf = ReadingsVal("SonosControl","Reply_Favorites","unknown");}
StartRadio:select,{ "1,2,3";}


edit:
Auch nicht mit setList komplett in Perl:
{my $rf = ReadingsVal("SonosControl","Reply_Favorites","unknown");;"StartRadio:select,".$rf." bla";;}

Einen Schritt weiter, es kann ja nicht klappen mit Leereichen in den Favoriten.

Aber auch zum Test mit
setstate SonosControl 2020-08-02 14:11:58 test 1,2,3
klappts nicht
{my $rf = ReadingsVal("SonosControl","test","unknown");"StartRadio:select,".$rf." bla";}
StartRadio:select,{my $rf = ReadingsVal("SonosControl","test","unknown");$rf." bla";}


Lösung hier (https://forum.fhem.de/index.php/topic,88932.msg814363.html#msg814363) gefunden.
So klappts schonmal aus der Befehlszeile (dachte wenn man ein Attribute setzt gibts ein rotes ?, ist hier nicht so)

{my $rf = ReadingsVal("SonosControl","test","unknown");;fhem('attr SonosControl setList StartRadio:select,'.$rf." bla");;}

So ersetzt man erstmal einmal die setList aus der Befehlszeile, es braucht noch eine Lösung das die Zeile StartRadio in setList nicht übernommen wird/zuvor gelöscht wird wenn zuvor vorhanden (doch alles mit rotem ?):

{my $rf = ReadingsVal("SonosControl","Reply_Favorites","unknown");;$rf =~ s/ /./g;;my $sl= AttrVal("SonosControl","setList","");; $sl =~ s/;/;;/g;;fhem('attr SonosControl setList StartRadio:select,'.$rf.' bla'."\n".$sl)}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 03 August 2020, 10:01:10
Moin,

Deine letzte Frage habe ich schon mal gelöst. Meine Variante zur Erweiterung der setList war ja so
{my @list = devspec2array('MQTT2_RINCON_.*');;\
foreach (@list) {\
   my $setList=AttrVal($_,'setList','');;\
   my @arr=split("\n",$setList);;\
   if ($setList!~m/speak:textField/) {\
     push @arr , q(  speak:textField { my $tts="SonosTTS";;my $payload = $EVENT;;$payload =~ s/$EVTPART0 $EVTPART1 //g;; fhem("setreading $tts Player $NAME;;setreading $tts volume $EVTPART1;;set $tts tts $payload");;"{}"});;\
   }\
   $setList=join "\n",@arr;;\
   $setList=~s/;;/;;;;/g;;\
   fhem("attr $_ setList $setList")\
}}


Die Abfrage if ($setList!~m/StartRadio:select/) {} verhindert die Ergänzung wenn der entsprechende Setter schon da ist.

Aber was ich noch nicht ganz verstehe, damit wird je die Auswahl statisch beim Eintrag in den Setter geholt? Ok ist sicher erträglich :)

Aber muss man eigentlich dort eine Auswahlliste haben? Geht nicht ein Textfeld mit Suchbegriff?

So in der Art, mein Ansatz aus #419  (https://forum.fhem.de/index.php/topic,111711.msg1075456.html#msg1075456)aufgreifend:
playFav:textField {use JSON;my $uri='';my @ea=split(' ', $EVENT);shift @ea;my $search = join ' ',@ea;my $jlist = ReadingsVal('SonosControl','Replykomplett','');my $decoded = decode_json($jlist);my @arr=@{$decoded->{'Result'}};foreach (@arr) {if ($_->{'Title'} =~ /$search/i){$uri = $_->{'TrackUri'} }};fhem("set $NAME playUri $uri") if ($uri ne '')}
Ist nur mal ein Arbeitsversuch - ich weiß da ist jetzt noch ein fester Name drin.
Vielleicht bekomme ich den Code noch schöner ;)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: PatrickR am 03 August 2020, 19:04:07
Zitat von: Otto123 am 01 August 2020, 14:58:44
ja ich habe so etwas ähnliches. Ich habe aber bisher den Eindruck, es hat nicht nur was mit dem Player zu tun der kommt und geht sondern es tritt bei oder in Kombination mit Gruppenänderung über sonos2mqtt  auf?
Ich benutze eigentlich nur sehr sehr selten Gruppen. Allerdintgs kann ich natürlich nicht ausschließen, dass AirSonos, das ich ebenfalls benutze, irgendwie dazwischenpfuscht. Das ist aber alles zugegebenermaßen Kaffeesatzleserei.

Zitat von: Otto123 am 01 August 2020, 14:58:44
Nur Player aus und zwei Stunden wieder an funktioniert.
Edit: Nein funktioniert aktuell nicht - gerade probiert player war aus, angemacht in sonos2mqtt wird die topologie nicht aktualisiert :(
Ich dachte das hat schon funktioniert  ???
Nach meiner Stichprobe mit n=1 hat es nicht funktioniert. Müsste das mal etwas strukturierter testen.

Zitat von: Otto123 am 01 August 2020, 14:58:44
Ein pm2 restart sonos2mqtt behebt das Problem in jedem Fall.
Jo bei mir ebenfalls. Auch wenn ich einen Docker-Container benutze. Dann sehe ich wenigstens den ganzen Node-Overhead nicht ;)

Wäre natürlich toll, wenn man die Fehlersituation detektieren könnte. Hatte auch schon überlegt, ob ich das Event, das den Connect ausschaltet in FHEM abfange und dann den Container neu starte. Das wäre natürlich die Holzhammermethode. Der Autor scheint momentan an einer Möglichkeit zu arbeiten, über einen mqtt-Befehl die subscriptions zu aktualisieren:
https://github.com/svrooij/sonos2mqtt/issues/112#issuecomment-664548518

Patrick
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 04 August 2020, 12:23:46
ZitatDie Abfrage if ($setList!~m/StartRadio:select/) {} verhindert die Ergänzung wenn der entsprechende Setter schon da ist.

Hab ich mich ungenau ausgedrückt, die Zeile sollte ersetzt werden, es könnten ja neue Favoriten dazugekommen sein.


Zitat
Aber was ich noch nicht ganz verstehe, damit wird je die Auswahl statisch beim Eintrag in den Setter geholt? Ok ist sicher erträglich

Mein Ansatz wäre bei einem get Favorites die setList aktualisieren

attr SonosControl getList Favorites:noArg Reply_Favorites sonos/RINCON_000E58F7F67C01400/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Reply"}}



ZitatAber muss man eigentlich dort eine Auswahlliste haben? Geht nicht ein Textfeld mit Suchbegriff?

Hab ich noch nicht ganz verstanden, ist das nicht vergleichbar mit stochern im Dunkeln ?



playFav:textField {use JSON;my $uri='';my @ea=split(' ', $EVENT);shift @ea;my $search = join ' ',@ea;my $jlist = ReadingsVal('SonosControl','Replykomplett','');my $decoded = decode_json($jlist);my @arr=@{$decoded->{'Result'}};foreach (@arr) {if ($_->{'Title'} =~ /$search/i){$uri = $_->{'TrackUri'} }};fhem("set $NAME playUri $uri") if ($uri ne '')}


Das schon cool, mir gefällt die Verwendung von use JSON aber nicht, das muss auch anders gehen.




Was ich gerne wissen würde (das nicht jeder sein eigenes Süppchen kocht) und jeder mit den gleichen Daten arbeitet, ob das setzen der zwei Readings Reply_Favorites und Reply_TrackUris eine gute Idee war und so im Template eingebaut wird oder nicht ?
So müsste man nicht immer den JSON in Replykomplett auseinandernehmen um damit zu arbeiten oder ist es das Ziel nur mit dem Reading auszukommen ?
Find das eigentlich, gut zumindest das Reading Reply_Favorites.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 04 August 2020, 12:35:24
Zitat von: TomLee am 04 August 2020, 12:23:46
Hab ich noch nicht ganz verstanden, ist das nicht vergleichbar mit stochern im Dunkeln ?
Naja die List sehe ich ja in der App. Ich habe sie ja auch dort erstellt. Kann ich da anschauen und auswählen...
Was ich in FHEM will und brauche ist: Starte einen (bestimmten) Radiosender oder Musik.
In dem normalen Sonos Modul war es für mich immer Krampf herauszufinden wie die Sender jetzt geschrieben werden (müssen) damit sie FHEM akzeptiert. Mit meiner Methode gebe ich irgendwie eine Teil Begriff des Favoriten an der passt  8)

Die Favoriten aktualisieren geht einfach und alles steht in nur einem Reading.

JSON wird doch bei MQTT sowieso verwendet, warum soll man das nicht nehmen?

Ich finde die Favoriten Liste an jedem Player zu haben unlogisch, einmal an der Bridge reicht doch? Mein zusätzliches Gerät war nur zum Test, ich finde jetzt die Liste gehört in die Bridge und damit geht es.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 04 August 2020, 15:32:20
Zitat von: TomLee am 04 August 2020, 12:23:46
Hab ich mich ungenau ausgedrückt, die Zeile sollte ersetzt werden, es könnten ja neue Favoriten dazugekommen sein.
Ich habe da noch was gefunden:
{my @arr =(1,2,3,4,5);;my $search=2;;
my @orr = grep {$_ ne $search} @arr;;
return join ",",@orr}


Also alte Zeile löschen dann neue Zeile rein :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 04 August 2020, 16:40:31
Sagt mal... Ich lese hier die ganze Zeit voller Staunen mit...
Ihr lest die Fav aus. Könnt ihr das nicht auch mit den Gruppen machen? Das wäre auch schön. Das wollte ich ja eigentlich machen aber ich würde das nicht auf dem Level hin bekommen, wie ihr beide hier!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 04 August 2020, 16:41:51
ZitatIch finde die Favoriten Liste an jedem Player zu haben unlogisch, einmal an der Bridge reicht doch? Mein zusätzliches Gerät war nur zum Test, ich finde jetzt die Liste gehört in die Bridge und damit geht es.

Mein zusätzliches Gerät auch  ;)

Zitat
Ich habe da noch was gefunden:
Das mit dem ersetzen schau ich mir später an.


Mit dem ReadingList-Eintrag unten wird nach Auswahl eines Favoritennamen im setter der jeweilige Favorit abgespielt, alles aus dem JSON im Reading Reply_Favorites in der Bridge steht.
Die Favoritennamen können ja auch Leerzeichen enthalten, dann klappt das mit dem select-Widget nicht, daher hab ich die erstmal mit Punkten ersetzt.
Oben war noch ein Denkfehler beim sortieren, das klappt jetzt.

Der Code ist nicht optimal, einiges verbesserungswürdig (unter anderem auch (https://forum.fhem.de/index.php/topic,113337.msg1076237.html#msg1076237)),ist mir klar aber funzt und ich spiel noch weiter.


playFav:select,0,011.FM-NonStop60s,1A.Deutsche.Hits,COSMO.Chillout,DASDING.92.5.(Euro-Hits),FM.نجوم.100.6.(Arabisch),Hitradio.Ö3.99.9.(Österreichisch),Hörbücher,PsyRadioChillout,die.neue.welle.101.8.(Rock) {my $werte = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));my @ar;while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._Title,g){push (@ar, "$key $value")}};my @s = sort @ar;my $g =join (',',@s);$g =~ s/ /./g;$g =~ s/Result_._Title.//g;my $werte2 = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));my @ar2;while ( my ($key2, $value2) = each (%$werte2)) {if ($key2 =~ m,Result_._TrackUri,g){push (@ar2,"$key2 $value2")}};my @s2 = sort @ar2;my $g2 =join (',',@s2);$g2 =~ s/Result_._TrackUri.//g;my @a = split(',',$g); my ($index) = grep { $a[$_] eq $EVTPART1 } (0 .. @a-1);;my $d = defined $index ? $index : -1;my @b = split(',',$g2);my $u = $b[$d];fhem("set $NAME setAVTUri $u; sleep 1; set $NAME play")}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 04 August 2020, 16:57:26
Zitat{
my $werte = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));
my @ar;
while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._Title,g){push (@ar, "$key $value")}};
my @s = sort @a;
my $g =join (',',@s);
$g =~ s/ /./g;$g =~ s/Result_._Title.//g;

my $werte2 = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));
my @ar2;
while ( my ($key2, $value2) = each (%$werte2)) {if ($key2 =~ m,Result_._TrackUri,g){push (@ar2,"$key2 $value2")}};
my @s2 = sort @ar2;;
my $g2 =join (',',@s2);$g2 =~ s/Result_._TrackUri.//g;

my @a = split(',',$g); my ($index) = grep { $a[$_] eq $EVTPART1 } (0 .. @a-1);;
my $d = defined $index ? $index : -1;
my @b = split(',',$g2);
my $u = $b[$d];
fhem("set $NAME setAVTUri $u; sleep 1; set $NAME play")}

Was ich einfach nicht hinbekomme den roten Teil in einer Schleife abzuwickeln oder geht das nicht.
Hinter dem if ein weiteres (else)if {if ($key2 =~ m,Result_._TrackUri,g){push (@ar2,"$key2 $value2")}}, welches das zweite Array (@ar2) gleich mit füllt, dann wär das alles viel kürzer.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 04 August 2020, 17:13:17
Das mit deinen Sortierschleifen versteh ich noch nicht. Vielleicht wenn ich es später nochmal lese :) - vielleicht siehst Du es ja noch zu kompliziert?
Warum Namen und Uri getrennt sortieren? Warum nicht nur die Namen sortieren? Damit findest Du doch die Uri im JSON Array?

Erstmal mein Beispiel für die Favoriten zum durchsuchen.
Sämtlicher Code ist für die Raw Def, einfach reinwerfen und excute. ;)
Drei Schritte:

Edit Code korrigiert!

Modifikation der Bridge (ja man kann es auch mit einer Zeile per Hand machen :) ich wollte das universelle "Script" zeigen)
{my @devlist = devspec2array('model=sonos2mqtt_bridge');;\
my $attr = 'readingList';;\
my $search = 'sonos/RINCON_([0-9A-Z]+)/Favorites';;\
my $item = q(  sonos/RINCON_([0-9A-Z]+)/Favorites:.* Favorites);;\
foreach (@devlist) {\
   my @arr = grep {$_ !~ $search} split("\n",AttrVal($_,$attr,''));;\
   push @arr,$item;;\
   my $val = join "\n",@arr;;\
   $val =~ s/;;/;;;;/g;;\
   fhem("attr $_ $attr $val")}\
return "$attr in ".scalar(@devlist)." Definitionen ergänzt"\
}

Den Befehl bei allen Playern nachrüsten
{my @devlist = devspec2array('MQTT2_RINCON_.*');;\
my $attr = 'setList';;\
my $search = 'playFav:textField';;\
my $item = q(  playFav:textField {use JSON;;my $uri='';;my @ea=split(' ', $EVENT);;shift @ea;;my $search = join ' ',@ea;;my $jlist = ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],'Favorites','');;my $decoded = decode_json($jlist);;my @arr=@{$decoded->{'Result'}};;foreach (@arr) {if ($_->{'Title'} =~ /$search/i){$uri = $_->{'TrackUri'} }};;fhem("set $NAME playUri $uri") if ($uri ne '')});;\
foreach (@devlist) {\
   my @arr = grep {$_ !~ $search} split("\n",AttrVal($_,$attr,''));;\
   push @arr,$item;;\
   my $val = join "\n",@arr;;\
   $val =~ s/;;/;;;;/g;;\
   fhem("attr $_ $attr $val")}\
return "$attr in ".scalar(@devlist)." Definitionen ergänzt"\
}

Dann die Favoriten lesen:
set alias=<ein player der Wahl> x_raw_payload {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}}

Und dann mit set <player> playFav suchstring den Favoriten starten.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 04 August 2020, 17:45:35
Zitat{"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}}

Weshalb nimmst auf einmal Favorites statt wie zuvor Reply ?
Bei beiden kommt der gleiche JSON.

Hast das mal mit dem getter ausprobiert, bei mir ist das jetzt schon Standard.

defmod MQTT2_Sonos_Bridge MQTT2_DEVICE mqttjs_448faffc
attr MQTT2_Sonos_Bridge IODev m2s
attr MQTT2_Sonos_Bridge bridgeRegexp sonos/(RINCON_[A-Z0-9]+)[:/].* "$1"
attr MQTT2_Sonos_Bridge getList AllFavorites:noArg Reply_All sonos/RINCON_000E58F7F67C01400/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Reply"}}\
Favorite:noArg Favorites sonos/RINCON_000E58F7F67C01400/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}}
attr MQTT2_Sonos_Bridge icon mqtt_bridge_2
attr MQTT2_Sonos_Bridge model sonos2mqtt_bridge
attr MQTT2_Sonos_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:.* {}\
sonos/RINCON_([0-9A-Z]+)/Reply:.* Reply_All\
  sonos/RINCON_([0-9A-Z]+)/Favorites:.* Favorites
attr MQTT2_Sonos_Bridge room MQTT2_DEVICE

setstate MQTT2_Sonos_Bridge 2020-08-04 17:25:06 Favorites {"Result":[{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s296020q.png","Title":"011.FM-NonStop60s","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/26","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://dtu8ldmaopof3.cloudfront.net/i/https:%2F%2Fderpimagecache.s3.amazonaws.com%2Fimage%2F475_288x162_2020-01-22-10-30-00-920.png_180.jpg","Title":"1A Deutsche Hits","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/41","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:rpde_svc_475?sid=232&flags=32&sn=4","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://dtu8ldmaopof3.cloudfront.net/i/https:%2F%2Fderpimagecache.s3.amazonaws.com%2Fimage%2F1944_288x162_2019-02-12-13-40-09-357.png_640.jpg","Title":"COSMO Chillout","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/30","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s20295/images/logoq.png","Title":"DASDING 92.5 (Euro-Hits)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/34","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s76488?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s84548/images/logoq.jpg","Title":"die neue welle 101.8 (Rock)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/39","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s84548?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s65628q.png","Title":"FM نجوم 100.6 (Arabisch)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/29","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s65628?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"Hitradio Ö3 99.9 (Österreichisch)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/37","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s8007?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"Hörbücher","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/32","ParentId":"FV:2","TrackUri":"x-rincon-playlist:RINCON_000E58F7F67C01400#S://192.168.188.26/OwnMusic/Hörbücher","ProtocolInfo":"x-rincon-playlist:*:*:*"},{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s97066q.png","Title":"PsyRadioChillout","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/15","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"}],"NumberReturned":9,"TotalMatches":9,"UpdateID":3}
setstate MQTT2_Sonos_Bridge 2020-08-04 17:18:50 Reply_Favorites {"Result":[{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s296020q.png","Title":"011.FM-NonStop60s","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/26","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://dtu8ldmaopof3.cloudfront.net/i/https:%2F%2Fderpimagecache.s3.amazonaws.com%2Fimage%2F475_288x162_2020-01-22-10-30-00-920.png_180.jpg","Title":"1A Deutsche Hits","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/41","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:rpde_svc_475?sid=232&flags=32&sn=4","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://dtu8ldmaopof3.cloudfront.net/i/https:%2F%2Fderpimagecache.s3.amazonaws.com%2Fimage%2F1944_288x162_2019-02-12-13-40-09-357.png_640.jpg","Title":"COSMO Chillout","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/30","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s20295/images/logoq.png","Title":"DASDING 92.5 (Euro-Hits)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/34","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s76488?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s84548/images/logoq.jpg","Title":"die neue welle 101.8 (Rock)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/39","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s84548?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s65628q.png","Title":"FM نجوم 100.6 (Arabisch)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/29","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s65628?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"Hitradio Ö3 99.9 (Österreichisch)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/37","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s8007?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"Hörbücher","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/32","ParentId":"FV:2","TrackUri":"x-rincon-playlist:RINCON_000E58F7F67C01400#S://192.168.188.26/OwnMusic/Hörbücher","ProtocolInfo":"x-rincon-playlist:*:*:*"},{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s97066q.png","Title":"PsyRadioChillout","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/15","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"}],"NumberReturned":9,"TotalMatches":9,"UpdateID":3}





ZitatErstmal mein Beispiel für die Favoriten zum durchsuchen.

Ich komm da nicht mit was das mit Suche zu tun hat, hatte das zuvor schon ausprobiert, ist aber auch cool.
Man muss doch exakt den Favoritennamen eingeben.
Aber wozu nochmal eingeben ? wenn er direkt schon im setter stehen kann, darauf war ich bisher irgendwie fixiert.
Und wie gesagt den setList Eintrag würde ich aktualisieren wenn man ein get Favorite an der Bridge ausführt.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 04 August 2020, 19:42:31
Zitat von: TomLee am 04 August 2020, 17:45:35
Weshalb nimmst auf einmal Favorites statt wie zuvor Reply ?


Ich komm da nicht mit was das mit Suche zu tun hat, hatte das zuvor schon ausprobiert, ist aber auch cool.
Man muss doch exakt den Favoritennamen eingeben.
Weil Du Reply_Favorites genommen hast :) ;D

Es ist doch "egal" was man hinschreibt man muss sich bloß mal auf eines einigen. Bei meinen Tests habe mal Reply und mal Replykomplett genommen. Da ich noch nicht wusste wie man das mal weiter verwendet. Jetzt ist mir klar: Ich frage die Favoriten ab und behalte die auch als JSON Array. Damit kann das Reading auch so heißen?


Du musst nicht exakt den Namen nehmen:($_->{'Title'} =~ /$search/i)
1. Ist Groß Klein egal.
2. muss es nur ein (signifikanter) Teil des vollen Favoriten Namen sein.

Wozu brauch ich die Klappliste wenn der Favorite doch eigentlich im Codetext steht? (Starte Radio früh wenn Licht im Bad angeht)

Das mit dem getter ist eine gute Idee, das muss ich noch verinnerlichen :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 04 August 2020, 19:51:57
Zitat von: 87insane am 04 August 2020, 16:40:31
Sagt mal... Ich lese hier die ganze Zeit voller Staunen mit...
Ihr lest die Fav aus. Könnt ihr das nicht auch mit den Gruppen machen? Das wäre auch schön. Das wollte ich ja eigentlich machen aber ich würde das nicht auf dem Level hin bekommen, wie ihr beide hier!
Ich finde keine weitere Möglichkeit in der Doku von Stephan die Gruppen auszulesen, außer wie wir das schon machen. Jeder Player weiß wozu er gehört, es gibt da keine zentralere Info - nach meinem Verständnis.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 August 2020, 01:01:14
Hallo Thomas,

Du brauchst doch keine einzelnen Readings mit Trackuris drin?
Du willst doch einfach eine sortierte Auswahlliste der Radios im Select Widget?

Die bekommst Du so direkt aus dem Reading (Raw Def):
{use JSON;;\
my $read = 'Favorites';;\
my $s = ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],$read,'');;\
my $decoded = decode_json($s);;\
my @arr  = @{$decoded->{'Result'}};;\
my @out;;\
foreach (@arr) {\
  my $temp=$_->{'Title'};;\
  $temp =~ s/ /./g;;\
  push @out,$temp}\
return join ',', sort @out}

Und dahinter nimmst Du dann meine Variante playFav um die trackuri direkt aus dem Reading zu holen/spielen?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 05 August 2020, 16:27:28
Du hast dir bisher noch nicht wirklich angeschaut was ich gemacht habe.

In #442 und #443 der Code ist nix anderes wie das was du jetzt zeigst mit decode_json.

extra für dich, für die Eingabe im "Editor"

{my $read = 'Favorites';;\
my $werte = json2nameValue(ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],$read,''));;\
my @ar;;\
while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._Title,g){push (@ar, "$key $value")}};;\
my @s = sort @ar;;\
my $g =join (',',@s);;\
$g =~ s/ /./g;;\
$g =~ s/Result_._Title.//g;;\
$g;;}


Auch wenn ich mich sicher nicht ganz richtig Ausdrücke:

Du arbeitest bei decode_json, mein ich, mit einer Referenz auf ein Array.

Ich bekomme mit json2nameValue eine Referenz auf einen Hash zurück (brauch dazu nix mit Use einbinden) und arbeite dann damit.
Also nix anderes wie du, nur zwei verschiedene Wege. Und klar die Variante ohne zusätzliches Use ist mir lieber.

Verstanden hab ich schon etwas, aber begriffen ehrlich gesagt nur einen Bruchteil, sonst wär ich schon weiter.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 August 2020, 16:40:44
Doch Du - ich habe es mir schon angeschaut :) aber mir geht es wie Dir
ZitatVerstanden hab ich schon etwas, aber begriffen ehrlich gesagt nur einen Bruchteil, sonst wär ich schon weiter.
;D

Aber in #443 hast Du zwei Schleifen gezeigt, die Du in einer unterbringen wolltest. Ich wollte Dich fragen wozu? Du musst doch nur die Titel sortieren?

Mal sehen ob ich den Unterschied zwischen beiden Versionen (mit und ohne use) noch verstehe :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 05 August 2020, 17:17:28
Ich weiß nicht wie ich es erklären soll, wenn ich aber Beispiele zeige denke ich das du schneller verstehst wie ich:

Eine Zeile hier deaktiviert und Bindestrich ergänzt:

Zitat{my $read = 'Favorites';;\
my $werte = json2nameValue(ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],$read,''));;\
my @ar;;\
while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._Title,g){push (@ar, "$key-$value")}};;\
my @s = sort @ar;;\
my $g =join (',',@s);;\
$g =~ s/ /./g;;\
#$g =~ s/Result_._Title.//g;;\
$g;;}


ergibt:
Result_1_Title-011.FM-NonStop60s,Result_2_Title-1A.Deutsche.Hits,Result_3_Title-COSMO.Chillout,Result_4_Title-DASDING.92.5.(Euro-Hits),Result_5_Title-die.neue.welle.101.8.(Rock),Result_6_Title-FM.نجوم.100.6.(Arabisch),Result_7_Title-Hitradio.Ö3.99.9.(Österreichisch),Result_8_Title-Hörbücher,Result_9_Title-PsyRadioChillout

Hier:

Zitat{my $read = 'Favorites';;\
my $werte = json2nameValue(ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],$read,''));;\
my @ar;;\
while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._TrackUri,g){push (@ar, "$key-$value")}};;\
my @s = sort @ar;;\
my $g =join (',',@s);;\
$g =~ s/ /./g;;\
#$g =~ s/Result_._TrackUri.//g;;\
$g;;}

Result_1_TrackUri-x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0,Result_2_TrackUri-x-sonosapi-stream:rpde_svc_475?sid=232&flags=32&sn=4,Result_3_TrackUri-x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4,Result_4_TrackUri-x-sonosapi-stream:s76488?sid=254&flags=8224&sn=0,Result_5_TrackUri-x-sonosapi-stream:s84548?sid=254&flags=8224&sn=0,Result_6_TrackUri-x-sonosapi-stream:s65628?sid=254&flags=8224&sn=0,Result_7_TrackUri-x-sonosapi-stream:s8007?sid=254&flags=8224&sn=0,Result_8_TrackUri-x-rincon-playlist:RINCON_000E58F7F67C01400#S://192.168.188.26/OwnMusic/Hörbücher,Result_9_TrackUri-x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0

Diese zwei Schleifen bin ich der Meinung kann man auch in einer umsetzen.

Und wozu ? Na nur die Namen bringen ja nichts mit denen kann man ja keinen Radiosender abspielen, mit den zwei Schleifen hab ich erreicht das ich zwei gleich sortierte Arrays (nicht Alphabetisch, nach dem key) erhalte, über deren Index kann dann die TrackUri ermittelt werden.

Aber auch das ist der falsche Weg (Umweg), mein ich, man kann auch schon direkt über den key ermitteln was zu wem gehört.

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 August 2020, 17:32:29
ZitatNa nur die Namen bringen ja nichts mit denen kann man ja keinen Radiosender abspielen,
Doch, genau das habe ich verstanden und meine ich: Du brauchst Du nur die Liste und im JSON Array steht doch alles drin.
Ok meine Variante mit USE :)
Da du jetzt die gleichen Namen hast (?) sollte das als setList gehen, probier es aus :) Beispiel mit 3 Sendern aus Deiner Liste
playFav:select,011.FM-NonStop60s,1A.Deutsche.Hits,COSMO.Chillout {use JSON;my $uri='';my $search = (split(' ', $EVENT,2))[1];my $jlist = ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],$read,'');my $decoded = decode_json($jlist);my @arr=@{$decoded->{'Result'}};foreach (@arr) {if ($_->{'Title'} =~ /$search/i){$uri = $_->{'TrackUri'} }};fhem("set $NAME playUri $uri") if ($uri ne '')}
Allerdings musst Du aus Deiner Liste Result_1_Title- rausnehmen - wozu ist das? Wegen der Readings?
Result_1_Title-011.FM-NonStop60s,Result_2_Title-1A.Deutsche.Hits,Result_3_Title-COSMO.Chillout,Result_4_Title-DASDING.92.5.(Euro-Hits),Result_5_Title-die.neue.welle.101.8.(Rock),Result_6_Title-FM.نجوم.100.6.(Arabisch),Result_7_Title-Hitradio.Ö3.99.9.(Österreichisch),Result_8_Title-Hörbücher,Result_9_Title-PsyRadioChillout
Bzw. Du musst die Liste einfach mit deinem Code aus #449 erzeugen :)

Ich habe mal Q&D meine beiden Scripts hintereinander kopiert, ausgeführt und es funktioniert so wie Du es wolltest? Sortierte Favoritenliste als Klappliste zum auswählen, alles nur mit dem Original JSON Reading:

Edit: hat noch einen Haken: Meine "Suche" funktioniert nicht bei allen Titeln, da muss ich nochmal ran um die Titel besser zu matchen. Ich habe Favoriten da sind " drin - sowas stört natürlich. Irgendwie muss man das "normieren": auf der einen Seite (select widget) gehen keine Leerzeichen, auf der anderen Seite muss man die Titel finden

{use JSON;;\
my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;\
my $read = 'Favorites';;\
my $decoded = decode_json(ReadingsVal($dev,$read,''));;\
my @arr  = @{$decoded->{'Result'}};;\
my @out;;\
foreach (@arr) {\
  my $temp=$_->{'Title'};;\
  $temp =~ s/ /./g;;\
  push @out,$temp}\
my $favliste= join ',', sort @out;;\
my @devlist = devspec2array('MQTT2_RINCON_.*');;\
my $attr = 'setList';;\
my $search = 'playFav:';;\
my $item = ' playFav:'.$favliste.q( {use JSON;;my $uri='';;my $search = (split(' ', $EVENT,2))[1];;my $jlist = ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],'Favorites','');;my $decoded = decode_json($jlist);;my @arr=@{$decoded->{'Result'}};;foreach (@arr) {if ($_->{'Title'} =~ /$search/i){$uri = $_->{'TrackUri'} }};;fhem("set $NAME playUri $uri") if ($uri ne '')});;\
foreach (@devlist) {\
   my @arr = grep {$_ !~ $search} split("\n",AttrVal($_,$attr,''));;\
   push @arr,$item;;\
   my $val = join "\n",@arr;;\
   $val =~ s/;;/;;;;/g;;\
   fhem("attr $_ $attr $val")}\
return "$attr in ".scalar(@devlist)." Definitionen ergänzt"\
}


Jetzt gehe ich nachher mal ran und spiele mit deiner Codevariante :)

Ich brauche das an andere Stelle als konfigurierbare Klappliste. Schöner wäre, man hätte es wirklich dynamisch, ohne Konfigänderung!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 05 August 2020, 18:23:59
Ich weiß nicht was du jetzt von mir willst, der setter aus #442 ganz unten macht was er soll es funzt alles.
(kopier den so wie er ist und trag ihn in der setList ein nicht über Raw, edit :OK der Bridge-Name ist noch statisch)

Er holt sich alles aus dem JSON in der Bridge.

Alles so wie du es jetzt gerade oben beschreibst.

Womit ich mich noch nicht beschäftigt habe ist das ersetzen des setList-Eintrag, aber das sollte so klappen wie du vorgeschlagen hast (zumindest war das gestern nachvollziehbar).

Und nochmal, das ersetzen des setList-Eintrag stell ich mir vor das das bei einem get in der Bridge gemacht wird.

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 August 2020, 18:28:35
dann habe ich es nicht verstanden. Wozu ist dann #451 ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 05 August 2020, 18:35:46
nur zum nachvollziehen, wie ich es schon in #438 erwähnt habe:

ZitatZum einfachen nachvollziehen empfiehlt sich erstmal in dem push {push (@a, "$value")}} $key mit reinzunehmen, zu schauen was passiert und dann das my @s = sort @a; rauszunehmen um zu sehen was es bedeutet eine unsortierte Liste zu haben.

Mit dem sortieren lag ich da aber noch falsch, hab ich dann aber korrigiert (sicher geht das auch anders) und lösche Result_._Title (key) später raus.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 August 2020, 23:36:01
Hallo Thomas,
jetzt wo ich mir mal angeschaut habe was bei json2namevalue rauskommt, wird mir Dein Lösungsansatz glaube ich klarer :)

Du wolltest so eine Liste erzeugen?
Result_10_Title:Radio Leipzig RP
Result_10_TrackUri:x-sonosapi-stream:rpde_svc_107?sid=232&flags=32&sn=7
Result_11_Title:Radio PSR 102.9 (Pop)
Result_11_TrackUri:x-sonosapi-stream:s6649?sid=254&flags=32
Result_12_Title:RAM FM
Result_12_TrackUri:x-sonosapi-stream:s120965?sid=254&flags=32
Result_13_Title:Titel
Result_13_TrackUri:x-rincon-cpcontainer:0006206cuser-tracks:7212085
Result_14_Title:Titel
Result_14_TrackUri:x-rincon-cpcontainer:0006206cuser-tracks:57284250
Result_15_Title:Zufallsmix des Interpreten
Result_15_TrackUri:x-sonosapi-radio:OdM7gv9gU7QSjkti5U4B53bui4xNDbh3BxkL39Nnfgn4dhJPhcxisA?sid=151&flags=8300&sn=4
Result_1_Title:104.6 RTL
Result_1_TrackUri:x-sonosapi-stream:s25224?sid=254&flags=32
Result_2_Title:Deutschlandfunk Kultur
Result_2_TrackUri:x-sonosapi-stream:s6628?sid=254&flags=8224&sn=0
Result_3_Title:Deutschlandfunk Kultur RP
Result_3_TrackUri:x-sonosapi-stream:rpde_svc_387?sid=232&flags=32&sn=7
Result_4_Title:Maya Fadeeva – Zufallsmix des Interpreten
Result_4_TrackUri:x-sonosapi-radio:y_AW1p8NH9TDElPf9SG7VYRo71VB9SbLPWkPeQiCoCejxPDHnbsEeA?sid=151&flags=8300&sn=4
Result_5_Title:Melissa Etheridge – Zufallsmix des Interpreten
Result_5_TrackUri:x-sonosapi-radio:dzL_hF9h3rZ6XmNnLm6Fs-w0eN6Hn9qPPE5jBsBXWlmi6e0RJHl5NQ?sid=151&flags=8300&sn=4
Result_6_Title:Mephisto 97.6 | (Top 40/Pop)
Result_6_TrackUri:x-sonosapi-stream:s8670?sid=254&flags=8224&sn=0
Result_7_Title:Moya Brennan – Zufallsmix des Interpreten
Result_7_TrackUri:x-sonosapi-radio:5yQ8LX7xOr9WxZxhNrPsXXM8nmYHYxB3-PE85osDj8b977LYarYhZA?sid=151&flags=8300&sn=4
Result_8_Title:Philipp Dittberner – &quot;Philipp Dittberner&quot;-Radio
Result_8_TrackUri:x-sonosapi-radio:sYw20eeWca-D6A36z5FhiqT0RhjTmSFwOfpJpACYqg4k5lBk1h5IXw?sid=151&flags=108&sn=4
Result_9_Title:Radio Leipzig
Result_9_TrackUri:x-sonosapi-stream:s78666?sid=254&flags=8224&sn=0

Damit habe ich es gemacht.
{ my $r = json2nameValue(ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],"Favorites","unknown"));; join("\n", sort map { "$_:$r->{$_}" } grep /.*Title|.*TrackUri/,keys %{$r}) }

Ich weiß nicht ob bei mir da in dem "json2namevalue Buch" jetzt schon eins von 7 Siegeln aufgegangen. Das decode_json und ff erschien mir da noch halbwegs logisch.  ::)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 05 August 2020, 23:58:01
Und jetzt schau dir mal die Readings von dem Device in #435 an die von

attr SonosControl readingList sonos/RINCON_([0-9A-Z]+)/Reply:.* { json2nameValue($EVENT,'',$JSONMAP,'TrackUri')}\
sonos/RINCON_([0-9A-Z]+)/Reply:.* { json2nameValue($EVENT,'',$JSONMAP,'Title')}\


erstellt wurden, ist doch nix anderes oder ?

das was du jetzt gemacht hast geht vielleicht auch schon mit dem optionalen 4 Parameter Filter in json2nameValue, weiß aber nicht ob man da zwei Filter angeben kann ?
Und wie gesagt ich versteh immer noch nur Bruchteile.

edit;
ich glaub Filter greift nur iVm. mit dem dritten Parameter
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 06 August 2020, 17:56:26
Zitat von: TomLee am 05 August 2020, 23:58:01
das was du jetzt gemacht hast geht vielleicht auch schon mit dem optionalen 4 Parameter Filter in json2nameValue, weiß aber nicht ob man da zwei Filter angeben kann ?
Kann man
{ my $r = json2nameValue(ReadingsVal("SonosBridge","Favorites","unknown"),'','lustig','7_Title|7_TrackUri');; join("\n", map { "$_:$r->{$_}" } keys %{$r}) }
Wenn es irgendwo eine Beschreibung geben würde, die ich verstehe.  :'(

Vielleicht hilft Grillwurst und Bier  ;D
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 07 August 2020, 12:57:26
Hallo Thomas,

So jetzt ohne das teuflische "use JSON" und mit dem geliebten? json2namevalue (Was ich immer noch nur in Bruchteilen erahne).
Der Code für playFav ob mit playFav:textField oder playFav:radio1,radio2,radio3 ist von der Sache her egal
{my $uri='';my $search = (split(' ', $EVENT,2))[1];my $jlist = ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],'Favorites','');my $r=json2nameValue($jlist,'','weissnich','_Title|_TrackUri');while (my ($key,$value) = each %{$r}) {if ($value =~/$search/) {$key=~s/Title/TrackUri/;$uri=$r->{$key}}}fhem("set $NAME playUri $uri") if ($uri ne '')}
Zum Spielen in der Kommandozeile:
{ my $search="Suchtext";;
my $uri;;
my $r = json2nameValue(ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],"Favorites","unknown"),'','lustig','_Title|_TrackUri');;
while (my ($key,$value) = each %{$r}) {
    if ($value =~/$search/) {
        $key=~s/Title/TrackUri/;;
        $uri=$r->{$key}
        }
    }
return $uri}

Ob das jetzt irgendwelche Vorteile gegenüber dem JSON Array in meiner ursprünglichen Variante hat?
Ob das effektiver ist oder viel einfacher gemacht werden kann?
Mir erscheint das JSON Array immer noch logischer. 8)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 07 August 2020, 13:24:57
Zitat von: Otto123 am 07 August 2020, 12:57:26Was ich bei json2namevalue(1,2,3,4) reinschreiben muss, ist mir für 2 und 3 nicht klar: 2 kann leer sein, in 3 muss was stehen. In 4 steht der Filter der die Liste verkürzt.
2 ist der "prefix". Der kann (meistens) leer bleiben. Da was reinzuschreiben macht nur dann Sinn, wenn man z.B. JSON aus unterschiedlichen Quellen/Topics hat, die aber intern dieselben Strukturen aufweisen und daher dieselben Namen ergeben würden (Rudi hat das "wegen" Ebus entwickelt und dabei dann gleich auch das 3. Argument eingeführt, weil die "eigentlichen" Readingnamen dann ziemlich unleserlich und unhandlich wurden). Das 3. Argument ist eigentlich (?) ein Hash, in der Regel macht es keinen Sinn, da was anderes reinzuschreiben als das "simple" $JSONMAP, das intern dann vor dem Ausführen der Funktion mit dem Hash aus dem Internal ersetzt wird, der wiederum aus dem Attribut jsonMap gebildet wird (in der attr-Funktion von MQTT2_DEVICE). Das 3. Argument/$JSONMAP dient also dazu, leserliche (oder besser passende oder standardkonforme) Readingnamen zu erzeugen, indem die "technischen Readingnamen" durch beliebige ersetzt werden können...
Zitat
Ich habe verstanden, dass j2nv eine unsortierte Liste mit keys und values produziert. Die Keys heißen Result_lfdNr_NameDesFeldes.
Jein; Rudi hat dazu mal ausgeführt, dass j2nv "eine Referenz auf einen Hash" zurückliefert. Das macht einen Unterschied beim Zugriff auf die Daten, Details rund um diesen Beitrag: https://forum.fhem.de/index.php/topic,111429.msg1059608.html#msg1059608
ZitatHat man im Value vom Key "Result_7_Titel" den Titel gefunden kann man mit dem Key "Result_7_TrackUri" das dazu passende TrackUri auslesen.
Eventuell ist die "grep"-Variante dann auch ein Weg, die Schleife einzusparen (die dann aber wegen Filter eh' nicht mehr viele Datenfelder durchgehen muß, oder? Man könnte aber direkt nach einem match auch das return einbauen, oder?). Muß aber zugeben, dass ich mir das Problem jetzt nicht im Detail angesehen habe und das ganze insgesamt auch recht abstrakt ist. Kann also auch ein gut gemeinter Hinweis in die falsche Richtung sein...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 07 August 2020, 13:34:57
Und was wenn man $JSONMAP nicht hat ? Weil  -> Global symbol "$JSONMAP" requires explicit package name at (eval 1931) line 1. man es außerhalb von MQTT2 readingList anwendet? :o
Weglassen geht nicht, leerer String geht nicht, der Nachnahme von Willi wird akzeptiert und stört offenbar nicht :)

Eine  "eine Referenz auf einen Hash" ist für mich irgendwie nicht "lesbar" Wenn ich versuche es mit keys und values zu lesen dann kommt genau das raus was ich geschrieben habe :)
Eine Datenstruktur ist nicht mehr da.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 07 August 2020, 13:44:16
Ah, ok, außerhalb MQTT2_DEVICE...

Falls "lustig" Fehler wirft: Versuch's mal mit einem beliebigen hash wie
{ my $search="Suchtext";;
my $r = json2nameValue(ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],"Favorites","unknown"),'','{"lustig"=>"doch_nicht"}','_Title|_TrackUri');;
while (my ($key,$value) = each %{$r}) {
    if ($value =~/$search/) {
        $key=~s/Title/TrackUri/;;
        return=$r->{$key};;
        }
    }
return}


EDIT: Eigentlich müßte auch ein leerer Wert gehen, auch jsonMap ist ja nicht zwangsläufig gefüllt bei MQTT2_DEVICE...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 07 August 2020, 14:46:20
...Stochern im Nebel...

So langsam dämmert mir, dass du mit dem Versuch wohl über dasselbe Problem gestolpert bist wie ich; man muß die "Referenz auf einen Hash" irgendwie nochmal umpacken, wenn man damit weiterarbeiten will. Das ist das, was dann auch mit grep und dem neuen Hash passiert.

Kann das mangels Devices nicht wirklich testen, aber eigentlich müßte es gehen, dass man direkt auch den Suchbegriff für Filter verwendet und dann nur einen kürzeren Hash zurückbekommt:
{ my $search="Suchtext";;
my $r = json2nameValue(ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],"Favorites","unknown"),'','{}','_Title.*$search|_TrackUri');;my %title = map { $_,$r->{$_} } grep { $r->{$_} =~ m,$search, } keys %{$r};;
while (my ($key,$value) = each %{$title}) {
    if ($value =~/$search/) {
        $key=~s/Title/TrackUri/;;
        return=$r->{$key};;
        }
    }
return }

Ob es Sinn machen würde, zwei Hashes zu bilden also einen für die (gefilterte) Title-Liste, einen für die TrackUri's, wäre eine andere Frage...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 09 August 2020, 13:07:58
Wenn ich umstelle auf s2m brauch ich auch ne Lösung mit Each, dachte bisher das mach ich weiterhin im notify/myUtils.
Im MQTT2_DEVICE Kontext könnte man aber auch einen setter realisieren  :)

Bisher klappt das aber nicht:

togglefavRadios:noArg {my $l = AttrVal($NAME,"favRadios","none");my $lvwodot = Each($NAME, $l);{my $uri='';my $search = (split(' ', $lvwodot,2))[1];my $jlist = ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],'Favorites','');my $r=json2nameValue($jlist,'','weissnich','_Title|_TrackUri');while (my ($key,$value) = each %{$r}) {if ($value =~/$search/) {$key=~s/Title/TrackUri/;$uri=$r->{$key}}}fhem("set $NAME playUri $uri") if ($uri ne '')}}


Im Attribut favRadios steht:
attr SonosControl favRadios 011.FM-NonStop60s,Deutsche,Antenne Thüringen

Im Log:

2020.08.09 12:43:43 3: MQTT2_DEVICE set SonosControl togglefavRadios
2020.08.09 12:43:44 1: PERL WARNING: Use of uninitialized value $search in regexp compilation at (eval 4848) line 1.
2020.08.09 12:43:44 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $NAME=   $evalSpecials->{'%NAME'};{my $l = AttrVal($NAME,"favRadios","none");my $lvwodot = Each($NAME, $l);{my $uri='';my $search = (split(' ', $lvwodot,2))[1];my $jlist = ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],'Favorites','');my $r=json2nameValue($jlist,'','weissnich','_Title|_TrackUri');while (my ($key,$value) = each %{$r}) {if ($value =~/$search/) {$key=~s/Title/TrackUri/;$uri=$r->{$key}}}fhem("set $NAME playUri $uri") if ($uri ne '')}}


Warum ist  $search uninitialized / nicht vorhanden ?

Aus der Kommandozeile

{my $l = AttrVal("SonosControl","favRadios","none");;my $lvwodot = Each("SonosControl", $l);;}

ausgeführt macht was es soll und gibt nach jedem Aufruf den nächsten Wert aus der Liste zurück.

Jemand eine Idee ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 09 August 2020, 13:27:48
$NAME ? Einmal Device SonosControl und das andere Mal der Player?

Aus welchem Device rufst Du den Setter auf?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 09 August 2020, 13:35:36
Ja $NAME, ist doch korrekt, in dem Test-SonosControl-Device gibts auch einen play setter.

defmod SonosControl MQTT2_DEVICE
attr SonosControl userattr favRadios
attr SonosControl IODev m2s
attr SonosControl comment playUri:textField {fhem("set $NAME setAVTUri $EVTPART1;; sleep 1;; set $NAME play")}\
setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
StartRadio:select {my $rf = ReadingsVal("SonosControl","Reply_Favorites","unknown");;;;",".$rf." bla";;;;}
attr SonosControl favRadios 011.FM-NonStop60s,Deutsche,Antenne Thüringen
attr SonosControl getList Favorites:noArg Reply_Favorites sonos/RINCON_000E58F7F67C01400/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Reply"}}\

attr SonosControl readingList sonos/RINCON_([0-9A-Z]+)/Reply:.* Replykomplett\
sonos/RINCON_([0-9A-Z]+)/Reply:.* {my $werte = json2nameValue($EVENT);;my @a;; while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,.*_Title,g){push (@a, "$key $value")}};;my @s = sort @a;; my $g =join (',',@s);;$g =~ s/ /./g;;$g =~ s/.*_Title.//g;;{"Reply_Favorites"=>$g}}\
sonos/RINCON_([0-9A-Z]+)/Reply:.* {my $werte = json2nameValue($EVENT);;my @a;; while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,.*_TrackUri,g){push (@a,"$key $value")}};;my @s = sort @a;;;; my $g =join (',',@s);;$g =~ s/Result_._TrackUri.//g;;{"Reply_TrackUris"=>$g}}
attr SonosControl room MQTT2_DEVICE
attr SonosControl setList playUri:textField {fhem("set $NAME setAVTUri $EVTPART1;; sleep 1;; set $NAME play")}\
setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
playFav:select,0,011.FM-NonStop60s,1A.Deutsche.Hits,COSMO.Chillout,DASDING.92.5.(Euro-Hits),FM.نجوم.100.6.(Arabisch),Hitradio.Ö3.99.9.(Österreichisch),Hörbücher,PsyRadioChillout,die.neue.welle.101.8.(Rock) {my $werte = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));;my @ar;;while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._Title,g){push (@ar, "$key $value")}};;my @s = sort @ar;;my $g =join (',',@s);;$g =~ s/ /./g;;$g =~ s/Result_._Title.//g;;my $werte2 = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));;my @ar2;;while ( my ($key2, $value2) = each (%$werte2)) {if ($key2 =~ m,Result_._TrackUri,g){push (@ar2,"$key2 $value2")}};;my @s2 = sort @ar2;;my $g2 =join (',',@s2);;$g2 =~ s/Result_._TrackUri.//g;;my @a = split(',',$g);; my ($index) = grep { $a[$_] eq $EVTPART1 } (0 .. @a-1);;;;my $d = defined $index ? $index : -1;;my @b = split(',',$g2);;my $u = $b[$d];;fhem("set $NAME setAVTUri $u;; sleep 1;; set $NAME play")}\
playFa:select,0,011 FM-NonStop60s,1A Deutsche Hits,COSMO.Chillout,DASDING.92.5.(Euro-Hits),FM.نجوم.100.6.(Arabisch),Hitradio.Ö3.99.9.(Österreichisch),Hörbücher,PsyRadioChillout,die.neue.welle.101.8.(Rock) {my $werte = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));;my @ar;;while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._Title,g){push (@ar, "$key $value")}};;my @s = sort @ar;;my $g =join (',',@s);;$g =~ s/ /./g;;$g =~ s/Result_._Title.//g;;my $werte2 = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));;my @ar2;;while ( my ($key2, $value2) = each (%$werte2)) {if ($key2 =~ m,Result_._TrackUri,g){push (@ar2,"$key2 $value2")}};;my @s2 = sort @ar2;;my $g2 =join (',',@s2);;$g2 =~ s/Result_._TrackUri.//g;;my @a = split(',',$g);; my ($index) = grep { $a[$_] eq $EVTPART1 } (0 .. @a-1);;;;my $d = defined $index ? $index : -1;;my @b = split(',',$g2);;my $u = $b[$d];;fhem("set $NAME setAVTUri $u;; sleep 1;; set $NAME play")}\
togglefavRadios:noArg {my $l = AttrVal($NAME,"favRadios","none");;my $lvwodot = Each($NAME, $l);;{my $uri='';;my $search = (split(' ', $lvwodot,2))[1];;my $jlist = ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],'Favorites','');;my $r=json2nameValue($jlist,'','weissnich','_Title|_TrackUri');;while (my ($key,$value) = each %{$r}) {if ($value =~/$search/) {$key=~s/Title/TrackUri/;;$uri=$r->{$key}}}fhem("set $NAME playUri $uri") if ($uri ne '')}}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 09 August 2020, 15:14:24
Ok, aber der der Part mit dem split - was soll der tun?
Der teilt bei Dir Antenne Thüringen - sonst nix. Da ist $search dann leer.
Each liefert doch schon die Elemente der Liste?
{my $l = AttrVal("SonosControl","favRadios","none");;my $lvwodot = Each("SonosControl", $l);;my $search = (split(' ', $lvwodot,2))[1]}

Wenn Du den Schritt einfach übergehst?  Also gleich my $search = Each ...

Und besser Each("SonosControl", $l,',') ok muss nicht sein ($sep = "," if(!$sep);)

Woher kommt Each eigentlich? fhem.pl  8)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 09 August 2020, 15:26:10
Der Code hinter Each ist aus #459 da wars einfach noch: Suchtext ist ein exakter Teil des Titels
Man kann/konnte nur einen Teil des Sender angeben und er wird/wurde abgespielt.

Zitat
Woher kommt Each eigentlich?
https://forum.fhem.de/index.php/topic,40022.msg323002.html#msg323002 (https://forum.fhem.de/index.php/topic,40022.msg323002.html#msg323002)
Zitat
Wenn Du den Schritt einfach übergehst?  Also gleich my $search = Each ...

Ich versuchs mal.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 09 August 2020, 15:29:37
Zitat von: TomLee am 09 August 2020, 15:26:10
Der Code hinter Each ist aus #459 da wars einfach noch: Suchtext ist ein exakter Teil des Titels
Man kann/konnte nur einen Teil des Sender angeben und er wird/wurde abgespielt.
Ja aber dort besteht der $EVENT aus 'playFav Sender Name' und das split dient dazu playFav vom Rest zu trennen. Mit Each hast Du ja schon den 'Sender Name' :)

Deswegen ist es eigentlich besser, playFav so zu lassen wie mein Vorschlag und Du machst einfach einen Aufruf playFav Sender Name.

8)

Ganz ohne setter mit einem Reading anstatt attribute und mit set magic

setreading model=sonos2mqtt_bridge favRadios Deutschlandfunk Kultur,Radio Leipzig

set alias=Arbeitszimmer playFav {(my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;Each($dev,ReadingsVal($dev,'favRadios','')))}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 09 August 2020, 15:58:27
Mit dem umständlich denken hab ichs.
Mein Gedanke war irgendwie auch nur Teilstücke des Sendernamen im Attribut zu hinterlegen, aber wozu, man kann doch direkt den Namen so reinschreiben.

Ok, cool, das klappt so wenn man das playFav übergibt.

Also kann man doch nur Teilstücke angeben, aber da gibts noch irgendwo nen Haken, aber das hast du glaub ich auch schon festgestellt.

So hab ich es im Attribut stehen
011.FM-NonStop60s,Deutsche,Antenne Thüringen

So sind die Sendernamen normal:
011.FM-NonStop60s,1A.Deutsche.Hits,Antenne.Thüringen.80er.(80er)

011.FM-NonStop60s und Deutsche werden korrekt aufgerufen, mit Antenne Thüringen wird PsyRadioChillout abgespielt , auch wenn ich es korrekt eintrage (Antenne.Thüringen.80er.(80er)), meinst du das liegt an dem ü ?

Wenn ich irgendeinen anderen Sender an dritter Stelle eintrage klappt es.

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 09 August 2020, 16:01:23
Ja mit den Umlauten gibt es Ärger. Ich habe auch noch andere Namen mit irgendwelchen Zeichen drin. Da muss ich die "Suche" noch besser machen.  ::)

ich habe oben noch einen anderen Vorschlag editiert :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 09 August 2020, 16:17:06
Ja, ohne setter ist am coolsten, klappt, gefällt mir jetzt am besten, Danke für die Idee.
Aber wer baut sich das wenn er nicht zufällig über unsere Beiträge stolpert ?
Nicht das ich ihn will, mit setter könnts halt jeder der das Template anwendet auch direkt nutzen.
Ok, die Attribute müsst er noch setzen, aber dazu würde auch wieder eine Doku im Device fehlen das sie gesetzt werden müssen.

Zitat
Da muss ich die "Suche" noch besser machen.
FM.نجوم.100.6.(Arabisch) geht auch nicht, denk dran  ;D
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 09 August 2020, 16:23:18
Naja ich denke es wird eh ein Baukasten, wir haben ja jede Woche wieder Ideen. ;D
Ich finde: die Basis ist fertig.
Es gibt schon ein paar Komfortfunktionen (noch in Entwicklung) zum nachrüsten, die kommen vielleicht auch (teilweise) einfach mal in die Basis.
Die Komfortfunktionen gibt es als Doku im Wiki, die kann man doch immer wieder ergänzen.

Ich fange nächste Woche mal an mit dem Wiki.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 09 August 2020, 17:27:01
Noch eine Idee zu Radio mit Ansage (Thread von Kurt) für die Kommandozeile ;)
{my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;my $play = (devspec2array('alias=Arbeitszimmer'))[0];;my $r=Each($dev,ReadingsVal($dev,'favRadios',''));;fhem("set $play speak 15 Es folgt $r");;fhem("sleep $play:volume:.20;;set $play playFav $r")}

Vielleicht lässt sich noch ein besserer Sleep Event finden :)

Muss ich mir nochmal mit dem normalen Sonos Modul anschauen, geht dort sicher auch?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 09 August 2020, 18:33:36
Klar geht das :

{my $sondev = "Dein_Player";;\
my $l = "011.FM.-.Non.Stop.60s,1LIVE.diggi..Top.40.Pop.,DASDING.92.5..Euro-Hits.";;\
my $lvwodot  = Each($sondev, $l);;\
my $lv = $lvwodot."/";;\
$lvwodot =~ s/[.]/ /g;;\
fhem ("set $sondev speak 15 de es wird $lvwodot abgespielt");;\
return fhem("sleep $sondev:currentAlbum:.;;set $sondev StartRadio /".$lv);;}


Das aber die Regulärer-Ausdruck-Schreibweise aus dem Reading RadiosList, das muss vorhanden sein sonst gehts nicht, also vorher aktivieren.

Habs auch mit den Url-encodeden Sendern versucht, das macht aber irgendwie schon mit dem nomalen setter Probleme, mal gehts, mal nicht einen Sender abzuspielen:

{my $sondev = "Dein_Player";;\
my $l = "NDR%202,1A%20Deutsche%20Hits,PsyRadioChillout";;\
my $lvwodot  = Each($sondev, $l);;\
my $lv = $lvwodot;;\
$lvwodot =~ s/\%20/ /g;;\
fhem ("set $sondev speak 15 de es wird $lvwodot abgespielt");;\
return fhem("sleep $sondev:currentAlbum:.;;set $sondev StartRadio $lv");;}


edit:

letzte Frage falsch verstanden
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 13 August 2020, 11:38:09
Moin,

ich habe den speak Befehl mal noch etwas mit meinem neuen Wissen der letzten Tage überarbeitet  8) und dabei gleich mit dem Wiki begonnen: https://wiki.fhem.de/wiki/Sonos2mqtt#Speak_Befehl
Wie geplant steht die Grundlage hier https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Sonos2Mqtt und im eigenen Artikel die Erweiterung und aktuelle Entwicklung.

Vielleicht findet ihr Zeit zum drüberschauen und kritisieren. ;)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 13 August 2020, 16:27:53
Bin zu doof um den speak-Befehl ans laufen zu bekommen  :P

Die mp3 Files werden erstellt.
Die muss man wohl irgendwann manuell löschen, die Doku sagt wie ich es verstanden habe ja ?


defmod SonosTTS Text2Speech none
attr SonosTTS TTS_CacheFileDir cache
attr SonosTTS TTS_UseMP3Wrap 1
attr SonosTTS userReadings httpName:lastFilename.* {'http://'.ReadingsVal($name,'host','set host:port first').'/fhem/'.ReadingsVal($name,'lastFilename','')}

setstate SonosTTS 2020-08-09 19:01:49 Player MQTT2_RINCON_000E58F7F67C01400
setstate SonosTTS 2020-08-13 12:08:59 host 192.168.188.67:8083
setstate SonosTTS 2020-08-13 15:57:39 httpName http://192.168.188.67:8083/fhem/cache/4ee34d8b9472a513fc8eed96cb3ab001.mp3
setstate SonosTTS 2020-08-13 15:57:39 lastFilename cache/4ee34d8b9472a513fc8eed96cb3ab001.mp3
setstate SonosTTS 2020-08-13 15:57:39 playing 0
setstate SonosTTS 2020-08-09 19:01:49 volume hallo



Wenn ich im Menü SonosSpeakWeb aufrufe öffnet sich ein neuer Tab mit dem Inhalt
File not found: cache/index.html
Warum index.html, woher soll die kommen, erstellt die SonosSpeakWeb, bei mir gibts nur die mp3-Dateien ?
Sollte ich hier nicht im Verzeichnis cache landen und die mp3-Files angezeigt bekommen ?
Warum im define zweimal cache, müsste an erste Stelle nich sowas wie http://hostname:8083/fhem ?
Was mach ich noch falsch das das mit dem HTTP Server nicht klappt ?

defmod SonosSpeakWeb HTTPSRV cache cache SonosSpeakWeb

setstate SonosSpeakWeb SonosSpeakWeb


Man muss doch den Ordner auch in der App unter Musikbibliothek einrichten hinterlegen oder nicht ?
Egal wie ich es eintrage, ich kann am Ende in der IOS-App nicht auf weiter tippen ?

Die zusätzlichen Pakete muss ich sicher nicht doch installieren ?

Gruß

Thomas
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: PatrickR am 13 August 2020, 17:58:32
Hallo zusammen,

es tut sich was bei der Problematik, dass unter bestimmten Umständen keine Events mehr kommen. Der Entwickler hat das Refreshen der Verbindung getunt und es gibt einen mqtt-Command, mit dem man den Refresh forcieren kann.

https://github.com/svrooij/sonos2mqtt/issues/112

Patrick
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 13 August 2020, 19:10:57
Hallo Thomas,

ich denke Dein Problem ist simpel?
ZitatWas mach ich noch falsch das das mit dem HTTP Server nicht klappt ?
Ich denke Du hast volume vergessen  ;D

setstate SonosTTS 2020-08-09 19:01:49 volume hallo

Der Speak Befehl set Player speak <volume> text also set alias=Wohnzimmer speak 20 Hallo

Wegen HTTPSRV schaust Du hier: https://fhem.de/commandref.html#HTTPSRV

Du kannst <infix> auch willi nennen, dann wird es nur schwieriger mit dem Namen. Das erste cache steht für http://192.168.188.67:8083/fhem/cache/4ee34d8b9472a513fc8eed96cb3ab001.mp3
Das zweite cache steht für /opt/fhem/cache

Als Musik Bibliothek musst Du nichts einrichten, das muss so gehen. Genau wie sowas:

set m2s publish sonos/RINCON_xxxxxxxxxx1400/control {
  "command": "notify",
  "input": {
    "trackUri": "https://cdn.smartersoft-group.com/various/pull-bell-short.mp3",
    "onlyWhenPlaying": false,
    "timeout": 10,
    "volume": 15,
    "delayMs": 700
  }
}


Das mit File not found: cache/index.html ist noch ein Schönheitsfehler, kann man irgendwie vielleicht mit einer Hilfeseite belegen. Das ist ein Nebeneffekt von HTTPSRV - ich weiß nicht wie man das verhindern kann. Brauchen tue ich den Link im Menu nicht.

Hast Du den alten speak setter noch aktiv? - neu machen
Hast Du das alte notify noch aktiv? -> deaktivieren

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 13 August 2020, 19:22:21
Ach du Sch...   ::), ich versuchs die ganze Zeit, zum Test, mit dem setter in dem Text2Speech-Device. 8)

Danke.

Das mit HTTPSRV muss ich mir noch anschauen, falls das was damit zu tun haben sollte das ich File not found: cache/index.html zurückbekomme.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 13 August 2020, 19:26:58
Zitat von: TomLee am 13 August 2020, 19:22:21
Ach du Sch...   ::), ich versuchs die ganze Zeit, zum Test, mit dem setter in dem Text2Speech-Device. 8)
Kann man das so verstehen? Da muss ich die Doku nachbessern :)
Zitat von: TomLee am 13 August 2020, 19:22:21
Das mit HTTPSRV muss ich mir noch anschauen, falls das was damit zu tun haben sollte das ich File not found: cache/index.html zurückbekomme.
Nein das ist bei mir auch so :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 13 August 2020, 19:36:23
ZitatKann man das so verstehen?

Wer fähig ist "umständlich" zu denken schon. ;D
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 13 August 2020, 20:24:04
Bezüglich meines Verständnisproblem macht die Anpassung im Wiki für mich keinen Unterschied zu zuvor.
Es steht jetzt nur zweimal da, wie man zu dem speak-setter kommt.
Die verlinkte Routine hab ich schon verstanden was die macht, der speak-Befehl war schon vorhanden, nur genutzt hab ich ihn nicht.
Du hast mich schon verstanden das ich es vergeblich mit dem setter aus dem Text2Speech-Device versucht hatte ?
Das versteh ich jetzt, weshalb das nicht klappen konnte im Wiki kommt das aber nicht rüber, mein ich.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 13 August 2020, 22:08:52
Im Wiki steht doch aber überhaupt nichts von einem setter im SonosTTS Device? attr setList gibt es dort gar nicht? Ich versteh überhaupt nicht was Du da eigentlich gemacht hast?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 13 August 2020, 22:27:17
set SonosTTS tts Hallo

War ich die ganze Zeit fokussiert wird auch gehen.
Für mich, war das, logische Schlussfolgerung wenn ich als erstes mal alles durchgehe was deine Routine angelegt hat, ganz am Ende hätt ich mir den speak Befehl vorgenommen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 13 August 2020, 23:03:45
Klar geht das, das erzeugt die mp3 Datei - so wie es vom Text2Speech vorgesehen :)
Und im Wiki steht ja auch wie es komplett geht ;) aber eben automatisch nur im ganzen Satz.
set SonosTTS tts Hier steht die Ansage;sleep SonosTTS:playing:.0 ; set alias=PlayerAlias playUri [SonosTTS:httpName]

Oder Step 1 und Step 3, allerdings dann den sleep Teil einfach weglassen.

Oh na das geht ja gut los, der Erste der testet und schon lauter Missverständnisse - ich habe es nicht gut gemacht.  :'(
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 14 August 2020, 10:19:29
Zitat von: Otto123 am 13 August 2020, 11:38:09
gleich mit dem Wiki begonnen: https://wiki.fhem.de/wiki/Sonos2mqtt#Speak_Befehl (https://wiki.fhem.de/wiki/Sonos2mqtt#Speak_Befehl)
Wie geplant steht die Grundlage hier https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Sonos2Mqtt (https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Sonos2Mqtt) und im eigenen Artikel die Erweiterung und aktuelle Entwicklung.

Vielleicht findet ihr Zeit zum drüberschauen und kritisieren. ;)
Hi Otto,

vorab mal Danke für's In-Angriff-nehmen!

Habe eigentlich nur ein paar kleinere Punkte:
- Wer "noob" ist mit "bridgeRegexp"-Geräten aller Art wird vermutlich eine kleine Beschreibung vermissen, was das Gerät mit dem sonos2mqtt_bridge_comfort-Template denn für eine Funktion hat?
- In dem Detail-Artikel (?) wäre dann noob-tauglich) noch zu erläutern, dass die von der bridge erzeugten weiteren Devices dann mit dem "speaker"-template als Basis zu konfigurieren wären, oder?
- Später wären dann noch ein paar screenshots hilfreich, damit man den Unterschied zwischen Basis und "erweiterten" features sehen kann.
(devspec via Name finde ich immer noch nur dann ganz ok, wenn es um Automatismen direkt anknüpfend an autocreate geht...).


Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 14 August 2020, 11:40:14
Zitat von: Beta-User am 14 August 2020, 10:19:29
- In dem Detail-Artikel (?) wäre dann noob-tauglich) noch zu erläutern, dass die von der bridge erzeugten weiteren Devices dann mit dem "speaker"-template als Basis zu konfigurieren wären, oder?
Naja, ich habe es wahrscheinlich zu komfortabel gemacht.  ??? Da muss nichts mehr konfiguriert werden.  Das bridge_comfort Template definiert zwei notify, diese machen alles automatisch.

Steht in einem schlichten Satz im ersten Artikel
ZitatDas hier verwendete Template definiert zwei notify, diese erledigen die weitere Konfiguration der automatisch erzeugten MQT ...

Die Funktionsbeschreibung der Bridge kann ich noch einfügen, vor allem damit ich es einem Jahr auch noch weiß. :)

Die devspec mit Namen: Betrifft derzeit das SonosTTS Device. Dies ist exklusiv! Wer das so anlegt wie empfohlen wird das so lassen und gut. Wer das unbedingt ändert, der muss eben alles ändern.  Ja man kann es komplizierter machen, dann liest sich alles wieder komplizierter. Es ist ja so schon kompliziert genug ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 14 August 2020, 11:55:56
Zitat von: Otto123 am 09 August 2020, 16:01:23
Ja mit den Umlauten gibt es Ärger. Ich habe auch noch andere Namen mit irgendwelchen Zeichen drin. Da muss ich die "Suche" noch besser machen.  ::)
...
Ich habe hier auch noch weiter gemacht. Ich habe ein paar Erkenntnisse aber noch keine Lösung. Die Sache ist komplizierter und es sind mindesten 3 Problemstellen:
Bin für jede Idee dankbar.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 14 August 2020, 12:57:35
Hab mir für die mp3-Files in /cache einen setter erstellt der nur noch die Angabe des Files benötigt:

set alias=Büro notify 25 KlingelTon.mp3

notify2:textField {my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/".$EVTPART2;'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}

Nur noch mit dem mp3-File Name:

set alias=Büro notify 25 KlingelTon

notify2:textField {my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/".$EVTPART2.".mp3"; 'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}




Besteht die Möglichkeit die "Sonderzeichen" die in den Sendernamen enthalten sind durch irgendein anderes Zeichen zu ersetzen (vor/nach my $search = (split(' ', $EVENT,2))[1]) und darauf dann das $value =~/$search/ loszulassen oder ist das ein Denkfehler ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 14 August 2020, 13:05:15
Beachte bitte, der Wert "timeout":10 ist irgendwie noch nicht zu Ende gedacht :)
Bei mir bricht er manchmal wirklich ab, ich habe es noch nicht verstanden wie der Timeout wirklich wirkt. Ja verlängern hilft irgendwie ;)

Ja die Sonderzeichen ersetzen geht sicher, ich wollte es halt so elegant wie möglich machen. manches braucht ja auch Zeit...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 14 August 2020, 16:53:47
Zitat von: Otto123 am 09 August 2020, 17:27:01
Vielleicht lässt sich noch ein besserer Sleep Event finden :)

Dauert etwas bis der Sender abgespielt wird, die Zeit wird aber auch benötigt, sonst wird während der Sprachansage gestartet und nix passiert:

$play:enqueuedMetadata_UpnpClass:.object.item.audioItem.audioBroadcast

{my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;my $play = "SonosControl";;my $r=Each($dev,ReadingsVal($dev,'favRadios',''));;fhem("set $play speak 15 Es folgt $r");;fhem("sleep $play:enqueuedMetadata_UpnpClass:.object.item.audioItem.audioBroadcast;;set $play playFav $r")}

2020-08-14 16:51:08 MQTT2_DEVICE SonosControl speak 15 Es folgt COSMO Chillout
2020-08-14 16:51:09 MQTT2_DEVICE SonosControl notify
2020-08-14 16:51:10 MQTT2_DEVICE SonosControl STOPPED
2020-08-14 16:51:10 MQTT2_DEVICE SonosControl volume_LF: 100
2020-08-14 16:51:10 MQTT2_DEVICE SonosControl uuid: RINCON_000E58F7F67C01400
2020-08-14 16:51:10 MQTT2_DEVICE SonosControl currentTrack_Duration: 0:00:02
2020-08-14 16:51:10 MQTT2_DEVICE SonosControl groupName: Wohnzimmer
2020-08-14 16:51:10 MQTT2_DEVICE SonosControl ts: 1597416669950
2020-08-14 16:51:10 MQTT2_DEVICE SonosControl currentTrack_ItemId: -1
2020-08-14 16:51:10 MQTT2_DEVICE SonosControl currentTrack_UpnpClass: object.item.audioItem.musicTrack
2020-08-14 16:51:10 MQTT2_DEVICE SonosControl volume: 15
2020-08-14 16:51:10 MQTT2_DEVICE SonosControl currentTrack_ProtocolInfo: http-get:*:audio/mpeg:*
2020-08-14 16:51:10 MQTT2_DEVICE SonosControl currentTrack_Title: 4baac26e3c4d4436e4afafb56d2aac32.mp3
2020-08-14 16:51:10 MQTT2_DEVICE SonosControl volume_RF: 100
2020-08-14 16:51:10 MQTT2_DEVICE SonosControl name: Wohnzimmer
2020-08-14 16:51:10 MQTT2_DEVICE SonosControl playmode: NORMAL
2020-08-14 16:51:10 MQTT2_DEVICE SonosControl currentTrack_TrackUri: http://192.168.188.67:8083/fhem/cache/4baac26e3c4d4436e4afafb56d2aac32.mp3
2020-08-14 16:51:10 MQTT2_DEVICE SonosControl currentTrack_ParentId: -1
2020-08-14 16:51:10 MQTT2_DEVICE SonosControl coordinatorUuid: RINCON_000E58F7F67C01400
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl currentTrack_ParentId: -1
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl currentTrack_TrackUri: http://192.168.188.67:8083/fhem/cache/4baac26e3c4d4436e4afafb56d2aac32.mp3
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl coordinatorUuid: RINCON_000E58F7F67C01400
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl volume_RF: 100
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl name: Wohnzimmer
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl currentTrack_Title: 4baac26e3c4d4436e4afafb56d2aac32.mp3
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl playmode: NORMAL
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl groupName: Wohnzimmer
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl ts: 1597416670567
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl currentTrack_ItemId: -1
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl currentTrack_Duration: 0:00:02
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl currentTrack_ProtocolInfo: http-get:*:audio/mpeg:*
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl volume: 15
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl currentTrack_UpnpClass: object.item.audioItem.musicTrack
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl TRANSITIONING
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl volume_LF: 100
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl uuid: RINCON_000E58F7F67C01400
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl currentTrack_TrackUri: http://192.168.188.67:8083/fhem/cache/4baac26e3c4d4436e4afafb56d2aac32.mp3
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl currentTrack_ParentId: -1
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl coordinatorUuid: RINCON_000E58F7F67C01400
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl currentTrack_Title: 4baac26e3c4d4436e4afafb56d2aac32.mp3
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl name: Wohnzimmer
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl volume_RF: 100
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl playmode: NORMAL
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl currentTrack_Duration: 0:00:02
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl ts: 1597416671076
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl currentTrack_ItemId: -1
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl groupName: Wohnzimmer
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl volume: 15
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl currentTrack_UpnpClass: object.item.audioItem.musicTrack
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl currentTrack_ProtocolInfo: http-get:*:audio/mpeg:*
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl PLAYING
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl uuid: RINCON_000E58F7F67C01400
2020-08-14 16:51:11 MQTT2_DEVICE SonosControl volume_LF: 100
2020-08-14 16:51:13 MQTT2_DEVICE SonosControl name: Wohnzimmer
2020-08-14 16:51:13 MQTT2_DEVICE SonosControl volume_RF: 100
2020-08-14 16:51:13 MQTT2_DEVICE SonosControl currentTrack_Title: 4baac26e3c4d4436e4afafb56d2aac32.mp3
2020-08-14 16:51:13 MQTT2_DEVICE SonosControl playmode: NORMAL
2020-08-14 16:51:13 MQTT2_DEVICE SonosControl currentTrack_ParentId: -1
2020-08-14 16:51:13 MQTT2_DEVICE SonosControl currentTrack_TrackUri: http://192.168.188.67:8083/fhem/cache/4baac26e3c4d4436e4afafb56d2aac32.mp3
2020-08-14 16:51:13 MQTT2_DEVICE SonosControl coordinatorUuid: RINCON_000E58F7F67C01400
2020-08-14 16:51:13 MQTT2_DEVICE SonosControl STOPPED
2020-08-14 16:51:13 MQTT2_DEVICE SonosControl uuid: RINCON_000E58F7F67C01400
2020-08-14 16:51:13 MQTT2_DEVICE SonosControl volume_LF: 100
2020-08-14 16:51:13 MQTT2_DEVICE SonosControl ts: 1597416673094
2020-08-14 16:51:13 MQTT2_DEVICE SonosControl currentTrack_ItemId: -1
2020-08-14 16:51:13 MQTT2_DEVICE SonosControl groupName: Wohnzimmer
2020-08-14 16:51:13 MQTT2_DEVICE SonosControl currentTrack_Duration: 0:00:02
2020-08-14 16:51:13 MQTT2_DEVICE SonosControl currentTrack_ProtocolInfo: http-get:*:audio/mpeg:*
2020-08-14 16:51:13 MQTT2_DEVICE SonosControl volume: 13
2020-08-14 16:51:13 MQTT2_DEVICE SonosControl currentTrack_UpnpClass: object.item.audioItem.musicTrack
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl currentTrack_ParentId: -1
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl enqueuedMetadata_ItemId: -1
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl currentTrack_TrackUri: x-sonosapi-stream:s84548?sid=254&flags=8224&sn=0
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl coordinatorUuid: RINCON_000E58F7F67C01400
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl enqueuedMetadata_UpnpClass: object.item.audioItem.audioBroadcast
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl name: Wohnzimmer
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl volume_RF: 100
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl currentTrack_Title: die neue welle
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl playmode: NORMAL
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl currentTrack_ItemId: -1
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl ts: 1597416674387
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl enqueuedMetadata_Title: die neue welle
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl currentTrack_AlbumArtUri: http://192.168.188.23:1400/getaa?s=1&u=x-sonosapi-stream:s84548%3fsid%3d254%26flags%3d8224%26sn%3d0
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl groupName: Wohnzimmer
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl currentTrack_ProtocolInfo: sonos.com-http:*:application/octet-stream:*
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl currentTrack_UpnpClass: object.item
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl enqueuedMetadata_ParentId: -1
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl volume: 13
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl STOPPED
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl uuid: RINCON_000E58F7F67C01400
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl volume_LF: 100
2020-08-14 16:51:15 MQTT2_DEVICE SonosControl setAVTUri
2020-08-14 16:51:16 MQTT2_DEVICE SonosControl play
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl name: Wohnzimmer
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl enqueuedMetadata_UpnpClass: object.item.audioItem.audioBroadcast
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl volume_RF: 100
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl currentTrack_Title: x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl playmode: NORMAL
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl currentTrack_ParentId: -1
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl currentTrack_TrackUri: x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl enqueuedMetadata_ItemId: -1
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl coordinatorUuid: RINCON_000E58F7F67C01400
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl TRANSITIONING
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl uuid: RINCON_000E58F7F67C01400
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl volume_LF: 100
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl ts: 1597416680301
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl currentTrack_ItemId: -1
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl enqueuedMetadata_Title: COSMO Chillout
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl currentTrack_AlbumArtUri: http://192.168.188.23:1400/getaa?s=1&u=x-sonosapi-stream:rpde_svc_1944%3fsid%3d232%26flags%3d32%26sn%3d4
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl groupName: Wohnzimmer
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl currentTrack_ProtocolInfo: sonos.com-http:*:*:*
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl currentTrack_Artist: ZPSTR_BUFFERING
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl currentTrack_UpnpClass: object.item
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl volume: 13
2020-08-14 16:51:20 MQTT2_DEVICE SonosControl enqueuedMetadata_ParentId: -1
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl enqueuedMetadata_ItemId: -1
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl currentTrack_TrackUri: x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl currentTrack_ParentId: -1
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl uuid: RINCON_000E58F7F67C01400
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl currentTrack_UpnpClass: object.item
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl currentTrack_ProtocolInfo: sonos.com-http:*:*:*
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl currentTrack_AlbumArtUri: http://192.168.188.23:1400/getaa?s=1&u=x-sonosapi-stream:rpde_svc_1944%3fsid%3d232%26flags%3d32%26sn%3d4
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl currentTrack_ItemId: -1
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl playmode: NORMAL
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl currentTrack_Title: x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl volume_RF: 100
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl name: Wohnzimmer
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl enqueuedMetadata_UpnpClass: object.item.audioItem.audioBroadcast
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl coordinatorUuid: RINCON_000E58F7F67C01400
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl volume_LF: 100
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl PLAYING
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl volume: 13
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl enqueuedMetadata_ParentId: -1
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl currentTrack_Artist: chillout
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl groupName: Wohnzimmer
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl enqueuedMetadata_Title: COSMO Chillout
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl ts: 1597416682600
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl currentTrack_ItemId: -1
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl enqueuedMetadata_Title: COSMO Chillout
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl ts: 1597416683100
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl currentTrack_AlbumArtUri: http://192.168.188.23:1400/getaa?s=1&u=x-sonosapi-stream:rpde_svc_1944%3fsid%3d232%26flags%3d32%26sn%3d4
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl groupName: Wohnzimmer
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl enqueuedMetadata_ParentId: -1
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl currentTrack_UpnpClass: object.item
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl volume: 13
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl currentTrack_ProtocolInfo: sonos.com-http:*:*:*
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl currentTrack_Artist: chillout
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl PLAYING
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl uuid: RINCON_000E58F7F67C01400
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl volume_LF: 100
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl enqueuedMetadata_ItemId: -1
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl currentTrack_TrackUri: x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl currentTrack_ParentId: -1
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl coordinatorUuid: RINCON_000E58F7F67C01400
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl currentTrack_Title: x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl enqueuedMetadata_UpnpClass: object.item.audioItem.audioBroadcast
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl name: Wohnzimmer
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl volume_RF: 100
2020-08-14 16:51:23 MQTT2_DEVICE SonosControl playmode: NORMAL


Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 14 August 2020, 21:08:43
Ich habe jetzt eventuell eine Variante für die Favoriten List hinbekommen. So würde ein setter mit Auswahlbox der Favoriten entstehen. Die Favoriten müssen schon in der SonosBridge als Reading da sein. Wenn nicht: Im Wiki steht die Anleitung.
Das hier in der Raw Def ausführen
{use JSON;;use HTML::Entities;;use Encode qw(encode decode);;\
my $enc = 'UTF8';;\
my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;\
my $read = 'Favorites';;\
my $decoded = decode_json(ReadingsVal($dev,$read,''));;\
my @arr  = @{$decoded->{'Result'}};;\
my @out;;\
foreach (@arr) {\
  my $dec=encode($enc, decode_entities($_->{'Title'}));;\
  $dec =~ s/\s/./g;;\
  push @out,$dec}\
my $favliste= join ',', sort @out;;\
my @devlist = devspec2array('MQTT2_RINCON_.*');;\
my $attr = 'setList';;\
my $item = ' playFav:'.$favliste.q( {use JSON;;use HTML::Entities;;use Encode qw(encode decode);;my $enc = 'UTF8';;my $uri='';;my $search = (split(' ', $EVENT,2))[1];;my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;my $read = 'Favorites';;my $decoded = decode_json(ReadingsVal($dev,$read,''));;my @arr  = @{$decoded->{'Result'}};;foreach (@arr) {if (encode($enc, decode_entities($_->{'Title'})) =~ /$search/i){$uri = $_->{'TrackUri'} }};;fhem("set $NAME playUri $uri") if ($uri ne '')});;\
my ($first,$sec)=split(' ',$item,2);;\
foreach (@devlist) {\
   my @arr = grep {$_ !~ $first} split("\n",AttrVal($_,$attr,''));;\
   push @arr,$item;;\
   my $val = join "\n",@arr;;\
   $val =~ s/;;/;;;;/g;;\
   fhem("attr $_ $attr $val")}\
return "$attr in ".scalar(@devlist)." Definitionen modifiziert"\
}
Die erst Schleife erzeugt eine Komma getrennte Liste. Die ist dann schon "bereinigt": Kein HTML Codes, keine white Spaces, utf-8 codiert.
Die zweite Schleife packt in alle Player (kann man im devspec ändern) den setter.
Der Code im setter bekommt den Sender aus der Liste (oder per set Parameter) und sucht im JSON Reading Favorites welches er vorher wieder "bereinigt".

Mein Problem war offenbar, das Perl zum einen "locker" mit der codierung umgeht, er wandelt offenbar in Abhängigkeit was man tut und welcher String wie codiert ist von utf-8 nach ISO oder umgekehrt,  und das man nicht nochmal codieren darf. Wobei ich es immer noch nicht ganz verstanden habe.  :'( Eventuell spielt auch noch die Codierung von $EVENT eine Rolle? Ich habe so viele Varianten probiert, bis ich gemerkt habe, dass Perl mich veräppelt.

Probiers mal aus. ;)

Ein Rest bleibt noch: ich habe einen Favoriten (kein Radio) da ist die TrackUri nicht die richtige uri ::)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 14 August 2020, 23:33:30
ZitatProbiers mal aus.

Hab ich, jetzt klappts mit SWR4.Baden-Württemberg, allerdings bei allen Sendern denen noch eine Beschreibung/Kategorie in () anhängt nicht mehr.

011.FM-NonStop60s
1A.Deutsche.Hits
1LIVE.diggi.(Top.40/Pop)
Antenne.Thüringen.80er.(80er)
COSMO.Chillout
DASDING.92.5.(Euro-Hits)
FM.نجوم.100.6.(Arabisch)
Hitradio.Ö3.99.9.(Österreichisch)
Hörbücher
NDR.2
PsyRadioChillout
SWR4.Baden-Württemberg
SWR4.Rheinland-Pfalz
die.neue.welle.101.8.(Rock)

Zitat
Ein Rest bleibt noch: ich habe einen Favoriten (kein Radio) da ist die TrackUri nicht die richtige uri
Das bei mir mit Hörbücher auch so, ein Favorit aus der Musikbibliothek
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 14 August 2020, 23:51:39
Hallo Thomas,

ich habe auch einen mit (Beschreibung) - der funktioniert. Kannst mal den Code im setter austauschen, der schreibt eine Datei. Da sieht man vielleicht was los ist?
{use JSON;use HTML::Entities;use Encode qw(encode decode);my $enc = 'utf-8';my $uri='';my @out;my $search = (split(' ', $EVENT,2))[1];my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];my $read = 'Favorites';my $decoded = decode_json(ReadingsVal($dev,$read,''));my @arr  = @{$decoded->{'Result'}};foreach (@arr) {my $tit=encode($enc, decode_entities($_->{'Title'}));if ($tit =~ /$search/i){$uri = $_->{'TrackUri'} }push @out, $tit.' - '.$search};FileWrite('test2.txt', @out);fhem("set $NAME playUri $uri") if ($uri ne '')}
Oder Du schickst mir mal das Reading Favorites :) ob ich da was sehen kann?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 15 August 2020, 00:17:35
Das steht in der Datei:

011.FM-NonStop60s - die.neue.welle.101.8.(Rock)
1A Deutsche Hits - die.neue.welle.101.8.(Rock)
1LIVE diggi (Top 40/Pop) - die.neue.welle.101.8.(Rock)
Antenne Thüringen 80er (80er) - die.neue.welle.101.8.(Rock)
COSMO Chillout - die.neue.welle.101.8.(Rock)
DASDING 92.5 (Euro-Hits) - die.neue.welle.101.8.(Rock)
die neue welle 101.8 (Rock) - die.neue.welle.101.8.(Rock)
FM نجوم 100.6 (Arabisch) - die.neue.welle.101.8.(Rock)
Hitradio Ö3 99.9 (Österreichisch) - die.neue.welle.101.8.(Rock)
Hörbücher - die.neue.welle.101.8.(Rock)
NDR 2 - die.neue.welle.101.8.(Rock)
PsyRadioChillout - die.neue.welle.101.8.(Rock)
SWR4 Baden-Württemberg - die.neue.welle.101.8.(Rock)
SWR4 Rheinland-Pfalz - die.neue.welle.101.8.(Rock)


Das ist das JSON-Reading :

{"Result":[{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s296020q.png","Title":"011.FM-NonStop60s","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/26","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://dtu8ldmaopof3.cloudfront.net/i/https:%2F%2Fderpimagecache.s3.amazonaws.com%2Fimage%2F475_288x162_2020-01-22-10-30-00-920.png_180.jpg","Title":"1A Deutsche Hits","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/41","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:rpde_svc_475?sid=232&flags=32&sn=4","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"1LIVE diggi (Top 40/Pop)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/49","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s45087?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s104196/images/logoq.png?t=153253","Title":"Antenne Thüringen 80er (80er)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/42","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s104196?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://dtu8ldmaopof3.cloudfront.net/i/https:%2F%2Fderpimagecache.s3.amazonaws.com%2Fimage%2F1944_288x162_2019-02-12-13-40-09-357.png_640.jpg","Title":"COSMO Chillout","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/30","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s20295/images/logoq.png","Title":"DASDING 92.5 (Euro-Hits)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/34","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s76488?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s84548/images/logoq.jpg","Title":"die neue welle 101.8 (Rock)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/39","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s84548?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s65628q.png","Title":"FM نجوم 100.6 (Arabisch)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/29","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s65628?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"Hitradio Ö3 99.9 (Österreichisch)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/37","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s8007?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"Hörbücher","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/32","ParentId":"FV:2","TrackUri":"x-rincon-playlist:RINCON_000E58F7F67C01400#S://192.168.188.26/OwnMusic/Hörbücher","ProtocolInfo":"x-rincon-playlist:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s228737/images/logoq.png?t=154228","Title":"NDR 2","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/43","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s228737?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s97066q.png","Title":"PsyRadioChillout","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/15","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"SWR4 Baden-Württemberg","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/48","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s20293?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"SWR4 Rheinland-Pfalz","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/47","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s1563?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"}],"NumberReturned":14,"TotalMatches":14,"UpdateID":9}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 August 2020, 13:18:19
Moin,

das Problem sind die / und ev. auch die (

Im setter hinter my $search ... das hier ergänzen $search=~s/[\/\(\)]/./g;

Damit bleibt die Liste etwas hübscher, man könnte ja alles schon beim Erstellen der Auswahlliste durch Punkte ersetzen.

Das mit den uri (Hörbücher) ist offenbar ein Problem von setAVTUri. Ich habe es gestern Abend noch mit dem adv command probiert aber ohne Erfolg. Naja muss ja nicht gleich alles gehen :)
Es gibt offenbar eine erhebliche uri Vielfalt die das Sonos System dann speziell behandelt.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 15 August 2020, 18:35:02
Bis auf Hörbücher (das liegt an der uri) klappt alles jetzt.

FM نجوم 100.6 (Arabisch) erst nicht, dann hab ich aber festgestellt das es auch an der uri liegt, testweise hab ich sie im Json ersetzt mit dem Ressource-Wert aus dem Radios Reading im Sonos-Modul, dann klappts auch.

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 August 2020, 18:58:55
Ja das ist bei mir auch so: den FM 100.6 arabisch bekomme ich bei mir gar nicht gestartet, auch nicht mit dem Sonos Modul von Reinerlein. Auch nicht mit Sonos selbst  :o - Er setzt die uri, zeigt das Radio Icon und beendet aber sofort das play wieder.

Bei meiner Playlist aus der Soundcloud wird die uri irgendwie gar nicht sichtbar gesetzt. Wenn ich da die uri nehme die nach dem Sonos Start im Reading steht funktioniert das auch.

Ich bin immer noch unsicher, ob ich das mit der Zeichencodierung final wirklich verstanden habe  :-\
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 15 August 2020, 19:10:14
ZitatJa das ist bei mir auch so: den FM 100.6 arabisch bekomme ich bei mir gar nicht gestartet, auch nicht mit dem Sonos Modul von Reinerlein. Auch nicht mit Sonos selbst  :o - Er setzt die uri, zeigt das Radio Icon und beendet aber sofort das play wieder.

wie gesagt, nimm mal den Ressource-Wert (uri) aus dem Radios Reading (Sonos-Modul), dann klappts.

Nutze mit meiner FB noch das Sonos-Modul, da werden alle Sender mit Each abgespielt.

Die Sender stehen in RadiosList:

011.FM.-.Non.Stop.60s|1LIVE.diggi..Top.40.Pop.|DASDING.92.5..Euro-Hits.|Hitradio.Ö3.99.9..Österreichisch.|Nota.Masria..Gemeinden.|PsyRadio.Chillout|Radio.Regenbogen|SWR4.Baden-Württemberg|SWR4.Rheinland-Pfalz|die.neue.welle.101.8..Rock.

Die Uris werden aus dem Reading Radios genommen:

{'R:0/0/46' => {'Ressource' => 'x-sonosapi-stream:s228737?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-profiles.tunein.com/s228737/images/logog.png?t=154228','Title' => 'NDR 2'},'R:0/0/27' => {'Ressource' => 'x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-radiotime-logos.tunein.com/s296020g.png','Title' => '011.FM - Non Stop 60s'},'R:0/0/1' => {'Ressource' => 'x-sonosapi-stream:s1563?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-profiles.tunein.com/s1563/images/logog.png?t=153242','Title' => 'SWR4 Rheinland-Pfalz'},'R:0/0/23' => {'Ressource' => 'x-sonosapi-stream:s290159?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-profiles.tunein.com/s290159/images/logog.png?t=158880','Title' => 'Nota Masria (Gemeinden)'},'R:0/0/40' => {'Ressource' => 'x-sonosapi-stream:s84548?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-profiles.tunein.com/s84548/images/logog.jpg','Title' => 'die neue welle 101.8 (Rock)'},'R:0/0/3' => {'Ressource' => 'x-sonosapi-stream:s272334?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-radiotime-logos.tunein.com/s2485g.png','Title' => 'Radio Regenbogen'},'R:0/0/33' => {'Ressource' => 'x-sonosapi-stream:s76488?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-profiles.tunein.com/s20295/images/logog.png','Title' => 'DASDING 92.5 (Euro-Hits)'},'R:0/0/5' => {'Ressource' => 'x-sonosapi-stream:s20293?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-profiles.tunein.com/s20293/images/logog.png?t=1','Title' => 'SWR4 Baden-Württemberg'},'R:0/0/25' => {'Ressource' => 'x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-radiotime-logos.tunein.com/s97066g.png','Title' => 'PsyRadio Chillout'},'R:0/0/35' => {'Ressource' => 'x-sonosapi-stream:s45087?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-profiles.tunein.com/s45087/images/logog.png','Title' => '1LIVE diggi (Top 40/Pop)'},'R:0/0/36' => {'Ressource' => 'x-sonosapi-stream:s8007?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-radiotime-logos.tunein.com/s8007g.png','Title' => 'Hitradio Ö3 99.9 (Österreichisch)'}}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 15 August 2020, 20:05:28
Bei dem Code aus dem Wiki fehlt irgendwie die Variable $first:

{my @devlist = devspec2array('model=sonos2mqtt_bridge');;\
my $attr = 'readingList';;\
my $item = q(  sonos/RINCON_([0-9A-Z]+)/Favorites:.* Favorites);;\
foreach (@devlist) {\
   my @arr = grep {$_ !~ $first} split("\n",AttrVal($_,$attr,''));;\
   push @arr,$item;;\
   my $val = join "\n",@arr;;\
   $val =~ s/;;/;;;;/g;;\
   fhem("attr $_ $attr $val")}\
return "$attr in ".scalar(@devlist)." Definitionen modifiziert"\
}


edit:
OK, wenn man den Code vor der Schleife (mir hat vor kurzem jemand gesagt ich soll foreach vergessen for macht das gleiche) um

my $first=split(' ',$item,2);;\

ergänzt, wie aus dem Beispiel weiter oben mit dem playFav setter, dann klappts.

Der Code hat aber nach wie vor den Haken das er einen schon vorhandenen Eintrag nicht ersetzt, er wird einfach nur ergänzt.

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 August 2020, 20:21:07
Ja da fehlt die Zeile
my ($first,$sec)=split(' ',$item,2);;\
Ich trage es gerade nach. Hatte ich gestern noch umgestellt und was vergessen  ::)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 15 August 2020, 20:22:44
Hatte gerade meinen Betrag noch editiert  :P
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 August 2020, 20:30:54
Zitat von: TomLee am 15 August 2020, 20:05:28
Der Code hat aber nach wie vor den Haken das er einen schon vorhandenen setter nicht ersetzt, er wird einfach nur ergänzt.
Wie meinst Du das? Hier geht es ja um die readingList?

Und der Code vom oben sollte doch einen vorhandene playFav setter ersetzen? Bei mir tut er es. Bei Dir schreibt er einen zweiten playFav setter?
Edit:
Ja ich verstehe, wenn sich die Liste ändert - ok ich überlege mir etwas.

Ok da muss man die Trennung eher machen, so (also nur beim playFav). Aber generell müssen noch die Leerzeichen aus $first raus.
my ($first,$sec)=split(':',$item,2);;$first=~s/ //g;;\
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 15 August 2020, 20:36:16
Ich hab vor die getList zu ergänzen:

{my @devlist = devspec2array('model=sonos2mqtt_bridge');;\
my $attr = 'getList';;\
my $item = q(Favorites:noArg Favorites sonos/RINCON_([0-9A-Z]+)/control  {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}});;\
my $first=split(' ',$item,2);;\
for (@devlist) {\
   my @arr = grep {$_ !~ $first} split("\n",AttrVal($_,$attr,''));;\
   push @arr,$item;;\
   my $val = join "\n",@arr;;\
   $val =~ s/;;/;;;;/g;;\
   fhem("attr $_ $attr $val")}\
return "$attr in ".scalar(@devlist)." Definitionen modifiziert"\
}


Warum greift bei mir der regex nicht bei dir schon ?

In getList steht dann :

Favorites:noArg Favorites sonos/RINCON_([0-9A-Z]+)/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 August 2020, 21:13:08
Ich versteh den Fehler noch nicht. Ich denke der Getter stimmt nicht. Muss da nicht ein Player rein? RINCON_([0-9A-Z]+
Oder meinst Du das regExp?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 15 August 2020, 21:18:02
Ja, den regex mein ich, der getter stimmt schon.

Das funzt schon die ganze Zeit:
Favorite:noArg Favorites sonos/RINCON_000E58F7F67C01400/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 August 2020, 21:34:15
Na bei "mir" steht diese regExp ja in der readingList :)

Du willst doch einen Player auswählen?

Wobei das auch noch nicht perfekt ist, die Readings kommen doch im Player an, das will ich ja nicht. Meine Ergänzung der readingList spült zwar die Favorites in das Reading der Bridge aber eben auch in den Player.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 15 August 2020, 21:45:22
Ich will das der regex greift mehr nicht, keinen Player auswählen.

Zitat
my $item = q(Favorites:noArg Favorites sonos/RINCON_([0-9A-Z]+)/control  {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}});;\

der getter aktualisiert dann das Reading Favorites im Bridge-Device welches von dem ReadingList-Eintrag
sonos/RINCON_([0-9A-Z]+)/Favorites:.* Favorites
erstellt wird.

Das ist nichts anderes wie
set alias=Büro x_raw_payload {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}}
nur im getter (im Bridge-Device).

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 15 August 2020, 21:48:33
Ergänze doch mal getList mit

Favorites:noArg Favorites sonos/RINCON_XXXXXXXXXXXXX/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}}

dann verstehst du was ich meine.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 August 2020, 21:55:13
Ja ich habe, das glaube ich verstanden, aber der Code schreibt ja einfach den Text $item in den getter.
Insofern sieht der getter so aus wie Du willst?
Wenn ja ist er doch verkehrt, weil es ist doch ein publish Befehl der abgesetzt wird und dort darf doch kein regExp rein!?
Wenn nein (so versteh ich den Post während ich schreibe) dann weiß ich nicht wie man es machen könnte.

Man müsste eine liste der RINCONs haben und einfach einen auswählen?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 August 2020, 22:24:16
sorry hatte irgendwie aus Versehen das Thema geschlossen. Meine Maus ist kaputt :(
So als Vorschlag? Irgendeine RINCON ...
{ my @devlist = devspec2array('MQTT2_RINCON_.*');; my @arr;; foreach (@devlist) {push @arr,InternalVal($_,'DEF','')}  return $arr[int(rand(@arr))]}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 15 August 2020, 23:14:40
Ja jetzt hast mich verstanden, auch wenn ich auf dem Schlauch stand.

Keine Ahnung wie ich das jetzt mit dem q() aneinander hänge, ohne wieder zurück zu "" zu gehen, hab mir irgendwas zusammengereimt:

{my @devlist = devspec2array('model=sonos2mqtt_bridge');;\
my @devlist2 = devspec2array('MQTT2_RINCON_.*');;\
my @arr2;;\
foreach (@devlist2) {push @arr2,InternalVal($_,'DEF','')};;\
my $arr1= $arr2[int(rand(@arr2))].q(/control  {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}});;\
my $attr = 'getList';;\
my $item = q(Favorites:noArg Favorites sonos/);;\
$item.= $arr1;;\
my $first=split(' ',$item,2);;\
foreach (@devlist) {\
   my @arr = grep {$_ !~ $first} split("\n",AttrVal($_,$attr,''));;\
   push @arr,$item;;\
   my $val = join "\n",@arr;;\
   $val =~ s/;;/;;;;/g;;\
   fhem("attr $_ $attr $val")}\
return "$attr in ".scalar(@devlist)." Definitionen modifiziert"\
}





Frag mich mittlerweile warum so Umwege händisch oder per Codeschnipsel bspw. sonos/RINCON_([0-9A-Z]+)/Favorites:.* Favorites zu ergänzen, du hast mich erst auf die Idee gebracht mit einem Codeschnipsel getList zu ergänzen.

Das kann man doch alles mit attrTemplate in einem Wasch ausliefern und gut ist ?
Dafür sind die Templates doch da, um vorkonfigurierte Geräte zu erhalten.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 August 2020, 23:37:13
Zitat von: TomLee am 15 August 2020, 23:14:40
Das kann man doch alles mit attrTemplate in einem Wasch ausliefern und gut ist ?
Dafür sind die Templates doch da, um vorkonfigurierte Geräte zu erhalten.
Ja, definitiv. Aber jetzt wo wir jeden Tag was ändern und dazu lernen, finde ich das für mich eine gute Methode. Ich kopiere ein paar Codezeilen und habe alles neu gemacht.

Und ich weiß noch nicht wieviel man Templates gießen sollte. ;)

Ich würde das Item gleich so machen, mein Testcode :)
{my @devlist2 = devspec2array('MQTT2_RINCON_.*');;\
my @arr2;;\
foreach (@devlist2) {push @arr2,InternalVal($_,'DEF','')};;\
my $item= q(Favorites:noArg Favorites sonos/).$arr2[int(rand(@arr2))].q(/control  {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}});;\
}


Wenn man so wie hier keine getList hat sondern einfach eine neu macht, kann man natürlich den "Klamauk" mit ersetzen weglassen und einfach setzen ;)
fhem("attr model=sonos2mqtt_bridge getList $item")
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 August 2020, 23:48:30
Aaaber: Wenn wir dann mal Templates machen die sich ergänzen, also wie ein Baukasten, dann brauchen wir entweder genau diese Routinen um Bestehendes zu ergänzen auch in den Templates(oder?), oder wir machen ein Mammut Template - was sich schlechter warten lässt?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 15 August 2020, 23:53:59
Ok, umständlich gedacht wie meist.

Dann wär ich für ungefähr folgende Ergänzung im Wiki im Abschnitt Favoriten starten, ganz unten, zwischen dem letzten </syntaxhighlight> und ToDo, solange es keinen getter im Template gibt.
Eventuell noch angepasst das nicht einfach nur ergänzt sondern ersetzt wird wenn zuvor vorhanden.

Wer das nicht immer per Hand machen will erstellt sich einen get-Befehl im Bridge-Device, hier der Code für die Raw Definition:<syntaxhighlight lang="perl">
{my @devlist = devspec2array('model=sonos2mqtt_bridge');;\
my @devlist2 = devspec2array('MQTT2_RINCON_.*');;\
my $attr = 'getList';;\
my @devlist2 = devspec2array('MQTT2_RINCON_.*');;\
my @arr2;;\
foreach (@devlist2) {push @arr2,InternalVal($_,'DEF','')};;\
my $item= q(Favorites:noArg Favorites sonos/).$arr2[int(rand(@arr2))].q(/control  {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}});;\
my $first=split(' ',$item,2);;\
foreach (@devlist) {\
   my @arr = grep {$_ !~ $first} split("\n",AttrVal($_,$attr,''));;\
   push @arr,$item;;\
   my $val = join "\n",@arr;;\
   $val =~ s/;;/;;;;/g;;\
   fhem("attr $_ $attr $val")}\
return "$attr in ".scalar(@devlist)." Definitionen modifiziert"\
}
</syntaxhighlight>





Was ist den bisher in die Templates geflossen außer die Standardfunktionen? noch nicht viel, im Vergleich zum Sonos-Modul  :P.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 16 August 2020, 00:38:08
Schau Dir es mal an, ich habe jetzt ne Zwischenlösung ins Wiki gemacht.
Ich denke man sollte einfach die beiden Blöcke die jetzt zur Bridge dastehen zusammen fassen. Gehört thematisch zusammen. Aber morgen ist auch noch ein Tag. ;D

Und die getList könnte auch gleich ins Bridge Template. Einziges Problem: Wenn wir das anwenden gibt es die Player(RINCON_) noch nicht  :o
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 16 August 2020, 16:37:12
genau genommen müsste es für die playFav in ihrer jetzigen Ausprägung mit Auswahlbox ein notify geben:
define SonosBridge_notify_1 notify SonosBridge:Favorites:.{"Result":.*} {Code für playFav neu schreiben}
Damit, wenn man die Favoriten neu holt dieser setter neu gemacht wird.
Oder man baut sich so ein Konstrukt:
get SonosBridge Favorites;sleep SonosBridge:Favorites:.{"Result":.*}{Code für playFav neu schreiben}
Btw ich weiß gar nicht ob das mit den {} im Trigger funktioniert, aber der creator im Eventmonitor hat es so vorgeschlagen

Aber es wird langsam Zeit den Code im "normalen Perl Syntax" in eine 99_mySonos2mqttUtils.pm zu packen damit das Ganze übersichtlich bleibt.

Irgendwie ist es auch blöd, das man die Auswahlliste nicht aus einem Reading lesen kann. So wird jedesmal eine Configänderung draus. Oder gibt es dafür schon einen Weg?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 16 August 2020, 17:08:53
ZitatDamit, wenn man die Favoriten neu holt dieser setter neu gemacht wird.
Oder man baut sich so ein Konstrukt:

Hab ich doch vor rd. 2 Wochen so vorgeschlagen.

ZitatIrgendwie ist es auch blöd, das man die Auswahlliste nicht aus einem Reading lesen kann.

Hab ich doch auch schon gemacht gehabt, gehört dann wohl noch umgebaut auf j2nm mit filter.

Zwei Readings, einmal die Titel und einmal die Uris:

sonos/RINCON_([0-9A-Z]+)/Reply:.* {my $werte = json2nameValue($EVENT);my @a; while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_([0-9]+)_Title,g){push (@a, "$key $value")}};my @s = sort @a; my $g =join (',',@s);$g =~ s/ /./g;$g =~ s/Result_([0-9]+)_Title.//g;{"Reply_Favorites"=>$g}}
sonos/RINCON_([0-9A-Z]+)/Reply:.* {my $werte = json2nameValue($EVENT);my @a; while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._TrackUri,g){push (@a,"$key $value")}};my @s = sort @a;; my $g =join (',',@s);$g =~ s/Result_._TrackUri.//g;{"Reply_TrackUris"=>$g}}


der playFav dazu war so, der hat aber auch das Problem mit den Umlauten und arabischen Schriftzeichen:

playFa:select,Hörbücher,NDR.2,PsyRadioChillout,SWR4.Baden-Württemberg,SWR4.Rheinland-Pfalz,011.FM-NonStop60s,1A.Deutsche.Hits,1LIVE.diggi.(Top.40/Pop),Antenne.Thüringen.80er.(80er),COSMO.Chillout,DASDING.92.5.(Euro-Hits),die.neue.welle.101.8.(Rock),FM.نجوم.100.6.(Arabisch),Hitradio.Ö3.99.9.(Österreichisch) {my $werte = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));my @ar;while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._Title,g){push (@ar, "$key $value")}};my @s = sort @ar;my $g =join (',',@s);$g =~ s/ /./g;$g =~ s/Result_._Title.//g;my $werte2 = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));my @ar2;while ( my ($key2, $value2) = each (%$werte2)) {if ($key2 =~ m,Result_._TrackUri,g){push (@ar2,"$key2 $value2")}};my @s2 = sort @ar2;my $g2 =join (',',@s2);$g2 =~ s/Result_._TrackUri.//g;my @a = split(',',$g); my ($index) = grep { $a[$_] eq $EVTPART1 } (0 .. @a-1);;my $d = defined $index ? $index : -1;my @b = split(',',$g2);my $u = $b[$d];fhem("set $NAME setAVTUri $u; sleep 1; set $NAME play")}

Hier mein Test-Device mit den Readings:

defmod SonosControl MQTT2_DEVICE
attr SonosControl userattr favRadios
attr SonosControl IODev m2s
attr SonosControl comment playUri:textField {fhem("set $NAME setAVTUri $EVTPART1;; sleep 1;; set $NAME play")}\
setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
StartRadio:select {my $rf = ReadingsVal("SonosControl","Reply_Favorites","unknown");;;;",".$rf." bla";;;;}
attr SonosControl devStateIcon {my $wpix = '250px';;\
my $groupname = ReadingsVal($name,'groupName','0');;\
my $sgroupname = (split(' ',ReadingsVal($name,'groupName','')))[0];;\
my $uuidtoname = (devspec2array('DEF='.ReadingsVal($name,'coordinatorUuid','0')))[0];;\
my $vol = ReadingsVal($name,'volume','');;\
my $img = ReadingsVal($name,'currentTrack_AlbumArtUri','');;\
my $mystate = $name eq $uuidtoname \
  ? ReadingsVal($name,'state','FEHLER') : ReadingsVal($uuidtoname,'state','');;\
my $playpic = $mystate eq 'PLAYING'\
  ? 'rc_PAUSE@red'    : $mystate eq 'PAUSED_PLAYBACK'\
  ? 'rc_PLAY@green'   : $mystate eq 'STOPPED'\
  ? 'rc_PLAY@green'   : $mystate eq 'TRANSITIONING'\
  ? 'rc_PLAY@blue'    : $mystate eq 'set_next'\
  ? 'rc_NEXT@blue'    : $mystate eq 'set_previous'\
  ? 'rc_PREVIOUS@blue': $mystate eq 'set_volumeUp'\
  ? 'rc_VOLUP@blue'   : $mystate eq 'set_volumeDown'\
  ? 'rc_VOLDOWN@blue' : $mystate eq 'set_mute'\
  ? 'rc_MUTE@blue'    : 'rc_PLAY@yellow';;\
my $mutecmd = ReadingsVal($name,'mute','0') eq 'false'?'on':'off';;\
my $mutepic = $mutecmd eq 'on'?'rc_MUTE':'rc_VOLUP';;\
my $show = 'FEHLER';;\
my $currentTrack_Artist = ReadingsVal($name,'currentTrack_Artist','FEHLER');;\
my $currentTrack_Title = ReadingsVal($name,'currentTrack_Title','FEHLER');;\
if ($currentTrack_Title =~ 'x-sonosapi-stream:'){$currentTrack_Title=''};;\
my $currentTrack = $mystate eq 'TRANSITIONING'\
  ? 'Puffern...' : $currentTrack_Artist.' - '.$currentTrack_Title;;\
my $nextTrack_Artist = ReadingsVal($name,'nextTrack_Artist','FEHLER');;\
my $nextTrack_Title = ReadingsVal($name,'nextTrack_Title','FEHLER');;\
my $nextTrack = $nextTrack_Artist.' - '.$nextTrack_Title;;\
my $previouspic = 'rc_PREVIOUS';;\
my $nextpic = 'rc_NEXT';;\
my $voldownpic = 'rc_VOLDOWN';;\
my $voluppic = 'rc_VOLUP';;\
my $leavegrouppic = 'rc_LEFT';;\
my $showlg = ReadingsVal($name,"name","0") ne $groupname ? "<a href=\"/fhem?cmd.dummy=set $name leaveGroup&XHR=1\">".FW_makeImage($leavegrouppic)."</a>" : "";;\
if (($mystate eq 'PLAYING')\
  || ($mystate eq 'TRANSITIONING' )\
  || ($mystate eq 'set_next' )\
  || ($mystate eq 'set_previous' )\
  || ($mystate eq 'set_volumeUp' )\
  || ($mystate eq 'set_volumeDown' )\
  || ($mystate eq 'set_mute' )) { \
    my $shownp = ReadingsVal($name,'name','') eq $sgroupname \
    ? "<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>\
       <a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>" : "";;  \
    $show = "$showlg <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>\
    <a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>\
    $shownp\
    <a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>\
    &nbsp;;&nbsp;;&nbsp;;&nbsp;;\
    <a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>";;\
  \
    if (ReadingsVal($name,'name','') eq $sgroupname) {\
      $show = ReadingsVal($name,'currentTrack_TrackUri','') =~ 'spdif'\
      ? 'TV': ReadingsVal($name,'enqueuedMetadata_UpnpClass','FEHLER') ne 'object.item.audioItem.audioBroadcast'\
      ? "$show<marquee scrollamount=2 style='width: $wpix'>Aktueller Track: $currentTrack<br>Nächster Track: $nextTrack</marquee>"\
      : "$show<marquee scrollamount=2 style='width: $wpix'>Radio: $currentTrack</marquee>"\
    }\
    elsif (ReadingsVal($name,'name','') ne $groupname) {\
      $show = "$show Master: $sgroupname"}\
    }\
    else {\
      $show = $name eq $uuidtoname\
      ? "$showlg <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>"\
      : "$showlg <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a><br>Master: $sgroupname"\
    }\
  "<div>\
   <table>\
     <tr>\
       <td><div style='display: inline-block;; margin-right: 5px;; border: 1px solid lightgray;;\
              height: 4.00em;; width: 4.00em;; background-image: url($img);; background-size: contain;;'></div></td>\
       <td>$show</td>\
     </tr>\
   </table>\
   </div>"\
}
attr SonosControl favRadios 011.FM-NonStop60s,1A.Deutsche.Hits,FM.نجوم.100.6.(Arabisch)
attr SonosControl getList Favorites:noArg Reply_Favorites sonos/RINCON_000E58F7F67C01400/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Reply"}}\

attr SonosControl jsonMap volume_Master:volume mute_Master:mute transportState:state
attr SonosControl readingList sonos/RINCON_([0-9A-Z]+)/Reply:.* Replykomplett\
sonos/RINCON_([0-9A-Z]+)/Reply:.* {my $werte = json2nameValue($EVENT);;my @a;; while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_([0-9]+)_Title,g){push (@a, "$key $value")}};;my @s = sort @a;; my $g =join (',',@s);;$g =~ s/ /./g;;$g =~ s/Result_([0-9]+)_Title.//g;;{"Reply_Favorites"=>$g}}\
sonos/RINCON_([0-9A-Z]+)/Reply:.* {my $werte = json2nameValue($EVENT);;my @a;; while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._TrackUri,g){push (@a,"$key $value")}};;my @s = sort @a;;;; my $g =join (',',@s);;$g =~ s/Result_._TrackUri.//g;;{"Reply_TrackUris"=>$g}}\
sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }\
sonos/RINCON_000E58F7F67C01400/ZoneInfo:.* { json2nameValue($EVENT) }\
sonos/RINCON_000E58F7F67C01400/error:.* { json2nameValue($EVENT) }
attr SonosControl room MQTT2_DEVICE
attr SonosControl setList stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }\
play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
toggle:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "toggle" }\
volumeUp:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumeup" }\
volumeDown:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumedown" }\
volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
joinGroup:textField sonos/RINCON_000E58F7F67C01400/control { "command": "joingroup",  "input": "$EVTPART1"}\
leaveGroup:noArg { my $value = ReadingsVal("RINCON_000E58F7F67C01400","groupName","all");;qq(sonos/RINCON_000E58F7F67C01400/control { "command": "leavegroup",  "input": "$value" } ) }\
mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
playUri:textField {fhem("set $NAME setAVTUri $EVTPART1;; sleep 1;; set $NAME play")}\
setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
playFav:011.FM-NonStop60s,1A.Deutsche.Hits,1LIVE.diggi.(Top.40/Pop),Antenne.Thüringen.80er.(80er),COSMO.Chillout,DASDING.92.5.(Euro-Hits),FM.نجوم.100.6.(Arabisch),Hitradio.Ö3.99.9.(Österreichisch),Hörbücher,NDR.2,PsyRadioChillout,SWR4.Baden-Württemberg,SWR4.Rheinland-Pfalz,die.neue.welle.101.8.(Rock) {use JSON;;use HTML::Entities;;use Encode qw(encode decode);;my $enc = 'UTF8';;my $uri='';;my $search = (split(' ', $EVENT,2))[1];;$search=~s/[\/()]/./g;;my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;my $read = 'Favorites';;my $decoded = decode_json(ReadingsVal($dev,$read,''));;my @arr  = @{$decoded->{'Result'}};;foreach (@arr) {if (encode($enc, decode_entities($_->{'Title'})) =~ /$search/i){$uri = $_->{'TrackUri'} }};;fhem("set $NAME playUri $uri") if ($uri ne '')}\
playFa:select,Hörbücher,NDR.2,PsyRadioChillout,SWR4.Baden-Württemberg,SWR4.Rheinland-Pfalz,011.FM-NonStop60s,1A.Deutsche.Hits,1LIVE.diggi.(Top.40/Pop),Antenne.Thüringen.80er.(80er),COSMO.Chillout,DASDING.92.5.(Euro-Hits),die.neue.welle.101.8.(Rock),FM.نجوم.100.6.(Arabisch),Hitradio.Ö3.99.9.(Österreichisch) {my $werte = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));;my @ar;;while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._Title,g){push (@ar, "$key $value")}};;my @s = sort @ar;;my $g =join (',',@s);;$g =~ s/ /./g;;$g =~ s/Result_._Title.//g;;my $werte2 = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));;my @ar2;;while ( my ($key2, $value2) = each (%$werte2)) {if ($key2 =~ m,Result_._TrackUri,g){push (@ar2,"$key2 $value2")}};;my @s2 = sort @ar2;;my $g2 =join (',',@s2);;$g2 =~ s/Result_._TrackUri.//g;;my @a = split(',',$g);; my ($index) = grep { $a[$_] eq $EVTPART1 } (0 .. @a-1);;;;my $d = defined $index ? $index : -1;;my @b = split(',',$g2);;my $u = $b[$d];;fhem("set $NAME setAVTUri $u;; sleep 1;; set $NAME play")}\
togglefavRadios:noArg {my $l = AttrVal($NAME,"favRadios","none");;;;my $l = Each($NAME, $l);;;;fhem("set $NAME playFav $l")}\
speak:textField { my $tts="SonosTTS";;my ($cmd,$vol,$text)=split(' ', $EVENT,3);;fhem("set $tts tts $text;;sleep $tts:playing:.0 ;;set $NAME notify $vol [$tts:httpName]")}\
notify:textField sonos/RINCON_000E58F7F67C01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
attr SonosControl stateFormat enqueuedMetadata_Title

setstate SonosControl PsyRadio Chillout
setstate SonosControl 2020-08-16 12:50:54 Reply_Favorites Hörbücher,NDR.2,PsyRadioChillout,SWR4.Baden-Württemberg,SWR4.Rheinland-Pfalz,011.FM-NonStop60s,1A.Deutsche.Hits,1LIVE.diggi.(Top.40/Pop),Antenne.Thüringen.80er.(80er),COSMO.Chillout,DASDING.92.5.(Euro-Hits),die.neue.welle.101.8.(Rock),FM.نجوم.100.6.(Arabisch),Hitradio.Ö3.99.9.(Österreichisch)
setstate SonosControl 2020-08-16 13:02:51 Reply_TrackUris x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0,x-sonosapi-stream:rpde_svc_475?sid=232&flags=32&sn=4,x-sonosapi-stream:s45087?sid=254&flags=8224&sn=0,x-sonosapi-stream:s104196?sid=254&flags=8224&sn=0,x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4,x-sonosapi-stream:s76488?sid=254&flags=8224&sn=0,x-sonosapi-stream:s84548?sid=254&flags=8224&sn=0,x-sonosapi-stream:s65628?sid=254&flags=8224&sn=0,x-sonosapi-stream:s8007?sid=254&flags=8224&sn=0
setstate SonosControl 2020-08-16 12:50:54 Replykomplett {"Result":[{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s296020q.png","Title":"011.FM-NonStop60s","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/26","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://dtu8ldmaopof3.cloudfront.net/i/https:%2F%2Fderpimagecache.s3.amazonaws.com%2Fimage%2F475_288x162_2020-01-22-10-30-00-920.png_180.jpg","Title":"1A Deutsche Hits","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/41","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:rpde_svc_475?sid=232&flags=32&sn=4","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"1LIVE diggi (Top 40/Pop)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/49","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s45087?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s104196/images/logoq.png?t=153253","Title":"Antenne Thüringen 80er (80er)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/42","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s104196?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://dtu8ldmaopof3.cloudfront.net/i/https:%2F%2Fderpimagecache.s3.amazonaws.com%2Fimage%2F1944_288x162_2019-02-12-13-40-09-357.png_640.jpg","Title":"COSMO Chillout","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/30","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s20295/images/logoq.png","Title":"DASDING 92.5 (Euro-Hits)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/34","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s76488?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s84548/images/logoq.jpg","Title":"die neue welle 101.8 (Rock)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/39","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s84548?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s65628q.png","Title":"FM نجوم 100.6 (Arabisch)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/29","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s65628?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"Hitradio Ö3 99.9 (Österreichisch)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/37","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s8007?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"Hörbücher","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/32","ParentId":"FV:2","TrackUri":"x-rincon-playlist:RINCON_000E58F7F67C01400#S://192.168.188.26/OwnMusic/Hörbücher","ProtocolInfo":"x-rincon-playlist:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s228737/images/logoq.png?t=154228","Title":"NDR 2","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/43","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s228737?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s97066q.png","Title":"PsyRadioChillout","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/15","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"SWR4 Baden-Württemberg","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/48","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s20293?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"SWR4 Rheinland-Pfalz","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/47","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s1563?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"}],"NumberReturned":14,"TotalMatches":14,"UpdateID":9}
setstate SonosControl 2020-08-16 13:03:09 command play
setstate SonosControl 2020-08-16 17:02:52 coordinatorUuid RINCON_000E58F7F67C01400
setstate SonosControl 2020-08-16 15:51:05 currentTrack_Album Sprachdurchsagen
setstate SonosControl 2020-08-16 17:02:52 currentTrack_AlbumArtUri http://192.168.188.23:1400/getaa?s=1&u=x-sonosapi-stream:s97066%3fsid%3d254%26flags%3d8224%26sn%3d0
setstate SonosControl 2020-08-16 17:02:52 currentTrack_Artist Psyonysus
setstate SonosControl 2020-08-16 15:57:35 currentTrack_Duration 0:00:14
setstate SonosControl 2020-08-16 17:02:52 currentTrack_ItemId -1
setstate SonosControl 2020-08-16 17:02:52 currentTrack_ParentId -1
setstate SonosControl 2020-08-16 17:02:52 currentTrack_ProtocolInfo sonos.com-http:*:*:*
setstate SonosControl 2020-08-16 17:02:52 currentTrack_Title Exit Samsara
setstate SonosControl 2020-08-16 17:02:52 currentTrack_TrackUri x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0
setstate SonosControl 2020-08-16 17:02:52 currentTrack_UpnpClass object.item
setstate SonosControl 2020-08-16 17:02:52 enqueuedMetadata_ItemId -1
setstate SonosControl 2020-08-16 17:02:52 enqueuedMetadata_ParentId -1
setstate SonosControl 2020-08-16 17:02:52 enqueuedMetadata_Title PsyRadio Chillout
setstate SonosControl 2020-08-16 17:02:52 enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate SonosControl 2020-08-16 13:03:09 error_Action Play
setstate SonosControl 2020-08-16 13:03:09 error_Fault UPnPError
setstate SonosControl 2020-08-16 13:03:09 error_FaultCode s:Client
setstate SonosControl 2020-08-16 13:03:09 error_UpnpErrorCode 701
setstate SonosControl 2020-08-16 13:03:09 error_name SonosError
setstate SonosControl 2020-08-16 17:02:52 groupName Wohnzimmer
setstate SonosControl 2020-08-14 17:43:15 mute false
setstate SonosControl 2020-08-14 17:43:15 mute_LF false
setstate SonosControl 2020-08-14 17:43:15 mute_RF false
setstate SonosControl 2020-08-16 17:02:52 name Wohnzimmer
setstate SonosControl 2020-08-16 17:02:52 playmode NORMAL
setstate SonosControl 2020-08-16 17:02:52 state PLAYING
setstate SonosControl 2020-08-16 17:02:52 ts 1597590171809
setstate SonosControl 2020-08-16 17:02:52 uuid RINCON_000E58F7F67C01400
setstate SonosControl 2020-08-16 17:02:52 volume 13
setstate SonosControl 2020-08-16 17:02:52 volume_LF 100
setstate SonosControl 2020-08-16 17:02:52 volume_RF 100



Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 16 August 2020, 17:19:20
Das ist doch aber nichts anderes wie jetzt? Eine statische Auswahlbox ::)
playFa:select,Hörbücher,NDR.2....
Was ich gerne hätte wäre sowas in der Art:
playFa:{ReadingsVal('SonosBridge','Liste','')} {Code zum Start}

Damit muss man bei Favoriten Änderung den Setter nicht neu schreiben sondern nur ein Reading.

Oder ich versteh Dich mal wieder nicht :(
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 16 August 2020, 17:30:43
Ja das stimmt, das nichts anderes.


Mir gings jetzt eigentlich nur um die zwei Readings Reply_Favorites und Reply_Favorites, die es geben könnte, um ReadingsVal überhaupt verwenden zu können

Mir kommt jetzt, den playFav könnte man dann vlt. komplett in {} schreiben und dort ReadingsVal('SonosBridge','Liste','') verwenden ?
Weil so wie du es jetzt schreibst playFa:{ReadingsVal('SonosBridge','Liste','')} {Code zum Start} kann es nicht gehen, wegen dem select-Widget, hatten wir doch schon.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 16 August 2020, 17:35:38
ZitatMir gings jetzt eigentlich nur um die zwei Readings Reply_Favorites und Reply_Favorites, die es geben könnte, um ReadingsVal überhaupt verwenden zu können

aus dem JSON ziehen wir uns eh nur die Titel und Uris, was nur noch interessant wäre ist AlbumArtUri, aber das haben wir ja eh im Player als Reading
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 16 August 2020, 21:35:12
https://svrooij.io/sonos2mqtt/integrations/fhem.html (https://svrooij.io/sonos2mqtt/integrations/fhem.html)  :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 17 August 2020, 10:52:13
Zitat von: PatrickR am 13 August 2020, 17:58:32
Hallo zusammen,

es tut sich was bei der Problematik, dass unter bestimmten Umständen keine Events mehr kommen. Der Entwickler hat das Refreshen der Verbindung getunt und es gibt einen mqtt-Command, mit dem man den Refresh forcieren kann.

https://github.com/svrooij/sonos2mqtt/issues/112

Patrick
Moin,

ich habe das jetzt mal getestet: Einen Player ausgeschaltet und am nächsten Tag wieder angeschaltet. Der Player ist danach in gewissem Umfang steuerbar, aber es kommen keine Events. Ein
set mqtt2s publish sonos/cmd/check-subscriptions
behebt das Problem sofort.
Man müsste den Befehl jetzt irgendwie in der Bridge einbauen.
Wenn jemand die Player on/off betreibt kann so einfach mit gewisser Wartezeit nach dem Wiedereinschalten die Struktur aktualisiert werden.

Ich habe irgendwie nur im Quelltext eine Beschreibung gefunden:
Zitatset mqtt2s publish sonos/cmd/pauseall
set mqtt2s publish sonos/cmd/check-subscriptions
|Command|Description|Input|
|-------|-----------|-----|
|`notify`|Play a notification on all groups|See [notifications](control/notifications.html) |
|`speak`|Play a text-to-speech message on all speakers| See [text-to-speech](control/notifications.html#text-to-speech) |
|`pauseall`|Pause all speakers| - |
|`listalarms`|Fetch all alarms and post to `sonos/alarms`| - |
|`setalarm`|Set some properties of the alarm. | JSON object like you got from listing alarms.|
|`setlogging`|Change logging level at runtime.| `off` / `error` / `warning` / `information` / `debug` / `verbose`|
|`check-subscriptions`|Force refreshing the events that trigger everything in this app. After power cuts for instance.| - |

Nachtrag: Heute wurde das MQTT2 Gerät ca. 5 min nach dem Einschalten wieder mit Events versorgt. Also scheint auch der neu eingebaute Aktualisierungsmechanismus zu greifen.👍

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 18 August 2020, 16:09:49
Vielleicht mal wieder ein Zwischenstand:
Ich habe in den letzten Tagen beide Wikiartikel noch etwas überarbeitet, für euch also Zeit für lesen, probieren und Feedback
Für die weitere Arbeit habe ich ein paar Fragen:

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 18 August 2020, 17:23:35
HeHe,

wollte gerade schreiben da fehlt noch ein sleep bei dem Code mit Sprachansage  :D

Die Variante aus #459 mit $play:enqueuedMetadata_UpnpClass:.object.item.audioItem.audioBroadcast klappt bei dir nicht ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 18 August 2020, 17:29:29
Hab es gerade durchgespielt und noch etwas korrigiert. Am Ende gibt es dann doch immer noch kleine Fehler  :'(

Die Variante #459 klappt bei mir nicht.
Wenn man mit event-on-change-update .* arbeitet, kommt bei mir der Event gar nicht zu dem Zeitpunkt ;) Wenn man das nicht macht, sind die Eventfolgen ziemlich unübersichtlich.

Im Übrigen alles einreißen und die Basis neu machen:
# sonos2mqtt komplett von vorn
"pm2 stop sonos2mqtt"
delete model=sonos2mqtt_speaker
"rm ./www/images/default/Sonos*.png"
delete FileLog_MQTT2_RINCON_.*
"rm ./log/MQTT2_RINCON_*.log"
sleep SonosBridge:connected:.0; set WEB rereadicons
sleep WEB:rereadicons;delete model=sonos2mqtt_bridge,SonosTTS,SonosSpeakWeb,n_configSonos.,n_pm2_sonos

#sonos2mqtt neu beginnen - separat starten, mqtt2s anpassen!
define SonosBridge MQTT2_DEVICE
attr SonosBridge IODev mqtt2s
attr SonosBridge room MQTT2_DEVICE
defmod n_pm2_sonos notify global:INITIALIZED|n_pm2_sonos:start "pm2 -s start sonos2mqtt"
sleep global:ATTR.SonosBridge.stateFormat.connected;trigger n_pm2_sonos start
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: PatrickR am 18 August 2020, 17:48:21
Hi!
Zitat von: Otto123 am 17 August 2020, 10:52:13
Man müsste den Befehl jetzt irgendwie in der Bridge einbauen.
Wenn jemand die Player on/off betreibt kann so einfach mit gewisser Wartezeit nach dem Wiedereinschalten die Struktur aktualisiert werden.
Da mein Connect indirekt durch Harmony (ich erspare Dir die Details) gesteuert wird, wollte ich bei mir darauf reagieren und check-subscriptions schicken. Notfalls könnte man auch mit presence und ping arbeiten. Aber schön ist das alles nicht.

Zitat von: Otto123 am 17 August 2020, 10:52:13
Nachtrag: Heute wurde das MQTT2 Gerät ca. 5 min nach dem Einschalten wieder mit Events versorgt. Also scheint auch der neu eingebaute Aktualisierungsmechanismus zu greifen.👍
Prinzipiell überleben die offiziellen Sonos-Apps die Topologieänderungen auch, d. h. es muss irgendeine Möglichkeit geben, defekte Subscriptions zu erkennen. Was mir noch unklar ist, ist das von svrooij sehr lange gewählte Default-Intervall von 10 Minuten. Das spricht ja dafür, dass das periodische Prüfen der Subscriptions entweder sehr aufwendig ist oder Nebenwirkungen hat.

Patrick
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 18 August 2020, 17:48:54
Spricht denn irgendwas dagegen für set alias=Büro notify 25 {('http://[SonosTTS:host]/fhem/cache/KlingelTon.mp3')}
einen neuen setter-Namen zu finden und den dann wie in #490 vorgeschlagen umzusetzen (mit oder ohne Dateiendung) ?

Genauso für den "toggleRadio"-setter
{my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;my $r=Each($dev,ReadingsVal($dev,'favRadios',''));;my $play = (devspec2array('alias=Büro'))[0];;my $tts="SonosTTS";;fhem("set $tts tts Es folgt $r;;sleep $tts:playing:.0;;set $play playUri [$tts:httpName];;sleep $play:play;;sleep $play:PLAYING;;sleep $play:STOPPED;;set $play playFav $r")}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 18 August 2020, 18:00:28
Hallo Patrick,

zum einen habe ich im Wiki den Befehl in die SonosBridge eingebaut. Das funktioniert. Also wenn Du einschaltest (Harmony) warten und dann den Befehl absetzen sollte gut gehen.

Keine Ahnung was die App macht, aber die braucht auch eine Weile bis zur "Erkenntnis".  Du kannst ja das Interval verkürzen und schauen was passiert:
define a_sonoscheck +*00:05 set SonosBridge CheckSubscription

Es gibt aus meiner Sicht auch ERROR Meldungen - hab ich noch nicht untersucht.
PRESENCE und Ping - bloß nicht! Ich finde das läuft gruselig!

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 18 August 2020, 18:03:24
Zitat von: TomLee am 18 August 2020, 17:48:54
Spricht denn irgendwas dagegen
Ich denke nicht, kann man doch machen... :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 18 August 2020, 18:07:30
Zitat von: Otto123 am 18 August 2020, 18:03:24
Ich denke nicht, kann man doch machen... :)

Ich mein ins Template einbauen, nicht als Option die sich jeder selbst erweitern kann.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: PatrickR am 18 August 2020, 21:17:29
Mahlzeit!

Nachdem die Subscriptions nun funktionieren habe ich mich an die weitere Einrichtung gemacht.

Ich verwende für TTS den nativen sonos2mqtt-Weg über einen sonos-tts-polly-Container.

Dafür habe ich die setList wie folgt erweitert:

speak:textField { my (undef, $lang, $voice, $volume, @text) = split(/ /, $EVENT); sprintf('house/general/sonos/RINCON_949F3E14224A01400/control {"command":"speak","input":{"lang": "%s", "name":"%s", "volume":%s, "text": "%s","delayMs":700}}', $lang, $voice, $volume, join(" ", @text))}

Mit

set EG.KU.Sonos speak de-DE Vicki 25 Test

funktioniert das einwandfrei und klingt sogar noch gut.

Patrick
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 August 2020, 14:16:38
Zitat von: TomLee am 18 August 2020, 18:07:30
Ich mein ins Template einbauen, nicht als Option die sich jeder selbst erweitern kann.
Zur Vorbereitung habe ich die Setter playSound und toggleRadio umgesetzt und mit ins Wiki aufgenommen.  8) Schau Dirs mal an und teste.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 19 August 2020, 15:00:47
Klappt beides auf Anhieb bei mir.

Wozu ist $cmd im playSound-setter ?

Wozu im toggleRadios-setter den Namen des tts-Device in einer Variable ablegen, wenn man ihn nur einmal braucht ?
Macht man das wegen der Übersichtlichkeit so ?

Ähnlich gelagerte Frage beim devstateIcon, die Variable my $wpix wird zwei Mal verwendet, spart aber kein Zeichen Code, macht ihn sogar länger, die Variable hat genauso 5 Zeichen wie die 250px ?

Der Übersichtlichkeit wegen, wäre es evtl. angebracht die Sprachdateien nicht in cache sondern in einem Unterordner anzugeben ?
Auf dem Hauptsystem läuft bei mir echodevice, das hat einen Unterordner alexa-cookie erstellt.
Fänd das glaub ich besser, sowas wie cache/s2m/speakfiles und für die Soundfiles etwa cache/s2m/sounds
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 19 August 2020, 15:09:55
Mit getrennten Ordnern Sprachdateien/Sounds könnte man sich die Dateinamen der Soundfiles wieder (wers braucht) in einen setter holen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 August 2020, 15:12:53
Wozu ist $cmd im playSound-setter ? zum Wegwerfen :) kann man auch anders machen, aber ich fand es elegant
my ($cmd,$vol,$file)=split(' ', $EVENT,3)
erzeugt 3 Teile aus dem $EVENT, den Ersten brauch ich nicht, der Zweite ist VOL und der Dritte ist der komplette Rest und kann mit dem Konstrukt auch noch Leerzeichen enthalten. Ist auch einfach "Einheitlich"  ;)

Wozu im toggleRadios-setter den Namen des tts-Device in einer Variable ablegen, wenn man ihn nur einmal braucht ?
Macht man das wegen der Übersichtlichkeit so ?
Copy & Paste - man weiß ja nie. Ja kann man in dem Fall weglassen. Wird doch aber 3 mal gebraucht?!

Ähnlich gelagerte Frage beim devstateIcon, die Variable my $wpix wird zwei Mal verwendet, spart aber kein Zeichen Code, macht ihn sogar länger, die Variable hat genauso 5 Zeichen wie die 250px ?
Da wollte ich einfach die Konfigurierbarkeit am Anfang des Codes. Damit muss man nicht hinten oder mittendrin suchen. Ich habe das gern in den ersten Zeilen des Codes. Quasi sowas wie "Parameter Teil".
Ich habe beim Versuch mit der Laufschrift mit der Breite und Postion etwas gespielt. Da wollte ich schnell ändern.

Ja Unterpfade kann man natürlich machen. Mal etwas spielen und dann schauen wie es sich so macht. ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: australien am 23 August 2020, 17:11:27
Hallo Otto123

ich hab das MQTT2SONOS genau so aufgesetzt wie du es hier im Forum bzw im Wiki beschreibst.
Leider komme ich auf keinen grünen Zweig.

Ich bekomme im fhem log folgende Meldung:
[PM2][Initialization] Environment variable HOME (Linux) or HOMEPATH (Windows) are not set!
[PM2][Initialization] Defaulting to /etc/.pm2
fs.js:119
    throw err;
    ^

Error: ENOENT: no such file or directory, open '/etc/.pm2/pm2.log'
    at Object.openSync (fs.js:448:3)
    at module.exports.Client.launchDaemon (/usr/lib/node_modules/pm2/lib/Client.js:228:12)
    at /usr/lib/node_modules/pm2/lib/Client.js:104:10
    at /usr/lib/node_modules/pm2/lib/Client.js:320:14
    at processTicksAndRejections (internal/process/task_queues.js:79:9)
[PM2][Initialization] Environment variable HOME (Linux) or HOMEPATH (Windows) are not set!
[PM2][Initialization] Defaulting to /etc/.pm2
[PM2][Initialization] Environment variable HOME (Linux) or HOMEPATH (Windows) are not set!
[PM2][Initialization] Defaulting to /etc/.pm2
fs.js:119
    throw err;
    ^

Error: ENOENT: no such file or directory, open '/etc/.pm2/pm2.log'
    at Object.openSync (fs.js:448:3)
    at module.exports.Client.launchDaemon (/usr/lib/node_modules/pm2/lib/Client.js:228:12)
    at /usr/lib/node_modules/pm2/lib/Client.js:104:10
    at /usr/lib/node_modules/pm2/lib/Client.js:320:14
    at processTicksAndRejections (internal/process/task_queues.js:79:9)
fs.js:119
    throw err;
    ^

Error: ENOENT: no such file or directory, open '/etc/.pm2/pm2.log'
    at Object.openSync (fs.js:448:3)
    at module.exports.Client.launchDaemon (/usr/lib/node_modules/pm2/lib/Client.js:228:12)
    at /usr/lib/node_modules/pm2/lib/Client.js:104:10
    at /usr/lib/node_modules/pm2/lib/Client.js:320:14
    at processTicksAndRejections (internal/process/task_queues.js:79:9)


und die bridge verbindet sich nicht.

wenn ich am RPi eingebe:
pm2 status
bekomme ich folgende Meldung
pi@raspberrypi-fhem:~ $ pm2 status
┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name      │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
[PM2][WARN] Current process list running is not in sync with saved list. sonos2mqtt differs. Type 'pm2 save' to synchronize.



Wenn ich dann bei fhem in der Kommandozeile eingebe
"pm2 -s start sonos2mqtt"

kommt ins log
[PM2][Initialization] Environment variable HOME (Linux) or HOMEPATH (Windows) are not set!
[PM2][Initialization] Defaulting to /etc/.pm2
fs.js:119
    throw err;
    ^

Error: ENOENT: no such file or directory, open '/etc/.pm2/pm2.log'
    at Object.openSync (fs.js:448:3)
    at module.exports.Client.launchDaemon (/usr/lib/node_modules/pm2/lib/Client.js:228:12)
    at /usr/lib/node_modules/pm2/lib/Client.js:104:10
    at /usr/lib/node_modules/pm2/lib/Client.js:320:14
    at processTicksAndRejections (internal/process/task_queues.js:79:9)


Wenn ich am RPi eingebe
pm2 start sonos2mqtt

kommt
[PM2] Starting /usr/bin/sonos2mqtt in fork_mode (1 instance)
[PM2] Done.
┌─────┬───────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name          │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼───────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ sonos2mqtt    │ default     │ N/A     │ fork    │ 1849     │ 0s     │ 0    │ online    │ 0%       │ 22.0mb   │ pi       │ disabled │
└─────┴───────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘


und alles funktioniert.

Nach einem reboot ist aber wieder der pm2 aus und die bridge ist "tod".

Was übersehe ich?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 23 August 2020, 19:49:51
Hallo australien,

auf den ersten Blick vermute ich Du hast nodejs / pm2 / sonso2mqtt "falsch" installiert:
ZitatVoraussetzung: nodejs und pm2 ist installiert und für alle Benutzer verfügbar. Je nach Entwicklungsstand sind auch Betaversionen verfügbar. Für aktuelle Beta einfach anstatt sonos2mqtt -> sonosmqtt@3.1.0-beta.1 beim Setup verwenden.

sudo npm install -g sonos2mqtt
Hast Du sowohl pm2 als auch sonos2mqtt mit sudo (root) und mit der Option -g installiert?

In meiner Anleitung (kann man anders machen) läuft das ganze dann als User fhem.
Wenn man auf Systemebene "schauen" will muss man es auch als User fhem tun!
sudo -su fhem pm2 list

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: australien am 23 August 2020, 20:54:04
Ich bin nun nochmals alles Schritte deiner Anleitung https://heinz-otto.blogspot.com/2019/05/installation-nodejs.html (https://heinz-otto.blogspot.com/2019/05/installation-nodejs.html) durchgegangen.

ich bekomme folgende Meldung pi@raspberrypi-fhem:~ $ sudo npm install pm2 -g
/usr/bin/pm2 -> /usr/lib/node_modules/pm2/bin/pm2
/usr/bin/pm2-dev -> /usr/lib/node_modules/pm2/bin/pm2-dev
/usr/bin/pm2-docker -> /usr/lib/node_modules/pm2/bin/pm2-docker
/usr/bin/pm2-runtime -> /usr/lib/node_modules/pm2/bin/pm2-runtime
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@~2.1.2 (node_modules/pm2/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.1.3: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"arm"})
npm WARN ws@7.2.5 requires a peer of bufferutil@^4.0.1 but none is installed. You must install peer dependencies yourself.
npm WARN ws@7.2.5 requires a peer of utf-8-validate@^5.0.2 but none is installed. You must install peer dependencies yourself.

+ pm2@4.4.1
updated 1 package in 22.495s


und pi@raspberrypi-fhem:~ $ sudo -su fhem pm2 list
┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name      │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘


irgendwie will er es nicht kennen?!
im fhem log steht nach einem reboot
[PM2][Initialization] Environment variable HOME (Linux) or HOMEPATH (Windows) are not set!
[PM2][Initialization] Defaulting to /etc/.pm2
fs.js:119
    throw err;
    ^

Error: ENOENT: no such file or directory, open '/etc/.pm2/pm2.log'
    at Object.openSync (fs.js:448:3)
    at module.exports.Client.launchDaemon (/usr/lib/node_modules/pm2/lib/Client.js:228:12)
    at /usr/lib/node_modules/pm2/lib/Client.js:104:10
    at /usr/lib/node_modules/pm2/lib/Client.js:320:14
    at processTicksAndRejections (internal/process/task_queues.js:79:9)
    at runNextTicks (internal/process/task_queues.js:56:3)
    at listOnTimeout (internal/timers.js:505:9)
    at processTimers (internal/timers.js:479:7)

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 23 August 2020, 21:32:22
Die erste Warnungen habe ich auch, die mit ws@7.2.5 nicht. Da hast Du offenbar noch etwas laufen?
Was ergibt dies in der Systemkommandozeile?
ps -aux|grep pm2
Ich tappe dabei im Dunkeln. Ich installiere das nodejs Zeug von null - in der Analyse von anderen Umgebungen habe ich keine Ahnung.
fhem sollte Dateien unter /opt/fhem/.pm2 öffnen nicht unter /etc/.pm2 (gibt es bei mir nicht und will auch keiner schreiben)
Was gibt das in der FHEM Kommandozeile?
{qx(echo \$HOME)}

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: australien am 23 August 2020, 22:58:34
Zitat von: Otto123 am 23 August 2020, 21:32:22
Die erste Warnungen habe ich auch, die mit ws@7.2.5 nicht. Da hast Du offenbar noch etwas laufen?
Was ergibt dies in der Systemkommandozeile?
ps -aux|grep pm2
pi@raspberrypi-fhem:~ $ ps -aux|grep pm2
fhem      1334  0.0  3.7 126944 35464 ?        Ssl  20:45   0:02 PM2 v4.4.1: God Daemon (/opt/fhem/.pm2)
pi        1448  0.0  3.7 126940 35420 ?        Ssl  20:47   0:01 PM2 v4.4.1: God Daemon (/home/pi/.pm2)
pi        5436  0.0  0.0   7348   544 pts/0    S+   22:55   0:00 grep --color=auto pm2


Zitat
Was gibt das in der FHEM Kommandozeile?
{qx(echo \$HOME)}

Gruß Otto
da kommt nichts, ist leer

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 24 August 2020, 10:00:15
Moin,

ok das mit der $HOME Umgebungsvariable ist offenbar von irgendetwas abhängig. Ich habe die auch nicht auf allen Systemen. Auf meinen frisch installierten ist sie vorhanden. War aber eh nur so eine Idee von mir, ich weiß nicht genau wo das Problem liegt.
Du hast jetzt zweimal pm2 laufen. Das ist sicher kein Problem, solange dort nicht gleiche Sachen gemacht werden. Ich habe mich mal aus meinem Worx Landroid Account ausgesperrt, bis ich begriffen habe das man unter jedem user einen neuen Prozess mit pm2 starten kann.
Ich kann mein Setup mal noch unter verschiedenen Systemen und Umgebungen testen und die Unterschiede dokumentieren. Bisher hatte ich nur frische Systeme verwendet und alles neu installiert.

Du hast ja schon gesagt, wenn Du es mit User Pi startest läuft es. Du kannst auch dort den Autostart aktivieren, dann lässt Du den Start unter FHEM einfach weg.
pm2 start sonos2mqtt
pm2 startup

Nach dem letzten Befehl "redet" pm2 mit Dir. D.h. Er schreibt eine Zeile in der Art
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi

Da tust Du das was er sagt, die zweite Zeile kopieren und ausführen. Danach musst Du den Zustand noch sichern.
pm2 save
Dann wird beim Neustart vom System pm2 automatisch gestartet.
Das für den Start zuständige notify n_pm2_sonos in FHEM musst Du natürlich deaktivieren oder löschen.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: australien am 26 August 2020, 07:53:20
Danke Otto123

hab jetzt das pm2 so gestartet und es funktioniert alles.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 26 August 2020, 10:42:48
Gut das es läuft!
Du hast editiert  ;), ich war entsetzt über den Speicherzuwachs  :o ich habe das mal getestet. Deswegen einfach das Ergebnis - der Vollständigkeit halber :)
Nach setupFHEM
df -h
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/root        15G    1,5G   13G   11% /

Nach setupNodejs
df -h
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/root        15G    1,6G   13G   12% /
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: australien am 26 August 2020, 10:51:50
ja, hab editiert.
Das fhem hatte die backups mittlerweile sehr angehäuft und das war der Grund. bin jetzt wieder bei
pi@raspberrypi-fhem:~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        15G  9.9G  4.1G  71% /
devtmpfs        431M     0  431M   0% /dev
tmpfs           463M     0  463M   0% /dev/shm
tmpfs           463M  6.3M  457M   2% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           463M     0  463M   0% /sys/fs/cgroup
/dev/mmcblk0p1   42M   24M   18M  57% /boot
tmpfs            93M     0   93M   0% /run/user/1000


Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 27 August 2020, 14:47:37
Mir ist heute bei einer Sprachausgabe aufgefallen das das Sonos_Modul den Speak Befehl hintereinander ausführen kann wenn es zwei Events gibt die zur gleichen Zeit stattfinden und beide Events einen Sprachbefehl auslösen.

Das kann der s2m speak-Befehl (noch ?) nicht.

set SonosControl speak 20 bla;set SonosControl speak 20 bla

Meint Ihr das könnte mit den Parametern timeout und delayMs in notify zusammenhängen, hab schon etwas gespielt aber ohne Erfolg.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 27 August 2020, 16:23:12
Da hast Du Recht. Da muss ich mal nachdenken. TTS für sich macht das auch korrekt. Meine ganzen Sprachausgaben bauen darauf auf, dass "ich" einfach losfeuere und der arbeitet die nacheinander ab.
Jetzt verwenden wir das quasi parallel.

Mal schauen ;) da muss irgendwie ne Queue her. Das liegt nicht primär an s2m denke ich.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 29 August 2020, 16:33:38
Bin schon mehrfach gescheitert sonos-tts-polly ans laufen zu bekommen.

Heute frag ich.

Die Installation war mit npm i -g @svrooij/sonos-tts-polly

In /usr/local/bin siehts dann so aus:

pi@FHEMOS:/usr/local/bin $ ls -l
insgesamt 37292
-rwxr-xr-x 1 root root 38183868 Jul 30 18:21 node
lrwxrwxrwx 1 root root       38 Jul 30 18:21 npm -> ../lib/node_modules/npm/bin/npm-cli.js
lrwxrwxrwx 1 root root       38 Jul 30 18:21 npx -> ../lib/node_modules/npm/bin/npx-cli.js
lrwxrwxrwx 1 root root       31 Jul 30 18:31 pm2 -> ../lib/node_modules/pm2/bin/pm2
lrwxrwxrwx 1 root root       35 Jul 30 18:31 pm2-dev -> ../lib/node_modules/pm2/bin/pm2-dev
lrwxrwxrwx 1 root root       38 Jul 30 18:31 pm2-docker -> ../lib/node_modules/pm2/bin/pm2-docker
lrwxrwxrwx 1 root root       39 Jul 30 18:31 pm2-runtime -> ../lib/node_modules/pm2/bin/pm2-runtime
lrwxrwxrwx 1 root root       43 Jul 30 18:36 sonos2mqtt -> ../lib/node_modules/sonos2mqtt/lib/index.js
lrwxrwxrwx 1 root root       58 Aug 29 14:57 sonos-tts-polly -> ../lib/node_modules/@svrooij/sonos-tts-polly/dist/index.js


Die index.js sieht so aus:

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var config_1 = require("./config");
var server_1 = __importDefault(require("./server"));
var config = config_1.ConfigLoader.loadConfig();
var server = new server_1.default(config);
process.on('SIGINT', function () {
    console.log('Got [CTRL]+C signal, closing...');
    server.stop();
    process.exit();
});
//# sourceMappingURL=index.js.map



Will ich starten bekomm ich drei Fehler zurück

pi@FHEMOS:~ $ sonos-tts-polly --port 5601 --amazonKey AKIAJXEV7bliblablup --amazonSecret 5fOZ4stQ4GbliblablupVxmjCOhEl/QEKWRKO
/usr/local/bin/sonos-tts-polly: Zeile 1: use strict: Kommando nicht gefunden.
/usr/local/bin/sonos-tts-polly: Zeile 2: Syntaxfehler beim unerwarteten Wort `('
/usr/local/bin/sonos-tts-polly: Zeile 2: `var __importDefault = (this && this.__importDefault) || function (mod) {'


Hat irgendwer einen Tipp ?

Gruß

Thomas
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: PatrickR am 29 August 2020, 16:59:40
Hi!

Zitat von: TomLee am 29 August 2020, 16:33:38
Hat irgendwer einen Tipp ?
Ist Docker vielleicht eine Alternative? Dann funktioniert es einfach, Du kriegst von dem ganzen Node-Geraffel nix mit und hast es schön getrennt von Deinem Hauptsystem.

Mal als Appetitthäppchen:

docker run -d --name sonos-tts-polly --restart=always \
-p 5601:5601 \
-e SONOS_TTS_AMAZON_KEY=XXX \
-e SONOS_TTS_AMAZON_SECRET=YYY \
-e SONOS_TTS_AMAZON_REGION=eu-central-1 \
svrooij/sonos-tts-polly


So funktioniert es bei mir. sonos2mqtt ist übrigens ähnlich einfach.

Patrick
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 29 August 2020, 17:51:48
ZitatIst Docker vielleicht eine Alternative?

Keine Ahnung hab ich mich bisher noch nicht einmal mit beschäftigt.
Auf die Schnelle funktioniert es einfach so nicht.

War doch so gedacht das ich das im Terminal (mit Key und Secret) eingebe ?
Dann läuft der Docker bis ich mit strg+c beende ?

Unabhängig vom speak_Befehl ( der nicht klappt ) müsst ich ja, wenn der Server läuft, auch bspw. auf diese URL zugreifen können, was (noch) nicht geht:

http://192.168.188.67:5601/api/voices

Schau mir das später aber nochmal an.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: PatrickR am 29 August 2020, 19:27:11
Zitat von: TomLee am 29 August 2020, 17:51:48
War doch so gedacht das ich das im Terminal (mit Key und Secret) eingebe ?
Dann läuft der Docker bis ich mit strg+c beende ?
Eigentlich backgrounded der Container wegen -d selbst. Aber der erste Start kann etwas dauern, da erst das Image gezogen werden muss.

Was wird denn ausgegeben?

Mit docker logs -f sonos-tts-polly gibts auch nach dem Backgrounden das Log.

Patrick
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 30 August 2020, 16:11:37
Bin etwas weiter, hab aber einen Fehler gemacht und möchte den mittlerweile laufenden Container löschen und neu anlegen.

Zum löschen muss ich den Container zuvor beenden, bekomme es aber einfach nicht hin.

sudo docker stop sonos-tts-polly
sudo docker stop b93377e3508c
sudo docker stop b93377e3508c1576d374178627224595444aca55a8d9b52212742045c2b864b8


Nichts klappt.

sudo docker ps ergibt immer wieder:
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                    NAMES
b93377e3508c        svrooij/sonos-tts-polly   "docker-entrypoint.s..."   2 hours ago         Up 2 hours          0.0.0.0:5601->5601/tcp   sonos-tts-polly


Wie macht mans den richtig ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: PatrickR am 30 August 2020, 16:35:40
Zitat von: TomLee am 30 August 2020, 16:11:37
Wie macht mans den richtig ?
Du machst das schon richtig, aber irgendwas ist da verbogen. Muss ehrlich gestehen, dass ich noch nie einen hängenden Container hatte. Aktuell laufen 30 Container...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 30 August 2020, 18:12:40
sudo docker rm --force sonos-tts-polly
Hat das Spielchen beendet.




Weiter bin ich nach dem neu anlegen trotzdem nicht gekommen.

Zum Test mit sudo
sudo docker run -d --name sonos-tts-polly --restart=always \
-p 5601:5601 \
-e SONOS_TTS_AMAZON_KEY=AKIAJXEV7bliblablup \
-e SONOS_TTS_AMAZON_SECRET=5fOZ4stQ4GbliblablupVxmjCOhEl/QEKWRKO \
-e SONOS_TTS_AMAZON_REGION=eu-central-1 \
svrooij/sonos-tts-polly


pi@FHEMOS:~ $ sudo docker ps -a
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS                           PORTS               NAMES
6f9f51bae95f        svrooij/sonos-tts-polly   "docker-entrypoint.s..."   24 seconds ago      Restarting (139) 9 seconds ago                       sonos-tts-polly


pi@FHEMOS:~ $ sudo docker logs -f sonos-tts-polly
Gibt gar nichts zurück. Warum ?

Beenden klappt jetzt problemlos:
pi@FHEMOS:~ $ sudo docker stop 6f9f51bae95f

http://192.168.188.67:5601/api/voices
Ist immer noch nicht erreichbar



Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: PatrickR am 30 August 2020, 18:21:01
Port 5601 ist frei? Starte den Container doch mal ohne -d also im Vordergrund.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 30 August 2020, 18:36:29
Das ist ein Test-Raspi-zero, jungfräuliches FHEM mit ein paar MQTT2-Devices, mehr nicht, denke Port 5601 ist frei.
Wie gesagt ich hab null Bezug zu Docker, was genau passiert denn wenn man im Vordergrund startet.

So siehts bei mir aus:

pi@FHEMOS:~ $ sudo docker rm sonos-tts-polly
sonos-tts-polly
pi@FHEMOS:~ $ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
pi@FHEMOS:~ $ sudo sudo docker run --name sonos-tts-polly --restart=always \
> -p 5601:5601 \
> -e SONOS_TTS_AMAZON_KEY=AKIAJXEV7bliblablup \
> -e SONOS_TTS_AMAZON_SECRET=5fOZ4stQ4GbliblablupVxmjCOhEl/QEKWRKO \
> -e SONOS_TTS_AMAZON_REGION=eu-central-1 \
> svrooij/sonos-tts-polly
pi@FHEMOS:~ $ sudo docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS                           PORTS               NAMES
75ae454de291        svrooij/sonos-tts-polly   "docker-entrypoint.s..."   29 seconds ago      Restarting (139) 4 seconds ago                       sonos-tts-polly
pi@FHEMOS:~ $ sudo docker logs -f sonos-tts-polly
pi@FHEMOS:~ $
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: PatrickR am 30 August 2020, 19:21:11
Das ist höchstmisteriös.

Du solltest nach dem docker run keinen Prompt bekommen.

Mach mal bitte
netstat -nlp|grep 5601

und schau mal, ob direkt nach dem docker run was Spannendes im Syslog steht.

Patrick
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 30 August 2020, 20:14:14
pi@FHEMOS:~ $ netstat -nlp|grep 5601
(Es konnten nicht alle Prozesse identifiziert werden; Informationen über
nicht-eigene Processe werden nicht angezeigt; Root kann sie anzeigen.)
pi@FHEMOS:~ $ sudo netstat -nlp|grep 5601
pi@FHEMOS:~ $ sudo su
root@FHEMOS:/home/pi# netstat -nlp|grep 5601
root@FHEMOS:/home/pi#


Plötzlich kann ich nicht mehr stoppen, also wieder mit force, und bevor ich lange erkläre hier was ich ausgeführt habe:

pi@FHEMOS:/var/log $ sudo docker ps -a
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS                            PORTS               NAMES
75ae454de291        svrooij/sonos-tts-polly   "docker-entrypoint.s..."   2 hours ago         Exited (139) About a minute ago                       sonos-tts-polly
pi@FHEMOS:/var/log $ sudo docker stop 75ae454de291
75ae454de291
pi@FHEMOS:/var/log $ sudo docker ps -a
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS                            PORTS               NAMES
75ae454de291        svrooij/sonos-tts-polly   "docker-entrypoint.s..."   2 hours ago         Exited (139) About a minute ago                       sonos-tts-polly
pi@FHEMOS:/var/log $ sudo docker rm --force sonos-tts-polly
sonos-tts-polly
pi@FHEMOS:/var/log $ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
pi@FHEMOS:/var/log $ sudo docker run --name sonos-tts-polly --restart=always \
> -p 5601:5601 \
> -e SONOS_TTS_AMAZON_KEY=AKIAJXEV7WUYFOLNNTBA \
> -e SONOS_TTS_AMAZON_SECRET=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 \
> -e SONOS_TTS_AMAZON_REGION=eu-central-1 \
> svrooij/sonos-tts-polly
pi@FHEMOS:/var/log $ nano syslog



Im Log die letzten Sekunden:

Aug 30 20:07:56 FHEMOS avahi-daemon[259]: Registering new address record for fe80::9c81:52fa:d07b:86b6 on veth456af29.*.
Aug 30 20:07:56 FHEMOS dhcpcd[414]: veth5161fb7: carrier acquired
Aug 30 20:07:57 FHEMOS dhcpcd[414]: veth5161fb7: IAID a2:8c:da:c3
Aug 30 20:07:57 FHEMOS dhcpcd[414]: veth5161fb7: adding address fe80::83a5:a6f3:b850:6215
Aug 30 20:07:57 FHEMOS avahi-daemon[259]: Joining mDNS multicast group on interface veth5161fb7.IPv6 with address fe80::83a5:a6f3:b850:6215.
Aug 30 20:07:57 FHEMOS avahi-daemon[259]: New relevant interface veth5161fb7.IPv6 for mDNS.
Aug 30 20:07:57 FHEMOS avahi-daemon[259]: Registering new address record for fe80::83a5:a6f3:b850:6215 on veth5161fb7.*.
Aug 30 20:07:57 FHEMOS dhcpcd[414]: veth456af29: soliciting a DHCP lease
Aug 30 20:07:57 FHEMOS dhcpcd[414]: veth456af29: soliciting an IPv6 router
Aug 30 20:07:57 FHEMOS dhcpcd[414]: veth5161fb7: soliciting a DHCP lease
Aug 30 20:07:57 FHEMOS dhcpcd[414]: veth5161fb7: soliciting an IPv6 router
Aug 30 20:07:58 FHEMOS containerd[422]: time="2020-08-30T20:07:58.111856910+02:00" level=info msg="shim containerd-shim started" address="/co$
Aug 30 20:07:58 FHEMOS systemd[463]: run-docker-runtime\x2drunc-moby-99abe845b5e8dc080c73ab5bfa5f23906849da4d978144487a90b88bb8b4c6d4-runc.IM$
Aug 30 20:07:58 FHEMOS systemd[1]: run-docker-runtime\x2drunc-moby-99abe845b5e8dc080c73ab5bfa5f23906849da4d978144487a90b88bb8b4c6d4-runc.IMKZ$
Aug 30 20:07:58 FHEMOS avahi-daemon[259]: Registering new address record for fe80::74f6:42ff:fe0b:cd9c on veth456af29.*.
Aug 30 20:08:01 FHEMOS avahi-daemon[259]: Interface veth5161fb7.IPv6 no longer relevant for mDNS.
Aug 30 20:08:01 FHEMOS avahi-daemon[259]: Leaving mDNS multicast group on interface veth5161fb7.IPv6 with address fe80::83a5:a6f3:b850:6215.
Aug 30 20:08:01 FHEMOS dhcpcd[414]: veth5161fb7: carrier lost
Aug 30 20:08:01 FHEMOS avahi-daemon[259]: Withdrawing address record for fe80::83a5:a6f3:b850:6215 on veth5161fb7.
Aug 30 20:08:01 FHEMOS kernel: [ 9967.002038] docker0: port 1(veth456af29) entered disabled state
Aug 30 20:08:01 FHEMOS kernel: [ 9967.023820] eth0: renamed from veth5161fb7
Aug 30 20:08:01 FHEMOS kernel: [ 9967.053449] docker0: port 1(veth456af29) entered blocking state
Aug 30 20:08:01 FHEMOS kernel: [ 9967.053471] docker0: port 1(veth456af29) entered forwarding state
Aug 30 20:08:01 FHEMOS dhcpcd[414]: veth5161fb7: deleting address fe80::83a5:a6f3:b850:6215
Aug 30 20:08:01 FHEMOS dhcpcd[414]: veth5161fb7: removing interface
Aug 30 20:08:01 FHEMOS dhcpcd[414]: veth456af29: carrier lost
Aug 30 20:08:02 FHEMOS dhcpcd[414]: veth456af29: deleting address fe80::9c81:52fa:d07b:86b6
Aug 30 20:08:02 FHEMOS avahi-daemon[259]: Withdrawing address record for fe80::9c81:52fa:d07b:86b6 on veth456af29.
Aug 30 20:08:02 FHEMOS avahi-daemon[259]: Leaving mDNS multicast group on interface veth456af29.IPv6 with address fe80::9c81:52fa:d07b:86b6.
Aug 30 20:08:02 FHEMOS avahi-daemon[259]: Joining mDNS multicast group on interface veth456af29.IPv6 with address fe80::74f6:42ff:fe0b:cd9c.
Aug 30 20:08:02 FHEMOS dhcpcd[414]: veth456af29: carrier acquired
Aug 30 20:08:02 FHEMOS dhcpcd[414]: veth456af29: IAID 42:0b:cd:9c
Aug 30 20:08:02 FHEMOS dhcpcd[414]: veth456af29: soliciting a DHCP lease

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: PatrickR am 30 August 2020, 21:01:05
So langsam gehen mir die Ideen aus. Sorry.

ggf. nochmal
grep docker /var/log/syslog
da Dein Log etwas kurz ist.

Könntest den Raspi mal durchstarten, ggf. hängt da von den ersten Versuchen noch was. Aber das ist eher so eine Verzweiflungsidee. Wenn Du das tust, dann lasse mal —restart=always weg. Ggf. ist das der Grund, dass Du den Container nicht stoppen kannst. Mich macht ehrlich gesagt etwas stutzig, dass es vom Containerstart absolut keine Rückmeldung gibt.

Patrick
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Reinschki am 31 August 2020, 09:40:50
Hallo,

ich habe mir das am Wochenende mal etwas näher angeschaut und dank des super WIKI zum Thema mal eben die entsprechenden Docker Container erstellt.

Das Ganze funktioniert super und es gefällt mir. Ich könnte mir vorstellen damit das Sonos Modul abzulösen.

Eins habe ich allerdings nicht verstanden.
Es gibt ja noch das Docker Image ,,svrooij/sonos-tts-polly", dass man zusätzlich zum Docker Image ,,svrooij/sonos2mqtt" laufen lassen kann. Damit erhält man wohl die Fähigkeit, die synthetischen Stimmen von Amazon mit Sonos zu verwenden.

Das ist aber im Wiki noch nicht behandelt und auch noch nicht möglich! Oder?
Oder habe ich nur noch nicht die Stelle der Beschreibung gefunden, wie das einzurichten ist.

Das wär natürlich der absolute Knaller!

Viele Grüße
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Reinschki am 31 August 2020, 15:50:49
Also ein:
http://smartnuc:5601/api/voices
liefert:
[{"Gender":"Female","Id":"Lotte","LanguageCode":"nl-NL","LanguageName":"Dutch","Name":"Lotte","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Maxim","LanguageCode":"ru-RU","LanguageName":"Russian","Name":"Maxim","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Salli","LanguageCode":"en-US","LanguageName":"US English","Name":"Salli","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Geraint","LanguageCode":"en-GB-WLS","LanguageName":"Welsh English","Name":"Geraint","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Miguel","LanguageCode":"es-US","LanguageName":"US Spanish","Name":"Miguel","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Marlene","LanguageCode":"de-DE","LanguageName":"German","Name":"Marlene","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Giorgio","LanguageCode":"it-IT","LanguageName":"Italian","Name":"Giorgio","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Ines","LanguageCode":"pt-PT","LanguageName":"Portuguese","Name":"Inês","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Zeina","LanguageCode":"arb","LanguageName":"Arabic","Name":"Zeina","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Zhiyu","LanguageCode":"cmn-CN","LanguageName":"Chinese Mandarin","Name":"Zhiyu","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Gwyneth","LanguageCode":"cy-GB","LanguageName":"Welsh","Name":"Gwyneth","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Karl","LanguageCode":"is-IS","LanguageName":"Icelandic","Name":"Karl","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Joanna","LanguageCode":"en-US","LanguageName":"US English","Name":"Joanna","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Lucia","LanguageCode":"es-ES","LanguageName":"Castilian Spanish","Name":"Lucia","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Cristiano","LanguageCode":"pt-PT","LanguageName":"Portuguese","Name":"Cristiano","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Astrid","LanguageCode":"sv-SE","LanguageName":"Swedish","Name":"Astrid","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Vicki","LanguageCode":"de-DE","LanguageName":"German","Name":"Vicki","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Mia","LanguageCode":"es-MX","LanguageName":"Mexican Spanish","Name":"Mia","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Bianca","LanguageCode":"it-IT","LanguageName":"Italian","Name":"Bianca","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Vitoria","LanguageCode":"pt-BR","LanguageName":"Brazilian Portuguese","Name":"Vitória","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Raveena","LanguageCode":"en-IN","LanguageName":"Indian English","Name":"Raveena","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Chantal","LanguageCode":"fr-CA","LanguageName":"Canadian French","Name":"Chantal","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Amy","LanguageCode":"en-GB","LanguageName":"British English","Name":"Amy","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Brian","LanguageCode":"en-GB","LanguageName":"British English","Name":"Brian","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Russell","LanguageCode":"en-AU","LanguageName":"Australian English","Name":"Russell","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Aditi","LanguageCode":"en-IN","LanguageName":"Indian English","Name":"Aditi","AdditionalLanguageCodes":["hi-IN"],"SupportedEngines":["standard"]},{"Gender":"Male","Id":"Matthew","LanguageCode":"en-US","LanguageName":"US English","Name":"Matthew","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Dora","LanguageCode":"is-IS","LanguageName":"Icelandic","Name":"Dóra","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Enrique","LanguageCode":"es-ES","LanguageName":"Castilian Spanish","Name":"Enrique","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Hans","LanguageCode":"de-DE","LanguageName":"German","Name":"Hans","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Carmen","LanguageCode":"ro-RO","LanguageName":"Romanian","Name":"Carmen","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Ivy","LanguageCode":"en-US","LanguageName":"US English","Name":"Ivy","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Ewa","LanguageCode":"pl-PL","LanguageName":"Polish","Name":"Ewa","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Maja","LanguageCode":"pl-PL","LanguageName":"Polish","Name":"Maja","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Nicole","LanguageCode":"en-AU","LanguageName":"Australian English","Name":"Nicole","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Camila","LanguageCode":"pt-BR","LanguageName":"Brazilian Portuguese","Name":"Camila","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Filiz","LanguageCode":"tr-TR","LanguageName":"Turkish","Name":"Filiz","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Jacek","LanguageCode":"pl-PL","LanguageName":"Polish","Name":"Jacek","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Justin","LanguageCode":"en-US","LanguageName":"US English","Name":"Justin","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Celine","LanguageCode":"fr-FR","LanguageName":"French","Name":"Céline","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Kendra","LanguageCode":"en-US","LanguageName":"US English","Name":"Kendra","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Ricardo","LanguageCode":"pt-BR","LanguageName":"Brazilian Portuguese","Name":"Ricardo","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Mads","LanguageCode":"da-DK","LanguageName":"Danish","Name":"Mads","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Mathieu","LanguageCode":"fr-FR","LanguageName":"French","Name":"Mathieu","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Lea","LanguageCode":"fr-FR","LanguageName":"French","Name":"Léa","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Naja","LanguageCode":"da-DK","LanguageName":"Danish","Name":"Naja","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Penelope","LanguageCode":"es-US","LanguageName":"US Spanish","Name":"Penélope","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Tatyana","LanguageCode":"ru-RU","LanguageName":"Russian","Name":"Tatyana","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Ruben","LanguageCode":"nl-NL","LanguageName":"Dutch","Name":"Ruben","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Mizuki","LanguageCode":"ja-JP","LanguageName":"Japanese","Name":"Mizuki","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Takumi","LanguageCode":"ja-JP","LanguageName":"Japanese","Name":"Takumi","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Conchita","LanguageCode":"es-ES","LanguageName":"Castilian Spanish","Name":"Conchita","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Carla","LanguageCode":"it-IT","LanguageName":"Italian","Name":"Carla","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Kimberly","LanguageCode":"en-US","LanguageName":"US English","Name":"Kimberly","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Jan","LanguageCode":"pl-PL","LanguageName":"Polish","Name":"Jan","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Liv","LanguageCode":"nb-NO","LanguageName":"Norwegian","Name":"Liv","SupportedEngines":["standard"]},{"Gender":"Male","Id":"Joey","LanguageCode":"en-US","LanguageName":"US English","Name":"Joey","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Lupe","LanguageCode":"es-US","LanguageName":"US Spanish","Name":"Lupe","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Seoyeon","LanguageCode":"ko-KR","LanguageName":"Korean","Name":"Seoyeon","SupportedEngines":["standard"]},{"Gender":"Female","Id":"Emma","LanguageCode":"en-GB","LanguageName":"British English","Name":"Emma","SupportedEngines":["standard"]}]

Ich denke das ist soweit schon mal positiv!

Jetzt habe ich setList eines Players so erweitert
reden:noArg sonos/RINCON_5CAAFDC4E3E801400/control { "command":"speak", "input": {"text": "Someone at the front-door", "lang": "en-US", "gender": "male", "name": "Salli", "volume": 50, "onlyWhenPlaying": false, "delayMs": 700  }}
Ach ja: Den "SONOS_TTS_ENDPOINT" habe ich über die Docker-compose-Datei gesetzt.

Nach dem Abfeuern steht im Log des Containers "svrooij/sonos-tts-polly"
(node:1) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:533:11)
    at ServerResponse.header (/usr/src/app/node_modules/express/lib/response.js:771:10)
    at ServerResponse.send (/usr/src/app/node_modules/express/lib/response.js:170:12)
    at ServerResponse.json (/usr/src/app/node_modules/express/lib/response.js:267:15)
    at ServerResponse.send (/usr/src/app/node_modules/express/lib/response.js:158:21)
    at /usr/src/app/dist/server.js:151:53
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)


Damit komme ich leider nicht klar!
Hat jemand einen Tip wie ich weiter kommen kann?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: PatrickR am 31 August 2020, 20:17:56
Hi!

Hast Du
-e SONOS_TTS_AMAZON_REGION=eu-central-1
im polly-Container gesetzt? Ich hatte am Anfang Probleme und bin mir nicht sicher, welcher Fehler da aufgetreten ist.

Wenn es funktioniert findest Du weiter oben einen flexiblernen setList-Eintrag von mir für polly-tts.

Patrick
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Reinschki am 01 September 2020, 09:18:56
Hallo Patrick,

vielen Dank für deinen Tipp und den Hinweis auf den setList-Eintrag. Der hat mich auf jeden Fall vorwärts gebracht!
Auf dieser Basis habe ich weiter geforscht und festgestellt, dass es noch einen Slash am Ende von der Umgebungsvariable SONOS_TTS_CACHE_URI brauchte.

Hier der Auszug aus der Docker-Compose-Datei
  sonos-tts:
    image: svrooij/sonos-tts-polly
    ports:
      - "5601:5601"
    environment:
      - SONOS_TTS_AMAZON_KEY=Mein_Key
      - SONOS_TTS_AMAZON_SECRET=Mein_Geheimnis
      - SONOS_TTS_AMAZON_REGION=eu-central-1
      - SONOS_TTS_CACHE_URI=http://192.168.178.75:5601/cache/


Das ganze werde ich jetzt in mein Produktiv-system übertragen!!

Viele Grüße & vielen Dank für die Unterstützung
Reiner
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: PatrickR am 01 September 2020, 21:32:49
Hi!

Zitat von: Reinschki am 01 September 2020, 09:18:56
Das ganze werde ich jetzt in mein Produktiv-system übertragen!!

Sehr cool. Die Cache-Geschichte muss ich mir auch noch ansehen. Finde auf jeden Fall die Qualität der Polly-Stimmen sehr cool. Und mir gefällt auch, dass die Integration fhemseitig komplett transparent ist.

Jetzt müssen wir nur noch @TomLee ans Laufen bringen. Habe nur keine Idee, was da verbogen ist.

Edit:
Das mit dem Slash ist im .env-sample aber nicht so. Mach doch mal eine Issue auf. Der Entwickler ist sehr rührig.

Patrick
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beagel am 05 September 2020, 12:56:28
Hallo zusammen,

ich würde meine Sonos auch gerne über Sonos2mqtt steuern, nur leider stehe ich im Moment wie der Ochse vorm Berg, gehe nach Wiki vor bei:
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort
kommt immer  "Unknown template_entry_name sonos2mqtt_bridge_comfort"
Wo finde ich das passende Template und wie bekomme ich es geladen?
Über update vom Fhem wurde es nicht geladen, kann man es einzeln nach laden ?

Danke
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 06 September 2020, 17:32:47
@Beagel

Hast du nach dem update einen restart vom Server gemacht ?
Hast du den set Befehl über die Kommandozeile oder aus dem setter im Device den Template-Namen ausgewählt und den set-Befehl ausgeführt ?




Zitat
Jetzt müssen wir nur noch @TomLee ans Laufen bringen. Habe nur keine Idee, was da verbogen ist.

Hab mich wieder (kurz) mit beschäftigt.
Zitat
Das ist ein Test-Raspi-zero,

Das ist denk ich der entscheidende Hinweis das es nicht klappt, wenn ich mich zu Docker i.V.m Raspberry Pi zero armv6 anfange einzulesen.

Also ist Docker für mich zum testen erstmal hinfällig, hab noch zwei andere Pis (2/3), die mag ich zum Spielen aber nicht für kurze Zeit abklemmen.




Also wär ich für jeden Tip dankbar weshalb es mit dem "Node-Geraffel" nicht klappt, siehe #549
(https://forum.fhem.de/index.php/topic,111711.msg1081770.html#msg1081770)

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 06 September 2020, 22:50:22
Hallo Beagel,

was gibt die das zurück?
{qx(ls -lha FHEM/lib/AttrTemplate)}

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beagel am 07 September 2020, 17:56:12
Danke für die Hilfe,

@TomLee
Neustart wurde gemacht,
Set über Kommandozeile

@Otto123

Zitatinsgesamt 972K
drwxrwxr-x 2 fhem dialout 4,0K Jun 24 08:25 .
drwxrwxr-x 9 fhem dialout 4,0K Apr 30 18:28 ..
-rwxrwxr-x 1 fhem dialout 7,6K Sep  5 12:11 general_use.template
-rwxrwxr-x 1 fhem dialout 2,3K Jan 25  2020 hmccu.template
-rwxrwxr-x 1 fhem dialout  59K Jun  6 17:05 httpmod.template
-rwxrwxr-x 1 fhem dialout 4,9K Jan 25  2020 huedevice.template
-rwxrwxr-x 1 fhem dialout 4,6K Jun  6 17:05 max.template
-rwxrwxr-x 1 pi   pi      241K Jun 24 08:25 mqtt2.template
-rwxrwxr-x 1 fhem dialout 5,5K Jun  6 17:05 mysensors.template
-rwxrwxr-x 1 fhem dialout  11K Jun  6 17:05 speechcontrol.template

Hab jetzt erstmal alles was mit Sonos zutun hat gelöscht, es wurden auf einmal automatisch immer weitere Device angelegte mit dem Namen MQTT2_mqttjs_.* und die Logfiles dazu. Dadurch war auf einmal Fhem nicht mehr erreichbar und ich musste notgedrungen die Fhem.cfg direkt bearbeiten. Jetzt läuft es wieder.

Grüße in die Runde
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 07 September 2020, 18:03:00
nicht schön
Zitat-rwxrwxr-x 1 pi   pi      241K Jun 24 08:25 mqtt2.template

Hast Du selbst manipuliert :(

Tipp: Eigentümer gerade ziehen:
chown -R fhem: /opt/fhem/
Rechte gerade ziehen:
0755 für dir, 0644 für file
könnte man damit machen
chmod -R a=r,u+w,a+X /opt/fhem/

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beagel am 07 September 2020, 18:37:34
@Otto123
hab die Rechte angepasst

Zitatinsgesamt 972K
drwxr-xr-x 2 fhem dialout 4,0K Jun 24 08:25 .
drwxr-xr-x 9 fhem dialout 4,0K Apr 30 18:28 ..
-rw-r--r-- 1 fhem dialout 7,6K Sep  5 12:11 general_use.template
-rw-r--r-- 1 fhem dialout 2,3K Jan 25  2020 hmccu.template
-rw-r--r-- 1 fhem dialout  59K Jun  6 17:05 httpmod.template
-rw-r--r-- 1 fhem dialout 4,9K Jan 25  2020 huedevice.template
-rw-r--r-- 1 fhem dialout 4,6K Jun  6 17:05 max.template
-rw-r--r-- 1 fhem dialout 241K Jun 24 08:25 mqtt2.template
-rw-r--r-- 1 fhem dialout 5,5K Jun  6 17:05 mysensors.template
-rw-r--r-- 1 fhem dialout 154K Jan 26  2020 old_mqtt2.template
-rw-r--r-- 1 fhem dialout  11K Jun  6 17:05 speechcontrol.template

ist die mqtt2.template aktuell oder gibts eine neuere, wie würde ich die den updaten?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 07 September 2020, 18:43:25
https://forum.fhem.de/index.php/topic,111711.msg1062412/topicseen.html#msg1062412 (https://forum.fhem.de/index.php/topic,111711.msg1062412/topicseen.html#msg1062412)

Einfach oben in der Kommandozeile eingeben.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beagel am 08 September 2020, 19:25:30
Danke für eure Hilfe,
komme leider im Moment nicht dazu, mich weiter damit zu beschäftigen.
Muss auf eine dringende Dienstreise, hoffe das Fhem jetzt wieder ohne Aussetzer funktioniert, sonst gibts Ärger mit Haushaltsvorstand 😅

Grüße Dieter
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: australien am 15 September 2020, 09:09:53
ich bin nun auch  mit der Sprachausgabe eingestiegen.

Ich habe die Anleitung aus dem wiki durchgeführt, im /fhem/cache liegt auch die mp3 Datei. Der Player macht auch lt Anzeige im Status die Ausgabe, aber es wird der Radiosender nicht unterbrochen, bzw die Sprachdatei nicht ausgegeben?

Im Log des fhem steht
MQTT2_DEVICE set MQTT2_RINCON_7828CAC1D85001400 notify Mit http://raspberrypi-fhem:8083/fhem/cache/c7cd62bf4ebbd97e13984fbef775d1fa.mp3


Hab ich da noch was übersehen?

Danke
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 September 2020, 12:10:54
Hi,

da ich beim Unterbrechen von radiosendern auch schon komische Effekte hatte, fangen wir mal ganz vorn an :)
Funktioniert es wenn Du das per x_raw_payload abspielst?
{
  "command": "notify",
  "input": {
    "trackUri": "https://cdn.smartersoft-group.com/various/pull-bell-short.mp3",
    "onlyWhenPlaying": false,
    "timeout": 10,
    "volume": 15,
    "delayMs": 700
  }
}

Das Gleiche über notify?
20 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3

Hast Du bei speak eventuell bloß die Lautstärke vergessen?
20 Das ist eine Sprachdurchsage

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: australien am 15 September 2020, 14:01:18
Danke! Funktioniert alles!

Ich hatte nicht am Schirm, dass die Lautstärke noch extra mitübergeben werden muß.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 15 September 2020, 14:15:14
Hab gestern zufällig mit einer neuen Test-Instanz alles neu, nach Wiki, angelegt.

Dann verstehe ich, nach kurzem Test, nicht weshalb ich das zurückbekomme wenn ich den volume-Parameter weglasse ?

2020.09.15 11:01:31 3: MQTT2_DEVICE set MQTT2_RINCON_000E58F7F67C01400 speak Hallo
2020.09.15 11:01:31 1: PERL WARNING: Use of uninitialized value $text in concatenation (.) or string at (eval 686) line 1.
2020.09.15 11:01:31 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};{ my $tts="SonosTTS";my ($cmd,$vol,$text)=split(' ', $EVENT,3);fhem("set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]")}
2020.09.15 11:01:31 1: ERROR evaluating my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};{ my $tts="SonosTTS";my ($cmd,$vol,$text)=split(' ', $EVENT,3);fhem("set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]")}: Can't locate object method "name" via package "Empty string, empty guess" (perhaps you forgot to load "Empty string, empty guess"?) at ./FHEM/98_Text2Speech.pm line 610.


Gruß

Thomas
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 September 2020, 14:43:48
Hallo Thomas,

sowas wie die Voraussetzungen für TTS vergessen? https://wiki.fhem.de/wiki/Text2Speech
sudo apt-get install libdigest-perl-md5-perl libany-uri-escape-perl libtext-iconv-perl libencode-perl libmp3-info-perl mp3wrap

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 15 September 2020, 15:36:20
Ja, korrekt, richtig erkannt  8)  :P

Die mp3 wird bei mir aber auch ohne die Bibliotheken zu installieren abgespielt.

2020.09.15 11:02:15 3: MQTT2_DEVICE set MQTT2_RINCON_000E58F7F67C01400 speak 20 Hallo
2020.09.15 11:02:15 3: MQTT2_DEVICE set MQTT2_RINCON_000E58F7F67C01400 notify Hallo http://FHEMOS:8083/fhem/cache/71ce4185214eb43202358604a63cdcab.mp3
2020.09.15 11:02:15 3: MQTT2_DEVICE set MQTT2_RINCON_000E58F7F67C01400 notify Hallo http://FHEMOS:8083/fhem/cache/71ce4185214eb43202358604a63cdcab.mp3
2020.09.15 11:02:15 3: MQTT2_DEVICE set MQTT2_RINCON_000E58F7F67C01400 notify 20 http://FHEMOS:8083/fhem/cache/71ce4185214eb43202358604a63cdcab.mp3


Sind wohl die nötigsten bei OS schon vorhanden ?

Weiß nicht wie man schaut welche schon installiert sind, werde jetzt einfach mal installieren und sehen was als Rückmeldung kommt was zuvor schon vorhanden war.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 September 2020, 15:57:28
Da hab ich was für Dich :)
https://heinz-otto.blogspot.com/2019/07/infos-zur-installation-von-modulen-und.html

ich habe mp3wrap in Verdacht. Kannst Du schnell testen, wenn Du das attribute in TTS löschst
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 15 September 2020, 16:37:44
dpkg -l |grep ^ii| awk '{ print $2 }'

ergibt das nur libtext-iconv-perl und libencode-perl bereits vorhanden sind.

Zitatich habe mp3wrap in Verdacht. Kannst Du schnell testen, wenn Du das attribute in TTS löschst

steh ich jetzt auf dem Schlauch was genau du dann erwarten würdest, weil: hab noch nix zusätzlich installiert, das Attribut gelöscht.
Der speak-Befehl wird auch ohne das Attribut weiterhin korrekt ausgeführt, im Log steht jetzt :


2020.09.15 16:05:51 3: MQTT2_DEVICE set MQTT2_RINCON_000E58F7F67C01400 speak 20 Hallo
2020.09.15 16:05:52 3: MQTT2_DEVICE set MQTT2_RINCON_000E58F7F67C01400 notify 20 http://FHEMOS:8083/fhem/cache/71ce4185214eb43202358604a63cdcab.mp3


Dann kam mir während dem schreiben mal zu testen was passiert wenn FHEM neu gestartet wird.
Dann erfolgt auch eine Sprachansage auch ohne das Attribut, im Log steht wieder:

2020.09.15 16:29:32 3: MQTT2_DEVICE set MQTT2_RINCON_000E58F7F67C01400 speak 20 Hallo
2020.09.15 16:29:32 3: MQTT2_DEVICE set MQTT2_RINCON_000E58F7F67C01400 notify 20 http://FHEMOS:8083/fhem/cache/71ce4185214eb43202358604a63cdcab.mp3


Zusammenfassend ist außer libtext-iconv-perl und libencode-perl keine weitere Bibliothek installiert, das Attribut TTS_UseMP3Wrap nicht gesetzt und trotzdem klappt der speak-Befehl.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 September 2020, 16:54:00
Ich lag falsch: der Fehler kommt bei mir auch wenn ich Volume weglasse  ::)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 28 September 2020, 09:23:22
Hey und guten Morgen!

Nun habe ich dieses Jahr keinen UL mehr und bin wieder an Board. Wie ist der aktuelle Status?
Vor dem UL war es ja schon richtig gut und fast (für mich wegen Alexa) umstellbar. Hat sich zu der Frage SMB und co was getan?

Wo kann ich hier am sinnvollsten weiter machen?

Gruß,
87insane
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 28 September 2020, 09:39:03
Moin,

Der aktuelle Stand steht im Wiki. SMB wird aktuell nicht verwendet.
Offen ist lediglich das Abspielen von Sounds nacheinander, wenn sie parallel angestoßen werden. Dann gibt es aktuell Salat.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 29 September 2020, 09:20:27
Hi - Geil!

Link zum Beitrag oder so?

Das aktuelle Design muss ich mir nochmal ansehen. Wenn das nun soweit steht, würde ich tatsächlich gern mal umstellen. Das Modul macht immer mehr Thema.
Neu ist z.B. bei Durchsagen und laufender Musik in Gruppen, wird nichts mehr angesagt bis die laufende Musik aus geschaltet wird oder aber die Gruppen aufgelöst werden. Es sieht aus als hätte SONOS die Namenvergabe angepasst. Es ist nach wie vor z.B. Wohnzimmer + 2 aber dies ist dann auch der Playername und nicht mehr einzeln zusätzlich. Ist das bei MQTT auch ein Thema geworden?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 29 September 2020, 11:21:51
Moin,
FHEM Wiki und sonos2mqtt - wird direkt gefunden. https://wiki.fhem.de/wiki/Sonos2mqtt  8)

Zum Rest kann ich nichts sagen.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 06 Oktober 2020, 10:55:52
Ich habe so meine Probleme mit dem Text2Speach bzw Sonos2Mqtt Sprachausgaben. MP3 wird erzeugt, ist abspielbar und erreichbar.
ABER - Ich nutze zb https und auch Benutzer/PW.

Aus dem Wiki:
ZitatFür die Funktion ist wichtig, dass das Sonos System den Host im Link zur Datei richtig auflösen kann. Deshalb wird der Hostname und Port des Servers im Reading host des TTS Device als Name oder IP Adresse abgelegt! Dies kann entweder mit dem hier gezeigten Befehl oder vollständig manuell erfolgen.
Wenn ich httpName also anpasse auf: https://NUTZER:PASSWORT@IP/DNS:PORT/fhem/cache/hash123.mp3, ist die Datei auch über einen fremden PC abspielbar. Allerdings sagen die Sonos nichts. Wenn Musik läuft wird auch für die Zeit der Ansage unterbrochen aber es kommt nichts.

Kann Sonos https nicht? Habe ich hier ein Thema wegen Zertifikats-Kontrolle?

Gruß,
87insane
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 06 Oktober 2020, 12:23:12
Davon würde ich erstmal ausgehen, dass Sonos keine URL mit Anmeldung kann. Die können auch nur SMBv1.
HTTPS geht aber generell, siehe ja das Beispiel von Stephan mit https://cdn.smartersoft-group.com/various/pull-bell-short.mp3

Alternativ kannst Du die Bereitstellung über Samba machen. Hast Du ja sicher noch aktiv vom Sonos Modul. Hab ich das eigentlich als Alternativ im Wiki? Scheint man ja haben zu müssen ;)

Oder Du definierst ein Web ohne Passwort exklusiv für Sonos.
Allerdings wird das nur mit einem offiziellem prüfbaren Zertifikat funktionieren. Ein eigenes Clientzertifikat kann man nicht unterjubeln.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 07 Oktober 2020, 16:53:14
Zitatals Alternativ im Wiki?
Soweit ich sehen konnte nicht. Müsste mich auch nur eben rein lesen. Ist an sich ja das gleiche..
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: FunkOdyssey am 07 Oktober 2020, 17:01:12
Wie werden eigentlich die Readings wie DisplaySoftwareVersion aktualisiert?
Dies trägt immer noch ein altes Aktualisierungsdatum.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 07 Oktober 2020, 21:28:21
Das ist bisher nicht vorgesehen :)
Da müsstest Du set MQTT2_RINCON_.* x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}auslösen :)

Könnte man als seine Art Serviceroutine anlegen.

Zum Speak: Ich kümmere mich da nochmal drum, läuft ja momentan auch nicht in eine Queue. Dauert leider noch etwas.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: FunkOdyssey am 13 Oktober 2020, 17:35:16
Im Speaker-Template ist folgende Zeile enthalten:

my $mutecmd = ReadingsVal($name,'mute','0') eq 'false'?'on':'off';

Kann es sein, dass das falsch ist. Ich musste es so ändern:

my $mutecmd = ReadingsVal($name,'mute','0') eq 'false'?'true':'false';
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 20 Oktober 2020, 16:08:32
@FunkOdyssey Bei mir steht etwas anderes drin?
  mute:true,false { my $value = $EVTPART1 eq "true" ? "mute" : "unmute"; qq(BASE_TOPIC/DEV_ID/control { "command": "$value" } ) }\

Am Template hat sich nichts verändert attrTemplateVersion 20200729

Du kannst die Templates aktualisieren:
{ Svn_GetFile("FHEM/lib/AttrTemplate/mqtt2.template", "FHEM/lib/AttrTemplate/mqtt2.template", sub(){ AttrTemplate_Initialize() }) }
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: FunkOdyssey am 20 Oktober 2020, 16:17:19
Entschuldige, ich hatte die Details vergessen. Meine setList ist identisch. Mein Template ist auch aktuell.

"Meine" Zeile steht in devStateIcon. Basierend auf dem Wiki-Eintrag: https://wiki.fhem.de/wiki/Sonos2mqtt

my $mutecmd = ReadingsVal($name,'mute','0') eq 'false'?'on':'off';

Irgendwie scheint das nicht zueinander zu passen, oder?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 20 Oktober 2020, 18:50:21
Sorry, hatte ich falsch verstanden. Du hast völlig Recht, ich habe es im Wiki korrigiert.

Ich habe nochmal über https nachgedacht und #588 editiert ;)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 21 Oktober 2020, 10:49:34
ZitatHTTPS geht aber generell, siehe ja das Beispiel von Stephan mit https://cdn.smartersoft-group.com/various/pull-bell-short.mp3
Dann muss es am selbst signiertem Zertifikat liegen... Das müsste ich noch mit durch "schleifen"...

Hab aktuell die SMB Variante am laufen. Die war ja eh noch abgeschottet an. Finde ich aber SEMI! Würde es auch lieber aus schalten.

Würde auch gerne die Anzeige der Cover von außen möglich machen. Aber dafür müsste man sowas wie die Sonos DB haben bzw online anzapfen können. Die Cover werden aktuell über die lokale IP gezogen. Gibt bzw. kennt jemand den Link der "externen" DB? Die Sonos Boxen ziehen sich den Kram ja auch irgendwo her....

PS: pm2 hat mir nun echt das Leben schwer gemacht. Dazu brauch ich mal was FHEM geeignetes als Doku. Hab es nun hinbekommen aber naaaaja.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 21 Oktober 2020, 12:38:00
Problem
Hat sich erledigt

Generell sollte man, wenn man den setlist-Aufruf (https://forum.fhem.de/index.php/topic,111711.msg1079176.html#msg1079176) für Speak (sonos-polly-tts) nimmt, sollte man dort auch den Pfad anpassen ;-)

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 21 Oktober 2020, 13:53:27
Achso.. Es geht mit pm2 sicher besser aber für die, die es ggf. mögen...

Anbei mal ein devStateIcon für die Bridge.
{
my $amp = ReadingsVal($name,"connected","0") eq "0"
? "rot"
: ReadingsVal($name,"connected","0") eq "1" ? "gelb" : "gruen";;
my $stateinfo = ReadingsVal($name,"connected","0") eq "0"
? "sonos2MQTT Dienst ist aus"
: ReadingsVal($name,"connected","0") eq "1"
? "sonos2MQTT findet kein SONOS Gerät"
: "sonos2MQTT läuft!";;
my $start = "<a href=\"/fhem?cmd.dummy=set $name start_service&XHR=1\">".FW_makeImage("audio_play\@green")."</a>";;
my $stop = "<a href=\"/fhem?cmd.dummy=set $name stop_service&XHR=1\">".FW_makeImage("audio_stop\@red")."</a>";;
my $restart = "<a href=\"/fhem?cmd.dummy=set $name restart_service&XHR=1\">".FW_makeImage("audio_repeat\@blue")."</a>";;
my $show = FW_makeImage("10px-kreis-".$amp);;
"<div>$start $stop $restart &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $show $stateinfo</div>" }


Die Befehle:
start_service
stop_service
restart_service

könnte man so in sL eintragen (geht sicher besser, vor allem mit gecryptetem PW):
start_service:noArg {system ("sudo pm2 start sonos2mqtt -- --mqtt mqtt://USER:PW\@IP:PORT")}
restart_service:noArg {system ("sudo pm2 restart sonos2mqtt -- --mqtt mqtt://USER:PW\@IP:PORT")}
stop_service:noArg {system ("sudo pm2 stop sonos2mqtt")}


Hätte aber den Charm, das es so aussehen würde und steuerbar wäre. Man braucht es nicht so oft aber man müsste den Befehl nicht rauß suchen (für User die es ggf. nicht so oft brauchen)...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 21 Oktober 2020, 15:03:35
Bei dem Notify

notify:textField sonos/RINCON_B8E93729518A01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}

Landet im Log ein Fehler:

2020.10.21 14:59:26.344 3: MQTT2_DEVICE set Sonos_Wohnzimmer notify
2020.10.21 14:59:26.418 1: Error parsing >$EVTPART1,"delayMs":700< for volume


jemand eine Idee woran das liegt?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 21 Oktober 2020, 15:27:54
Sieht eher aus wie falsch benutztes speak...

Syntax ist
<volume><Text>
Beispiel:
50 Hallo Welt!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 21 Oktober 2020, 15:46:38
Zitat von: 87insane am 21 Oktober 2020, 15:27:54
Sieht eher aus wie falsch benutztes speak...

Syntax ist
<volume><Text>
Beispiel:
50 Hallo Welt!

bei mir?
Leider nein, speak funktioniert mittlerweile einwandfrei und ohne Eintrag im Log.
Der Fehler erscheint alleine beim notify, weshalb auch immer.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 21 Oktober 2020, 15:51:01
Ich stolpere gerade noch über eine andere Frage, eher grundsätzlicher Art.

Das sonos2mqtt_speaker Template, setzt das Topic in readingList und setList ja fix.
Was spricht dagegen Attribut devicetopic zu nutzen?
Dann kann man $DEVICETOPIC nutzen und ist bei Copy&Paste fein raus, insbesondere wenn man neue Set-Befehle austauscht.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: FunkOdyssey am 21 Oktober 2020, 15:51:19
@kjmEjfu
Ganz nebenbei: Du nutzt doch nun auch den sonos-polly-tts-Container, oder?
Wie sieht denn aktuell dein speak-Setter aus. Dieser dürfte doch anders aufgebaut sein, wie das speak über das TTS-Modul.

set MQTT2_RINCON_xxxxx speak de-DE Vicki 25 Dies ist ein Test
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 21 Oktober 2020, 15:59:50
Zitat von: FunkOdyssey am 21 Oktober 2020, 15:51:19
@kjmEjfu
Ganz nebenbei: Du nutzt doch nun auch den sonos-polly-tts-Container, oder?
Wie sieht denn aktuell dein speak-Setter aus. Dieser dürfte doch anders aufgebaut sein, wie das speak über das TTS-Modul.

set MQTT2_RINCON_xxxxx speak de-DE Vicki 25 Dies ist ein Test

sieht identisch aus. Habe mich dabei an die setList-Erweiterung von https://forum.fhem.de/index.php/topic,111711.msg1079176.html#msg1079176 gehalten.


Ich habe mal übrigens zwei Befehle aus dem Sonos-Modul nachgebaut (dafür muss zwingend das Attribut devicetopic gesetzt sein):

VolumeSave:textField { my $valueold = ReadingsVal("$NAME", "volume", "00"); my ($cmd,$valuenew)=split(' ', $EVENT,2); $valuenew += $valueold;fhem "setreading $NAME volumeSave $valueold"; qq($DEVICETOPIC/control { "command": "volume", "input": $valuenew } ) }

VolumeRestore:noArg { my $value = ReadingsVal("$NAME", "volumeSave", "00"); fhem "deletereading $NAME volumeSave"; qq($DEVICETOPIC/control { "command": "volume", "input": $value } ) }


Wobei das beim Save aktuell nur der relative Teil ist. Wenn das noch jemand mit mehr Perl KnowHow gemäß "Setzt die Lautstärke auf den angegebenen Wert. Der kann eine relative Angabe mittels + oder - sein. " anpassen kann, wäre auch toll.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 21 Oktober 2020, 16:12:14
Hab auch zwei angepasste Setter, die gehen aber sauber...
playWC:noArg {fhem("set $NAME playSound 50 musik.mp3; sleep $NAME.STOPPED; set $NAME setAVTUri 'x-sonosapi-stream:s25260?sid=254&flags=8224&sn=0'; sleep $NAME:currentTrack_TrackUri:.x-sonosapi-stream.*; set $NAME play")}
  stopWC:noArg {fhem("set $NAME stop; sleep 1; set $NAME playSound 50 musik_aus.mp3")}


In deinem notify ist jedenfalls laut LOG auch nichts gelandet und deswegen auch der "Fehler". Es wird eben was anderes erwartet als ankommt.

Da die beiden auch notify nutzen, ohne Probleme... Was genau versuchst du?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 21 Oktober 2020, 16:46:06
Zitat von: 87insane am 21 Oktober 2020, 16:12:14
In deinem notify ist jedenfalls laut LOG auch nichts gelandet und deswegen auch der "Fehler". Es wird eben was anderes erwartet als ankommt.

Da die beiden auch notify nutzen, ohne Probleme... Was genau versuchst du?

Ich versuche das Beispiel aus dem Wiki wegen der Klingel nachzubauen (https://wiki.fhem.de/wiki/Sonos2mqtt#Spiele_feste_Sounds)

Nachdem ich jetzt den Sonos Docker neu durchgestartet habe, funktioniert es. Mysteriös.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 21 Oktober 2020, 17:07:30
Wollt schon sagen. Hab die gerade nebeneinander gelegt. Identisch. Na dann ist ja alles gut. Würde die schelle aber tatsächlich über ein mswitch/notify/doif laufen lassen. Besser als in jeden Gerät einzeln. Dazu kannst du einfach die Geräte bei Bedarf anpassen.
Bei klingeln zb 3mal Sonos und 2 mal alexa. Je nachdem was an ist.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 21 Oktober 2020, 18:10:17
es ging mir erstmal nur um die reine Funktion :-)

Eigentlich würde ich das sonos2mqtt gerne so mit msg nutzen können wie vorher das "normale" Sonos. Denn kann ich wieder meine gewohnten Automatismen nutzen.
Hab dazu schon mal in https://forum.fhem.de/index.php/topic,39983.msg1094284.html#msg1094284 nachgefragt.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 21 Oktober 2020, 19:24:01
Die Verwendung von $EVTPARTx ist nicht Fehlertolerant und nur für Q&D Lösungen. Wenn man das ordentlich machen will muss man $EVENT selbst behandeln und auswerten.

@87insane Ich weiß nicht ob Du das mitbekommen hattest: Aus meiner Sicht wichtiger als den kompletten Service steuern ist mMn sowas hier:
attr SonosBridge setList PauseAll:noArg sonos/cmd/pauseall\
CheckSubscription:noArg sonos/cmd/check-subscriptions


Hatte Stephan in die letzte Version eingebaut. Mit checkSubscription wird der Neustart des Service fast obsolete.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 22 Oktober 2020, 08:28:26
Zitat von: Otto123 am 21 Oktober 2020, 19:24:01
Die Verwendung von $EVTPARTx ist nicht Fehlertolerant und nur für Q&D Lösungen. Wenn man das ordentlich machen will muss man $EVENT selbst behandeln und auswerten.

hab es umgebaut.

Jetzt muss ich "nur" noch schauen, wie ich erkenne, ob ein Vorzeichen dabei ist oder nicht. Aber man wächst mit seinen Aufgaben :-)

Neue Version:
VolumeSave:textField { my $valueold = ReadingsVal("$NAME", "volume", "00"); my ($cmd,$valuenew)=split(' ', $EVENT,2); if ($valuenew =~ m/^[+-]{1}/) { $valuenew += $valueold; }; fhem "setreading $NAME VolumeStore $valueold"; qq($DEVICETOPIC/control { "command": "volume", "input": $valuenew } ) }
VolumeRestore:noArg { my $value = ReadingsVal("$NAME", "VolumeStore", "00"); fhem "deletereading $NAME VolumeStore"; qq($DEVICETOPIC/control { "command": "volume", "input": $value } ) }
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 22 Oktober 2020, 09:09:30
Zwei Fragen:

1: @Otto123 (oder jemand anderes): kannst du mir was zu https://forum.fhem.de/index.php/topic,111711.msg1094308.html#msg1094308 sagen? Ich finde tatsächlich, wenn man auf DEVICETOPIC gerade ziehen würde, erspart das später einiges an Problemen von "blinden" Copy&Paste'lern.

2: kann man den Ausbau der SetList auch irgendwie auslagern? Ich habe die Befürchtung, wenn man recht viel der coolen und sinnvollen Funktionen des normalen Sonos-Moduls nachbaut, dann wird das Attribut arg unübersichtlich und lang.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 22 Oktober 2020, 09:39:25
Moin,
zu 1.
Zitat"blinden" Copy&Paste'lern.
die gehören eh verboten :)
Dadurch, das eigentlich alles per Template gesetzt wird und das andere momentan Entwicklung ist, sehe ich das erstmal nicht so als Vorteil. Mann muss ja irgendwas erstmal setzen: entweder ändert man den Namen (default) oder man setzt das attr devicetopic.

Zu 2. Um das ganze irgendwie lesbar zu machen, kann man einfach eine Perlfunktion in die 99_myUtils.pm auslagern. da steht dann in der Setlist nur noch sowas
VolumeSave:textField {sonos2mqtt(VolumeSave,$EVENT)}Besser ist sicher eine 99_sonos2Utils.pm mit auszuliefern.

Entwicklung ... :)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 22 Oktober 2020, 11:48:24
@Otto123: Komplett stecke ich nicht wieder drin aber das hatte ich gelesen nur noch nicht verstanden wofür es genau ist. Aber das wird sich ja nachlesen lassen.

Was mir auffällt ist das Sprachdurchsagen mit anschließendem STOP oder PLAY echt ne Kunst sind. Je nachdem wie MQTT die Infos sendet...
Anbei mal meine Lösung. ggf. geht es ja besser :)

  playWC:noArg {my $avturi="x-sonosapi-stream:s25260?sid=254&flags=8224&sn=0"; fhem("set $NAME playSound 50 musik.mp3; sleep $NAME.STOPPED; sleep $NAME.PLAYING; sleep $NAME.STOPPED; set $NAME setAVTUri $avturi; sleep $NAME:currentTrack_TrackUri:.x-sonosapi-stream.*; set $NAME play")}
  stopWC:noArg {fhem("set $NAME stop; sleep $NAME.STOPPED; set $NAME playSound 50 musik_aus.mp3")}


Besonders schlimm ist wenn man einen Radiosender hört/streamt, "Musik aus" ansagen lassen will und danach direkt einen stop will.
Dann spielt der Player gerne mal nach der Ansage einfach wieder den Stream vom Radio. Ich habe es nur so hin bekommen wie oben, um auch halbwegs schnell zu reagieren. Ein paar Antworten zuvor hatte ich bereits ein Beispiel gepostet - dieses ist aber viel zu langsam und funktioniert nicht immer. Das hier geht zumindest immer und ist halbwegs schnell. (das Transcodieren des Streams, lässt sich ja schlecht kürzen)

PS: Wer sich fragt wofür ich das nutze... Hab am WC einen Taster. Longpush macht nicht nur Licht, sondern auch Musik mit an.

EDIT: Bei aktivem event-on-change ist das Verhalten von state beim starten des streams anders.... (hier muss das sleep $NAME.STOPPED; am Anfang weg). Aber das beschleunigt den Fall nur also kann es in meinen Augen generell weg.
playWC:noArg {my $avturi="x-sonosapi-stream:s25260?sid=254&flags=8224&sn=0"; fhem("set $NAME playSound 50 musik.mp3; sleep $NAME.STOPPED; sleep $NAME.PLAYING; sleep $NAME.STOPPED; set $NAME setAVTUri $avturi; sleep $NAME:currentTrack_TrackUri:.x-sonosapi-stream.*; set $NAME play")}

Ach ja... das Verhalten als sleep zu nehmen ist in meinen Augen etwas schöner als Zeiten. ABER ich finde keine gute oder wirkliche Doku zu den .sleep Verhalten. Kann mir das einer mal kurz nahe bringen? Danke!

Gruß,
87Insane
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 22 Oktober 2020, 13:10:41
Zitat von: Otto123 am 22 Oktober 2020, 09:39:25
Besser ist sicher eine 99_sonos2Utils.pm mit auszuliefern.

Entwicklung ... :)

wobei es da vermutlich fast schon interessanter wäre, die bestehende 21_SONOSPLAYER.pm anzupassen und im Fall von model=sonos2mqtt_speaker die Befehle nicht an den Subprocess, sondern per MQTT zu schicken.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 22 Oktober 2020, 13:28:39
Das ist sicher ne andere Nummer...

Auslagern kann auch bedeuten: Template weiter pflegen und die config nicht angucken :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 22 Oktober 2020, 13:50:24
Es wäre vermutlich schon möglich, den Code von SONOSPLAYER aufzubohren und aus dem einen weiteren Client für die MQTT2_IO's zu bauen. Die Frage ist aber dann, wie das im Ergebnis dann leicht gepflegt werden kann.
Nach meinen Erfahrungen mit einem "eigenen" MQTT-Modul (für MiLight) und auch der jüngsten Rückmeldung von pah bzgl. des rooba-Dinges würde ich meinen, dass eine relativ offene Lösung bestehend aus einem "einfachen" MQTT2_DEVICE + myUtils-Code die einfacher zu pflegende Variante ist. Hat zwar den Nachteil, dass es relativ offen ist und ein User auch schon mal "Mist" bauen kann, wenn er Attribute löscht, aber via attrTemplate+myUtils-contrib-Code ist das dann recht einfach und standardisiert behebbar.



@(v.a.) Otto:
Falls du mit myUtils-Code einsteigen willst, würde ich dir dringend ans Herz legen, das ganze dann gleich in ein package einzubetten, Vorlage wäre dann https://svn.fhem.de/trac/browser/trunk/fhem/contrib/AttrTemplate/99_attrT_ZWave_Utils.pm.
Eventuell wäre es auch eine gute Idee, die gesamte JSON-Verarbeitung ebenfalls über eine myUtils-Funktion abzubilden. Ich bin da zwar selbst (effektiv&getestet) noch nicht besonders weit vorgedrungen, aber gedanklich schwebt mir sowas vor wie "milight_to_shutter2()" aus https://github.com/rejoe2/FHEM/blob/master/99_myUtils_MiLight.pm. Die (Beispiel-)Funktion (konkret: milight_to_shutter2($name,$EVENT)) sollte dann statt json2NameValue() die Payload entgegennehmen und gleich intern die passenden Readings "machen" und die Timer anschubsen, die derzeit über das notify laufen...
(Den Beispielcode sollte ich mal dringend testen, das ist bisher nur graue Theorie und war low prio.)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 22 Oktober 2020, 15:09:42
Zitat von: Beta-User am 22 Oktober 2020, 13:50:24
Es wäre vermutlich schon möglich, den Code von SONOSPLAYER aufzubohren und aus dem einen weiteren Client für die MQTT2_IO's zu bauen. Die Frage ist aber dann, wie das im Ergebnis dann leicht gepflegt werden kann.
Nach meinen Erfahrungen mit einem "eigenen" MQTT-Modul (für MiLight) und auch der jüngsten Rückmeldung von pah bzgl. des rooba-Dinges würde ich meinen, dass eine relativ offene Lösung bestehend aus einem "einfachen" MQTT2_DEVICE + myUtils-Code die einfacher zu pflegende Variante ist. Hat zwar den Nachteil, dass es relativ offen ist und ein User auch schon mal "Mist" bauen kann, wenn er Attribute löscht, aber via attrTemplate+myUtils-contrib-Code ist das dann recht einfach und standardisiert behebbar.

meine Idee bzgl. aufbohren war, dass man die ganzen Funktionen aus SONOSPLAYER "einfach" weiter nutzen muss. So würde man ja (mindestens) einen Teil nachbauen und damit teilweise auch doppelten Code erzeugen. Finde ich nicht so elegant.
Warum ist mir wichtig, dass die Befehle vom SONOSPLAYER weitgehend vorhanden sind? Weil dann der Umstieg sehr viel leichter ausfällt. Bestehende Automatismen müssen nicht angefasst werden, man legt nur die neuen Devices an, löscht die alten und benennt die neuen um.

Aber ich gestehe, ich habe die Diskussion zu MiLight und Roomba nicht verfolgt.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 22 Oktober 2020, 15:21:20
Na ja, ziemlich vorne in diesem Thread hatte ich mal mit dem Hinweis rumgenervt, dass doch bitte die setter- und Reading-Namen möglichst der Developer-Guide entsprechen sollten. Wenn das eingehalten ist (und auch der SONOSPLAYER-Code das beachtet hatte!), sollte man von der Bediener-Seite her eigentlich ziemlich nahe beieinander sein.
Was den im Hintergrund laufenden Code angeht, habe ich aber zugegebenermaßen keine Idee, was man da ggf. auf einfache Weise recyceln könnte. Meine Vermutung: sehr wenig, denn effektiv dürfte das meiste des funktionalen Codes (in Richtung der Sonos-Hardware) in dem sonos2mqtt-Code "gedoppelt" sein, MQTT2_DEVICE ist "eigentlich nur" die Benutzerschnittstelle...

Und eine große Diskussion zu MiLight (oder Roomba) gab es gar nicht. Es war nur in beiden Fällen so, dass die betreffenden "Entwickler" (das mit den Anführungszeichen gilt mir selber) in beiden Fällen direkt auf MQTT2_DEVICE gesetzt haben, nachdem das Umsetzen des Projekts "über ein paar Attribute" in beiden Fällen sehr viel einfacher ging wie das harte Codieren der speziell erforderlichen Routinen im Code (auf der bestehenden Codebasis von - im Prinzip - MQTT_DEVICE bzw. MQTT_DEVICE+MQTT).
Die weitergehenden Hinweise an @Otto sind eher eine interne Diskussion bzw. Anregung...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 22 Oktober 2020, 15:51:25
Wisst ihr zufällig, ob ich aus einer .pm heraus fremde Devices anpassen kann?
Also könnte eine 99_sonos2mqtt.pm die Set-/Get-Liste von 10_MQTT2_DEVICE.pm erweitern? Dann könnte man für MQTT2_DEVICE bei dem model=sonos2mqtt_speaker erfüllt ist, Funktionen erweitern, ohne dass der User seine setList anfassen muss.
Versteht ihr was ich meine?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 22 Oktober 2020, 16:07:20
Zitat von: kjmEjfu am 22 Oktober 2020, 15:51:25
Versteht ihr was ich meine?
Nee  :-\ :-[
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 22 Oktober 2020, 16:09:27
Ich glaube es erahnen zu können, wie du das meinst und bin aus mehreren Gründen skeptisch (aber "möglich" wäre es, nur wird das ganze dann m.E. unwartbar...).

Vermutlich hast du das Problem, dass du einen "nicht-MQTT-Befehl" absetzen willst?
Sowas gibt es auch, (mindestens) zu finden in OpenMQTTGateway_BT_scanner (setter deleteReadings).

Grundsätzlich würde ich empfehlen, "halbwegs" innerhalb des Systems zu bleiben, MQTT2_DEVICE ist ausreichend flexibel, und auch als Helfer kann man dann leichter erkennen, wenn bzw. wo irgendwo ggf. der Hase im Pfeffer liegt.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 22 Oktober 2020, 17:08:44
Zitat von: Beta-User am 22 Oktober 2020, 16:09:27
Vermutlich hast du das Problem, dass du einen "nicht-MQTT-Befehl" absetzen willst?
Sowas gibt es auch, (mindestens) zu finden in OpenMQTTGateway_BT_scanner (setter deleteReadings).

Grundsätzlich würde ich empfehlen, "halbwegs" innerhalb des Systems zu bleiben, MQTT2_DEVICE ist ausreichend flexibel, und auch als Helfer kann man dann leichter erkennen, wenn bzw. wo irgendwo ggf. der Hase im Pfeffer liegt.

Nee :-)

Ich versuch es anderes zu erklären
In 10_MQTT2_DEVICE.pm sind die Standard-Set Befehle für ein MQTT2-DEVICE definiert. Wir erweitern diese aktuell über SetList.
Diese Erweiterung würde ich gerne in eine 99_Sonos2mqtt.pm auslagern.
Aber nicht so, dass man diese selber händisch in der Art
VolumeSave:textField {sonos2mqtt(VolumeSave,$EVENT)}
wieder im SetList eintragen muss. Sondern so, dass ein MQTT2-Device, welches model=sonos2mqtt_speaker gesetzt hat, um die Set-Befehle aus 99_Sonos2mqtt.pm erweitert wird, ohne die SetList anfassen zu müssen.

Also diesen https://wiki.fhem.de/wiki/DevelopmentModuleIntro#X_Set Teil des Device Moduls zu erweitern.
Es sollen schon weiterhin MQTT-Befehle abgesetzt werden.

Ich weiß nicht, wie ich es sonst erklären soll  :-\
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 22 Oktober 2020, 17:31:34
Ebend. Du müßtest die SetFn austauschen. Geht zwar, ist aber unwartbar.

Du kannst aber das setList-Attribut doch auch automatisiert auswerten und ggf. dann eben erweitern. Ist zwar auch nicht trivial, aber m.E. eindeutig besser, als am Modulcode (am Autor vorbei) was rumzufrickeln.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 23 Oktober 2020, 15:32:22
Zitat von: Beta-User am 22 Oktober 2020, 17:31:34
Du kannst aber das setList-Attribut doch auch automatisiert auswerten und ggf. dann eben erweitern. Ist zwar auch nicht trivial, aber m.E. eindeutig besser, als am Modulcode (am Autor vorbei) was rumzufrickeln.

Also grundsätzlich würde Klassen erweitern jetzt nicht rumfickeln nennen, aber mag durchaus sein, dass in FHEM nicht vernünftig geht.


Dann habe ich noch zwei Userreadings gebastelt:

Shuffle { if (ReadingsVal($name,"playmode","NORMAL") =~ m/SHUFFLE/) {return 1} else {return 0} ;},
Repeat { if (ReadingsVal($name,"playmode","NORMAL") =~ m/REPEAT/) {return 1} else {return 0} ;}


Zusätzlich neues für die SetListe:

SleepTimer:textField { my ($cmd,$value)=split(' ', $EVENT,2); if ((lc($value) eq 'off') || ($value =~ 0)) { $value = '""' }; qq($DEVICETOPIC/control { "command": "sleep", "input": $value } ) }
Playmode:Normal,Shuffle,Repeat_All,Repeat_One,Shuffle_NoRepeat,Shuffle_Repeat_One {my ($cmd,$value)=split(' ', $EVENT,2); $value = uc($value);qq($DEVICETOPIC/control { "command": "playmode", "input": "$value" } ) }
VolumeRestore:noArg { my $value = ReadingsVal("$NAME", "VolumeStore", "00"); fhem "deletereading $NAME VolumeStore"; qq($DEVICETOPIC/control { "command": "volume", "input": $value } ) }
VolumeSave:textField { my $valueold = ReadingsVal("$NAME", "volume", "00"); my ($cmd,$value)=split(' ', $EVENT,2); if ($value =~ m/^[+-]{1}/) { $value += $valueold; }; fhem "setreading $NAME VolumeStore $valueold"; qq($DEVICETOPIC/control { "command": "volume", "input": $value } ) }


Das Löschen vom SleepTimer ist etwas unsauber in der Umsetzung, hab aber keine andere Lösung gefunden.

Btw Otto, du hattest gemeint, dass die Verwendung von $EVTPARTx eher was für Q&D sei. Das sonos2mqtt_speaker Template nutzt die durchgehend.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 23 Oktober 2020, 20:00:07
Ja, dass war durchaus Selbstkritik :)
Aber ich glaube an den bisherigen Ecken ist das durchaus ok.  ;) Es ist eher so: wenn man nicht im Hinterkopf hat, dass der $EVENT dabei einfach bei jedem Leerzeichen getrennt wird fällt man eventuell auf die Nase oder macht es sich unnötig schwer.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 24 Oktober 2020, 09:59:06
Ich habe nochmal eine grundsätzliche Frage.
Wie nah soll denn Sonos2mqtt an das "normale" Sonos kommen?

Hintergrund meiner Frage:
Sonos2mqtt schreibt z.B. Play. Das Sonos-Modul allerdings play.
Auch setzt das Modul einige (viele) Readings.

Aus meiner Sicht könnte es sinnvoll sein, wenn wir die Frage klären, damit hinterher nicht eventuell zuviel am Template umgebaut werden muss.
Sich am Modul orientieren, bringt den Vorteil, dass Umsteiger "nur" das Device austauschen müssen, dann aber bereits angelegte Automatismen problemlos weiter nutzen können. Der Nachteil wäre, dass es eventuell Flexibilität kostet und an manchen Stellen sicher etwas krampfig ist.

Was denkt ihr?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 24 Oktober 2020, 10:36:15
Immer noch meine 2ct: beide Varianten sollten den Developer Guide berücksichtigen! Da, wo es keine Konventionen gibt, gerne "as is" vom Modul her.Ggf. sollte optional ein neuer Modus im Modul angeregt werden...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 24 Oktober 2020, 11:13:26
Zitat von: Beta-User am 24 Oktober 2020, 10:36:15
Immer noch meine 2ct: beide Varianten sollten den Developer Guide berücksichtigen!

du meinst in dem Fall https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV ? Macht Sinn.
Würde aber z.B. bedeuten, dass wir das beliebte "speak" durch ein "sayText" ersetzen oder zumindest ergänzen müssen. Eine Ergänzung dann mit Vorbelegungen (Lautstärke, Sprache, Sprecher), damit

set ''<device>'' sayText "Anruf in Abwesenheit"

auch so funktioniert.

Konkrete Frage in dem Zusammenhang, weil ich da wirklich nicht fit bin und mich jetzt erstmal länger einlesen müsste.
Wie müssten wir denn dann die ReadingList umbauen, damit z.B. der aktuelle Artist nicht in "currentTrack_Artist" landet, sondern in "currentArtist"?
Vom

$DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }

in ReadingList müssten wir dann ja weg.

Zitat von: Beta-User am 24 Oktober 2020, 10:36:15
Ggf. sollte optional ein neuer Modus im Modul angeregt werden...

Jetzt verwirrst du mich.
Das war doch der Punkt, den ich gestern andiskutiert habe bzw. andiskutieren wollte  ;) In Fall müsste doch aber 21_SONOSPLAYER.pm neue Set-Befehle an einem MQTT2_DEVICE (mit dem gesetzten Attribut model=sonos2mqtt_speaker) anlegen, eventuell auch neue Readings.
Ich hatte dich so verstanden, dass dies eher nicht wünschenswert ist.

Habe ich gerade einen Knoten im Hirn oder verstehe ich deinen Satz falsch?

Meine Idealvorstellung ist, dem Nutzer kann es egal sein, ob sein konkretes Sonosgerät, über MQTT oder nativ angesprochen wird, die Befehle (und Readings) sind immer gleich.



Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 24 Oktober 2020, 11:14:57
Meine Intension war nicht irgendetwas abzulösen oder in Konkurrenz zu treten.
Der Weg über MQTT gefällt mir, da muss man schauen was man braucht, was das Hilfsmodul bietet, wie man das Ganze möglichst Userfreundlich und einfach einbindet.
Meine Intension war: Und klar geht es auch darum, was habe ich bisher genutzt und was brauche ich.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 24 Oktober 2020, 13:44:53
Ich wollte nur fragen :-)

Ihr habt die Hauptarbeit gemacht und jetzt kommt die Fleißarbeit. Das kann in die eine oder andere Richtung gehen. Wir sollten uns halt nur einigen, damit die nicht eventuell doppelt gemacht werden muss.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 26 Oktober 2020, 10:21:07
Moin,

mir fiel am WE ein: ich hatte noch eine andere Intension, die eben genau ein "generisches" Device bevorzugt. Als wir mit sonos2mqtt begannen, war der Modulautor von SONOS gerade irgendwie "nicht verfügbar" und es gab ein paar Probleme zu lösen. Also war der Ansatz: möglichst nur existierenden "Basics" von FHEM nehmen und daraus eine funktionierende Anbindung zu bauen. Da kann in der Not jeder auch immer wieder helfen und eingreifen. Mit den großen speziellen Modulen die es in FHEM gibt wird das immer schwierig.
BTW - sehe ich die Entwicklung von immer mehr "eigene kompletten Automatisierungslösungen"  in FHEM, die quasi "alles" in einem Modul können, immer kritischer.

Insofern wollte ich erstmal die Automatisierung von Sonos mit mqtt realisieren und weniger die Optik der Darstellung duplizieren. Ich weiß, dazu gibt es viele unterschiedliche Ansichten.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 26 Oktober 2020, 10:30:40
Zitat von: kjmEjfu am 24 Oktober 2020, 11:13:26
du meinst in dem Fall https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV (https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV) ? Macht Sinn.
Würde aber z.B. bedeuten, dass wir das beliebte "speak" durch ein "sayText" ersetzen oder [...]
Genau diese Guidlines waren gemeint, und ja, das würde bedeuten, dass das Sonos-Modul _im normalen Modus_ ggf. zu ändern wäre.

Zitat
Jetzt verwirrst du mich.
Das war nicht so zu verstehen, dass das MQTT-Device über das Sonos-Modul zu steuern sein sollte, sondern eben so, dass das "normale" Sonos-Ding eben auch (ggf. "featureleve-"abhängig) künftig die "üblichen" Konventionen einhält, so dass dann für "neue User" der Umstieg - zwischen welchem AV-"Modul"/Gerät zu einem anderen auch immer - einfacher wäre.
In dieser Denke ist das Sonos-Modul mit den heutigen Readings lediglich ein "legacy"-Typ. (Hoffe, das ist jetzt irgendwie klarer, und nein, das ist nicht als Vorwurf an den Maintainer gemeint).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: FunkOdyssey am 26 Oktober 2020, 18:01:40
Weiß jemand wie man erkennen kann, ob eine gültige Spotify-Sitzung im Sonosplayer vorhanden ist?
Ich möchte es automatisieren, dass ansonsten ein Radio-Stream gestartet wird, wenn keine Playliste/kein Titel geladen ist.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 26 Oktober 2020, 21:57:13
Ich bin nicht sicher was Du mit Sitzung meinst? Ich mache z.B. sowas:
defmod n_AZ1 notify PIR3:motion:.* {\
     if (ReadingsVal("Sonos_Wohnzimmer","infoSummarize1","") =~ /Deutschlandfunk.Kultur/ \
        and ReadingsVal("Sonos_Wohnzimmer","state","") eq "PLAYING"\
    and ReadingsVal("Sonos_Arbeitszimmer","transportState","") ne "PLAYING"\
    )\
{fhem("set Sonos Groups [Sonos_Wohnzimmer,Sonos_Arbeitszimmer]")}\
}
Wenn Bewegung im Arbeitszimmer und im Wohnzimmer läuft DFK dann füge das Arbeitszimmer dazu.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 27 Oktober 2020, 07:47:27
Zitat von: FunkOdyssey am 26 Oktober 2020, 18:01:40
Weiß jemand wie man erkennen kann, ob eine gültige Spotify-Sitzung im Sonosplayer vorhanden ist?
Ich möchte es automatisieren, dass ansonsten ein Radio-Stream gestartet wird, wenn keine Playliste/kein Titel geladen ist.

Schau mal im Player in das Reading currentTrack_TrackUri. Im Falle von Spotify müsste es anfangen mit: x-sonos-spotify
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: FunkOdyssey am 27 Oktober 2020, 09:41:46
Zitat von: Otto123 am 26 Oktober 2020, 21:57:13
Ich bin nicht sicher was Du mit Sitzung meinst? Ich mache z.B. sowas:
defmod n_AZ1 notify PIR3:motion:.* {\
     if (ReadingsVal("Sonos_Wohnzimmer","infoSummarize1","") =~ /Deutschlandfunk.Kultur/ \
        and ReadingsVal("Sonos_Wohnzimmer","state","") eq "PLAYING"\
    and ReadingsVal("Sonos_Arbeitszimmer","transportState","") ne "PLAYING"\
    )\
{fhem("set Sonos Groups [Sonos_Wohnzimmer,Sonos_Arbeitszimmer]")}\
}
Wenn Bewegung im Arbeitszimmer und im Wohnzimmer läuft DFK dann füge das Arbeitszimmer dazu.

Danke. Das kenne ich vom klassischen Sonos-Modul auch. Das Reading infoSummarize1 deutet auch stark darauf hin, dass du hier noch nicht die Sonos2Mqtt-Lösung nutzt, oder?

Bei der Mqtt-Variante ist das schwieriger zu erkennen.

Zitat von: kjmEjfu am 27 Oktober 2020, 07:47:27
Schau mal im Player in das Reading currentTrack_TrackUri. Im Falle von Spotify müsste es anfangen mit: x-sonos-spotify

Danke, ich habe die Readings auch beobachtet. Aber teilweise hat der Sonosplayer keine gültige Spotify-Sitzung und das obwohl scheinbar ein Track geladen ist.
Würde ich dann ein "set xyz play" ausführen, dann findet keine Wiedergabe statt.

Ich suche mal weiter und melde mich, wenn ich etwas in Erfahrung bringen konnte.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 27 Oktober 2020, 11:18:00
spielst du aus der Spotify-App auf Sonos ab oder Spotify aus der Sonos-App?
Könnte eventuell einen Unterschied machen, weil Sonos ja quasi "kontoneutral" auf Spotify abgreift, damit sie mit einem Konto auf jeder Box unterschiedlich abspielen können.

Wenn ich aus der Sonos-App abspiele, ist auch

currentTrack_ProtocolInfo sonos.com-spotify:*:audio/x-spotify:*

entsprechend gesetzt
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 27 Oktober 2020, 11:27:18
@FunkOdyssey Mein Beispiel war eher um nachzufragen was Du wirklich meinst :) Aber ja, meine Automatismen laufen teils noch auf dem Sonos Modul.

Du meinst sowas wie den currentTrackProvider - den gibt es unter mqtt nicht, oder "wir" haben ihn nicht aktiviert?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 27 Oktober 2020, 12:24:53
Zitat von: Otto123 am 27 Oktober 2020, 11:27:18
Du meinst sowas wie den currentTrackProvider - den gibt es unter mqtt nicht, oder "wir" haben ihn nicht aktiviert?

der sollte sich aber aus currentTrack_ProtocolInfo ableiten lassen.

Wir hätten da:
sonos.com-spotify:*:audio/x-spotify:* -> Spotify
sonos.com-http:*:*:* -> Stream

Wobei, wenn ich mir gerade meinen Radiostream anschaue, dann ist currentTrack_TrackUri doch aussagekräftiger.
x-sonosapi-stream:tunein:5191?sid=303&flags=8224&sn=11 -> TuneIn
Bei Spotify steht dort sowas x-sonos-spotify:spotify:track:..... -> Spotify

Könnte man also nehmen und dann, weil https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV nix vorgibt, nach currentMediaSource speichern.

ins Userreading:
currentMediaSource { if (lc((ReadingsVal($name,"currentTrack_TrackUri","")) =~ m/tunein/)) {return "TuneIn"} elsif (lc((ReadingsVal($name,"currentTrack_TrackUri","")) =~ m/spotify/)) {return "Spotify"}else {return "unknown"} ;}

geht bestimmt schöner ;-)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 27 Oktober 2020, 12:44:55
Zitat von: kjmEjfu am 27 Oktober 2020, 12:24:53
Könnte man also nehmen und dann, weil https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV (https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV) nix vorgibt, nach currentMediaSource speichern.
fyi: Das "einfach mal machen" ist nicht verboten, aber evtl. würde es Sinn machen, dazu mal einen gesonderten Thread aufzumachen:
Zitat von: Beta-User am 17 April 2020, 12:30:28
Vielleicht hier etwas OT, aber thematisch paßt es aus Usersicht evtl. ganz gut rein:

Wir hatten grade das Thema "sinnvolle Namensgebung" bei Readings usw. rund um eine bestimmte Ladestation für E-Autos (go-echarger, diese Threads: MQTT-Weg (https://forum.fhem.de/index.php/topic,105457.msg1043434.html#msg1043434)  und spezielles Modul (https://forum.fhem.de/index.php/topic,110282.msg1043223.html#msg1043223)).

Was z.B. Multimedia-Geräte angeht, habe ich gestern erst wahrgenommen, dass es sowas für Multimedia schon gibt (https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV (https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV)) und eben das hier gefunden: (https://wiki.fhem.de/wiki/DevelopmentGuidelinesReadings (https://wiki.fhem.de/wiki/DevelopmentGuidelinesReadings)).

Das ist alles irgendwie noch nicht so richtig miteinander verknüpft und sehr bruchstückhaft...
Vielleicht mag sich jemand (oder eine Gruppe von Leuten) mal die Mühe machen, einen deutlich umfassenderen Vorschlag dazu zu erarbeiten bzw. das nach und nach erweitern? Das würde jedenfalls aus usersicht (und teils auch aus Ansteuerungssicht untereinander) m.E. einiges an verbessertem "Look and feel" bringen und wir würden nicht nachlaufend dann jeweils Reparaturen machen oder historische Zufälle zum Maß der Dinge machen...

Zitat
ins Userreading:
currentMediaSource { if (lc((ReadingsVal($name,"currentTrack_TrackUri","")) =~ m/tunein/)) {return "TuneIn"} elsif (lc((ReadingsVal($name,"currentTrack_TrackUri","")) =~ m/spotify/)) {return "Spotify"}else {return "unknown"} ;}

geht bestimmt schöner ;-)
Ja. 1. mit trigger (!) und 2. mit "schnellem return". Ungetestet:
currentMediaSource:currentTrack_TrackUri.* { return "TuneIn" if ReadingsVal($name,"currentTrack_TrackUri","") =~ m/tunein/i; return "Spotify" if ReadingsVal($name,"currentTrack_TrackUri","") =~ m/spotify/i; return "unknown";}
Und wenn man noch mehr hat, ist es übersichtlicher, das ganze als Hash-lookup zu schreiben, ähnlich z.B. zum go_eCharger. Die Regex wäre dann halt sowas in der Art hier:
[^:]+:([^:]+):.+
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 27 Oktober 2020, 13:02:38
Zitat von: kjmEjfu am 27 Oktober 2020, 12:24:53
Wobei, wenn ich mir gerade meinen Radiostream anschaue, dann ist currentTrack_TrackUri doch aussagekräftiger.
Ich denke auch dort steht - etwas codiert - das wichtigste drin. Jetzt kann man dort irgendwie was zusammen puzzeln - ich denke der Klartext steht auch irgendwo dort in einem Konfigurations XML http://PlayerIP:1400/xml/device_description.xml

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 27 Oktober 2020, 13:21:17
Zitat von: Beta-User am 27 Oktober 2020, 12:44:55
fyi: Das "einfach mal machen" ist nicht verboten, aber evtl. würde es Sinn machen, dazu mal einen gesonderten Thread aufzumachen:

Bin ich bei dir, aber da gibt es weitaus erfahrenere Entwickler, die so ein Thema voran bringen können. Ich glaube, die festgelegten Readings für Batterie haben sich auch noch nicht überall durchgesetzt ...

Zitat von: Beta-User am 27 Oktober 2020, 12:44:55
Ja. 1. mit trigger (!) und 2. mit "schnellem return". Ungetestet:
currentMediaSource:currentTrack_TrackUri.* { return "TuneIn" if ReadingsVal($name,"currentTrack_TrackUri","") =~ m/tunein/i; return "Spotify" if ReadingsVal($name,"currentTrack_TrackUri","") =~ m/spotify/i; return "unknown";}
Und wenn man noch mehr hat, ist es übersichtlicher, das ganze als Hash-lookup zu schreiben, ähnlich z.B. zum go_eCharger. Die Regex wäre dann halt sowas in der Art hier:
[^:]+:([^:]+):.+

Danke, nach so einem Beispiel habe ich gesucht :-)
Frage: wieso würdest du das per trigger lösen?

Wegen dem Beispiel go_eCharger meinst du diesen Thread? https://forum.fhem.de/index.php/topic,105457.0.html Ich versuche deinen Hinweis auf Hash-Lookup (der wäre ja vermutlich gerade für das Anpassen der Readings auf die Guideline sinnvoll) zu verstehen. Ist für einen Copy&Past'ler nicht so einfach ;-)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 27 Oktober 2020, 13:52:09
Zitat von: kjmEjfu am 27 Oktober 2020, 13:21:17
Bin ich bei dir, aber da gibt es weitaus erfahrenere Entwickler, die so ein Thema voran bringen können. Ich glaube, die festgelegten Readings für Batterie haben sich auch noch nicht überall durchgesetzt ...
Danke für die "Vorlage": Das Problem mit battery ist, dass es erst den Wildwuchs gab und dann die Konvention! Daher meine dringliche Anregung, erst zu fragen, was denn eine sinnvolle Konvention ist, bevor man hinterher darüber diskutiert, wer denn jetzt sinnvollerweise was in welche Richtung anpassen soll...!

Und diese Diskussion können (eigentlich auch und gerade) erfahrene User auch gut führen... (Will sagen: sehr schwache Ausrede!)

Zitat
Danke, nach so einem Beispiel habe ich gesucht :-)
Frage: wieso würdest du das per trigger lösen?
Gerne, und die Frage nach "wieso" verstehe ich nicht. Die Frage ist, wann der Code ausgeführt werden soll. "trigger" schränkt das von "bei jeder Aktualisierung von irgendwas" auf "dann, wenn sinnvoll" ein... Von daher ist meine ganz pauschale Antwort: trigger ist eigentlich keine optionale Angabe, sondern verpflichtend!
Zitat
Wegen dem Beispiel go_eCharger meinst du [...] Ist für einen Copy&Past'ler nicht so einfach ;-)
Jein, eigentlich ist hier der dort entstandene Quelltext gemeint gewesen, zu finden z.B. ab hier: https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/lib/AttrTemplate/mqtt2.template#L3941
Und ja, das ist alles nicht einfach, aber ich habe auch mit c&p angefangen...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 27 Oktober 2020, 14:50:17
Zitat von: Beta-User am 27 Oktober 2020, 13:52:09
Danke für die "Vorlage": Das Problem mit battery ist, dass es erst den Wildwuchs gab und dann die Konvention! Daher meine dringliche Anregung, erst zu fragen, was denn eine sinnvolle Konvention ist, bevor man hinterher darüber diskutiert, wer denn jetzt sinnvollerweise was in welche Richtung anpassen soll...!

Und diese Diskussion können (eigentlich auch und gerade) erfahrene User auch gut führen... (Will sagen: sehr schwache Ausrede!)

Treffer. Versenkt! ;-)

Zitat von: Beta-User am 27 Oktober 2020, 13:52:09
Gerne, und die Frage nach "wieso" verstehe ich nicht. Die Frage ist, wann der Code ausgeführt werden soll. "trigger" schränkt das von "bei jeder Aktualisierung von irgendwas" auf "dann, wenn sinnvoll" ein... Von daher ist meine ganz pauschale Antwort: trigger ist eigentlich keine optionale Angabe, sondern verpflichtend!

Ok, das Problem war vor dem Bildschirm. Hab es nicht richtig verstanden gehabt, jetzt ist es klar.

Zitat von: Beta-User am 27 Oktober 2020, 13:52:09
Jein, eigentlich ist hier der dort entstandene Quelltext gemeint gewesen, zu finden z.B. ab hier: https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/lib/AttrTemplate/mqtt2.template#L3941
Und ja, das ist alles nicht einfach, aber ich habe auch mit c&p angefangen...

Ok, gefunden. Baue ich mal nach :-)


Darf ich dich mit noch etwas nerven?
Aktuell bauen wir die ReadingList ja u.a. so auf:

$DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }

dadurch bekommen wir die Readings, die von den Guidelines abweichen.
Wenn ich nun statt dem Reading currentTrack_Title das Reading currentTitle füllen wollen würde, wie müsste man das umbauen? Gibt es da eventuell ein verständliches Beispiel?

In dem entsprechenden Topic sieht es z.B. so aus

{"uuid":"RINCON_B8E93729518A01400","name":"Wohnzimmer","groupName":"Wohnzimmer","coordinatorUuid":"RINCON_B8E93729518A01400","currentTrack":{"Album":"Back In Black","Artist":"AC/DC","AlbumArtUri":"http://192.168.178.30:1400/getaa?s=1&u=x-sonos-spotify:spotify:track:08mG3Y1vljYA6bvDt4Wqkj%3fsid%3d9%26flags%3d8224%26sn%3d3","Title":"Back In Black","UpnpClass":"object.item.audioItem.musicTrack","Duration":"0:04:15","ItemId":"-1","ParentId":"-1","TrackUri":"x-sonos-spotify:spotify:track:08mG3Y1vljYA6bvDt4Wqkj?sid=9&flags=8224&sn=3","ProtocolInfo":"sonos.com-spotify:*:audio/x-spotify:*"},"enqueuedMetadata":{"Artist":"Spotify","AlbumArtUri":"https://i.scdn.co/image/ab67706f00000002519fc8771d90f496501a4da3","Title":"Rock Classics","UpnpClass":"object.container.playlistContainer#playlistItem","ItemId":"0006002cspotify%3aplaylist%3a37i9dQZF1DWXRqgorJj26U","ParentId":"0"},"transportState":"PLAYING","playmode":"NORMAL","ts":1603806343017,"volume":{"Master":5,"LF":100,"RF":100},"mute":{"Master":false,"LF":false,"RF":false},"bass":0,"treble":0,"nextTrack":{"Album":"The Rolling Stones In Mono (Remastered 2016)","Artist":"The Rolling Stones","AlbumArtUri":"http://192.168.178.30:1400/getaa?s=1&u=x-sonos-spotify:spotify:track:1RJeiAIwR9pZBgJA8ndZLL%3fsid%3d9%26flags%3d8224%26sn%3d3","Title":"Paint It, Black - Mono","UpnpClass":"object.item.audioItem.musicTrack","Duration":"0:03:24","ItemId":"-1","ParentId":"-1","TrackUri":"x-sonos-spotify:spotify:track:1RJeiAIwR9pZBgJA8ndZLL?sid=9&flags=8224&sn=3","ProtocolInfo":"sonos.com-spotify:*:audio/x-spotify:*"}}


Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 27 Oktober 2020, 14:58:16
ZitatWenn ich nun statt dem Reading currentTrack_Title das Reading currentTitle füllen wollen würde, wie müsste man das umbauen?

Nix umbauen, umbenennen, mit dem Attribut jsonMap
attr <devicename> jsonMap currentTrack_Title:currentTitle
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 27 Oktober 2020, 15:07:54
Zitat von: TomLee am 27 Oktober 2020, 14:58:16
Nix umbauen, umbenennen, mit dem Attribut jsonMap
attr <devicename> jsonMap currentTrack_Title:currentTitle
Genau...

Aus gegebenem Anlass an anderer Stelle: Machen hier ggf. auch filter-Elemente Sinn? (Notfalls könnte man die zum Testen über ein userattr "dazumischen")
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 27 Oktober 2020, 16:23:39
Ich habe nochmal an dem Userreading für die Quelle gebastelt.

currentMediaSource:currentTrack_TrackUri.* { my $val = ReadingsVal($name,"currentTrack_TrackUri","none"); $val =~ /:([^:][a-zA-Z]*)/; my %rets = ("none" => "unknown","spotify" => "Spotify","tunein" => "TuneIn","catalog" => "Amazon"); return $rets{$1}; }

Berücksichtigt wird dabei aktuell:

currentTrack_TrackUri
===
x-sonosapi-stream:tunein:5191?sid=303&flags=8224&sn=11 -> TuneIn
x-sonos-spotify:spotify:track:..... -> Spotify
x-sonosapi-hls-static:catalog/tracks/B01M4FSMCA/?.... -> Amazon
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 27 Oktober 2020, 16:32:27
 :) ... geht doch...!

Klasse!

Bin aber nach einem Blick in die https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV#Readings nicht sicher, ob es nicht "currentMedia" oder "channel"heißen sollte...

Tipp noch:Es sollte berücksichtigt werden, dass es evtl. zwar ein $1, aber keinen match gibt. Das vermeidet Log-Einträge wg. "uninitialized value":
currentMediaSource:currentTrack_TrackUri.* { my $val = ReadingsVal($name,"currentTrack_TrackUri","none"); $val =~ /:([^:][a-zA-Z]*)/; my %rets = ("none" => "unknown","spotify" => "Spotify","tunein" => "TuneIn","catalog" => "Amazon"); return $rets{$1} if $rets{$1}; }
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: FunkOdyssey am 27 Oktober 2020, 16:43:25
Das macht Spaß mit euch.
Ich stelle nur kurz eine Frage und ihr erarbeitet die Lösung.  ;D
Wirklich vielen Dank.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 27 Oktober 2020, 17:12:44
Zitat von: Beta-User am 27 Oktober 2020, 16:32:27
Bin aber nach einem Blick in die https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV#Readings nicht sicher, ob es nicht "currentMedia" oder "channel"heißen sollte...

currentMedia würde ich ausschließen, da steht als Erklärung "kann alles sein: Datei vom Filesystem, Stream aus dem Internet, m3u-URL oder was auch immer". Würde dort eher reinschreiben, was wir in aktuell in currentTrack_TrackUri haben.
Beim channel steht oben bei den Befehlen zu "Schaltet auf einen absoluten Sender- oder Programmspeicherplatz (Nicht zu verwechseln mit input)". Dort wird eine Zahl von 0 - 9999 erwartet. Von daher würde ich mal vermuten, dass Reading sollte dazu passen.

Zitat von: Beta-User am 27 Oktober 2020, 16:32:27
Tipp noch:Es sollte berücksichtigt werden, dass es evtl. zwar ein $1, aber keinen match gibt. Das vermeidet Log-Einträge wg. "uninitialized value":

danke :-)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: FunkOdyssey am 27 Oktober 2020, 17:18:41
Ich muss euch noch etwas fragen.
Der aktuelle Stand ist doch, dass man nach dem get sonosbridge Favorites den Code aus dem Wiki zum Verteilen der Favoriten an die Player manuell ausführen muss, oder? Oder müsste ich das in einem notify noch unterbringen?

Darf ich fragen, ob die Wiedergabe (playFav) einer Spotify-Liste aus dem Sonos-Favoriten bei euch funktioniert?
Bei mir startet nur die ursprüngliche Wiedergabeliste.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 27 Oktober 2020, 17:37:45
Zitat von: kjmEjfu am 27 Oktober 2020, 17:12:44
currentMedia würde ich ausschließen, da steht als Erklärung "kann alles sein: Datei vom Filesystem, Stream aus dem Internet, m3u-URL oder was auch immer". Würde dort eher reinschreiben, was wir in aktuell in currentTrack_TrackUri haben.
Schließe mich tendenziell der Meinung an, dass in jsonMap auch "currentTrack_TrackUricurrentMedia" stehen sollte...

ZitatBeim channel steht oben bei den Befehlen zu "Schaltet auf einen absoluten Sender- oder Programmspeicherplatz (Nicht zu verwechseln mit input)". Dort wird eine Zahl von 0 - 9999 erwartet. Von daher würde ich mal vermuten, dass Reading sollte dazu passen.
Auch richtig mit dem nummerischen Hinweis...
Vielleicht sollte man (= einer von euch, vielleicht ein "getroffender" ::) ...) das Thema "Erweiterung der Readings in "DevelopmentGuidelinesAV" mal schlicht an anderer Stelle aufgreifen... (bei "Anwendungen/Multimedia"?), denn in der Zwischenzeit gibt es vermutlich eine Reihe weiterer "Spezialfälle", die man ggf. allgemeingültiger Lösen könnte.
Nach kurzem Blick auf meinen Yamaha käme z.B. dann "currentStation" in Frage - aber auch das ist nur ein oberflächlicher Eindruck...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 27 Oktober 2020, 18:24:06
Ich habe mal angefangen Readings gemäß AV Guideline anzupassen.

Erstmal meine drei Userreadings:
shuffle:playmode.* { if (ReadingsVal($name,"playmode","NORMAL") =~ m/SHUFFLE/) {return "on"} else {return "off"}; },
repeat:playmode.* { my $val = ReadingsVal($name,"playmode","none"); my %rets = ("none" => "unknown","NORMAL" => "off","SHUFFLE" => "off","REPEAT_ALL" => "all","SHUFFLE_NOREPEAT" => "off","SHUFFLE_REPEAT_ONE" => "off"); return $rets{$val} if $rets{$val}; },
currentMediaSource:currentTrack_TrackUri.* { my $val = ReadingsVal($name,"currentTrack_TrackUri","none"); $val =~ /:([^:][a-zA-Z]*)/; my %rets = ("none" => "unknown","spotify" => "Spotify","tunein" => "TuneIn","catalog" => "Amazon"); return $rets{$1} if $rets{$1}; },


mute -> liefert aktuell false/true -> müsste sein off/on. Ist innerhalb von $DEVICETOPIC im JSON hinterlegt als "mute":{"Master":false,"LF":false,"RF":false} -> wie umschreiben?
Mein Ansatz war im readingList den ersten Eintrag umzuändern zu:
$DEVICETOPIC:.* { $EVENT =~ s/"mute":\{"Master":true/"mute":\{"Master":on/g; $EVENT =~ s/"mute":\{"Master":false/"mute":\{"Master":off/g; json2nameValue($EVENT,'',$JSONMAP)}
Aber wenig überraschend funktioniert das nicht ;-)


Bin dann noch über folgende Punkte gestolpert:

presence -> present|absent -> physischer Status! Wird irgendwo hinterlegt, ob eine Box nicht erreichbar ist? Zu beachten: "Auch das presence reading sollte nur dann aktualisiert werden wenn sich der Status geändert hat um am timestamp sehen zu können wann das war. event-on-change-reading ist hierzu nicht ausreichend weil nur das Event unterdrückt wird der Timestamp sich aber trotzdem ändert."
power -> on/off -> logischer Status, nicht physischer! Frage: da die Boxen logisch immer eingeschaltet sind, auf on lassen und off wenn presence=absent?
input -> soll eigentlich die Inputquelle (z.B. LineIn) darstellen. Derzeit Zahlenwert. Welcher? Wieso?
output -> "HeadphoneConnected" steht in sonos/status/name_or_uuid_of_speaker/renderingcontrol -> wird derzeit nicht in readingList betrachtet.

Dann ist mir noch aufgefallen, dass wir sonos/status/name_or_uuid_of_speaker/avtransport derzeit noch komplett ignorieren. Es bringt aber z.B. so Infos wie Track Duration oder Anzahl der Items in der Playlist (https://svrooij.io/sonos2mqtt/topics.html#avtransport-message).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 27 Oktober 2020, 19:35:03
Uih jetzt kommt wieder Fahrt auf :)

playFav: Das war mehr oder weniger ein Experiment um die Favoriten (Radioliste) überhaupt irgendwie zu haben. Ich war eigentlich der Meinung, die sollte bei der Bridge bleiben und nicht verteilt werden. Ist doch ein zentrales Ding?

mute: Ja kann sein, da waren wir auch schon mal bei on/off letztlich liefert das System true / false und man muss true / false setzen. Ich habe dann Kurzerhand die Sache "verkürzt" (und nicht zweimal umgewandelt). Aber ja können wir wieder anders machen. Ich suche mal den Code (der steht hier noch irgendwo im Thread).

presence ist aus meiner Sicht ein unsägliches Thema (Sonos Modul) ich würde da erstmal wenig nachdenken. Die Bridge händelt die Infrastruktur ganz vernünftig. Ich war dafür den Player zu erzeugen und zu löschen wenn er nicht da ist - da ging ein Aufschrei durch die Reihen! Aber genau das funktioniert!
input liefert Zahlen? Wo jetzt? Die Sache mit dem Input ist bei Sonos nicht so einfach. Da habe ich gedacht, wusste des Development Guide nichts davon  ;D ;D ;D
output wurde bisher nicht betrachtet. Aber Achtung, nicht das wir zu viele Baustellen aufreißen. Schnell sind ein paar Seiten Thread gefüllt und keiner hat einen Zwischenboden eingezogen und dokumentiert ;)
avtransport liefert ein Haufen zusätzliche Infos und bläht das Device auf. Wie schon gesagt, eigentlich gibt es die Sonos App zum angucken. Man kann sich endlos in in der letzten Kleinigkeit und "abgerundeten Ecken" beim Albumcover vertrödeln. ;D

Muss man wirklich alles nachbauen?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 27 Oktober 2020, 20:59:51
Zitat von: Otto123 am 27 Oktober 2020, 19:35:03
Uih jetzt kommt wieder Fahrt auf :)

ich habe etwas Zeit :-) Deshalb kann ich etwas an euren coolen Ergebnissen basteln.

Zitat von: Otto123 am 27 Oktober 2020, 19:35:03
playFav: Das war mehr oder weniger ein Experiment um die Favoriten (Radioliste) überhaupt irgendwie zu haben. Ich war eigentlich der Meinung, die sollte bei der Bridge bleiben und nicht verteilt werden. Ist doch ein zentrales Ding?

Finde ich persönlich gut.
Funktioniert auch ganz gut bei mir.

Zitat von: Otto123 am 27 Oktober 2020, 19:35:03
mute: Ja kann sein, da waren wir auch schon mal bei on/off letztlich liefert das System true / false und man muss true / false setzen. Ich habe dann Kurzerhand die Sache "verkürzt" (und nicht zweimal umgewandelt). Aber ja können wir wieder anders machen. Ich suche mal den Code (der steht hier noch irgendwo im Thread).

Danke :-)

Zitat von: Otto123 am 27 Oktober 2020, 19:35:03
presence ist aus meiner Sicht ein unsägliches Thema (Sonos Modul) ich würde da erstmal wenig nachdenken. Die Bridge händelt die Infrastruktur ganz vernünftig. Ich war dafür den Player zu erzeugen und zu löschen wenn er nicht da ist - da ging ein Aufschrei durch die Reihen! Aber genau das funktioniert!

Also bei sonos2mqtt habe ich bisher keine Aussetzer, funktioniert gut. Außer das das Reading connected in der Bridge immer mal auf 0 statt 2 steht. Da hilft dann leider nur ein Restart vom Dockercontainer.
Aber hinterlegt sonos2mqtt irgendwo den Status der einzelnen Speaker? Es gibt ja Leute, die ihre Speaker aus diversen Gründen mal stromlos machen. In dem Fall wäre es natürlich gut, wenn dies irgendwo vermerkt ist.

Zitat von: Otto123 am 27 Oktober 2020, 19:35:03
input liefert Zahlen? Wo jetzt? Die Sache mit dem Input ist bei Sonos nicht so einfach. Da habe ich gedacht, wusste des Development Guide nichts davon  ;D ;D ;D

Also ich habe in jedem Player ein Reading "input" und da stehen bei mir aus irgendwelchen Gründen Zahlen drin, z.B. 15.
Wenn ich mir in der Guideline die Beispiele für den Set-Befehle zu Input anschaue "z.B. hdmi[1-n] | av[1-n] | usb | airplay | server [1-n]", dann gibt es bei den normalen Speakern eher wenig Auswahl. Die Frage ist nur, was dann passt ;-)

Zitat von: Otto123 am 27 Oktober 2020, 19:35:03
output wurde bisher nicht betrachtet. Aber Achtung, nicht das wir zu viele Baustellen aufreißen. Schnell sind ein paar Seiten Thread gefüllt und keiner hat einen Zwischenboden eingezogen und dokumentiert ;)

Die Erweiterung für HeadphoneConnected dürfte recht einfach sein.
Ich habe allerdings nur Play 1 und 5, keine Playbar. Die dürfte vermutlich nochmal anderen Output haben.
Zitat von: Otto123 am 27 Oktober 2020, 19:35:03
avtransport liefert ein Haufen zusätzliche Infos und bläht das Device auf. Wie schon gesagt, eigentlich gibt es die Sonos App zum angucken. Man kann sich endlos in in der letzten Kleinigkeit und "abgerundeten Ecken" beim Albumcover vertrödeln. ;D

Wir müssen ja nicht alles zur Verfügung stellen. Aber gerade Tracklänge, Länge der Playlist und aktuelle Position in der Playlist könnte schon interessant sein.
Warum? Ich habe z.B. einen Speaker im Gästezimmer stehen. Allerdings möchte ich nicht jeden Gast in meinem WLAN haben (im Gäste-WLAN schon), wodurch die App nicht genutzt werden kann. Allerdings kann ich auf einem Tablet mit dem Gäste das eine und andere fürs Gästezimmer konfigurieren können, eine gewisse Grundfunktionalität zur Verfügung stellen.

Zitat von: Otto123 am 27 Oktober 2020, 19:35:03
Muss man wirklich alles nachbauen?

Nein, ich wollte ja nur fragen :-)

Den Fokus würde ich auch darauf setzen einen guten Stand zu erreichen, der auch zur AV Developer Guideline passt. Was aber schwierig ist, weil der nicht bis ans Ende durchgedacht ist. Deshalb fällt es so schwer einige Readings richtig zu setzen.

msgSchema für Audio per msg fände ich noch sehr wichtig (aber rein aus persönlichem Anlass), nur habe ich da derzeit so gar keine Idee.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 27 Oktober 2020, 21:30:22
Das mit mute ist eigentlich simpel:
mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute"; qq(BASE_TOPIC/DEV_ID/control { "command": "$value" } ) }\
presence: sonso2mtt hat den Befehl checkSubscription, der kümmert sich um die Erkennung der Infrastruktur ohne Neustart
CheckSubscription:noArg sonos/cmd/check-subscriptionsder muss noch ins Template.
Wenn jemand seine Player ausschaltet, dann macht er das mit FHEM, dann weiß er doch das sie aus sind :)
Die App löscht den Player wenn er nicht da ist. Wäre auch konsequent in FHEM machbar. Der Player wird ja automatisch wieder erzeugt. Also wenn man das konsequent "nachbauen" will.

Das Reading Input habe ich nicht, Da muss ich nochmal schauen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 28 Oktober 2020, 07:49:28
Zitat von: Otto123 am 27 Oktober 2020, 21:30:22
Das mit mute ist eigentlich simpel:
mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute"; qq(BASE_TOPIC/DEV_ID/control { "command": "$value" } ) }\

das ist aber set, ich bin noch beim Reading schreiben ;-)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 28 Oktober 2020, 09:03:39
Moin,
Missverständnis :)
genau, das war ja auch der Grund es einfach so zu lassen. Im übrigen würde ich mute_LF usw. einfach weglassen und nur mute betrachten.

kann man das im jsonMap mit behandeln?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 28 Oktober 2020, 09:25:59
Zitatkann man das im jsonMap mit behandeln?

Ja, mit der Angabe 0.

https://forum.fhem.de/index.php/topic,111711.msg1066412/topicseen.html#msg1066412 (https://forum.fhem.de/index.php/topic,111711.msg1066412/topicseen.html#msg1066412)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 28 Oktober 2020, 09:36:50
Zitat von: Otto123 am 28 Oktober 2020, 09:03:39
kann man das im jsonMap mit behandeln?

tja, gute Frage.

Also der Ausschnitt aus dem gesamten JSON schaut so aus:

[...] "mute":{"Master":false,"LF":false,"RF":false} [...]

Vermutlich reicht da etwas RegEx-Voodoo innerhalb von readingList.
Aber die kriege ich zur Zeit nicht hin.

$DEVICETOPIC:.* { $EVENT =~ s/"mute":\{"Master":true/"mute":\{"Master":on/g; $EVENT =~ s/"mute":\{"Master":false/"mute":\{"Master":off/g; json2nameValue($EVENT,'',$JSONMAP)}
funktioniert nicht.
In dem mqtt-Templates sind hier und da Stellen, die eine ähnliche Richtung gehen. Aber die verstehe ich nicht, weshalb ich die nicht angepasst bekomme.  :(
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 28 Oktober 2020, 09:44:50
Vielleicht grundsätzlich: Diese ganze Nachbehandlung der in $EVENT enthaltenen Infos ist so komplex, es wäre an der Zeit, das an eine Perl-Funktion zu übergeben.

Und wie kjmEjfu schreibt, gibt es auch mit dem 6channel_ethernet_board_6input_split ein template, das "alles mögliche" (ziemlich komprimiert) macht: boolsche Werte in on/off übersetzen, event-on- (+ damit indirekt timestamp-) Fragen klären usw..

Bitte schaut mal in den zugehörigen Thread und versucht das erst mal selbst, ich kann dann gerne auch was dazu beitragen, bin aber auch nicht der Crack, wenn es darum geht, mit sowas wie "eine Referenz auf einen Hash" klarzukommen...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 28 Oktober 2020, 10:11:22
Ich glaube, ich habe es hinbekommen:

$DEVICETOPIC:.* { $EVENT =~ s/"mute":\{"Master":true/"mute":\{"Master":"on"/g; $EVENT =~ s/"mute":\{"Master":false/"mute":\{"Master":"off"/g; json2nameValue($EVENT,'',$JSONMAP)}

on und off mussten in ""
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 30 Oktober 2020, 15:03:46
Dein mute Reading funktioniert auch bei mir. Sieht aufwendig aus  :-[

Nochmal die Frage nach input: ich habe gerade in FHEM alles neu gemacht: ich habe kein Reading input beim Player  :-\
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 30 Oktober 2020, 15:59:19
Nachdem ich mit dem Sonos Modul immer wieder Probleme habe und es für mich auch zu viel "Overhead" hat (brauche nur Ausgabe von MP3 und Speech), bin ich an diesem Projekt sehr interessiert.

Meine Frage: kann ich sonos2mqtt auf einen separaten Server installieren? Ich gehe davon aus, aber was mir dazu fehlt ist die Einstellung des MQTT Servers (IP und Port).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 30 Oktober 2020, 17:20:47
Hi mitch,

ja das geht natürlich: https://svrooij.io/sonos2mqtt/getting-started.html#configuration

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 30 Oktober 2020, 19:33:14
Danke Otto!

Ich war auf der ersten Seite und zu blöd links das Menü zu sehen  :-[
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 30 Oktober 2020, 20:57:13
Zitat von: Otto123 am 30 Oktober 2020, 15:03:46
Nochmal die Frage nach input: ich habe gerade in FHEM alles neu gemacht: ich habe kein Reading input beim Player  :-\

dann ist das vielleicht zwischendurch mal durch irgendwas entstanden. Aber dann kann man das Reading ja für das nutzen, für das es genutzt werden soll ;-)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 31 Oktober 2020, 17:22:39
Soweit sieht alles gut aus, Player gehen.
Ich kann auch lokale MP3s abspielen.

Was ich nicht hinbekomme ist TTS.
Habe ich an Ottos Blog gehalten und alles eingerichtet.
Die MP3 wird auch erzeugt und ist im Browser abspielbar.

Der Sonos Play ruft sie auch auf, sieht am in den Readings, aber es erfolgt keine Ausgabe?

Die Ausgabe geht doch mit set Player speak 20 Text?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 31 Oktober 2020, 17:36:41
Zitat von: Mitch am 31 Oktober 2020, 17:22:39
Soweit sieht alles gut aus, Player gehen.
Ich kann auch lokale MP3s abspielen.

Was ich nicht hinbekomme ist TTS.
Habe ich an Ottos Blog gehalten und alles eingerichtet.
Die MP3 wird auch erzeugt und ist im Browser abspielbar.

Der Sonos Play ruft sie auch auf, sieht am in den Readings, aber es erfolgt keine Ausgabe?

Die Ausgabe geht doch mit set Player speak 20 Text?

Nutzt du das sonos-tty-polly?
Dann musst du SONOS_TTS_CACHE_URI mit einem / beenden
SONOS_TTS_CACHE_FOLDER hingegen darf keinen haben.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 31 Oktober 2020, 17:38:17
Ich mache das wie in Ottos Blog:

defmod SonosTTS Text2Speech none
attr SonosTTS TTS_UseMP3Wrap 1
attr SonosTTS userReadings httpName:lastFilename.* {'http://'.ReadingsVal($name,'host','set host first').':8083/fhem/'.ReadingsVal($name,'lastFilename','')}
deleteattr SonosTTS TTS_CacheFileDir
setreading SonosTTS host {(qx(hostname -s|tr -d '\n'))}
#setreading SonosTTS host {((split(' ', qx(hostname -I)))[0])}

defmod SonosSpeakWeb HTTPSRV cache cache SonosSpeakWeb

defmod n_SonosSpeak notify SonosTTS:playing:.0 {fhem("set ".ReadingsVal($NAME,"Player","")." notify ".ReadingsVal($NAME,"volume","")." ".ReadingsVal($NAME,"httpName",""))}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 31 Oktober 2020, 17:43:39
Ich habe da nochmal eine Masterfrage an die JSON-/RegEx-Experten unter euch :-)

In sonos/status/name_or_uuid_of_speaker/renderingcontrol steht schon recht viel, was wir über andere Topics bereits bekommen (weshalb auch immer es diese teilweise doppelte und dreifache Datenhaltung gibt). Ich würde jetzt gerne nur auf das HeadphoneConnected zugreifen und daraus ein Reading machen.

{
  "Bass" : -2,
  "HeadphoneConnected" : false,
  "Loudness" : true,
  "Mute" : {
    "Master" : false,
    "LF" : false,
    "RF" : false
  },
  "OutputFixed" : false,
  "PresetNameList" : "FactoryDefaults",
  "SpeakerSize" : 5,
  "SubCrossover" : "0",
  "SubEnabled" : true,
  "SubGain" : "0",
  "SubPolarity" : "0",
  "Treble" : 0,
  "Volume" : {
    "Master" : 3,
    "LF" : 100,
    "RF" : 100
  }
}


Hab schon mal versucht im ReadingList ein radikales

sonos/status/lc(ReadingsVal($name,"name",""))/renderingcontrol { $EVENT =~ s/,.*/\}/g;  json2nameValue($EVENT,'')}

zu einzutragen, aber } wird nicht als escaped erkannt und daher mag er das so nicht. Nachdem ich mir aber gerade nochmal das generische Beispiel angeschaut habe, würde das aber eh falsch matchen, weil der Bass-Eintrag noch vorher stehen kann - der ist bei mir nicht im JSON drin. Wäre also besser es sauber auszuschneiden ;-)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 31 Oktober 2020, 18:32:02
Hallo Mitch,

gib mal ein list SonosTTS

ZitatIch kann auch lokale MP3s abspielen.
Über welchen Weg? HTTP und notify?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 31 Oktober 2020, 19:55:41
Internals:
   ALSADEVICE
   CFGFN     
   DEF        none
   FUUID      5f9d8c30-f33f-5738-df84-a57df7dc807cb94b
   MODE       SERVER
   NAME       SonosTTS
   NR         13489
   STATE      Initialized
   TYPE       Text2Speech
   VOLUME     100
   READINGS:
     2020-10-31 17:09:51   host            192.168.0.202
     2020-10-31 17:16:24   httpName        https://192.168.0.202:8084/fhem/cache/152195d1803b7968db8c59cc6c93329a.mp3
     2020-10-31 17:16:24   lastFilename    cache/152195d1803b7968db8c59cc6c93329a.mp3
     2020-10-31 17:16:24   playing         0
   helper:
     Text2Speech:
Attributes:
   TTS_UseMP3Wrap 1
   userReadings httpName:lastFilename.* {'https://'.ReadingsVal($name,'host','set host first').':8084/fhem/'.ReadingsVal($name,'lastFilename','')}


MP3 spiele ich vom share über playUri:
x-file-cifs://192.168.0.202/SonosSpeak/chirp.mp3
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 31 Oktober 2020, 20:32:26
Du hast irgendwie den ersten Satz in meinem Blogartikel nicht gelesen :)
Ich habe derzeit die aktuellste Anleitung ins FHEM Wiki geschrieben, aufgeteilt in 2 Artikel.
Siehe also https://wiki.fhem.de/wiki/Sonos2mqtt#Speak_Befehl

Die Frage ist Port 8084 - gibt es wirklich? Damit hab ich nicht getestet, gibt es bei mir ewig nicht mehr.

klappt denn ein playUri [SonosTTS:httpName] ?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 01 November 2020, 12:12:16
So, hat sich alles geklärt.
Es lag am https. Entweder sonos2mqtt, oder Sonos selber kann kein https, nut http.

Was mir noch aufgefallen ist, wenn man eine MP3 abspielt, oder TTS, dauert es ,,sehr" lang, bis wieder Musik gespielt wird. Hier muss ich mal schauen, wo ich dran ,,schrauben" kann.

Ausserdem muss ich meinen Cleanup Script anpassen, damit der Cache nicht ,,zugemüllt" wird.

Achso, eins noch: Otto, im Wiki steht oft so etwas wie ,,set alias=Mein Player....".
Das ist okay, wenn man einen Aliasname nur einmal hat. Bei mir gibt es Aliasnamen öfter.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 November 2020, 12:46:37
sonos kann schon https, das Beispiel aus der Doku (github sonos2mqtt) funktioniert ja. Aber wenn dein https kein offizielles Zertifikat hat und sonos das nicht prüfen kann muss er es ablehnen.

Das mit meinem devspec ist nur konsequent im Wiki durchgezogen. Schließlich werden die Player ja nach dem dortigem Setup automatisch so konfiguriert. Man kann die genauso gut umbenennen. Da wird es halt viele Vorlieben geben.
War irgendwie meine Idee das einfach zu verwenden, vielleicht muss man das noch umgestalten. Ich habe jetzt nicht geschaut ob es "kritische" Ecken gibt.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 01 November 2020, 13:28:05
Eigentlich habe ich gültige Zertifikate.
Naja, egal, intern ist es auch ohne okay.

Ich baue gerade meine Umgebung um und gehe in den "Langzeittest".

Vielen Dank Otto, für die tolle Arbeit und Support!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 01 November 2020, 14:32:45
Jetzt habe ich doch noch eine Frage: wie kann ich bei einem Player (bei mir ein Amp), den Eingang auf Line-In umschalten?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 November 2020, 15:04:58
Das ist ja genau - warum Input bei Sonos nicht so ganz einfach ist.
In sonos2mqtt gibt es glaub ich sogar den direkten Befehl - aber eben nur für den Player
https://svrooij.io/sonos2mqtt/control/commands.html
Aber Du kannst ja an jedem Player den Line-in eines supportenden Player abspielen. Was beim TV Eingang nicht geht :(

Aus diesem Grunde ist das bisher nicht wirklich implementiert - ich wusste bisher nicht wie.

Du kannst x-raw_payload zum testen nehmen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 01 November 2020, 15:30:48
So ganz habe ich nicht verstanden, was du meinst?

Hab jetzt einfach ein neuen Eintrag in die setList gemacht:   line-in:noArg sonos/RINCON_1234/control {"command": "switchtoline" }
Mal sehen, ob es geht.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 November 2020, 16:02:47
Dann mach folgenden Versuch:
Steck etwas an den Line-in Eingang Deines Amp
Geh mit der App auf einen anderen Player - sagen wir Wohnzimmer.
Wähle durchsuchen (am PC rechtes Menü)
Wähle Eingang
Wähle den Eingang deines Amp

Dann spielt Dein Amp Player Line-in am Player Wohnzimmer - ohne Gruppierung!

Wenn Du in deinen FHEm Player schaust steht dann dort bei TrackUri x-rincon-stream:RINCON_1234 - die RINCON Deines AMP

So geht Line-in eigentlich :) einer hat den Eingang - einer spielt (muss nicht der gleiche sein)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 01 November 2020, 16:33:43
Ganz ehrlich, ich verstehe es immer noch nicht, was du meinst.

Mein Amp hat einen Zuspieler über Line-In.
Den muss ich einstellen, wenn ich den Zuspieler starte.
Dazu fange ich den "on" Befehl von einer Harmony ab und sende Line-In als Eingang an den Amp.

Das ganze geht auch ohne Probleme mit meiner Erweiterung in der setList.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 November 2020, 16:40:36
Also es kann sein dein Amp ist anders. Ich habe eine Play5 mit Line-in, ich hatte einen connect mit Line-in - beide verhielten sich gleich.
ich habe mal irgendwo gelesen, dass die analogen Line-in (nicht die digitalen Eingänge!) alle gleich sind.

Also ich kann: die Musik vom Zuspieler der an meinem Play5 steckt (ohne sie an der Play5 wirklich zu spielen) am PlayOne im Bad wiedergeben.

Wie gesagt - geht in der Android/IOS/Windows App ganz einfach. Man muss es nur wissen. 
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 01 November 2020, 16:43:10
Okay, jetzt verstehe ich, was du meinst.

Ich kann auch den Ton von Line-In vom Amp oder den Fernsehton (über optisch) an jeden beliebigen Player weiter geben (per App).
Das brauche ich aber nicht.

Mir ging es nur darum, per fhem den Amp auf Line-In zu schalten und das geht.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 November 2020, 16:59:46
Zitat von: Mitch am 01 November 2020, 16:43:10
Das brauche ich aber nicht.
Das sagst Du jetzt :)
Die optischen gehen nicht, es gehen mW nur die analogen line-in - ich habe den Amp nicht.

Welche Modelnummer hat Dein Amp? Die Umschaltung der Eingänge habe ich ja eigentlich im Einrichtungsscript drin?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 01 November 2020, 17:43:27
Modellnummer weis ich nicht genau, es ist der alte Connect:Amp.

In deinem Script war leider nichts dazu drinnen.
Auch für die Playbar fehlte die Möglichkeit. Hab ich auch in die setList aufgenommen.

Was mir noch so aufgefallen ist:
1. die Erstellung des Alias hat nicht funktioniert
2. wäre es schöner, wenn die Namen nicht aus der MAC Adresse erzeugt werden, sondern aus dem Playername (z.B. RINCON_Bad)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 November 2020, 17:49:42
Ich denke ja Du hast noch was altes eingerichtet? Mein Blog und nicht nach Wiki?
Die Modellnummer sollte in deinem Device drinstehen, wenn nicht dann ist quasi alles schief gelaufen.  ???

Die Namen sind die autocreate MQTT2 Namen - ich habe nur die Aliase dazugesetzt.

Die Playbar ist die S9 - da hätte es funktionieren müssen. Was hast Du bei list n_configSonos2 ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 November 2020, 18:36:28
Hallo Beta-User,

kannst Du mal bitte in den Templates was ergänzen:
das Template sonos2mqtt_bridge_comfort
set DEVICE attrTemplate sonos2mqtt_bridge
attr DEVICE setList PauseAll:noArg sonos/cmd/pauseall\
CheckSubscription:noArg sonos/cmd/check-subscriptions
defmod n_configSonos1 notify global:DEFINED.MQTT2_RINCON_[A-Z0-9]+ sleep 1;\
  set $EVTPART1 attrTemplate sonos2mqtt_speaker;\
  set $EVTPART1 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
defmod n_configSonos2 notify MQTT2_RINCON_[A-Z0-9]+:IPAddress:.* {\
  my @tv = ("S14","S11","S9");\
  my @line = ("S5","Z90","ZP120");\
  my $url="http://$EVTPART1:1400";\
  my $xmltext = GetFileFromURL("$url/xml/device_description.xml");\
  my ($mn)=$xmltext =~ /(S[0-9]+)/;\
  my ($img)=$xmltext =~ /(.*)<\/url>/;\
  my $icon="Sonos2mqtt_icon-$mn";\
  my $setList=AttrVal($NAME,'setList','');\
  fhem("setreading $NAME modelNumber $mn");\
  fhem("\"wget -qO ./www/images/default/$icon.png $url$img\"");\
  fhem("attr $NAME icon $icon;sleep 4 WI;set WEB rereadicons");\
  if (grep(/$mn/, @tv)) {$setList=~s/input:Queue \{/input:Queue,TV \{/};\
  if (grep(/$mn/, @line)) {$setList=~s/input:Queue \{/input:Queue,Line_In \{/};\
  $setList=~s/;/;;/g;\
  fhem("attr $NAME setList $setList")\
}


Es wird die setList für die Bridge um die neuen Funktionen checkSubscription und pauseall ergänzt.
Das config notify wird um die Line_In Funktion erweitert.
define in defmod geändert - sonst klappts nicht.

Hinweis:
Wenn man die alten Player neu machen will (um vom neuen Template zu profitieren) für die Raw Def
"pm2 stop sonos2mqtt"
delete MQTT2_RINCON_.*
"rm ./www/images/default/Sonos*.png"
delete FileLog_MQTT2_RINCON_.*
"rm ./log/MQTT2_RINCON_*.log"
sleep SonosBridge:connected:.0; set WEB rereadicons
sleep WEB:rereadicons;"pm2 start sonos2mqtt"


Die Templates neu machen:
{ Svn_GetFile("FHEM/lib/AttrTemplate/mqtt2.template", "FHEM/lib/AttrTemplate/mqtt2.template", sub(){ AttrTemplate_Initialize() }) }
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 01 November 2020, 20:38:00
Zitat von: Otto123 am 01 November 2020, 17:49:42
Ich denke ja Du hast noch was altes eingerichtet? Mein Blog und nicht nach Wiki?
Die Modellnummer sollte in deinem Device drinstehen, wenn nicht dann ist quasi alles schief gelaufen.  ???

Die Namen sind die autocreate MQTT2 Namen - ich habe nur die Aliase dazugesetzt.

Die Playbar ist die S9 - da hätte es funktionieren müssen. Was hast Du bei list n_configSonos2 ?

Nachdem mein fhem total abgestürzt ist, keine Ahnung warum, habe ich mein backup eingespielt und nochmal nach Wiki angefangen.
Gleiches "Problem", Alias wird nicht gesetzt.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 November 2020, 22:06:31
der alias wird über das Template sonos2mqtt_speaker gesetzt.
Dieses template wird über das notify n_configSonos1 gesetzt
Dieses notify wird über das Template sonos2mqtt_bridge_comfort installiert.

Vielleicht kannst Du versuchen nachzuvollziehen wo es klemmt?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 01 November 2020, 22:09:45
ich schau mir das morgen mal genauer an.

Im moment habe ich das Problem, dass mir "diese Thema" mein fhem komplett zerstört und ich in eine endlos Neustart-Schleife komme.
Was ich bis jetzt rausgefunden habe, liegt es irgendwie an der fhem.save

Muss jetzt wieder mein Backup zurück spielen.

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 November 2020, 22:13:08
uih das tut mir leid - was kann das sein? die temporären sleeps?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 01 November 2020, 22:15:19
Ich kann es noch nicht nachvollziehen.
Und dich trifft ja keine Schuld!!

Ich habe immer wieder "gebastelt", save, Neustart.
Und irgendwann ist es hinüber.

Heute mag ich nicht mehr, aber morgen werde ich nochmal in Ruhe testen.
Keep you postet.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 02 November 2020, 06:59:06
Zitat von: Otto123 am 01 November 2020, 18:36:28
kannst Du mal bitte in den Templates was ergänzen:
[...]

Die Templates neu machen:
{ Svn_GetFile("FHEM/lib/AttrTemplate/mqtt2.template", "FHEM/lib/AttrTemplate/mqtt2.template", sub(){ AttrTemplate_Initialize() }) }
Eingecheckt...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 02 November 2020, 10:21:17
Zitat von: Otto123 am 01 November 2020, 22:06:31
der alias wird über das Template sonos2mqtt_speaker gesetzt.
Dieses template wird über das notify n_configSonos1 gesetzt
Dieses notify wird über das Template sonos2mqtt_bridge_comfort installiert.

Vielleicht kannst Du versuchen nachzuvollziehen wo es klemmt?

Bin einen Schritt weiter:
der 1. notify (n_configSonos1) geht, der 2. nicht
sprich, die Player werden erzeugt, aber es fehlen Alias, Icon usw.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 November 2020, 11:11:24
Moin Mitch,

Deine Aussage ist irgendwie widersprüchlich  :-[ ich beschreibe es nochmal detaillierter:

Der Alias wird über das Template sonos2mqtt_speaker gesetzt, die Icons usw. durch n_configSonos2  :)

Ich wollte den Setup Prozess so weit wie möglich automatisch gestalten. Offenbar muss ich das toleranter machen. :-\

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 02 November 2020, 14:16:01
Zitat von: Otto123 am 02 November 2020, 11:11:24
Ich wollte den Setup Prozess so weit wie möglich automatisch gestalten. Offenbar muss ich das toleranter machen. :-\

Ich fürchte es.
Vor allem wird es auch Leute geben, die nicht den Weg über pm2 sonos gehen, sondern über den Docker Container. Wenn der auch schon vorher hochgefahren ist, dürfte es ähnliche Abweichungen geben.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 02 November 2020, 15:04:21
Nachdem ich jetzt 6 Stunden damit verbacht habe mein fhem wieder korrekt zum Laufen zu bekommen (ohne den Fehler wirklich gefunden zu haben), habe ich moch nochmal dran gemacht.

Ich hatte schon alles richtig angelegt und auch jetzt wieder das gleiche "Problem", die Player werden nicht korrekt angelegt.
siehe Bild im Anhang und hier den List:

Internals:
   CFGFN     
   CID        RINCON_B8E9375294B201400
   DEF        RINCON_B8E9375294B201400
   DEVICETOPIC MQTT2_RINCON_B8E9375294B201400
   FUUID      5fa010c9-f33f-5738-c551-d4b2efc624bab696
   IODev      myBroker
   NAME       MQTT2_RINCON_B8E9375294B201400
   NR         1236
   STATE      x_raw_payload
   TYPE       MQTT2_DEVICE
   JSONMAP:
     mute_Master mute
     transportState state
     volume_Master volume
   READINGS:
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_bass 7
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_coordinatorUuid RINCON_B8E9375294B201400
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_currentTrack_ItemId -1
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_currentTrack_ParentId -1
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_currentTrack_ProtocolInfo :*:application/octet-stream:*
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_currentTrack_Title
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_currentTrack_TrackUri x-rincon-queue:RINCON_B8E9375294B201400#vli
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_currentTrack_UpnpClass object.item
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_groupName Leoni
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_mute_LF false
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_mute_Master false
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_mute_RF false
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_name Leoni
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_playmode NORMAL
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_transportState PAUSED_PLAYBACK
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_treble 8
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_ts 1604325575890
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_uuid RINCON_B8E9375294B201400
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_volume_LF 100
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_volume_Master 34
     2020-11-02 14:59:37   RINCON_B8E9375294B201400_volume_RF 100
     2020-11-02 14:59:38   ZoneInfo_CopyrightInfo © 2003-2019, Sonos, Inc. All rights reserved.
     2020-11-02 14:59:38   ZoneInfo_DisplaySoftwareVersion 11.2.3
     2020-11-02 14:59:38   ZoneInfo_ExtraInfo OTP:
     2020-11-02 14:59:38   ZoneInfo_Flags  0
     2020-11-02 14:59:38   ZoneInfo_HTAudioIn 0
     2020-11-02 14:59:38   ZoneInfo_HardwareVersion 1.8.3.7-2.0
     2020-11-02 14:59:38   ZoneInfo_IPAddress 192.168.0.96
     2020-11-02 14:59:38   ZoneInfo_MACAddress B8:E9:37:52:94:B2
     2020-11-02 14:59:38   ZoneInfo_SerialNumber B8-E9-37-52-94-B2:4
     2020-11-02 14:59:38   ZoneInfo_SoftwareVersion 57.3-81090
     2020-11-02 14:59:38   associatedWith  SonosBridge
     2020-11-02 14:59:38   attrTemplateVersion 20200729
     2020-11-02 14:59:38   state           x_raw_payload
Attributes:
   IODev      myBroker
   alias      unknown
   devStateIcon (STOPPED|PAUSED_PLAYBACK):rc_PLAY:toggle PLAYING:rc_PAUSE:pause .*:refresh:play
   icon       audio_volume_low
   jsonMap    volume_Master:volume mute_Master:mute transportState:state
   model      sonos2mqtt_speaker
   readingList sonos/RINCON_B8E9375294B201400:.* { json2nameValue($EVENT,'',$JSONMAP) }
sonos/RINCON_B8E9375294B201400/ZoneInfo:.* { json2nameValue($EVENT, 'ZoneInfo_', $JSONMAP) }
   room       Autocreate
   setList    stop:noArg sonos/RINCON_B8E9375294B201400/control { "command": "stop" }
  play:noArg sonos/RINCON_B8E9375294B201400/control { "command": "play" }
  pause:noArg sonos/RINCON_B8E9375294B201400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_B8E9375294B201400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_B8E9375294B201400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_B8E9375294B201400/control { "command": "volumedown" }
  volume:slider,0,1,100 sonos/RINCON_B8E9375294B201400/control { "command": "volume", "input": $EVTPART1 }
  mute:true,false { my $value = $EVTPART1 eq "true" ? "mute" : "unmute"; qq(sonos/RINCON_B8E9375294B201400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_B8E9375294B201400/control { "command": "next" }
  previous:noArg sonos/RINCON_B8E9375294B201400/control { "command": "previous" }
  joinGroup:textField sonos/RINCON_B8E9375294B201400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_B8E9375294B201400","groupName","all"); qq(sonos/RINCON_B8E9375294B201400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_B8E9375294B201400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  playUri:textField {fhem("set $NAME setAVTUri $EVTPART1; sleep 1; set $NAME play")}
  input:Queue { my $value = $EVTPART1 eq "TV" ? "tv" : $EVTPART1 eq "Line_In" ? "line" : "queue"; qq(sonos/RINCON_B8E9375294B201400/control { "command": "switchto$value" } ) }
  notify:textField sonos/RINCON_B8E9375294B201400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_B8E9375294B201400/control $payload)}


Internals:
   DEVICETOPIC SonosBridge
   FUUID      5fa00e01-f33f-5738-dd0c-59d5b242367572ec
   FVERSION   10_MQTT2_DEVICE.pm:0.224580/2020-07-24
   IODev      myBroker
   LASTInputDev myBroker
   MSGCNT     29
   NAME       SonosBridge
   NR         822
   STATE      2
   TYPE       MQTT2_DEVICE
   myBroker_MSGCNT 29
   myBroker_TIME 2020-11-02 14:59:40
   OLDREADINGS:
   READINGS:
     2020-11-02 14:51:54   attrTemplateVersion 20200729
     2020-11-02 14:59:35   config_RINCON_000E5870A13001400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_000E5870A13001400/control","device":{"identifiers":["RINCON_000E5870A13001400"],"manufacturer":"Sonos","name":"Mobil"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_000E5870A13001400","name":"Mobil","state_topic":"sonos/RINCON_000E5870A13001400","unique_id":"sonos2mqtt_RINCON_000E5870A13001400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-11-02 14:59:35   config_RINCON_000E58D0E48001400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_000E58D0E48001400/control","device":{"identifiers":["RINCON_000E58D0E48001400"],"manufacturer":"Sonos","name":"Keller"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_000E58D0E48001400","name":"Keller","state_topic":"sonos/RINCON_000E58D0E48001400","unique_id":"sonos2mqtt_RINCON_000E58D0E48001400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-11-02 14:59:35   config_RINCON_347E5CF7E6D001400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_347E5CF7E6D001400/control","device":{"identifiers":["RINCON_347E5CF7E6D001400"],"manufacturer":"Sonos","name":"Schlafzimmer"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_347E5CF7E6D001400","name":"Schlafzimmer","state_topic":"sonos/RINCON_347E5CF7E6D001400","unique_id":"sonos2mqtt_RINCON_347E5CF7E6D001400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-11-02 14:59:35   config_RINCON_5CAAFDA1C27201400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_5CAAFDA1C27201400/control","device":{"identifiers":["RINCON_5CAAFDA1C27201400"],"manufacturer":"Sonos","name":"Wohnzimmer"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_5CAAFDA1C27201400","name":"Wohnzimmer","state_topic":"sonos/RINCON_5CAAFDA1C27201400","unique_id":"sonos2mqtt_RINCON_5CAAFDA1C27201400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-11-02 14:59:35   config_RINCON_7828CA768C0401400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_7828CA768C0401400/control","device":{"identifiers":["RINCON_7828CA768C0401400"],"manufacturer":"Sonos","name":"Boost"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_7828CA768C0401400","name":"Boost","state_topic":"sonos/RINCON_7828CA768C0401400","unique_id":"sonos2mqtt_RINCON_7828CA768C0401400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-11-02 14:59:35   config_RINCON_7828CAF11E7601400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_7828CAF11E7601400/control","device":{"identifiers":["RINCON_7828CAF11E7601400"],"manufacturer":"Sonos","name":"Küche"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_7828CAF11E7601400","name":"Küche","state_topic":"sonos/RINCON_7828CAF11E7601400","unique_id":"sonos2mqtt_RINCON_7828CAF11E7601400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-11-02 14:59:35   config_RINCON_949F3E84C8BC01400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_949F3E84C8BC01400/control","device":{"identifiers":["RINCON_949F3E84C8BC01400"],"manufacturer":"Sonos","name":"Carlotta"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_949F3E84C8BC01400","name":"Carlotta","state_topic":"sonos/RINCON_949F3E84C8BC01400","unique_id":"sonos2mqtt_RINCON_949F3E84C8BC01400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-11-02 14:59:35   config_RINCON_B8E9373184A001400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_B8E9373184A001400/control","device":{"identifiers":["RINCON_B8E9373184A001400"],"manufacturer":"Sonos","name":"Büro"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_B8E9373184A001400","name":"Büro","state_topic":"sonos/RINCON_B8E9373184A001400","unique_id":"sonos2mqtt_RINCON_B8E9373184A001400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-11-02 14:59:35   config_RINCON_B8E9375200CE01400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_B8E9375200CE01400/control","device":{"identifiers":["RINCON_B8E9375200CE01400"],"manufacturer":"Sonos","name":"Bad"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_B8E9375200CE01400","name":"Bad","state_topic":"sonos/RINCON_B8E9375200CE01400","unique_id":"sonos2mqtt_RINCON_B8E9375200CE01400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-11-02 14:59:35   config_RINCON_B8E9375294B201400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_B8E9375294B201400/control","device":{"identifiers":["RINCON_B8E9375294B201400"],"manufacturer":"Sonos","name":"Leoni"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_B8E9375294B201400","name":"Leoni","state_topic":"sonos/RINCON_B8E9375294B201400","unique_id":"sonos2mqtt_RINCON_B8E9375294B201400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
     2020-11-02 14:59:35   connected       2
Attributes:
   IODev      myBroker
   bridgeRegexp sonos/(RINCON_[A-Z0-9]+)[:/].* "$1"
   devStateIcon 0:10px-kreis-rot 1:10px-kreis-gelb 2:10px-kreis-gruen
   group      Zentrale
   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:.* {}
   room       Zentrale
   setList    PauseAll:noArg sonos/cmd/pauseall
CheckSubscription:noArg sonos/cmd/check-subscriptions
   stateFormat connected


Internals:
   CFGFN     
   DEF        global:DEFINED.MQTT2_RINCON_[A-Z0-9]+ sleep 1;
  set $EVTPART1 attrTemplate sonos2mqtt_speaker;
  set $EVTPART1 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
   FUUID      5fa00ef6-f33f-5738-a1e6-efd5a2b327797d62
   NAME       n_configSonos1
   NOTIFYDEV  global
   NR         938
   NTFY_ORDER 50-n_configSonos1
   REGEXP     global:DEFINED.MQTT2_RINCON_[A-Z0-9]+
   STATE      2020-11-02 14:59:40
   TRIGGERTIME 1604325580.58342
   TYPE       notify
   READINGS:
     2020-11-02 14:51:50   state           active
Attributes:


Internals:
   CFGFN     
   DEF        MQTT2_RINCON_[A-Z0-9]+:IPAddress:.* {
  my @tv = ("S14","S11","S9");
  my @line = ("S5","Z90","ZP120");
  my $url="http://$EVTPART1:1400";
  my $xmltext = GetFileFromURL("$url/xml/device_description.xml");
  my ($mn)=$xmltext =~ /(S[0-9]+)/;
  my ($img)=$xmltext =~ /(.*)<\/url>/;
  my $icon="Sonos2mqtt_icon-$mn";
  my $setList=AttrVal($NAME,'setList','');
  fhem("setreading $NAME modelNumber $mn");
  fhem("\"wget -qO ./www/images/default/$icon.png $url$img\"");
  fhem("attr $NAME icon $icon;sleep 4 WI;set WEB rereadicons");
  if (grep(/$mn/, @tv)) {$setList=~s/input:Queue \{/input:Queue,TV \{/};
  if (grep(/$mn/, @line)) {$setList=~s/input:Queue \{/input:Queue,Line_In \{/};
  $setList=~s/;/;;/g;
  fhem("attr $NAME setList $setList")
}
   FUUID      5fa00ef6-f33f-5738-7a88-014d74f3575527dd
   NAME       n_configSonos2
   NR         939
   NTFY_ORDER 50-n_configSonos2
   REGEXP     MQTT2_RINCON_[A-Z0-9]+:IPAddress:.*
   STATE      active
   TYPE       notify
   READINGS:
     2020-11-02 14:51:50   state           active
Attributes:


Vorgegangen bin ich wie folgt:

1. SonosBridge einrichten
2. Template sonos2mqtt_bridge_comfort setzten
3. sonos2mqtt starten
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 02 November 2020, 15:15:33
Hier noch der Eventlog, wenn sonos2mqtt gestartet wird:
[code]2020-11-02 15:14:08 MQTT2_SERVER myBroker nrclients: 11
2020-11-02 15:14:08 MQTT2_DEVICE SonosBridge connected: 2
2020-11-02 15:14:08 MQTT2_DEVICE SonosBridge config_RINCON_000E5870A13001400: {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_000E5870A13001400/control","device":{"identifiers":["RINCON_000E5870A13001400"],"manufacturer":"Sonos","name":"Mobil"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_000E5870A13001400","name":"Mobil","state_topic":"sonos/RINCON_000E5870A13001400","unique_id":"sonos2mqtt_RINCON_000E5870A13001400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
2020-11-02 15:14:08 MQTT2_DEVICE SonosBridge config_RINCON_5CAAFDA1C27201400: {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_5CAAFDA1C27201400/control","device":{"identifiers":["RINCON_5CAAFDA1C27201400"],"manufacturer":"Sonos","name":"Wohnzimmer"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_5CAAFDA1C27201400","name":"Wohnzimmer","state_topic":"sonos/RINCON_5CAAFDA1C27201400","unique_id":"sonos2mqtt_RINCON_5CAAFDA1C27201400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
2020-11-02 15:14:08 MQTT2_DEVICE SonosBridge config_RINCON_000E58D0E48001400: {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_000E58D0E48001400/control","device":{"identifiers":["RINCON_000E58D0E48001400"],"manufacturer":"Sonos","name":"Keller"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_000E58D0E48001400","name":"Keller","state_topic":"sonos/RINCON_000E58D0E48001400","unique_id":"sonos2mqtt_RINCON_000E58D0E48001400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
2020-11-02 15:14:08 MQTT2_DEVICE SonosBridge config_RINCON_B8E9373184A001400: {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_B8E9373184A001400/control","device":{"identifiers":["RINCON_B8E9373184A001400"],"manufacturer":"Sonos","name":"Büro"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_B8E9373184A001400","name":"Büro","state_topic":"sonos/RINCON_B8E9373184A001400","unique_id":"sonos2mqtt_RINCON_B8E9373184A001400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
2020-11-02 15:14:08 MQTT2_DEVICE SonosBridge config_RINCON_7828CAF11E7601400: {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_7828CAF11E7601400/control","device":{"identifiers":["RINCON_7828CAF11E7601400"],"manufacturer":"Sonos","name":"Küche"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_7828CAF11E7601400","name":"Küche","state_topic":"sonos/RINCON_7828CAF11E7601400","unique_id":"sonos2mqtt_RINCON_7828CAF11E7601400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
2020-11-02 15:14:08 MQTT2_DEVICE SonosBridge config_RINCON_B8E9375294B201400: {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_B8E9375294B201400/control","device":{"identifiers":["RINCON_B8E9375294B201400"],"manufacturer":"Sonos","name":"Leoni"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_B8E9375294B201400","name":"Leoni","state_topic":"sonos/RINCON_B8E9375294B201400","unique_id":"sonos2mqtt_RINCON_B8E9375294B201400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
2020-11-02 15:14:08 MQTT2_DEVICE SonosBridge config_RINCON_B8E9375200CE01400: {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_B8E9375200CE01400/control","device":{"identifiers":["RINCON_B8E9375200CE01400"],"manufacturer":"Sonos","name":"Bad"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_B8E9375200CE01400","name":"Bad","state_topic":"sonos/RINCON_B8E9375200CE01400","unique_id":"sonos2mqtt_RINCON_B8E9375200CE01400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
2020-11-02 15:14:08 MQTT2_DEVICE SonosBridge config_RINCON_7828CA768C0401400: {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_7828CA768C0401400/control","device":{"identifiers":["RINCON_7828CA768C0401400"],"manufacturer":"Sonos","name":"Boost"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_7828CA768C0401400","name":"Boost","state_topic":"sonos/RINCON_7828CA768C0401400","unique_id":"sonos2mqtt_RINCON_7828CA768C0401400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
2020-11-02 15:14:08 MQTT2_DEVICE SonosBridge config_RINCON_949F3E84C8BC01400: {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_949F3E84C8BC01400/control","device":{"identifiers":["RINCON_949F3E84C8BC01400"],"manufacturer":"Sonos","name":"Carlotta"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_949F3E84C8BC01400","name":"Carlotta","state_topic":"sonos/RINCON_949F3E84C8BC01400","unique_id":"sonos2mqtt_RINCON_949F3E84C8BC01400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
2020-11-02 15:14:08 MQTT2_DEVICE SonosBridge config_RINCON_347E5CF7E6D001400: {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_347E5CF7E6D001400/control","device":{"identifiers":["RINCON_347E5CF7E6D001400"],"manufacturer":"Sonos","name":"Schlafzimmer"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_347E5CF7E6D001400","name":"Schlafzimmer","state_topic":"sonos/RINCON_347E5CF7E6D001400","unique_id":"sonos2mqtt_RINCON_347E5CF7E6D001400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
2020-11-02 15:14:09 Global global UNDEFINED MQTT2_RINCON_000E58D0E48001400 MQTT2_DEVICE RINCON_000E58D0E48001400 myBroker
2020-11-02 15:14:09 Global global DEFINED MQTT2_RINCON_000E58D0E48001400
2020-11-02 15:14:09 Global global ATTR MQTT2_RINCON_000E58D0E48001400 readingList sonos/RINCON_000E58D0E48001400:.* { json2nameValue($EVENT, 'RINCON_000E58D0E48001400_', $JSONMAP) }
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 RINCON_000E58D0E48001400_bass: -5
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 RINCON_000E58D0E48001400_treble: 4
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 RINCON_000E58D0E48001400_mute_RF: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 RINCON_000E58D0E48001400_volume_LF: 100
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 RINCON_000E58D0E48001400_volume_RF: 100
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 RINCON_000E58D0E48001400_groupName: Keller
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 RINCON_000E58D0E48001400_name: Keller
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 RINCON_000E58D0E48001400_ts: 1604326448564
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 RINCON_000E58D0E48001400_uuid: RINCON_000E58D0E48001400
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 RINCON_000E58D0E48001400_volume_Master: 20
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 RINCON_000E58D0E48001400_coordinatorUuid: RINCON_000E58D0E48001400
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 RINCON_000E58D0E48001400_mute_LF: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 RINCON_000E58D0E48001400_mute_Master: false
2020-11-02 15:14:09 Global global UNDEFINED MQTT2_RINCON_5CAAFDA1C27201400 MQTT2_DEVICE RINCON_5CAAFDA1C27201400 myBroker
2020-11-02 15:14:09 Global global DEFINED MQTT2_RINCON_5CAAFDA1C27201400
2020-11-02 15:14:09 Global global ATTR MQTT2_RINCON_5CAAFDA1C27201400 readingList sonos/RINCON_5CAAFDA1C27201400:.* { json2nameValue($EVENT, 'RINCON_5CAAFDA1C27201400_', $JSONMAP) }
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_currentTrack_ParentId: -1
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_currentTrack_ItemId: -1
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_name: Wohnzimmer
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_groupName: Wohnzimmer
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_currentTrack_ProtocolInfo: http-get:*:audio/mpeg:*
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_mute_LF: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_volume_RF: 100
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_playmode: NORMAL
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_bass: 7
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_currentTrack_TrackUri: http://192.168.0.202:8085/fhem/cache/2d1b9a0c845f50a0e6d2e731007392b0.mp3
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_coordinatorUuid: RINCON_5CAAFDA1C27201400
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_volume_Master: 20
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_treble: 8
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_transportState: STOPPED
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_currentTrack_Duration: 0:00:02
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_ts: 1604326448639
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_volume_LF: 100
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_currentTrack_UpnpClass: object.item.audioItem.musicTrack
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_currentTrack_Title: 2d1b9a0c845f50a0e6d2e731007392b0.mp3
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_mute_RF: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_uuid: RINCON_5CAAFDA1C27201400
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 RINCON_5CAAFDA1C27201400_mute_Master: false
2020-11-02 15:14:09 Global global UNDEFINED MQTT2_RINCON_949F3E84C8BC01400 MQTT2_DEVICE RINCON_949F3E84C8BC01400 myBroker
2020-11-02 15:14:09 Global global DEFINED MQTT2_RINCON_949F3E84C8BC01400
2020-11-02 15:14:09 Global global UNDEFINED MQTT2_RINCON_B8E9373184A001400 MQTT2_DEVICE RINCON_B8E9373184A001400 myBroker
2020-11-02 15:14:09 Global global DEFINED MQTT2_RINCON_B8E9373184A001400
2020-11-02 15:14:09 Global global ATTR MQTT2_RINCON_949F3E84C8BC01400 readingList sonos/RINCON_949F3E84C8BC01400:.* { json2nameValue($EVENT, 'RINCON_949F3E84C8BC01400_', $JSONMAP) }
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_ts: 1604326448650
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_nextTrack_Title: Watermelon Sugar
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_currentTrack_Artist: Elvis Presley
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_treble: 7
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_enqueuedMetadata_ParentId: 10fe2066libraryfolder%3af.4
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_groupName: Carlotta
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_currentTrack_AlbumArtUri: http://192.168.0.147:1400/getaa?s=1&u=x-sonos-http:librarytrack:i.W5x3PfXQD8G.mp4%3fsid%3d204%26flags%3d8224%26sn%3d10
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_name: Carlotta
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_volume_RF: 100
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_transportState: PAUSED_PLAYBACK
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_nextTrack_ItemId: -1
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_nextTrack_TrackUri: x-sonos-http:librarytrack:i.Ge4YYFrg9qv.mp4?sid=204&flags=8224&sn=10
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_currentTrack_UpnpClass: object.item.audioItem.musicTrack
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_currentTrack_TrackUri: x-sonos-http:librarytrack:i.W5x3PfXQD8G.mp4?sid=204&flags=8224&sn=10
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_currentTrack_ItemId: -1
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_currentTrack_Album: Elv1s: 30 #1 Hits
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_mute_LF: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_bass: 4
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_nextTrack_Album: Fine Line
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_volume_LF: 100
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_mute_RF: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_nextTrack_ProtocolInfo: sonos.com-http:*:audio/mp4:*
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_coordinatorUuid: RINCON_949F3E84C8BC01400
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_currentTrack_Duration: 0:02:35
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_volume_Master: 25
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_enqueuedMetadata_UpnpClass: object.container.playlistContainer.#PlaylistView
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_nextTrack_ParentId: -1
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_mute_Master: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_currentTrack_ParentId: -1
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_enqueuedMetadata_ItemId: 1006206clibraryplaylist%3ap.v3bm5uxmb3q
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_currentTrack_ProtocolInfo: sonos.com-http:*:audio/mp4:*
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_nextTrack_Duration: 0:02:53
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_uuid: RINCON_949F3E84C8BC01400
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_nextTrack_AlbumArtUri: http://192.168.0.147:1400/getaa?s=1&u=x-sonos-http:librarytrack:i.Ge4YYFrg9qv.mp4%3fsid%3d204%26flags%3d8224%26sn%3d10
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_nextTrack_Artist: Harry Styles
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_playmode: SHUFFLE
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_currentTrack_Title: Jailhouse Rock
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_enqueuedMetadata_Title: Coole Lieder
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 RINCON_949F3E84C8BC01400_nextTrack_UpnpClass: object.item.audioItem.musicTrack
2020-11-02 15:14:09 Global global ATTR MQTT2_RINCON_B8E9373184A001400 readingList sonos/RINCON_B8E9373184A001400:.* { json2nameValue($EVENT, 'RINCON_B8E9373184A001400_', $JSONMAP) }
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_volume_Master: 5
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_name: Büro
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_ts: 1604326448682
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_currentTrack_TrackUri: x-sonosapi-stream:nur-die-musik?sid=269&flags=8224&sn=18
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_playmode: NORMAL
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_currentTrack_AlbumArtUri: http://192.168.0.38:1400/getaa?s=1&u=x-sonosapi-stream:nur-die-musik%3fsid%3d269%26flags%3d8224%26sn%3d18
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_mute_Master: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_volume_RF: 100
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_mute_RF: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_uuid: RINCON_B8E9373184A001400
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_groupName: Büro
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_coordinatorUuid: RINCON_B8E9373184A001400
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_bass: 3
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_enqueuedMetadata_Title: Antenne Bayern
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_enqueuedMetadata_ItemId: -1
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_enqueuedMetadata_ParentId: -1
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_treble: 5
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_mute_LF: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_volume_LF: 100
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_enqueuedMetadata_UpnpClass: object.item.audioItem.audioBroadcast
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_transportState: STOPPED
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_currentTrack_ItemId: -1
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_currentTrack_ProtocolInfo: sonos.com-http:*:*:*
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_currentTrack_Title: x-sonosapi-stream:nur-die-musik?sid=269&flags=8224&sn=18
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_currentTrack_UpnpClass: object.item
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9373184A001400 RINCON_B8E9373184A001400_currentTrack_ParentId: -1
2020-11-02 15:14:09 Global global UNDEFINED MQTT2_RINCON_7828CAF11E7601400 MQTT2_DEVICE RINCON_7828CAF11E7601400 myBroker
2020-11-02 15:14:09 Global global DEFINED MQTT2_RINCON_7828CAF11E7601400
2020-11-02 15:14:09 Global global ATTR MQTT2_RINCON_7828CAF11E7601400 readingList sonos/RINCON_7828CAF11E7601400:.* { json2nameValue($EVENT, 'RINCON_7828CAF11E7601400_', $JSONMAP) }
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_nextTrack_ProtocolInfo: sonos.com-http:*:audio/mp4:*
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_mute_LF: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_mute_Master: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_nextTrack_Duration: 0:02:58
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_currentTrack_UpnpClass: object.item.audioItem.musicTrack
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_nextTrack_Title: Cruel Summer
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_currentTrack_Album: The Raw & the Cooked
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_enqueuedMetadata_AlbumArtUri: https://is5-ssl.mzstatic.com/image/thumb/8uBv9hbDi4D0AYp3rKLzmQ/400x400bb.jpeg
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_currentTrack_Artist: Fine Young Cannibals
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_currentTrack_Title: She Drives Me Crazy
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_currentTrack_AlbumArtUri: http://192.168.0.183:1400/getaa?s=1&u=x-sonos-http:song:1313940402.mp4%3fsid%3d204%26flags%3d8224%26sn%3d10
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_groupName: Küche
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_nextTrack_UpnpClass: object.item.audioItem.musicTrack
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_ts: 1604326448683
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_currentTrack_TrackUri: x-sonos-http:song:1313940402.mp4?sid=204&flags=8224&sn=10
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_nextTrack_TrackUri: x-sonos-http:song:1468058171.mp4?sid=204&flags=8224&sn=10
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_bass: 4
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_currentTrack_ParentId: -1
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_currentTrack_ItemId: -1
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_enqueuedMetadata_UpnpClass: object.container.playlistContainer.#PlaylistView
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_enqueuedMetadata_ItemId: 1006206cplaylist%3apl.99d6e278bc3145fbbea2d887ab12cfdd
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_treble: 7
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_volume_LF: 100
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_uuid: RINCON_7828CAF11E7601400
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_nextTrack_Album: Lover
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_currentTrack_ProtocolInfo: sonos.com-http:*:audio/mp4:*
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_name: Küche
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_nextTrack_AlbumArtUri: http://192.168.0.183:1400/getaa?s=1&u=x-sonos-http:song:1468058171.mp4%3fsid%3d204%26flags%3d8224%26sn%3d10
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_playmode: NORMAL
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_nextTrack_ParentId: -1
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_volume_RF: 100
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_nextTrack_Artist: Taylor Swift
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_enqueuedMetadata_Artist: Playlist von Pitchfork
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_currentTrack_Duration: 0:03:35
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_enqueuedMetadata_ParentId: 10fe2064curator%3a976439455
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_coordinatorUuid: RINCON_7828CAF11E7601400
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_enqueuedMetadata_Title: Recommended If You Like: Haim's Women in Music Pt. III
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_volume_Master: 10
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_mute_RF: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_transportState: PAUSED_PLAYBACK
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_7828CAF11E7601400 RINCON_7828CAF11E7601400_nextTrack_ItemId: -1
2020-11-02 15:14:09 Global global UNDEFINED MQTT2_RINCON_000E5870A13001400 MQTT2_DEVICE RINCON_000E5870A13001400 myBroker
2020-11-02 15:14:09 Global global DEFINED MQTT2_RINCON_000E5870A13001400
2020-11-02 15:14:09 Global global UNDEFINED MQTT2_RINCON_B8E9375294B201400 MQTT2_DEVICE RINCON_B8E9375294B201400 myBroker
2020-11-02 15:14:09 Global global DEFINED MQTT2_RINCON_B8E9375294B201400
2020-11-02 15:14:09 Global global ATTR MQTT2_RINCON_000E5870A13001400 readingList sonos/RINCON_000E5870A13001400:.* { json2nameValue($EVENT, 'RINCON_000E5870A13001400_', $JSONMAP) }
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_nextTrack_ParentId: -1
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_volume_LF: 100
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_nextTrack_ProtocolInfo: sonos.com-http:*:audio/mp4:*
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_bass: 3
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_currentTrack_Duration: 0:03:22
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_nextTrack_ItemId: -1
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_mute_RF: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_mute_Master: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_enqueuedMetadata_ParentId: 10fe2066libraryfolder%3af.4
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_currentTrack_Artist: The Script
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_nextTrack_AlbumArtUri: http://192.168.0.23:1400/getaa?s=1&u=x-sonos-http:librarytrack:i.l225TdOobD.mp4%3fsid%3d204%26flags%3d8224%26sn%3d10
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_currentTrack_Album: Hall of Fame (feat. will.i.am) - Single
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_treble: 7
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_enqueuedMetadata_ItemId: 1006206clibraryplaylist%3ap.v3bm5uxmb3q
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_enqueuedMetadata_Title: Coole Lieder
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_volume_Master: 20
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_coordinatorUuid: RINCON_000E5870A13001400
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_enqueuedMetadata_AlbumArtUri: https://store-033.blobstore.apple.com/sq-mq-us-033-000002/ba/0b/eb/ba0beb50-2459-a0ba-1d15-d647cf335d62/image?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20201017T102839Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Credential=MKIAU0HKO2RBEAT0UMZS%2F20201017%2Fstore-033%2Fs3%2Faws4_request&X-Amz-Signature=d88243baa28ed4873ee1fc48f54ac3c187ee9dd823fc1e5e272c01c50bc489eb
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_groupName: Mobil
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_currentTrack_UpnpClass: object.item.audioItem.musicTrack
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_enqueuedMetadata_UpnpClass: object.container.playlistContainer.#PlaylistView
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_name: Mobil
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_ts: 1604326448702
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_mute_LF: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_currentTrack_ProtocolInfo: sonos.com-http:*:audio/mp4:*
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_currentTrack_ParentId: -1
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_nextTrack_Artist: Manau
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_transportState: STOPPED
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_uuid: RINCON_000E5870A13001400
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_nextTrack_TrackUri: x-sonos-http:librarytrack:i.l225TdOobD.mp4?sid=204&flags=8224&sn=10
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_currentTrack_ItemId: -1
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_volume_RF: 100
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_nextTrack_UpnpClass: object.item.audioItem.musicTrack
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_playmode: SHUFFLE_NOREPEAT
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_currentTrack_Title: Hall of Fame (feat. will.i.am)
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_nextTrack_Album: Panique celtique
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_nextTrack_Duration: 0:04:06
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_currentTrack_TrackUri: x-sonos-http:librarytrack:i.D5B7kTbNeq0.mp4?sid=204&flags=8224&sn=10
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_nextTrack_Title: La confession
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_000E5870A13001400 RINCON_000E5870A13001400_currentTrack_AlbumArtUri: http://192.168.0.23:1400/getaa?s=1&u=x-sonos-http:librarytrack:i.D5B7kTbNeq0.mp4%3fsid%3d204%26flags%3d8224%26sn%3d10
2020-11-02 15:14:09 Global global ATTR MQTT2_RINCON_B8E9375294B201400 readingList sonos/RINCON_B8E9375294B201400:.* { json2nameValue($EVENT, 'RINCON_B8E9375294B201400_', $JSONMAP) }
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_mute_RF: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_playmode: NORMAL
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_mute_LF: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_coordinatorUuid: RINCON_B8E9375294B201400
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_currentTrack_Title:
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_treble: 8
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_name: Leoni
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_currentTrack_ParentId: -1
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_currentTrack_ProtocolInfo: :*:application/octet-stream:*
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_volume_LF: 100
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_volume_Master: 34
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_currentTrack_TrackUri: x-rincon-queue:RINCON_B8E9375294B201400#vli
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_transportState: PAUSED_PLAYBACK
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_volume_RF: 100
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_ts: 1604326448704
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_currentTrack_UpnpClass: object.item
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_mute_Master: false
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_groupName: Leoni
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_uuid: RINCON_B8E9375294B201400
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_bass: 7
2020-11-02 15:14:09 MQTT2_DEVICE MQTT2_RINCON_B8E9375294B201400 RINCON_B8E9375294B201400_currentTrack_ItemId: -1
2020-11-02 15:14:09 Global global UNDEFINED MQTT2_RINCON_B8E9375200CE01400 MQTT2_DEVICE RINCON_B8E9375200CE01400 myBroker
2020-11-02 15:14:09 Global global DEFINED MQTT2_RINCON_B8E9375200CE01400
2020-11-02 15:14:09 Global global ATTR MQTT2_RINCON_B8E9375200CE01400 readingList sonos/RINCON_B8E9375200CE01400:.* { json2nameValue($EVENT, 'RINCON_B8E9375200CE01400_', $JSONMAP) }
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_bass: 6
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_nextTrack_Artist: Stray Cats
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_currentTrack_AlbumArtUri: http://192.168.0.39:1400/getaa?s=1&u=x-sonos-http:song:1308582195.mp4%3fsid%3d204%26flags%3d8224%26sn%3d10
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_enqueuedMetadata_Title: The Very Best Of
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_volume_RF: 100
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_playmode: NORMAL
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_currentTrack_Title: Runaway Boys
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_ts: 1604326448706
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_nextTrack_AlbumArtUri: http://192.168.0.39:1400/getaa?s=1&u=x-sonos-http:song:1308582204.mp4%3fsid%3d204%26flags%3d8224%26sn%3d10
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_nextTrack_ParentId: -1
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_volume_Master: 10
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_currentTrack_ParentId: -1
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_currentTrack_Album: The Very Best Of
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_mute_Master: false
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_mute_RF: false
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_nextTrack_ItemId: -1
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_currentTrack_Artist: Stray Cats
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_nextTrack_ProtocolInfo: sonos.com-http:*:audio/mp4:*
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_currentTrack_UpnpClass: object.item.audioItem.musicTrack
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_groupName: Bad
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_enqueuedMetadata_Artist: Stray Cats
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_name: Bad
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_mute_LF: false
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_currentTrack_Duration: 0:03:00
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_nextTrack_Album: The Very Best Of
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_volume_LF: 100
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_enqueuedMetadata_Album: The Very Best Of
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_enqueuedMetadata_UpnpClass: object.container.album.musicAlbum.#AlbumView
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_enqueuedMetadata_AlbumArtUri: https://is3-ssl.mzstatic.com/image/thumb/Music118/v4/47/29/9b/47299bc0-5aa8-0f7a-6426-fad9a023dc60/source/400x400bb.jpeg
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_treble: 9
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_currentTrack_ProtocolInfo: sonos.com-http:*:audio/mp4:*
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_currentTrack_ItemId: -1
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_transportState: PAUSED_PLAYBACK
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_nextTrack_UpnpClass: object.item.audioItem.musicTrack
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_nextTrack_Title: Rock This Town
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_nextTrack_Duration: 0:03:23
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_nextTrack_TrackUri: x-sonos-http:song:1308582204.mp4?sid=204&flags=8224&sn=10
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_coordinatorUuid: RINCON_B8E9375200CE01400
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_currentTrack_TrackUri: x-sonos-http:song:1308582195.mp4?sid=204&flags=8224&sn=10
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_enqueuedMetadata_ItemId: 1004206calbum%3a1308581915
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_uuid: RINCON_B8E9375200CE01400
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_B8E9375200CE01400 RINCON_B8E9375200CE01400_enqueuedMetadata_ParentId: 10052064artist%3a554105
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_000E58D0E48001400 icon audio_volume_low
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_000E58D0E48001400 jsonMap volume_Master:volume mute_Master:mute transportState:state
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_000E58D0E48001400 readingList sonos/RINCON_000E58D0E48001400:.* { json2nameValue($EVENT,'',$JSONMAP) }
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_000E58D0E48001400 setList stop:noArg sonos/RINCON_000E58D0E48001400/control { "command": "stop" }   play:noArg sonos/RINCON_000E58D0E48001400/control { "command": "play" }   pause:noArg sonos/RINCON_000E58D0E48001400/control { "command": "pause" }   toggle:noArg sonos/RINCON_000E58D0E48001400/control { "command": "toggle" }   volumeUp:noArg sonos/RINCON_000E58D0E48001400/control { "command": "volumeup" }   volumeDown:noArg sonos/RINCON_000E58D0E48001400/control { "command": "volumedown" }   volume:slider,0,1,100 sonos/RINCON_000E58D0E48001400/control { "command": "volume", "input": $EVTPART1 }   mute:true,false { my $value = $EVTPART1 eq "true" ? "mute" : "unmute"; qq(sonos/RINCON_000E58D0E48001400/control { "command": "$value" } ) }   next:noArg sonos/RINCON_000E58D0E48001400/control { "command": "next" }   previous:noArg sonos/RINCON_000E58D0E48001400/control { "command": "previous" }   joinGroup:textField sonos/RINCON_000E58D0E48001400/control { "command": "joingroup",  "input": "$EVTPART1"}   leaveGroup:noArg { my $value = ReadingsVal("RINCON_000E58D0E48001400","groupName","all"); qq(sonos/RINCON_000E58D0E48001400/control { "command": "leavegroup",  "input": "$value" } ) }   setAVTUri:textField sonos/RINCON_000E58D0E48001400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}   playUri:textField {fhem("set $NAME setAVTUri $EVTPART1; sleep 1; set $NAME play")}   input:Queue { my $value = $EVTPART1 eq "TV" ? "tv" : $EVTPART1 eq "Line_In" ? "line" : "queue"; qq(sonos/RINCON_000E58D0E48001400/control { "command": "switchto$value" } ) }   notify:textField sonos/RINCON_000E58D0E48001400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}   x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_000E58D0E48001400/control $payload)}
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_000E58D0E48001400 devStateIcon (STOPPED|PAUSED_PLAYBACK):rc_PLAY:toggle PLAYING:rc_PAUSE:pause .*:refresh:play
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_000E58D0E48001400 alias unknown
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_000E58D0E48001400 model sonos2mqtt_speaker
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 attrTemplateVersion: 20200729
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 x_raw_payload
2020-11-02 15:14:10 ESPEasy ESPEasy_Stromzaehler Time: 8578
2020-11-02 15:14:10 ESPEasy ESPEasy_Stromzaehler currentPower: 5596
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_000E58D0E48001400 readingList sonos/RINCON_000E58D0E48001400:.* { json2nameValue($EVENT,'',$JSONMAP) } sonos/RINCON_000E58D0E48001400/ZoneInfo:.* { json2nameValue($EVENT, 'ZoneInfo_', $JSONMAP) }
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 ZoneInfo_MACAddress: 00:0E:58:D0:E4:80
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 ZoneInfo_DisplaySoftwareVersion: 11.2.3
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 ZoneInfo_CopyrightInfo: © 2003-2019, Sonos, Inc. All rights reserved.
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 ZoneInfo_HardwareVersion: 1.16.3.1-2.0
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 ZoneInfo_Flags: 1
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 ZoneInfo_ExtraInfo: OTP: 1.1.1(1-16-3-0.9)
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 ZoneInfo_SerialNumber: 00-0E-58-D0-E4-80:6
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 ZoneInfo_HTAudioIn: 0
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 ZoneInfo_IPAddress: 192.168.0.43
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_000E58D0E48001400 ZoneInfo_SoftwareVersion: 57.3-81090
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_5CAAFDA1C27201400 icon audio_volume_low
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_5CAAFDA1C27201400 jsonMap volume_Master:volume mute_Master:mute transportState:state
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_5CAAFDA1C27201400 readingList sonos/RINCON_5CAAFDA1C27201400:.* { json2nameValue($EVENT,'',$JSONMAP) }
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_5CAAFDA1C27201400 setList stop:noArg sonos/RINCON_5CAAFDA1C27201400/control { "command": "stop" }   play:noArg sonos/RINCON_5CAAFDA1C27201400/control { "command": "play" }   pause:noArg sonos/RINCON_5CAAFDA1C27201400/control { "command": "pause" }   toggle:noArg sonos/RINCON_5CAAFDA1C27201400/control { "command": "toggle" }   volumeUp:noArg sonos/RINCON_5CAAFDA1C27201400/control { "command": "volumeup" }   volumeDown:noArg sonos/RINCON_5CAAFDA1C27201400/control { "command": "volumedown" }   volume:slider,0,1,100 sonos/RINCON_5CAAFDA1C27201400/control { "command": "volume", "input": $EVTPART1 }   mute:true,false { my $value = $EVTPART1 eq "true" ? "mute" : "unmute"; qq(sonos/RINCON_5CAAFDA1C27201400/control { "command": "$value" } ) }   next:noArg sonos/RINCON_5CAAFDA1C27201400/control { "command": "next" }   previous:noArg sonos/RINCON_5CAAFDA1C27201400/control { "command": "previous" }   joinGroup:textField sonos/RINCON_5CAAFDA1C27201400/control { "command": "joingroup",  "input": "$EVTPART1"}   leaveGroup:noArg { my $value = ReadingsVal("RINCON_5CAAFDA1C27201400","groupName","all"); qq(sonos/RINCON_5CAAFDA1C27201400/control { "command": "leavegroup",  "input": "$value" } ) }   setAVTUri:textField sonos/RINCON_5CAAFDA1C27201400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}   playUri:textField {fhem("set $NAME setAVTUri $EVTPART1; sleep 1; set $NAME play")}   input:Queue { my $value = $EVTPART1 eq "TV" ? "tv" : $EVTPART1 eq "Line_In" ? "line" : "queue"; qq(sonos/RINCON_5CAAFDA1C27201400/control { "command": "switchto$value" } ) }   notify:textField sonos/RINCON_5CAAFDA1C27201400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}   x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_5CAAFDA1C27201400/control $payload)}
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_5CAAFDA1C27201400 devStateIcon (STOPPED|PAUSED_PLAYBACK):rc_PLAY:toggle PLAYING:rc_PAUSE:pause .*:refresh:play
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_5CAAFDA1C27201400 alias unknown
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_5CAAFDA1C27201400 model sonos2mqtt_speaker
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 attrTemplateVersion: 20200729
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 x_raw_payload
2020-11-02 15:14:10 CUL_HM HZ_Bad_WT_Climate desired-temp: 8.0
2020-11-02 15:14:10 CUL_HM HZ_Bad_WT_Climate humidity: 67
2020-11-02 15:14:10 CUL_HM HZ_Bad_WT_Climate measured-temp: 21.9
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_5CAAFDA1C27201400 readingList sonos/RINCON_5CAAFDA1C27201400:.* { json2nameValue($EVENT,'',$JSONMAP) } sonos/RINCON_5CAAFDA1C27201400/ZoneInfo:.* { json2nameValue($EVENT, 'ZoneInfo_', $JSONMAP) }
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 ZoneInfo_ExtraInfo: OTP:
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 ZoneInfo_SerialNumber: 5C-AA-FD-A1-C2-72:8
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 ZoneInfo_HTAudioIn: 21
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 ZoneInfo_IPAddress: 192.168.0.42
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 ZoneInfo_SoftwareVersion: 57.3-81090
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 ZoneInfo_MACAddress: 5C:AA:FD:A1:C2:72
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 ZoneInfo_DisplaySoftwareVersion: 11.2.3
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 ZoneInfo_HardwareVersion: 1.9.1.10-2.0
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 ZoneInfo_CopyrightInfo: © 2003-2019, Sonos, Inc. All rights reserved.
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 ZoneInfo_Flags: 0
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_949F3E84C8BC01400 icon audio_volume_low
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_949F3E84C8BC01400 jsonMap volume_Master:volume mute_Master:mute transportState:state
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_949F3E84C8BC01400 readingList sonos/RINCON_949F3E84C8BC01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_949F3E84C8BC01400 setList stop:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "stop" }   play:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "play" }   pause:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "pause" }   toggle:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "toggle" }   volumeUp:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "volumeup" }   volumeDown:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "volumedown" }   volume:slider,0,1,100 sonos/RINCON_949F3E84C8BC01400/control { "command": "volume", "input": $EVTPART1 }   mute:true,false { my $value = $EVTPART1 eq "true" ? "mute" : "unmute"; qq(sonos/RINCON_949F3E84C8BC01400/control { "command": "$value" } ) }   next:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "next" }   previous:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "previous" }   joinGroup:textField sonos/RINCON_949F3E84C8BC01400/control { "command": "joingroup",  "input": "$EVTPART1"}   leaveGroup:noArg { my $value = ReadingsVal("RINCON_949F3E84C8BC01400","groupName","all"); qq(sonos/RINCON_949F3E84C8BC01400/control { "command": "leavegroup",  "input": "$value" } ) }   setAVTUri:textField sonos/RINCON_949F3E84C8BC01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}   playUri:textField {fhem("set $NAME setAVTUri $EVTPART1; sleep 1; set $NAME play")}   input:Queue { my $value = $EVTPART1 eq "TV" ? "tv" : $EVTPART1 eq "Line_In" ? "line" : "queue"; qq(sonos/RINCON_949F3E84C8BC01400/control { "command": "switchto$value" } ) }   notify:textField sonos/RINCON_949F3E84C8BC01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}   x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_949F3E84C8BC01400/control $payload)}
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_949F3E84C8BC01400 devStateIcon (STOPPED|PAUSED_PLAYBACK):rc_PLAY:toggle PLAYING:rc_PAUSE:pause .*:refresh:play
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_949F3E84C8BC01400 alias unknown
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_949F3E84C8BC01400 model sonos2mqtt_speaker
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 attrTemplateVersion: 20200729
2020-11-02 15:14:10 MQTT2_DEVICE MQTT2_RINCON_949F3E84C8BC01400 x_raw_payload
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_B8E9373184A001400 icon audio_volume_low
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_B8E9373184A001400 jsonMap volume_Master:volume mute_Master:mute transportState:state
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_B8E9373184A001400 readingList sonos/RINCON_B8E9373184A001400:.* { json2nameValue($EVENT,'',$JSONMAP) }
2020-11-02 15:14:10 Global global ATTR MQTT2_RINCON_B8E9373184A001400 setList stop:noArg sonos/RINCON_B8E9373184A001400/control { "command": "stop" }   play:noArg sonos/RINCON_B8E9373184A001400/control { "command": "play" }   pause:noArg sonos/RINCON_B8E9373184A001400/control { "command": "pause" }   toggle:noArg sonos/RINCON_B8E9373184A001400/control { "command": "toggle" }   volumeUp:noArg sonos/RINCON_B8E9373184A001400/control { "command": "volumeup" }   volumeDown:noArg sonos/RINCON_B8E9373184A001400/control { "command": "volumedown" }   volume:slider,0,1,100 sonos/RINCON_B8E9373184A001400/control { "command": "volume", "input": $EVTPART1 }   mute:true,false { my $value = $EVTPART1 eq "true" ? "mute" : "unmute"; qq(sonos/RINCON_B8E9373184A001400/control { "command": "$value" } ) }   next:noArg sonos/RINCON_B8E9373184A001400/control { "command": "next" }   previous:noArg sonos/RINCON_B8E9373184A001400/control { "command": "previous" }   joinGroup:textField sonos/RINCON_B8E9373184A001400/control { "command": "joingroup",  "input": "$EVTPART1"}   leaveGroup:noArg { my $value = ReadingsVal("RINCON_B8E9373184A001400","groupName","all"); qq(sonos/RINCON_B8E9373184A001400/control { "command": "leavegroup",  "input": "$value" } ) }   setAVTUri:textField sonos/RINCON_B8E9373184A001400/control { "
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 02 November 2020, 15:40:59
Wenn ich den 2. notify
REGEXP     MQTT2_RINCON_[A-Z0-9]+:IPAddress:.*
richtig deute, dann triggert der auf IPAddress?

Dieses Reading gibt es bei mir gar nicht. Kann also nicht gehen.

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 02 November 2020, 16:36:48
Zitat von: Mitch am 02 November 2020, 15:40:59
Wenn ich den 2. notify
REGEXP     MQTT2_RINCON_[A-Z0-9]+:IPAddress:.*
richtig deute, dann triggert der auf IPAddress?

Dieses Reading gibt es bei mir gar nicht. Kann also nicht gehen.

Die IP-Adresse wird eigentlich aus

defmod n_configSonos1 notify global:DEFINED.MQTT2_RINCON_[A-Z0-9]+ sleep 1;\
  set $EVTPART1 attrTemplate sonos2mqtt_speaker;\
  set $EVTPART1 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}


geholt.
Hast du dieses Notify bei dir? Wenn ja, dann lösch die ganzen Speaker nochmal. Die müssten dann automatisch neu angelegt werden und die Notifies auslösen.

Wenn das nicht klappt, dann kannst du noch die einzelnen Zeilen aus dem Notify manuell ausführen. Halt $EVTPART1 durch dein Device ersetzen. Aber erstmal würde ich den automatischen Weg nochmal versuchen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 02 November 2020, 16:37:59
Ja, beide Notifys sind da.
Habe auch schon zick mal alles gelöscht und neu gemacht.

Habe auch schon manuell
set $EVTPART1 attrTemplate sonos2mqtt_speaker;\
  set $EVTPART1 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
ausgeführt.

Irgendwo im 2. Notify hackt es noch.

Wenn man sich die Events beim autocreate anschaut, dann gibt es da IP mässig nur: MQTT2_DEVICE MQTT2_RINCON_5CAAFDA1C27201400 ZoneInfo_IPAddress: 192.168.0.42
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 02 November 2020, 17:51:33
Habe jetzt nochmal meine Player ohne den Notify angelegt und entsprechend StateIcon und Co. eingepflegt.

Leider bringt der Log nur noch: PERL WARNING: Use of uninitialized value $sgroupname in concatenation (.) or string at (eval 16839) line 64.

Lieg meiner Meinung daran, dass im devStateIcon folgendes steht: my $groupname = ReadingsVal($name,'groupName','0');;\

Das gibt es aber (wieder) nicht als Reading.
Die Reading sind immer: RINCON_000E58D0E48001400_groupName
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 November 2020, 19:34:27
Du hast den zweiten Satz im Setup in FHEM Abschnitt nicht beachtet!
ZitatDer verwendete MQTT2_SERVER steht auf autocreate simple (default/Standard).

Damit stimmt kein Reading im Player, damit funktioniert quasi nichts von dem vorbereitet Code.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 02 November 2020, 19:38:54
Guter Punkt, war auf Complex.

Ich habe aber gerade ein neues FHEM aufgesetzt.
Nur MQTT, sonst nichts. Dort auf simple.

Ergebnis ist "suboptimal".

Ein paar Player erhalten den richtigen Alias, ein paar nicht.
Icon funktioniert gar nicht.

Hier der Log dazu:
2020.11.02 18:34:20 2: autocreate: define MQTT2_RINCON_5CAAFDA1C27201400 MQTT2_DEVICE RINCON_5CAAFDA1C27201400 MQTT
2020.11.02 18:34:20 2: autocreate: define FileLog_MQTT2_RINCON_5CAAFDA1C27201400 FileLog ./log/MQTT2_RINCON_5CAAFDA1C27201400-%Y.log MQTT2_RINCON_5CAAFDA1C27201400
2020.11.02 18:34:20 2: autocreate: define MQTT2_RINCON_949F3E84C8BC01400 MQTT2_DEVICE RINCON_949F3E84C8BC01400 MQTT
2020.11.02 18:34:20 2: autocreate: define FileLog_MQTT2_RINCON_949F3E84C8BC01400 FileLog ./log/MQTT2_RINCON_949F3E84C8BC01400-%Y.log MQTT2_RINCON_949F3E84C8BC01400
2020.11.02 18:34:20 2: autocreate: define MQTT2_RINCON_000E58D0E48001400 MQTT2_DEVICE RINCON_000E58D0E48001400 MQTT
2020.11.02 18:34:20 2: autocreate: define FileLog_MQTT2_RINCON_000E58D0E48001400 FileLog ./log/MQTT2_RINCON_000E58D0E48001400-%Y.log MQTT2_RINCON_000E58D0E48001400
2020.11.02 18:34:20 2: autocreate: define MQTT2_RINCON_B8E9373184A001400 MQTT2_DEVICE RINCON_B8E9373184A001400 MQTT
2020.11.02 18:34:20 2: autocreate: define FileLog_MQTT2_RINCON_B8E9373184A001400 FileLog ./log/MQTT2_RINCON_B8E9373184A001400-%Y.log MQTT2_RINCON_B8E9373184A001400
2020.11.02 18:34:20 2: autocreate: define MQTT2_RINCON_7828CAF11E7601400 MQTT2_DEVICE RINCON_7828CAF11E7601400 MQTT
2020.11.02 18:34:20 2: autocreate: define FileLog_MQTT2_RINCON_7828CAF11E7601400 FileLog ./log/MQTT2_RINCON_7828CAF11E7601400-%Y.log MQTT2_RINCON_7828CAF11E7601400
2020.11.02 18:34:20 2: autocreate: define MQTT2_RINCON_000E5870A13001400 MQTT2_DEVICE RINCON_000E5870A13001400 MQTT
2020.11.02 18:34:20 2: autocreate: define FileLog_MQTT2_RINCON_000E5870A13001400 FileLog ./log/MQTT2_RINCON_000E5870A13001400-%Y.log MQTT2_RINCON_000E5870A13001400
2020.11.02 18:34:20 2: autocreate: define MQTT2_RINCON_B8E9375200CE01400 MQTT2_DEVICE RINCON_B8E9375200CE01400 MQTT
2020.11.02 18:34:20 2: autocreate: define FileLog_MQTT2_RINCON_B8E9375200CE01400 FileLog ./log/MQTT2_RINCON_B8E9375200CE01400-%Y.log MQTT2_RINCON_B8E9375200CE01400
2020.11.02 18:34:20 2: autocreate: define MQTT2_RINCON_347E5CF7E6D001400 MQTT2_DEVICE RINCON_347E5CF7E6D001400 MQTT
2020.11.02 18:34:20 2: autocreate: define FileLog_MQTT2_RINCON_347E5CF7E6D001400 FileLog ./log/MQTT2_RINCON_347E5CF7E6D001400-%Y.log MQTT2_RINCON_347E5CF7E6D001400
2020.11.02 18:34:20 2: autocreate: define MQTT2_RINCON_B8E9375294B201400 MQTT2_DEVICE RINCON_B8E9375294B201400 MQTT
2020.11.02 18:34:20 2: autocreate: define FileLog_MQTT2_RINCON_B8E9375294B201400 FileLog ./log/MQTT2_RINCON_B8E9375294B201400-%Y.log MQTT2_RINCON_B8E9375294B201400
2020.11.02 18:34:21 3: MQTT2_DEVICE set MQTT2_RINCON_5CAAFDA1C27201400 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
sh: 1: cannot open url: No such file
2020.11.02 18:34:21 3: MQTT2_DEVICE set MQTT2_RINCON_949F3E84C8BC01400 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
2020.11.02 18:34:21 3: MQTT2_DEVICE set MQTT2_RINCON_000E58D0E48001400 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
2020.11.02 18:34:21 3: MQTT2_DEVICE set MQTT2_RINCON_B8E9373184A001400 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
sh: 1: cannot open url: No such file
2020.11.02 18:34:21 3: MQTT2_DEVICE set MQTT2_RINCON_7828CAF11E7601400 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
2020.11.02 18:34:21 3: MQTT2_DEVICE set MQTT2_RINCON_000E5870A13001400 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
sh: 1: cannot open url: No such file
2020.11.02 18:34:21 3: MQTT2_DEVICE set MQTT2_RINCON_B8E9375200CE01400 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
2020.11.02 18:34:21 3: MQTT2_DEVICE set MQTT2_RINCON_347E5CF7E6D001400 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
2020.11.02 18:34:22 1: PERL WARNING: Use of uninitialized value $mn in concatenation (.) or string at (eval 275) line 8.
2020.11.02 18:34:22 3: eval: my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{
  my @tv = ("S14","S11","S9");
  my @line = ("S5","Z90","ZP120");
  my $url="http://$EVTPART1:1400";
  my $xmltext = GetFileFromURL("$url/xml/device_description.xml");
  my ($mn)=$xmltext =~ /(S[0-9]+)/;
  my ($img)=$xmltext =~ /(.*)<\/url>/;
  my $icon="Sonos2mqtt_icon-$mn";
  my $setList=AttrVal($NAME,'setList','');
  fhem("setreading $NAME modelNumber $mn");
  fhem("\"wget -qO ./www/images/default/$icon.png $url$img\"");
  fhem("attr $NAME icon $icon;sleep 4 WI;set WEB rereadicons");
  if (grep(/$mn/, @tv)) {$setList=~s/input:Queue \{/input:Queue,TV \{/};
  if (grep(/$mn/, @line)) {$setList=~s/input:Queue \{/input:Queue,Line_In \{/};
  $setList=~s/;/;;/g;
  fhem("attr $NAME setList $setList")
}
2020.11.02 18:34:22 1: PERL WARNING: Use of uninitialized value $mn in concatenation (.) or string at (eval 275) line 10.
2020.11.02 18:34:22 3: eval: my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{
  my @tv = ("S14","S11","S9");
  my @line = ("S5","Z90","ZP120");
  my $url="http://$EVTPART1:1400";
  my $xmltext = GetFileFromURL("$url/xml/device_description.xml");
  my ($mn)=$xmltext =~ /(S[0-9]+)/;
  my ($img)=$xmltext =~ /(.*)<\/url>/;
  my $icon="Sonos2mqtt_icon-$mn";
  my $setList=AttrVal($NAME,'setList','');
  fhem("setreading $NAME modelNumber $mn");
  fhem("\"wget -qO ./www/images/default/$icon.png $url$img\"");
  fhem("attr $NAME icon $icon;sleep 4 WI;set WEB rereadicons");
  if (grep(/$mn/, @tv)) {$setList=~s/input:Queue \{/input:Queue,TV \{/};
  if (grep(/$mn/, @line)) {$setList=~s/input:Queue \{/input:Queue,Line_In \{/};
  $setList=~s/;/;;/g;
  fhem("attr $NAME setList $setList")
}
2020.11.02 18:34:22 3: setreading MQTT2_RINCON_000E58D0E48001400 modelNumber  : Usage: setreading <name> [YYYY-MM-DD HH:MM:SS] <reading> <value>
where <name> is a single device name, a list separated by comma (,) or a regexp. See the devspec section in the commandref.html for details.

2020.11.02 18:34:22 1: PERL WARNING: Use of uninitialized value $mn in regexp compilation at (eval 275) line 13.
2020.11.02 18:34:22 3: eval: my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{
  my @tv = ("S14","S11","S9");
  my @line = ("S5","Z90","ZP120");
  my $url="http://$EVTPART1:1400";
  my $xmltext = GetFileFromURL("$url/xml/device_description.xml");
  my ($mn)=$xmltext =~ /(S[0-9]+)/;
  my ($img)=$xmltext =~ /(.*)<\/url>/;
  my $icon="Sonos2mqtt_icon-$mn";
  my $setList=AttrVal($NAME,'setList','');
  fhem("setreading $NAME modelNumber $mn");
  fhem("\"wget -qO ./www/images/default/$icon.png $url$img\"");
  fhem("attr $NAME icon $icon;sleep 4 WI;set WEB rereadicons");
  if (grep(/$mn/, @tv)) {$setList=~s/input:Queue \{/input:Queue,TV \{/};
  if (grep(/$mn/, @line)) {$setList=~s/input:Queue \{/input:Queue,Line_In \{/};
  $setList=~s/;/;;/g;
  fhem("attr $NAME setList $setList")
}
2020.11.02 18:34:22 1: PERL WARNING: Use of uninitialized value $mn in regexp compilation at (eval 275) line 14.
2020.11.02 18:34:22 3: eval: my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{
  my @tv = ("S14","S11","S9");
  my @line = ("S5","Z90","ZP120");
  my $url="http://$EVTPART1:1400";
  my $xmltext = GetFileFromURL("$url/xml/device_description.xml");
  my ($mn)=$xmltext =~ /(S[0-9]+)/;
  my ($img)=$xmltext =~ /(.*)<\/url>/;
  my $icon="Sonos2mqtt_icon-$mn";
  my $setList=AttrVal($NAME,'setList','');
  fhem("setreading $NAME modelNumber $mn");
  fhem("\"wget -qO ./www/images/default/$icon.png $url$img\"");
  fhem("attr $NAME icon $icon;sleep 4 WI;set WEB rereadicons");
  if (grep(/$mn/, @tv)) {$setList=~s/input:Queue \{/input:Queue,TV \{/};
  if (grep(/$mn/, @line)) {$setList=~s/input:Queue \{/input:Queue,Line_In \{/};
  $setList=~s/;/;;/g;
  fhem("attr $NAME setList $setList")
}
sh: 1: cannot open url: No such file
sh: 1: cannot open url: No such file
sh: 1: cannot open url: No such file
2020.11.02 18:34:22 3: MQTT2_DEVICE set MQTT2_RINCON_B8E9375294B201400 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
sh: 1: cannot open url: No such file
sh: 1: cannot open url: No such file
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 November 2020, 19:50:56
kannst Du mal bitte einen der nicht richtig geht listen.
Ich habe eine Ahnung, die Modellnumber ist sicher nicht Sxx. Das muss ich anpassen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 02 November 2020, 19:52:25
doch, ist sie  ;)

Play 3:

Internals:
   CFGFN     
   CID        RINCON_B8E9373184A001400
   DEF        RINCON_B8E9373184A001400
   DEVICETOPIC MQTT2_RINCON_B8E9373184A001400
   FUUID      5fa0512c-f33f-f3cd-cb23-03eeaf9c7fac3e5d
   IODev      MQTT
   LASTInputDev MQTT
   MQTT_MSGCNT 12
   MQTT_TIME  2020-11-02 18:45:03
   MSGCNT     12
   NAME       MQTT2_RINCON_B8E9373184A001400
   NR         69
   STATE      STOPPED
   TYPE       MQTT2_DEVICE
   JSONMAP:
     mute_Master mute
     transportState state
     volume_Master volume
   READINGS:
     2020-11-02 18:34:21   CopyrightInfo   © 2003-2019, Sonos, Inc. All rights reserved.
     2020-11-02 18:34:21   DisplaySoftwareVersion 11.2.3
     2020-11-02 18:34:21   ExtraInfo       OTP:
     2020-11-02 18:34:21   Flags           0
     2020-11-02 18:34:21   HTAudioIn       0
     2020-11-02 18:34:21   HardwareVersion 1.8.1.3-2.0
     2020-11-02 18:34:21   IPAddress       192.168.0.38
     2020-11-02 18:34:21   MACAddress      B8:E9:37:31:84:A0
     2020-11-02 18:34:21   SerialNumber    B8-E9-37-31-84-A0:5
     2020-11-02 18:34:21   SoftwareVersion 57.3-81090
     2020-11-02 18:34:21   associatedWith  SonosBridge
     2020-11-02 18:34:21   attrTemplateVersion 20200729
     2020-11-02 18:45:03   bass            3
     2020-11-02 18:45:03   coordinatorUuid RINCON_B8E9373184A001400
     2020-11-02 18:45:03   currentTrack_AlbumArtUri http://192.168.0.38:1400/getaa?s=1&u=x-sonosapi-stream:nur-die-musik%3fsid%3d269%26flags%3d8224%26sn%3d18
     2020-11-02 18:44:12   currentTrack_Artist Loud Luxury feat. brando
     2020-11-02 18:44:06   currentTrack_Duration 0:00:01
     2020-11-02 18:45:03   currentTrack_ItemId -1
     2020-11-02 18:45:03   currentTrack_ParentId -1
     2020-11-02 18:45:03   currentTrack_ProtocolInfo sonos.com-http:*:*:*
     2020-11-02 18:45:03   currentTrack_Title x-sonosapi-stream:nur-die-musik?sid=269&amp;flags=8224&amp;sn=18
     2020-11-02 18:45:03   currentTrack_TrackUri x-sonosapi-stream:nur-die-musik?sid=269&flags=8224&sn=18
     2020-11-02 18:45:03   currentTrack_UpnpClass object.item
     2020-11-02 18:45:03   enqueuedMetadata_ItemId -1
     2020-11-02 18:45:03   enqueuedMetadata_ParentId -1
     2020-11-02 18:45:03   enqueuedMetadata_Title Antenne Bayern
     2020-11-02 18:45:03   enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
     2020-11-02 18:45:03   groupName       Büro
     2020-11-02 18:34:21   modelNumber     S3
     2020-11-02 18:45:03   mute            false
     2020-11-02 18:45:03   mute_LF         false
     2020-11-02 18:34:20   mute_Master     false
     2020-11-02 18:45:03   mute_RF         false
     2020-11-02 18:45:03   name            Büro
     2020-11-02 18:45:03   playmode        NORMAL
     2020-11-02 18:45:03   state           STOPPED
     2020-11-02 18:34:20   transportState  STOPPED
     2020-11-02 18:45:03   treble          5
     2020-11-02 18:45:03   ts              1604342703208
     2020-11-02 18:45:03   uuid            RINCON_B8E9373184A001400
     2020-11-02 18:45:03   volume          5
     2020-11-02 18:45:03   volume_LF       100
     2020-11-02 18:34:20   volume_Master   5
     2020-11-02 18:45:03   volume_RF       100
Attributes:
   IODev      MQTT
   alias      Büro
   devStateIcon {
my $wpix = '250px';
my $groupname = ReadingsVal($name,'groupName','0');
my $sgroupname = (split(' ',ReadingsVal($name,'groupName','')))[0];
my $uuidtoname = (devspec2array('DEF='.ReadingsVal($name,'coordinatorUuid','0')))[0];
my $vol = ReadingsVal($name,'volume','');
my $img = ReadingsVal($name,'currentTrack_AlbumArtUri','');
my $mystate = $name eq $uuidtoname
  ? ReadingsVal($name,'state','FEHLER') : ReadingsVal($uuidtoname,'state','');
my $playpic = $mystate eq 'PLAYING'
  ? 'rc_PAUSE@red'    : $mystate eq 'PAUSED_PLAYBACK'
  ? 'rc_PLAY@green'   : $mystate eq 'STOPPED'
  ? 'rc_PLAY@green'   : $mystate eq 'TRANSITIONING'
  ? 'rc_PLAY@blue'    : $mystate eq 'set_next'
  ? 'rc_NEXT@blue'    : $mystate eq 'set_previous'
  ? 'rc_PREVIOUS@blue': $mystate eq 'set_volumeUp'
  ? 'rc_VOLUP@blue'   : $mystate eq 'set_volumeDown'
  ? 'rc_VOLDOWN@blue' : $mystate eq 'set_mute'
  ? 'rc_MUTE@blue'    : 'rc_PLAY@yellow';
my $mutecmd = ReadingsVal($name,'mute','0') eq 'false'?'true':'false';
my $mutepic = $mutecmd eq 'on'?'rc_MUTE':'rc_VOLUP';
my $show = 'FEHLER';
my $currentTrack_Artist = ReadingsVal($name,'currentTrack_Artist','FEHLER');
my $currentTrack_Title = ReadingsVal($name,'currentTrack_Title','FEHLER');
if ($currentTrack_Title =~ 'x-sonosapi-stream:'){$currentTrack_Title=''};
my $currentTrack = $mystate eq 'TRANSITIONING'
  ? 'Puffern...' : $currentTrack_Artist.' - '.$currentTrack_Title;
my $nextTrack_Artist = ReadingsVal($name,'nextTrack_Artist','FEHLER');
my $nextTrack_Title = ReadingsVal($name,'nextTrack_Title','FEHLER');
my $nextTrack = $nextTrack_Artist.' - '.$nextTrack_Title;
my $previouspic = 'rc_PREVIOUS';
my $nextpic = 'rc_NEXT';
my $voldownpic = 'rc_VOLDOWN';
my $voluppic = 'rc_VOLUP';
my $leavegrouppic = 'rc_LEFT';
my $showlg = ReadingsVal($name,"name","0") ne $groupname ? "<a href=\"/fhem?cmd.dummy=set $name leaveGroup&XHR=1\">".FW_makeImage($leavegrouppic)."</a>" : "";
if (($mystate eq 'PLAYING')
  || ($mystate eq 'TRANSITIONING' )
  || ($mystate eq 'set_next' )
  || ($mystate eq 'set_previous' )
  || ($mystate eq 'set_volumeUp' )
  || ($mystate eq 'set_volumeDown' )
  || ($mystate eq 'set_mute' )) {
    my $shownp = ReadingsVal($name,'name','') eq $sgroupname
    ? "<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>
       <a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>" : ""; 
    $show = "$showlg <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>
    <a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>
    $shownp
    <a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>";
 
    if (ReadingsVal($name,'name','') eq $sgroupname) {
      $show = ReadingsVal($name,'currentTrack_TrackUri','') =~ 'spdif'
      ? 'TV': ReadingsVal($name,'enqueuedMetadata_UpnpClass','FEHLER') ne 'object.item.audioItem.audioBroadcast'
      ? "$show<marquee style='width: $wpix'>Aktueller Track: $currentTrack<br>Nächster Track: $nextTrack</marquee>"
      : "$show<marquee style='width: $wpix'>Radio: $currentTrack</marquee>"
    }
    elsif (ReadingsVal($name,'name','') ne $groupname) {
      $show = "$show Master: $sgroupname"}
    }
    else {
      $show = $name eq $uuidtoname
      ? "$showlg <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>"
      : "$showlg <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a><br>Master: $sgroupname"
    }
  "<div>
   <table>
     <tr>
       <td><div style='display: inline-block; margin-right: 5px; border: 1px solid lightgray;
              height: 4.00em; width: 4.00em; background-image: url($img); background-size: contain;'></div></td>
       <td>$show</td>
     </tr>
   </table>
   </div>"
}
   icon       Sonos2mqtt_icon-S3
   jsonMap    volume_Master:volume mute_Master:mute transportState:state
   model      sonos2mqtt_speaker
   readingList sonos/RINCON_B8E9373184A001400:.* { json2nameValue($EVENT,'',$JSONMAP) }
sonos/RINCON_B8E9373184A001400/ZoneInfo:.* { json2nameValue($EVENT) }
   room       MQTT2_DEVICE
   setList    stop:noArg sonos/RINCON_B8E9373184A001400/control { "command": "stop" }
  play:noArg sonos/RINCON_B8E9373184A001400/control { "command": "play" }
  pause:noArg sonos/RINCON_B8E9373184A001400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_B8E9373184A001400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_B8E9373184A001400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_B8E9373184A001400/control { "command": "volumedown" }
  volume:slider,0,1,100 sonos/RINCON_B8E9373184A001400/control { "command": "volume", "input": $EVTPART1 }
  mute:true,false { my $value = $EVTPART1 eq "true" ? "mute" : "unmute"; qq(sonos/RINCON_B8E9373184A001400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_B8E9373184A001400/control { "command": "next" }
  previous:noArg sonos/RINCON_B8E9373184A001400/control { "command": "previous" }
  joinGroup:textField sonos/RINCON_B8E9373184A001400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_B8E9373184A001400","groupName","all"); qq(sonos/RINCON_B8E9373184A001400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_B8E9373184A001400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  playUri:textField {fhem("set $NAME setAVTUri $EVTPART1; sleep 1; set $NAME play")}
  input:Queue { my $value = $EVTPART1 eq "TV" ? "tv" : $EVTPART1 eq "Line_In" ? "line" : "queue"; qq(sonos/RINCON_B8E9373184A001400/control { "command": "switchto$value" } ) }
  notify:textField sonos/RINCON_B8E9373184A001400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_B8E9373184A001400/control $payload)}
  speak:textField { my $tts="SonosTTS";my ($cmd,$vol,$text)=split(' ', $EVENT,3);fhem("set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]")}


Play 1:
Internals:
   CFGFN     
   CID        RINCON_949F3E84C8BC01400
   DEF        RINCON_949F3E84C8BC01400
   DEVICETOPIC MQTT2_RINCON_949F3E84C8BC01400
   FUUID      5fa0512c-f33f-f3cd-b6f0-f806272116647fea
   IODev      MQTT
   LASTInputDev MQTT
   MQTT_MSGCNT 14
   MQTT_TIME  2020-11-02 18:52:39
   MSGCNT     14
   NAME       MQTT2_RINCON_949F3E84C8BC01400
   NR         65
   STATE      PLAYING
   TYPE       MQTT2_DEVICE
   JSONMAP:
     mute_Master mute
     transportState state
     volume_Master volume
   READINGS:
     2020-11-02 18:34:21   CopyrightInfo   © 2003-2019, Sonos, Inc. All rights reserved.
     2020-11-02 18:34:21   DisplaySoftwareVersion 11.2.3
     2020-11-02 18:34:21   ExtraInfo       
     2020-11-02 18:34:21   Flags           0
     2020-11-02 18:34:21   HTAudioIn       0
     2020-11-02 18:34:21   HardwareVersion 1.20.1.6-2.2
     2020-11-02 18:34:21   IPAddress       192.168.0.147
     2020-11-02 18:34:21   MACAddress      94:9F:3E:84:C8:BC
     2020-11-02 18:34:21   SerialNumber    94-9F-3E-84-C8-BC:4
     2020-11-02 18:34:21   SoftwareVersion 57.3-81090
     2020-11-02 18:34:21   associatedWith  SonosBridge
     2020-11-02 18:34:21   attrTemplateVersion 20200729
     2020-11-02 18:52:39   bass            4
     2020-11-02 18:52:39   coordinatorUuid RINCON_949F3E84C8BC01400
     2020-11-02 18:52:39   currentTrack_Album Folge 93: braucht Hilfe
     2020-11-02 18:52:39   currentTrack_AlbumArtUri http://192.168.0.147:1400/getaa?s=1&u=x-sonos-http:song:1144135689.mp4%3fsid%3d204%26flags%3d8224%26sn%3d10
     2020-11-02 18:52:39   currentTrack_Artist Bibi Blocksberg
     2020-11-02 18:52:39   currentTrack_Duration 0:01:33
     2020-11-02 18:52:39   currentTrack_ItemId -1
     2020-11-02 18:52:39   currentTrack_ParentId -1
     2020-11-02 18:52:39   currentTrack_ProtocolInfo sonos.com-http:*:audio/mp4:*
     2020-11-02 18:52:39   currentTrack_Title Kapitel 21 - Bibi braucht Hilfe (Folge 093)
     2020-11-02 18:52:39   currentTrack_TrackUri x-sonos-http:song:1144135689.mp4?sid=204&flags=8224&sn=10
     2020-11-02 18:52:39   currentTrack_UpnpClass object.item.audioItem.musicTrack
     2020-11-02 18:52:39   enqueuedMetadata_Album Folge 93: braucht Hilfe
     2020-11-02 18:52:39   enqueuedMetadata_AlbumArtUri https://is2-ssl.mzstatic.com/image/thumb/Music22/v4/17/d6/d8/17d6d841-ee21-e9f7-42cd-95a4db1eef19/source/400x400bb.jpeg
     2020-11-02 18:52:39   enqueuedMetadata_Artist Bibi Blocksberg
     2020-11-02 18:52:39   enqueuedMetadata_ItemId 1004206calbum%3a1144135664
     2020-11-02 18:52:39   enqueuedMetadata_ParentId 10052064artist%3a41480004
     2020-11-02 18:52:39   enqueuedMetadata_Title Folge 93: braucht Hilfe
     2020-11-02 18:52:39   enqueuedMetadata_UpnpClass object.container.album.musicAlbum.#AlbumView
     2020-11-02 18:52:39   groupName       Carlotta
     2020-11-02 18:34:21   modelNumber     S12
     2020-11-02 18:52:39   mute            false
     2020-11-02 18:52:39   mute_LF         false
     2020-11-02 18:34:21   mute_Master     false
     2020-11-02 18:52:39   mute_RF         false
     2020-11-02 18:52:39   name            Carlotta
     2020-11-02 18:52:39   nextTrack_Album Folge 93: braucht Hilfe
     2020-11-02 18:52:39   nextTrack_AlbumArtUri http://192.168.0.147:1400/getaa?s=1&u=x-sonos-http:song:1144135690.mp4%3fsid%3d204%26flags%3d8224%26sn%3d10
     2020-11-02 18:52:39   nextTrack_Artist Bibi Blocksberg
     2020-11-02 18:52:39   nextTrack_Duration 0:01:34
     2020-11-02 18:52:39   nextTrack_ItemId -1
     2020-11-02 18:52:39   nextTrack_ParentId -1
     2020-11-02 18:52:39   nextTrack_ProtocolInfo sonos.com-http:*:audio/mp4:*
     2020-11-02 18:52:39   nextTrack_Title Kapitel 22 - Bibi braucht Hilfe (Folge 093)
     2020-11-02 18:52:39   nextTrack_TrackUri x-sonos-http:song:1144135690.mp4?sid=204&flags=8224&sn=10
     2020-11-02 18:52:39   nextTrack_UpnpClass object.item.audioItem.musicTrack
     2020-11-02 18:52:39   playmode        REPEAT_ALL
     2020-11-02 18:52:39   state           PLAYING
     2020-11-02 18:34:21   transportState  PLAYING
     2020-11-02 18:52:39   treble          7
     2020-11-02 18:52:39   ts              1604343158790
     2020-11-02 18:52:39   uuid            RINCON_949F3E84C8BC01400
     2020-11-02 18:52:39   volume          39
     2020-11-02 18:52:39   volume_LF       100
     2020-11-02 18:34:21   volume_Master   39
     2020-11-02 18:52:39   volume_RF       100
Attributes:
   IODev      MQTT
   alias      Carlotta
   devStateIcon {
my $wpix = '250px';
my $groupname = ReadingsVal($name,'groupName','0');
my $sgroupname = (split(' ',ReadingsVal($name,'groupName','')))[0];
my $uuidtoname = (devspec2array('DEF='.ReadingsVal($name,'coordinatorUuid','0')))[0];
my $vol = ReadingsVal($name,'volume','');
my $img = ReadingsVal($name,'currentTrack_AlbumArtUri','');
my $mystate = $name eq $uuidtoname
  ? ReadingsVal($name,'state','FEHLER') : ReadingsVal($uuidtoname,'state','');
my $playpic = $mystate eq 'PLAYING'
  ? 'rc_PAUSE@red'    : $mystate eq 'PAUSED_PLAYBACK'
  ? 'rc_PLAY@green'   : $mystate eq 'STOPPED'
  ? 'rc_PLAY@green'   : $mystate eq 'TRANSITIONING'
  ? 'rc_PLAY@blue'    : $mystate eq 'set_next'
  ? 'rc_NEXT@blue'    : $mystate eq 'set_previous'
  ? 'rc_PREVIOUS@blue': $mystate eq 'set_volumeUp'
  ? 'rc_VOLUP@blue'   : $mystate eq 'set_volumeDown'
  ? 'rc_VOLDOWN@blue' : $mystate eq 'set_mute'
  ? 'rc_MUTE@blue'    : 'rc_PLAY@yellow';
my $mutecmd = ReadingsVal($name,'mute','0') eq 'false'?'true':'false';
my $mutepic = $mutecmd eq 'on'?'rc_MUTE':'rc_VOLUP';
my $show = 'FEHLER';
my $currentTrack_Artist = ReadingsVal($name,'currentTrack_Artist','FEHLER');
my $currentTrack_Title = ReadingsVal($name,'currentTrack_Title','FEHLER');
if ($currentTrack_Title =~ 'x-sonosapi-stream:'){$currentTrack_Title=''};
my $currentTrack = $mystate eq 'TRANSITIONING'
  ? 'Puffern...' : $currentTrack_Artist.' - '.$currentTrack_Title;
my $nextTrack_Artist = ReadingsVal($name,'nextTrack_Artist','FEHLER');
my $nextTrack_Title = ReadingsVal($name,'nextTrack_Title','FEHLER');
my $nextTrack = $nextTrack_Artist.' - '.$nextTrack_Title;
my $previouspic = 'rc_PREVIOUS';
my $nextpic = 'rc_NEXT';
my $voldownpic = 'rc_VOLDOWN';
my $voluppic = 'rc_VOLUP';
my $leavegrouppic = 'rc_LEFT';
my $showlg = ReadingsVal($name,"name","0") ne $groupname ? "<a href=\"/fhem?cmd.dummy=set $name leaveGroup&XHR=1\">".FW_makeImage($leavegrouppic)."</a>" : "";
if (($mystate eq 'PLAYING')
  || ($mystate eq 'TRANSITIONING' )
  || ($mystate eq 'set_next' )
  || ($mystate eq 'set_previous' )
  || ($mystate eq 'set_volumeUp' )
  || ($mystate eq 'set_volumeDown' )
  || ($mystate eq 'set_mute' )) {
    my $shownp = ReadingsVal($name,'name','') eq $sgroupname
    ? "<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>
       <a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>" : ""; 
    $show = "$showlg <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>
    <a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>
    $shownp
    <a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>";
 
    if (ReadingsVal($name,'name','') eq $sgroupname) {
      $show = ReadingsVal($name,'currentTrack_TrackUri','') =~ 'spdif'
      ? 'TV': ReadingsVal($name,'enqueuedMetadata_UpnpClass','FEHLER') ne 'object.item.audioItem.audioBroadcast'
      ? "$show<marquee style='width: $wpix'>Aktueller Track: $currentTrack<br>Nächster Track: $nextTrack</marquee>"
      : "$show<marquee style='width: $wpix'>Radio: $currentTrack</marquee>"
    }
    elsif (ReadingsVal($name,'name','') ne $groupname) {
      $show = "$show Master: $sgroupname"}
    }
    else {
      $show = $name eq $uuidtoname
      ? "$showlg <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>"
      : "$showlg <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a><br>Master: $sgroupname"
    }
  "<div>
   <table>
     <tr>
       <td><div style='display: inline-block; margin-right: 5px; border: 1px solid lightgray;
              height: 4.00em; width: 4.00em; background-image: url($img); background-size: contain;'></div></td>
       <td>$show</td>
     </tr>
   </table>
   </div>"
}
   icon       Sonos2mqtt_icon-S12
   jsonMap    volume_Master:volume mute_Master:mute transportState:state
   model      sonos2mqtt_speaker
   readingList sonos/RINCON_949F3E84C8BC01400:.* { json2nameValue($EVENT,'',$JSONMAP) }
sonos/RINCON_949F3E84C8BC01400/ZoneInfo:.* { json2nameValue($EVENT) }
   room       MQTT2_DEVICE
   setList    stop:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "stop" }
  play:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "play" }
  pause:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "volumedown" }
  volume:slider,0,1,100 sonos/RINCON_949F3E84C8BC01400/control { "command": "volume", "input": $EVTPART1 }
  mute:true,false { my $value = $EVTPART1 eq "true" ? "mute" : "unmute"; qq(sonos/RINCON_949F3E84C8BC01400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "next" }
  previous:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "previous" }
  joinGroup:textField sonos/RINCON_949F3E84C8BC01400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_949F3E84C8BC01400","groupName","all"); qq(sonos/RINCON_949F3E84C8BC01400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_949F3E84C8BC01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  playUri:textField {fhem("set $NAME setAVTUri $EVTPART1; sleep 1; set $NAME play")}
  input:Queue { my $value = $EVTPART1 eq "TV" ? "tv" : $EVTPART1 eq "Line_In" ? "line" : "queue"; qq(sonos/RINCON_949F3E84C8BC01400/control { "command": "switchto$value" } ) }
  notify:textField sonos/RINCON_949F3E84C8BC01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_949F3E84C8BC01400/control $payload)}
  speak:textField { my $tts="SonosTTS";my ($cmd,$vol,$text)=split(' ', $EVENT,3);fhem("set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]")}


Hab gerade gestehen, die Aliasse passen, aber die Icons noch nicht.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 November 2020, 20:07:46
mach mal set WEB rereadicons
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 02 November 2020, 20:18:21
Hab ich, keine Änderung.
Die Icons sind auch nicht runter geladen worden.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 November 2020, 20:28:32
Ja das sind sicher die Fehlermeldungen. Kannst DU mal schauen ob es die ICON Dateien gibt? Die URL dorthin steht da drin:
http://192.168.0.147:1400/xml/device_description.xml


Sind die Player alle von FHEM aus netzwerktechnisch erreichbar?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 02 November 2020, 20:49:11
Ja, alle Player sind von fhem aus erreichbar.

Das Icon ist auch da unter http://192.168.0.147:1400/img/icon-S12.png
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 November 2020, 21:30:44
Ok - dann klappt es nicht wenn sich zu viele Player gleichzeitig melden?
Kannst Du einen Player "nachpflegen"
set Player x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
Dann sollte das andere notify nochmal anspringen :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 02 November 2020, 21:37:30
Hab ich, hat aber nichts geändert  ???

Ist jetzt auch nicht so schlimm und wegen mir brauchst du da keine Zeit investieren.
Ich spiele mal noch ein bisschen, aber Icon und Co ist mir nicht wichtig.
Ich brache eigentlich nur speak und playSound

Natürlich teste ich gerne für dich weiter
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 02 November 2020, 22:01:42
Habe es jetzt nochmal mit verbose 5 gemacht:

2020.11.02 20:57:43 4: WEB_192.168.0.218_51206 POST /fhem&detail=MQTT2_RINCON_949F3E84C8BC01400&dev.setMQTT2_RINCON_949F3E84C8BC01400=MQTT2_RINCON_949F3E84C8BC01400&fwcsrf=csrf_558243214419674&cmd.setMQTT2_RINCON_949F3E84C8BC01400=set&arg.setMQTT2_RINCON_949F3E84C8BC01400=x_raw_payload&val.setMQTT2_RINCON_949F3E84C8BC01400=%7B%22command%22%3A+%22adv-command%22%2C%22input%22%3A+%7B%22cmd%22%3A%22GetZoneInfo%22%2C%22reply%22%3A%22ZoneInfo%22%7D%7D; BUFLEN:0
2020.11.02 20:57:43 5: Cmd: >set MQTT2_RINCON_949F3E84C8BC01400 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}<
2020.11.02 20:57:43 3: MQTT2_DEVICE set MQTT2_RINCON_949F3E84C8BC01400 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
2020.11.02 20:57:43 5: Cmd: >{ my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_949F3E84C8BC01400/control $payload)}<
2020.11.02 20:57:43 5: MQTT: PUBLISH sonos/RINCON_949F3E84C8BC01400/control {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
2020.11.02 20:57:43 5:   MQTT_192.168.0.208_35034 mqttjs_740d5d53 => sonos/RINCON_949F3E84C8BC01400/control:{"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
2020.11.02 20:57:43 5: Starting notify loop for MQTT2_RINCON_949F3E84C8BC01400, 1 event(s), first is x_raw_payload
2020.11.02 20:57:43 5: createNotifyHash
2020.11.02 20:57:43 5: End notify loop for MQTT2_RINCON_949F3E84C8BC01400
2020.11.02 20:57:43 5: GET /fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id= HTTP/1.1
Host: 192.168.0.230:8083
Origin: http://192.168.0.230:8083
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400
Accept-Encoding: gzip, deflate
Accept-Language: de-de
2020.11.02 20:57:43 4: WEB_192.168.0.218_51206 GET /fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=; BUFLEN:0
2020.11.02 20:57:43 4: WEB: /fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id= / RL:9149 / text/html; charset=UTF-8 / Content-Encoding: gzip
/ Cache-Control: no-cache, no-store, must-revalidate

2020.11.02 20:57:43 4:   MQTT_192.168.0.208_35034 mqttjs_740d5d53 PUBLISH sonos/RINCON_949F3E84C8BC01400/ZoneInfo:{"SerialNumber":"94-9F-3E-84-C8-BC:4","SoftwareVersion":"57.3-81090","DisplaySoftwareVersion":"11.2.3","HardwareVersion":"1.20.1.6-2.2","IPAddress":"192.168.0.147","MACAddress":"94:9F:3E:84:C8:BC","CopyrightInfo":"© 2003-2019, Sonos, Inc. All rights reserved.","ExtraInfo":"","HTAudioIn":0,"Flags":0}
2020.11.02 20:57:43 5: MQTT: dispatch autocreate=simple\000mqttjs_740d5d53\000sonos/RINCON_949F3E84C8BC01400/ZoneInfo\000{"SerialNumber":"94-9F-3E-84-C8-BC:4","SoftwareVersion":"57.3-81090","DisplaySoftwareVersion":"11.2.3","HardwareVersion":"1.20.1.6-2.2","IPAddress":"192.168.0.147","MACAddress":"94:9F:3E:84:C8:BC","CopyrightInfo":"© 2003-2019, Sonos, Inc. All rights reserved.","ExtraInfo":"","HTAudioIn":0,"Flags":0}
2020.11.02 20:57:43 4: MQTT2_DEVICE_Parse: MQTT2_RINCON_949F3E84C8BC01400 sonos/RINCON_949F3E84C8BC01400/ZoneInfo => { json2nameValue($EVENT) }
2020.11.02 20:57:43 5: Starting notify loop for MQTT2_RINCON_949F3E84C8BC01400, 10 event(s), first is Flags: 0
2020.11.02 20:57:43 5: Triggering n_configSonos2
2020.11.02 20:57:43 4: n_configSonos2 exec {
  my @tv = ("S14","S11","S9");;
  my @line = ("S5","Z90","ZP120");;
  my $url="http://$EVTPART1:1400";;
  my $xmltext = GetFileFromURL("$url/xml/device_description.xml");;
  my ($mn)=$xmltext =~ /(S[0-9]+)/;;
  my ($img)=$xmltext =~ /(.*)<\/url>/;;
  my $icon="Sonos2mqtt_icon-$mn";;
  my $setList=AttrVal($NAME,'setList','');;
  fhem("setreading $NAME modelNumber $mn");;
  fhem("\"wget -qO ./www/images/default/$icon.png $url$img\"");;
  fhem("attr $NAME icon $icon;;sleep 4 WI;;set WEB rereadicons");;
  if (grep(/$mn/, @tv)) {$setList=~s/input:Queue \{/input:Queue,TV \{/};;
  if (grep(/$mn/, @line)) {$setList=~s/input:Queue \{/input:Queue,Line_In \{/};;
  $setList=~s/;;/;;;;/g;;
  fhem("attr $NAME setList $setList")
}
2020.11.02 20:57:43 5: Cmd: >{
  my @tv = ("S14","S11","S9");
  my @line = ("S5","Z90","ZP120");
  my $url="http://$EVTPART1:1400";
  my $xmltext = GetFileFromURL("$url/xml/device_description.xml");
  my ($mn)=$xmltext =~ /(S[0-9]+)/;
  my ($img)=$xmltext =~ /(.*)<\/url>/;
  my $icon="Sonos2mqtt_icon-$mn";
  my $setList=AttrVal($NAME,'setList','');
  fhem("setreading $NAME modelNumber $mn");
  fhem("\"wget -qO ./www/images/default/$icon.png $url$img\"");
  fhem("attr $NAME icon $icon;sleep 4 WI;set WEB rereadicons");
  if (grep(/$mn/, @tv)) {$setList=~s/input:Queue \{/input:Queue,TV \{/};
  if (grep(/$mn/, @line)) {$setList=~s/input:Queue \{/input:Queue,Line_In \{/};
  $setList=~s/;/;;/g;
  fhem("attr $NAME setList $setList")
}<
2020.11.02 20:57:43 5: HttpUtils url=http://192.168.0.147:1400/xml/device_description.xml
2020.11.02 20:57:43 5: HttpUtils request header:
GET /xml/device_description.xml HTTP/1.0
Host: 192.168.0.147:1400
User-Agent: fhem
Accept-Encoding: gzip,deflate

2020.11.02 20:57:43 4: http://192.168.0.147:1400/xml/device_description.xml: HTTP response code 200
2020.11.02 20:57:43 5: HttpUtils http://192.168.0.147:1400/xml/device_description.xml: Got data, length: 9274
2020.11.02 20:57:43 5: HttpUtils response header:
HTTP/1.1 200 OK
Content-Type: text/xml
Transfer-Encoding: chunked
Server: Linux UPnP/1.0 Sonos/57.3-81090 (ZPS12)
Connection: close
2020.11.02 20:57:43 5: Cmd: >setreading MQTT2_RINCON_949F3E84C8BC01400 modelNumber S12<
2020.11.02 20:57:43 5: Cmd: >"wget -qO ./www/images/default/Sonos2mqtt_icon-S12.png http://192.168.0.147:1400        <url>/img/icon-S12.png"<
2020.11.02 20:57:43 5: Cmd: >attr MQTT2_RINCON_949F3E84C8BC01400 icon Sonos2mqtt_icon-S12<
2020.11.02 20:57:43 5: Starting notify loop for global, 1 event(s), first is ATTR MQTT2_RINCON_949F3E84C8BC01400 icon Sonos2mqtt_icon-S12
sh: 1: cannot open url: No such file
2020.11.02 20:57:43 5: End notify loop for global
2020.11.02 20:57:43 5: Cmd: >sleep 4 WI<
2020.11.02 20:57:43 5: Cmd: >attr MQTT2_RINCON_949F3E84C8BC01400 setList stop:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "stop" }
  play:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "play" }
  pause:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "volumedown" }
  volume:slider,0,1,100 sonos/RINCON_949F3E84C8BC01400/control { "command": "volume", "input": $EVTPART1 }
  mute:true,false { my $value = $EVTPART1 eq "true" ? "mute" : "unmute"; qq(sonos/RINCON_949F3E84C8BC01400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "next" }
  previous:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "previous" }
  joinGroup:textField sonos/RINCON_949F3E84C8BC01400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_949F3E84C8BC01400","groupName","all"); qq(sonos/RINCON_949F3E84C8BC01400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_949F3E84C8BC01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  playUri:textField {fhem("set $NAME setAVTUri $EVTPART1; sleep 1; set $NAME play")}
  input:Queue { my $value = $EVTPART1 eq "TV" ? "tv" : $EVTPART1 eq "Line_In" ? "line" : "queue"; qq(sonos/RINCON_949F3E84C8BC01400/control { "command": "switchto$value" } ) }
  notify:textField sonos/RINCON_949F3E84C8BC01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_949F3E84C8BC01400/control $payload)}
  speak:textField { my $tts="SonosTTS";my ($cmd,$vol,$text)=split(' ', $EVENT,3);fhem("set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]")}<
2020.11.02 20:57:43 5: Starting notify loop for global, 1 event(s), first is ATTR MQTT2_RINCON_949F3E84C8BC01400 setList stop:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "stop" }\n  play:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "play" }\n  pause:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "pause" }\n  toggle:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "toggle" }\n  volumeUp:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "volumeup" }\n  volumeDown:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "volumedown" }\n  volume:slider,0,1,100 sonos/RINCON_949F3E84C8BC01400/control { "command": "volume", "input": $EVTPART1 }\n  mute:true,false { my $value = $EVTPART1 eq "true" ? "mute" : "unmute"; qq(sonos/RINCON_949F3E84C8BC01400/control { "command": "$value" } ) }\n  next:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "next" }\n  previous:noArg sonos/RINCON_949F3E84C8BC01400/control { "command": "previous" }\n  joinGroup:textField sonos/RINCON_949F3E84C8BC01400/control { "command": "joingroup",  "input": "$EVTPART1"}\n  leaveGroup:noArg { my $value = ReadingsVal("RINCON_949F3E84C8BC01400","groupName","all"); qq(sonos/RINCON_949F3E84C8BC01400/control { "command": "leavegroup",  "input": "$value" } ) }\n  setAVTUri:textField sonos/RINCON_949F3E84C8BC01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\n  playUri:textField {fhem("set $NAME setAVTUri $EVTPART1; sleep 1; set $NAME play")}\n  input:Queue { my $value = $EVTPART1 eq "TV" ? "tv" : $EVTPART1 eq "Line_In" ? "line" : "queue"; qq(sonos/RINCON_949F3E84C8BC01400/control { "command": "switchto$value" } ) }\n  notify:textField sonos/RINCON_949F3E84C8BC01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}\n  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_949F3E84C8BC01400/control $payload)}\n  speak:textField { my $tts="SonosTTS";my ($cmd,$vol,$text)=split(' ', $EVENT,3);fhem("set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]")}
2020.11.02 20:57:43 5: End notify loop for global
2020.11.02 20:57:43 5: End notify loop for MQTT2_RINCON_949F3E84C8BC01400
2020.11.02 20:57:44 5: GET /fhem/pgm2/style.css?v=1604342017 HTTP/1.1
Host: 192.168.0.230:8083
Connection: keep-alive
If-None-Match: "1580044447"
Accept: text/css,*/*;q=0.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Accept-Language: de-de
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Encoding: gzip, deflate
2020.11.02 20:57:44 4: WEB_192.168.0.218_51206 GET /fhem/pgm2/style.css?v=1604342017; BUFLEN:0
2020.11.02 20:57:44 4: WEB_192.168.0.218_51206 => 304 Not Modified
2020.11.02 20:57:44 5: GET /fhem/pgm2/jquery-ui.min.css HTTP/1.1
Host: 192.168.0.230:8083
Connection: keep-alive
If-None-Match: "1580044447"
Accept: text/css,*/*;q=0.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Accept-Language: de-de
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Encoding: gzip, deflate
2020.11.02 20:57:44 4: WEB_192.168.0.218_51207 GET /fhem/pgm2/jquery-ui.min.css; BUFLEN:0
2020.11.02 20:57:44 4: WEB_192.168.0.218_51207 => 304 Not Modified
2020.11.02 20:57:44 4: Connection accepted from WEB_192.168.0.218_51391
2020.11.02 20:57:44 5: GET /fhem/pgm2/jquery.min.js HTTP/1.1
Host: 192.168.0.230:8083
Connection: keep-alive
If-None-Match: "1580044447"
Accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Accept-Language: de-de
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Encoding: gzip, deflate
2020.11.02 20:57:44 4: WEB_192.168.0.218_51391 GET /fhem/pgm2/jquery.min.js; BUFLEN:0
2020.11.02 20:57:44 4: WEB_192.168.0.218_51391 => 304 Not Modified
2020.11.02 20:57:44 5: GET /fhem/pgm2/jquery-ui.min.js HTTP/1.1
Host: 192.168.0.230:8083
Connection: keep-alive
If-None-Match: "1580044447"
Accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Accept-Language: de-de
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Encoding: gzip, deflate
2020.11.02 20:57:44 4: WEB_192.168.0.218_51206 GET /fhem/pgm2/jquery-ui.min.js; BUFLEN:0
2020.11.02 20:57:44 4: WEB_192.168.0.218_51206 => 304 Not Modified
2020.11.02 20:57:44 4: Connection accepted from WEB_192.168.0.218_51392
2020.11.02 20:57:44 4: Connection accepted from WEB_192.168.0.218_51393
2020.11.02 20:57:44 5: GET /fhem/pgm2/ios7Common.css HTTP/1.1
Host: 192.168.0.230:8083
Connection: keep-alive
If-None-Match: "1580044447"
Accept: text/css,*/*;q=0.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Accept-Language: de-de
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Encoding: gzip, deflate
2020.11.02 20:57:44 4: WEB_192.168.0.218_51207 GET /fhem/pgm2/ios7Common.css; BUFLEN:0
2020.11.02 20:57:44 4: WEB_192.168.0.218_51207 => 304 Not Modified
2020.11.02 20:57:44 5: GET /fhem/pgm2/fhemweb.js HTTP/1.1
Host: 192.168.0.230:8083
Connection: keep-alive
If-None-Match: "1604341667"
Accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Accept-Language: de-de
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Encoding: gzip, deflate
2020.11.02 20:57:44 4: WEB_192.168.0.218_51393 GET /fhem/pgm2/fhemweb.js; BUFLEN:0
2020.11.02 20:57:44 4: WEB_192.168.0.218_51393 => 304 Not Modified
2020.11.02 20:57:44 5: GET /fhem/images/default/icoEverything.png HTTP/1.1
Host: 192.168.0.230:8083
Connection: keep-alive
If-None-Match: "1580044447"
Accept: image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Accept-Language: de-de
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Encoding: gzip, deflate
2020.11.02 20:57:44 4: WEB_192.168.0.218_51392 GET /fhem/images/default/icoEverything.png; BUFLEN:0
2020.11.02 20:57:44 4: WEB_192.168.0.218_51392 => 304 Not Modified
2020.11.02 20:57:44 5: GET /fhem/pgm2/dashboard_ios7.css HTTP/1.1
Host: 192.168.0.230:8083
Connection: keep-alive
If-None-Match: "1580044447"
Accept: text/css,*/*;q=0.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Accept-Language: de-de
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Encoding: gzip, deflate
2020.11.02 20:57:44 4: WEB_192.168.0.218_51206 GET /fhem/pgm2/dashboard_ios7.css; BUFLEN:0
2020.11.02 20:57:44 4: WEB_192.168.0.218_51206 => 304 Not Modified
2020.11.02 20:57:44 5: GET /fhem?cmd=%7BReadingsVal(%22MQTT2_RINCON_949F3E84C8BC01400%22%2C%22volume%22%2C%22%22)%7D&XHR=1&fwcsrf=csrf_558243214419674 HTTP/1.1
Host: 192.168.0.230:8083
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Accept-Language: de-de
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Encoding: gzip, deflate
2020.11.02 20:57:44 4: WEB_192.168.0.218_51206 GET /fhem?cmd=%7BReadingsVal(%22MQTT2_RINCON_949F3E84C8BC01400%22%2C%22volume%22%2C%22%22)%7D&XHR=1&fwcsrf=csrf_558243214419674; BUFLEN:0
2020.11.02 20:57:44 5: Cmd: >{ReadingsVal("MQTT2_RINCON_949F3E84C8BC01400","volume","")}<
2020.11.02 20:57:44 4: WEB: /fhem?cmd=%7BReadingsVal(%22MQTT2_RINCON_949F3E84C8BC01400%22%2C%22volume%22%2C%22%22)%7D&XHR=1&fwcsrf=csrf_558243214419674 / RL:23 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/ Cache-Control: no-cache, no-store, must-revalidate

2020.11.02 20:57:44 5: GET /fhem?cmd=%7BAttrVal(%22MQTT2_RINCON_949F3E84C8BC01400%22%2C%22room%22%2C%22%22)%7D&XHR=1&fwcsrf=csrf_558243214419674 HTTP/1.1
Host: 192.168.0.230:8083
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Accept-Language: de-de
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Encoding: gzip, deflate
2020.11.02 20:57:44 4: WEB_192.168.0.218_51207 GET /fhem?cmd=%7BAttrVal(%22MQTT2_RINCON_949F3E84C8BC01400%22%2C%22room%22%2C%22%22)%7D&XHR=1&fwcsrf=csrf_558243214419674; BUFLEN:0
2020.11.02 20:57:44 5: Cmd: >{AttrVal("MQTT2_RINCON_949F3E84C8BC01400","room","")}<
2020.11.02 20:57:44 4: WEB: /fhem?cmd=%7BAttrVal(%22MQTT2_RINCON_949F3E84C8BC01400%22%2C%22room%22%2C%22%22)%7D&XHR=1&fwcsrf=csrf_558243214419674 / RL:33 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/ Cache-Control: no-cache, no-store, must-revalidate

2020.11.02 20:57:44 5: GET /fhem?XHR=1&inform=type=status;filter=MQTT2_RINCON_949F3E84C8BC01400;since=1604350662;fmt=JSON&fw_id=568×tamp=1604350664178 HTTP/1.1
Host: 192.168.0.230:8083
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Accept-Language: de-de
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Encoding: gzip, deflate
2020.11.02 20:57:44 4: WEB_192.168.0.218_51206 GET /fhem?XHR=1&inform=type=status;filter=MQTT2_RINCON_949F3E84C8BC01400;since=1604350662;fmt=JSON&fw_id=568×tamp=1604350664178; BUFLEN:0
2020.11.02 20:57:47 5: Cmd: >set WEB rereadicons<
2020.11.02 20:57:47 5: Starting notify loop for WEB, 1 event(s), first is rereadicons
2020.11.02 20:57:47 5: createNotifyHash
2020.11.02 20:57:47 5: End notify loop for WEB
2020.11.02 20:57:50 5: POST /fhem?cmd=save%20?&XHR=1&fwcsrf=csrf_558243214419674&fw_id=568 HTTP/1.1
Host: 192.168.0.230:8083
Origin: http://192.168.0.230:8083
Accept-Encoding: gzip, deflate
Content-Length: 0
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Language: de-de
X-Requested-With: XMLHttpRequest
2020.11.02 20:57:50 4: WEB_192.168.0.218_51207 POST /fhem?cmd=save%20?&XHR=1&fwcsrf=csrf_558243214419674&fw_id=568; BUFLEN:0
2020.11.02 20:57:50 5: Cmd: >save ?<
2020.11.02 20:57:50 4: WEB: /fhem?cmd=save%20?&XHR=1&fwcsrf=csrf_558243214419674&fw_id=568 / RL:76 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/ Cache-Control: no-cache, no-store, must-revalidate

2020.11.02 20:57:50 5: GET /fhem/pgm2/images/ui-icons_222222_256x240.png HTTP/1.1
Host: 192.168.0.230:8083
Connection: keep-alive
If-None-Match: "1580044447"
Accept: image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Accept-Language: de-de
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Encoding: gzip, deflate
2020.11.02 20:57:50 4: WEB_192.168.0.218_51207 GET /fhem/pgm2/images/ui-icons_222222_256x240.png; BUFLEN:0
2020.11.02 20:57:50 4: WEB_192.168.0.218_51207 => 304 Not Modified
2020.11.02 20:57:50 5: GET /fhem/pgm2/images/ui-bg_glass_100_f6f6f6_1x400.png HTTP/1.1
Host: 192.168.0.230:8083
Connection: keep-alive
If-None-Match: "1580044447"
Accept: image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Accept-Language: de-de
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Encoding: gzip, deflate
2020.11.02 20:57:50 4: WEB_192.168.0.218_51391 GET /fhem/pgm2/images/ui-bg_glass_100_f6f6f6_1x400.png; BUFLEN:0
2020.11.02 20:57:50 4: WEB_192.168.0.218_51391 => 304 Not Modified
2020.11.02 20:57:50 5: GET /fhem/pgm2/images/ui-bg_diagonals-thick_20_666666_40x40.png HTTP/1.1
Host: 192.168.0.230:8083
Connection: keep-alive
If-None-Match: "1580044447"
Accept: image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Accept-Language: de-de
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Encoding: gzip, deflate
2020.11.02 20:57:50 4: WEB_192.168.0.218_51207 GET /fhem/pgm2/images/ui-bg_diagonals-thick_20_666666_40x40.png; BUFLEN:0
2020.11.02 20:57:50 4: WEB_192.168.0.218_51207 => 304 Not Modified
2020.11.02 20:57:50 5: GET /fhem/pgm2/images/ui-bg_glass_100_fdf5ce_1x400.png HTTP/1.1
Host: 192.168.0.230:8083
Connection: keep-alive
If-None-Match: "1580044447"
Accept: image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Accept-Language: de-de
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Encoding: gzip, deflate
2020.11.02 20:57:50 4: WEB_192.168.0.218_51207 GET /fhem/pgm2/images/ui-bg_glass_100_fdf5ce_1x400.png; BUFLEN:0
2020.11.02 20:57:50 4: WEB_192.168.0.218_51207 => 304 Not Modified
2020.11.02 20:57:51 5: GET /fhem/pgm2/images/ui-bg_glass_65_ffffff_1x400.png HTTP/1.1
Host: 192.168.0.230:8083
Connection: keep-alive
If-None-Match: "1580044447"
Accept: image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Accept-Language: de-de
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Encoding: gzip, deflate
2020.11.02 20:57:51 4: WEB_192.168.0.218_51207 GET /fhem/pgm2/images/ui-bg_glass_65_ffffff_1x400.png; BUFLEN:0
2020.11.02 20:57:51 4: WEB_192.168.0.218_51207 => 304 Not Modified
2020.11.02 20:57:52 5: POST /fhem?cmd=save&XHR=1&fwcsrf=csrf_558243214419674&fw_id=568 HTTP/1.1
Host: 192.168.0.230:8083
Origin: http://192.168.0.230:8083
Accept-Encoding: gzip, deflate
Content-Length: 0
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Language: de-de
X-Requested-With: XMLHttpRequest
2020.11.02 20:57:52 4: WEB_192.168.0.218_51207 POST /fhem?cmd=save&XHR=1&fwcsrf=csrf_558243214419674&fw_id=568; BUFLEN:0
2020.11.02 20:57:52 5: Cmd: >save<
2020.11.02 20:57:52 5: Starting notify loop for global, 1 event(s), first is SAVE
2020.11.02 20:57:52 5: End notify loop for global
2020.11.02 20:57:52 4: WEB: /fhem?cmd=save&XHR=1&fwcsrf=csrf_558243214419674&fw_id=568 / RL:52 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/ Cache-Control: no-cache, no-store, must-revalidate

2020.11.02 20:57:55 4: Connection closed for WEB_192.168.0.218_51206: EOF
2020.11.02 20:57:55 5: GET /fhem/FileLog_logWrapper?dev=Logfile&type=text&file=fhem-2020-11.log HTTP/1.1
Host: 192.168.0.230:8083
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Referer: http://192.168.0.230:8083/fhem?detail=MQTT2_RINCON_949F3E84C8BC01400&fw_id=
Accept-Language: de-de
Accept-Encoding: gzip, deflate
2020.11.02 20:57:55 4: WEB_192.168.0.218_51207 GET /fhem/FileLog_logWrapper?dev=Logfile&type=text&file=fhem-2020-11.log; BUFLEN:0


Dann nochmal mit 3, weil es doch unübersichtlich wurde:
2020.11.02 21:02:56 3: MQTT2_DEVICE set MQTT2_RINCON_B8E9375200CE01400 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
sh: 1: cannot open url: No such file


irgendwie kann eine/die? url nicht geöffnet werden
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 02 November 2020, 22:38:33
habe jetzt mal deinen notify umgebaut, um alle Variablen in readings zu haben.
Es scheint ein Fehler beim holen des png Namen zu sein.
In der Variablen $img steht: <url>/img/icon-S18.png

Dadruch ergibt sich der Pfad: http://192.168.0.183:1400 <url>/img/icon-S18.png
Das kann nicht gehen.

Leider bin ich bei RegEx und Escapen der volle Depp, weswegen ich es nicht korrigieren kann  :-[
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 November 2020, 22:40:07
Ja sowas habe ich mir gedacht, poste mal bitte das XML File, da ist wahrscheinlich etwas anders bei manchen Playern.

Ich schau es mir morgen an :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 02 November 2020, 22:42:00
Bitte schön:

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<root xmlns="urn:schemas-upnp-org:device-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<device>
<deviceType>urn:schemas-upnp-org:device:ZonePlayer:1</deviceType>
<friendlyName>192.168.0.183 - Sonos One</friendlyName>
<manufacturer>Sonos, Inc.</manufacturer>
<manufacturerURL>http://www.sonos.com</manufacturerURL>
<modelNumber>S18</modelNumber>
<modelDescription>Sonos One</modelDescription>
<modelName>Sonos One</modelName>
<modelURL>http://www.sonos.com/products/zoneplayers/S18</modelURL>
<softwareVersion>57.3-81090</softwareVersion>
<swGen>1</swGen>
<hardwareVersion>1.26.1.6-2.2</hardwareVersion>
<serialNum>78-28-CA-F1-1E-76:D</serialNum>
<MACAddress>78:28:CA:F1:1E:76</MACAddress>
<UDN>uuid:RINCON_7828CAF11E7601400</UDN>
<iconList>
<icon>
<id>0</id>
<mimetype>image/png</mimetype>
<width>48</width>
<height>48</height>
<depth>24</depth>
<url>/img/icon-S18.png</url>
</icon>
</iconList>
<minCompatibleVersion>56.0-00000</minCompatibleVersion>
<legacyCompatibleVersion>36.0-00000</legacyCompatibleVersion>
<apiVersion>1.18.9</apiVersion>
<minApiVersion>1.1.0</minApiVersion>
<displayVersion>11.2.3</displayVersion>
<extraVersion/>
<roomName>Küche</roomName>
<displayName>One</displayName>
<zoneType>20</zoneType>
<feature1>0x00000000</feature1>
<feature2>0x01c18332</feature2>
<feature3>0x0001100e</feature3>
<seriesid>A200</seriesid>
<variant>2</variant>
<internalSpeakerSize>5</internalSpeakerSize>
<bassExtension>75.000</bassExtension>
<satGainOffset>6.000</satGainOffset>
<memory>1024</memory>
<flash>1024</flash>
#DEACTIVATION_STATE_TAG_AND_VALUE# #DEACTIVATION_TTL_TAG_AND_VALUE# #DEACTIVATION_DATE_TIME_TAG_AND_VALUE#
<ampOnTime>20</ampOnTime>
<retailMode>0</retailMode>
<serviceList>
<service>
<serviceType>urn:schemas-upnp-org:service:AlarmClock:1</serviceType>
<serviceId>urn:upnp-org:serviceId:AlarmClock</serviceId>
<controlURL>/AlarmClock/Control</controlURL>
<eventSubURL>/AlarmClock/Event</eventSubURL>
<SCPDURL>/xml/AlarmClock1.xml</SCPDURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:MusicServices:1</serviceType>
<serviceId>urn:upnp-org:serviceId:MusicServices</serviceId>
<controlURL>/MusicServices/Control</controlURL>
<eventSubURL>/MusicServices/Event</eventSubURL>
<SCPDURL>/xml/MusicServices1.xml</SCPDURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:DeviceProperties:1</serviceType>
<serviceId>urn:upnp-org:serviceId:DeviceProperties</serviceId>
<controlURL>/DeviceProperties/Control</controlURL>
<eventSubURL>/DeviceProperties/Event</eventSubURL>
<SCPDURL>/xml/DeviceProperties1.xml</SCPDURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:SystemProperties:1</serviceType>
<serviceId>urn:upnp-org:serviceId:SystemProperties</serviceId>
<controlURL>/SystemProperties/Control</controlURL>
<eventSubURL>/SystemProperties/Event</eventSubURL>
<SCPDURL>/xml/SystemProperties1.xml</SCPDURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:ZoneGroupTopology:1</serviceType>
<serviceId>urn:upnp-org:serviceId:ZoneGroupTopology</serviceId>
<controlURL>/ZoneGroupTopology/Control</controlURL>
<eventSubURL>/ZoneGroupTopology/Event</eventSubURL>
<SCPDURL>/xml/ZoneGroupTopology1.xml</SCPDURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:GroupManagement:1</serviceType>
<serviceId>urn:upnp-org:serviceId:GroupManagement</serviceId>
<controlURL>/GroupManagement/Control</controlURL>
<eventSubURL>/GroupManagement/Event</eventSubURL>
<SCPDURL>/xml/GroupManagement1.xml</SCPDURL>
</service>
<service>
<serviceType>urn:schemas-tencent-com:service:QPlay:1</serviceType>
<serviceId>urn:tencent-com:serviceId:QPlay</serviceId>
<controlURL>/QPlay/Control</controlURL>
<eventSubURL>/QPlay/Event</eventSubURL>
<SCPDURL>/xml/QPlay1.xml</SCPDURL>
</service>
</serviceList>
<deviceList>
<device>
<deviceType>urn:schemas-upnp-org:device:MediaServer:1</deviceType>
<friendlyName>192.168.0.183 - Sonos One Media Server</friendlyName>
<manufacturer>Sonos, Inc.</manufacturer>
<manufacturerURL>http://www.sonos.com</manufacturerURL>
<modelNumber>S18</modelNumber>
<modelDescription>Sonos One Media Server</modelDescription>
<modelName>Sonos One</modelName>
<modelURL>http://www.sonos.com/products/zoneplayers/S18</modelURL>
<UDN>uuid:RINCON_7828CAF11E7601400_MS</UDN>
<serviceList>
<service>
<serviceType>urn:schemas-upnp-org:service:ContentDirectory:1</serviceType>
<serviceId>urn:upnp-org:serviceId:ContentDirectory</serviceId>
<controlURL>/MediaServer/ContentDirectory/Control</controlURL>
<eventSubURL>/MediaServer/ContentDirectory/Event</eventSubURL>
<SCPDURL>/xml/ContentDirectory1.xml</SCPDURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
<serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId>
<controlURL>/MediaServer/ConnectionManager/Control</controlURL>
<eventSubURL>/MediaServer/ConnectionManager/Event</eventSubURL>
<SCPDURL>/xml/ConnectionManager1.xml</SCPDURL>
</service>
</serviceList>
</device>
<device>
<deviceType>urn:schemas-upnp-org:device:MediaRenderer:1</deviceType>
<friendlyName>Küche - Sonos One Media Renderer</friendlyName>
<manufacturer>Sonos, Inc.</manufacturer>
<manufacturerURL>http://www.sonos.com</manufacturerURL>
<modelNumber>S18</modelNumber>
<modelDescription>Sonos One Media Renderer</modelDescription>
<modelName>Sonos One</modelName>
<modelURL>http://www.sonos.com/products/zoneplayers/S18</modelURL>
<UDN>uuid:RINCON_7828CAF11E7601400_MR</UDN>
<serviceList>
<service>
<serviceType>urn:schemas-upnp-org:service:RenderingControl:1</serviceType>
<serviceId>urn:upnp-org:serviceId:RenderingControl</serviceId>
<controlURL>/MediaRenderer/RenderingControl/Control</controlURL>
<eventSubURL>/MediaRenderer/RenderingControl/Event</eventSubURL>
<SCPDURL>/xml/RenderingControl1.xml</SCPDURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
<serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId>
<controlURL>/MediaRenderer/ConnectionManager/Control</controlURL>
<eventSubURL>/MediaRenderer/ConnectionManager/Event</eventSubURL>
<SCPDURL>/xml/ConnectionManager1.xml</SCPDURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:AVTransport:1</serviceType>
<serviceId>urn:upnp-org:serviceId:AVTransport</serviceId>
<controlURL>/MediaRenderer/AVTransport/Control</controlURL>
<eventSubURL>/MediaRenderer/AVTransport/Event</eventSubURL>
<SCPDURL>/xml/AVTransport1.xml</SCPDURL>
</service>
<service>
<serviceType>urn:schemas-sonos-com:service:Queue:1</serviceType>
<serviceId>urn:sonos-com:serviceId:Queue</serviceId>
<controlURL>/MediaRenderer/Queue/Control</controlURL>
<eventSubURL>/MediaRenderer/Queue/Event</eventSubURL>
<SCPDURL>/xml/Queue1.xml</SCPDURL>
</service>
<service>
<serviceType>
urn:schemas-upnp-org:service:GroupRenderingControl:1
</serviceType>
<serviceId>urn:upnp-org:serviceId:GroupRenderingControl</serviceId>
<controlURL>/MediaRenderer/GroupRenderingControl/Control</controlURL>
<eventSubURL>/MediaRenderer/GroupRenderingControl/Event</eventSubURL>
<SCPDURL>/xml/GroupRenderingControl1.xml</SCPDURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:VirtualLineIn:1</serviceType>
<serviceId>urn:upnp-org:serviceId:VirtualLineIn</serviceId>
<controlURL>/MediaRenderer/VirtualLineIn/Control</controlURL>
<eventSubURL>/MediaRenderer/VirtualLineIn/Event</eventSubURL>
<SCPDURL>/xml/VirtualLineIn1.xml</SCPDURL>
</service>
</serviceList>
<X_Rhapsody-Extension xmlns="http://www.real.com/rhapsody/xmlns/upnp-1-0">
<deviceID>
urn:rhapsody-real-com:device-id-1-0:sonos_1:RINCON_7828CAF11E7601400
</deviceID>
<deviceCapabilities>
<interactionPattern type="real-rhapsody-upnp-1-0"/>
</deviceCapabilities>
</X_Rhapsody-Extension>
<qq:X_QPlay_SoftwareCapability xmlns:qq="http://www.tencent.com">QPlay:2</qq:X_QPlay_SoftwareCapability>
<iconList>
<icon>
<mimetype>image/png</mimetype>
<width>48</width>
<height>48</height>
<depth>24</depth>
<url>/img/icon-S18.png</url>
</icon>
</iconList>
</device>
</deviceList>
</device>
</root>


Benutz du S2 oder bist du noch auf S1?
Ich habe noch S1, weil mein AMP nicht update-fähig ist.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 02 November 2020, 22:58:18
Habe den notify jetzt so umgebaut, dass es geht.
Allerdings nur mit S-Playern.

Mein Amp ist ein ZP120, aber der notify filtert nur nach S.
Leider weis ich nicht, wie ich das machen kann  :-[

defmod n_configSonos2 notify MQTT2_RINCON_[A-Z0-9]+:IPAddress:.* {\
  my @tv = ("S14","S11","S9");;\
  my @line = ("S5","Z90","ZP120");;\
  my $url="http://$EVTPART1:1400";;\
  my $xmltext = GetFileFromURL("$url/xml/device_description.xml");;\
  my ($mn)=$xmltext =~ /(S[0-9]+)/;;\
  my $icon="Sonos2mqtt_icon-$mn.png";;\
  my $setList=AttrVal($NAME,'setList','');;\
  fhem("setreading $NAME modelNumber $mn");;\
  fhem("\"wget -qO ./www/images/default/$icon $url/img/icon-$mn.png\"");;\
  fhem("attr $NAME icon $icon;;sleep 4 WI;;set WEB rereadicons");;\
  if (grep(/$mn/, @tv)) {$setList=~s/input:Queue \{/input:Queue,TV \{/};;\
  if (grep(/$mn/, @line)) {$setList=~s/input:Queue \{/input:Queue,Line_In \{/};;\
  $setList=~s/;;/;;;;/g;;\
  fhem("attr $NAME setList $setList")\
}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 November 2020, 23:05:11
Ich bin noch auf S1 weil ich meinen Play5 nicht alleine stellen will.
Und für meinen alten connect (den ich wirklich seit Jahren nicht mehr brauchte) konnte ich ein Paket bestellen - was alles hatte was ich noch so wollte :)
Mal sehen wie lange das geht.

Auf den ersten Blick sehen die XML Daten aus wie meine, da hab ich wohl einen Bug in meinem regExp...

Ich war zu langsam :)
Aha ok. Schau ich mir an
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 November 2020, 23:08:50
sowas ginge:
[SZP]+[0-9]+

So wäre es genauer
[SZ]P?[0-9]+

So noch etwas exkater
[SZ]P?[0-9]{1,3}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 November 2020, 23:31:35
Warum ist in deinem notify diese Zeile anders?
Deine:
my ($img)=$xmltext =~ /(.*)<\/url>/;;
Original
my ($img)=$xmltext =~ /<url>(.*)<\/url>/;;

Mist da ist ein Fehler im Template! Ich bin Schuld, ein Fehler in meinem Post gestern.  :'( :'(
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 November 2020, 23:43:33
Es ist verrückt, es gibt einen Unterschied in den Ansichten im FHEMWEB - aber dazu später.
Das Template sonos2mqtt_bridge_comfort
set DEVICE attrTemplate sonos2mqtt_bridge
attr DEVICE setList PauseAll:noArg sonos/cmd/pauseall\
CheckSubscription:noArg sonos/cmd/check-subscriptions
defmod n_configSonos1 notify global:DEFINED.MQTT2_RINCON_[A-Z0-9]+ sleep 1;\
  set $EVTPART1 attrTemplate sonos2mqtt_speaker;\
  set $EVTPART1 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
defmod n_configSonos2 notify MQTT2_RINCON_[A-Z0-9]+:IPAddress:.* {\
  my @tv = ("S14","S11","S9");\
  my @line = ("S5","Z90","ZP120");\
  my $url="http://$EVTPART1:1400";\
  my $xmltext = GetFileFromURL("$url/xml/device_description.xml");\
  my ($mn)=$xmltext =~ /<modelNumber>([SZ]P?[0-9]{1,3})/;\
  my ($img)=$xmltext =~ /<url>(.*)<\/url>/;\
  my $icon="Sonos2mqtt_icon-$mn";\
  my $setList=AttrVal($NAME,'setList','');\
  fhem("setreading $NAME modelNumber $mn");\
  fhem("\"wget -qO ./www/images/default/$icon.png $url$img\"");\
  fhem("attr $NAME icon $icon;sleep 4 WI;set WEB rereadicons");\
  if (grep(/$mn/, @tv)) {$setList=~s/input:Queue \{/input:Queue,TV \{/};\
  if (grep(/$mn/, @line)) {$setList=~s/input:Queue \{/input:Queue,Line_In \{/};\
  $setList=~s/;/;;/g;\
  fhem("attr $NAME setList $setList")\
}

@beta-user Bitte :) einmal neu

Schaut auf die Bilder. Das erste wenn ich die Definition einfach öffne. Wenn ich dann einmal den DEF Editor öffne, nichts tue und modify mache, sieht es aus wie im zweiten Bild. Der Code ist aber unverändert. Ein Refresh im Browser behebt die Ansicht.

Aber ich habe gestern aus dieser Ansicht kopiert (weil ich faul war und die Semikolon dort schon einfach sind)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 03 November 2020, 07:41:05
...ist aktualisiert...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 03 November 2020, 08:16:59
Zitat von: Otto123 am 02 November 2020, 23:05:11
Ich bin noch auf S1 weil ich meinen Play5 nicht alleine stellen will.

Ich habe gestern übrigens getrennt.
Die Play 1 in die neue Sonos-App gepackt. Damit in einem eigenen Sonos-System.
Die Play 5 Gen 1 danach neu in die alte App gepackt.

Bisher läuft es scheinbar problemlos.
Aber eigentlich müsste es irgendeinen Unterschied geben, weil durch die zwei Sonos-Systeme dürften die sich ja keine Bridge mehr teilen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 03 November 2020, 10:33:51
Ich kann vermelden, nach den Änderungen im Template geht es jetzt!

Vielen Dank!!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 03 November 2020, 16:42:24
Hm, nachdem es ist der Testumgebung super geklappt hat, bin ich gerade auf produtiv gegangen.
Leider kommen wieder keine Icons.
Im icon fehlt das png: Sonos2mqtt_icon-S1
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 03 November 2020, 19:43:28
Da sehe ich keinen Fehler. Du meinst in dem heruntergeladenen Dateinamen oder im attr icon ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 03 November 2020, 19:57:51
Beim attr icon wurde zwar der Name geschrieben, aber .png nicht
Die Icons wurden auch nicht runter geladen.

Ist nicht so schlimm, habe es jetzt manuell gemacht.
Bist jetzt läuft meine Umgebung ohne Probleme.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 03 November 2020, 20:13:28
Naja beim attr icon steht nur der Dateiname ohne png. Das ist eigentlich in Ordnung.
Nicht heruntergeladen ist nicht in Ordnung - ich muss mal ein Script zum interaktiven Test machen.

Im Log hast Du zum fehlerhaften download nichts?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 03 November 2020, 20:19:06
Im Log war leider nichts.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 05 November 2020, 07:53:40
Kann ich mich hier anstellen oder helfen?
Es geht hier aktuell um das Album Cover bzw. das Bild was angezeigt werden soll oder?

Das wird bei mir auch nicht mehr angezeigt. Hatte vor einiger Zeit mal neu angelegt und getestet. Habe die Bridge angepasst aber bin mir nicht sicher ggf. was übersehen zu haben. Bei mir bleiben die Cover leer aktuell....
Bzw. es ist so das diese irgendwann einfach mal erscheinen ... Warum weiß ich nicht und kann das absolut nicht nachvollziehen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 05 November 2020, 09:18:10
Bin grade nicht so richtig auf aktuellem Stand und habe auch nicht den Überblick, ob und was ggf. noch fehlt.

Trotzdem vielleicht der Hinweis auf ein paar Werkzeuge betr. die irgendwann mal angedachte Auslieferung von passendem myUtils-Code und sonstige Gedanken:
- Grundsätzlich müßte es (für devStateIcon) auch möglich sein, den html-Code so zusammenzusetzen, dass ggf. auch "externe Inhalte" geladen werden (falls das nicht sowieso schon der Fall ist);
- zu dem notify mit dem "hole mir das Bild"-Code: wäre es nicht einfacher, einmalig alle Bilder zu holen (bei Anwendung des Basis-Templates)?
- irgendwann kam die Frage auf, ob es nicht (teilweise) einfacher wäre, den JSON (bzw. den von json2nameValue() gelieferten Hash) vorzuverarbeiten. Neben dem schon länger existierenden Beispiel "map_data" in "roborock" habe ich es jetzt endlich mal geschafft, den "MiLight"-Remote-Code so aufzubereiten, dass man ihn direkt in der readingList verwenden kann: https://forum.fhem.de/index.php/topic,103493.0/topicseen.html. Zum Verständnis: Da wird (als Differenzmeldung) - anders als hier - nur ein sehr einfacher JSON mit nur einem key/value-Paar geliefert, aber im Prinzip sollte sich das auch relativ leicht aufbohren lassen, zB. mit der bool->on/off-Konvertierung und "eocr"-Bereinigung aus "6channel_ethernet_board_6input_split", das dann eben einen bereinigten Hash (ggf.) mit mehren Elementen zurückliefert, der dann von MQTT2_DEVICE weiter in Reading-Aktualisierungen umgesetzt wird.
Falls dazu Fragen sind, würde ich aber empfehlen, dazu einen eigenen Thread (gerne hier im MQTT-Bereich) aufzumachen, das ist m.E. ein eher generisches Thema, das ggf. auch für andere Anwendungsfälle interessant sein kann...

Grüße, Beta-User
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 November 2020, 09:42:45
Zitat von: 87insane am 05 November 2020, 07:53:40
Kann ich mich hier anstellen oder helfen?
Es geht hier aktuell um das Album Cover bzw. das Bild was angezeigt werden soll oder?

Das wird bei mir auch nicht mehr angezeigt. Hatte vor einiger Zeit mal neu angelegt und getestet. Habe die Bridge angepasst aber bin mir nicht sicher ggf. was übersehen zu haben. Bei mir bleiben die Cover leer aktuell....
Bzw. es ist so das diese irgendwann einfach mal erscheinen ... Warum weiß ich nicht und kann das absolut nicht nachvollziehen.
Wenn Du nur diese Einrichtung (https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Sonos2Mqtt) machst, gibt es kein Cover.
Wenn Du das DevstateIcon nach hier einrichtest (https://wiki.fhem.de/wiki/Sonos2mqtt) - Kommt sofort das Albumcover (wenn es denn existiert). Das DevStateIcon stammt im wesentlichen von Dir. Bei mir funktioniert es so.
Was anderes kann ich ohne Details nicht nachvollziehen. Aber: Alles baut streng auf einer Einrichtung mit den Templates auf und dem MQTT2_Server mit autocreate simpel auf!

@Beta-user
Zitat- zu dem notify mit dem "hole mir das Bild"-Code: wäre es nicht einfacher, einmalig alle Bilder zu holen (bei Anwendung des Basis-Templates)?
Du meinst das Geräte Icon? Da läuft folgender Prozess ab - für jeden Player - beim ersten Anlegen also für xx Geräte quasi parallel:
- über den node sonos2mqtt Dienst werden erweiterte Informationen vom Player angefragt.
- Der Player antwortet 'irgendwann' - insofern läuft der Folgeprozess für jeden Player "irgendwann"
- Aus den Information wird eine URL gebaut und ein XML heruntergeladen. Das wird analysiert und eine ICON Url gebaut.
- das Icon wird lokal geladen, in das Attribute des Players eingetragen.
- damit die neuen Icons sichtbar werden muss rereadicon getriggert werden, das wird so verzögert, das es nur einmal passiert wenn alle Player fertig sind.
- alles habe ich versucht ohne blockieren von FHEM zu machen
Sicher könnte man eine Routine ins Speakertemplate machen. Ich muss sowieso noch für Mitch zum "debuggen" machen.

Rein von der Entwicklung her gibt es das Basistemplate und das "comfort" - ja man kann alles in einem machen. Dann auch noch noch das devstateicon.
Aber spätestens hier will ich das alles in eine Utils packen.

Rückmeldungen die zu Fehlerbehebung/Entwicklungen geführt haben gab es bisher von einer (knappen?) Hand voll User.
Der gesamte Code und Prozess ist sicher noch nicht perfekt.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 05 November 2020, 09:51:33
wir müssten auch noch immer die Readings gerade ziehen, damit sowas wie das hier

if ($currentTrack_Title =~ 'x-sonosapi-stream:'){$currentTrack_Title=''};

im devStateIcon nicht notwendig ist ;-) Wobei sich da die Frage stellt, ob das nicht eigentlich eher im sonos2mqtt selbst schon behoben werden sollte.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 November 2020, 09:54:44
Den Einwand mit Readings gerade ziehen verstehe ich adHoc nicht  ???
Der Code im Devstateicon ist dafür (ich weiß es gar nicht mehr genau) - das die Texte nicht doppelt und dreifach erscheinen. Aber das ist so eine bunte Mischung:

Sender, Title, Album, Interpret, Du hörst ... Das sind doch auch Infos die so von Sonos geliefert werden. Und an der Stelle frage ich wieder: Muss man in FHEM wirklich die APP perfekt nachbauen? Oder will man einfach automatisieren.

Sonos2mqtt würde ich so betrachten: der ist nicht für die Gestaltung der Readings in FHEM zuständig ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 05 November 2020, 10:02:46
Zitat von: Otto123 am 05 November 2020, 09:42:45
Wenn Du nur diese Einrichtung (https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Sonos2Mqtt) machst, gibt es kein Cover.
Wenn Du das DevstateIcon nach hier einrichtest (https://wiki.fhem.de/wiki/Sonos2mqtt) - Kommt sofort das Albumcover (wenn es denn existiert). Das DevStateIcon stammt im wesentlichen von Dir. Bei mir funktioniert es so.
Was anderes kann ich ohne Details nicht nachvollziehen. Aber: Alles baut streng auf einer Einrichtung mit den Templates auf und dem MQTT2_Server mit autocreate simpel auf!

Hey hey.. Ich habe das wohl schonmal gesehen ;) Spaß bei Seite.. Irgendwann wurde der Teil mit dem Bild angepasst. Das war der Moment wo ich wenig Zeit hatte. Leider weiß ich nun nicht warum das nun so willkürlich ist. Ggf. S2 vs S1? Die Links selber kann ich im Browser direkt öffnen, wenn ich sie aus dem entsprechendem Uri Reading kopiere.... :o
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 05 November 2020, 10:13:17
Kurzes Feedback: bei mir läuft es nun super stabil und ohne Probleme (inkl. Coverbilder, Speak und abspielen von MP3s).
Das schöne, mein fhem ist seit dem löschen des Sonos Moduls etwas performanter geworden.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 05 November 2020, 10:14:01
Zitat von: Otto123 am 05 November 2020, 09:42:45
@Beta-user
Du meinst das Geräte Icon? Da läuft folgender Prozess ab - für jeden Player - beim ersten Anlegen also für xx Geräte quasi parallel:
- über den node sonos2mqtt Dienst werden erweiterte Informationen vom Player angefragt.
- Der Player antwortet 'irgendwann' - insofern läuft der Folgeprozess für jeden Player "irgendwann"
- Aus den Information wird eine URL gebaut und ein XML heruntergeladen. Das wird analysiert und eine ICON Url gebaut.
- das Icon wird lokal geladen, in das Attribute des Players eingetragen.
- damit die neuen Icons sichtbar werden muss rereadicon getriggert werden, das wird so verzögert, das es nur einmal passiert wenn alle Player fertig sind.
- alles habe ich versucht ohne blockieren von FHEM zu machen
Das klingt im wesentlichen ok, wobei die regex mit dem Plus (in der Namens-Ermittlung) evtl. nicht optimal ist (ich bin da erst heute morgen wieder bei einem anderen meiner notify drüber gestolpert... ); evtl. ginge es "einfacher", wenn man den JSON (schon in der bridge?) prüft und dann - sofern IPAddress enthalten ist - das ganze als sub aufruft (oder eben den IP-Inhalten eine Sonderbehandlung im DEVICE gibt). Ggf. müßte/könnte man dann auch checken, ob bzw. welche Aktion überhaupt noch erforderlich ist?

Zitat
Rein von der Entwicklung her gibt es das Basistemplate und das "comfort" - ja man kann alles in einem machen. Dann auch noch noch das devstateicon.
Aber spätestens hier will ich das alles in eine Utils packen.

Rückmeldungen die zu Fehlerbehebung/Entwicklungen geführt haben gab es bisher von einer (knappen?) Hand voll User. Das ist alles sicher noch nicht perfekt.
Na ja, über mangelnden Zuspuch kannst du dich bei dem Projekt nicht beklagen, oder?  ;)

Grundsätzlich glaube ich, dass es - auch für die Helfer! - einfacher wird, wenn man mal das mit myUtils aufgegleist hat. Der Code selbst ist zwar etwas schwieriger zu verstehen, wenn er "versteckt" ist, aber man kann einfacher "Klone" (einzelner Teile) des Codes erstellen und die dann separat Testen, und das zudem, ohne jedesmal die Konfiguration anzufassen.
In myUtils mit den Hashes rumzumosten, ist halt "etwas abstrakt", aber man gewöhnt sich irgendwann dran. Ging jedenfalls mir so. Zu Beginn war es sehr schwierig, bis mal eines der Beispiele funktioniert hat, aber dann war "das Eis gebrochen"...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 November 2020, 10:50:08
Nein, ich kann und will mich nicht beklagen, aber das Feedback zum letzten Stand ging erst in den letzten Tagen so richtig los. Dabei wurden ja auch ein paar Dinge verbessert gefixt - das ist genau ok! Jetzt kann man mal weiter denken :)
Du meinst weil das MQTT2_RINCON_[A-Z0-9]+ auf beliebig viele Stellen matched? Ja das kann ich eingrenzen :) Oder weil es kein NOTIFYDEV gibt? Aber wie bekomm ich das da besser? Mit 17 Punkten - aber ist das wirklich besser?

Zur Performance:
Ich erinnere mich noch gut an meinen Start mit FHEM. Nachdem ich nach einer Anfangsphase SONOS definiert habe, gab es einen "Ruck" im System RAM und CPU Auslastung. :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 05 November 2020, 11:03:20
Das mit dem NOTIFYDEV war das Thema (wobei ich mir grade nicht sicher bin; das ist doch "hinten", Auslöser ist global, das könnte also doch passen :-[ ).

Wie gesagt (falls es überhaut ein "NOTIFYDEV-performance-Problem" gibt...): ich meine, man könnte ggf. direkt auf das notify verzichten, wenn man den JSON (bzw. nach etwas "Sacken lassen" besser direkt den Hash) gleich am Device abgreift (die Abfrage müßte dann wohl aus dem "player-template" kommen) und dann dort die weiteren Schritte veranlasst. Ist aber ggf. in der Tat aufwändiger als das notify mit NOTIFYDEV, wenn ich mir's recht überlege ::) .
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 November 2020, 11:13:05
Naja diese regExp gibt es ja in beiden notify. Ja das zweite will ich auch irgendwie "einsparen" / anders wegpacken. Aber das erste folgt meiner Philosophie: Es kommt ein Player (autocreate) und wird konfiguriert. Da möchte ich nicht drauf verzichten.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 05 November 2020, 11:40:36
Zitat von: Otto123 am 05 November 2020, 09:54:44
Den Einwand mit Readings gerade ziehen verstehe ich adHoc nicht  ???
Der Code im Devstateicon ist dafür (ich weiß es gar nicht mehr genau) - das die Texte nicht doppelt und dreifach erscheinen. Aber das ist so eine bunte Mischung:

Sender, Title, Album, Interpret, Du hörst ... Das sind doch auch Infos die so von Sonos geliefert werden. Und an der Stelle frage ich wieder: Muss man in FHEM wirklich die APP perfekt nachbauen? Oder will man einfach automatisieren.

Sonos2mqtt würde ich so betrachten: der ist nicht für die Gestaltung der Readings in FHEM zuständig ;)

Ich will die App nicht nachbauen, Himmel!
Aus meiner Sicht unterstützen wir aktuell - für mich - ausreichend Funktionen.

Worauf ich hinaus wollte, wir bauen hier im devStateIcon extra eine Behandlung für currentTrack_Title, weil dort abhängig von der Quelle auch Quatsch drin stehen kann. Wäre aber doch eigentlich sinnvoller, wenn man direkt beim Befüllen des Readings dafür sorgt, dass nicht sowas wie "x-sonosapi-stream" drin steht.
Aber, uns das meinte ich wegen sonos2mqtt, eigentlich sollte sowas gar nicht erst im entsprechenden Topic stehen, sondern der sonos2mqtt müsste das schon bereinigen. So dass man davon ausgehen könnte, das im entsprechenden Topic auch der echte Titel steht - und nicht irgendwelche Urls o.ä.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 November 2020, 12:11:03
Zitat von: kjmEjfu am 05 November 2020, 11:40:36
Worauf ich hinaus wollte, wir bauen hier im devStateIcon extra eine Behandlung für currentTrack_Title, weil dort abhängig von der Quelle auch Quatsch drin stehen kann. Wäre aber doch eigentlich sinnvoller, wenn man direkt beim Befüllen des Readings dafür sorgt, dass nicht sowas wie "x-sonosapi-stream" drin steht.
Aber, uns das meinte ich wegen sonos2mqtt, eigentlich sollte sowas gar nicht erst im entsprechenden Topic stehen, sondern der sonos2mqtt müsste das schon bereinigen. So dass man davon ausgehen könnte, das im entsprechenden Topic auch der echte Titel steht - und nicht irgendwelche Urls o.ä.
Gebe ich Dir Recht. Ich bin gar nicht sicher: War das mal ein Würgaround von mir und das Problem existiert gar nicht mehr. Oder ich hatte das Problem selbst gebaut. Oder hat das Stephan mittlerweile behoben?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 05 November 2020, 16:59:57
Zitat von: Otto123 am 05 November 2020, 12:11:03
Gebe ich Dir Recht. Ich bin gar nicht sicher: War das mal ein Würgaround von mir und das Problem existiert gar nicht mehr. Oder ich hatte das Problem selbst gebaut. Oder hat das Stephan mittlerweile behoben?

Ist leider noch immer da.
Hatte das gestern auch als ich Radio (nicht über Sonos Radio) abgespielt habe, da stand im Title auch irgendeine URL-Pfadangabe.
Von daher kommt das so über MQTT rein.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 10 November 2020, 17:02:14
Es gab ja noch das Thema DevelopmentGuidelinesAV  (https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV)und mehrere Durchsagen - die gleichzeitig eintreffen - aber natürlich nacheinander gespielt werden sollen.
Da habe ich mal was gebastelt:
Das Volume für Durchsagen separat wählen.
setreading SonosTTS vol 15
und dann ein zusätzlicher setter (für die DEF vom Player Device):
sayText:textField { my $tts=ReadingsVal('SonosBridge','tts','SonosTTS');my ($cmd,$text)=split(' ', $EVENT,2);fhem("setreading $tts text ".ReadingsVal($tts,'text',' ').' '.$text.";sleep 0.4 tts;set $tts tts [$tts:text];sleep $tts:playing:.0 ;set $NAME notify [$tts:vol] [$tts:httpName];deletereading $tts text")}
Was passiert?

Wer Lust hat zu testen - in der Raw Def starten:
set alias=Arbeitszimmer sayText Es
set alias=Arbeitszimmer sayText ist
set alias=Arbeitszimmer sayText lustig
set alias=Arbeitszimmer sayText Willi
set alias=Arbeitszimmer sayText lustig. Laber Rabarber.
sleep 0.2;set alias=Arbeitszimmer sayText Zu guter Letzt.


Ich weiß - es wird Zeit dafür den Code auszulagern :)

Ergänzung: Mir ist aufgefallen, dass längere Texte manchmal abgebrochen werden. Die mp3 Datei ist dabei komplett erzeugt.  Man muss mal irgendwie mit den Parametern des notify Befehls spielen: "timeout":10 "delayMs":700 - wenn man den timeout Wert erhöht (ich habe einfach 100 genommen) wird nicht abgebrochen und andere negative Auswirkungen konnte ich nicht feststellen.  Mir ist die genaue Wirkung nicht wirklich klar geworden. Siehe auch (https://svrooij.io/node-sonos-ts/sonos-device/notifications-and-tts.html).
Zitattimeout: 10, // If the events don't work (to see when it stops playing) or if you turned on a stream, it will revert back after this amount of seconds.
    ...
    delayMs: 700 // Pause between commands in ms, (when sonos fails to play sort notification sounds).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 10 November 2020, 19:50:43
Zitat von: Otto123 am 10 November 2020, 17:02:14
der Text im Reading wird mit einem Leerzeichen gelöscht (da fiel mir keine schöne Lösung ein)

spricht etwas dagegen das Reading einfach zu löschen? Wäre doch eine saubere Lösung. Wobei ich das Reading, weil es ein temporäres ist, vorne um einen "_" o.ä. ergänzen würde.
Alternativ überlege ich gerade, ob man für diese Funktionalität nicht leichter ein DOIF (mit set_exec) nutzen könnte. Aber dann muss man natürlich wieder ein weiteres Gerät anlegen, auch doof.


Grundsätzliche Frage: für Speak gibt es aktuell ja zwei Variante. Entweder die über Text2Speech oder die über sonos-tts-polly. Macht es Sinn, wenn wir da ein Attribut für zur Verfügung stellen, damit der Anweder darüber auswählen kann, welche Variante er nutzt? Denn darüber würde sich ja unterscheiden, ob man den Payload an ein Text2Speech schickt (und dann per notify weiter) oder den Payload auf sonos/cmd/speak ablegt.
Und ja, dann sind wir wieder beim beliebten Thema auslagern ;-)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 10 November 2020, 20:15:25
Man kann das Reading auch löschen, mein gedanklicher Entwicklungsweg war etwas im ZickZack deswegen ...
Im Normalfall sieht man es nicht, klar kann man da einen Zusatz nehmen.

DOIF - nein bitte nicht!  ::) ;D - aber kann ja jeder machen wie er will

Der Anwender kann ja nicht wirklich Speak "wählen" - er muss sich was "einrichten" und das mehr oder weniger aufwendig. Aber klar der Zugriff auf den "MP3 Server sollte ich noch konfigurierbar machen.
sonos/cmd/speak ist doch der Spezialfall "An Alle" - aber ich habe mich mit der integrierten Variante auch noch nicht wirklich beschäftigt.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 11 November 2020, 08:15:31
Zitat von: Otto123 am 10 November 2020, 20:15:25
Der Anwender kann ja nicht wirklich Speak "wählen" - er muss sich was "einrichten" und das mehr oder weniger aufwendig. Aber klar der Zugriff auf den "MP3 Server sollte ich noch konfigurierbar machen.
sonos/cmd/speak ist doch der Spezialfall "An Alle" - aber ich habe mich mit der integrierten Variante auch noch nicht wirklich beschäftigt.

Ja, du hast Recht. Ich habe falsch geschaut.

Der Speak, wenn man das sonos-tts-polly nutzt, ist derzeit so hinterlegt:

speak:textField { my (undef, $lang, $voice, $volume, @text) = split(/ /, $EVENT); sprintf($DEVICETOPIC.'/control {"command":"speak","input":{"lang": "%s", "name":"%s", "volume":%s, "text": "%s","delayMs":700}}', $lang, $voice, $volume, join(" ", @text))}

Vorschlag: wir führen folgende Attribute ein:

- SpeakMethod:FHEMtts,SonosPolly
- SpeakTTSDevice (wäre dann nur im FHEMtts-Fall zu setzen)

Dann könnten wir zwischen den beiden unterscheiden und den Aufruf entsprechend wählen.


Wegen Auslagern wäre es toll, wenn jemand mit Erfahrung einen Rumpf vorschlägt. Wenn ich da was bastele, dann ist das vor allem viel Copy&Paste (ohne es im Detail zu verstehen) und auf Scripting-Niveau.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 11 November 2020, 09:49:55
Ich habe mal den Code oben noch editiert und etwas verbessert :)
Zitatauf Scripting-Niveau.
Da bilden wir schonmal ein Team ;)
Also ich habe schon ein paar Gedanken, ich muss mich jetzt erstmal der Martinsgans widmen. Ich bringe das dann mal "zu Papier" ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 12 November 2020, 14:03:42
Ich bin jetzt übrigens über den ersten Anwendungsfall gestolpert, für den man sonos/status/name_or_uuid_of_speaker/avtransport bräuchte.
So hat mein Sohn eine nervig Neigung überall Gruppen zu erstellen und wenn man dann z.B. im Bad automatisiert Radio abspielt, gibt es böse Schreie. Also schicke ich bei automatischen Aktionen an seine Box sicherheitshalber ein "leavegroup". Das hat aber den Nachteil, dass dadurch die Playlist bei ihm auf den 1. Titel zurückgesetzt wird.

Mit

"CurrentTrack" : 5,
  "CurrentTrackDuration" : "0:04:04",


lässt sich zumindest anschließend wieder zur richtigen Stelle springen ;-)

Wobei das theoretisch eher ein Bug in der sonos2mqtt Implementation ist, denn wenn ich in der App eine Box aus einer Gruppe entferne, dann bleibt die Position in der Playlist erhalten.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 12 November 2020, 16:51:30
Wir sammeln das mal und machen bei Stephan einen Issue auf?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 12 November 2020, 17:38:39
Haha wie er das bad als Beispiel nimmt. Hab mir sogar longpush extra am bad dafür gemacht. Ich erlebe das auch immer wieder.
Sonos sieht das so nicht vor aber es sollte möglich sein die Player trotz Gruppe einzeln an zu sprechen. Dann wäre das obsolet und sogar noch ein Bonus Feature.
Ich stecke aktuell nicht so tief drin da ich beruflich unendlich viel zu tun habe. Lese aber immer mal wieder hier drüber.. Macht bloß weiter so :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 12 November 2020, 18:20:44
Ich habe jetzt mal meine userReadings um eins erweitert:

shuffle:playmode.* { if (ReadingsVal($name,"playmode","NORMAL") =~ m/SHUFFLE/) {return "on"} else {return "off"} ;},
repeat:playmode.* { my $val = ReadingsVal($name,"playmode","none"); my %rets = ("none" => "unknown","NORMAL" => "off","SHUFFLE" => "off","REPEAT_ALL" => "all","SHUFFLE_NOREPEAT" => "off","SHUFFLE_REPEAT_ONE" => "off"); return $rets{$val} if $rets{$val}; },
currentMediaSource:currentTrack_TrackUri.* { my $val = ReadingsVal($name,"currentTrack_TrackUri","none"); $val =~ /:([^:][a-zA-Z]*)/; my %rets = ("none" => "unknown","spotify" => "Spotify","tunein" => "TuneIn","catalog" => "Amazon"); return $rets{$1}; },
groupMode { (ReadingsVal($name,"name","0") ne ReadingsVal($name,'groupName','0') ? "group" : "standalone") }


fühlt also das groupMode je nachdem, ob Gruppe oder nicht.
Und dann lässt sich recht easy mit etwas wie

{
    my $mytrack = "";
    fhem "set Sonos_XYZ leaveGroup; set Sonos_XYZ selecttrack $mytrack;" if (ReadingsVal("Sonos_XYZ","groupMode","") eq "group");
}


vorher abfragen, ob man in einer Gruppe ist und falls ja, dann zumindest der Track wiederherstellen. Man könnte auch mit "seek" an die vorherige Stelle springen, aber die aktuelle Position im Track wird nirgendwo übergeben oder ich finde es einfach nicht.

Damit das funktioniert, muss in der ReadingsList gesetzt sein:

$DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }
$DEVICETOPIC/control:.* { json2nameValue($EVENT) }
$DEVICETOPIC/ZoneInfo:.* { json2nameValue($EVENT) }
$DEVICETOPIC/error:.* { json2nameValue($EVENT) }
sonos/status/xyz/avtransport:.* { json2nameValue($EVENT) }


Leider ist der Topic-Pfad für avtransport etwas schräg, so dass man hier tatsächlich auch den Namen (kleingeschrieben) einsetzen muss.

Ich fände es ja schöner, wenn sonos/status/name_or_uuid_of_speaker/avtransport unter sonos/uuid_of_speaker/status/avtransport liegen würde (gleiches gilt für sonos/status/name_or_uuid_of_speaker/renderingcontrol), aber nun gut.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 13 November 2020, 16:53:27
Das userreading gibt es im devstateicon schon. Also zumindest die Abfrage. Würde dann eher auch den setter darüber setzen. Ist ja eh schon die deluxe Edition von meinem Ursprung.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 13 November 2020, 18:23:07
Zitat von: 87insane am 13 November 2020, 16:53:27
Das userreading gibt es im devstateicon schon. Also zumindest die Abfrage. Würde dann eher auch den setter darüber setzen. Ist ja eh schon die deluxe Edition von meinem Ursprung.

Da habe ich es vermutlich auch her geklaut ;-)
Ich finde es immer schöner, wenn ich solche Abfragen/Auswertungen direkt in ein Reading packe, weil ich mir doppelten Code spare, wenn ich es nochmal brauche.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 09 Dezember 2020, 16:28:09
Hi,

hab mich nun nach Wochen der Neu-Installation meines FHEM-Server (bisher ohne Sonos-Integration, weil ich die ganzen Bibliotheken welche das Sonos-Modul erfordert nicht unnötig installieren wollte) heute für s2m entschieden und installiert.

Den automatischen Start hatte ich direkt im System vor (Alternative Wiki), klappt merkwürdigerweise auch, hab aber einen Fehler gemacht.

Folgende Fragen stelle ich mir jetzt:

Bei
pi@FHEMPIOS:~ $ pm2 start -- --mqtt mqtt://user:passwd@192.168.188.26:1883

bekam ich das zurück
                        -------------

__/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____
_\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___
  _\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__
   _\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___
    _\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____
     _\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________
      _\/\\\_____________\/\\\_____________\/\\\___/\\\/___________
       _\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_
        _\///______________\///______________\///__\///////////////__


                          Runtime Edition

        PM2 is a Production Process Manager for Node.js applications
                     with a built-in Load Balancer.

                Start and Daemonize any application:
                $ pm2 start app.js

                Load Balance 4 instances of api.js:
                $ pm2 start api.js -i 4

                Monitor in production:
                $ pm2 monitor

                Make pm2 auto-boot at server restart:
                $ pm2 startup

                To go further checkout:
                http://pm2.io/


                        -------------

[PM2] Spawning PM2 daemon with pm2_home=/home/pi/.pm2
[PM2] PM2 Successfully daemonized
[PM2][ERROR] File ecosystem.config.js not found


Kann ich ERROR] File ecosystem.config.js not found einfach ignorieren ?


Dann zu meinem Fehler:

Man soll erst s2m starten pm2 start sonos2mqtt -- --mqtt mqtt://Thomas:3983@192.168.188.26:1883

Hab ich aber nicht gemacht  ::) und direkt pm2 startup mit anschliessendem pm2 save, sah dann so aus:

pi@FHEMPIOS:~ $ pm2 startup
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi
pi@FHEMPIOS:~ $ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi

                        -------------

__/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____
_\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___
  _\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__
   _\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___
    _\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____
     _\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________
      _\/\\\_____________\/\\\_____________\/\\\___/\\\/___________
       _\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_
        _\///______________\///______________\///__\///////////////__


                          Runtime Edition

        PM2 is a Production Process Manager for Node.js applications
                     with a built-in Load Balancer.

                Start and Daemonize any application:
                $ pm2 start app.js

                Load Balance 4 instances of api.js:
                $ pm2 start api.js -i 4

                Monitor in production:
                $ pm2 monitor

                Make pm2 auto-boot at server restart:
                $ pm2 startup

                To go further checkout:
                http://pm2.io/


                        -------------

[PM2] Init System found: systemd
Platform systemd
Template
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

[Service]
Type=forking
User=pi
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/pi/.pm2
PIDFile=/home/pi/.pm2/pm2.pid
Restart=on-failure

ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target

Target path
/etc/systemd/system/pm2-pi.service
Command list
[ 'systemctl enable pm2-pi' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-pi.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-pi...
Created symlink /etc/systemd/system/multi-user.target.wants/pm2-pi.service → /etc/systemd/system/pm2-pi.service.
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via:
$ pm2 save

[PM2] Remove init script via:
$ pm2 unstartup systemd
pi@FHEMPIOS:~ $ pm2 save
[PM2] Saving current process list...
[PM2][WARN] PM2 is not managing any process, skipping save...
[PM2][WARN] To force saving use: pm2 save --force


Wenn ich einen reboot vom System mache wird s2m aber korrekt gestartet, auch wenn am Ende stand
[PM2] Saving current process list...
[PM2][WARN] PM2 is not managing any process, skipping save...
[PM2][WARN] To force saving use: pm2 save --force


In /etc/systemd/system/pm2-pi.service steht:
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

[Service]
Type=forking
User=pi
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/usr/bin:/bin:/usr/local/sbin:/usr/$
Environment=PM2_HOME=/home/pi/.pm2
PIDFile=/home/pi/.pm2/pm2.pid
Restart=on-failure

ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target


Was mach ich jetzt ? Kann ich /etc/systemd/system/pm2-pi.service einfach löschen und dann nochmal von vorne:

pm2 start -- --mqtt mqtt://user:passwd@192.168.188.26:1883
pm2 startup
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi
pm2 save


? ? ?

Wenn ich das machen sollte dann geh ich davon aus das die Meldung [PM2] Remove init script via:
$ pm2 unstartup systemd
wieder kommen wird, führ ich das dann auch aus ?

Hat jemand da genauen Durchblick und kann mir weiterhelfen ?

Gruß

Thomas
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 09 Dezember 2020, 16:49:30
Hallo Thomas,

ZitatHat jemand da genauen Durchblick und kann mir weiterhelfen ?
Würde ich nicht behaupten, aber ich gebe mir Mühe und schaue mal in meine Aufzeichnungen. Ich habe das alles schon mal intensiv durchgespielt. Ich melde mich.

Gruß otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 09 Dezember 2020, 17:07:27
Korrektur, ich war so verwundert über die Meldungen (hab doch alles vorher mehrfach geübt, auf dem RaspiZero) das ich nicht richtig geschaut habe.

Ich hatte zuvor s2m gestartet, so wie es oben auch steht.

Also meine Fragen berechtigt warum es zu den Meldungen kam, vorallem:

[PM2] Saving current process list...
[PM2][WARN] PM2 is not managing any process, skipping save...
[PM2][WARN] To force saving use: pm2 save --force


Hier nochmal alles so wie ich es auch hintereinander ausgeführt habe.

pi@FHEMPIOS:~ $ pm2 start -- --mqtt mqtt://user:passwd@192.168.188.26:1883

                        -------------

__/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____
_\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___
  _\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__
   _\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___
    _\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____
     _\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________
      _\/\\\_____________\/\\\_____________\/\\\___/\\\/___________
       _\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_
        _\///______________\///______________\///__\///////////////__


                          Runtime Edition

        PM2 is a Production Process Manager for Node.js applications
                     with a built-in Load Balancer.

                Start and Daemonize any application:
                $ pm2 start app.js

                Load Balance 4 instances of api.js:
                $ pm2 start api.js -i 4

                Monitor in production:
                $ pm2 monitor

                Make pm2 auto-boot at server restart:
                $ pm2 startup

                To go further checkout:
                http://pm2.io/


                        -------------

[PM2] Spawning PM2 daemon with pm2_home=/home/pi/.pm2
[PM2] PM2 Successfully daemonized
[PM2][ERROR] File ecosystem.config.js not found
pi@FHEMPIOS:~ $ pm2 startup
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi
pi@FHEMPIOS:~ $ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi

                        -------------

__/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____
_\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___
  _\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__
   _\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___
    _\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____
     _\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________
      _\/\\\_____________\/\\\_____________\/\\\___/\\\/___________
       _\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_
        _\///______________\///______________\///__\///////////////__


                          Runtime Edition

        PM2 is a Production Process Manager for Node.js applications
                     with a built-in Load Balancer.

                Start and Daemonize any application:
                $ pm2 start app.js

                Load Balance 4 instances of api.js:
                $ pm2 start api.js -i 4

                Monitor in production:
                $ pm2 monitor

                Make pm2 auto-boot at server restart:
                $ pm2 startup

                To go further checkout:
                http://pm2.io/


                        -------------

[PM2] Init System found: systemd
Platform systemd
Template
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

[Service]
Type=forking
User=pi
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/pi/.pm2
PIDFile=/home/pi/.pm2/pm2.pid
Restart=on-failure

ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target

Target path
/etc/systemd/system/pm2-pi.service
Command list
[ 'systemctl enable pm2-pi' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-pi.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-pi...
Created symlink /etc/systemd/system/multi-user.target.wants/pm2-pi.service → /etc/systemd/system/pm2-pi.service.
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via:
$ pm2 save

[PM2] Remove init script via:
$ pm2 unstartup systemd
pi@FHEMPIOS:~ $ pm2 save
[PM2] Saving current process list...
[PM2][WARN] PM2 is not managing any process, skipping save...
[PM2][WARN] To force saving use: pm2 save --force
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 09 Dezember 2020, 17:18:16
Hallo Thomas,

ich glaube dein Problem ist jetzt:
Du hast alles als Pi gemacht, der Prozess startet jetzt auch mit user pi - aber manches hast Du mit sudo gemacht?
Der pm2 kann praktisch in jedem User Kontext separat laufen (ihr könnt mich schlagen wenn das nicht stimmt - ich hatte es geschafft das alles doppelt lief)
Schau mal pm2 läuft als user fhem, als user pi und als user root sehe ich nix:
pm2 list
[PM2] Spawning PM2 daemon with pm2_home=/home/pi/.pm2
[PM2] PM2 Successfully daemonized
┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name      │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
pi@raspib3plus:~ $ sudo -u fhem pm2 list
┌─────┬───────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name          │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼───────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ sonos2mqtt    │ default     │ N/A     │ fork    │ 20737    │ 21D    │ 0    │ online    │ 0%       │ 52.8mb   │ fhem     │ disabled │
└─────┴───────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
pi@raspib3plus:~ $ sudo pm2 list
┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name      │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
pi@raspib3plus:~ $

Ich werde aber deinen Prozess nochmal durchspielen, offenbar fehlt ja was in der Doku :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 09 Dezember 2020, 17:24:57
Ganz genau hab ich es so gemacht:

pi@FHEMPIOS:~ $ sudo npm install pm2 -g
npm WARN deprecated debug@4.1.1: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)
/usr/bin/pm2 -> /usr/lib/node_modules/pm2/bin/pm2
/usr/bin/pm2-dev -> /usr/lib/node_modules/pm2/bin/pm2-dev
/usr/bin/pm2-docker -> /usr/lib/node_modules/pm2/bin/pm2-docker
/usr/bin/pm2-runtime -> /usr/lib/node_modules/pm2/bin/pm2-runtime
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@~2.1.2 (node_modules/pm2/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.1.3: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"arm"})

+ pm2@4.5.0
added 198 packages from 195 contributors in 44.737s
pi@FHEMPIOS:~ $ sudo npm install -g sonos2mqtt
npm WARN deprecated debug@4.1.1: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)
/usr/bin/sonos2mqtt -> /usr/lib/node_modules/sonos2mqtt/lib/index.js

> fast-xml-parser@3.17.5 postinstall /usr/lib/node_modules/sonos2mqtt/node_modules/fast-xml-parser
> node tasks/postinstall.js || exit 0

Love fast-xml-parser? Check https://amitkumargupta.work for more projects and contribution.

+ sonos2mqtt@3.1.0
added 117 packages from 75 contributors in 30.054s


   ╭────────────────────────────────────────────────────────────────╮
   │                                                                │
   │      New patch version of npm available! 6.14.8 → 6.14.9       │
   │   Changelog: https://github.com/npm/cli/releases/tag/v6.14.9   │
   │               Run npm install -g npm to update!                │
   │                                                                │
   ╰────────────────────────────────────────────────────────────────╯

pi@FHEMPIOS:~ $ sudo npm install -g npm
/usr/bin/npm -> /usr/lib/node_modules/npm/bin/npm-cli.js
/usr/bin/npx -> /usr/lib/node_modules/npm/bin/npx-cli.js
+ npm@6.14.9
added 5 packages from 3 contributors, removed 4 packages and updated 3 packages in 41.615s
pi@FHEMPIOS:~ $ pm2 start -- --mqtt mqtt://user:passwd@192.168.188.26:1883

                        -------------

__/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____
_\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___
  _\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__
   _\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___
    _\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____
     _\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________
      _\/\\\_____________\/\\\_____________\/\\\___/\\\/___________
       _\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_
        _\///______________\///______________\///__\///////////////__


                          Runtime Edition

        PM2 is a Production Process Manager for Node.js applications
                     with a built-in Load Balancer.

                Start and Daemonize any application:
                $ pm2 start app.js

                Load Balance 4 instances of api.js:
                $ pm2 start api.js -i 4

                Monitor in production:
                $ pm2 monitor

                Make pm2 auto-boot at server restart:
                $ pm2 startup

                To go further checkout:
                http://pm2.io/


                        -------------

[PM2] Spawning PM2 daemon with pm2_home=/home/pi/.pm2
[PM2] PM2 Successfully daemonized
[PM2][ERROR] File ecosystem.config.js not found
pi@FHEMPIOS:~ $ pm2 startup
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi
pi@FHEMPIOS:~ $ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi

                        -------------

__/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____
_\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___
  _\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__
   _\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___
    _\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____
     _\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________
      _\/\\\_____________\/\\\_____________\/\\\___/\\\/___________
       _\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_
        _\///______________\///______________\///__\///////////////__


                          Runtime Edition

        PM2 is a Production Process Manager for Node.js applications
                     with a built-in Load Balancer.

                Start and Daemonize any application:
                $ pm2 start app.js

                Load Balance 4 instances of api.js:
                $ pm2 start api.js -i 4

                Monitor in production:
                $ pm2 monitor

                Make pm2 auto-boot at server restart:
                $ pm2 startup

                To go further checkout:
                http://pm2.io/


                        -------------

[PM2] Init System found: systemd
Platform systemd
Template
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

[Service]
Type=forking
User=pi
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/pi/.pm2
PIDFile=/home/pi/.pm2/pm2.pid
Restart=on-failure

ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target

Target path
/etc/systemd/system/pm2-pi.service
Command list
[ 'systemctl enable pm2-pi' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-pi.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-pi...
Created symlink /etc/systemd/system/multi-user.target.wants/pm2-pi.service → /etc/systemd/system/pm2-pi.service.
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via:
$ pm2 save

[PM2] Remove init script via:
$ pm2 unstartup systemd
pi@FHEMPIOS:~ $ pm2 save
[PM2] Saving current process list...
[PM2][WARN] PM2 is not managing any process, skipping save...
[PM2][WARN] To force saving use: pm2 save --force


Node.js war schon installiert und zwar mit sudo:

Node.js installieren:

https://github.com/nodesource/distributions/blob/master/README.md

# Using Debian, as root
curl -sL https://deb.nodesource.com/setup_14.x | bash -
apt-get install -y nodejs

testen ob alles klappt:

npm -v
node -v


edit:

das -y bei apt-get install -y nodejs hab ich mein ich rausgenommen, weil du (glaub ich) das mal erwähnt hattest.

edit2:

wenn ich reboote dann startet s2m wie ich vorhatte mit user pi:

pi@FHEMPIOS:~ $ pm2 list
┌─────┬───────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name          │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼───────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ sonos2mqtt    │ default     │ N/A     │ fork    │ 655      │ 31s    │ 0    │ online    │ 0%       │ 44.4mb   │ pi       │ disabled │
└─────┴───────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘


Die Meldungen irritieren mich halt.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 09 Dezember 2020, 19:58:09
Sieht eigentlich gut aus.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 09 Dezember 2020, 20:46:48
Mag ja sein. Für mich unbefriedigend. Nichts auf meinem neuen System hat bisher Fehlermeldungen (die waren hier) verursacht.

Werde wieder auf den vorherigen Stand zurückgehen und mit einer anderen Karte die Installation auf meinem Haupt-System-RasPi "trainieren".


Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 09 Dezember 2020, 20:51:28
Warte mal noch, ich will das mal durchspielen. :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 09 Dezember 2020, 22:17:47
Bei mir läuft das sauber durch. Diese Fehlermeldung
[PM2][ERROR] File ecosystem.config.js not found
habe ich nicht  ???
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 10 Dezember 2020, 11:00:05
Moin,

nochmal durchgespielt:
neuestes RaspiOS (Warum muss man ein Image am 2.12. herausbringen was heute so lange wie kein Image davor zum Update braucht?)
Dann OS aktualisiert
Dann nodejs installiert:
#!/bin/bash
# look for Releases https://nodejs.org/de/about/releases/
curl -sL https://deb.nodesource.com/setup_14.x | bash -
apt-get install -y nodejs
apt-get install -y libjson-pp-perl
npm install pm2 -g

Dann weiter im kompletten Screenshot:
sudo npm install -g sonos2mqtt
npm WARN deprecated debug@4.1.1: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)
/usr/bin/sonos2mqtt -> /usr/lib/node_modules/sonos2mqtt/lib/index.js

> fast-xml-parser@3.17.5 postinstall /usr/lib/node_modules/sonos2mqtt/node_modules/fast-xml-parser
> node tasks/postinstall.js || exit 0

Love fast-xml-parser? Check https://amitkumargupta.work for more projects and contribution.

+ sonos2mqtt@3.1.0
added 117 packages from 75 contributors in 25.568s
pi@raspib31:~ $ pm2 start sonos2mqtt -- --mqtt mqtt://user:password@192.168.56.80:1883

                        -------------

__/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____
_\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___
  _\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__
   _\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___
    _\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____
     _\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________
      _\/\\\_____________\/\\\_____________\/\\\___/\\\/___________
       _\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_
        _\///______________\///______________\///__\///////////////__


                          Runtime Edition

        PM2 is a Production Process Manager for Node.js applications
                     with a built-in Load Balancer.

                Start and Daemonize any application:
                $ pm2 start app.js

                Load Balance 4 instances of api.js:
                $ pm2 start api.js -i 4

                Monitor in production:
                $ pm2 monitor

                Make pm2 auto-boot at server restart:
                $ pm2 startup

                To go further checkout:
                http://pm2.io/


                        -------------

[PM2] Spawning PM2 daemon with pm2_home=/home/pi/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /usr/bin/sonos2mqtt in fork_mode (1 instance)
[PM2] Done.
┌─────┬───────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name          │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼───────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ sonos2mqtt    │ default     │ N/A     │ fork    │ 1706     │ 0s     │ 0    │ online    │ 0%       │ 22.4mb   │ pi       │ disabled │
└─────┴───────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
pi@raspib31:~ $
keine Fehlermeldung!
pm2 startup einegrichtet
pm2 startup
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi
pi@raspib31:~ $ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi

                        -------------

__/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____
_\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___
  _\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__
   _\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___
    _\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____
     _\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________
      _\/\\\_____________\/\\\_____________\/\\\___/\\\/___________
       _\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_
        _\///______________\///______________\///__\///////////////__


                          Runtime Edition

        PM2 is a Production Process Manager for Node.js applications
                     with a built-in Load Balancer.

                Start and Daemonize any application:
                $ pm2 start app.js

                Load Balance 4 instances of api.js:
                $ pm2 start api.js -i 4

                Monitor in production:
                $ pm2 monitor

                Make pm2 auto-boot at server restart:
                $ pm2 startup

                To go further checkout:
                http://pm2.io/


                        -------------

[PM2] Init System found: systemd
Platform systemd
Template
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

[Service]
Type=forking
User=pi
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/pi/.pm2
PIDFile=/home/pi/.pm2/pm2.pid
Restart=on-failure

ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target

Target path
/etc/systemd/system/pm2-pi.service
Command list
[ 'systemctl enable pm2-pi' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-pi.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-pi...
Created symlink /etc/systemd/system/multi-user.target.wants/pm2-pi.service → /etc/systemd/system/pm2-pi.service.
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via:
$ pm2 save

[PM2] Remove init script via:
$ pm2 unstartup systemd
pi@raspib31:~ $ pm2 save
[PM2] Saving current process list...
[PM2] Successfully saved in /home/pi/.pm2/dump.pm2
pi@raspib31:~ $
Fehlerfrei - also Doku ist ok :)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 10 Dezember 2020, 11:48:35
Sag ja auch nicht das an der Doku was nicht OK ist.

Hab doch auch nix falsch gemacht ?
Hab den Dienst gestern Abend gestoppt und einfach nochmal den pm2 startup eingerichtet.
Merkwürdigerweise ohne Meldungen, hab zuvor keine Änderungen vorgenommen.

pi@FHEMPIOS:~ $ pm2 stop sonos2mqtt
[PM2] Applying action stopProcessId on app [sonos2mqtt](ids: [ 0 ])
[PM2] [sonos2mqtt](0) ✓
┌─────┬───────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name          │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼───────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ sonos2mqtt    │ default     │ N/A     │ fork    │ 0        │ 0      │ 0    │ stopped   │ 0%       │ 0b       │ pi       │ disabled │
└─────┴───────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
pi@FHEMPIOS:~ $ pm2 start sonos2mqtt -- --mqtt mqtt://user:passwd@192.168.188.26:1883
[PM2] Applying action restartProcessId on app [sonos2mqtt](ids: [ 0 ])
[PM2] [sonos2mqtt](0) ✓
[PM2] Process successfully started
┌─────┬───────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name          │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼───────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ sonos2mqtt    │ default     │ N/A     │ fork    │ 4044     │ 0s     │ 0    │ online    │ 0%       │ 20.1mb   │ pi       │ disabled │
└─────┴───────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
pi@FHEMPIOS:~ $ pm2 startup
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi
pi@FHEMPIOS:~ $ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi
[PM2] Init System found: systemd
Platform systemd
Template
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

[Service]
Type=forking
User=pi
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/pi/.pm2
PIDFile=/home/pi/.pm2/pm2.pid
Restart=on-failure

ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target

Target path
/etc/systemd/system/pm2-pi.service
Command list
[ 'systemctl enable pm2-pi' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-pi.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-pi...
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via:
$ pm2 save

[PM2] Remove init script via:
$ pm2 unstartup systemd
pi@FHEMPIOS:~ $ pm2 save
[PM2] Saving current process list...
[PM2] Successfully saved in /home/pi/.pm2/dump.pm2
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 10 Dezember 2020, 11:53:20
Aber gut zu wissen das es bei dir bei einem aktuellen System auch zu dieser Meldung während der Installation von s2m kommt:

npm WARN deprecated debug@4.1.1: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)
/usr/bin/sonos2mqtt -> /usr/lib/node_modules/sonos2mqtt/lib/index.js

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 10 Dezember 2020, 11:59:31
Nee - ich sehe auch nicht das Du was falsch gemacht hast - insofern war ich etwas unsicher ob ich bei der Variante pm2 start mit extra Parameter was übersehen / nicht komplett getestet hatte.

BTW: Ich glaube ich hatte noch nie ein npm setup wo nicht irgendwelche WARN Meldungen kamen. Beim ersten mal war ich unruhig, mittlerweile denke ich: das muss so ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 10 Dezember 2020, 18:22:45
ZitatNee - ich sehe auch nicht das Du was falsch gemacht hast

Ich jetzt schon, schau mal wie ich in #756 und #760 starte.




Es erfolgt schon wieder keine Ausgabe der speak-mp3  ::)

Erstellt wird das mp3-File, im Log steht 2020.12.10 17:58:48 3: MQTT2_DEVICE set Sonos_Wohnzimmer speak 20 Hallo
2020.12.10 17:58:48 3: MQTT2_DEVICE set Sonos_Wohnzimmer notify 20 http://192.168.188.26:8083/fhem/cache/71ce4185214eb43202358604a63cdcab.mp3

wenn gerade bspw. Radio spielt wird unterbrochen, es erfolgt keine Sprach-Ausgabe und nach kurzer Zeit wird Radio weiter gespielt.

Es ging doch sowas wie ein Live-Log wie mit journalctl ?

Mit debug starten wars nicht:

node /usr/lib/node_modules/sonos2mqtt/lib/index.js --mqtt mqtt://Thomas:3983@192.168.188.26:1883 --debug




Hab das auch schon länger auf dem Testsystem nicht mehr am laufen, das mit dem playFav ist richtig cool, wer hatte denn dazu die Idee  ;D

Hab jetzt noch nicht nachgeschaut, war das nicht schon soweit das die setList im Player nach einem get Favorites aktualisiert werden sollte ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 10 Dezember 2020, 18:52:18
ein set notify 20 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3 funktioniert?

Du meinst? pm2 list

Das mit den Favoriten steht alles im Wiki :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 10 Dezember 2020, 22:26:10
20 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3

ja klappt, jetzt weißt warum die speak-mp3 nicht abgespielt wird ?

pm2 list mein ich nicht, es gab doch zumindest eine Log-Datei, steh gerade auf dem Schlauch, find nix in /usr/lib/node_modules/sonos2mqtt
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 10 Dezember 2020, 22:44:59
nö :) ich fische im Trüben
Du kannst http://192.168.188.26:8083/fhem/cache/71ce4185214eb43202358604a63cdcab.mp3 von irgendwo im Browser aufrufen? Bei mir spielt er die Datei einfach ab.
Du hast allowed auf der 8083 ?

Es gibt noch ps2 monit

Es gibt in .pm2 ein log, also bei Dir /home/pi/.pm2
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 11 Dezember 2020, 09:37:20
Ja, klar die MP3s sind abspielbar egal über welchen Weg, ausser s2m.

Du meinst in WEB Port 8083 ? ja hab ich

Wenn ich ein notify speak 20 http://192.168.188.26:8083/opt/fhem/cache/06de3dbc7d0546bba712becac337a12c.mp3 absetze und die App geöffnet ist erscheint dort die Meldung "Wiedergabe von "06de3dbc7d0546bba712becac337a12c.mp3" nicht möglich -Zugriff verweigert.

Wie man sieht hab ich zuvor die Rechte dieser Datei zum Test extra noch angepasst:

pi@FHEMPIOS:/opt/fhem/cache $ ls -l
insgesamt 112
-rwxrwxrwx 1 fhem dialout  4320 Dez 10 22:21 06de3dbc7d0546bba712becac337a12c.mp3
-rw-r--r-- 1 fhem dialout  6720 Dez 10 23:47 397d496dbbdaba27b505fb9dd98ea0bc.mp3
-rw-r--r-- 1 fhem dialout  3072 Dez 10 01:41 4ee34d8b9472a513fc8eed96cb3ab001.mp3
-rw-r--r-- 1 fhem dialout  7584 Dez 10 02:21 61108f934dcaf085356aaaa6653feed8.mp3
-rw-r--r-- 1 fhem dialout  2784 Dez 10 01:39 6e8ac0b77c5f41b956364c4a092c6a13.mp3
-rw-r--r-- 1 fhem dialout  3072 Dez 10 17:58 71ce4185214eb43202358604a63cdcab.mp3
-rw-r--r-- 1 fhem dialout  3360 Dez 10 02:16 71f783ed67e131a66e252ec9b458daaf.mp3
-rw-r--r-- 1 fhem dialout 58464 Dez 11 00:17 abdfb95492825f06de1c0f19e75287c2.mp3
drwxr-xr-x 3 fhem dialout  4096 Dez 10 22:32 alexa-cookie
-rw-r--r-- 1 fhem dialout  4704 Dez 10 14:34 cf540f116c361ca6ce6cbb92578d20a4.mp3
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 11 Dezember 2020, 10:03:22
Aber mit allowed am Port 8083 müsstest Du das dem Sonos natürlich beibringen - ob das geht? Glaub ich nicht.
Dann mach doch ein separates Web ohne allowed.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 11 Dezember 2020, 10:28:41
Danke, klappt.

Bin aber der Meinung in Erinnerung zu haben das ich am Testserver WEB auch mit allowed abgesichert hatte, kann mich aber auch täuschen, hätt ichs besser mal aufgeschrieben.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 11 Dezember 2020, 10:57:21
Nächste Frage.

Wie löst du/ihr das mit der steigenden Anzahl von Dateien in cache ?

In der Doku zu Text2Speech findet man zu TTS_CacheFileDir

TTS_CacheFileDir
Optional: Die per Google geladenen Sprachbausteine werden in diesem Verzeichnis zur Wiedeverwendung abgelegt. Es findet zurZeit keine automatisierte Löschung statt.


War das automatische löschen mal vorgesehen, kommts noch oder gehts vlt. schon und ich übersehe was ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 11 Dezember 2020, 12:39:53
Ich habe TTS seit Jahren am Laufen, da wird den ganzen Tag geplappert: Temperatur, Mülltonne - ok eingeschränkt in der Vielfalt :)
809 Dateien und 17 MB /opt/fhem/cache

ich weiß nicht nach welchem Schema man da löschen sollte, wenn dann irgendwie einmal im Jahr alles, Zeit, Anzahl, Menge?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 11 Dezember 2020, 16:46:31
Nochmal dazu (https://forum.fhem.de/index.php/topic,111711.msg1078213/topicseen.html#msg1078213)

Spielerei aber ich mags so das die Dateiendung optional ist, also auch weggelassen werden kann

Für die Befehlszeile:

{ my $EVTPART2= "bla.mp3";;my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);;$lf eq ".mp3" ? $file : $file.'.mp3';;}


Klappt schon mal so wie ich mir das vorstelle.

Wenn ich im setter dann den Topic und die payload anhänge :

playSoundTest:textField {my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($$EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : $file.'.mp3';'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}

hab ich das im Log:

2020.12.11 16:24:36 3: MQTT2_DEVICE set Sonos_Wohnzimmer playSoundTest 20 Vibrating
2020.12.11 16:24:36 1: PERL WARNING: Useless use of private variable in void context at (eval 28206) line 1.
2020.12.11 16:24:36 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $NAME=   $evalSpecials->{'%NAME'};{my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($$EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : $file.'.mp3';'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}
2020.12.11 16:24:36 1: PERL WARNING: Useless use of concatenation (.) or string in void context at (eval 28206) line 1.
2020.12.11 16:24:36 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $NAME=   $evalSpecials->{'%NAME'};{my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($$EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : $file.'.mp3';'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}
2020.12.11 16:24:36 1: ERROR evaluating my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $NAME=   $evalSpecials->{'%NAME'};{my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($$EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : $file.'.mp3';'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}: Can't use string ("Vibrating") as a SCALAR ref while "strict refs" in use at (eval 28206) line 1.



Das ist der bisherige funktionierende setter :
playSound:textField {my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2.".mp3"; 'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}

Jemand einen Tipp ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 11 Dezember 2020, 17:00:30
$$EVTPART2
Du hattest Tatterich :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 11 Dezember 2020, 17:15:24
Klappts bei dir, das war nur ein c&p Fehler hier, das doppelte $$ hatte ich schon selbst bemerkt.

playSoundTest:textField {my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : $file.'.mp3';'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}


2020.12.11 17:10:45 3: MQTT2_DEVICE set Sonos_Wohnzimmer playSoundTest 20 Vibrating
2020.12.11 17:10:45 1: PERL WARNING: Useless use of private variable in void context at (eval 996) line 1.
2020.12.11 17:10:45 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $NAME=   $evalSpecials->{'%NAME'};{my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : $file.'.mp3';'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}
2020.12.11 17:10:45 1: PERL WARNING: Useless use of concatenation (.) or string in void context at (eval 996) line 1.
2020.12.11 17:10:45 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $NAME=   $evalSpecials->{'%NAME'};{my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : $file.'.mp3';'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 11 Dezember 2020, 17:34:36
Zitat von: TomLee am 11 Dezember 2020, 10:57:21
Nächste Frage.

Wie löst du/ihr das mit der steigenden Anzahl von Dateien in cache ?

In der Doku zu Text2Speech findet man zu TTS_CacheFileDir

TTS_CacheFileDir
Optional: Die per Google geladenen Sprachbausteine werden in diesem Verzeichnis zur Wiedeverwendung abgelegt. Es findet zurZeit keine automatisierte Löschung statt.



War das automatische löschen mal vorgesehen, kommts noch oder gehts vlt. schon und ich übersehe was ?

Bei mir läuft in der nacht ein Script, der u.a. alte Dateien löscht. Ich halte den Cache max. 1 Woche vor.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 11 Dezember 2020, 18:32:39
An der Stelle:
my $lf=substr($EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : $file.'.mp3';
gibst Du zwar was zurück - aber das verschwindet im Spannungsabfall
Sieht man hier
{my $EVTPART1 = 20;; my $EVTPART2 = 'willi';;my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);;$lf eq ".mp3" ? $file : ($file.'.mp3');;$file}
Wenn Du das Ergebnis wieder zuweist hat man was davon:
{my $EVTPART1 = 20;; my $EVTPART2 = 'willi';;my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);;$file=$lf eq ".mp3" ? $file : ($file.'.mp3');;$file}
Kompletter Test:
{my $EVTPART1 = 20;; my $EVTPART2 = 'willi';;my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);;$file=$lf eq ".mp3" ? $file : ($file.'.mp3');;'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}

Sieht zumindest gut aus? Die Fehlermeldung erschließt sich mir noch nicht.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 11 Dezember 2020, 19:16:46
Kurz ausprobiert, kann mich erst später oder morgen wieder mit beschäftigen.

Trotzdem wird nix abgespielt und es bleibt bei der Meldung im Log, sehe den Fehler nicht:

playSoundTest:textField {my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : ($file.'.mp3'); 'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}

2020.12.11 19:10:20 3: MQTT2_DEVICE set Sonos_Wohnzimmer playSoundTest 20 Vibrating
2020.12.11 19:10:20 1: PERL WARNING: Useless use of private variable in void context at (eval 9949) line 1.
2020.12.11 19:10:20 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $NAME=   $evalSpecials->{'%NAME'};{my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : ($file.'.mp3'); 'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}
2020.12.11 19:10:20 1: PERL WARNING: Useless use of concatenation (.) or string in void context at (eval 9949) line 1.
2020.12.11 19:10:20 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $NAME=   $evalSpecials->{'%NAME'};{my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : ($file.'.mp3'); 'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 11 Dezember 2020, 20:09:08
Kurz zwischendurch ausprobiert, kann ja nicht anders:

set Sonos_Wohnzimmer playSoundTest 20 Vibrating.mp3

also nicht

set Sonos_Wohnzimmer playSoundTest 20 Vibrating

wird abgespielt, aber trotzdem die Meldung:

2020.12.11 20:04:53 3: MQTT2_DEVICE set Sonos_Wohnzimmer playSoundTest 20 Vibrating.mp3
2020.12.11 20:04:53 1: PERL WARNING: Useless use of private variable in void context at (eval 15321) line 1.
2020.12.11 20:04:53 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $NAME=   $evalSpecials->{'%NAME'};{my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : ($file.".mp3"); 'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}
2020.12.11 20:04:53 1: PERL WARNING: Useless use of concatenation (.) or string in void context at (eval 15321) line 1.
2020.12.11 20:04:53 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $NAME=   $evalSpecials->{'%NAME'};{my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : ($file.".mp3"); 'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 11 Dezember 2020, 22:06:34
Und wenn Du das Beispiel aus dem Wiki nimmst?
https://wiki.fhem.de/wiki/Sonos2mqtt#Spiele_feste_Sounds. Das dann erweitert
playSound:textField {my $tts="SonosTTS";my ($cmd,$vol,$file)=split(' ', $EVENT,3);$file=($file=~m/.*\.mp3$/)?"$file":"$file.mp3";fhem("set $NAME notify $vol http://[$tts:host]/fhem/[a:$tts:TTS_CacheFileDir]/$file")}
Funktioniert mit und ohne mp3 :) Keine Fehlermeldung. Geht sicher noch kürzer
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 11 Dezember 2020, 23:15:10
Danke für die Hilfe. funzt.

Ich wär für einen aktualisierten playSound-setter im Wiki. :)

edit:

funzt bei mir nachdem ich dein Beispiel für mich angepasst habe, wegen dem zusätzlichen Ordner Toene (weil ja nur cache in [a:$tts:TTS_CacheFileDir] steht)

playSound:textField {my $tts="SonosTTS";my ($cmd,$vol,$file)=split(' ', $EVENT,3);$file=($file=~m/.*\.mp3$/)?"$file":"$file.mp3";fhem("set $NAME notify $vol http://[$tts:host]/fhem/cache/Toene/$file")}

edit2:

hab wirklich nicht viel Sprachansagen definiert, durch die Umstellung von PlayURITemp auf playSound (ohne Dateiendung) ist meine fhem.cfg um 1728 Zeichen kleiner geworden
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 12 Dezember 2020, 11:41:18
Kann man den Status der Bridge (also den JSON) zu sonos/connected:.* connected mit einem Kommando nochmal anfordern ?

Hintergrund ist der das ich mich jetzt ja zum Start mit pm2 im System entschieden habe (weil ich das dazu zusätzlich (un)nötige notify nicht mag) und jetzt nach einem restart von FHEM angeblich offline ist.

Hab zwar noch keine bessere Idee wie das Kommando (wenn es eins gibt) periodisch (periodicCmd) abzusetzen, aber Hauptsache ich brauch nicht zusätzlich das notify  :P


Hat zwar nichts mit periodisch zu tun, cool wäre wenn man in periodicCmd auf Events reagieren könnte.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 12 Dezember 2020, 12:40:18
Nochmal darüber Gedanken gemacht und ich hab ein Verständnisproblem.

https://svrooij.io/sonos2mqtt/topics.html#connect-messages (https://svrooij.io/sonos2mqtt/topics.html#connect-messages)
ZitatThis bridge uses the sonos/connected topic to send retained connection messages. Use this topic to check your sonos bridge is still running.

Müsste der Status nicht auch nach einem restart erhalten bleiben ?
MQTT2_Server sich diese retain message merken bis was anderes geschickt wurde ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 12 Dezember 2020, 13:17:25
steht bei mir auch drin: "sonos/connected":"2"

aber eine Idee dazu hab ich erstmal nicht.

Aber mal ehrlich
Zitat(weil ich das dazu zusätzlich (un)nötige notify nicht mag)
Dafür jetzt ein extra Dienst, der unter einem anderen User läuft und sich (auch) deswegen aus FHEM heraus nicht einfach steuern lässt.  ;D
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 12 Dezember 2020, 13:58:00
Zitatsteht bei mir auch drin: "sonos/connected":"2"

Weil dein notify beim Neustart ein pm2 start ... ausführt.
Ob start oder restart macht keinen Unterschied, s2m schickt also wieder den Status.
Deaktivier mal dein notify und mach dann einen restart von Fhem, hast dann immer noch die 2 drin ?
Denke nicht, der Dienst ist doch aber noch am laufen, MQTT2-Server hat aber den Status vergessen.




ZitatDafür jetzt ein extra Dienst, der unter einem anderen User läuft und sich (auch) deswegen aus FHEM heraus nicht einfach steuern lässt.  ;D

Wsl. hab ich da auch ein Verständnisproblem, vlt dämmert da schon leicht was das es von Vorteil sein kann den Dienst aus FHEM zu steuern (bspw. beim testen), aber nur um den korrekten Status zu erhalten bin ich der Meinung ist MQTT zuständig und ich muss dazu nicht extra den Dienst neu starten.
Wozu muss ich denn den Dienst steuern können ?
Der wird doch einmal bei Systemstart gestartet und läuft doch.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 12 Dezember 2020, 15:43:10
Naja wenn ich das notify deaktiviere  wird pm2 start nicht ausgeführt - richtig. Aber da alles in der fhem.save gesichert ist, ist nach dem Start alles beim Alten. ;)
Also ich weiß nicht wie man dieses "Problem" jetzt beheben könnte. Ich hatte damit noch nie eins. Ich wusste auch noch nie warum man auf diesen Status der Bridge schauen muss.
Auch ein unnötiger Neustart von pm2 beim Neustart von FHEM leistet keinen Beitrag zu Nichts.

Seit dem ich mich mit diesem Thema beschäftige, war einmal die Steuerung von Sonos weg (daran merkt man es sofort) - da war es simpel pm2 neu zu starten und in kürzester Zeit lief alles wieder.
Ich habe in der Zeit einmal die Sonos Landschaft erweitert, da hat ein checkSubscription nicht geholfen, wenn ich mich richtig erinnere. Auch da tat es ein Neustart pm2. :)
Ich habe Testweise immer mal einen Player aus. Wenn der wieder an ist, braucht es ein checkSubscription. Das macht der sonos2mqtt ja auch von selbst :) wenn man es nicht eilig hat.

Ansonsten musst ich noch nie das beinahe tägliche disable/enable des konventionellen Sonos Moduls machen - es läuft einfach.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 12 Dezember 2020, 16:01:32
ZitatAber da alles in der fhem.save gesichert ist, ist nach dem Start alles beim Alten.
Ja so dacht ich auch, nach einem restart von FHEM ist aber bei mir wie geschildert der Eintrag "sonos/connected":"2" im RETAIN-Reading des MQTT2-Server auf 0, obwohl der Dienst doch in der Zeit ganz normal weiterläuft.

Und auf den Status der Bridge schau ich auch nicht ständig , habs nur gern einheitlich aufgebaut, siehe Bild.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 12 Dezember 2020, 16:16:25
Bei mir steht immer noch ,"sonos/connected":"2"} am Ende im retain - welches aktualisiert wurde.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 12 Dezember 2020, 19:14:24
@TomLee vergiss was ich oben gesagt habe. Da ich den pm2 in FHEM starte, wird der konsequenterweise auch korrekt beendet wenn ich FHEM korrekt beende.
Wenn ich also das notify deaktiviere, wird pm2 auch nicht wieder gestartet. Sonos sieht zwar gut aus - funktioniert aber nicht. Habe ich vorhin nicht geprüft.

Eigentlich spricht auch das genau dafür, es so zu tun? Es sei denn man braucht den PM2 Prozess wo anders.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 12 Dezember 2020, 19:56:18
Um herauszufinden an was es liegt hab ich bisher folgendes gemacht/festgestellt:

FHEM beendet, im File /opt/fhem/log/fhem.save geschaut was drin steht -> connected 2

FHEM gestartet  -> connected 0 (Dienst läuft aber)

Auch wenn ich MQTT2_Server auf disable stelle die Clients verbinden sich trotzdem/Readings aktualisieren sich (vom MQTT2_Server) (Bridge geht auf connected 0) nach einem restart.

Weiter überlegt.
Dann, nachdem ich zwischendurch mal ein pm2 restart sonos2mqtt gemacht hatte (connected also wieder 2), FileLog gelöscht, MQTT2_Server auf verbose 5 gestellt, wieder ein pm2 restart sonos2mqtt gemacht, FHEM restart, LogFile (hoffentlich nicht zuviel) bereinigt und hier jetzt angehängt.

Interpretieren versuch ich jetzt  ;D




Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 13 Dezember 2020, 14:19:46
Mal anders, kannst du das bei Gelegenheit bitte mal bei dir nachvollziehen (notify deaktivieren (speichern  :D) und im Terminal manuell starten, FHEM Neustart) ?

Hab jetzt mit pm2 delete sonos2mqtt das Startup Script gelöscht und nur manuell gestartet -> pm2 start sonos2mqtt -- --mqtt mqtt://user:passwd@127.0.0.1:1883 - gleiches geschildertes Verhalten, nach restart von FHEM sagt die Bridge offline, es funzt aber weiterhin alles, s2m läuft ja weiterhin.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 13 Dezember 2020, 15:57:58
notify deaktiviert und save gemacht :)
"pm2 stop sonos2mqtt"
Bridge connected 0
Im Terminal sudo -u fhem pm2 start sonos2mqtt dann sudo -u fhem pm2 monit um zu kontrollieren das er durchläuft ✔
Bridge connected 2
shutdown restart
Bridge connected 2
Wobei das Reading den alten Timestamp hat ;)
Das Retain Reading im MQTT2_SERVER wird neu gesetzt, hat also den Timestamp vom Restart.
Im pm2 monit kann man den reconnect beobachten
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 13 Dezember 2020, 18:37:22
Verstehe es einfach nicht.

Mit welcher Version hast du zuletzt getestet ?
Mit 3.1.0 wie oben schonmal, also der aktuellsten ?

Wenn ich starte:

pi@FHEMPIOS:~ $ pm2 start sonos2mqtt -- --mqtt mqtt://user:passwd@192.168.188.26:1883

sieht das mit pm2 monit so aus:

2020-12-13T16:45:41.001Z [Information] Starting sonos2mqtt v3.1.0
2020-12-13T16:45:41.054Z [Information] LogLevel changed to information
2020-12-13T16:45:41.353Z [Information] Found 1 sonos speakers
2020-12-13T16:45:41.659Z [Information] Mqtt connection changed to connected:


Das Reading der Bridge:

setstate MQTT2_sonos_Bridge 2020-12-13 17:45:41 connected 2


Mach ich einen restart von FHEM:

2020-12-13T16:45:41.001Z [Information] Starting sonos2mqtt v3.1.0
2020-12-13T16:45:41.054Z [Information] LogLevel changed to information
2020-12-13T16:45:41.353Z [Information] Found 1 sonos speakers
2020-12-13T16:45:41.659Z [Information] Mqtt connection changed to connected:
2020-12-13T16:51:52.092Z [Warning] Mqtt offline 192.168.188.26:1883
2020-12-13T16:51:52.093Z [Information] Mqtt connection changed to connected:
2020-12-13T16:51:53.095Z [Information] Mqtt reconnecting 192.168.188.26:1883
2020-12-13T16:51:53.102Z [Information] Mqtt connection changed to connected:
2020-12-13T16:51:54.102Z [Information] Mqtt reconnecting 192.168.188.26:1883
2020-12-13T16:51:54.106Z [Information] Mqtt connection changed to connected:
2020-12-13T16:51:55.106Z [Information] Mqtt reconnecting 192.168.188.26:1883
2020-12-13T16:51:55.114Z [Information] Mqtt connection changed to connected:
2020-12-13T16:51:56.114Z [Information] Mqtt reconnecting 192.168.188.26:1883
2020-12-13T16:51:56.118Z [Information] Mqtt connection changed to connected:
2020-12-13T16:51:57.119Z [Information] Mqtt reconnecting 192.168.188.26:1883
2020-12-13T16:52:27.124Z [Information] Mqtt connection changed to connected:
2020-12-13T16:52:28.123Z [Information] Mqtt reconnecting 192.168.188.26:1883
2020-12-13T16:52:58.126Z [Information] Mqtt connection changed to connected:
2020-12-13T16:52:59.126Z [Information] Mqtt reconnecting 192.168.188.26:1883
2020-12-13T16:53:05.959Z [Information] Mqtt connection changed to connected:


Mehr kommt und sieht man auch nicht.

In der Bridge dann:
setstate MQTT2_sonos_Bridge 2020-12-13 17:53:02 connected 0

Weshalb kann s2m gleich im Anschluss wieder connecten, ist der MQTT2_Server so schnell wieder erreichbar ? ? ?

Frag mich nicht warum eine Stunde Unterschied die korrekte Zeit hab ich eingestellt.

Wie starte ich denn nochmal richtig im debug Modus ?

So scheinbar nicht:

pm2 start sonos2mqtt -- --mqtt mqtt://user:passwd@192.168.188.26:1883 --debug

Dann steht trotzdem in pm2 monit:

Zitat2020-12-13T17:11:05.259Z [Information] Starting sonos2mqtt v3.1.0
sonos2mqtt > 2020-12-13T17:11:05.295Z [Information] LogLevel changed to information
sonos2mqtt > 2020-12-13T17:11:05.510Z [Information] Found 1 sonos speakers

Bei Metadata:

Namespace             default
Version               N/A
Restarts              0
Uptime                0 
Script path           /usr/bin/sonos2mqtt
Script args           --mqtt mqtt://user:passwd@192.168.188.26:1883 --debug
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 13 Dezember 2020, 19:24:43
Ja ich habe die aktuelle.
Ich denke die Stunde kommt daher, dass die intern wieder UTC verwenden :)
Der restart von FHEM vorhin sah so aus:
|[ 0] sonos2mqtt      Mem:  45 MB    CPU:   ││ sonos2mqtt > 2020-12-13T14:55:28.019Z [Warning] Mqtt offline 127.0.0.1                                 │
│                                           ││ sonos2mqtt > 2020-12-13T14:55:28.020Z [Information] Mqtt connection changed to connected: false        │
│                                           ││ sonos2mqtt > 2020-12-13T14:55:29.020Z [Information] Mqtt reconnecting 127.0.0.1                        │
│                                           ││ sonos2mqtt > 2020-12-13T14:55:29.023Z [Information] Mqtt connection changed to connected: false        │
│                                           ││ sonos2mqtt > 2020-12-13T14:55:30.024Z [Information] Mqtt reconnecting 127.0.0.1                        │
│                                           ││ sonos2mqtt > 2020-12-13T14:55:30.336Z [Information] Mqtt connection changed to connected: true

Dein Fenster war zu schmal :) - aber bei mir versucht er nur zweimal und ist dann connected. Kann ja bei Dir wegen allowed 5 mal mehr hin und her gehen?
https://svrooij.io/sonos2mqtt/getting-started.html  Debugmodus --log Set the loglevel [choices: "warning", "information", "debug"] [default: "information"]

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 13 Dezember 2020, 20:04:50
ZitatDein Fenster war zu schmal :)

;D, ich habs jetzt aber verkleinert, um mehr zu sehen :P


Letzte mal mir reichts mit dem Thema für heute:

sonos2mqtt > 2020-12-13T18:41:56.422Z [Information] Mqtt connection changed to connected: false                              │
│                                                    ││ sonos2mqtt > 2020-12-13T18:41:56.422Z [Debug] Mqtt connection closed with 192.168.188.26:1883                                │
│                                                    ││ sonos2mqtt > 2020-12-13T18:42:03.110Z [Information] Starting sonos2mqtt v3.1.0                                               │
│                                                    ││ sonos2mqtt > 2020-12-13T18:42:03.140Z [Information] LogLevel changed to debug                                                │
│                                                    ││ sonos2mqtt > 2020-12-13T18:42:03.632Z [Information] Found 1 sonos speakers                                                   │
│                                                    ││ sonos2mqtt > 2020-12-13T18:42:03.633Z [Debug] Setting up mqtt events                                                         │
│                                                    ││ sonos2mqtt > 2020-12-13T18:42:03.970Z [Debug] Connected to server 192.168.188.26:1883                                        │
│                                                    ││ sonos2mqtt > 2020-12-13T18:42:03.970Z [Information] Mqtt connection changed to connected: true                               │
│                                                    ││ sonos2mqtt > 2020-12-13T18:43:48.045Z [Warning] Mqtt offline 192.168.188.26:1883                                             │
│                                                    ││ sonos2mqtt > 2020-12-13T18:43:48.045Z [Information] Mqtt connection changed to connected: false                              │
│                                                    ││ sonos2mqtt > 2020-12-13T18:43:48.045Z [Debug] Mqtt connection closed with 192.168.188.26:1883                                │
│                                                    ││ sonos2mqtt > 2020-12-13T18:43:49.046Z [Information] Mqtt reconnecting 192.168.188.26:1883                                    │
│                                                    ││ sonos2mqtt > 2020-12-13T18:43:49.053Z [Information] Mqtt connection changed to connected: false                              │
│                                                    ││ sonos2mqtt > 2020-12-13T18:43:49.054Z [Debug] Mqtt connection closed with 192.168.188.26:1883                                │
│                                                    ││ sonos2mqtt > 2020-12-13T18:43:50.054Z [Information] Mqtt reconnecting 192.168.188.26:1883                                    │
│                                                    ││ sonos2mqtt > 2020-12-13T18:43:50.058Z [Information] Mqtt connection changed to connected: false                              │
│                                                    ││ sonos2mqtt > 2020-12-13T18:43:50.058Z [Debug] Mqtt connection closed with 192.168.188.26:1883                                │
│                                                    ││ sonos2mqtt > 2020-12-13T18:43:51.059Z [Information] Mqtt reconnecting 192.168.188.26:1883                                    │
│                                                    ││ sonos2mqtt > 2020-12-13T18:43:51.065Z [Information] Mqtt connection changed to connected: false                              │
│                                                    ││ sonos2mqtt > 2020-12-13T18:43:51.065Z [Debug] Mqtt connection closed with 192.168.188.26:1883                                │
│                                                    ││ sonos2mqtt > 2020-12-13T18:43:52.065Z [Information] Mqtt reconnecting 192.168.188.26:1883                                    │
│                                                    ││ sonos2mqtt > 2020-12-13T18:43:52.071Z [Information] Mqtt connection changed to connected: false                              │
│                                                    ││ sonos2mqtt > 2020-12-13T18:43:52.071Z [Debug] Mqtt connection closed with 192.168.188.26:1883                                │
│                                                    ││ sonos2mqtt > 2020-12-13T18:43:53.072Z [Information] Mqtt reconnecting 192.168.188.26:1883                                    │
│                                                    ││ sonos2mqtt > 2020-12-13T18:44:23.075Z [Information] Mqtt connection changed to connected: false                              │
│                                                    ││ sonos2mqtt > 2020-12-13T18:44:23.075Z [Debug] Mqtt connection closed with 192.168.188.26:1883                                │
│                                                    ││ sonos2mqtt > 2020-12-13T18:44:24.074Z [Information] Mqtt reconnecting 192.168.188.26:1883                                    │
│                                                    ││ sonos2mqtt > 2020-12-13T18:44:52.906Z [Debug] Connected to server 192.168.188.26:1883                                        │
│                                                    ││ sonos2mqtt > 2020-12-13T18:44:52.906Z [Information] Mqtt connection changed to connected: true

mehr passiert nicht

setstate MQTT2_sonos_Bridge 2020-12-13 19:44:45 connected 0

defmod MQTT2_Server MQTT2_SERVER 1883 global
attr MQTT2_Server room MQTT2_DEVICE

setstate MQTT2_Server 2020-12-13 19:55:54 RETAIN {"Smarthome/Badezimmer/Badezimmer_Rest/tele/LWT":"Online","dumm/bla":"{ ReadingsVal(\u0022xd_vacuum\u0022, \u0022state\u0022,0)}","ebusd/global/running":"true","ebusd/global/updatecheck":"\u0022version 3.4 available\u0022","ebusd/global/version":"\u0022ebusd 3.3.v3.3\u0022","homeassistant/music_player/RINCON_000E58F7F67C01400/sonos/config":"{\u0022available_commands\u0022:[\u0022adv-command\u0022,\u0022clearqueue\u0022,\u0022command\u0022,\u0022joingroup\u0022,\u0022leavegroup\u0022,\u0022mute\u0022,\u0022next\u0022,\u0022notify\u0022,\u0022pause\u0022,\u0022play\u0022,\u0022playmode\u0022,\u0022previous\u0022,\u0022queue\u0022,\u0022seek\u0022,\u0022selecttrack\u0022,\u0022setavtransporturi\u0022,\u0022sleep\u0022,\u0022speak\u0022,\u0022stop\u0022,\u0022switchtoline\u0022,\u0022switchtoqueue\u0022,\u0022switchtotv\u0022,\u0022toggle\u0022,\u0022unmute\u0022,\u0022volume\u0022,\u0022volumedown\u0022,\u0022volumeup\u0022],\u0022command_topic\u0022:\u0022sonos/RINCON_000E58F7F67C01400/control\u0022,\u0022device\u0022:{\u0022identifiers\u0022:[\u0022RINCON_000E58F7F67C01400\u0022],\u0022manufacturer\u0022:\u0022Sonos\u0022,\u0022name\u0022:\u0022Wohnzimmer\u0022},\u0022device_class\u0022:\u0022speaker\u0022,\u0022icon\u0022:\u0022mdi:speaker\u0022,\u0022json_attributes\u0022:true,\u0022json_attributes_topic\u0022:\u0022sonos/RINCON_000E58F7F67C01400\u0022,\u0022name\u0022:\u0022Wohnzimmer\u0022,\u0022state_topic\u0022:\u0022sonos/RINCON_000E58F7F67C01400\u0022,\u0022unique_id\u0022:\u0022sonos2mqtt_RINCON_000E58F7F67C01400_speaker\u0022,\u0022availability_topic\u0022:\u0022sonos/connected\u0022,\u0022payload_available\u0022:\u00222\u0022}","milight/LWT":"{\u0022status\u0022:\u0022connected\u0022,\u0022firmware\u0022:\u0022milight-hub\u0022,\u0022version\u0022:\u00221.10.5\u0022,\u0022ip_address\u0022:\u0022192.168.188.55\u0022,\u0022reset_reason\u0022:\u0022Software/System restart\u0022}","milight/states/0x2B67/rgb_cct/1":"{\u0022state\u0022:\u0022OFF\u0022,\u0022status\u0022:\u0022OFF\u0022,\u0022bulb_mode\u0022:\u0022white\u0022,\u0022effect\u0022:\u0022white_mode\u0022,\u0022device_id\u0022:11111,\u0022device_type\u0022:\u0022rgb_cct\u0022}","milight/states/0x2B67/rgbw/0":"{\u0022state\u0022:\u0022OFF\u0022,\u0022status\u0022:\u0022OFF\u0022,\u0022bulb_mode\u0022:\u0022white\u0022,\u0022effect\u0022:\u0022white_mode\u0022,\u0022device_id\u0022:11111,\u0022device_type\u0022:\u0022rgbw\u0022}","milight/states/0x2B67/rgbw/1":"{\u0022state\u0022:\u0022ON\u0022,\u0022status\u0022:\u0022ON\u0022,\u0022brightness\u0022:255,\u0022level\u0022:100,\u0022hue\u0022:230,\u0022color\u0022:{\u0022r\u0022:0,\u0022g\u0022:42,\u0022b\u0022:255},\u0022bulb_mode\u0022:\u0022color\u0022,\u0022device_id\u0022:11111,\u0022device_type\u0022:\u0022rgbw\u0022}","milight/states/0x2B67/rgbw/2":"{\u0022state\u0022:\u0022OFF\u0022,\u0022status\u0022:\u0022OFF\u0022,\u0022bulb_mode\u0022:\u0022white\u0022,\u0022effect\u0022:\u0022white_mode\u0022,\u0022device_id\u0022:11111,\u0022device_type\u0022:\u0022rgbw\u0022}","milight/states/0x2B67/rgbw/3":"{\u0022state\u0022:\u0022OFF\u0022,\u0022status\u0022:\u0022OFF\u0022,\u0022bulb_mode\u0022:\u0022white\u0022,\u0022effect\u0022:\u0022white_mode\u0022,\u0022device_id\u0022:11111,\u0022device_type\u0022:\u0022rgbw\u0022}","milight/states/0x8D56/cct/1":"{}","milight/states/0x8D56/rgb_cct/1":"{\u0022state\u0022:\u0022OFF\u0022,\u0022status\u0022:\u0022OFF\u0022,\u0022hue\u0022:134,\u0022color\u0022:{\u0022r\u0022:255,\u0022g\u0022:255,\u0022b\u0022:255},\u0022bulb_mode\u0022:\u0022color\u0022,\u0022device_id\u0022:36182,\u0022device_type\u0022:\u0022rgb_cct\u0022}","milight/states/0x8D56/rgbw/0":"{\u0022state\u0022:\u0022OFF\u0022,\u0022status\u0022:\u0022OFF\u0022,\u0022bulb_mode\u0022:\u0022white\u0022,\u0022effect\u0022:\u0022white_mode\u0022,\u0022device_id\u0022:36182,\u0022device_type\u0022:\u0022rgbw\u0022}","milight/states/0x8D56/rgbw/1":"{\u0022state\u0022:\u0022ON\u0022,\u0022status\u0022:\u0022ON\u0022,\u0022brightness\u0022:255,\u0022level\u0022:100,\u0022bulb_mode\u0022:\u0022white\u0022,\u0022effect\u0022:\u0022white_mode\u0022,\u0022device_id\u0022:36182,\u0022device_type\u0022:\u0022rgbw\u0022}","milight/states/0x8D56/rgbw/2":"{\u0022state\u0022:\u0022OFF\u0022,\u0022status\u0022:\u0022OFF\u0022,\u0022device_id\u0022:36182,\u0022device_type\u0022:\u0022rgbw\u0022}","shellies/shelly4pro-355132/input/0":"0","shellies/shelly4pro-355132/input/1":"0","shellies/shelly4pro-355132/input/2":"0","shellies/shelly4pro-355132/input/3":"0","shellies/shelly4pro-355132/relay/0":"on","shellies/shelly4pro-355132/relay/0/energy":"15051341","shellies/shelly4pro-355132/relay/0/power":"758.57","shellies/shelly4pro-355132/relay/1":"off","shellies/shelly4pro-355132/relay/1/power":"0.00","shellies/shelly4pro-355132/relay/2":"off","shellies/shelly4pro-355132/relay/2/power":"0.00","shellies/shelly4pro-355132/relay/3":"off","shellies/shelly4pro-355132/relay/3/power":"0.00","sonos/RINCON_000E58F7F67C01400":"{\u0022uuid\u0022:\u0022RINCON_000E58F7F67C01400\u0022,\u0022name\u0022:\u0022Wohnzimmer\u0022,\u0022groupName\u0022:\u0022Wohnzimmer\u0022,\u0022coordinatorUuid\u0022:\u0022RINCON_000E58F7F67C01400\u0022,\u0022currentTrack\u0022:{\u0022AlbumArtUri\u0022:\u0022https://cdn-profiles.tunein.com/s20293/images/logoq.png?t=1\u0022,\u0022Title\u0022:\u0022Tune.ashx?id=e125649567&amp;;sid=s20293&amp;;formats=aac,mp3,hls&amp;;partnerId=rjyYMwEH&amp;;serial=AHFLNOA3T2XT6VWH2BAPMLPWOGLA\u0022,\u0022UpnpClass\u0022:\u0022object.item\u0022,\u0022ItemId\u0022:\u0022-1\u0022,\u0022ParentId\u0022:\u0022-1\u0022,\u0022TrackUri\u0022:\u0022mms://http://opml.radiotime.com/Tune.ashx?id=e125649567&sid=s20293&formats=aac,mp3,hls&partnerId=rjyYMwEH&serial=AHFLNOA3T2XT6VWH2BAPMLPWOGLA\u0022,\u0022ProtocolInfo\u0022:\u0022mms:*:*:*\u0022},\u0022enqueuedMetadata\u0022:{\u0022AlbumArtUri\u0022:\u0022https://cdn-profiles.tunein.com/s20293/images/logoq.png?t=1\u0022,\u0022Title\u0022:\u002290.1 SWR4 Baden-Württemberg Stuttgart\u0022,\u0022UpnpClass\u0022:\u0022object.item.audioItem.audioBroadcast\u0022,\u0022ItemId\u0022:\u0022-1\u0022,\u0022ParentId\u0022:\u0022-1\u0022},\u0022transportState\u0022:\u0022STOPPED\u0022,\u0022playmode\u0022:\u0022NORMAL\u0022,\u0022ts\u0022:1607884924017,\u0022volume\u0022:{\u0022Master\u0022:13,\u0022LF\u0022:100,\u0022RF\u0022:100},\u0022mute\u0022:{\u0022Master\u0022:false,\u0022LF\u0022:false,\u0022RF\u0022:false},\u0022bass\u0022:3,\u0022treble\u0022:-5}","sonos/connected":"0","t":"ofline","tasmota/discovery/5CCF7FE76FEF/config":"{\u0022ip\u0022:\u0022192.168.188.52\u0022,\u0022dn\u0022:\u0022Tasmota\u0022,\u0022fn\u0022:[\u0022Tasmota\u0022,null,null,null,null,null,null,null],\u0022hn\u0022:\u0022DVES_E76FEF-4079\u0022,\u0022mac\u0022:\u00225CCF7FE76FEF\u0022,\u0022md\u0022:\u0022Sonoff Basic\u0022,\u0022ofln\u0022:\u0022Offline\u0022,\u0022onln\u0022:\u0022Online\u0022,\u0022state\u0022:[\u0022off\u0022,\u0022on\u0022,\u0022toggle\u0022,\u0022hold\u0022],\u0022sw\u0022:\u00228.5.1\u0022,\u0022t\u0022:\u0022DVES_E76FEF\u0022,\u0022ft\u0022:\u0022%prefix%/%topic%/\u0022,\u0022tp\u0022:[\u0022cmnd\u0022,\u0022stat\u0022,\u0022tele\u0022],\u0022rl\u0022:[1,0,0,0,0,0,0,0],\u0022swc\u0022:[-1,-1,-1,-1,-1,-1,-1,-1],\u0022btn\u0022:[0,0,0,0],\u0022so\u0022:{\u002211\u0022:0,\u002213\u0022:0,\u002217\u0022:0,\u002220\u0022:0,\u002230\u0022:0,\u002268\u0022:0,\u002273\u0022:0,\u002280\u0022:0},\u0022lk\u0022:1,\u0022lt_st\u0022:0,\u0022ver\u0022:1}","tasmota/discovery/5CCF7FE76FEF/sensors":"{\u0022sn\u0022:{\u0022Time\u0022:\u00222020-10-20T14:44:30\u0022},\u0022ver\u0022:1}","tasmota/discovery/60019455F827/config":"{\u0022ip\u0022:\u0022192.168.188.68\u0022,\u0022dn\u0022:\u0022SonoffObi\u0022,\u0022fn\u0022:[\u0022SonoffObi\u0022,null,null,null,null,null,null,null],\u0022hn\u0022:\u0022Smarthome/Badezimmer/Badezimmer\u0022,\u0022mac\u0022:\u002260019455F827\u0022,\u0022md\u0022:\u0022Generic\u0022,\u0022ty\u0022:0,\u0022if\u0022:0,\u0022ofln\u0022:\u0022Offline\u0022,\u0022onln\u0022:\u0022Online\u0022,\u0022state\u0022:[\u0022off\u0022,\u0022on\u0022,\u0022toggle\u0022,\u0022hold\u0022],\u0022sw\u0022:\u00229.1.0\u0022,\u0022t\u0022:\u0022Smarthome/Badezimmer/Badezimmer_Rest\u0022,\u0022ft\u0022:\u0022%topic%/%prefix%/\u0022,\u0022tp\u0022:[\u0022cmnd\u0022,\u0022stat\u0022,\u0022tele\u0022],\u0022rl\u0022:[1,0,0,0,0,0,0,0],\u0022swc\u0022:[-1,-1,-1,-1,-1,-1,-1,-1],\u0022swn\u0022:[null,null,null,null,null,null,null,null],\u0022btn\u0022:[0,0,0,0],\u0022so\u0022:{\u00224\u0022:0,\u002211\u0022:0,\u002213\u0022:0,\u002217\u0022:0,\u002220\u0022:0,\u002230\u0022:0,\u002268\u0022:0,\u002273\u0022:0,\u002282\u0022:0,\u0022114\u0022:0},\u0022lk\u0022:1,\u0022lt_st\u0022:0,\u0022ver\u0022:1}","tasmota/discovery/60019455F827/sensors":"{\u0022sn\u0022:{\u0022Time\u0022:\u00222020-12-09T01:04:04\u0022},\u0022ver\u0022:1}","tasmota/discovery/A020A616D18C/config":"{\u0022ip\u0022:\u0022192.168.188.35\u0022,\u0022dn\u0022:\u0022Tasmota\u0022,\u0022fn\u0022:[\u0022Tasmota\u0022,null,null,null,null,null,null,null],\u0022hn\u0022:\u0022sensorkrake-4492\u0022,\u0022mac\u0022:\u0022A020A616D18C\u0022,\u0022md\u0022:\u0022Generic\u0022,\u0022ty\u0022:0,\u0022if\u0022:0,\u0022ofln\u0022:\u0022Offline\u0022,\u0022onln\u0022:\u0022Online\u0022,\u0022state\u0022:[\u0022OFF\u0022,\u0022ON\u0022,\u0022TOGGLE\u0022,\u0022HOLD\u0022],\u0022sw\u0022:\u00229.1.0\u0022,\u0022t\u0022:\u0022sensorkrake\u0022,\u0022ft\u0022:\u0022%prefix%/%topic%/\u0022,\u0022tp\u0022:[\u0022cmnd\u0022,\u0022stat\u0022,\u0022tele\u0022],\u0022rl\u0022:[0,0,0,0,0,0,0,0],\u0022swc\u0022:[-1,-1,-1,-1,-1,-1,-1,-1],\u0022swn\u0022:[null,null,null,null,null,null,null,null],\u0022btn\u0022:[0,0,0,0],\u0022so\u0022:{\u00224\u0022:0,\u002211\u0022:0,\u002213\u0022:0,\u002217\u0022:0,\u002220\u0022:0,\u002230\u0022:0,\u002268\u0022:0,\u002273\u0022:0,\u002282\u0022:0,\u0022114\u0022:0},\u0022lk\u0022:1,\u0022lt_st\u0022:0,\u0022ver\u0022:1}","tasmota/discovery/A020A616D18C/sensors":"{\u0022sn\u0022:{\u0022Time\u0022:\u00222020-12-12T13:17:09\u0022},\u0022ver\u0022:1}","tele/DVES_12F2A2/LWT":"Offline","tele/DVES_55F827/LWT":"Offline","tele/DVES_E76FEF/LWT":"Offline","tele/irgendwas/LWT":"Offline","tele/sensorkrake/LWT":"Offline","tele/solarmax44009/LWT":"Offline","tele/sonoffDual_schaltschrank/LWT":"Online","tele/sonoffOBI/LWT":"Offline","tele/sonoff_pir_flurkueche/LWT":"offline","tele/tasmota/LWT":"Online","tele/tasmota_12F2A2/LWT":"Offline","tele/tasmota_16D18C/LWT":"Offline","tele/tasmota_53D765/LWT":"Offline","tele/tasmota_53D91D/LWT":"Offline","tele/tasmota_E76FEF/LWT":"Offline","tele/tasmotair/LWT":"Offline","tele/tasmotairwz/LWT":"Online","tele/tasmotargbwbulb1/LWT":"Offline","tele/wassermelder/LWT":"offline","wled/538e36/c":"#00000A","wled/538e36/g":"0","wled/538e36/status":"offline","wled/538e36/v":"<?xml version=\u00221.0\u0022 ?><vs><ac>0</ac><cl>0</cl><cl>0</cl><cl>10</cl><cs>0</cs><cs>0</cs><cs>0</cs><ns>0</ns><nr>1</nr><nl>0</nl><nf>1</nf><nd>60</nd><nt>0</nt><fx>95</fx><sx>30</sx><ix>61</ix><fp>0</fp><wv>0</wv><ws>0</ws><ps>0</ps><cy>0</cy><ds>WLED</ds><ss>0</ss></vs>","zigbee2mqtt/bridge/config":"{\u0022commit\u0022:\u002204c15f7\u0022,\u0022coordinator\u0022:{\u0022meta\u0022:{\u0022maintrel\u0022:0,\u0022majorrel\u0022:2,\u0022minorrel\u0022:0,\u0022product\u0022:0,\u0022revision\u0022:\u0022\u0022,\u0022transportrev\u0022:2},\u0022type\u0022:\u0022zStack12\u0022},\u0022log_level\u0022:\u0022info\u0022,\u0022network\u0022:{\u0022channel\u0022:11,\u0022extendedPanID\u0022:\u00220xdddddddddddddddd\u0022,\u0022panID\u0022:6754},\u0022permit_join\u0022:true,\u0022version\u0022:\u00221.16.2\u0022}","zigbee2mqtt/bridge/state":"online"}
setstate MQTT2_Server 2020-12-13 19:37:04 lastPublish ebusd/700/Hc1ExcessTemp/get:
setstate MQTT2_Server 2020-12-13 19:45:50 nrclients 11
setstate MQTT2_Server 2020-12-13 19:43:53 state Initialized


Ist aber connected und es klappt alles.

(Smarthome/Badezimmer/Badezimmer_Rest... in RETAIN war ein Test um was aus dem Forum nachzuvollziehen)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 13 Dezember 2020, 21:15:30
Ok dein FHEM startet offenbar fast eine Minute, deswegen mehr Versuche der neuen Verbindung.
im retain steht bei dir aber auch connected 0 drin. 
Ich habe jetzt mal folgendes gemacht.

pm2 stop
deletereading mqtt2s RETAIN
pm2 start

mein status ist immer connected

Ich habe keine Ahnung und auch keine Lust mehr :)

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 19 Dezember 2020, 12:20:40
Wenn die ReadingList-Einträge volumeUp und volumeDown vor volume definiert sind (Template) gibts bei mir beim setter volumeUp/volumeDown einen slider (0-100)  :o und der setter funktioniert nicht.

stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }
play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }
pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }
toggle:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "toggle" }
volumeUp:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumeup" }
volumeDown:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumedown" }
volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }
mute:noArg { my $value = ReadingsVal($NAME,'mute','false') eq "true" ? "unmute" : "mute"; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }
...


Definiert man die beiden Einträge nach volume, werden die setter korrekt dargestellt und funtionieren:

stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }
play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }
pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }
toggle:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "toggle" }
volumeUp:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumeup" }
volumeDown:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumedown" }
volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }
mute:noArg { my $value = ReadingsVal($NAME,'mute','false') eq "true" ? "unmute" : "mute"; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }
...


Ist das nur bei mir so oder auch bei allen anderen ?


Der default-Wert für volumeUp und volumeDown ohne Angabe von input ist ja 5.

Mein Vorschlag wär input trotzdem (im Template) mit anzugeben, daran (find ich) kann man sich dann ohne in die Doku zu schauen ableiten wie/wo der default Wert zu ändern ist wollte man einen anderen.

volumeDown:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumedown", "input": 5 }
volumeUp:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumeup", "input": 5 }
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Dezember 2020, 12:47:06
Hallo Thomas,

bei mir ist das alles richtig , volume hat den Slider der funktioniert, volumeUp und volumeDown hat keinen Slider und funktioniert auch.

Ich kann das nachher nochmal an einer Neuinstallation testen. Poste doch mal ein komplettes list - vielleicht ist an anderer Stelle was falsch?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 19 Dezember 2020, 12:53:16
defmod Sonos_Wohnzimmer MQTT2_DEVICE RINCON_000E58F7F67C01400
attr Sonos_Wohnzimmer IODev MQTT2_Server
attr Sonos_Wohnzimmer event-on-change-reading .*
attr Sonos_Wohnzimmer group s2m
attr Sonos_Wohnzimmer icon audio_volume_low
attr Sonos_Wohnzimmer jsonMap volume_Master:volume mute_Master:mute transportState:state volume_LF:0 volume_RF:0 mute_LF:0 mute_RF:0 enqueuedMetadata_ItemId:0 enqueuedMetadata_ParentId:0 currentTrack_ItemId:0 currentTrack_ParentId:0 coordinatorUuid:0
attr Sonos_Wohnzimmer model sonos2mqtt_speaker
attr Sonos_Wohnzimmer readingList sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }\
sonos/RINCON_000E58F7F67C01400/error:.* { json2nameValue($EVENT) }
attr Sonos_Wohnzimmer room MQTT2_DEVICE,Media
attr Sonos_Wohnzimmer setList stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }\
play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
toggle:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "toggle" }\
volumeDown:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumedown" }\
volumeUp:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumeup" }\
volume:slider,0,1,100,5 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
mute:noArg { my $value = ReadingsVal($NAME,'mute','false') eq "true" ? "unmute" : "mute";; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
joinGroup:textField sonos/RINCON_000E58F7F67C01400/control { "command": "joingroup",  "input": "$EVTPART1"}\
leaveGroup:noArg { my $value = ReadingsVal("RINCON_000E58F7F67C01400","groupName","all");; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "leavegroup",  "input": "$value" } ) }\
setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
  playUri:textField {fhem("set $NAME setAVTUri $EVTPART1;; sleep 1;; set $NAME play")}\
  input:Queue { my $value = $EVTPART1 eq "TV" ? "tv" : $EVTPART1 eq "Line_In" ? "line" : "queue";; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "switchto$value" } ) }\
  notify:textField sonos/RINCON_000E58F7F67C01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}\
  x_raw_payload:textField { my $payload = $EVENT;;$payload =~ s/$EVTPART0 //g;; qq(sonos/RINCON_000E58F7F67C01400/control $payload)}\
  speak:textField { my $tts="SonosTTS";;my ($cmd,$vol,$text)=split(' ', $EVENT,3);;fhem("set $tts tts $text;;sleep $tts:playing:.0 ;;set $NAME notify $vol [$tts:httpName]")}\
  playFav:011.FM-NonStop60s,1A.Deutsche.Hits,1LIVE.diggi.(Top.40/Pop),ANTENNE.THÜRINGEN,COSMO.Chillout,DASDING.92.5.(Euro-Hits),FM.نجوم.100.6.(Arabisch),Hitradio.Ö3.99.9.(Österreichisch),Hörbücher,NDR.2,PsyRadioChillout,SWR4.Baden-Württemberg,SWR4.Rheinland-Pfalz,die.neue.welle.101.8.(Rock) {use JSON;;use HTML::Entities;;use Encode qw(encode decode);;my $enc = 'UTF8';;my $uri='';;my $search=(split(' ', $EVENT,2))[1];;$search=~s/[\/()]/./g;;my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;my $read='Favorites';;my $decoded = decode_json(ReadingsVal($dev,$read,''));;my @arr=@{$decoded->{'Result'}};;foreach (@arr) {if (encode($enc, decode_entities($_->{'Title'}))=~/$search/i){$uri = $_->{'TrackUri'} }};;fhem("set $NAME playUri $uri") if ($uri ne '')}\
  toggleRadio:noArg {my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;my $r=Each($dev,ReadingsVal($dev,'favRadios',''));;my $tts="SonosTTS";;fhem("set $tts tts Es folgt $r;;sleep $tts:playing:.0;;set $NAME playUri [$tts:httpName];;sleep $NAME:play;;sleep $NAME:PLAYING;;sleep $NAME:STOPPED;;set $NAME playFav $r")}\
  playSound:textField {my $tts="SonosTTS";;my ($cmd,$vol,$file)=split(' ', $EVENT,3);;$file=($file=~m/.*\.mp3$/)?"$file":"$file.mp3";;fhem("set $NAME notify $vol http://[$tts:host]/fhem/cache/Toene/$file")}

setstate Sonos_Wohnzimmer STOPPED
setstate Sonos_Wohnzimmer 2020-12-11 14:43:28 associatedWith MQTT2_sonos_Bridge
setstate Sonos_Wohnzimmer 2020-12-19 12:28:35 bass 3
setstate Sonos_Wohnzimmer 2020-12-18 19:19:33 command notify
setstate Sonos_Wohnzimmer 2020-12-19 12:28:35 currentTrack_AlbumArtUri http://192.168.188.23:1400/getaa?s=1&u=x-sonosapi-stream:s97066%3fsid%3d254%26flags%3d8224%26sn%3d0
setstate Sonos_Wohnzimmer 2020-12-19 12:28:33 currentTrack_Artist FLUCTURION 2.0
setstate Sonos_Wohnzimmer 2020-12-19 12:28:24 currentTrack_Duration 0:00:00
setstate Sonos_Wohnzimmer 2020-12-19 12:28:35 currentTrack_ProtocolInfo sonos.com-http:*:audio/mpegurl:*
setstate Sonos_Wohnzimmer 2020-12-19 12:28:35 currentTrack_Title x-sonosapi-stream:s97066?sid=254&amp;;flags=8224&amp;;sn=0
setstate Sonos_Wohnzimmer 2020-12-19 12:28:35 currentTrack_TrackUri x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0
setstate Sonos_Wohnzimmer 2020-12-19 12:28:35 currentTrack_UpnpClass object.item
setstate Sonos_Wohnzimmer 2020-12-18 16:24:23 enqueuedMetadata_AlbumArtUri https://cdn-profiles.tunein.com/s20293/images/logoq.png?t=1
setstate Sonos_Wohnzimmer 2020-12-19 12:28:35 enqueuedMetadata_Title PsyRadio Chillout
setstate Sonos_Wohnzimmer 2020-12-19 12:28:35 enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate Sonos_Wohnzimmer 2020-12-18 19:19:33 error_Action SetAVTransportURI
setstate Sonos_Wohnzimmer 2020-12-18 19:19:33 error_Fault UPnPError
setstate Sonos_Wohnzimmer 2020-12-18 19:19:33 error_FaultCode s:Client
setstate Sonos_Wohnzimmer 2020-12-18 19:19:33 error_UpnpErrorCode 714
setstate Sonos_Wohnzimmer 2020-12-18 19:19:33 error_name SonosError
setstate Sonos_Wohnzimmer 2020-12-19 12:28:35 groupName Wohnzimmer
setstate Sonos_Wohnzimmer 2020-12-19 12:28:35 mute false
setstate Sonos_Wohnzimmer 2020-12-19 12:28:35 name Wohnzimmer
setstate Sonos_Wohnzimmer 2020-12-19 12:28:35 playmode NORMAL
setstate Sonos_Wohnzimmer 2020-12-19 12:28:35 state STOPPED
setstate Sonos_Wohnzimmer 2020-12-19 12:28:35 treble -5
setstate Sonos_Wohnzimmer 2020-12-19 12:28:35 ts 1608377314755
setstate Sonos_Wohnzimmer 2020-12-19 12:28:35 uuid RINCON_000E58F7F67C01400
setstate Sonos_Wohnzimmer 2020-12-19 12:28:35 volume 18
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 19 Dezember 2020, 13:17:38
Hat sich erledigt mit dem slider von volumeUp und volumeDown.

Hab eben ein update ausgeführt, kein slider mehr danach.

Obs jetzt am update oder restart lag kann ich nicht sagen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 19 Dezember 2020, 13:29:10
Mir fehlt noch die Angabe einer MP3 im speak Befehl, ist mir heute Morgen aufgefallen.

Mit dem Sonos-Modul geht das mit der Angabe in ||

set Sonos_Wohnzimmer speak 20 |Temple| Guten Morgen ... Die Außentemperatur beträgt zur Zeit ...

Das werd ich als nächstes versuchen zu basteln, hab aber auch nix dagegen wenn das jemand aus dem Ärmel schüttelt.

Wo man die MP3 angibt, ob am Anfang/Ende oder im Text soll wie beim Sonos_Modul egal sein.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 19 Dezember 2020, 14:12:34
Ich dachte gerade, dass nachzubauen ist eigentlich easy. Immerhin gibt es ja schon https://svrooij.io/sonos2mqtt/control/notifications.html#play-a-mp3
Man müsste also nur erst das MP3 abspielen und dann einen der unterschiedlichen Befehle für speak (je nachdem ob TTS oder sonos-polly) aufrufen.
Aber Pustekuchen, der Ablauf vom MP3 abspielen ist:

1. Get the current state
2. Check if it is currently playing, and cancel if not playing and you specified onlyWhenPlaying: true.
3. Play the sound
4. Wait for playback to stop (or the timeout to expire)
5. Restore all previously fetched status (Track, queue, volume,...)


Das Restore macht es dann kaputt.

Man könnte, wenn man TTS nutzt, überlegen vom TTS die Durchsage erstellen zu lassen, diese dann mit irgendeinem Shell-Script mit dem MP3 zu kombinieren und dieses MP3 dann an Sonos zu übergeben. Wirkt aber wie eine echte Scheißlösung.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Dezember 2020, 15:04:41
Mit dem tts Modul geht das doch, habe aber noch nicht versucht das zu  nutzen:
Zitattts:
Setzen eines Textes zur Sprachausgabe. Um mp3-Dateien direkt auszugeben, müssen diese mit führenden und schließenden Doppelpunkten angegebenen sein. Die MP3-Dateien müssen unterhalb des Verzeichnisses TTS_FileTemplateDir gespeichert sein.
Der Text selbst darf deshalb selbst keine Doppelpunte beinhalten.
Für die SpracheEngine Amazon Polly kann auch SSML verwendet werden, Siehe Beispiele.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 19 Dezember 2020, 15:45:33
Ich denke irgendwie in die Richtung den speak-Befehl zu splitten an den |.
Was dann 3 MP3s ergibt (wenn man die MP3-Angabe auf eine von vornherein beschränkt), die man nacheinander abspielen müsste (ob das dann Möglich ist flüssig wiedergegeben zu werden ? ? ?), hab ich aber bis jetzt noch nicht getestet

{my $EVENT ="die erste datei |die zweite| die dritte";;my ($a,$b,$c) = split('\|', $EVENT,3);;$a.$b.$c}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Dezember 2020, 18:16:01
Also wenn ich das einfach so mache wie in der Doku TTS beschrieben - funktioniert das OOTB :)

"mkdir ./cache/templates"
"cp /opt/fhem/cache/KlingelTon.mp3 /opt/fhem/cache/templates/"
attr SonosTTS TTS_FileMapping Klingel:KlingelTon.mp3
set alias=Arbeitszimmer speak 20 Vor der:Klingel:und danach


Was ist grundlegend anders an | und : als Trenner?

geht auch solo - also nur Klingel set alias=Arbeitszimmer speak 20 :Klingel:
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 19 Dezember 2020, 19:46:18
gib mal ausversehen
Zitatattr SonosTTS TTS_FileMapping Klingel:KlingelTon:mp3
ein und bekomm das wieder raus aus dem Attribut ohne die fhem.cfg zu editieren.

die solo Variante klappt auch bei mir:

set alias=Arbeitszimmer speak 20 Vor der:Klingel:und danach

mit Text nur davor, nur danach und vor und danach nicht.

da bekomm ich einen MP3WRAP Fehler:

2020.12.19 19:41:46 3: MQTT2_DEVICE set Sonos_Wohnzimmer speak 20 bla:Vibrating:
sh: 1: mp3wrap: not found
2020.12.19 19:41:46 3: SonosTTS: MP3WRAP Fehler!, Datei wurde nicht generiert.
2020.12.19 19:41:47 3: MQTT2_DEVICE set Sonos_Wohnzimmer notify 20 http://192.168.188.26:8084/fhem/cache/eb2412cbde69699e6b043867bf023b79.mp3
2020.12.19 19:42:02 3: MQTT2_DEVICE set Sonos_Wohnzimmer speak 20 bla:Vibrating:bla
sh: 1: mp3wrap: not found
2020.12.19 19:42:02 3: SonosTTS: MP3WRAP Fehler!, Datei wurde nicht generiert.
2020.12.19 19:42:02 3: MQTT2_DEVICE set Sonos_Wohnzimmer notify 20 http://192.168.188.26:8084/fhem/cache/0234849a25042bba31e8d3dec2c003a7.mp3
2020.12.19 19:42:29 3: MQTT2_DEVICE set Sonos_Wohnzimmer speak 20 :Vibrating:bla
sh: 1: mp3wrap: not found
2020.12.19 19:42:29 3: SonosTTS: MP3WRAP Fehler!, Datei wurde nicht generiert.
2020.12.19 19:42:30 3: MQTT2_DEVICE set Sonos_Wohnzimmer notify 20 http://192.168.188.26:8084/fhem/cache/788c72e06a83285d1820e80e631f9782.mp3
2020.12.19 19:42:45 3: MQTT2_DEVICE set Sonos_Wohnzimmer speak 20 :Vibrating:
2020.12.19 19:42:45 3: MQTT2_DEVICE set Sonos_Wohnzimmer notify 20 http://192.168.188.26:8084/fhem/cache/templates/Vibrating.mp3


Ich hab auch noch nicht die ganzen Bibliotheken installiert, weil speak bisher auch so funzt, meinst du es kann daran liegen ?

Darum auch

sh: 1: mp3wrap: not found
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Dezember 2020, 20:30:15
Ja so ist es :
ZitatTTS_UseMP3Wrap
optional: To become a liquid audio response its recommend to use the tool mp3wrap. Each downloaded audio bricks are concatinated to a single audio file to play with mplayer.
Installtion of the mp3wrap source is required.
apt-get install mp3wrap
Notice: Only available in locally instances!

Ich sollte dann wohl das hier aus dem Wiki rausnehmen
attr SonosTTS TTS_UseMP3Wrap 1
oder dazu  schreiben das man TTS Doku lesen muss :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 19 Dezember 2020, 20:49:50
Danke.

Hab aber nur mp3wrap noch installiert, jetzt klappts.

Was von den anderen Bibliotheken bereits "vorinstalliert" ist mit OS hab ich nicht nachgeschaut.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Dezember 2020, 20:59:30
Ich ergänze das. Wir brauchen mp3wrap in jedem Fall. Wir wollen ja eine komplette mp3 Datei - auch bei längeren Texten.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 20 Dezember 2020, 12:56:19
Ist das aber letztlich nicht wieder was, wo wir versuchen eine Lösung nachzubauen, die es eigentlich schon gibt? Deshalb wäre ich ja noch immer ein Freund davon, wenn "einfach" das SONOS-Modul so erweitert würde, dass es sowohl native als auch mqtt bedienen kann ;-)

Aber davon unabhängig wäre es doch die Funktion SONOS_GetSpeakFile aus https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/00_SONOS.pm ab Zeile 4788 und dann SONOS_CombineMP3Files (ab Zeile 4902).

Ich finde halt, wir dürfen nicht vergessen, dass es für die Sprachausgabe zwei Varianten gibt (Fhem TTS und sonos-tts-polly). Betrachten wir nur eine, gibt es hinterher Probleme mit der anderen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 19 Januar 2021, 14:35:34
Für geteilte Systeme (alte und neue Geräte) gibt es jetzt auch eine Doku: https://github.com/svrooij/sonos2mqtt/blob/34ca3e73e75947872d3e5a7992ef852d0b518a45/docs/splitted-system.md
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 08 Februar 2021, 16:10:37
Hallo sonso2mqtt Liebhaber,

ich habe in Vorbereitung einer 99_mySonosUtils.pm mal noch etwas versucht die existierenden Dinge zu verifizieren und vielleicht besser zu strukturieren.

Ich habe das devStateIcon mal überarbeitet und etwas Code in userReadings ausgelagert, den Code kann man komplett in die Raw Definition fallen lassen:
# stateFormat nicht mehr nach state mappen, stateFormat auf transportState setzen
attr a:model=sonos2mqtt_speaker jsonMap volume_Master:volume mute_Master:mute
attr a:model=sonos2mqtt_speaker stateFormat transportState

# Master Name und Status isMaster und inGroup ermitteln - 
attr a:model=sonos2mqtt_speaker userReadings Master:groupName.* {(split(' ',ReadingsVal($name,'groupName','')))[0]},\
inGroup:groupName.*  {ReadingsVal($name,"name","0") ne ReadingsVal($name,'groupName','0')?1:0},\
isMaster:groupName.*  {ReadingsVal($name,'name','') eq (split(' ',ReadingsVal($name,'groupName','')))[0]?1:0},\
Input:currentTrack_TrackUri.* {my $currentTrack_TrackUri = ReadingsVal($name,'currentTrack_TrackUri','');;\
   $currentTrack_TrackUri =~ 'x-rincon-stream'\
      ? 'LineIn': $currentTrack_TrackUri =~ 'spdif'\
      ? 'TV'    : ReadingsVal($name,'enqueuedMetadata_UpnpClass','') eq 'object.item.audioItem.audioBroadcast'\
      ? 'Radio' : 'Playlist'}

# devStateIcon setzen
attr a:model=sonos2mqtt_speaker devStateIcon {\
my $wpix = '210px';;\
my $master = ReadingsVal($name,'Master',$name);;\
my $inGroup = ReadingsNum($name,'inGroup','0');;\
my $isMaster = ReadingsNum($name,'isMaster','0');;\
my $Input = ReadingsVal($name,'Input','');;\
my $cover = ReadingsVal($name,'currentTrack_AlbumArtUri','');;\
my $mutecmd = ReadingsVal($name,'mute','0') eq 'false'?'true':'false';;\
my $mystate = $isMaster ? Value($name) : Value((devspec2array('DEF='.ReadingsVal($name,'coordinatorUuid','0')))[0]);;\
my $playpic = $mystate eq 'PLAYING'\
  ? 'rc_PAUSE@red'    : $mystate eq 'PAUSED_PLAYBACK'\
  ? 'rc_PLAY@green'   : $mystate eq 'STOPPED'\
  ? 'rc_PLAY@green'   : $mystate eq 'TRANSITIONING'\
  ? 'rc_PLAY@blue'    : 'rc_PLAY@yellow';;\
my $mutepic = $mutecmd eq 'true'?'rc_MUTE':'rc_VOLUP';;\
my $line2 = '';;\
my $currentTrack_Artist = ReadingsVal($name,'currentTrack_Artist','FEHLER');;\
my $currentTrack_Title = ReadingsVal($name,'currentTrack_Title','FEHLER');;\
if ($currentTrack_Title =~ 'x-sonosapi-stream:'){$currentTrack_Title=''};;\
my $currentTrack = $mystate eq 'TRANSITIONING' ? 'Puffern...' : $currentTrack_Artist.' - '.$currentTrack_Title;;\
my $nextTrack_Artist = ReadingsVal($name,'nextTrack_Artist','FEHLER');;\
my $nextTrack_Title = ReadingsVal($name,'nextTrack_Title','FEHLER');;\
my $nextTrack = $nextTrack_Artist.' - '.$nextTrack_Title;;\
my $linePic = ($inGroup and !$isMaster) ? "<a href=\"/fhem?cmd.dummy=set $name leaveGroup&XHR=1\">".FW_makeImage('rc_LEFT')."</a>" : "";;\
if ($isMaster) {$linePic .= " <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>"};;\
   $linePic .= "&nbsp;;&nbsp"\
            ."<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage('rc_VOLDOWN')."</a>"\
            ."<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage('rc_PREVIOUS')."</a>"\
            ."<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage('rc_NEXT')."</a>"\
            ."<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage('rc_VOLUP')."</a>"\
            ."&nbsp;;&nbsp"\
            ."<a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>";;\
if ($isMaster and $mystate eq 'PLAYING') {\
    $line2 = $Input =~ /LineIn|TV/ \
      ? $Input : $Input eq 'Radio' \
      ? "$line2<marquee style='width: $wpix'>Radio: $currentTrack</marquee>" \
      : "$line2<marquee style='width: $wpix'>Aktueller Track: $currentTrack<br>Nächster Track: $nextTrack</marquee>"\
    } elsif ($inGroup and !$isMaster) {$line2 .= " Steuerung: $master"}\
my $style = 'display:inline-block;;margin-right:5px;;border:1px solid lightgray;;height:4.00em;;width:4.00em;;background-size:contain;;background-image:';;\
"<div><table>\
     <tr>\
       <td><div style='$style url($cover)'></div></td>\
       <td>$linePic$line2</td>\
     </tr>\
  </table></div>"\
}


Vielleicht hat ja einer Lust zu testen und mir Feedback zu geben, ich würde das dann erstmal im Wiki austauschen. Ich habe damit folgendes realisiert/verbessert:
Wenn mir jetzt noch einer verrät ob man die ganzen Readings irgendwie 1:1 mit einem hash und einer direkten Referenz abrufen könnte und nicht einzeln mit ReadingsVal()? :)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 08 Februar 2021, 16:28:42
Na ja, ReadingsVal() ist auch nur eine sub, die bestimmte hashes durchsucht...

ABER: MAn. sollte man eher nicht direkt in diesen hashes "rumsudeln" (lesend mag noch verzeihlich sein, wenn man genau weiß, was man tut), und schon gleich nicht in "usercode"...
Ich habe da irgendwo auch noch Rudi im Ohr (ich hoffe, das aus dem Gedächtnis korrekt zu rekonstruieren): Er hat mir mal erklärt, dass sonst nämlich das Risiko besteht, dass man die abgefragten (übergeordneten) Hashes erst "ins Leben ruft" und so "Speicherleichen"  erzeugt. Also wenn du sowas überhaupt weiter anvisierst(die paar Ministeps mehr...), dann möglichst nur versteckt vor dem User (und entsprechend gegen Leichengenerierung abgesichert!) in ...Utils.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 08 Februar 2021, 16:57:42
@Beta-User - überredet :)
War ja nur ne Frage: Der Code sieht so öde aus, ich dachte am Ende definiert man so eine Art Referenz und kann einfach die existierenden Readingnamen abfragen. Oder so mit einer Zeile foreach ... einfach alle Variablen anlegen
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 08 Februar 2021, 17:17:22
 :) Kein Ding...

Was "foreach" angeht: watndat?!? (Ich fand das früher auch schick, aber immer, wenn mir jetzt eines vor die Flinte läuft, wird es erlegt und ein "for" darf stattdessen das Licht der Welt erblicken ;) ...).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 08 Februar 2021, 17:48:44
Dachte die Laufschrift entfällt irgendwann, wenn sie weiterhin enthalten ist, hätt ich den Vorschlag scrollamount und scrolldelay zu ergänzen.

Mag sein dass das auch Browserabhängig ist (hab ich mich nicht mit beschäftigt), mir ist die zu schnell von rechts nach links geflitzt, da wird man ja verrückt.

<marquee scrollamount='1' scrolldelay='1' style='width: $wpix'>
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 08 Februar 2021, 19:42:23
ZitatDas <marquee> Element ist veraltet und muss bzw. soll nicht mehr verwendet werden. Obwohl manche Browser es immernoch unterstützen, ist es nicht erforderlich. Es wird davon abgeraten, dieses Tag zu benutzen, da es das schlimmste ist, was Sie ihren Besuchern antun können.
Hast Du Vorschlag anstatt Laufschrift?
Ich baue scrollamount='1' ein, dass bewirkt bei mir das gleiche - die scrolldelay='1' würde ignoriert :)
Zitatscrollamount
Definiert den Wert eines Intervalls in Pixel. Der Standardwert beträgt 6.
scrolldelay
Definiert den Intervall zwischen jeder Bewegung in Millisekunden. Der Standardwert ist 85. Merke:  Jeder Wert, der kleiner als 60 ist, wird ignoriert und der Wert 60 wird stattdessen verwendet, außer "truespeed" ist definiert.

Alles was ich als Alternative zu dem marquee Tag finde jeweils gefühlte 27 Seiten HTML/CSS/Javascript Code. Da lasse ich es im Zweifel einfach weg und es wird eben nicht alles dargestellt? 
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 09 Februar 2021, 10:23:32
ZitatHast Du Vorschlag anstatt Laufschrift?

marquee wird doch offiziell von keinem Browser mehr unterstützt, die Alternative ist ewig lang, mein Vorschlag bevor marquee ins Spiel kam war mal (https://forum.fhem.de/index.php/topic,111711.msg1067954.html#msg1067954) ($trim30) die Anzahl der anzuzeigenden Zeichen (die max. in eine Spalte passen) zu begrenzen und drei Punkte anzuhängen
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 16 Februar 2021, 22:34:18
Ok, Ich habe mal noch etwas gekürzt und gestrichen. Es gibt vor allem noch einen neuen Spezialfall: Das einfache Stereopaar.  ::)

Die Laufschrift ist raus, ich habe mich eher beschränkt in der Ausgabe von Titel und co ;)
Vielleicht ist es so akzeptabel?
Code ist einfach für die Raw Def.
Die Vorbereitung mit Änderung der Readings und userReadings
# stateFormat nicht mehr nach state mappen, stateFormat auf transportState setzen
attr a:model=sonos2mqtt_speaker jsonMap volume_Master:volume mute_Master:mute
attr a:model=sonos2mqtt_speaker stateFormat transportState

# Master Name und Status isMaster und inGroup ermitteln - 
attr a:model=sonos2mqtt_speaker 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.* {my $currentTrack_TrackUri = ReadingsVal($name,'currentTrack_TrackUri','');;\
   $currentTrack_TrackUri =~ 'x-rincon-stream'\
      ? 'LineIn': $currentTrack_TrackUri =~ 'spdif'\
      ? 'TV'    : ReadingsVal($name,'enqueuedMetadata_UpnpClass','') eq 'object.item.audioItem.audioBroadcast'\
      ? 'Radio' : 'Playlist'}

# Ein Trick um die Readings neu zu schreiben, auch die vom Stereopaar
set a:model=sonos2mqtt_speaker volume {(ReadingsVal($DEV,'volume',''))}

Das devStateIcon
# devStateIcon setzen
attr a:model=sonos2mqtt_speaker devStateIcon {\
my $wpix = '210px';;\
my $master = ReadingsVal($name,'Master',$name);;\
my $inGroup = ReadingsNum($name,'inGroup','0');;\
my $isMaster = ReadingsNum($name,'isMaster','0');;\
my $inCouple = ReadingsNum($name,'inCouple','0');;\
my $Input = ReadingsVal($name,'Input','');;\
my $cover = ReadingsVal($name,'currentTrack_AlbumArtUri','');;\
my $mutecmd = ReadingsVal($name,'mute','0') eq 'false'?'true':'false';;\
my $mystate = $isMaster ? Value($name) : Value((devspec2array('DEF='.ReadingsVal($name,'coordinatorUuid','0')))[0]);;\
my $playpic = $mystate eq 'PLAYING'\
  ? 'rc_PAUSE@red'    : $mystate eq 'PAUSED_PLAYBACK'\
  ? 'rc_PLAY@green'   : $mystate eq 'STOPPED'\
  ? 'rc_PLAY@green'   : $mystate eq 'TRANSITIONING'\
  ? 'rc_PLAY@blue'    : 'rc_PLAY@yellow';;\
my $mutepic = $mutecmd eq 'true'?'rc_MUTE':'rc_VOLUP';;\
my $line2 = '';;\
my $title = $mystate eq 'TRANSITIONING' ? 'Puffern...' : ReadingsVal($name,'enqueuedMetadata_Title','FEHLER');;\
my $linePic = ($inGroup and !$isMaster and !$inCouple) ? "<a href=\"/fhem?cmd.dummy=set $name leaveGroup&XHR=1\">".FW_makeImage('rc_LEFT')."</a>" : "";;\
if ($isMaster) {$linePic .= " <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>"};;\
   $linePic .= "&nbsp;;&nbsp"\
            ."<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage('rc_VOLDOWN')."</a>"\
            ."<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage('rc_PREVIOUS')."</a>"\
            ."<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage('rc_NEXT')."</a>"\
            ."<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage('rc_VOLUP')."</a>"\
            ."&nbsp;;&nbsp"\
            ."<a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a>";;\
if ($isMaster and $mystate eq 'PLAYING') {$line2 = $Input =~ /LineIn|TV/ ? $Input : "$title"}\
    elsif ($inGroup and !$isMaster or $inCouple) {$line2 .= $inCouple ? "Stereopaar":"Steuerung: $master"}\
my $style1 = 'display:inline-block;;margin-right:5px;;border:1px solid lightgray;;height:4.00em;;width:4.00em;;background-size:contain;;background-image:';;\
my $style2 ='background-repeat: no-repeat;; background-size: contain;; background-position: center center';;\
"<div><table>\
     <tr>\
       <td><div style='$style1 url($cover);;$style2'></div></td>\
       <td>$linePic<br><div>$line2</div></td>\
     </tr>\
  </table></div>"\
}

Ich würde jetzt gern noch das attrTemplate und Wiki überarbeiten.
Vielleicht mag ja jemand testen.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 17 Februar 2021, 10:37:56
Ich fand die Laufschrift besser  ;D

Wenn ich etwas testen soll, lass es mich bitte wissen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 17 Februar 2021, 12:52:21
Ja ich glaube mit dem devStateIcon kann man sich fast beliebig austoben.

ich habe jetzt erstmal  noch im Wiki die Sprachausgabe mit sayText ergänzt. Wäre schön wenn es jemand kritisiert :)

Als nächstes will ich das Template anpassen damit die Readings passen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 17 Februar 2021, 14:45:59
Zitat von: Otto123 am 17 Februar 2021, 12:52:21
ich habe jetzt erstmal  noch im Wiki die Sprachausgabe mit sayText ergänzt. Wäre schön wenn es jemand kritisiert :)

Sieht gut aus.

Auch wenn ich noch immer dafür bin, dass wir per Attribut festlegen sollten, ob FHEM oder Sonos TTS genutzt wird und dann entsprechend den passenden Befehl aussuchen ;-) Aber ich glaube, dass ist was für später.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Februar 2021, 10:21:51
Moin,

ich habe mal mit der Utils begonnen, wer Lust hat mit zu schauen hier das "Setup - für die Raw Def". Ihr könnt mir auch sagen im bin auf dem Holzweg ;)
"wget -qO ./FHEM/99_sonos2mqttUtils.pm https://raw.githubusercontent.com/heinz-otto/scripts/master/fhem/99_sonos2mqttUtils.pm"
sleep 10;reload 99_sonos2mqttUtils.pm
attr a:model=sonos2mqtt_speaker devStateIcon {sonos2mqtt($name,'devStateIcon')}
attr a:model=sonos2mqtt_speaker setList stop:noArg {sonos2mqtt($NAME,$EVENT)}\
play:noArg {sonos2mqtt($NAME,$EVENT)}\
pause:noArg {sonos2mqtt($NAME,$EVENT)}\
toggle:noArg {sonos2mqtt($NAME,$EVENT)}\
volumeUp:noArg {sonos2mqtt($NAME,$EVENT)}\
volumeDown:noArg {sonos2mqtt($NAME,$EVENT)}\
volume:slider,0,1,100 {sonos2mqtt($NAME,$EVENT)}\
mute:true,false {sonos2mqtt($NAME,$EVENT)}\
next:noArg {sonos2mqtt($NAME,$EVENT)}\
previous:noArg {sonos2mqtt($NAME,$EVENT)}\
joinGroup:textField {sonos2mqtt($NAME,$EVENT)}\
leaveGroup:noArg {sonos2mqtt($NAME,$EVENT)}\
setAVTUri:textField {sonos2mqtt($NAME,$EVENT)}\
playUri:textField {sonos2mqtt($NAME,$EVENT)}\
input:Queue,TV {sonos2mqtt($NAME,$EVENT)}\
notify:textField {sonos2mqtt($NAME,$EVENT)}\
x_raw_payload:textField {sonos2mqtt($NAME,$EVENT)}\
sayText:textField {sonos2mqtt($NAME,$EVENT)}\
speak:textField {sonos2mqtt($NAME,$EVENT)}\
test:textField {sonos2mqtt($NAME,$EVENT)}

Voraussetzung wären noch die userReadings und leicht geänderten Mapping, wenn das neue Template noch nicht aktiv war:
# stateFormat nicht mehr nach state mappen, stateFormat auf transportState setzen
attr a:model=sonos2mqtt_speaker jsonMap volume_Master:volume mute_Master:mute
attr a:model=sonos2mqtt_speaker stateFormat transportState

# Master Name und Status isMaster und inGroup ermitteln - 
attr a:model=sonos2mqtt_speaker 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.* {my $currentTrack_TrackUri = ReadingsVal($name,'currentTrack_TrackUri','');;\
   $currentTrack_TrackUri =~ 'x-rincon-stream'\
      ? 'LineIn': $currentTrack_TrackUri =~ 'spdif'\
      ? 'TV'    : ReadingsVal($name,'enqueuedMetadata_UpnpClass','') eq 'object.item.audioItem.audioBroadcast'\
      ? 'Radio' : 'Playlist'}

# Ein Trick um die Readings neu zu schreiben, auch die vom Stereopaar
set a:model=sonos2mqtt_speaker volume {(ReadingsVal($DEV,'volume',''))}

Die Erzeugung des playFav Setter muss ich noch machen, funktioniert aber nach gleichem Prinzip.
Der Code ist erstmal ziemlich 1:1 umgesetzt - das funktionierte aber erstmal gut. Da werde ich noch etwas feilen. Ich hoffe ich die "guten Perl Regeln" halbwegs verstanden. :-[

Wer aufmerksam hinschaut bemerkt, dass beim devStateIcon $name und bei der setList $NAME funktioniert - das hält eben auch im Alter jung :)

Jetzt muss mir noch einer verraten wie wir die 99_sonos2mqttUtils.pm auf offiziellen FHEM Wegen an zum User bekommen.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 19 Februar 2021, 11:14:40
Sehr cool :-) Tolle Arbeit!

Lässt sich die setList eventuell auch noch komplett auslagern?

Als Idee, keine Ahnung ob umsetzbar:
- In der 99_sonos2mqttUtils.pm  eine weitere Sub sonos2mqtt_setList ergänzen,
- dort den Inhalt von setList aufbauen lassen und per return(?) zurückgeben
- im Device dann nur noch {sonos2mqtt_setList()} aufrufen
Also eigentlich analog zu sonos2mqtt_devStateIcon, wenn ich mich gerade nicht täusche.

Hätte den Vorteil, dass wir bei Ergänzung am pm-File die Devices nicht mehr anpacken müssen. Ich tue mich immer schwer, wenn es darum geht die Attribute in anderen Installationen anzupacken, dort könnte ja jemand was ergänzt haben, was danach fehlt.

Eventuell gleiches für userReadings?



Danach wäre es vielleicht eine Idee, wenn wir uns https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV tatsächlich genauer anschauen und entscheiden, was davon wir wie umsetzen wollen.
Vielleicht dazu auch in deinem git ein File hinterlegen, in dem wir die Readings und Befehle (setter) auflisten und mit Ideen zur Umsetzung hinterlegen, bevor wir darauf basierend Patches für die 99_sonos2mqttUtils.pm erzeugen?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Februar 2021, 11:36:29
setList komplett auslagern ist mMn nicht vorgesehen:
ZitatsetList cmd [topic|perl-Expression] ...
When the FHEM command cmd is issued, publish the topic. Multiple tuples can be specified, each of them separated by newline, the newline does not have to be entered in the FHEMWEB frontend. Example:
Der Teil cmd und widget ist direkt anzugeben.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Februar 2021, 12:45:30
Deswegen muss man die Erzeugung von solchen Systemspezifischen Klapplisten auch "extern" machen. Ich habe noch die joinGroup Liste zur Auswahl gebaut. Das schreit natürlich noch nach "Utils"
Aber ich will natürlich auch Meinung/Ideen einholen.
Vorschlag: Zwei userReadings für die Bridge als zentraler Punkt. Und den Einbau der Setter muss ich noch anders machen ;)
# Favoriten und Gruppen Liste erzeugen
attr a:model=sonos2mqtt_bridge userReadings favlist:Favorites.* {use JSON;;use HTML::Entities;;use Encode qw(encode decode);;\
my $enc = 'UTF8';;\
my @out;;\
my $decoded = decode_json(ReadingsVal($name,'Favorites',''));;\
my @arr  = @{$decoded->{'Result'}};;\
foreach (@arr) {\
   my $dec = encode($enc, decode_entities($_->{'Title'}));;\
   $dec =~ s/\s/./g;;\
   push @out,$dec}\
return join ',', sort @out},\
grouplist:Favorites.* {my @out;;\
foreach (devspec2array('a:model=sonos2mqtt_speaker')) {push @out,ReadingsVal($_,'name','')}\
return join(',', sort @out)}

# playFav erzeugen
{\
my $bridge = (devspec2array('a:model=sonos2mqtt_bridge'))[0];;\
my @devlist = devspec2array('a:model=sonos2mqtt_speaker');;\
my $attr = 'setList';;\
my $item = 'playFav:'.ReadingsVal($bridge,'favlist','').q( {sonos2mqtt($NAME,$EVENT)});;\
my ($first,$sec)=split(':',$item,2);;\
$first=~s/^\s+//;;\
foreach (@devlist) {\
   my @arr = grep {$_ !~ $first} split("\n",AttrVal($_,$attr,''));;\
   push @arr,$item;;\
   my $val = join "\n",@arr;;\
   $val =~ s/;;/;;;;/g;;\
   fhem("attr $_ $attr $val")}\
return "$attr in ".scalar(@devlist)." Definitionen modifiziert"\
}

# joinGroup modifizieren
{\
my $bridge = (devspec2array('a:model=sonos2mqtt_bridge'))[0];;\
my @devlist = devspec2array('a:model=sonos2mqtt_speaker');;\
my $attr = 'setList';;\
my $item = 'joinGroup:'.ReadingsVal($bridge,'grouplist','').q( {sonos2mqtt($NAME,$EVENT)});;\
my ($first,$sec)=split(':',$item,2);;\
$first=~s/^\s+//;;\
foreach (@devlist) {\
   my @arr = grep {$_ !~ $first} split("\n",AttrVal($_,$attr,''));;\
   push @arr,$item;;\
   my $val = join "\n",@arr;;\
   $val =~ s/;;/;;;;/g;;\
   fhem("attr $_ $attr $val")}\
return "$attr in ".scalar(@devlist)." Definitionen modifiziert"\
}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 19 Februar 2021, 13:03:23
Frage: wenn man alte und neue Sonos-Geräte nach https://forum.fhem.de/index.php/topic,111711.msg1123332.html#msg1123332 installiert, dann hat man eine Bridge. Das macht auch keine Probleme, allerdings funktionieren die Gruppenfunktionen dann nicht über alt/neu hinweg. Jedenfalls habe ich es auch darüber nicht hinbekommen, eine alte Play 5 mit einer "neuen" Play 1 in die gleiche Gruppe zu packen.
Müssen/sollten wir das irgendwie berücksichtigen? Also z.B. das nur Hardwareversion über 1.16 gemeinsam in eine Gruppe darf (und umgekehrt) oder anhand der Softwareversion.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Februar 2021, 13:12:01
ZitatMüssen/sollten wir das irgendwie berücksichtigen?
Klares "sicherlich" ;) , mein Problem ist derzeit auch ein simples Stereo Paar in einer Umgebung. Das ist bei der Gruppenauswahl auch schon wieder ein Problem. 

Das mit der Sonos1 / Sonos2 Umgebung wollte ich mir noch anschauen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Papaloewe am 19 Februar 2021, 18:14:43
Zitat von: PatrickR am 18 August 2020, 21:17:29
Mahlzeit!

Nachdem die Subscriptions nun funktionieren habe ich mich an die weitere Einrichtung gemacht.

Ich verwende für TTS den nativen sonos2mqtt-Weg über einen sonos-tts-polly-Container.

Dafür habe ich die setList wie folgt erweitert:

speak:textField { my (undef, $lang, $voice, $volume, @text) = split(/ /, $EVENT); sprintf('house/general/sonos/RINCON_949F3E14224A01400/control {"command":"speak","input":{"lang": "%s", "name":"%s", "volume":%s, "text": "%s","delayMs":700}}', $lang, $voice, $volume, join(" ", @text))}

Mit

set EG.KU.Sonos speak de-DE Vicki 25 Test

funktioniert das einwandfrei und klingt sogar noch gut.

Patrick

Hallo,
super Arbeit. Endlich laufen meine Sonos Kisten wieder mit fhem vernünftig.

Könnte man vielleicht die Einbindung, wie Patrick sie kurz beschrieben hat, auch noch ins Wiki aufnehmen?
Ich habe es jetzt inmitten dieses superlangen Threads gefunden.

Vielen Dank für dieses Projekt.

LG
Thomas
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Februar 2021, 18:21:45
Hallo Thomas,

Mach ich, ich will es noch was umbauen und ergänzen.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 19 Februar 2021, 19:37:56
ZitatDa werde ich noch etwas feilen.

Hi,

was ich mittlerweile erstmal sehe ist das man diese if:

if($cmd eq 'stop') {return qq(sonos/$uuid/control { "command": "stop" })}
if($cmd eq 'play') {return qq(sonos/$uuid/control { "command": "play" })}
if($cmd eq 'pause') {return qq(sonos/$uuid/control { "command": "pause" })}
if($cmd eq 'toggle') {return qq(sonos/$uuid/control { "command": "toggle" })}
if($cmd eq 'volumeUp') {return qq(sonos/$uuid/control { "command": "volumeup" })}
if($cmd eq 'volumeDown') {return qq(sonos/$uuid/control { "command": "volumedown" })}
if($cmd eq 'next') {return qq(sonos/$uuid/control { "command": "next" })}
if($cmd eq 'previous') {return qq(sonos/$uuid/control { "command": "previous" })}


mit einem Hash lösen kann, zwischen diesen Zeilen eingefügt und die entsprechenden alten if Befehle auskommentiert klappt das problemlos:

if($cmd eq 'test') {Log 1, "Das Device $NAME hat ausgeloest, die uuid ist >$uuid< der Befehl war >$cmd< der Teil danach sah so aus: $payload"}

my %sl1name2cmnd = (
'stop' => 'stop',
'play' => 'play',
'pause' => 'pause',
'toggle' => 'toggle',
'volumeUp' => 'volumeUp',
'volumeDown' => 'volumeDown',
'next' => 'next',
'previous' => 'previous');
my $sl1cmnd = %sl1name2cmnd{$cmd};

return if !$sl1cmnd;
return qq(sonos/$uuid/control { "command": "$sl1cmnd" });

return undef;
}


Schonmal um einige Zeichen kürzer und übersichtlicher.

Wozu ich zu doof bin und bisher kein Verständnis zu habe warum es nicht klappt, wie man die nächsten gleichen Befehle durch einen  Hash ersetzt/ergänzt:

if($cmd eq 'volume') {return qq(sonos/$uuid/control { "command": "volume", "input": $payload })}
if($cmd eq 'joinGroup') {return qq(sonos/$uuid/control { "command": "joingroup",  "input": "$payload"})}
if($cmd eq 'setAVTUri') {return qq(sonos/$uuid/control { "command": "setavtransporturi",  "input": "$payload"})}


if($cmd eq 'test') {Log 1, "Das Device $NAME hat ausgeloest, die uuid ist >$uuid< der Befehl war >$cmd< der Teil danach sah so aus: $payload"}

my %sl1name2cmnd = (
'stop' => 'stop',
'play' => 'play',
'pause' => 'pause',
'toggle' => 'toggle',
'volumeUp' => 'volumeUp',
'volumeDown' => 'volumeDown',
'next' => 'next',
'previous' => 'previous');
my $sl1cmnd = %sl1name2cmnd{$cmd};

return if !$sl1cmnd;
return qq(sonos/$uuid/control { "command": "$sl1cmnd" });


my %sl2name2cmnd = (
'volume' => 'volume',
'joinGroup' => 'joingroup',
'setAVTUri' => 'setavtransporturi');
my $sl2cmnd = %sl2name2cmnd{$cmd};

return if !$sl2cmnd;
return qq(sonos/$uuid/control { "command": "$sl2cmnd", "input": "$payload" });

return undef;


Klappt nicht und hab für heute keine Lust mehr, denke du verstehst das aber schon und hoffe du weißt wie mans richtig macht.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Februar 2021, 20:40:52
cooler Ansatz. Ballwechsel :) Du weißt meine Test laufen immer in der FHEM Kommandozeile - so in der Art noch kürzer - man braucht ja nicht erst a auf a mappen
{my $cmd='play';;my @a=('stop','play','pause','toggle','volumeUp','volumeDown','next','previous');;if (grep { $_ eq $cmd } @a) {qq(/control { "command": "$cmd" })}}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 19 Februar 2021, 20:52:12
Ja, habs noch nicht ausprobiert, meine aber es zu verstehen, wollte noch erwähnen das ich mir unsicher bin das der Hash hier die richtige Wahl ist, war schon auf so eine Antwort gefasst  :P

Klappt dann aber nicht mehr bei joinGroup->joingroup und setAVTUri->setavtransporturi.


Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Februar 2021, 21:01:52
Ich behalte das im Kopf, ich bastle erstmal noch an den anderen Routinen, die Auswahlsetter und das setup - ich will erstmal den ganzen Krempel in der Utils haben.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Februar 2021, 22:32:09
Das mit den anderen Befehlen funktioniert glaube ich so (zumindest sieht es so aus):
my %t=('volume'=>'volume','joinGroup'=>'joingroup','setAVTUri'=>'setavtransporturi');
if (grep { $_ eq $cmd } keys %t) {return qq(sonos/$uuid/control { "command": "$t{$cmd}", "input": "$payload" })}
Möge mich einer der es besser weiß korrigieren ;)

@Thomas Danke für die Idee.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 20 Februar 2021, 00:37:02
my %t=('volume'=>'volume','joinGroup'=>'joingroup','setAVTUri'=>'setavtransporturi');
if (grep { $_ eq $cmd } keys %t) {return qq(sonos/$uuid/control { "command": "$t{$cmd}", "input": "$payload" })}


Mir mags nicht gelingen, klappt das bei dir ?

Was hältst du von etwas Formatierung, der Lesbarkeit wegen ?


##############################################
# $Id: 99_sonos2mqttUtils.pm
# from myUtilsTemplate.pm 21509 2020-03-25 11:20:51Z rudolfkoenig $
# utils for sonos2mqtt Implementation
# They are then available in every Perl expression.

package main;

use strict;
use warnings;

sub sonos2mqttUtils_Initialize {
  my $hash = shift//return;
  return;
}

# Enter you functions below _this_ line.

sub sonos2mqtt {
my ($NAME,$EVENT)=@_;
my @arr = split(' ',$EVENT);
my ($cmd,$vol,$text,$value);
$cmd = $arr[0];
my $tts = ReadingsVal('SonosBridge','tts','SonosTTS');
my $uuid = ReadingsVal($NAME,'uuid','error');
my $payload = $EVENT;
my @a=('stop','play','pause','toggle','volumeUp','volumeDown','next','previous');

if (grep { $_ eq $cmd } @a)
{return qq(sonos/$uuid/control { "command": "$cmd" })};

my %t=('volume'=>'volume','joinGroup'=>'joingroup','setAVTUri'=>'setavtransporturi');

if (grep { $_ eq $cmd } keys %t)
{return qq(sonos/$uuid/control { "command": "$t{$cmd}", "input": "$payload" })};

if($cmd eq 'notify')
{return qq(sonos/$uuid/control { "command":"notify","input":{"trackUri":"$arr[2]","onlyWhenPlaying":false,"timeout":100,"volume":$arr[1],"delayMs":700}})}

if($cmd eq 'x_raw_payload')
{return qq(sonos/$uuid/control $payload)}

if($cmd eq 'mute')
{$value = $payload eq "true" ? "mute" : "unmute";
return qq(sonos/$uuid/control { "command": "$value" } )}

if($cmd eq 'input')
{$value = $payload eq "TV" ? "tv" : $payload eq "Line_In" ? "line" : "queue";
return qq(sonos/$uuid/control { "command": "switchto$value" } ) }

if($cmd eq 'leaveGroup')
{$value = ReadingsVal($uuid,"groupName","all");
return qq(sonos/$uuid/control { "command": "leavegroup",  "input": "$value" } ) }

if($cmd eq 'playUri')
{fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play")}

if($cmd eq 'sayText')
{($cmd,$text) = split(' ', $EVENT,2);
fhem("setreading $tts text ".ReadingsVal($tts,'text',' ').' '.$text.";sleep 0.4 tts;set $tts tts [$tts:text];sleep $tts:playing:.0 ;set $NAME notify [$tts:vol] [$tts:httpName];deletereading $tts text")}

if($cmd eq 'speak')
{($cmd,$vol,$text) = split(' ', $EVENT,3);
fhem("set $tts tts $text;sleep $tts:playing:.0;set $NAME notify $vol [$tts:httpName]")}

if($cmd eq 'playFav') {
use JSON;use HTML::Entities;use Encode qw(encode decode);
my $enc = 'UTF8';
my $uri='';my $search=(split(' ', $EVENT,2))[1];
$search=~s/[\/()]/./g;
my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];
my $decoded = decode_json(ReadingsVal($dev,'Favorites',''));
my @array=@{$decoded->{'Result'}};
foreach (@array) {if (encode($enc, decode_entities($_->{'Title'}))=~/$search/i)
{$uri = $_->{'TrackUri'} }
};
fhem("set $NAME playUri $uri") if ($uri ne '');
}

if($cmd eq 'devStateIcon')
{return sonos2mqtt_devStateIcon($NAME)}

if($cmd eq 'test')
{Log 1, "Das Device $NAME hat ausgeloest, die uuid ist >$uuid< der Befehl war >$cmd< der Teil danach sah so aus: $payload"}

return undef;
}


Das es geht hab ich festgestellt, aber ich frag mich trotzdem ob es richtig ist nach einem if die ; wegzulassen ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 20 Februar 2021, 10:54:50
ZitatMir mags nicht gelingen, klappt das bei dir ?
Ich habe das gestern Abend genau so eingebaut und das funktioniert so bei mir.

Das man Blöcke bei Perl nicht mit ; abschließen muss, habe ich bei meinen ersten Gehversuchen mit Perl mal "hart" gelernt und halte das konsequent ein. Da ich gern in der Kommandozeile teste, ist für mich jedes Semikolon zu viel ein doppeltes ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 20 Februar 2021, 11:33:25
Ich kann weiterhin keine Lautstärke setzen mit volume auch wenn ich deinen Code aus Github verwende, klappt das bei dir ?

setAVTUri klappt, joinGroup mein ich kann ich nicht testen (hab ich mich bisher nicht beschäftigt) weil ich nur einen Player habe.

sub sonos2mqtt
{
my ($NAME,$EVENT)=@_;
my @arr = split(' ',$EVENT);
my ($cmd,$vol,$text,$value);
$cmd = $arr[0];

if($cmd eq 'devStateIcon') {return sonos2mqtt_devStateIcon($NAME)}
if($cmd eq 'sayText') { ($cmd,$text) = split(' ', $EVENT,2)}
if($cmd eq 'speak') { ($cmd,$vol,$text) = split(' ', $EVENT,3)}
my $tts = ReadingsVal('SonosBridge','tts','SonosTTS');
my $uuid = ReadingsVal($NAME,'uuid','error');

my $payload = $EVENT;
if (@arr == 1){$payload = "leer"} else {$payload =~ s/$cmd //}

my @test = ('stop','play','pause','toggle','volumeUp','volumeDown','next','previous');
if (grep { $_ eq $cmd } @test) {return lc( qq(sonos/$uuid/control { "command": "$cmd" }) )}

my %t=('volume'=>'volume','joinGroup'=>'joingroup','setAVTUri'=>'setavtransporturi');
if (grep { $_ eq $cmd } %t) {return qq(sonos/$uuid/control { "command": "$t{$cmd}", "input": "$payload" })}

if($cmd eq 'notify') {return qq(sonos/$uuid/control { "command":"notify","input":{"trackUri":"$arr[2]","onlyWhenPlaying":false,"timeout":100,"volume":$arr[1],"delayMs":700}})}
if($cmd eq 'x_raw_payload') {return qq(sonos/$uuid/control $payload)}

#%t=('true'=>'mute','false'=>'unmute');
#if($cmd eq 'mute')   {return qq(sonos/$uuid/control { "command": "$t{$payload}" } )}
if($cmd eq 'mute')   {$value = $payload eq "true" ? "mute" : "unmute"; return qq(sonos/$uuid/control { "command": "$value" } )}
#%t=('TV'=>'tv','Line_In'=>'line','Queue'=>'queue');
#if($cmd eq 'input')  {return qq(sonos/$uuid/control { "command": "switchto$t{$payload}" } ) }
if($cmd eq 'input')  {$value = $payload eq "TV" ? "tv" : $payload eq "Line_In" ? "line" : "queue"; return qq(sonos/$uuid/control { "command": "switchto$value" } ) }

if($cmd eq 'leaveGroup') {$value = ReadingsVal($uuid,"groupName","all"); return qq(sonos/$uuid/control { "command": "leavegroup",  "input": "$value" } ) }

if($cmd eq 'playUri') {fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play")}
if($cmd eq 'sayText') {fhem("setreading $tts text ".ReadingsVal($tts,'text',' ').' '.$text.";sleep 0.4 tts;set $tts tts [$tts:text];sleep $tts:playing:.0 ;set $NAME notify [$tts:vol] [$tts:httpName];deletereading $tts text")}
if($cmd eq 'speak') {fhem("set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]")}
if($cmd eq 'playFav') {
use JSON;use HTML::Entities;use Encode qw(encode decode);
my $enc = 'UTF8';my $uri='';my $search=(split(' ', $EVENT,2))[1];
$search=~s/[\/()]/./g;
my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];
my $decoded = decode_json(ReadingsVal($dev,'Favorites',''));
my @array=@{$decoded->{'Result'}};
foreach (@array) {if (encode($enc, decode_entities($_->{'Title'}))=~/$search/i)
                   {$uri = $_->{'TrackUri'} }
    };
fhem("set $NAME playUri $uri") if ($uri ne '');
}

if($cmd eq 'test') {Log 1, "Das Device $NAME hat ausgeloest, die uuid ist >$uuid< der Befehl war >$cmd< der Teil danach sah so aus: $payload"}

return undef;
}


attr Sonos_Wohnzimmertest setList stop:noArg {sonos2mqtt($NAME,$EVENT)}\
play:noArg {sonos2mqtt($NAME,$EVENT)}\
pause:noArg {sonos2mqtt($NAME,$EVENT)}\
toggle:noArg {sonos2mqtt($NAME,$EVENT)}\
volumeUp:noArg {sonos2mqtt($NAME,$EVENT)}\
volumeDown:noArg {sonos2mqtt($NAME,$EVENT)}\
volume:slider,0,1,100,5 {sonos2mqtt($NAME,$EVENT)}\
mute:true,false {sonos2mqtt($NAME,$EVENT)}\
next:noArg {sonos2mqtt($NAME,$EVENT)}\
previous:noArg {sonos2mqtt($NAME,$EVENT)}\
joinGroup:textField {sonos2mqtt($NAME,$EVENT)}\
leaveGroup:noArg {sonos2mqtt($NAME,$EVENT)}\
setAVTUri:textField {sonos2mqtt($NAME,$EVENT)}\
playUri:textField {sonos2mqtt($NAME,$EVENT)}\
input:Queue,TV {sonos2mqtt($NAME,$EVENT)}\
notify:textField {sonos2mqtt($NAME,$EVENT)}\
x_raw_payload:textField {sonos2mqtt($NAME,$EVENT)}\
sayText:textField {sonos2mqtt($NAME,$EVENT)}\
speak:textField {sonos2mqtt($NAME,$EVENT)}\
test:textField {sonos2mqtt($NAME,$EVENT)}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 20 Februar 2021, 11:47:08
Ja Mist: unzureichenden getestet. Ich hatte es gestern abend noch gesehen, aber gedacht es funktioniert:
"$payload" bei den Strings ->  $payload bei den Zahlen.

Das wäre jetzt hier wieder ne Ausnahme in dem Dreiergespann, dann macht das mMn keinen Sinn. Dann ist der ursprüngliche Konstrukt genauso lang und simpler :) Auch wenn es mit dem hash "anspruchsvoller" ist ;)
Ich lass es mal als Kommentar drin, vielleicht braucht man es noch :)
if($cmd eq 'volume') {$ret = qq(sonos/$uuid/control { "command": "volume", "input": $payload })}

#my %t=('joinGroup'=>'joingroup','setAVTUri'=>'setavtransporturi');
#if (grep { $_ eq $cmd } %t) {return qq(sonos/$uuid/control { "command": "$t{$cmd}", "input": "$payload" })}

if($cmd eq 'joinGroup') {$ret = qq(sonos/$uuid/control { "command": "joingroup",  "input": "$payload"})}
if($cmd eq 'setAVTUri') {$ret = qq(sonos/$uuid/control { "command": "setavtransporturi",  "input": "$payload"})}

Wenn Du im GitHub weiter unten schaust habe ich das hash Konstrukt noch bei den "? w:f " Schlangen mal versucht. Es bringt auch auch keine Übersichtlichkiet und ist glaube ich sogar ungenauer als der Vergleich. 

Ergänzung: bei meinem/unserem Code von #837 war noch die Einfügung von lc() entscheidend - sonos2mqtt wil volumeup und nicht volumeUp  ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 20 Februar 2021, 18:30:29
Nochmal eine andere Variante.

Machts nicht kürzer sondern länger und obs übersichtlicher/simpler ist wsl. Ansichtssache.

Ich würd jetzt aber trotzdem gerne wissen warum playUri und die anderen restlichen Befehle wenn man sie erweitern wollte nicht klappt/klappen.

Was ist an der Definition von $pU falsch ?

Ein
Zitat{return fhem("set Sonos_Wohnzimmertest setAVTUri x-sonosapi-stream:s20293?sid=254&flags=8224&sn=0;; sleep 1;; set Sonos_Wohnzimmertest play")}
klappt zumindest auch aus der Kommandozeile auch ?

Zitatsub sonos2mqtt
{
   my ($NAME,$EVENT)=@_;
   my @arr = split(' ',$EVENT);
   my ($cmd,$vol,$text,$value);
   $cmd = $arr[0];
   my $payload = $EVENT;
   if (@arr == 1){$payload = "leer"} else {$payload =~ s/$cmd //};
   $value = $payload eq "true" ? "mute" : "unmute";
   my $tts = ReadingsVal('SonosBridge','tts','SonosTTS');
   my $uuid = ReadingsVal($NAME,'uuid','error');

   my $dSI = sonos2mqtt_devStateIcon($NAME);
   my $v = qq(sonos/$uuid/control { "command": "$cmd", "input": $payload });
   my $jG = qq(sonos/$uuid/control { "command": "joingroup", "input": "$payload" });
   my $sAU = qq(sonos/$uuid/control { "command": "setavtransporturi", "input": "$payload" });
   my $x_raw_payload = qq(sonos/$uuid/control $payload);
   my $m = qq(sonos/$uuid/control { "command": "$value" } );
   #my $pU = qq(fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play"));
   my $pU = fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play");

   my @test = ('stop','play','pause','toggle','volumeUp','volumeDown','next','previous');
   if (grep { $_ eq $cmd } @test) {return lc( qq(sonos/$uuid/control { "command": "$cmd" }) )}

my %sl1name2cmnd = (
   devStateIcon => "$dSI",
   volume => "$v",
   mute => "$m",
   joinGroup => "$jG",
   setAVTUri => "$sAU",
   playUri => "$pU",
   x_raw_payload => "$x_raw_payload"
   );
   my $sl1cmnd = %sl1name2cmnd{$cmd};
      return $sl1cmnd;
      
#if($cmd eq 'sayText') { ($cmd,$text) = split(' ', $EVENT,2)}
#if($cmd eq 'speak') { ($cmd,$vol,$text) = split(' ', $EVENT,3)}
#my $notify = qq(sonos/$uuid/control { "command":"notify","input":{"trackUri":"$arr[2]","onlyWhenPlaying":false,"timeout":#100,"volume":$arr[1],"delayMs":700}});
#my $sayText = ($cmd,$text) = split(' ', $EVENT,2);fhem("setreading $tts text ".ReadingsVal($tts,'text',' ').' '.$text.";sleep 0.4 tts;set #$tts tts [$tts:text];sleep $tts:playing:.0 ;set $NAME notify [$tts:vol] [$tts:httpName];deletereading $tts text");
#my $speak = ($cmd,$vol,$text) = split(' ', $EVENT,3);fhem("set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]");


#if($cmd eq 'notify') {return qq(sonos/$uuid/control { "command":"notify","input":{"trackUri":"$arr[2]","onlyWhenPlaying":false,"timeout":100,"volume":$arr[1],"delayMs":700}})}
#if($cmd eq 'playUri') {fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play")}

if($cmd eq 'sayText') {fhem("setreading $tts text ".ReadingsVal($tts,'text',' ').' '.$text.";sleep 0.4 tts;set $tts tts [$tts:text];sleep $tts:playing:.0 ;set $NAME notify [$tts:vol] [$tts:httpName];deletereading $tts text")}
if($cmd eq 'speak') {fhem("set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]")}

if($cmd eq 'leaveGroup') {$value = ReadingsVal($uuid,"groupName","all"); return qq(sonos/$uuid/control { "command": "leavegroup",  "input": "$value" } ) }
if($cmd eq 'input')  {$value = $payload eq "TV" ? "tv" : $payload eq "Line_In" ? "line" : "queue"; return qq(sonos/$uuid/control { "command": "switchto$value" } ) }
if($cmd eq 'playFav') {
   use JSON;use HTML::Entities;use Encode qw(encode decode);
   my $enc = 'UTF8';my $uri='';my $search=(split(' ', $EVENT,2))[1];
   $search=~s/[\/()]/./g;
   my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];
   my $decoded = decode_json(ReadingsVal($dev,'Favorites',''));
   my @array=@{$decoded->{'Result'}};
   foreach (@array) {if (encode($enc, decode_entities($_->{'Title'}))=~/$search/i)
                      {$uri = $_->{'TrackUri'} }
          };
         fhem("set $NAME playUri $uri") if ($uri ne '');
}

if($cmd eq 'test') {Log 1, "Das Device $NAME hat ausgeloest, die uuid ist >$uuid< der Befehl war >$cmd< der Teil danach sah so aus: $payload"}

return undef;
}

Hast du trotzdem eine Idee ?

edit:

Achso, mit

my $pU = qq(fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play"));
my $pU = q(fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play"));
my $pU = 'fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play")';


klappts nicht.

Mit

my $pU = "fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play")";

gibts 100% CPU-Auslastung
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 20 Februar 2021, 20:52:22
ich habe jetzt ganz bewusst nicht alles sondern nur das Rote gelesen.
Das kann nicht funktionieren: return gibt einen topic mit payload zurück und MQTT2 verarbeitet das.
Im Falle: wir führen irgendwelchen Code aus, muss MQTT2 ein undef bekommen und macht selbst nichts!

Also return undef! Wenn "irgendein" Befehl ausgeführt wird und MQTT2 nichts davon wissen soll.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 20 Februar 2021, 21:33:54
Danke, hab etwas gebraucht um zu verstehen, hab ich aber jetzt.

Bin gespannt ob und was mir dazu vlt. einfällt  ;D
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 20 Februar 2021, 21:59:34
Wenn wir mit dem Ding hier "nichts mehr zu tun haben", will ich Rudi fragen ob man die setList nicht auch im ' vorderen Teil ' dynamisch machen kann. Derzeit trau ich mir das noch nicht :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 20 Februar 2021, 23:13:56
Einmal noch heute.

Dann sollte doch aber die Definition von $n->notify möglich sein/ausgeführt werden ?

Will nämlich nicht, an was liegts hier ? Das der Zugriff auf die Elemente nochmal zusätzlich in {} erfolgt ? Komm nicht drauf.

Zitatsub sonos2mqtt
{
   my ($NAME,$EVENT)=@_;
   my @arr = split(' ',$EVENT);
   my ($cmd,$vol,$text,$value);
   $cmd = $arr[0];
   my $payload = $EVENT;
   if (@arr == 1){$payload = "leer"} else {$payload =~ s/$cmd //};
   $value = $payload eq "true" ? "mute" : "unmute";

   my $tts = ReadingsVal('SonosBridge','tts','SonosTTS');
   my $uuid = ReadingsVal($NAME,'uuid','error');

   my $dSI = sonos2mqtt_devStateIcon($NAME);
   my $jG = qq(sonos/$uuid/control { "command": "joingroup", "input": "$payload" });
   my $m = qq(sonos/$uuid/control { "command": "$value" } );
   my $n = qq(sonos/$uuid/control { "command":"notify","input":{"trackUri":"$arr[2]","onlyWhenPlaying":false,"timeout":#100,"volume":$arr[1],"delayMs":700}});
   my $sAU = qq(sonos/$uuid/control { "command": "setavtransporturi", "input": "$payload" });
   my $v = qq(sonos/$uuid/control { "command": "$cmd", "input": $payload });
   my $xrp = qq(sonos/$uuid/control $payload);
   
   my @test = ('stop','play','pause','toggle','volumeUp','volumeDown','next','previous');
   if (grep { $_ eq $cmd } @test) {return lc( qq(sonos/$uuid/control { "command": "$cmd" }) )};
      
   my %sl1name2cmnd = (
      devStateIcon => "$dSI",
      joinGroup => "$jG",
      mute => "$m",
      notify => "$n",
      setAVTUri => "$sAU",
      volume => "$v",
      x_raw_payload => "$xrp"
   );
   my $sl1cmnd = %sl1name2cmnd{$cmd};
      return $sl1cmnd;
      
#if($cmd eq 'notify') {return qq(sonos/$uuid/control { "command":"notify","input":{"trackUri":"$arr[2]","onlyWhenPlaying":false,"timeout":100,"volume":$arr[1],"delayMs":700}})}

#my $sayText = ($cmd,$text) = split(' ', $EVENT,2);fhem("setreading $tts text ".ReadingsVal($tts,'text',' ').' '.$text.";sleep 0.4 tts;set #$tts tts [$tts:text];sleep $tts:playing:.0 ;set $NAME notify [$tts:vol] [$tts:httpName];deletereading $tts text");
#my $speak = ($cmd,$vol,$text) = split(' ', $EVENT,3);fhem("set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]");
#if($cmd eq 'playUri') {fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play")}

if($cmd eq 'leaveGroup') {$value = ReadingsVal($uuid,"groupName","all"); return qq(sonos/$uuid/control { "command": "leavegroup",  "input": "$value" } ) }
if($cmd eq 'input')  {$value = $payload eq "TV" ? "tv" : $payload eq "Line_In" ? "line" : "queue"; return qq(sonos/$uuid/control { "command": "switchto$value" } ) }
if($cmd eq 'playFav') {
   use JSON;use HTML::Entities;use Encode qw(encode decode);
   my $enc = 'UTF8';my $uri='';my $search=(split(' ', $EVENT,2))[1];
   $search=~s/[\/()]/./g;
   my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];
   my $decoded = decode_json(ReadingsVal($dev,'Favorites',''));
   my @array=@{$decoded->{'Result'}};
   foreach (@array) {if (encode($enc, decode_entities($_->{'Title'}))=~/$search/i)
                      {$uri = $_->{'TrackUri'} }
          };
         fhem("set $NAME playUri $uri") if ($uri ne '');
}

if($cmd eq 'test') {Log 1, "Das Device $NAME hat ausgeloest, die uuid ist >$uuid< der Befehl war >$cmd< der Teil danach sah so aus: $payload"}

return undef;
}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 20 Februar 2021, 23:24:51
Blöde Frage aber warum ist da ein Doppelkreuz?
"timeout":#100
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 20 Februar 2021, 23:44:28
Unglaublich, das wars. Thx

Hatte ich mich auch schon gefragt, war der Meinung das kam so aus deinem Code und mir nichts dabei gedacht, hat sich irgendwie eingeschlichen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: m8ichael am 23 Februar 2021, 12:02:56
Zitat von: Otto123 am 09 Dezember 2020, 17:18:16
Hallo Thomas,

ich glaube dein Problem ist jetzt:
Du hast alles als Pi gemacht, der Prozess startet jetzt auch mit user pi - aber manches hast Du mit sudo gemacht?
Der pm2 kann praktisch in jedem User Kontext separat laufen (ihr könnt mich schlagen wenn das nicht stimmt - ich hatte es geschafft das alles doppelt lief)
Schau mal pm2 läuft als user fhem, als user pi und als user root sehe ich nix:
pm2 list
[PM2] Spawning PM2 daemon with pm2_home=/home/pi/.pm2
[PM2] PM2 Successfully daemonized
┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name      │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
pi@raspib3plus:~ $ sudo -u fhem pm2 list
┌─────┬───────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name          │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼───────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ sonos2mqtt    │ default     │ N/A     │ fork    │ 20737    │ 21D    │ 0    │ online    │ 0%       │ 52.8mb   │ fhem     │ disabled │
└─────┴───────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
pi@raspib3plus:~ $ sudo pm2 list
┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name      │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
pi@raspib3plus:~ $

Ich werde aber deinen Prozess nochmal durchspielen, offenbar fehlt ja was in der Doku :)

Hi,

ich habe die Doku 1:1 durchgespielt, es allerdings noch nicht geschafft, s2m per pm2 zu starten. Egal, welchen User ist nutze, die o. a. Liste ist stets leer. Hat jemand einen Tipp, wie vorzugehen ist? Habe bereits nodejs komplett neu installiert, aber keine Änderung...

Ganz generell funktioniert s2m (auch in FHEM), aber eben nicht per Aufruf durch pm2...

Viele Grüße

Michael
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 23 Februar 2021, 12:46:44
Hallo Michael,

was bedeutet das es läuft, wie läuft es denn?

Ich vermute mal Du hast ALLES abgearbeitet?  ???

Wenn alles Standard ist - ist weiter nichts als:
(nodejs schon installiert)
Im System
sudo npm install -g sonos2mqtt

Diesen Code in FHEM Raw Definition ausführen (vorher nur NameDesVorhandenenMQTT2Servers richtig ändern!):
define SonosBridge MQTT2_DEVICE
attr SonosBridge IODev NameDesVorhandenenMQTT2Servers
attr SonosBridge room MQTT2_DEVICE
define n_pm2_sonos notify global:INITIALIZED|n_pm2_sonos:start "pm2 -s start sonos2mqtt"
sleep global:ATTR.SonosBridge.stateFormat.connected;trigger n_pm2_sonos start
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort


Wenn Du dann im System das eingibst, solltest Du den Prozess laufen sehen
sudo -u fhem pm2 list
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: m8ichael am 23 Februar 2021, 14:00:17
Hallo Otto,

Zitat von: Otto123 am 23 Februar 2021, 12:46:44
Hallo Michael,

was bedeutet das es läuft, wie läuft es denn?

Ich vermute mal Du hast ALLES abgearbeitet?  ???

Wenn alles Standard ist - ist weiter nichts als:
(nodejs schon installiert)
Im System
sudo npm install -g sonos2mqtt

Diesen Code in FHEM Raw Definition ausführen (vorher nur NameDesVorhandenenMQTT2Servers richtig ändern!):
define SonosBridge MQTT2_DEVICE
attr SonosBridge IODev NameDesVorhandenenMQTT2Servers
attr SonosBridge room MQTT2_DEVICE
define n_pm2_sonos notify global:INITIALIZED|n_pm2_sonos:start "pm2 -s start sonos2mqtt"
sleep global:ATTR.SonosBridge.stateFormat.connected;trigger n_pm2_sonos start
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort


Wenn Du dann im System das eingibst, solltest Du den Prozess laufen sehen
sudo -u fhem pm2 list

Ja, wenn ich auf in der shell s2m starte, dann funktioniert alles, d. h., FHEM kann die Verbindung zu den SONOS-Geräten herstellen etc. Problem ist nur, dass der Start von s2m per pm2 nicht funktioniert, d.h., die Prozessliste per

sudo -u fhem pm2 list

ist leer. Egal, ob ich pm2 unter pi, root oder auch fhem starte. Irgendwie funzt pm2 halt nicht...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 23 Februar 2021, 15:38:16
Zitat von: m8ichael am 23 Februar 2021, 14:00:17
Ja, wenn ich auf in der shell s2m starte,
Wie? Mit node /usr/lib/node_modules/sonos2mqtt ?

Bei pm2 bin ich auch bloß User - ich kann da genausoweit gucken was ich aufgeschrieben habe und was das Programm hergibt. Wobei pm2 ziemlich viel erzählt... Die größte Hürde für mich war zu verstehen, dass es davon abhängt wer, wie installiert hat und aufruft ...

Ich hab gute Erfahrungen mit docker gemacht, vielleicht ist das wirklich die Lösung: einfach wenn's schwierig ist den Container nehmen  ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 24 Februar 2021, 12:53:44
Ich habe jetzt mal das Setup neu überlegt, die Templates etwas umgestaltet und alles Wesentliche auf sonos2mqttUtils gepackt. Den Code dort kann man noch besser strukturieren, mir ging es erstmal darum, dass das was jetzt läuft auch wieder läuft und unterm Strich alles ein bisschen besser und effektiver ist. Schön wäre, wenn es jemand testen würde.
Das Setup
1. Schritt: sonos2mqtt irgendwie einrichten und startfähig machen, entweder wie bisher mit pm2, oder lokal anders im System, oder den docker Container nehmen.
2. Schritt: wenn es schon lief: aufräumen! Die alten beiden notify müssen weg!
sonos2mqtt stoppen "pm2 stop sonos2mqtt" oder den container stoppen
delete n_configSonos.
delete a:model=sonos2mqtt_speaker

3. Schritt: Vorbereitung treffen, die Utils holen und temporär die anderen Templates (keine Angst kann später wieder zurücksetzen).
Edit: Ab heute ist die Utils im SVN damit entfällt der erste Step, die Utils wird jetzt im Template sonos2mqtt_bridge_comfort geladen
{qx(wget -qO ./FHEM/99_sonos2mqttUtils.pm https://raw.githubusercontent.com/heinz-otto/scripts/master/fhem/99_sonos2mqttUtils.pm);;fhem('reload 99_sonos2mqttUtils.pm')}
{qx(wget -qO ./FHEM/lib/AttrTemplate/mqtt2.template https://raw.githubusercontent.com/heinz-otto/scripts/master/fhem/mein.template) ;;sleep 0.2;; AttrTemplate_Initialize()}

4. Schritt: die Bridge definieren bzw. Template setzen
define SonosBridge MQTT2_DEVICE
attr SonosBridge IODev mqtt2s
attr SonosBridge room MQTT2_DEVICE
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort

5. Schritt: sonos2mqtt starten und zuschauen wie die Player angelegt werden.  8)

Wenn sie alle da sind kann man die offiziellen Templates wiederholen:
{ Svn_GetFile("FHEM/lib/AttrTemplate/mqtt2.template", "FHEM/lib/AttrTemplate/mqtt2.template", sub(){ AttrTemplate_Initialize() }) }
Die Neuanlage der Speaker funktioniert auch mit dem offiziellen Template.

@Beta-User Hast Du eine Idee wo wir die 99_sonos2mqttUtils.pm hinpacken? SVN contrib? Ich hole mir da einen Zugang? Sollten wir diese Datei innerhalb des Bridge Template herunterladen? 

Ergänzung:  Die Erzeugung der Favoriten und Gruppen Liste am Player erfolgt mit je einem setter in der Bridge. Das ist jetzt so ein Henne/Ei Problem was ich noch nicht gelöst habe: Beim Anlegen der Bridge gibt es noch keinen Player, aber nur über einen Player kann ich die Liste abrufen. Die Gruppenliste macht eh erst Sinn wenn alle Player da sind. Also erstmal so:
per Hand die Favoriten lesen get Favorites
per Hand die Player um die Listen ergänzen set setplayFav, set setjoinGroup
Das Thema ist damit noch nicht perfekt, die Favoriten sind über playUri nicht alle abspielbar, bei mir funktionieren nur radios. Es gibt auch noch die Radiofavoriten die man in TuneIn anlegen kann, die könnte man auch auslesen.
Jetzt muss ich mich noch um das Setup der Speakfunktion und die Auswahl der TTS Variante kümmern.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 24 Februar 2021, 13:02:11
Zitat von: Otto123 am 24 Februar 2021, 12:53:44
@Beta-User Hast Du eine Idee wo wir die 99_sonos2mqttUtils.pm hinpacken? SVN contrib? Ich hole mir da einen Zugang? Sollten wir diese Datei innerhalb des Bridge Template herunterladen?
Ui, sehr versteckt...

Zugang über Rudi (bzw. die allgemein hierfür vorgesehene email-Adresse) beantragen wie in https://svn.fhem.de/ beschrieben (key mitschicken etc.).

Würde das ähnlich machen wie bei ebus&anderen, also die speziellen myUtils nach contrib, und die dann von dort holen, wenn das Basistemplate geladen/angewandt wird.

Du darfst dich auch gerne als 2. Maintainer ein mqtt2.template eintragen, wenn du magst ;) .
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 27 Februar 2021, 20:51:34
Hallo Otto, Hallo all die anderen,
nachdem ich vor 58 Seiten angefangen habe, dachte ich irgendwann ich lese mal Eure letzten Beiträge und bin dann auf diesen gestoßen ;-)

Zitat von: Otto123 am 24 Februar 2021, 12:53:44
Schön wäre, wenn es jemand testen würde.

GERN!

2. Schritt: wenn es schon lief: aufräumen! Die alten beiden notify müssen weg!
sonos2mqtt stoppen "pm2 stop sonos2mqtt" oder den container stoppen

CHECK

{qx(wget -qO ./FHEM/lib/AttrTemplate/mqtt2.template ./FHEM/99_sonos2mqttUtils.pm https://raw.githubusercontent.com/heinz-otto/scripts/master/fhem/mein.template) ;;sleep 0.2;; AttrTemplate_Initialize()}

2021.02.27 20:09:44 2: AttrTemplates: got 104 entries


Bridge definiert (MQTT Server vorhanden)

define SonosBridge MQTT2_DEVICE
attr SonosBridge IODev MQTT2_FHEM_Server
attr SonosBridge room MQTT2_DEVICE
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort


Screenshot -MQTT_RINCON angelegt

i@fhem:~ $ pm2 start sonos2mqtt
[...]
┌─────┬────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name           │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ LandroidSrv    │ default     │ N/A     │ fork    │ 1054     │ 44h    │ 0    │ online    │ 0%       │ 53.9mb   │ pi       │ disabled │
│ 1   │ sonos2mqtt     │ default     │ N/A     │ fork    │ 5294     │ 0s     │ 0    │ online    │ 0%       │ 17.4mb   │ pi       │ disabled │
└─────┴────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 27 Februar 2021, 21:01:21
Danke fürs testen. Stimmt volumeUp und volumeDown wird mit meinem neuen Setup nicht angelegt. Schau ich mir an!

Du brauchst eigentlich nur die SonosTTS anlegen - steht im Wiki :)

Edit: ok habs gefunden und einen "dirty fix" - bau ich ein und schiebe es dann ins svn - ich melde mich.
Es liegt an der Reihenfolge im Array in der setup Routine - so geht erst mal:
'volume:slider,0,1,100','volumeUp:noArg','volumeDown:noArg',
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 27 Februar 2021, 21:23:27
sehr gern.
set notify mit
20 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3
klappt auch

kannst Du mir sagen, wo ich finde wie ich einen slider für Volume in die webcmd bauen kann?

Favoriten in der Bridge mit "setplayfav" - dann stehen sie in den playern zur Verfügung und können ausgewählt werden, aber "nur" die Radiosender, keine Playlisten, richtig?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 27 Februar 2021, 21:31:02
Du redest von dem was Du jetzt siehst? Das ist kein webcmd das ist devStateIcon.
Der Slider webcmd ginge so in der Art
attr MQTT2_RINCON_347E5C82560801400 webCmd volume
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 27 Februar 2021, 21:38:52
jetzt auch gesehen. Sorry attr MQTT2_RINCON.* webCmd volume
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 27 Februar 2021, 21:41:55
Zitat von: Stefan_Hvr am 27 Februar 2021, 21:23:27
Favoriten in der Bridge mit "setplayfav" - dann stehen sie in den playern zur Verfügung und können ausgewählt werden, aber "nur" die Radiosender, keine Playlisten, richtig?
Ja irgendwie ist die uri der Playlisten anders und geht nicht so einfach. Bei mir sind Radios die einzigen die funktionieren.
Ich schau mir das sicher später mal noch an.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 27 Februar 2021, 21:51:38
Als ich eben
set joinGroup aufgerufen habe und den Namen des Players eingetippt habe wurde die Gruppe gebildet.

Dann habe ich in der Bridge
set SonosBridge setjoinGroup ausführt

dann ist das Auswahlmenü im Player vorhanden, aber ein

set PLAYER joinGroup  wird nicht mehr ausgeführt

2021-02-27 21:50:59 MQTT2_DEVICE MQTT2_RINCON_000E588C315C01400 joinGroup erscheint im EventMonitor
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 27 Februar 2021, 22:35:39
ich kann gerade nicht nachvollziehen was da passiert ist. Ich schau es mir morgen an.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 27 Februar 2021, 23:27:48
der Unterschied zwischen saytext und speak ist mir nicht klar. wenn Du ihn mir sagt würde ich das im Wiki ergänzen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 27 Februar 2021, 23:34:34
nochmal nachgefragt:
set SonosBridge setjoinGroup Fehler ich meinte
set PLAYER joinGroup
da gehört schon noch die Gruppe dazu? Egal ob da eine Liste ist oder nicht, im direkten Kommando muss die Gruppe dazu.

Lass das mal bitte mit dem Wiki. Wenn ich die Umstellung fertig habe muss ich das sowieso umbauen.

Der speak Befehl ist in Anlehnung an das klassische Sonos Modul, der ist aber genaugenommen nicht Development Guidelines konform.
sayText ist Guidelines konform. Lautstärke wird dabei nicht direkt im Befehl gesetzt sondern extra.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 27 Februar 2021, 23:44:12
Danke für die Erläuterung.

set SonosBridge setjoinGroup - da kommt KEINE Gruppe dahinter, dachte ich. Damit werden doch die Gruppen (möglichen Gruppen?) in die Player geschrieben. da ist ja auch weder ein Auswahlfeld noch ein Textfeld

set PLAYER leaveGroup = PLAYER verlässt die Gruppe = OK
set PLAYER joinGroup NAME PLAYER soll zu einer Gruppe = klappt nicht mehr
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 28 Februar 2021, 00:21:25
Ja klar ich habe das falsche Kommando kopiert (oben editiert)
set PLAYER joinGroup NAME
klappt bei mir nach wie vor.
Also z.B.
set alias=Kueche joinGroup Bad

Ich habe irgendwie einen eigenartigen Fehler bei einem Player wenn ich setjoinGroup in der Bridge ausführe. den versteh ich gar nicht  >:(
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 28 Februar 2021, 00:39:58
Du nimmst irgendeinen PLAYER, der in keiner Gruppe ist und fügst ihn zum Bad dazu.
Ist Bad in dem Moment Master oder Member?  oder Stand alone?

bei mir geht
set alias=Kueche joinGroup Bad oder set PLAYERNAME joinGroup Bad nicht

if($cmd eq 'joinGroup') {return qq(sonos/$uuid/control { "command": "joingroup",  "input": "$payload"})} - so steht es in der 99_sonos2mqttUtils.pm falls Dir das weiterhilft
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 28 Februar 2021, 00:53:46
Es ist eigentlich egal
Alle sind für sich.
Ich mache
set alias=Bad joinGroup Arbeitszimmer
set alias=Kueche joinGroup Bad

Anschließend sind drei Player in der Gruppe Arbeitszimmer

Edit: Das Problem ist sicher: durch einen mir nicht klaren Fehler wird bei einem Player das joinGroup setList nicht richtig gesetzt - mit dem funktioniert es nicht.
Wenn Du da mal schaust und es einfach so setzt wie bei den anderen sollte alles gehen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 28 Februar 2021, 13:20:37
Einer meiner Player ist im Raum "Steffis Reich", dadurch ein Leerzeichen in der setlist
joinGroup:Bad,Esszimmer,Gäste-WC,Küche,Lina,Schlafzimmer,Steffis Reich,Wohnzimmer {sonos2mqtt($NAME,$EVENT)} dann geht's nicht mehr. Lösche ich den Raum aus der Setlist ist alles OK
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 28 Februar 2021, 13:29:34
Naja, es gibt da also noch ein paar Dinge zu machen ;)
Die Sache mit der Klappliste dachte ich ist vielleicht ein Gimmick, aber jetzt habe ich Stunden nach einem Fehler gesucht den die Routine bei mir wirft (ich bin am glauben: da ist an einer ganz anderen Stelle was faul) und habe erstmal keine Lust mehr.  :'(

Kommt Zeit ... bis dahin geht's auch ohne :) ich konzentrier mich erstmal auf das Setup Sprachausgabe und die Auswahl TTS.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 28 Februar 2021, 18:46:18
Steffis Reich heisst jetzt in Sonos schon Steffis-Reich. ;-) Der Weg des geringsten Widerstands :-) - damit ist alles gut.

Noch ein Hinweis zum sayText bzw. speak - das hier funktioniert bei mir nach dem Fhem-Wiki. Danke!
Hast Du schon ne Idee wie man Durchsagen an mehrere Gruppen senden kann?
Ich hatte im Sonos-Modul immer dies, damit wurde in jeder Gruppe die Ansage (asynchron) gestartet.
set TYPE=SONOSPLAYER:FILTER=IsMaster=1 -->

So klappt's aber nicht. - Hat ganz merkwürdige Ergebnisse an den Tag gebracht.
set isMaster=1 sayText Hallo Du <Text>
set isMaster=1 speak <Lautstärke> <Text>


set SonosTTS tts <TEXT>; sleep SonosTTS:playing:.0 ; set isMaster=1 notify 25 [SonosTTS:httpName]
aus dem Wiki klappt für mich aber als Workaround.

Letzte Frage:
ich würde gern den Sleep Timer im Sonos setzen.
kannst Du mir nen Tipp geben, wie ich das publishen kann. habe damit keinen Erfolg:
set MQTT2_FHEM_Server publish sonos/RINCON_5CAAFD99F2A201400/control {  "command": "sleep",  "input": 30}

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 28 Februar 2021, 19:18:29
Hab noch nie einen sleep-Timer genutzt und einfach mal ausprobiert.

Einfach die setList wie folgt ergänzt und das klappt bei mir:

sleep:slider,0,1,60,1 sonos/RINCON_000E58F7F67C01400/control {  "command": "sleep",  "input": $EVTPART1}

Ein paar Sekunden vor Ende des Timer wird die Lautstärke immer kleiner.(edit: das Reading volume ändert sich aber nicht)

Ein Reading dazu gibts nicht/wurde nicht angelegt, den MQTT-Verkehr hab ich mir nicht angeschaut.

Gruß

Thomas

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 28 Februar 2021, 20:45:35
Für so Experimente haben wir ja x_raw_payload  eingebaut, da kann man mal das einwerfen was in der Doku steht ;)
Für solche globalen Dinge (Durchsage an Alle) gibt es noch diese Info https://svrooij.io/sonos2mqtt/global-commands.html
Ich habe es noch nicht probiert.

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 28 Februar 2021, 22:56:27
Stefan, Du hattest nach dem Unterschied speak und sayText gefragt, ich habe gestern etwas wesentliches vergessen:
sayText beherrscht mehrere Ausgaben in kurzer Folge, also wenn von unterschiedlichen Ecken Ansagen in kurzer Folge abgeschickt werden, entsteht kein Sprachsalat sondern alles wird schön aneinandergereiht und als Block ausgegeben.
Beispiel als Block zum testen in der Raw Def absetzen
set alias=Kueche speak 20 Hallo Willi
set alias=Kueche speak 20 wie geht es heute
set alias=Kueche speak 20 war das Abendessen gut?

set alias=Kueche sayText Hallo Willi
set alias=Kueche sayText wie geht es heute
set alias=Kueche sayText war das Abendessen gut?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 28 Februar 2021, 23:33:27
Zitat von: Otto123 am 28 Februar 2021, 22:56:27
Stefan, Du hattest nach dem Unterschied speak und sayText gefragt, ich habe gestern etwas wesentliches vergessen:
sayText beherrscht mehrere Ausgaben in kurzer Folge, also wenn von unterschiedlichen Ecken Ansagen in kurzer Folge abgeschickt
[...]
Super --- sehr gutes Beispiel
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 28 Februar 2021, 23:53:25
Zitat von: TomLee am 28 Februar 2021, 19:18:29
Hab noch nie einen sleep-Timer genutzt und einfach mal ausprobiert.
Einfach die setList wie folgt ergänzt und das klappt bei mir:
sleep:slider,0,1,60,1 sonos/RINCON_000E58F7F67C01400/control {  "command": "sleep",  "input": $EVTPART1}
Ein paar Sekunden vor Ende des Timer wird die Lautstärke immer kleiner.(edit: das Reading volume ändert sich aber nicht)
Ein Reading dazu gibts nicht/wurde nicht angelegt, den MQTT-Verkehr hab ich mir nicht angeschaut.

Gruß
Thomas

hab die setList erweitert::

sleep:15,30,45,60,120 {sonos2mqtt($NAME,$EVENT)}

und die 99_sonos2mqttUtils.pm
if($cmd eq 'sleep') {return qq(sonos/$uuid/control {"command":"sleep","input":$payload}) }
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 01 März 2021, 00:18:06
Und ?

Klappt oder nicht ?




Die Alternative zur statischen Angabe:

Zitatsleep:15,30,45,60,120 {sonos2mqtt($NAME,$EVENT)}

selectnumbers (https://wiki.fhem.de/wiki/FHEMWEB/Widgets):

sleep:selectnumbers,0,15,120,0,lin
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 01 März 2021, 00:53:50
Zitat von: TomLee am 01 März 2021, 00:18:06
Und ?
Klappt oder nicht ?
Danke für den Hinweis
Jau haut hin, wenn die Speaker nicht gruppiert sind. Ich denke es muss immer an den Master gehen, wenn ich das richtig sehe.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 01 März 2021, 01:00:14
Zitat von: Otto123 am 28 Februar 2021, 20:45:35
Für so Experimente haben wir ja x_raw_payload  eingebaut, da kann man mal das einwerfen was in der Doku steht ;)
Für solche globalen Dinge (Durchsage an Alle) gibt es noch diese Info https://svrooij.io/sonos2mqtt/global-commands.html
Ich habe es noch nicht probiert.

Ich habe das Folgende in der setList ergänzt:
notifyall:textField {sonos2mqtt($NAME,$EVENT)}
announcementall:textField {sonos2mqtt($NAME,$EVENT)}


dazu die 99_sonos2mqttUtils.pm ergänzt um:
if($cmd eq 'announcementall') { ($cmd,$text) = split(' ', $EVENT,2)}
if($cmd eq 'notifyall') {return qq(sonos/cmd/notify {"trackUri":"$arr[2]","onlyWhenPlaying":false,"timeout":100,"volume":$arr[1],"delayMs":700})}
if($cmd eq 'announcementall') {fhem("setreading $tts text ".ReadingsVal($tts,'text',' ').' '.$text.";sleep 0.4 tts;set $tts tts [$tts:text];sleep $tts:playing:.0 ;set $NAME notifyall [$tts:vol] [$tts:httpName];deletereading $tts text")}


mit announcementall kann ich jetzt die Durchsage/notify an alle Speaker geben
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 März 2021, 12:36:25
Für die Tester:
Als Zwischenschritt zum Testen habe ich ne neue Version eingecheckt:

{ Svn_GetFile("contrib/AttrTemplate/99_sonos2mqttUtils.pm", "FHEM/99_sonos2mqttUtils.pm", sub(){ CommandReload(undef, "99_sonos2mqttUtils") }) }

Die Klapplisten für Favoriten und Gruppen kann derzeit so in der FHEM Kommandozeile erfolgen:
{sonosmqtt('SonosBridge','setjoinGroup')}
{sonosmqtt('SonosBridge','setplayFav')}
ein Aufruf über die setList der Bridge wirft bei mir einen unklaren Fehler.

Das Setup für die SonosTTS wird wohl besser weiterhin manuell erfolgen.

Jetzt muss ich mal noch die offiziellen Templates, das Wiki und den ersten Beitrag anpassen.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 01 März 2021, 14:30:32
Zitat von: Otto123 am 01 März 2021, 12:36:25
Das Setup für die SonosTTS wird wohl besser weiterhin manuell erfolgen.

Den Punkt verstehe ich nicht.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 März 2021, 14:57:01
Ich meine das Device SonosTTS (oder alternativ die sonos-tts von Stefan) an sich.
Ich wollte eigentlich gern so eine Art komplettes Setup Script machen, aber für die "Text zu Sprache" Wandlung an sich, sind einige Eventualitäten abzuklopfen. Gerade Text2Speech hat ja auch Abhängigkeiten.

Die Befehle sind jetzt drin, es ist die Frage ob man da noch was abfangen muss, wenn sie einer verwendet aber SonosTTS (sonos-tts) nicht installiert hat.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 01 März 2021, 15:24:18
Aaaaah, jetzt, ja :-)

Also, wenn man sonos-tts nutzt, dann werden 1x die input-Felder gefüllt.

Zusätzlich aber auch, sieht man den Erfolg so:

currentTrack_Album sonos-tts-polly by @Svrooij
currentTrack_AlbumArtUri http://192.168.178.31:1400/getaa?s=1&u=x-sonos-spotify:spotify:track:39m87lOMd5ccENPVvAT7gH%3fsid%3d9%26flags%3d8224%26sn%3d2
currentTrack_Artist Vicki Amazon Polly de-DE


Man könnte also einmal eine Testdurchsage "Sonos-TTS wurde korrekt installiert" machen, schauen ob currentTrack_Album passt und entsprechend eine Meldung "sonos-tts ok" bzw. "ooops, sonos-tts will noch nicht richtig" machen.

Oder meintest du das anders?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 01 März 2021, 21:03:00
Zitat von: TomLee am 28 Februar 2021, 19:18:29
Einfach die setList wie folgt ergänzt und das klappt bei mir:
sleep:slider,0,1,60,1 sonos/RINCON_000E58F7F67C01400/control {  "command": "sleep",  "input": $EVTPART1}

Hi Thomas, Hi Otto,
zur Info: der Sleeptimer geht nur bis 59 Minuten. Scheinbar gibt es ab 60 Minuten eine andere Syntax
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 01 März 2021, 21:34:36
Wenn man hier (https://svrooij.io/sonos2mqtt/control/commands.html#) unter den ganzen aufgeführten Kommandos den Link mappings aufruft steht da was von Wert unter 60, mglw. ist das dann so, dazu versteh ich aber zu wenig vom Code.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 März 2021, 22:02:12
unter 60 gilt als minuten und wird intern in dieses Format gewandelt: "00:59:00"
So gehts mit String { "command":"sleep","input":"01:30:00" } und geht quasi direkt.

Ok bauen wir mal noch um
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 März 2021, 22:06:48
Es ist seit kurzem ein in sich konsistenter Stand (template passt zu sonos2mqttUtils) im SVN.

Also einfach Templates laden und anwenden:
{ Svn_GetFile("FHEM/lib/AttrTemplate/mqtt2.template", "FHEM/lib/AttrTemplate/mqtt2.template", sub(){ AttrTemplate_Initialize() }) }

Der erste Teil im Wiki ist auch etwas angepasst: https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Sonos2Mqtt
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 01 März 2021, 22:13:04
Zitat von: Otto123 am 01 März 2021, 22:02:12
unter 60 gilt als minuten und wird intern in dieses Format gewandelt: "00:59:00"
So gehts mit String { "command":"sleep","input":"01:30:00" } und geht quasi direkt.
set a:model=sonos2mqtt_speaker:FILTER=isMaster=1 sleep "01:30:00" klappt auch
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 März 2021, 22:21:30
ginge dann so - -als Test: {my $payload =110;;strftime("%H:%M:%S",gmtime($payload*60))}

Baue ich ein.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 01 März 2021, 22:29:12
Zitat von: Otto123 am 01 März 2021, 22:21:30
ginge dann so - -als Test: {my $payload =110;;strftime("%H:%M:%S",gmtime($payload*60))}
Baue ich ein.

Du kannst Sachen... :-) ;-)

Zitat von: Otto123 am 01 März 2021, 22:06:48
Es ist seit kurzem ein in sich konsistenter Stand (template passt zu sonos2mqttUtils) im SVN.
Also einfach Templates laden und anwenden:
{ Svn_GetFile("FHEM/lib/AttrTemplate/mqtt2.template", "FHEM/lib/AttrTemplate/mqtt2.template", sub(){ AttrTemplate_Initialize() }) }


Beim Anwenden des Templates am Player bekomme ich:
unknown command $DEVICETOPIC/RINCON_5CAAFD9AC1AC01400/ZoneInfo:.*, try help.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 März 2021, 23:08:19
ok danke, schau ich mir an. Da hab ich Mist eingebaut. Das automatische Anlegen funktioniert, da sieht man den Fehler nur im Log.  :-[

Edit: Habs gefixed.

Edit: Hab noch das Format für sleep eingebaut - funktioniert jetzt mit allen Zeiten 0 bis 2h.
Hab da gleich noch an den Wecker gedacht - aber das ist komplizierter ;)
Bugfix im Template, das speaker Template stößt jetzt auch das setup an wenn man es manuell anwendet.

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 02 März 2021, 17:17:07
Zitat von: Otto123 am 01 März 2021, 23:08:19
Edit: Hab noch das Format für sleep eingebaut - funktioniert jetzt mit allen Zeiten 0 bis 2h.
Hab da gleich noch an den Wecker gedacht - aber das ist komplizierter ;)
--> witzig, wenn man drüber nachdenkt --> ich nutze sleep tatsächlich im Sonos (um es leicht per Sonos-App unterbrechbar und verlängerbar zu machen, wenn ich nicht einschlafen kann.)
Meinen Wecker stelle ich mit dem Weckermodul in FHEM und lasse darüber auch die Playlist (...momentan einen Radiosender  :( ) laden und den Sender starten. Manchmal ist man auch eigenartig  ;)

über x_raw_payload:textField {sonos2mqtt($NAME,$EVENT)}
kann ich aber nur an den Speaker senden, oder? Ein Global command geht per MQTT publish, richtig?

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 März 2021, 17:26:54
x_raw_payload am Player nimmt ja den topic vom player, damit geht es an ihn.
von welchem setter man die aber an den z.B. sonos/cmd/... sendet ist egal. Könnte man zum Basteln auch an der Bridge einfügen.

Mist ich stelle gerade fest, ich habe zwar den Code in der 99_sonos2mqttUtils drin, aber die Config der Bridge mit notifyall usw. wieder vergessen.

Liefere ich nach :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 02 März 2021, 18:21:04
Zitat von: Otto123 am 02 März 2021, 17:26:54
[...], aber die Config der Bridge mit notifyall usw. wieder vergessen.
--> auch wenn ich mich gleich wieder oute - in die Bridge? ich habe
notifyall:textField {sonos2mqtt($NAME,$EVENT)}
announcementall:textField {sonos2mqtt($NAME,$EVENT)}

in der setList der Player... ???
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 März 2021, 19:23:12
Naja - das ist eher ein philosophischer Gedanke ;)
Meine Denke war: die Bridge wozu ist die gut? Im Grunde schmeißt die unnütze MQTT Nachrichten in die Tonne und teilt den Mischmasch so auf das die einzelnen Player betreiben werden können.
Deshalb: wenn sie schon mal da ist kann sie doch zentrale Funktionen übernehmen. Und notifyall hat doch nichts mit einem einzelnen Player zu tun. Braucht man auch bloß einmal?!

{sonos2mqtt_mod_list('a:model=sonos2mqtt_bridge','setList','notifyall:textField {sonos2mqtt($NAME,$EVENT)}')}
{sonos2mqtt_mod_list('a:model=sonos2mqtt_bridge','setList','announcementall:textField {sonos2mqtt($NAME,$EVENT)}')}

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 02 März 2021, 22:02:29
Funktionieren beide, werden in der Bridge erweitert und die Funktion ist danach in der Bridge gegeben. :-)
Auch schick.muss ja auch nicht in jedem Speaker stehen. genau. braucht man ja nur einmal.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 04 März 2021, 19:50:55
Im Übrigen macht jetzt ein next bei laufendem Radio die Weiterschaltung auf den nächsten Sender in der Liste
Die Liste wird jetzt aus den Favoriten so extrahiert, dass nur die Radios drin sind - weil nur die wirklich funktionieren.

Zumindest klappt das bei mir - vielleicht mag es jemand in seiner Umgebung probieren.

Ich habe die userReadings zum Teil in den Code der sonos2mqttUtils gelegt. Das Template sieht jetzt sehr übersichtlich aus.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 05 März 2021, 08:11:07
Moin,

Zitat von: Otto123 am 04 März 2021, 19:50:55
Im Übrigen macht jetzt ein next bei laufendem Radio die Weiterschaltung auf den nächsten Sender in der Liste
Probier ich am WE mal aus

Zitat von: Otto123 am 04 März 2021, 19:50:55
Die Liste wird jetzt aus den Favoriten so extrahiert, dass nur die Radios drin sind - weil nur die wirklich funktionieren.
--> was heisst denn "nur"? was war denn vorher mit drin?

bei  mir stehen eh nur die Radiosender drin playFav:Bayern.3,Guldkanalen.70-tal,NDR.2.Niedersachsen,SWR3 {sonos2mqtt($NAME,$EVENT)}

Favorites {"Result":[{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s155675q.png","Title":"Guldkanalen 70-tal","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/2","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s155675?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s56857/images/logoq.png?t=154228","Title":"NDR 2 Niedersachsen","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/0","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s56857?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"https://d1uner0r1fcap8.cloudfront.net/image?w=60&image=https:%2F%2Fcdn-profiles.tunein.com%2Fs24896%2Fimages%2Flogog.png%3Ft%3D1&partnerId=tunein","Title":"SWR3","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/8","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:tunein:9479?sid=303&flags=8224&sn=3","ProtocolInfo":"x-sonosapi-stream:*:*:*"}],"NumberReturned":3,"TotalMatches":3,"UpdateID":1}
die Sonos-Playlisten wären noch toll. Die Apple-Playlisten ein Traum ;-)

Wollte am Wochenende mal prüfen ob das hier klappt
{
  "command": "adv-command",
  "input": {
    "cmd": "AVTransportService.AddURIToQueue",
    "val": {
      "InstanceID": 0,
      "DesiredFirstTrackNumberEnqueued": 0,
      "EnqueueAsNext": true,
      "EnqueuedURI":"file:///jffs/settings/savedqueues.rsq#7",
      "EnqueuedURIMetaData": {
        "UpnpClass": "object.container.playlistContainer",
        "ItemId": "SQ:7",
        "CdUdn": "RINCON_AssociatedZPUDN"
      }
    }
  }
}


von:
https://github.com/svrooij/sonos2mqtt/issues/128 (https://github.com/svrooij/sonos2mqtt/issues/128)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 März 2021, 10:07:43
Zitat--> was heisst denn "nur"? was war denn vorher mit drin?
Ich lade ja die Favoriten mit Stephans Standard Funktion, da kann alles mögliche drin sein.
Aus diesem "Json Array" habe ich bisher alle Titel in favlist extrahiert.
Jetzt wird die favlist nur aus Einträgen erzeugt die /x-sonosapi-stream/ enthalten - weil die sich einfach mit SetAVTuri starten lassen.

Die Playlisten sind irgendwelche "container" da muss man was anders machen. Wenn Du das rausfindest wäre es toll :)
So ein Eintrag sieht bsp so aus:
{"AlbumArtUri":"http://soundcloud-static.ws.sonos.com/icons/tracks_legacy.png",
"Title":"Lotta Sleeps",
"UpnpClass":"object.itemobject.item.sonos-favorite",
"ItemId":"FV:2/28",
"ParentId":"FV:2",
"TrackUri":"x-rincon-cpcontainer:0006206cuser-tracks:7212085",
"ProtocolInfo":"x-rincon-cpcontainer:*:*:*"},

Im Gegensatz zum radio, da kann man einfach die TrackUri setzen und es geht los:
{"AlbumArtUri":"http://cdn-profiles.tunein.com/s25224/images/logoq.png",
"Title":"104.6 RTL",
"UpnpClass":"object.itemobject.item.sonos-favorite",
"ItemId":"FV:2/0",
"ParentId":"FV:2",
"TrackUri":"x-sonosapi-stream:s25224?sid=254&flags=32",
"ProtocolInfo":"x-sonosapi-stream:*:*:*"},


Edit: Ich habe mal noch ne Idee für einen setter um (am Morgen) die Lautstärke sanft hochzuziehen:
Volume auf Anfangswert setzen, play starten und dann:
volSoft:noArg {for (1..10) {fhem("sleep $_;set $NAME volume {([$NAME:volume]+1)}")}}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 06 März 2021, 09:50:48
Zitat von: Otto123 am 05 März 2021, 10:07:43
Edit: Ich habe mal noch ne Idee für einen setter um (am Morgen) die Lautstärke sanft hochzuziehen:
Volume auf Anfangswert setzen, play starten und dann:
volSoft:noArg {for (1..10) {fhem("sleep $_;set $NAME volume {([$NAME:volume]+1)}")}}

Hallo Otto,
ich hab schon lange hier mitgelesen und jetzt den Umstieg von SONOS auf MQTT2 gemacht.
Was soll ich sagen - läuft mega!  :)

Was mir bis jetzt gefehlt hat war fadeIn fadeOut. Das habe ich bei mir jetzt so gelöst:
für in die setList:
fadeOut:noArg {fadeout($NAME); fhem("setreading $NAME FadeVolume [$NAME:volume]")}
fadeIn:noArg {fadein($NAME)}


Und den Code für die sonosUtils:
sub fadeout($) {
my ($dev) = @_;
my $vol = ReadingsVal($dev,"volume",10);
if ($vol > 0) {
$vol--;                               
fhem("set $dev volume $vol");             
fhem("sleep 0.8; {fadeout('$dev')}");         
}
elsif ($vol == 0) {
fhem("set $dev pause")
}
}

sub fadein($) {
my ($dev) = @_;
my $vol = ReadingsVal($dev,"volume",10);;
my $target = ReadingsVal($dev,"FadeVolume",10);
fhem("set $dev play") if (ReadingsVal($dev,'transportState','STOPPED') ne "PLAYING");
if ($vol <= $target) {
$vol++;                               
fhem("set $dev volume $vol");             
fhem("sleep 0.8; {fadein('$dev')}");         
}
}


Das geht bestimmt auch noch besser. Aber vielleicht könnte man das ja als Denkansatz verwenden.
VG Sebastian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 06 März 2021, 12:21:51
Moin,

das hat mir gestern auch keine Ruhe gelassen. Da ist jetzt sowas bei rausgekommen. Scheint mir auch noch nicht als endgültige Fassung, aber funktioniert erstmal.
damit geht wie bisher - ohne extra setter oder Readings (erschien mir irgendwie umständlich)
set player volume 10 # regelt soft egal in welche Richtung
set player volume 20 10 # setzt auf start 10 und regelt soft auf 20 - z.B. vor einem start play
set player volume 15 15 # setzt hart auf 15
if($cmd eq 'volume') {
   my $vol = ReadingsNum($NAME,'volume',0);
   my $d = abs $arr[1] - $vol;
   my $s = $arr[1] <=> $vol;
   if ($arr[2] or ($d == 1)) {
      $payload = $arr[2] || $payload;
      if ($arr[2] and ($arr[1] != $arr[2])) {fhem("sleep 0.5;set $NAME volume $arr[1]")}
      return qq($topic { "command": "volume", "input": $payload })
   } else {
      for (1..$d) {fhem("sleep $_;set $NAME volume {([$NAME:volume]+$s)}")}}
}


Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 06 März 2021, 18:16:40
Moin,

also zu den Playlisten: wenn ich das folgende publishe
{
  "command": "adv-command",
  "input": {
    "cmd": "GetFavorites",
    "reply": "GetFavoritesReply"
  }
}


Bekomme ich die Sender, die unter "Mein Sonos" gespeichert sind (4 Stück). Was ich absolut nicht in der Antwort sehe sind die Sonos-Playlisten.
Otto: bekommst Du die als Antwort in den GetFavoritesReply Topic?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 06 März 2021, 19:16:01
Richtig
GetFavorites liefert Dir das was unter Mein Sonos steht. (Das ist das was ich in der Bridge implementiert habe)
GetFavoriteRadioStations liefert Dir das was unter TuneIn / Meine Radiosender steht.

Mehr habe ich  noch nicht probiert. Ich habe aber Playlisten unter Mein Sonos, die kommen beim Ersteren mit. Es sind aber nicht die, die unter Sonos Playlisten stehen!

Mit der "Browse with own query" https://svrooij.io/sonos2mqtt/control/browse.html hatte ich bisher keinen Erfolg ...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 06 März 2021, 19:55:34
okay Sonos Playlisten und "Mein Sonos" ist der kleine, aber feiner Unterschied.

und die kannst Du dann mit playFAV abspielen, nachdem Du sie an die Player verteilt hast??
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 06 März 2021, 20:07:54
derzeit kann ich die Radios abspielen, die Playlisten haben ein anderes Format. Da tut er nichts ...
Siehe #902
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 06 März 2021, 22:41:24
Hilft vielleicht schon mal ein wenig:

musste ich machen um das Radio auszubekommen.
{  "command": "switchtoqueue"}

Hier Liste leeren
{  "command": "adv-command",
  "input": {    "cmd": "AVTransportService.RemoveAllTracksFromQueue"  }
}


Die Ziffer 3 in EnqueuedURI und ItemId ist der Wert aus enqueuedMetadata_ItemId wenn die Liste läuft (vom Player gestartet) (also eine "Sonos-Playliste NICHT die aus "Mein Sonos")
{
  "command" : "adv-command",
  "input" : {
    "cmd" : "AVTransportService.AddURIToQueue",
    "val" : {
      "InstanceID" : 0,
      "DesiredFirstTrackNumberEnqueued" : 0,
      "EnqueueAsNext" : true,
      "EnqueuedURI" : "file:///jffs/settings/savedqueues.rsq#3",
      "EnqueuedURIMetaData" : {
        "UpnpClass" : "object.container.playlistContainer",
        "ItemId" : "SQ:3",
        "CdUdn" : "SA_RINCON2311_X_#Svc2311-0-Token"
      }
    }
  }
}


zum starten
{  "command": "play"}

und hiermit bekommt man die abgefragt :-)
{
  "command": "adv-command",
  "input": {
    "cmd": "ContentDirectoryService.BrowseParsed",
    "val": {
      "ObjectID": "SQ:",
      "BrowseFlag": "BrowseDirectChildren",
      "Filter": "*",
      "StartingIndex": 0,
      "RequestedCount": 0,
      "SortCriteria": ""
    },
    "reply": "sonosPlaylists"
  }
}


Erweitern der readingList in der Bridge, dann stehen sie schon mal da
sonos/RINCON_([0-9A-Z]+)/sonosPlaylists:.* sonosPlaylists
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 07 März 2021, 11:06:52
Ja das müsste gehen.
Diese Routine sucht ja in dem Ergebnis nach dem Titel und liest nur die TrackUri aus. Jetzt müsste man schauen, welche variablen Teile man hier rausholen muss und in deinen Play Aufruf stecke muss .. Ist mir noch nicht ganz klar.
if($cmd eq 'playFav') {
    use JSON;use HTML::Entities;use Encode qw(encode decode);
    my $enc = 'UTF8';my $uri='';my $search=(split(' ', $EVENT,2))[1];
    $search=~s/[\/()]/./g;
    my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];
    my $decoded = decode_json(ReadingsVal($dev,'Favorites','')); # Hier kann man auch das Reading Reply einsetzen oder was anderes
    my @array=@{$decoded->{'Result'}};
    for (@array) {
      if (encode($enc, decode_entities($_->{'Title'}))=~/$search/i) # Hier Suche nach dem Titel
         {$uri = $_->{'TrackUri'} }                                 # hier die Trackuri zurück
   }
   fhem("set $NAME playUri $uri") if ($uri ne '');                # Das wird dann komplizierter...
}


Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 07 März 2021, 11:41:30
hier noch die Erweiterung der getList für die Bridge:
sonosPlaylists:noArg sonosPlaylists {q(sonos/).ReadingsVal((devspec2array('a:model=sonos2mqtt_speaker'))[0],'uuid','').q(/control {"command": "adv-command","input": {"cmd": "ContentDirectoryService.BrowseParsed","val": {"ObjectID": "SQ:","BrowseFlag": "BrowseDirectChildren", "Filter": "*", "StartingIndex": 0, "RequestedCount": 0, "SortCriteria": "" }, "reply":"sonosPlaylists"}})}

und die von den Favoriten kopierte und angepasste Erweiterung des userReadings der Bridge (Komma nicht vergessen ;-) )
playlist:sonosPlaylists.* {
  use JSON;use HTML::Entities;use Encode qw(encode decode);
  my $enc = 'UTF8';
  my @out;
  my $decoded = decode_json(ReadingsVal($name,'sonosPlaylists',''));
  my @arr  = @{$decoded->{'Result'}};;
  foreach (@arr) {
     my $dec = encode($enc, decode_entities($_->{'Title'}));
     $dec =~ s/\s/./g;
     push @out,$dec}
  return join ',', sort @out},
grouplist:sonosPlaylists.* {
     my @out;
     foreach (devspec2array('a:model=sonos2mqtt_speaker')) {if (ReadingsVal($_,'isMaster','')) {push @out,ReadingsVal($_,'name','')}}
  return join(',', sort @out)}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 07 März 2021, 14:24:24
Zitat von: Otto123 am 07 März 2021, 11:06:52
Ja das müsste gehen.
Diese Routine sucht ja in dem Ergebnis nach dem Titel und liest nur die TrackUri aus. Jetzt müsste man schauen, welche variablen Teile man hier rausholen muss und in deinen Play Aufruf stecke muss .. Ist mir noch nicht ganz klar.
if($cmd eq 'playFav') {
    use JSON;use HTML::Entities;use Encode qw(encode decode);
    my $enc = 'UTF8';my $uri='';my $search=(split(' ', $EVENT,2))[1];
    $search=~s/[\/()]/./g;
    my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];
    my $decoded = decode_json(ReadingsVal($dev,'Favorites','')); # Hier kann man auch das Reading Reply einsetzen oder was anderes
    my @array=@{$decoded->{'Result'}};
    for (@array) {
      if (encode($enc, decode_entities($_->{'Title'}))=~/$search/i) # Hier Suche nach dem Titel
         {$uri = $_->{'TrackUri'} }                                 # hier die Trackuri zurück
   }
   fhem("set $NAME playUri $uri") if ($uri ne '');                # Das wird dann komplizierter...
}


Gruß Otto

ich habe mal Eure playFav abgekupfert...das klappte irgendwie noch  nicht zuverlässig. bis ich das sleep eigefügt habe. Scheinbar braucht die Liste ne Sekunde zum laden.
Die Variabel $itemid wird falsch übernommen, krieg noch nicht raus warum :-/

ACHTUNG: ich habe nochmal an klein/großschreibung gearbeitet und würde das noch anpassen (evt. heute Abend - muss gerade mal wech.)

if($cmd eq 'playList') {
use JSON;use HTML::Entities;use Encode qw(encode decode);
my $enc = 'UTF8';my $uri='';my $itemid='';my $search=(split(' ', $EVENT,2))[1];
$search=~s/[\/()]/./g;
my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];
my $decoded = decode_json(ReadingsVal($dev,'SonosPlaylists',''));
my @array=@{$decoded->{'Result'}};
foreach (@array) {if (encode($enc, decode_entities($_->{'Title'}))=~/$search/i)
                   {$uri = $_->{'TrackUri'} }
   {$itemid = $_->{'ItemId'} }
    };
fhem("set $NAME x_raw_payload {\"command\":\"switchtoqueue\"} ; set $NAME x_raw_payload {\"command\":\"adv-command\",\"input\":{\"cmd\":\"AVTransportService.RemoveAllTracksFromQueue\"}} ; set $NAME x_raw_payload {\"command\" : \"adv-command\", \"input\" : {\"cmd\" : \"AVTransportService.AddURIToQueue\",\"val\" : {\"InstanceID\" : 0,\"DesiredFirstTrackNumberEnqueued\" : 0, \"EnqueueAsNext\" : true,\"EnqueuedURI\" : \"$uri\", \"EnqueuedURIMetaData\" : {\"ItemId\" : \"$itemid \"}}}}; sleep 1; set $NAME x_raw_payload {\"command\":\"play\"}") ;
}



geholfen hat mir:  --> http://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html (http://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html)  ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 11 März 2021, 13:56:50
Ich habe zum letzten Thema noch etwas rumprobiert. Mit den Sonos-Favoriten läuft es offenbar anders, da bekomme ich es nicht hin.
ich schreibe mal meine Gedanken auf:
switchtoqueue ist ja gleich input Queue  das ist implementiert - wann man das macht ist egal (vor play ;) )
das Liste Löschen könnte man als extra Kommando machen. Wenn man es nicht ausführt wird die Liste immer wieder erweitert und nicht ersetzt.
das AddURIToQueue könnte man als zusätzlichen Befehl einbauen.  Ich fürchte das ist speziell und da gibt es immer wieder andere Fälle ...
Für den Spezialfall Sonos Playlisten ist es besser den nur intern zu verwenden?

Ich würde dann drei Listen einbauen:
Radios aus Sonos-Favoriten
Radios aus TuneIn Meine Radiosender
Playlisten aus Sonos Playlisten
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 11 März 2021, 14:08:06
Zitat von: Otto123 am 11 März 2021, 13:56:50
Ich würde dann drei Listen einbauen:
Radios aus Sonos-Favoriten
Radios aus TuneIn Meine Radiosender
Playlisten aus Sonos Playlisten

+1

Würde bei mir genauso passen!
VG Sebastian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Stefan_Hvr am 12 März 2021, 06:48:59
Für mich perfekt.
Komme nur leider nicht dazu das Variabel Problem zu lösen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 12 März 2021, 12:35:04
Ich habe jetzt mal folgenden Code eingebaut.
Eine Abfrage für die Listen:
sub sonos2mqtt_searchList
{
use JSON;use HTML::Entities;use Encode qw(encode decode);
my $regex = shift //return'';
my $list  = shift //return'';
my $enc = 'UTF8';
my $uri = '';my $UpnpClass = '';my $ItemId = '';my $CdUdn = '';
my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];
my $decoded = decode_json(ReadingsVal($dev,$list,''));
my @array=@{$decoded->{'Result'}};
   $regex=~s/[\/()]/./g;
   for (@array) {
      if (encode($enc, decode_entities($_->{'Title'}))=~/$regex/i)
         {
          $uri = $_->{'TrackUri'};
          $ItemId = $_->{'ItemId'} || '';
          $UpnpClass= $_->{'UpnpClass'} || '';
          $CdUdn= $_->{'CdUdn'} || '';
         }
   }
   return ($uri,$ItemId,$UpnpClass,$CdUdn);
}

Eine Ergänzung zum play Befehl:
if($cmd eq 'play') {
   if (@arr == 1) { $payload = qq({ "command": "$cmd" }) }
   else {
     if ($arr[1] eq 'Radio') {$search = (split(' ', $EVENT,3))[2] ;$fav = "Radios"}
     elsif ($arr[1] eq 'Favorite') {$search = (split(' ', $EVENT,3))[2] ;$fav = "Favorites"}
     elsif ($arr[1] eq 'Playlist') {$search = (split(' ', $EVENT,3))[2] ;$fav = "Playlists"}
     my ($uri,$ItemId,$UpnpClass,$CdUdn)=sonos2mqtt_searchList($search,$fav);
     if ($arr[1] eq 'Playlist') {
       $payload = qq({"command": "adv-command","input": { "cmd": "AVTransportService.RemoveAllTracksFromQueue" }});
       fhem("set $NAME x_raw_payload $payload");
       fhem("set $NAME input Queue");
       $payload = qq({"UpnpClass": "$UpnpClass","ItemId": "$ItemId","CdUdn": "$CdUdn"});
       $payload = qq({ "InstanceID": 0,"DesiredFirstTrackNumberEnqueued": 0,"EnqueueAsNext": true,"EnqueuedURI":"$uri","EnqueuedURIMetaData": $payload});
       $payload = qq({ "command": "adv-command","input": {"cmd": "AVTransportService.AddURIToQueue","val": $payload}});
   }
   else { $payload = qq({ "command": "setavtransporturi",  "input": "$uri"}) }

return qq($topic $payload);
}

Damit geht jetzt sowas:
set alias=Arbeitszimmer play Radio CruiseOne
set alias=Arbeitszimmer play Playlist Testliste
set alias=Arbeitszimmer play Favorite Deutschlandfunk

Irgendwie wollte ich nicht immer wieder die setList modifizieren und länger machen, deswegen habe ich mal play erweitert. Das geht universeller, da braucht man bloß die 99_sonos2mqttUtils zu erweitern und nicht immer auch das Template.
Die Befehle starten nicht sondern bereiten vor. Ein set ... play würde dann wirklich starten. Weiß ich noch nicht ob das so besser ist. Aber manchmal will man etwas vorbereiten und erst später starten, weil ja das System auch immer Reaktionszeiten hat.
Wer das ausprobieren will muss jetztmal so vorgehen, ich will vorm nächsten einchecken noch ein bisschen drüber nachdenken.
{qx(wget -qO ./FHEM/99_sonos2mqttUtils.pm https://raw.githubusercontent.com/heinz-otto/scripts/master/fhem/99_sonos2mqttUtils.pm);;fhem('reload 99_sonos2mqttUtils.pm')}
{sonos2mqtt_mod_list('SonosBridge','getList','Reply:Favorites,Radios,Playlists Reply'.q( {sonos2mqtt($NAME,$EVENT)}))}

Dann muss man noch einmalig oder bei einer Änderung innerhalb Sonos die Listen holen:
get SonosBridge Reply Playlists;sleep SonosBridge:Reply.*;setreading SonosBridge Playlists [SonosBridge:Reply]
get SonosBridge Reply Favorites;sleep SonosBridge:Reply.*;setreading SonosBridge Favorites [SonosBridge:Reply]
get SonosBridge Reply Radios;sleep SonosBridge:Reply.*;setreading SonosBridge Radios [SonosBridge:Reply]

Das gefällt mir auch besser als immer wieder die getList anpassen :) aber vielleicht bewährt es sich nicht?
Ich muss jetzt sicher mal lernen wie man in Perl richtig Arrays zurückgibt und nicht soviel rumschubst  :-[

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 12 März 2021, 16:49:45
Ich komme nicht mehr hinterher  ;D ;D

Aber echt cool, dass du so viel Zeit und Energie investiert!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 13 März 2021, 10:25:11
Hey zusammen, bin aktuell dabei einen kleinen player in smartvisu zu basteln auf mqtt Basis.

Ich kämpfe zb noch ein wenig mit zb dem Album cover aber das ist ein html/sv Thema.

Was ich aber auch suche ist ein currentTrackPosition reading. Das habe ich bisher leider nicht. Einzig die duration Time gibt es. Kennt jemand einen schönen weg daraus nun eine Art Countdown oder so zu machen? Soweit ich das in der Sonos2MQTT Doku gesehen habe, wird es auch nicht mit gesendet. Da es aber ganz nett ist zu sehen wie lange so ein Titel noch geht....

Anbei mal die bisherige grob Fassung.


Gruß,
87insane
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 14 März 2021, 15:54:44
Hallo zusammen,
ich bin heute zufällig über diesen Thread gestolpert und benötige etwas Hilfe beim Verstehen der ganzen Thematik:
Ich habe aktuell keine MQTT Erfahrung, glaube aber, hier die richtige Lösung für mich gefunden zu haben. Ich nehme mal an MQTT-Befehle lassen sich ohne Probleme über Subnetz-Grenzen hinweg routen und ich wäre damit dann auch in der Lage meine Player im anderen Subnetz zu steuern. Aber vielleicht kann mich kurz jemand abholen:

Situation:
die Idee:

Frage:

Vielen Dank
Spartacus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 14 März 2021, 16:29:05
Hey ich drehe das ganze mal logisch um.

Sonos2mqtt ist eigentlich ein Dienst. Wohin er das ganze sendet/senden DARF, reglementierst du mit deiner VLAN Struktur ja selber. Grundsätzlich hast du hier auch nicht erklärt auf welchem Layer du was blockierst usw.

Kurz um: du brauchst keinen ganzen neuen fhem server um die Daten des Dienstes zu empfangen. Du brauchst eigentlich nur ein Gerät auf dem der Dienst läuft. Zudem brauchst du am sich einen mqtt Server. Ich empfehle den fhem eigenen.
Damit du mit mqtt laufen lernst, empfehle ich dir mal irgendein Gerät einfach gegen einen server sprechen zu lassen. Die topic Struktur muss du einmal verstehen, dann ist es super einfach. Glaube aber das dieser thread tatsächlich nicht für Deine Anfrage gedacht ist. Ggf einen eigenen dafür auf machen? Oder ggf sich SuFu nutzen. Es gibt hier diverse Anleitungen. Im shelly Forum gibt es auch eine von mir im Bezug auf shellys. Aber ich denke die erklärt auch generell sehr gut die Basics.

Mal in grob: Client Gerät -> Dienst (zb sonos2mqtt, zigbee2mqtt usw) -> MQTT Server -> Fhem Bridge -> Endgerät in fhem. So laufen die Daten durch die Gegend. Auch anders rum natürlich. Hinzu kommen ggf Update Funktionen, die gegen Internet Server sprechen. Oder aber selber einen server in das entsprechende Netz stellen.

Gruß,
Kai
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 14 März 2021, 16:31:45
Hallo Spartacus,

ich denke auch, dass die Sonosplayer nur in einem Subnetz laufen können und sonos2mqtt (ich rede von dem nodejs Dienst) im gleichen Subnetz laufen muss.

Wo Dein FHEM mit seinem MQTT2_SERVER steht ist völlig Wurst. MQTT Protokoll ist nicht an ein Subnetz gebunden.

Die Idee:
ZitatIch installieren ein fhem mit sonos2mqtt im Player Subnetz
braucht es dafür nicht! Du brauchst nur sonos2mqtt. In FHEM selbst ist es nur der MQTT2_SERVER und ein paar generische MQTT2_Devices.

VLAN10 Sonosplayer und sono2mqtt
VLAN50 FHEM mit MQTT2_Server

Am einfachsten nimmst Du den docker Container von Stephan, falls docker für Dich ein Thema ist

Ich habe das im Wiki mal noch etwas ergänzt https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Sonos2Mqtt

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 14 März 2021, 17:15:36
Hallo Kai,
Zitat von: 87insane am 13 März 2021, 10:25:11
Da es aber ganz nett ist zu sehen wie lange so ein Titel noch geht....
Du könntest meine volume fading Routine dahingehen entwickeln:
for (1..$d) {fhem("sleep $_;setreading $NAME timeleft {([$NAME:timeleft]+$s)}")}
$d ist die Laufzeit in 10er sec und $s wäre einfach 10.
timeleft setzt Du bei jedem Titelwechsel neu.
kannst auch sekunden nehmen, ich weiß nicht ob FHEM bei einer bestimmten Anzahl unnamed sleeps einfach "platzt" :)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 14 März 2021, 17:52:20
Hallo zusammen,
ganz lieben Dank für die schnellen Antworten. Ich denke, ich habe jetzt verstanden, was zu tun ist. Ich werde dann mal basteln.
Mit Docker wird das wahrscheinlich nichts, da ich es bislang nicht geschafft habe dem Container ein separates Subnetz mitzugeben. Mein Host ist ne qnap auf dem Docker und Virtualisation Station läuft. Der Station kann ich einfach sie Subnetzte den verschiedenen VMs zuordnen. Bei Docker kriege ich das irgendwie nicht hin.

Ich setzte jetzt ne Debian VM mit sonos2mqtt auf und dann spiele ich mal damit rum.....

Besten Dank,
Spartacus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 14 März 2021, 19:16:18
Zitat von: Otto123 am 14 März 2021, 17:15:36
Hallo Kai,Du könntest meine volume fading Routine dahingehen entwickeln:
for (1..$d) {fhem("sleep $_;setreading $NAME timeleft {([$NAME:timeleft]+$s)}")}
$d ist die Laufzeit in 10er sec und $s wäre einfach 10.
timeleft setzt Du bei jedem Titelwechsel neu.
kannst auch sekunden nehmen, ich weiß nicht ob FHEM bei einer bestimmten Anzahl unnamed sleeps einfach "platzt" :)

Gruß Otto

Die .sleep missbrauche ich schon sehr oft seit du die mal ins Spiel gebracht hast. Gerade bei Sonos und egal ob mqtt oder über das Modul, die sind schrecklich zu steuern.

Was ich hier suche ist eine in fhem existierende Funktion. Ne Art userreading. Das setzen (immer bei Track Wechsel zb) wäre an sich einfach. Gibt es in fhem bisher keine Funktion -> Zeit in Format hh:mm:es oder so mit dem Ergebnis bzw der Wahl alle 5s zb die Zeit ab zu ziehen? Das Sonos Modul berechnet die Zeiten so wie ich das lese auch sehr komplex. Der kollege hat echt Zeit investiert!

Mich wundert das das nicht eh von Sonos2mqtt mit kommt. Die einspeisende App, wie zb spotify liefert das ja mit.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 14 März 2021, 19:34:52
@Spartacus: "da ich es bislang nicht geschafft habe dem Container ein separates Subnetz mitzugeben." "Bei Docker kriege ich das irgendwie nicht hin."
              vergiss diese Gedanken! Da bist Du mMn völlig auf dem falschen Dampfer!
Kurz gesagt: Entweder der container ist in seiner Welt, seinem Netz -> so solltest Du den sonos2mqtt Container betreiben. Du mappst bloß Port "6329:6329" nach draußen. Siehe meine Notiz  (https://heinz-otto.blogspot.com/2021/01/container-schiff.html)
oder Du stellst den container in "network_mode: host" und damit steht er einfach im Hostnetz.
Docker ist mMn keine vlan/netzwerktest/router Umgebung!

@87insane Dann habe ich Dich falsch verstanden, ich dachte Du willst in Abständen die interpolierte verbleibende Zeit ausgeben. Ob das jetzt sekunden oder mm:ss habe ich nicht bedacht. Das ist doch nur ein Format? https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 14 März 2021, 20:51:43
Moin,
sorry, aber 1x muss ich doch noch nerven!

Sonos2mqtt läuft als Dienst auf einem Debian-Server in einer eigenen VM im VLAN10 (172.16.10.135)
Auf dem fhem-Server läuft der MQTT-Server in VLAN50 (172.16.50.40)

define mqtt2s MQTT2_SERVER 1883 global
attr mqtt2s room MQTT_IO
attr mqtt2s  autocreate simple


Die Bridge sollte dann auch so aussehen:
define SonosBridge MQTT2_DEVICE
attr SonosBridge IODev mqtt2s
attr SonosBridge room MQTT2_DEVICE
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort


Was ich jetzt aber nicht verstehe ist, wie weiß der sonos2mqtt-Dienst nun welchen MQTT-Server er nehmen soll? Wo gebe ich ihm die IP und den Port mit?

@87insane
es gibt aktuell keine FW-Rules zwischen VKAN10 und VLAN50. Also normales Layer 3 Routing

Danke,
Spartacus






Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 14 März 2021, 20:54:22
Hallo Spartacus,

ich mach es mal spannend - ich will ja mein Doku verbessern. Du nervst überhaupt nicht :)
Du findest die Antwort auf Deine Frage hier nicht?
https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Sonos2Mqtt

Du hast mit pm2 gestartet?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 14 März 2021, 21:31:46
Hey nochmal... Die Schnittstelle bietet leider die Track Time nicht. Aber ich glaube das man das so ca zaubern kann mit Track Wechsel und dann eben duration Time - Intervall oder aktueller Zeit ..... Kann mir nur nicht vorstellen das fhem das nicht schon selber kann.

Wir wollten ja eh nur Anreiz geben und einen neuen Player bauen. Du hast es bis zur Spitze getrieben :) bzw alle die hier geholfen haben. Eigentlich fehlt mir ein wenig die Option von zeitsprüngen innerhalb von Tracks. Deswegen und wegen der visu suche ich nach einem weg. Mit duration und act_position hätte man ja schon so gut wie die Möglichkeit. Ggf fehlt mir nur die zündende Idee. Du hast das also auch keines wegs falsch verstanden. Meine Worte sind nur nicht so treffend, wie die deinen.

An spartacus, teste mal ein wenig. Du wirst es nach dem ersten Licht an/aus verstehen. Guck dir echt mal die Beispiele an und behalte die grobe Auflistung im Hinterkopf. An sich ist mqtt mittlerweile mein Liebling. Ich erlaube mir frecherweise auch mqtt Geräte zu definieren aber als dummy. Denn in denen kann ich mir die setlist komplett manipulieren. Sicher mag das wieder jemand hier nicht aber ich nutze keine dummy geröte mehr. Lieber einen fake mqtt ... Das gleiche nur mehr Möglichkeiten.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 14 März 2021, 22:06:02
Moin,
ok. Ich glaube ich komme der Sache etwas näher.... (aber stimmt das mit den vier Bindestrichen "--  --mqtt" ?)
Mein sonos2mqtt ist der 172.16.10.135

define n_pm2_sonos notify global:INITIALIZED "pm2 -s start sonos2mqtt -- --mqtt mqtt://myuser:the_secret_password@172.16.10.135:1800"
sleep global:ATTR.SonosBridge.stateFormat.connected;trigger n_pm2_sonos start


Welche Daten gebe ich für "myuser" und "the_secret_password" an? Ist das der Std-Login für die Debian-Maschine selber?

So starte ich jetzt zwar den sonos2mqtt-Service auf dem remote Rechner, aber irgendwie muss der Dienst ja auch den mqtt-Broker finden.

Für das Docker Image ändert man offenbar die enviroment.
environment:
SONOS2MQTT_MQTT=mqtt://192.168.56.121:1883 # mqtt2_server FHEM, erweiterter Syntax siehe oben

ABER:
wo findet man diese Einstellung, außerhalb einer Docker-Umgebung. Ich habe ja nur nen simples Debian mit dem Dienst.....

Spartacus.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 14 März 2021, 22:17:22
Irgendwie bist Du durcheinander
Maschine 1 - dort startest Du sonos2mqtt mit dem parameter --mqtt der exakte Syntax steht in der Originaldoku, Link ist im Wiki im ersten Satz.
Alle Angaben in diesem Parameter sind die vom MQTT Server! IP Adresse, Port Wenn vorhanden Zugangskonto...
Wenn Du pm2 nimmst musst Du nach sonos2mqtt die Parameter mit -- "einleiten" und dann die Parameter mit zwei Strichen eintragen. Sind in Summe vier (sonst würde es doch nicht dastehen  :o)
Wenn Du nodejs direkt startest geht es glaub über die config.json.
Bei Docker über die Environment Variable.

Maschine 2 - hier hast Du KEIN sonos2mqtt, hier hast Du FHEM mit MQTT2 Server und in diesem FHEM werden Deine Player konfiguriert. Hier definierst Du ausschließlich die Bridge - alles andere passiert automatisch wenn ein Player startet.

Wenn Du das hinbekommen hast - sag mir bitte was man im Wiki anders schreiben muss, damit das einfach und klar ist :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 14 März 2021, 23:09:52
@Kai Damit bekommt man RelTime -ist es das was Du suchst?
{
  "command": "adv-command",
  "input": {
    "cmd": "AVTransportService.GetPositionInfo",
    "val": {
      "InstanceID": 0
    },
"reply": "Reply"
  }
}
https://svrooij.io/node-sonos-ts/sonos-device/services/av-transport-service.html#getpositioninfo
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 15 März 2021, 08:07:41
Zitat von: Otto123 am 14 März 2021, 23:09:52
@Kai Damit bekommt man RelTime -ist es das was Du suchst?
{
  "command": "adv-command",
  "input": {
    "cmd": "AVTransportService.GetPositionInfo",
    "val": {
      "InstanceID": 0
    },
"reply": "Reply"
  }


}
https://svrooij.io/node-sonos-ts/sonos-device/services/av-transport-service.html#getpositioninfo

Guten Morgen!

Die ganzen erweiterten Befehle.. Na klar :) Ja genau. Muss ich mal sehen wie das sinnig einbaubar ist. Hattest du ggf generell daran gedacht, mehr davon rein zu holen oder ist der Player soweit fertig für Dich?

Gruß


EDIT:
Es landet auf jedenfall direkt ein neuer ReadingList Eintrag: sonos/RINCON_5CAAFD79D52801400/Reply:.* { json2nameValue($EVENT) }
Auch das Reading erscheint. Allerdings müsste man nun trotz Eintrag immer manuell abholen. Also immer mit zb: set DEVICE BEFEHLNAME:noArg sonos/RINCON_5CAAFD79D52801400/control {"command": "adv-command","input": {"cmd": "AVTransportService.GetPositionInfo","val": {"InstanceID": 0},"reply": "Reply"}}.

Hast du für solche Fälle ein Vorgehen? Wenn nein, wäre ich hier ja noch komplett frei. Hätte gedacht das zb alle X Sekunden, bei Status PLAYING dieses Reading mit aktuell gehalten wird.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 März 2021, 08:31:27
Moin,

keine Ahnung - für meine Begriffe ist es vom Inhalt her gut. Ich will die Abstimmung zwischen Template und sonos2mqttUtils noch rund machen.
Alles ein bisschen modular und dokumentiert - damit man auch mal ein halbes Jahr loslassen kann :)
Das kann dann auch jeder selbst modifizieren und erweitern, man kann sicher auch immer mal wieder eine Funktion einbauen.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 15 März 2021, 09:01:16
Ja! Ich bin ab Punkt x auch nicht mehr mitgekommen. Hab dann immer nur zusammen gesucht. (Dein Blog ist aber immer wieder gut;))

Ich würde (wie immer) eine notify freie Lösung haben wollen. Aktuell denke ich aber ich muss mit .sleepxxxxx oder einem notify Konstrukt arbeiten.
Bedingungen wäre ja hier (in meinen Augen ausreichend):
- WENN Status = PLAYING
  - Bei Track-Wechsel abfragen
  - Ab dann alle 5? Sekunden

Lese die Doku aber auch nochmal etwas tiefer. Ggf. kann man das automatische senden dieser Inhalte ja aktivieren. 
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 März 2021, 10:00:23
 automatische senden dieser Inhalte ja aktivieren.

Es gibt da noch den Punkt der Events die man abonnieren kann ... Keine Ahnung ob man das auch darüber bekommt. Da braucht man das Polling nicht. Aber bis auf Ideen und Erinnerung vom Lesen der Doku würde ich mich da erstmal raushalten ;)

Hab dann immer nur zusammen gesucht.
Ich habe versucht alles aktuell im Wiki zu halten. Normal sollte ein Neuankömmling über das Wiki und die eingebauten automatischen Setups zum Ziel kommen. Die erste Seite hier und auch mein Artikel im Blog weisen eigentlich auch genau auf diesen Weg. Hier im Thread zusammen suchen macht kaum Sinn.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 15 März 2021, 10:08:27
ZitatIch habe versucht alles aktuell im Wiki zu halten. Normal sollte ein Neuankömmling über das Wiki und die eingebauten automatischen Setups zum Ziel kommen. Die erste Seite hier und auch mein Artikel im Blog weisen eigentlich auch genau auf diesen Weg. Hier im Thread zusammen suchen macht kaum Sinn.
Naja ich hatte im Ursprung ja auch mit geholfen. Da hat mich natürlich nicht nur die Essens interessiert. Oft wollte ich einfach wissen, welche Wege es gab und welche es geworden sind usw. Passt aber soweit alles.

Abo auf Events...Okay... der Punkt ist seitens FHEM oder aber Modul? (In FHEM ist er ja als ABO eingetragen nur kommt eben nichts (nur manuell). sonos/RINCON_5CAAFD79D52801400/Reply:.* { json2nameValue($EVENT) })
Lesen tu ich eh schon... Testen und Ideen sammeln.

Danke!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 März 2021, 10:12:46
Nein ich meine die Events seitens Modul
https://svrooij.io/node-sonos-ts/sonos-device/events.html
Das hier "reagiert" ja nur auf die Anforderung - z.B. wenn ich Favoriten Listen auslese.
sonos/RINCON_5CAAFD79D52801400/Reply:.* { json2nameValue($EVENT) })
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 15 März 2021, 11:39:01
Wie baust du dir aus den Beispielen die entsprechende JSON? Habe jetzt einiges probiert aber bekomme es nicht hin. Von der Theorie hätte ich gedacht, kann ich einfach den Befehl übernehmen.
{"command": "adv-command","input": {"cmd": "sonosDevice.Events.on","val": "AVTransportService.GetPositionInfo","reply": "Reply"}}
Geht natürlich nicht.

Die Idee ist natürlich schonmal super. Man könnte es variabel halten und am ende auch Abo´s je nach Bedarf setzen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 März 2021, 12:01:20
Das ist immer ganz viel Ratespiel. Stephans Json Beispiele auf der Webseite gehen meist genau so wie sie sind im x_raw_payload

Das gestern aus #913 war auch irgendwie ne Kombination aus dem ContentDirectoryService.BrowseParsed und dem was an Werten in der Tabelle steht. Wo dann ,"reply" steht war mir völlig unklar - ging aber dann irgendwie.

Events abonnieren - keine Ahnung, da muss ja noch was anderes passieren.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 März 2021, 12:30:53
Ich habe mal einen neuen Stand der sonos2mqttUtils eingecheckt.
Funktion im Prinzip wie hier beschrieben https://forum.fhem.de/index.php/topic,111711.msg1139045.html#msg1139045
Kann man sich wie immer so aktuell holen, oder wird beim template aktuell geholt. Das Template selbst ist nicht verändert.
{ Svn_GetFile("contrib/AttrTemplate/99_sonos2mqttUtils.pm", "FHEM/99_sonos2mqttUtils.pm", sub(){ CommandReload(undef, "99_sonos2mqttUtils") }) }
Im Wiki habe ich auch noch ein bisschen ergänzt (auch zu Spartacus seinen Fragen)
Den speak Befehl habe ich auch mit gehosteter tts-polly getestet.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 15 März 2021, 12:32:10
Das mit Reply verstehe ich noch...
Send a command that you expect to return data and specify the `reply` option.

Topic: `sonos/uuid_of_speaker/control`
Payload:

```json
{
  "command": "adv-command",
  "input": {
    "cmd": "RenderingControlService.GetVolume",
    "val": {
      "InstanceID": 0,
      "Channel": "Master"
    },
    "reply": "GetVolumeResponse"
  }
}
```

You will then get a message at `sonos/uuid_of_speaker/{reply}` like `sonos/uuid_of_speaker/GetVolumeResponse`.

```json
{ "CurrentVolume": 40 }
```


Finde die Doku zu Events aber nicht verständlich. Ich habe nichtmal einen Ansatz. :-\
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 März 2021, 13:21:24
Naja war auch nur so eine Idee beim Stöbern.
genaugenommen ist das ja auch nicht sonos2mqtt sondern die wohl die dem zu Grunde liegende node-sonos-ts Library
Vielleicht geht das auch gar nicht? Oder nur über andere Wege?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 15 März 2021, 13:28:30
Hatte gesehen das es die LIB ist.. Scheint aber irgendwie ja auch drin zu sein.

(https://svrooij.io/sonos-api-docs/services/av-transport.html#events)
Hier sieht man ganz gut was sendet und was nicht. Was aber auch ein wenig angepasst zu sein scheint vom Ursprung her.

Um das ganze mal zu testen und den State zu erfahren, hätte sowas (in meinen Augen) funktionieren müssen:
{"command": "adv-command","input": {"cmd": "SonosEventListener.GetStatus","val": {"InstanceID": 0},"reply": "TestReply"}} - Passiert aber nichts.

Wie testest du das am besten um ggf. Syntax Fehler schnell zu finden?
Ich glaube nun einfach mal das Event Handling ist drin. Wenn dem so ist, muss ich ja nur noch "bescheid geben" -> Bitte Abo auf xyz.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Phiolin am 15 März 2021, 16:32:21
Ich hab hier ein kleines Problem mit joinGroup/leaveGroup.
Die Kommandos an sich funktionieren, aber die resultierenden Readings stimmen in manchen Fällen nicht.
Habe ich 2 gruppierte Player (Arbeitszimmer, Schlafzimmer) und führe ein

set Schlafzimmer leaveGroup

aus, würde ich erwarten das das Schlafzimmer Device danach ein isMaster 1 und inGroup 0 Reading hat.
Manchmal bleibt inGroup aber auf 1 und isMaster wird auch nicht auf 0 gesetzt, obwohl der Player in keiner Gruppe mehr ist.
Dabei scheint jede mögliche Kombination auftreten zu können. Habe zum Beispiel auch einen Player, der inGroup 1 und isMaster 1 hat, aber das einzige Device in seiner "Gruppe" ist - demnach sollte es eigentlich gar keine Gruppe sein.
Ein anderer Player hat inGroup 1 und isMaster 0, ist aber das einzige Device in seiner "Gruppe" und demnach müsste er auf jeden Fall ein Master sein.

Das "alte" Sonos Modul, das parallel auch noch läuft, hat die Readings korrekt. Dort sind die Player die eigentlich in keiner Gruppe mehr sind korrekt mit isMaster 1 ausgewiesen. Ist also vermutlich nur irgendwas in der Modullogik?

Kann ich eigentlich die Player mit "rename" umbenennen, oder führt das zu Problemen?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 15 März 2021, 21:45:56
Moin zusammen,
hier noch mal der DAU :-)

Ich habe jetzt fhem auf meinem sonos2mqtt-Server abgeschaltet und den server über die Konsole gestartet (siehe Anhang)
Der Server zeigt nun auf meinen fhem-Server im VLAN50.

Auf dem fhem Server in VLAn50 läuft nun der mqtt-Server und die Bridge. Die Bridge ist connected.

Wenn ich allerdings das Template setzen will, bekomme ich die Aufforderung Parameter einzugeben.(Bridge.png). Irgendetwas stimmt offenbar noch nicht.

Eine Idee?

Spartacus



Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 März 2021, 21:46:33
Ich habe mir eigentlich Mühe gegeben, dass der Name keine Rolle spielt. Umbenennen sollte völlig problemlos gehen.

Die Logik ist simpel, ich weiß nicht wo es da zu Fehlern kommen kann? Aber ich will nicht sagen, dass es perfekt ist. Du könntest ein List der beiden Player in unterschiedlichen Zuständen posten?

isMaster:coordinatorUuid.* {ReadingsVal($name,'coordinatorUuid','') eq ReadingsVal($name,'uuid','')?1:0},
inGroup:groupName.* {ReadingsVal($name,'groupName','') =~ / \+ /?1:0},
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 März 2021, 21:48:42
Hallo Spartacus,
was steht im Template für eine Version? Eigentlich sollte das hart auf sonos gesetzt sein.

Du hast Port auf 1800 gesetzt - Dein MQTT2 Server läuft wirklich auf 1800 oder auf default 1883?
Meine Konfigurationsbeispiele sind meistens zum Mitdenken und nicht für stumpfes C&P ;)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 15 März 2021, 21:53:12
...wo muss ich da nachgucken?
Spartacus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 März 2021, 21:54:49
list TYPE=MQTT2_SERVER DEF
Oder meinst Du Template Version? die steht im Inhaltstext wenn Du auf set attrTemplate gehst und das Template auswählst.
Ganz unten:
setreading DEVICE attrTemplateVersion 20210301
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 15 März 2021, 21:58:40
Hi,
ja genau, die Template-Version. Die steht da, wenn man das Template auswählt. Ich nehme an, es ist das hier!

setreading DEVICE attrTemplateVersion 20201103

Spartacus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 März 2021, 22:02:12
musst Du bitte aktualisieren!
{ Svn_GetFile("FHEM/lib/AttrTemplate/mqtt2.template", "FHEM/lib/AttrTemplate/mqtt2.template", sub(){ AttrTemplate_Initialize() }) }
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 15 März 2021, 22:14:37
Hi,
danke Dir! Soweit läuft es jetzt, allerdings werden keine Player angelegt....keine Ahnung, was da jetzt fehlt!

Die Firewall ist definitiv offen. Ping zwischen den Kisten läuft!

Eine Idee fürs Troubleshooting?

Spartacus

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 März 2021, 22:18:15
die mqtt Portnummer?
Zum anlegen müssen die Player laufen oder sonos2mqtt gestartet werden.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 15 März 2021, 22:25:08
...der Port war schon mal nen Volltreffer (...ist wohl Zeit ins Bett zu gehen!).

Die Player scheinen jetzt angelegt zu werden...dauert aber sehr lange...
btw. Was ist der der Unterschied zwischen den sonos2mqtt-Templates?

Schon mal ganz lieben Dank. Ich werde meine Schritte dann morgen mal dokumentieren und hier posten!

Spartacus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 15 März 2021, 22:30:48
Hi,
Kommando zurück!
Ich sehe, dass die Payer in den Readings der Bridge auftauchen. Sie werden aber nicht als Device angelegt.

Spartacus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 15 März 2021, 22:42:13
Diese config Readings sind ok, das sind die MQTT Infos die wir nicht brauchen :)

Du hast das template angwendet?
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort

Was gibt Dir das zurück?
list n_configSonos.*
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Phiolin am 16 März 2021, 06:29:03
Zitat von: Otto123 am 15 März 2021, 21:46:33
Ich habe mir eigentlich Mühe gegeben, dass der Name keine Rolle spielt. Umbenennen sollte völlig problemlos gehen.

Die Logik ist simpel, ich weiß nicht wo es da zu Fehlern kommen kann? Aber ich will nicht sagen, dass es perfekt ist. Du könntest ein List der beiden Player in unterschiedlichen Zuständen posten?

isMaster:coordinatorUuid.* {ReadingsVal($name,'coordinatorUuid','') eq ReadingsVal($name,'uuid','')?1:0},
inGroup:groupName.* {ReadingsVal($name,'groupName','') =~ / \+ /?1:0},


Danke, ich experimentiere da heute noch mal ein wenig und beobachte das.
Es ist möglich, dass ich noch eine ältere Version des attrTemplates oder der Utils hatte. Jetzt müsste aber alles Up-to-Date sein.

Werden eigentlich die Attribute der Player aktualisiert, wenn man das attrTemplate neu auf die Bridge anwendet, oder muss man dafür das sonos2mqtt_speaker attrTemplate extra anwenden?
Vielleicht ist es möglich, bei Aktualisierungen der Templates einen Hinweis im Bridge Device einzublenden o.ä., da sich im Moment da ja scheinbar noch einiges tut und die Sachen ja (noch?) nicht über das normale FHEM Update rein kommen?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Phiolin am 16 März 2021, 06:59:27
Hier haben wir direkt einen Fall:

Dieser Player ist in einer Gruppe (siehe groupName: Wohnzimmer + 1).
Trotzdem steht isMaster auf 1 und inGroup auf 0.

Internals:
   CFGFN     
   CID        RINCON_949F3E8B52B201400
   DEF        RINCON_949F3E8B52B201400
   DEVICETOPIC sonos
   FUUID      604f8383-f33f-8c0c-b1e1-0a92457b2d1f2ac1
   IODev      mqtt_main
   LASTInputDev mqtt_main
   MSGCNT     72
   NAME       MQTT2_RINCON_949F3E8B52B201400
   NR         783
   STATE      PLAYING
   TYPE       MQTT2_DEVICE
   mqtt_main_MSGCNT 72
   mqtt_main_TIME 2021-03-16 06:54:53
   JSONMAP:
     mute_Master mute
     volume_Master volume
   READINGS:
     2021-03-15 16:55:51   CopyrightInfo   © 2003-2020, Sonos, Inc. All rights reserved.
     2021-03-15 16:55:51   DisplaySoftwareVersion 12.2.2
     2021-03-15 16:55:51   ExtraInfo       
     2021-03-15 16:55:51   Flags           0
     2021-03-15 16:55:51   HTAudioIn       0
     2021-03-15 16:55:51   HardwareVersion 1.20.1.6-2.2
     2021-03-15 16:55:51   IPAddress       10.0.11.70
     2021-03-15 17:09:46   Input           Radio
     2021-03-15 16:55:51   MACAddress      94:9F:3E:8B:52:B2
     2021-03-15 17:09:46   Master          Fitnessraum
     2021-03-15 16:55:51   SerialNumber    94-9F-3E-8B-52-B2:2
     2021-03-15 16:55:51   SoftwareVersion 61.1-83220
     2021-03-15 17:02:48   associatedWith  SonosBridge
     2021-03-15 16:55:49   attrTemplateVersion 20210303
     2021-03-16 06:54:53   bass            0
     2021-03-15 17:04:51   command         play
     2021-03-16 06:54:53   coordinatorUuid RINCON_949F3E8B217001400
     2021-03-16 06:06:51   currentTrack_Album sonos-tts-polly by @Svrooij
     2021-03-16 06:54:53   currentTrack_AlbumArtUri http://10.0.11.70:1400/getaa?u=x-rincon-mp3radio:%2f%2fhttps:%2f%2fwdr-wdr2-ruhrgebiet.icecastssl.wdr.de%2fwdr%2fwdr2%2fruhrgebiet%2fmp3%2f128%2fstream.mp3&v=1
     2021-03-16 06:06:51   currentTrack_Artist Marlene Amazon Polly de-DE
     2021-03-16 06:06:51   currentTrack_Duration 0:00:03
     2021-03-16 06:54:53   currentTrack_ItemId -1
     2021-03-16 06:54:53   currentTrack_ParentId -1
     2021-03-16 06:54:53   currentTrack_ProtocolInfo x-rincon-mp3radio:*:*:*
     2021-03-16 06:54:53   currentTrack_Title WDR 2 Ruhrgebiet Direkt
     2021-03-16 06:54:53   currentTrack_TrackUri x-rincon-mp3radio://https://wdr-wdr2-ruhrgebiet.icecastssl.wdr.de/wdr/wdr2/ruhrgebiet/mp3/128/stream.mp3
     2021-03-16 06:54:53   currentTrack_UpnpClass object.item
     2021-03-16 06:54:53   enqueuedMetadata_ItemId R:0/0/24
     2021-03-16 06:54:53   enqueuedMetadata_ParentId R:0/0
     2021-03-16 06:54:53   enqueuedMetadata_Title WDR 2 Ruhrgebiet Direkt
     2021-03-16 06:54:53   enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
     2021-03-15 17:04:51   error_Action    Play
     2021-03-15 17:04:51   error_Fault     UPnPError
     2021-03-15 17:04:51   error_FaultCode s:Client
     2021-03-15 17:04:51   error_UpnpErrorCode 701
     2021-03-15 17:04:51   error_UpnpErrorDescription Transition not available
     2021-03-15 17:04:51   error_name      SonosError
     2021-03-16 06:54:53   groupName       Wohnzimmer + 1
     2021-03-15 17:09:46   inCouple        0
     2021-03-15 17:09:46   inGroup         0
     2021-03-15 17:09:46   isMaster        1
     2021-03-16 06:54:53   model           Sonos Play:1
     2021-03-15 16:55:52   modelNumber     S12
     2021-03-16 06:54:53   mute            false
     2021-03-16 06:54:53   mute_LF         false
     2021-03-15 16:55:48   mute_Master     false
     2021-03-16 06:54:53   mute_RF         false
     2021-03-16 06:54:53   name            Fitnessraum
     2021-03-16 06:54:53   playmode        NORMAL
     2021-03-16 06:54:52   state           joinGroup
     2021-03-16 06:54:53   transportState  PLAYING
     2021-03-16 06:54:53   treble          0
     2021-03-16 06:54:53   ts              1615874092873
     2021-03-16 06:54:53   uuid            RINCON_949F3E8B52B201400
     2021-03-16 06:54:53   volume          25
     2021-03-16 06:54:53   volume_LF       100
     2021-03-15 16:55:48   volume_Master   25
     2021-03-16 06:54:53   volume_RF       100
Attributes:
   IODev      mqtt_main
   alias      Fitnessraum
   devStateIcon {sonos2mqtt($name,'devStateIcon')}
   devicetopic sonos
   event-on-change-reading state,transportState,volume,isMaster,inGroup
   icon       Sonos2mqtt_icon-S12
   jsonMap    volume_Master:volume mute_Master:mute
   model      sonos2mqtt_speaker
   readingList $DEVICETOPIC/RINCON_949F3E8B52B201400:.* { json2nameValue($EVENT,'',$JSONMAP) }
  $DEVICETOPIC/RINCON_949F3E8B52B201400/ZoneInfo:.* { json2nameValue($EVENT) }
sonos/RINCON_949F3E8B52B201400/error:.* { json2nameValue($EVENT) }
   room       MQTT2_DEVICE
   setList    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)}
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)}
   stateFormat transportState
   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')}


Im alten Sonos Modul sieht der Player so aus:

Internals:
   DEF        RINCON_949F3E8B52B201400_MR
   FUUID      5c45a0be-f33f-8c0c-47e5-18362e373b551358
   NAME       Sonos_Fitnessraum
   NOTIFYDEV  Sonos_Fitnessraum
   NR         209
   NTFY_ORDER 50-Sonos_Fitnessraum
   STATE      appeared ~ 0.0% (0:00:00 / 0:00:00)
   TYPE       SONOSPLAYER
   UDN        RINCON_949F3E8B52B201400_MR
   READINGS:
     2021-03-15 16:51:07   AlarmList       {}
     2021-03-15 16:51:07   AlarmListIDs   
     2021-03-15 16:51:07   AlarmListVersion RINCON_949F3E85047601400:0
     2018-02-02 12:55:39   AlarmRunning    0
     2018-02-02 12:55:39   AlarmRunningID 
     2021-03-16 06:51:11   AvailablePlayer ['Sonos_Schlafzimmer','Sonos_Wohnzimmer']
     2021-03-16 06:51:11   AvailablePlayerList -|Sonos_Schlafzimmer|Sonos_Wohnzimmer
     2021-03-16 06:51:11   AvailablePlayerListAlias Auswahl|Schlafzimmer|Wohnzimmer
     2018-02-02 12:55:22   Balance         0
     2018-02-02 12:55:39   Bass            0
     2018-02-02 12:55:39   CrossfadeMode   0
     2018-02-02 12:55:39   DailyIndexRefreshTime
     2018-02-02 12:55:39   DirectControlAccountID
     2018-02-02 12:55:39   DirectControlClientID
     2018-02-02 12:55:39   DirectControlIsSuspended 0
     2020-12-19 16:57:13   Favourites      {'FV:2/18' => {'Cover' => 'http://cdn-radiotime-logos.tunein.com/s99166g.png','Description' => 'TuneIn Sender','Position' => '0','Title' => 'WDR 2 Ruhrgebiet','Ressource' => 'x-sonosapi-stream:s99166?sid=254&flags=8224&sn=0','Typ' => 'audioBroadcast'}}
     2020-12-19 16:57:13   FavouritesVersion RINCON_949F3E85047601400,51
     2018-02-02 12:55:39   GroupMute       0
     2021-03-16 06:54:53   GroupVolume     20
     2018-02-02 12:55:39   HeadphoneConnected 0
     2018-02-02 12:55:22   IsBonded        0
     2021-03-16 06:54:52   IsMaster        0
     2018-03-27 17:06:19   IsZoneBridge    0
     2021-03-15 16:55:52   LastActionResult Pause: Success!
     2021-03-16 06:45:22   LastSubscriptionsRenew MusicServices: 2021-03-16 06:45:22
     2018-02-02 12:55:39   Loudness        1
     2021-03-16 06:54:52   MasterPlayer    Sonos_Wohnzimmer
     2018-02-02 12:55:39   Mute            0
     2018-02-28 14:20:08   Orientation     0
     2018-02-02 12:55:39   OutputFixed     0
     2019-10-23 17:26:30   Playlists       {'SQ:4' => {'Ressource' => 'file:///jffs/settings/savedqueues.rsq#4','Cover' => 'http://10.0.11.70:1400/getaa?s=1&amp;u=x-sonos-http%3alibrarytrack%3ai.MG2VHA42Ml3.mp4%3fsid%3d204%26flags%3d73760%26sn%3d1','Title' => 'Liebe'},'SQ:1' => {'Ressource' => 'file:///jffs/settings/savedqueues.rsq#1','Cover' => 'http://10.0.11.70:1400/getaa?s=1&amp;u=x-sonos-http%3alibrarytrack%3ai.kGYqBUVDXkRr.mp4%3fsid%3d204%26flags%3d8224%26sn%3d1','Title' => 'Gute Nacht'},'SQ:0' => {'Ressource' => 'file:///jffs/settings/savedqueues.rsq#0','Cover' => 'http://10.0.11.70:1400/getaa?s=1&amp;u=x-sonos-http%3alibrarytrack%3ai.5dgLSVYJ6OX.mp4%3fsid%3d204%26flags%3d8224%26sn%3d1','Title' => 'Guten Morgen'},'SQ:3' => {'Ressource' => 'file:///jffs/settings/savedqueues.rsq#3','Cover' => 'http://10.0.11.70:1400/getaa?s=1&amp;u=x-sonos-http%3alibrarytrack%3ai.5GeYUVYJ6OX.mp4%3fsid%3d204%26flags%3d8224%26sn%3d1','Title' => 'Weihnachten'}}
     2020-12-13 16:06:36   PlaylistsVersion RINCON_949F3E8B52B201400,140
     2019-10-23 17:26:30   Queue           {'Duration' => '0:00:00','DurationSec' => 0}
     2019-10-14 12:58:45   QueueDuration   0:00:00
     2019-10-14 12:58:45   QueueDurationSec 0
     2021-03-16 06:07:03   QueueHash       62c37a5412419c6ef07dc569912de80b
     2021-03-16 06:07:03   QueueVersion    809
     2019-10-23 17:26:32   Radios          {'R:0/0/20' => {'Ressource' => 'x-sonosapi-stream:s99166?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-radiotime-logos.tunein.com/s99166g.png','Title' => 'WDR 2 Ruhrgebiet'},'R:0/0/5' => {'Ressource' => 'x-sonosapi-stream:s223992?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-profiles.tunein.com/s17490/images/logog.jpg','Title' => 'HIT RADIO FFH 100.9 (Hot AC)'},'R:0/0/6' => {'Ressource' => 'x-sonosapi-stream:s25531?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-profiles.tunein.com/s25531/images/logog.png','Title' => 'N-JOY 94.2 (Top 40/Pop)'},'R:0/0/2' => {'Ressource' => 'x-sonosapi-stream:s25005?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-profiles.tunein.com/s25005/images/logog.jpg?t=1','Title' => 'Fritz vom rbb'},'R:0/0/4' => {'Ressource' => 'x-sonosapi-stream:s293289?sid=254&flags=8224&sn=0','Cover' => 'http://cdn-profiles.tunein.com/s293289/images/logog.png?t=1','Title' => 'ENERGY Digital'},'R:0/0/14' => {'Ressource' => 'x-rincon-mp3radio://http://rtlberlin.hoerradar.de/rtlberlin-event01-mp3-128','Cover' => 'http://10.0.11.70:1400/getaa?u=x-rincon-mp3radio%3A%2F%2Fhttp%3A%2F%2Frtlberlin.hoerradar.de%2Frtlberlin-event01-mp3-128','Title' => '104.6rtl Weihnachtsradio'},'R:0/0/24' => {'Ressource' => 'x-rincon-mp3radio://https://wdr-wdr2-ruhrgebiet.icecastssl.wdr.de/wdr/wdr2/ruhrgebiet/mp3/128/stream.mp3','Cover' => 'http://10.0.11.70:1400/getaa?u=x-rincon-mp3radio%3A%2F%2Fhttps%3A%2F%2Fwdr-wdr2-ruhrgebiet.icecastssl.wdr.de%2Fwdr%2Fwdr2%2Fruhrgebiet%2Fmp3%2F128%2Fstream.mp3','Title' => 'WDR 2 Ruhrgebiet Direkt'}}
     2019-05-06 20:44:58   RadiosList      104.6rtl.Weihnachtsradio|ENERGY.Digital|Fritz.vom.rbb|HIT.RADIO.FFH.100.9..Hot.AC.|N-JOY.94.2..Top.40.Pop.|WDR.2.Ruhrgebiet|WDR.2.Ruhrgebiet.Direkt
     2019-05-06 20:44:58   RadiosListAlias 104.6rtl Weihnachtsradio|ENERGY Digital|Fritz vom rbb|HIT RADIO FFH 100.9 (Hot AC)|N-JOY 94.2 (Top 40/Pop)|WDR 2 Ruhrgebiet|WDR 2 Ruhrgebiet Direkt
     2020-12-19 16:57:13   RadiosVersion   RINCON_949F3E85047601400,51
     2021-02-27 17:08:45   Repeat          0
     2018-02-02 12:55:39   RepeatOne       0
     2021-03-12 07:49:58   Shuffle         0
     2021-03-16 06:06:53   SlavePlayer     []
     2021-03-16 06:06:53   SlavePlayerList
     2021-03-16 06:06:53   SlavePlayerListAlias
     2021-03-16 06:06:53   SlavePlayerNotBonded []
     2021-03-16 06:06:53   SlavePlayerNotBondedList
     2021-03-16 06:06:53   SlavePlayerNotBondedListAlias
     2018-02-02 12:55:39   SleepTimer      off
     2018-02-02 12:55:39   SleepTimerVersion
     2018-02-02 12:55:39   SubEnable       1
     2018-02-02 12:55:39   SubGain         0
     2018-02-02 12:55:39   SubPolarity     0
     2018-02-02 12:55:39   Treble          0
     2018-02-02 12:55:39   TruePlay        1
     2021-03-16 06:11:17   Volume          25
     2019-02-14 20:56:39   WifiEnabled     0
     2018-11-23 19:23:47   WirelessMode    0
     2021-03-16 06:54:52   ZoneGroupID     RINCON_949F3E8B217001400:__
     2021-03-16 06:07:03   ZoneGroupName   Fitnessraum
     2021-03-16 06:54:52   ZoneGroupNameDetails Wohnzimmer
     2021-03-16 06:54:52   ZonePlayerUUIDsInGroup RINCON_949F3E8B217001400,RINCON_949F3E8B52B201400
     2021-03-16 06:54:52   currentAlbum   
     2021-03-16 06:54:52   currentAlbumArtURL /fhem/sonos/cover/empty.jpg
     2021-03-16 06:06:24   currentAlbumArtist
     2021-03-16 06:06:24   currentArtist   
     2021-03-16 06:54:52   currentEnqueuedTransportHandle x-rincon-mp3radio://https://wdr-wdr2-ruhrgebiet.icecastssl.wdr.de/wdr/wdr2/ruhrgebiet/mp3/128/stream.mp3|<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="R:0/0/24" parentID="R:0/0" restricted="false"><dc:title>WDR 2 Ruhrgebiet Direkt</dc:title><upnp:class>object.item.audioItem.audioBroadcast</upnp:class><desc id="cdudn" nameSpace="urn:schemas-rinconnetworks-com:metadata-1-0/">SA_RINCON65031_</desc></item></DIDL-Lite>
     2021-03-16 06:54:52   currentEnqueuedTransportURI x-rincon-mp3radio://https://wdr-wdr2-ruhrgebiet.icecastssl.wdr.de/wdr/wdr2/ruhrgebiet/mp3/128/stream.mp3
     2021-03-16 06:05:39   currentFavouriteName
     2021-03-16 06:05:39   currentFavouriteNameMasked
     2021-03-16 06:54:52   currentNormalAudio 0
     2018-02-02 12:55:39   currentOriginalTrackNumber
     2021-03-12 07:49:58   currentPlaylistName
     2021-03-12 07:49:58   currentPlaylistNameMasked
     2021-03-16 06:54:52   currentRadioName WDR 2 Ruhrgebiet Direkt
     2021-03-16 06:54:52   currentRadioNameMasked WDR.2.Ruhrgebiet.Direkt
     2021-03-16 06:54:52   currentSender   WDR 2 Ruhrgebiet Direkt
     2018-02-02 12:55:39   currentSenderCurrent
     2021-03-16 06:55:30   currentSenderInfo Lifehouse - Halfway gone
     2021-03-16 06:54:52   currentSource   WDR 2 Ruhrgebiet Direkt
     2021-03-16 06:54:52   currentStreamAudio 1
     2021-03-16 06:54:52   currentTitle   
     2021-03-15 17:08:06   currentTrack    1
     2021-03-16 06:54:52   currentTrackDuration 0:00:00
     2021-03-16 06:06:24   currentTrackDurationSec 0
     2021-03-16 06:55:30   currentTrackHandle http://https://wdr-edge-30b6-fra-ts-cdn.cast.addradio.de/wdr/wdr2/ruhrgebiet/mp3/128/stream.mp3?_art=dj0yJmlwPTc5LjIyOS4yMzkuMTkmaWQ9aWNzY3hsLWVuYnoza2VuYiZ0PTE2MTU5NjAyODAmcz03ODY2ZjI5YyNjMzRjNjMwZTg5MmI4ZDE1ZTUwMzQ4OTA1MzYwYTY0Yg|<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="-1" parentID="-1" restricted="true"><res protocolInfo="x-rincon-mp3radio:*:*:*">x-rincon-mp3radio://https://wdr-edge-30b6-fra-ts-cdn.cast.addradio.de/wdr/wdr2/ruhrgebiet/mp3/128/stream.mp3?_art=dj0yJmlwPTc5LjIyOS4yMzkuMTkmaWQ9aWNzY3hsLWVuYnoza2VuYiZ0PTE2MTU5NjAyODAmcz03ODY2ZjI5YyNjMzRjNjMwZTg5MmI4ZDE1ZTUwMzQ4OTA1MzYwYTY0Yg</res><r:streamContent>Lifehouse - Halfway gone</r:streamContent><r:radioShowMd></r:radioShowMd><dc:title>stream.mp3?_art=dj0yJmlwPTc5LjIyOS4yMzkuMTkmaWQ9aWNzY3hsLWVuYnoza2VuYiZ0PTE2MTU5NjAyODAmcz03ODY2ZjI5YyNjMzRjNjMwZTg5MmI4ZDE1ZTUwMzQ4OTA1MzYwYTY0Yg</dc:title><upnp:class>object.item</upnp:class></item></DIDL-Lite>
     2021-03-16 06:54:52   currentTrackPosition 0:00:00
     2021-03-16 06:54:52   currentTrackPositionSec 0
     2021-03-16 06:54:52   currentTrackPositionSimulated 0:00:00
     2021-03-16 06:06:24   currentTrackPositionSimulatedPercent 0.0
     2021-03-16 06:54:52   currentTrackPositionSimulatedSec 0
     2021-03-16 06:54:52   currentTrackProvider Radio
     2021-03-16 06:54:52   currentTrackProviderIconQuadraticURL /fhem/sonos/cover/tunein_quadratic.jpg
     2021-03-16 06:54:52   currentTrackProviderIconRoundURL /fhem/sonos/cover/tunein_round.png
     2021-03-16 06:54:52   currentTrackURI http://https://wdr-edge-30b6-fra-ts-cdn.cast.addradio.de/wdr/wdr2/ruhrgebiet/mp3/128/stream.mp3?_art=dj0yJmlwPTc5LjIyOS4yMzkuMTkmaWQ9aWNzY3hsLWVuYnoza2VuYiZ0PTE2MTU5NjAyODAmcz03ODY2ZjI5YyNjMzRjNjMwZTg5MmI4ZDE1ZTUwMzQ4OTA1MzYwYTY0Yg
     2019-05-04 15:52:08   fhemMsgAudio    Ihr sollt nicht lästern, wir hören hier alles!
     2019-05-04 15:52:08   fhemMsgAudioGw  Sonos_Arbeitszimmer:OK
     2019-05-04 15:52:08   fhemMsgAudioPrio 0
     2019-05-04 15:52:08   fhemMsgAudioState 1
     2019-05-04 15:52:08   fhemMsgAudioTitle -
     2019-05-04 15:52:08   fhemMsgState    1
     2019-05-04 15:52:08   fhemMsgStateTypes audio:1
     2018-02-02 12:55:22   fieldType       
     2021-03-16 06:55:30   infoSummarize1  WDR 2 Ruhrgebiet Direkt: Lifehouse - Halfway gone
     2021-03-16 06:55:30   infoSummarize2  PLAYING => WDR 2 Ruhrgebiet Direkt: Lifehouse - Halfway gone
     2021-03-16 06:54:52   infoSummarize3  Lautstärke: 15 ~ Ton An ~ Balance: Mitte ~ Kein Kopfhörer
     2018-02-02 12:55:39   infoSummarize4 
     2019-10-23 17:19:03   location        http://10.0.11.70:1400/xml/device_description.xml
     2021-03-12 07:49:58   nextAlbum       
     2021-03-12 07:49:58   nextAlbumArtURL /fhem/sonos/cover/empty.jpg
     2021-02-27 17:08:45   nextAlbumArtist
     2021-03-12 07:49:58   nextArtist     
     2018-02-02 12:55:39   nextOriginalTrackNumber
     2021-03-12 07:49:58   nextTitle       
     2021-03-12 07:49:58   nextTrackDuration
     2021-03-12 07:49:58   nextTrackDurationSec
     2021-03-15 06:58:32   nextTrackHandle |
     2021-03-12 07:49:58   nextTrackProvider
     2021-03-12 07:49:58   nextTrackProviderIconQuadraticURL
     2021-03-12 07:49:58   nextTrackProviderIconRoundURL
     2021-03-12 07:49:58   nextTrackURI   
     2021-03-15 17:09:45   numberOfTracks  1
     2018-02-02 12:55:22   playerType      S12
     2021-03-16 05:05:11   presence        appeared
     2018-02-02 12:55:39   roomIcon        office
     2020-06-05 15:46:49   roomName        Fitnessraum
     2020-06-05 15:46:49   roomNameAlias   Fitnessraum
     2020-06-05 15:46:49   saveRoomName    Fitnessraum
     2018-02-02 12:55:22   serialNum       94-9F-3E-8B-52-B2:2
     2020-12-19 16:57:13   softwareRevision 12.2.2
     2021-03-10 05:05:11   softwareRevisionAvailable 13.0
     2020-12-19 16:57:13   softwareRevisionInternal 61.1-83220
     2021-03-10 05:05:11   softwareRevisionInternalAvailable 62.1-86220
     2021-03-16 06:54:52   state           PLAYING
     2021-03-16 06:54:52   transportState  PLAYING
   helper:
     simulateCurrentTrackPosition 0
Attributes:
   alias      Fitnessraum
   event-on-change-reading state,transportState,MasterPlayerPlayingCount,IsMaster,presence
   generateInfoSummarize1 <NormalAudio><Artist prefix="(" suffix=")"/><Title prefix=" '" suffix="'" ifempty="[Keine Musikdatei]"/><Album prefix=" vom Album '" suffix="'"/></NormalAudio> <StreamAudio><Sender suffix=":"/><SenderCurrent prefix=" '" suffix="' -"/><SenderInfo prefix=" "/></StreamAudio>
   generateInfoSummarize2 <TransportState/><InfoSummarize1 prefix=" => "/>
   generateInfoSummarize3 <Volume prefix="Lautstärke: "/><Mute instead=" ~ Kein Ton" ifempty=" ~ Ton An" emptyval="0"/> ~ Balance: <Balance ifempty="Mitte" emptyval="0"/><HeadphoneConnected instead=" ~ Kopfhörer aktiv" ifempty=" ~ Kein Kopfhörer" emptyval="0"/>
   generateVolumeSlider 1
   getAlarms  1
   getTitleInfoFromMaster 1
   group      Medien
   icon       icoSONOSPLAYER_icon-S12.png
   minVolume  0
   model      Sonos_S12
   room       Fitnessraum
   simulateCurrentTrackPosition 0
   sortby     1
   stateFormat presence ~ currentTrackPositionSimulatedPercent% (currentTrackPositionSimulated / currentTrackDuration)
   webCmd     Volume


Hier sieht man: IsMaster = 0.
Auch weitere Readings sind nicht aktuell. Die lists sind nahezu zum gleichen Zeitpunkt erstellt werden, es sind also auch Werte falsch wie einige von den  currentTrack_* Readings. Im alten Sonos Device sind diese aktuell, an den fehlenden UPnP Messages kann es also eigentlich nicht liegen.

Ah, ich glaub ich habs... event-on-change-reading beißt sich mit den definierten userReadings. Wegen der Menge an Events hatte ich event-on-change-reading auf einige wenige interessante Readings gesetzt, aber dann fehlen die Events für die userReadings. Das wird es wohl zumindest für die inGroup/isMaster Readings sein.

Also weiter im Test. :D

Für die Wunschliste: Können wir im Bridge Device vielleicht einige der Readings aus dem alten Sonos Device implementieren? Vor allem die Listen der aktuellen Master-Player? Ich verwende das alte MasterPlayerPlaying/MasterPlayerPlayingCount um dynamisch Player in Gruppen aufzunehmen/zu entfernen, wenn jemand einen Raum betritt/verlässt.

2021-03-16 08:03:00   MasterPlayer    ['Sonos_Fitnessraum','Sonos_Schlafzimmer']
     2021-03-16 08:03:00   MasterPlayerCount 2
     2021-03-16 08:03:00   MasterPlayerNotPlaying ['Sonos_Fitnessraum']
     2021-03-16 08:03:00   MasterPlayerNotPlayingCount 1
     2021-03-16 07:37:38   MasterPlayerPlaying ['Sonos_Schlafzimmer']
     2021-03-16 07:37:38   MasterPlayerPlayingCount 1


Oh, und Player "set" Kommandos für Repeat und Shuffle! :D
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 16 März 2021, 08:03:16
Hi Otto123,

Zitat von: Otto123 am 15 März 2021, 22:42:13
Diese config Readings sind ok, das sind die MQTT Infos die wir nicht brauchen :)

Du hast das template angwendet?
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort

Was gibt Dir das zurück?
list n_configSonos.*


habe ich gemacht und sieht so aus:
Internals:
   CFGFN     
   DEF        global:DEFINED.MQTT2_RINCON_[A-Z0-9]+|MQTT2_RINCON_[A-Z0-9]+:IPAddress:.* {sonos2mqtt_nty($NAME,$EVENT)}
   FUUID      604fccb3-f33f-d9cb-9914-b26ceb7ad3bc55ed
   NAME       n_configSonos
   NR         199
   NTFY_ORDER 50-n_configSonos
   REGEXP     global:DEFINED.MQTT2_RINCON_[A-Z0-9]+|MQTT2_RINCON_[A-Z0-9]+:IPAddress:.*
   STATE      active
   TYPE       notify
   READINGS:
     2021-03-15 22:08:22   state           active
Attributes:


NACHTRAG:
ich habe das template noch mal ausgeführt. Im log tauchen einige Warnings auf!
021.03.16 08:13:28 1: PERL WARNING: Subroutine sonos2mqttUtils_Initialize redefined at ./FHEM/99_sonos2mqttUtils.pm line 14.
2021.03.16 08:13:28 1: PERL WARNING: Subroutine sonos2mqtt redefined at ./FHEM/99_sonos2mqttUtils.pm line 22.
2021.03.16 08:13:28 1: PERL WARNING: Subroutine sonos2mqtt_searchList redefined at ./FHEM/99_sonos2mqttUtils.pm line 174.
2021.03.16 08:13:28 1: PERL WARNING: Subroutine sonos2mqtt_devStateIcon redefined at ./FHEM/99_sonos2mqttUtils.pm line 198.
2021.03.16 08:13:28 1: PERL WARNING: Subroutine sonos2mqtt_mod_list redefined at ./FHEM/99_sonos2mqttUtils.pm line 241.
2021.03.16 08:13:28 1: PERL WARNING: Subroutine sonos2mqtt_setup redefined at ./FHEM/99_sonos2mqttUtils.pm line 258.
2021.03.16 08:13:28 1: PERL WARNING: Subroutine sonos2mqtt_nty redefined at ./FHEM/99_sonos2mqttUtils.pm line 297.
2021.03.16 08:13:28 1: PERL WARNING: Subroutine sonos2mqtt_ur redefined at ./FHEM/99_sonos2mqttUtils.pm line 321.
2021.03.16 08:13:28 1: PERL WARNING: Subroutine sonos2mqtt_getList redefined at ./FHEM/99_sonos2mqttUtils.pm line 350.


Spartacus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 16 März 2021, 09:11:35
@Phiolin
Man sieht es hier:     2021-03-16 06:54:53   groupName       Wohnzimmer + 1
     2021-03-15 17:09:46   inCouple        0
     2021-03-15 17:09:46   inGroup         0
     2021-03-15 17:09:46   isMaster        1
Der groupName wird geändert die userReadings nicht , das Du das mit event-on-change-reading komplett verhindert hast, hast Du schon gemerkt :) der groupName triggert. Kann man generell auch anders machen. Aber da der groupName ausgelesen wird habe ich mir angewöhnt auch genau den Wert als Trigger zu nehmen.

Das mit den Readings in der Bridge geht sicher, mal schauen wo man die Infos herbekommt.

@Spartacus Du bist jetzt glaube ich richtig in einen Umbruch reingeraten. Template war noch alt - da passte am Ende nicht alles zusammen.
Die Warnings sind normal, die passieren immer wenn man im laufenden Betrieb ein reload datei.pm macht und in unserem Fall passiert ja ein reload 99_sonso2mqttUtils.pm
Hast Du denn jetzt Player Devices?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 16 März 2021, 09:18:54
Moin Otto,
naja, man sollte natürlich auch autocreate einschalten...dann klappt´s auch mit den Playern!  ;)

Aber noch ne Frage:
Was ist der Unterschied zwischen den einzelnen Templates.
bridge, speaker und bridge_comfort

Im Prinzip will ich keine Visualisierung der Player, sondern einfach nur das normale Device, ohne die ganzen Playertaste und die Senderlogos/Cover

Spartacus

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 16 März 2021, 09:53:10
Naja - das war auch eine Entwicklung :)
Grundlage: Du kannst alles selbst bauen!
Du bist mein Testhelfer Du musst unbedingt nochmal den Artikel lesen und sagen was da nicht steht! https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Sonos2Mqtt

Bridge setzt nur das notwendigste, damit wird dem System ermöglicht separate MQTT2_DEVICES zu erzeugen, ansonsten würde alles in Eines geraten.
Speaker konfiguriert den Speaker, so das man ordentliche Readings und Funktionen hat. Wenn Du "ganzen Playertaste und die Senderlogos/Cover" nicht willst, löschst du einfach das attr devStateIcon
bridge_comfort ist quasi das rundumsorglos setup programm, dort wird auch das notify definiert welches die Player nicht anlegt aber wenn sie angelegt werden automatisch fertig konfiguriert

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Phiolin am 16 März 2021, 10:37:07
Ich hab bei mir auch noch 3 n_configSonos notifies.
Im aktuellen Template finde ich nur eins. Die beiden anderen sind dann vermutlich veraltet und können weg?
Wer weiß was da wegen dem alten Kram alles schief läuft. :D

n_configSonos
Internals:
   DEF        global:DEFINED.MQTT2_RINCON_[A-Z0-9]+|MQTT2_RINCON_[A-Z0-9]+:IPAddress:.* {sonos2mqtt_nty($NAME,$EVENT)}
   FUUID      604f127a-f33f-8c0c-3ff8-00edb88c591d6930
   NAME       n_configSonos
   NR         505
   NTFY_ORDER 50-n_configSonos
   REGEXP     global:DEFINED.MQTT2_RINCON_[A-Z0-9]+|MQTT2_RINCON_[A-Z0-9]+:IPAddress:.*
   STATE      2021-03-16 07:43:58
   TRIGGERTIME 1615877038.53374
   TYPE       notify
   READINGS:
     2021-03-15 17:01:06   state           active
Attributes:


n_configSonos1
Internals:
   DEF        global:DEFINED.MQTT2_RINCON_[A-Z0-9]+ sleep 1;
  set $EVTPART1 attrTemplate sonos2mqtt_speaker;
  set $EVTPART1 x_raw_payload {"command": "adv-command","input": {"cmd":"GetZoneInfo","reply":"ZoneInfo"}}
   FUUID      604efea1-f33f-8c0c-d7e1-35e4a6e8c6e61782
   NAME       n_configSonos1
   NOTIFYDEV  global
   NR         503
   NTFY_ORDER 50-n_configSonos1
   REGEXP     global:DEFINED.MQTT2_RINCON_[A-Z0-9]+
   STATE      2021-03-16 07:43:55
   TRIGGERTIME 1615877035.35129
   TYPE       notify
   READINGS:
     2021-03-15 16:50:00   state           active
Attributes:


n_configSonos2
Internals:
   DEF        MQTT2_RINCON_[A-Z0-9]+:IPAddress:.* {
  my @tv = ("S14","S11","S9");
  my @line = ("S5","Z90","ZP120");
  my $url="http://$EVTPART1:1400";
  my $xmltext = GetFileFromURL("$url/xml/device_description.xml");
  my ($mn)=$xmltext =~ /<modelNumber>([SZ]P?[0-9]{1,3})/;
  my ($img)=$xmltext =~ /<url>(.*)<\/url>/;
  my $icon="Sonos2mqtt_icon-$mn";
  my $setList=AttrVal($NAME,'setList','');
  fhem("setreading $NAME modelNumber $mn");
  fhem("\"wget -qO ./www/images/default/$icon.png $url$img\"");
  fhem("attr $NAME icon $icon;sleep 4 WI;set WEB rereadicons");
  if (grep(/$mn/, @tv)) {$setList=~s/input:Queue \{/input:Queue,TV \{/};
  if (grep(/$mn/, @line)) {$setList=~s/input:Queue \{/input:Queue,Line_In \{/};
  $setList=~s/;/;;/g;
  fhem("attr $NAME setList $setList")
}
   FUUID      604efea2-f33f-8c0c-598a-cbac1d436fec50f6
   NAME       n_configSonos2
   NR         504
   NTFY_ORDER 50-n_configSonos2
   REGEXP     MQTT2_RINCON_[A-Z0-9]+:IPAddress:.*
   STATE      2021-03-16 07:43:58
   TRIGGERTIME 1615877039.23088
   TYPE       notify
   READINGS:
     2021-03-15 16:50:00   state           active
Attributes:
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 16 März 2021, 11:07:10
Ja das ist contarprduktiv ;) Ich hatte das irgendwo mal mit hingeschrieben. sollte ich die im Template löschen? Fände ich übergriffig - mal schauen ob mir da was einfällt.
das erste ist aktuell die anderen beiden:
delete n_configSonos.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 16 März 2021, 11:17:25
Hi Otto,

Zitat von: Otto123 am 16 März 2021, 09:53:10
Naja - das war auch eine Entwicklung :)
Grundlage: Du kannst alles selbst bauen!
Du bist mein Testhelfer Du musst unbedingt nochmal den Artikel lesen und sagen was da nicht steht! https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Sonos2Mqtt

das werde ich im Laufe der Woche noch machen. Ich muss sowieso Sonos2Mqtt-Server neu aufsetzten, den aktuell ist da noch ein fhem drauf, was man nicht benötig und dann gehe ich die Anleitung noch mal durch. Mal gucken, ob die neue Sonos2Mqtt-vm mit 512MB RAM auskommt.

Muss dann auch noch testen, wie man aus fhem heraus den Sonos dienst auf der andere Kiste startet, denn ich habe verstanden, dass nur bei einem Neustart Änderungen an der Sonos-Umgebung discovered werden....
Im Prinzip benötige ich so etwas  global:INITIALIZED "pm2 -s start sonos2mqtt"
für die entfernte vm! oder wie löst man das am Besten?

Spartacus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 16 März 2021, 11:48:12
würde ich sicher über ssh machen. Komprimierter Einstieg https://heinz-otto.blogspot.com/2020/09/ssh-mit-public-key.html oder alle Artikel mit ssh https://heinz-otto.blogspot.com/search?q=ssh

Das mit dem discovered bin ich mir nicht sicher. Eigentlich gibt es das CheckSubscription(über mqtt) , das läuft auch in Abständen automatisch. Der sollte die Änderungen mitbekommen.
Also wenn ich Player ausschalte und später wieder einschalte funktioniert es damit.
Den Dienst selber muss man eigentlich nicht regelmäßig starten, aber ja, ist sicher gut es zu können.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 21 März 2021, 15:40:09
Hi,

bekomms nicht hin, hab zwar nur einen Player mag aber den Befehl zum muten nur ausführen lassen wenn der Player auch spielt.

Wie lautet die devspec denn korrekt ? So klappts nicht:

set a:model=sonos2mqtt_speaker:Filter=state=PLAYING mute
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 21 März 2021, 15:50:54
 ;)
list a:model=sonos2mqtt_speaker:FILTER=transportState=STOPPED
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 21 März 2021, 15:59:52
Hab ehrlich gesagt noch nicht umgestellt auf die aktuelle Version, in meinem Device mappe ich transportState noch nach state.

edit: Ach Sch.. brauche gar nicht weiter schreiben, Filter in Großschreibung  ::)

DANKE

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 21 März 2021, 16:15:23
Moin Otto,
so! Ich bin Dir noch ein Feedback schuldig. Ich habe jetzt das sons2mqtt noch einmal nach Deiner Anleitung aufgesetzt.
Was ich auf meinem "nackten" Debian-System gemacht habe:

apt-get install curl

curl -sL https://deb.nodesource.com/setup_14.x | bash -
apt-get update && apt-get install yarn

apt-get install -y nodejs
apt-get install -y libjson-pp-perl
npm install -g sonos2mqtt
npm install pm2 -g

pm2 start sonos2mqtt -- --mqtt mqtt://172.16.x.x:1800


Auf der fhem Büchse reicht es aus, die Bridge zu definieren:

define SonosBridge MQTT2_DEVICE
attr SonosBridge IODev NameDesVorhandenenMQTT2Servers
attr SonosBridge room MQTT2_DEVICE
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort


Damit ist das System komplett funktionsfähig und die Player werden erkannt. Wichtig ist allerdings, dass "autocreate" aktiviert ist, sonst werden die Player nicht automatisch angelegt.


Allerdings bekomme ich es noch nicht hin, den Dienst auf dem anderen Host zu starten. Von der Konsole aus klappt das mit folgendem Befehl:
ssh -i \opt\fhem\.ssh\<privatekeyfile> user@SonosBridge pm2 start sonos2mqtt -- --mqtt mqtt://172.16.x.x:1800

wenn ich dies allerdings von der fhem-Konsolo mit
{qx (ssh -i \opt\fhem\.ssh\SonosBridge user@SonosBridge pm2 start sonos2mqtt -- --mqtt mqtt://172.16.x.x:1800)}
starte, dann kommt folgende Fehlermeldung:
Global symbol "@SonosBridge" requires explicit package name (did you forget to declare "my @SonosBridge"?) at (eval 165328) line 1.

Was ist hier in der Syntax falsch? SonosBridge heisst auch das private-key-file
Spartacus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 21 März 2021, 17:05:34
Hi spartacus,

Innerhalb der einfachen Klammern von qx() werden Variablen versucht aufzulösen analog zu "doppelten Hochkommas"
Du musst in dem Fall das @ schützen/escapen -> \@

Du verwendest immer Port 1800 ist das wegen meinem Beispiel im Wiki so oder ist das eine persönlicher Vorliebe oder warum nimmst Du nicht Standard 1883?

Schön das es ansonsten klappt wie beschrieben :)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 21 März 2021, 17:52:40
Hi Otto,
nö, das war halt aus Deinem Beispiel. Das hat keinen besonderen Grund mit dem Port.....

Allerdings klappt das aus fhem noch nicht! Ich habe das @nun maskiert, aber auch das hilf nicht. Es gibt zwar keine Fehlermeldung, aber er startet den Service auch nicht. Ich schätze es liegt am Benutzer. Hast Du noch nen Tipp?

Auf der Konsole des Fhem-Servers kann ich den Dienst auf SonosBridge sowohl unter "root" als auch unter dem Benutzer "user" starten

{qx (ssh -i /opt/fhem/SonosBridge user\@SonosBridge pm2 start sonos2mqtt -- --mqtt mqtt://172.16.x.x:1800)}
Spartacus

NACHTRAG:
Im fhem log steht Host "key verification failed."
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 21 März 2021, 18:02:09
Ich habe das ehrlich gesagt noch nie mit Option -i gemacht. das muss ich mir anschauen.
Ich vermute der user fhem (dein FHEM läuft doch mit user fhem?) kann irgendwas nicht lesen.

Du kannst auf der Konsole mit diesem User testen indem Du den Befehlen sudo -su fhem voranstellst.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 21 März 2021, 18:19:23
Hi Otto,
danke Dir! Das war ein guter Tipp mit dem sudo -su fhem. Das Keyfile hatte noch die Berechtigung und Gruppenzuordnung vom User root. Habe es geändert und nun kann ich es auch unter fhem starten....

Gruß,
Spartacus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 21 März 2021, 18:29:25
Nochmal.

wegen dem hier:

return fhem("set $lgtvs mute on;set $sonosps mute");

das man auch verkürzt und nach DevelopmentGuidelinesAV auch so coden könnte:

return fhem("set $lgtvs,$sonosps mute on");

war ich damals für on/off, ja mir gefällt nur mute auch, aber ums gefallen gehts ja nicht.

Zitat von: Otto123 am 27 Oktober 2020, 19:35:03

mute: Ja kann sein, da waren wir auch schon mal bei on/off letztlich liefert das System true / false und man muss true / false setzen. Ich habe dann Kurzerhand die Sache "verkürzt" (und nicht zweimal umgewandelt). Aber ja können wir wieder anders machen. Ich suche mal den Code (der steht hier noch irgendwo im Thread).




Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 21 März 2021, 19:15:11
Ja ja ja :)
Änderung in Zeile 121
my %t=('true'=>'mute','false'=>'unmute','on'=>'mute','off'=>'unmute');
Änderung jetzt im SVN gemacht

Aber nutzt Dir ja nix ;) :
ZitatHab ehrlich gesagt noch nicht umgestellt auf die aktuelle Version,

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 23 März 2021, 15:54:52
Zitat von: Otto123 am 21 März 2021, 19:15:11
Aber nutzt Dir ja nix ;) :

Noch nicht umgestellt heißt nicht das ich kein Test-Device habe  :P




Wie wärs wenn mans endgültig mal genauso umsetzt wie es bisher in DevelopmentGuidelinesAV festgehalten ist ?   :P

my $tmute = ReadingsVal($NAME,'mute','') eq 'true' ? 'unmute' : 'mute';
my %t=('true'=>'mute','false'=>'unmute','on'=>'mute','off'=>'unmute','toggle'=>"$tmute");
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 24 März 2021, 11:47:39
Moin Thomas,

so (zusammengezogen) eingecheckt :)

Ich hätte es gern "rekursiv" gemacht - aber da gibts das Henne / Ei Problem
Funktioniert NICHT
my %t=('true'=>'mute','false'=>'unmute','on'=>'mute','off'=>'unmute','toggle'=>$t{ReadingsVal($NAME,'mute','')});

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 24 März 2021, 11:59:18
Zitat von: TomLee am 21 März 2021, 15:59:52
... in meinem Device mappe ich transportState noch nach state.

Scheinbar mach nur ich das, dachte das wurde mal mit in das Template übernommen.
Das war ziemlich am Anfang des Thread mal Thema. Hab ja nur einen Player und bisher war das Mappen von transportState nach state für mich schlüssig. Keine Ahnung welche Werte transportState evtl. noch annehmen kann mit mehreren Player oder Gruppen.
Spricht denn irgendwas was dagegen ?
Ohne Mapping steht doch immer der letzte ausgeführte Befehl in state, braucht man das, wird der letzte Wert irgendwo benötigt, find das gut wenn transportState das dann überschreibt ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 24 März 2021, 12:15:37
Eine Frage hab ich noch, würde gerne noch verstehen weshalb du weiterhin false und true bei mute drinlässt ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 24 März 2021, 13:06:49
bei state wandert alles durch, jeder set Befehl, jede Reaktion. Wenn man das als finale Zentrale nimmt, muss man tausend Sachen abfragen und abfangen (z.B. devStateIcon)
deswegen habe ich das wieder rausgenommen und frage konsequent transportState ab. Damit es gut aussieht und nicht jeder Mist in der Ansicht landet habe ich stateFormat auf transportState gesetzt. Das spart z.B. im devStateIcon ein drittel der Zeilen an Code.

Ich habe jetzt die templates noch nicht geändert, d.h. mute reagiert auf alle Befehle. In der Klappliste ist es noch "alt" - kann ich beim nächsten Template ändern. Bei der sonos2mqttUtils bin ich solo und damit Entschlussfreudiger.
Das sehe ich mittlerweile als Manko bei setList - alles ist dynamisch nur "der Anfang" nicht  :-[ schön wäre wenn das widget auch als Perlcode ginge.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 24 März 2021, 15:14:17
Zitat- alles ist dynamisch nur "der Anfang" nicht  :-[ schön wäre wenn das widget auch als Perlcode ginge.

keine Vorstellung obs dann mit Perl-Code auch schon ginge: und die Möglichkeit den Namen des setters auf ein Reading zu Mappen.
Dann könnte man sich was basteln dass das Auswahlfeld immer den gerade spielenden Radiosender anzeigt, so ist die Liste nach akualisieren der Seite immer leer.
Also: playFav matchst du den Wert aus enqueuedMetadata_Title und spielst gerade ? dann zeig ihn an, sonst irgendeinen default-Wert, wie das halt auch bspw. bei volume ist (also da ohne default-Wert).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 28 März 2021, 15:33:48
Moin zusammen,
ich spiele heute ein wenig mit meinem System herum. Was mit aufgefallen ist, dass nicht alle Player/Komponenten erkannt wurden.
Stereopaare hat er als einzelnen Player aufgelistet (z.B. Bad und Bad; Garten und Garten, wobei das doof ist, da man links und rechts nicht direkt unterscheiden kann. Da muss man wohl mit Alias-Namen arbeiten)
Allerdings hat er meine Surround-Kombination aus AMP, SUB und 2 x One nicht erkannt und hat den SUB und die beiden "Ones" auch nicht als separate Player gefunden. Ist das "normal" Muss ich es erst mal trennen, damit Sonos2MQTT es erkennt? Oder geht das einfach noch nicht!

Spartacus

NACHTRAG:
einige Befehle, wie z.B. im fhem SONOS-Modul, scheint es auch noch nicht zu geben, oder?  LoadRadio, Treble, Bass, Loudness, LED,State etc.) Ist das im Sonos2Mqtt-Modul noch nicht verfügbar?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 28 März 2021, 18:09:53
Hi,

StereoPaare sind etwas "besonders" - die werden auch im Sonos Modul anders behandelt (dort wird ein Player einfach mit anderer Bezeichnung _RF "weggedrückt". Hier laufen sie wie im angehängten Bild mit der Kennzeichnung des zweiten Players.
Surround Kombinationen werden nicht aufgelöst. Die werden als ein Player dargestellt. Das liefert sonos2mqtt mW nicht anders. Finde ich aber ok. Im Sonos Modul weiß ich gar nicht was ich mit der Info soll?

Loadradio weiß ich nicht was es tut, ich habe ja play mit 'Radio','Favorite','Playlist' eingebaut.
LED State müsste man schauen. Den Rest wüsste ich nicht ob und wozu man das in der Automatisierung braucht - wie gesagt ich wollte nicht die App nachbauen :)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 28 März 2021, 18:24:57
Hi Otto,
ja, alles gut! Ist mir halt aufgefallen. Play mit Radio, Favorite, Playlist?. Da verstehe ich die Syntax jetzt nicht.  Bei "set <Player> play" kann ich doch keine Parameter übergeben, oder wie meinst Du das? Wie steuere ich den jetzt WDR 2 oder  NDR 2 an? Hast Du ggf. mal ein Beispiel?

Das mit "Bass", "Treble",  etc. und dem "LoadRadio" war bei mir die SonosInit-Phase, wenn ein Player vom Strom getrennt wurde, wurde er mit Standardparameter geladen und bekam dann einen Radiosender mir Default Einstellungen mit. Ich glaube, die Sound-Einstellungen behält er mittlerweile auch nach einem poweroff.  Aber egal, das ist auch nicht so wichtig! Nur um den Anwendungsfall mal aufzuzeigen.

Spartacus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 28 März 2021, 18:28:34
Habe ich sogar Doku :)
https://wiki.fhem.de/wiki/Sonos2mqtt#Listen_der_Favoriten_Radios_und_Playlist_erstellen

Ich hoffe ich habe da nichts übersehen ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 28 März 2021, 18:56:14
Hi Otto,
so auf Anhieb versteh ich es mit dem set alias=xxx nicht! Muss mal das ganze Wiki lesen. Die Player-Devices fangen ja alle mit RINCON_B8E93.... an. Daher finde ich die Klartextnamen jetzt verwirrend. Aber ich lese mal das ganze Wiki...
Spartacus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 28 März 2021, 19:21:32
hinter set kommt ja ein devspec, das kann der Name des Gerätes oder sowas wie alias=Name sein. Das kann auch model= sein.
Findest Du unter devspec in der Comamndref.
Da die Geräte automatisch angelegt werden, will ich sie nicht umbenennen und verwende immer die Aliase - kannst Du aber machen wie Du willst.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 28 März 2021, 20:16:54
Hi Otto,
alles klar! Habe es geschnallt! Und es funzt auch, wenn man die Listen vorher läd!
Ich werde jetzt noch etwas rumspielen....

Ach ja, kann man die Devices "RINCON_B8E93xxxxx" umbenennen, oder sind damit Probleme vorprogrammiert. Die Rincon-Device-Namen passen nicht unbedingt in mein Namensschema!

Spartacus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 28 März 2021, 20:32:07
ZitatAch ja, kann man die Devices "RINCON_B8E93xxxxx" umbenennen,

Zitat- kannst Du aber machen wie Du willst.

Ich hab auch kurz gebraucht bis ich das "geschnallt" hatte.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 28 März 2021, 20:58:03
Umbenennen ist kein Problem. Aber der Name ist ja auch nicht RINCON_ sondern MQTT2_RINCON_
Der Name kommt von autocreate, der versucht einen eindeutigen Namen zu erzeugen, durch Einbeziehung von eindeutigen IDs. Das musst Du auch schaffen, dann ist alles in Ordnung :)
Aber was ist besser an set Sonos_Büro gegenüber set alias=Büro :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: raiderxxl am 08 April 2021, 18:02:54
Hi,

kann ich irgendwie nen Bass Wert setzten?
(Wenn Pubertier abends Mucke hört, möchte ich ihr dann Abends ab 21:00 den Bass abdrehen) ;)
Das ging mit dem OllenblödennichtlaufendenSonos Modul nur mit DEMSUPERDUPERMQQTSONEOS Modul (noch) nicht...

Grüßle

Pascal
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 08 April 2021, 19:43:00
Hallo Pascal,

geht irgendwie über advanced command https://svrooij.io/node-sonos-ts/sonos-device/services/rendering-control-service.html

Ist aber nicht "komfortabel" eingebaut. Musst Du selbst mal probieren?
Hier mal ein Beispiel wo ich letztens mit dem LED State experimentiert habe:
#Kommando zum setzen - mit Antwort (True/False)
{
  "command": "adv-command",
  "input": {
    "cmd": "DevicePropertiesService.SetLEDState",
    "val": {
      "DesiredLEDState": "On"
    },
    "reply": "Reply"
  }
}

# Ohne Antwort
{
  "command": "adv-command",
  "input": {
    "cmd": "DevicePropertiesService.SetLEDState",
    "val": {
      "DesiredLEDState": "On"
    }
  }
}

# readingList Ergänzung wie macht man das Universal?
sonos/RINCON_347E5C82560801400/Resp:.* { json2nameValue($EVENT) }

#Kommando zur Abfrage (keine extra Parameter werden übergeben)
{
  "command": "adv-command",
  "input": {
    "cmd": "DevicePropertiesService.GetLEDState",
    "val": {
      "InstanceID": 0,
      "Channel": "Master"
    },
    "reply": "Resp"
  }
}
# geht auch so
{
  "command": "adv-command",
  "input": {
    "cmd": "DevicePropertiesService.GetLEDState",
    "val": {  },
    "reply": "Resp"
  }
}



die json Strings kannst Du so wie sie sind in die x_raw_payload einwerfen.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: raiderxxl am 09 April 2021, 08:11:15
Danke Otto123,

Funktioniert für mich, da kann ich ein AT basteln ;-)

Grüßle
Pascal
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 09 April 2021, 08:57:05
Moin Pascal,

das ist prima. Bist Du so nett, wenn Du das gelöst hast - postest Du hier bitte die Kommandos? Ich kann das dann nach und nach in die sonos2mqttUtils übernehmen.

Gruß Otto 
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 09 April 2021, 09:13:01
Schaut mal hier: https://github.com/svrooij/sonos2mqtt/issues/139

Da sind einige Commandos mit entsprechendem Aufruf bei, die vermutlich alle analog genutzt werden können.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: sebbo2002 am 14 April 2021, 16:21:57
Zitat von: kjmEjfu am 09 April 2021, 09:13:01
Schaut mal hier: https://github.com/svrooij/sonos2mqtt/issues/139

Da sind einige Commandos mit entsprechendem Aufruf bei, die vermutlich alle analog genutzt werden können.

Hallo in die Runde,

ich versuche aktuell langsam vom SONOS Modul zu sonos2mqtt zu migrieren. Daher der Pull Request mit allen Kommandos, die für meine Migration noch gefehlt haben. Das ganze ist aktuell nur im Beta Channel released (npm i -g sonos2mqtt@beta), scheint bei mir aber so weit zu funktionieren.

Wie das ganze in FHEM umgesetzt ist habe ich ehrlich gesagt noch nicht so 100%ig verstanden, kann mir da jemand helfen? Vieleicht liegt es aber auch daran, dass mein Perl eher schlecht als recht ist...  :-[
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 14 April 2021, 17:06:56
Zitat von: sebbo2002 am 14 April 2021, 16:21:57
Wie das ganze in FHEM umgesetzt ist habe ich ehrlich gesagt noch nicht so 100%ig verstanden,
Meinst Du generell oder "Deine" Kommandos?
Nach aktuellem Entwicklungsstand kommt die Ausführung in die sonos2mqttUtils und der Befehl in die setList des Gerätes (bzw. ins AttrTemplate)

Ich setze mich mal ran und versuche das einzubauen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: sebbo2002 am 14 April 2021, 17:48:03
Zitat von: Otto123 am 14 April 2021, 17:06:56
Meinst Du generell oder "Deine" Kommandos?

Generell wie MQTT2 funktioniert habe ich so grob schon verstanden, nur wie die sonos2mqttUtils aufgebaut ist habe ich auf den ersten Blick nicht so ganz verstanden. Aber vielleicht müsste ich mir da einfach mehr Zeit nehmen.


Zitat von: Otto123 am 14 April 2021, 17:06:56
Ich setze mich mal ran und versuche das einzubauen.

Das ist sehr lieb, vielen Dank  :D
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 14 April 2021, 18:05:03
Hallo Zusammen,

mir ist gerade aufgefallen, dass ich keine Sprachausgabe mehr machen.

Ich nutze Text2Speech und es hat immer funktioniert. Nun leider nicht mehr.
MP3 wird erstellt, allerdings mit 0kb, also leer.
Das kann Sonos dann natürlich nicht abspielen.

Hier mal mein Device:

Internals:
   ALSADEVICE
   DEF        none
   FUUID      5fa17d3c-f33f-5738-be6e-5241d76be06d669d
   FVERSION   98_Text2Speech.pm:0.241380/2021-04-03
   MODE       SERVER
   NAME       SonosTTS
   NR         679
   STATE      Initialized
   TYPE       Text2Speech
   VOLUME     100
   READINGS:
     2020-11-03 16:54:58   host            192.168.0.202:8085
     2021-04-14 18:02:15   httpName        http://192.168.0.202:8085/fhem/cache/b4619599dd643ecddb0a4b02c1426eac.mp3
     2021-04-14 18:02:15   lastFilename    cache/b4619599dd643ecddb0a4b02c1426eac.mp3
     2021-04-14 18:02:15   playing         0
   helper:
     TTS_PlayerOptions
     Text2Speech:
Attributes:
   TTS_CacheFileDir cache
   TTS_Language Deutsch
   TTS_UseMP3Wrap 1
   userReadings httpName:lastFilename.* {'http://'.ReadingsVal($name,'host','set host:port first').'/fhem/'.ReadingsVal($name,'lastFilename','')}


Jemand eine zündende Idee?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 14 April 2021, 18:10:22
Laufwerk voll?
{qx(df -h)}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 14 April 2021, 18:13:32
Nein, ist eine VM mit noch massig Platz.

Habe gerade mal Verbose 5 geschaut und gesehen, es hängt wohl bei Google (Log von unten nach oben):

2021.04.14 18:09:24 4: SonosTTS: Es wurden alle Teile ausgegeben und der Befehl ist abgearbeitet.
2021.04.14 18:09:24 4: SonosTTS: Bearbeite per MP3Wrap jetzt den Text: Hallo dies ist ein schöner Test
2021.04.14 18:09:24 4: SonosTTS: Schreibe mp3 in die Datei cache/dcfad3fa42999d5ab9c7ae5a1c2743ca.mp3 mit  Bytes
2021.04.14 18:09:24 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/98_Text2Speech.pm line 901.
2021.04.14 18:09:24 3: SonosTTS: http://translate.google.com/translate_tts?tl=de&client=tw-ob&ie=UTF-8&q=Hallo%20dies%20ist%20ein%20sch%C3%B6ner%20Test: Can't connect(1) to http://translate.google.com:80: IO::Socket::INET: connect: Connection refused
2021.04.14 18:09:24 3: SonosTTS: Fehler beim abrufen der Daten von Google Translator
2021.04.14 18:09:24 4: SonosTTS: Hole URL: http://translate.google.com/translate_tts?tl=de&client=tw-ob&ie=UTF-8&q=Hallo%20dies%20ist%20ein%20sch%C3%B6ner%20Test
2021.04.14 18:09:24 4: SonosTTS: Verwende Google Resource zur TTS-Generierung
2021.04.14 18:09:24 4: SonosTTS: Textbaustein ist keine direkte MP3 Datei, ermittle MD5 CacheNamen: dcfad3fa42999d5ab9c7ae5a1c2743ca.mp3
2021.04.14 18:09:24 4: SonosTTS: Verwende TTS Spracheinstellung: Deutsch
2021.04.14 18:09:24 4: SonosTTS: 0 => Hallo dies ist ein schöner Test
2021.04.14 18:09:24 4: SonosTTS: Auflistung der Textbausteine nach Aufbereitung:
2021.04.14 18:09:24 4: SonosTTS: MaxChar = 100, Delimiter = (?<=[\.!?])\s*, ForceSplit = 0, AddDelimiter =


Wobei, wenn ich an meinem Rechner die URL (http://translate.google.com/translate_tts?tl=de&client=tw-ob&ie=UTF-8&q=Hallo%20dies%20ist%20ein%20sch%C3%B6ner%20Test) direkt aufrufe, kommt die Ausgabe?

Ping nach Google auf der fhem VM geht ohne Probleme.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 14 April 2021, 18:37:45
Gelöst!

Beim piHole Update ist wohl translate.google.com auf die Blacklist gerutscht  :-[
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 April 2021, 14:14:17
Zitat von: Otto123 am 14 April 2021, 17:06:56
Ich setze mich mal ran und versuche das einzubauen.
Ich habe eine neue Version der 99_sonos2mqttUtils.pm eingecheckt.
Neu ist eine sub, die einen Json String zurückliefert, der den advanced commands entspricht. Damit kann man von hier (https://svrooij.io/node-sonos-ts/sonos-device/services/services.html) den ServiceNamen heraus nehmen und die erforderlichen Values übergeben. Ich habe das für folgende Kommandos getestet:
Den Erforderlich Wert 0/1 oder On/Off kann man natürlich setzen. Wie man sie ist die Reihenfolge relativ egal nur die Parameterpärchen müssen zusammenstehen.
{sonos2mqtt_command ('SetEQ','DesiredValue',1,'EQType','NightMode')}
{sonos2mqtt_command ('SetEQ','EQType','DialogLevel','DesiredValue',0)}
{sonos2mqtt_command ('SetButtonLockState','DesiredButtonLockState','Off')}
{sonos2mqtt_command ('SetLEDState','DesiredLEDState','On')}
{sonos2mqtt_command ('SetBass','DesiredBass',8)}
{sonos2mqtt_command ('SetTreble','DesiredTreble',-3)}
{sonos2mqtt_command ('AVTransportService.RemoveAllTracksFromQueue')}

Will man die Sub für den Set Befehl x_raw_payload verwenden - muss man wie üblich bei set magic zusätzlich klammern -> {(sonos2mqtt_command ())}

Jetzt muss man das noch in das Template verankern und ich muss dazu noch  hier  (https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV)lesen  um keine Schimpfe zu bekommen.

Mitarbeit und Vorschläge sind willkommen! Wer testen will:
{ Svn_GetFile("contrib/AttrTemplate/99_sonos2mqttUtils.pm", "FHEM/99_sonos2mqttUtils.pm", sub(){ CommandReload(undef, "99_sonos2mqttUtils") }) }

Ich würde das gerne etwas mehrstufig machen um die setList nicht ewig lang zu machen. Irgendwie so in der Art
set player adv ledstate on
set player adv bass 8
set player adv nightmode on


Wer wissen will wie das Codestückchen aussieht und dazu Vorschläge hat :)
sub sonos2mqtt_command
{
use JSON;
my (%h_value,%h_input) = ();
my $acmd = shift // return 'error';
   if ($acmd !~ /\w+\.\w+/) {
     if ($acmd eq 'SetLEDState' or $acmd eq 'SetButtonLockState') {
         $acmd = 'DevicePropertiesService.'.$acmd}
      else {
         $acmd = 'RenderingControlService.'.$acmd}
   }
   if ($acmd =~ /RenderingControlService/) {%h_value = ('InstanceID' => 0,'Channel' => 'Master')}
   $h_input{'cmd'} = $acmd;
   if (@_) {
      %h_value = @_;
  $h_input{'val'} = {%h_value}
   }
   return encode_json {'command' => 'adv-command','input' => {%h_input}};
}

In Summe geht damit jetzt mehr, als Stephan in die neue Beta als Shortcuts eingebaut hat. z.B. Abends beim TV Nachtmodus und Sprachverbesserung an
set alias=Wohnzimmer x_raw_payload {(sonos2mqtt_command ('SetEQ','EQType','DialogLevel','DesiredValue',1))}
set alias=Wohnzimmer x_raw_payload {(sonos2mqtt_command ('SetEQ','EQType','NightMode','DesiredValue',1))}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 24 April 2021, 09:56:41
Moin Zusammen,
ich bin mittlerweile totoal überzeugt von sonos2mqtt - tolle Arbeit!
Ich bräuchte aber noch etwas Hilfe beim Einrichten der Sprachausgabe. Im Wiki steht:
ZitatMan hat zwei Möglichkeiten, dies umzusetzen:

1. Text2Speech FHEM intern
2. Mit dem sonos text to speech Server https://svrooij.io/sonos2mqtt/

Da ich auch ein paar Echos am Start habe würde ich gerne den node-sonos-tts-polly Server von Stefan
einsetzen. Wie der zu installieren ist steht ja in der Readme auf github. Aber mir fehlt noch die Verbindung
zu sonos2mqtt  :o Kann mir da bitte mal einer auf die Sprünge helfen?! Danke!  :)

VG Sebastian


Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Papaloewe am 24 April 2021, 10:22:27
Schau mal hier:
https://forum.fhem.de/index.php/topic,111711.msg1079176.html#msg1079176 (https://forum.fhem.de/index.php/topic,111711.msg1079176.html#msg1079176)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 24 April 2021, 11:07:42
@PapaLoewe Das sind wir doch schon einen Schritt weiter ;)
Zitat von: binford6000 am 24 April 2021, 09:56:41
Aber mir fehlt noch die Verbindung
zu sonos2mqtt  :o Kann mir da bitte mal einer auf die Sprünge helfen?! Danke!  :)
Hast Du ein anderes Wiki?
ZitatSpeak Befehl
Dieser Befehl ist ähnlich wie der in der FHEM-Sonos Umgebung:

set Player speak <volume> text
Verwendet man diesen Syntax (mit Sprache und Stimme am Anfang), wird automatisch der speak Befehl an die sonos-tts abgesetzt. Die sonos-tts muss man separat installieren/integrieren!

set EG.KU.Sonos speak de-DE Vicki 25 Test
Intern wird einfach der entsprechende Json String erstellt und an sonos2mqtt gesendet.

Oder meinst Du die Installation / Verbindung des tts Servers an sich? Stichwort Aufruf parameter --ttsendpoint      Default endpoint for text-to-speech
Siehe auch https://svrooij.io/sonos2mqtt/getting-started.html
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 24 April 2021, 11:27:19
Zitat von: Otto123 am 24 April 2021, 11:07:42
Hast Du ein anderes Wiki?

Haha...  :-X

ZitatIntern wird einfach der entsprechende Json String erstellt und an sonos2mqtt gesendet.

Ich kann aber nirgends die Verbindung zu node-sonos-tts-polly sehen/lesen.

Als Docker Container gestartet bekomme ich:
sudo docker run --env-file polly.env -p 5601:5601 svrooij/sonos-tts-polly
Sonos TTS server started at http://0.0.0.0:5601
Press [CTRL]+C to close


Das kann m.M.n. nicht funktionieren, da mein FHEM auf einem anderen Host läuft - wie soll sonos2mqtt den Container denn finden?

Außerdem würde ich lieber die nodejs Variante bevorzugen. Installiert hab ich es auf meine FHEM Host, beim Start kommt aber:
sudo sonos-tts-polly --port 5601 --amazonKey KEY --amazonSecret SECRET
/usr/bin/sonos-tts-polly: 1: use strict: not found
/usr/bin/sonos-tts-polly: 2: Syntax error: "(" unexpected


Die Doku von Stefan zu node-sonos-tts-polly sagt halt auch nicht mehr.
Also mir fehlt immer noch die Verbindung von sonos2mqtt zu node-sonos-tts-polly...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 24 April 2021, 11:35:05
Du hast mein Edit nicht nachgelesen --ttsendpoint damit sagst Du sonos2mqtt wo Dein tts Server zu finden ist.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: sebbo2002 am 25 April 2021, 09:13:21
Zitat von: Otto123 am 19 April 2021, 14:14:17
Ich habe eine neue Version der 99_sonos2mqttUtils.pm eingecheckt.
Neu ist eine sub, die einen Json String zurückliefert, der den advanced commands entspricht. Damit kann man von hier (https://svrooij.io/node-sonos-ts/sonos-device/services/services.html) den ServiceNamen heraus nehmen und die erforderlichen Values übergeben. Ich habe das für folgende Kommandos getestet:
Den Erforderlich Wert 0/1 oder On/Off kann man natürlich setzen. Wie man sie ist die Reihenfolge relativ egal nur die Parameterpärchen müssen zusammenstehen.
{sonos2mqtt_command ('SetEQ','DesiredValue',1,'EQType','NightMode')}
{sonos2mqtt_command ('SetEQ','EQType','DialogLevel','DesiredValue',0)}
{sonos2mqtt_command ('SetButtonLockState','DesiredButtonLockState','Off')}
{sonos2mqtt_command ('SetLEDState','DesiredLEDState','On')}
{sonos2mqtt_command ('SetBass','DesiredBass',8)}
{sonos2mqtt_command ('SetTreble','DesiredTreble',-3)}
{sonos2mqtt_command ('AVTransportService.RemoveAllTracksFromQueue')}

Will man die Sub für den Set Befehl x_raw_payload verwenden - muss man wie üblich bei set magic zusätzlich klammern -> {(sonos2mqtt_command ())}

Habe gestern alle Sonos bei mir umgestellt, funktioniert soweit sehr gut bei mir. Vielen Dank für die tolle Arbeit  :D
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Wardancer am 19 Mai 2021, 12:23:25
Hallo zusammen,

ich starte gerade und würde gerne vom Sonos-Modul auf die MQTT-Variante umsteigen. Ich würde auch sagen, das grundsätzlich schon recht viel funktioniert. Was mir aber im Moment noch nicht gelingt ist das Abspielen von Radio-Stationen. Ich hab dazu zunächst wie im Wiki beschrieben die Favoriten, Radiosstationen und Playlisten eingelesen.
Es werden dazu dann auch die entsprechenden Readings im Bridge-Device angelegt. Als Beispiel hier mal die Ausgabe des Radio-Reading:

{"Result":[{"Title":"1Live","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/5","ParentId":"R:0/0","TrackUri":"x-rincon-mp3radio://https://dg-wdr-https-dus-dtag-cdn.sslcast.addradio.de/wdr/1live/live/mp3/128/stream.mp3","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"New England Classical Christmas","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/62","ParentId":"R:0/0","TrackUri":"x-sonosapi-stream:s257672?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"Radio Bonn Rhein Sieg","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/8","ParentId":"R:0/0","TrackUri":"x-rincon-mp3radio://http://stream.lokalradio.nrw/rbrs","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"SWR3","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/7","ParentId":"R:0/0","TrackUri":"x-rincon-mp3radio://http://mp3-live.swr3.de/swr3_m.m3u","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"WDR2","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/6","ParentId":"R:0/0","TrackUri":"x-rincon-mp3radio://https://wdr2-lh.akamaihd.net/i/wdr2_rheinland@349349/master.m3u8","ProtocolInfo":"x-rincon-mp3radio:*:*:*"}],"NumberReturned":5,"TotalMatches":5,"UpdateID":1}

Ich würde jetzt gerne per
set devspec-Speaker play Radio WDR2 auf die entsprechende Station wechseln wollen. Problem ist, dass der Speaker nicht wechselt.
Ein set devspec-Speaker play spielt dann einfach wieder die bereits angewählte Station bzw. Playlist.
Gibt es da noch was, was ich nachschauen bzw. einstellen müsste?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Mai 2021, 13:52:45
Hi Wardancer,

das muss ich mir anschauen. Was mir auffällt:
{"Title":"WDR2","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/6","ParentId":"R:0/0","TrackUri":"x-rincon-mp3radio://https://wdr2-lh.akamaihd.net/i/wdr2_rheinland@349349/master.m3u8","ProtocolInfo":"x-rincon-mp3radio:*:*:*"}
Deine Trackuri ist völlig anders wie ich die kenne  :-[
{"Title":"WDR 2 Rheinland","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/48","ParentId":"R:0/0","TrackUri":"x-sonosapi-stream:s213886?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"}
Mir ist es bei bestimmten TrackUris nicht gelungen die ordentlich zu übergeben :(
ich habe den WDR2 über Tunein -> Suchlauf -> Info&Optionen und dann "Meinen Radiosendern hinzufügen" erstellt
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Wardancer am 19 Mai 2021, 14:19:36
Hmm,

weiss auch nicht mehr, wie ich an die URLs gekommen war. Aber ich denke ich hab mit die über die WDR-Seite gezogen und über die Desktop-App dann ins Sonos eigespielt.
Aber wie ich aus deiner Reaktion sehe ist der ungeparste JSON-String nicht das Problem :) Dachte nämlich, dass da an der Ecke noch was nicht stimm. Ich probier das mal mit dem TuneIn WDR2 aus. und melde mich nochmal
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Mai 2021, 14:23:03
Nein das Problem ist final der Befehl setAVTuri - da muss die uri ein bestimmtes "Format" haben. Manche nimmt er dort und manche nicht - habe nicht ganz kapiert wie.
Deswegen funktionieren die Sonos Favoriten  nur sehr eingeschränkt.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Wardancer am 19 Mai 2021, 20:28:18
Hi,

Kurze Rückmeldung von mir: Es klappt jetzt. Habt mir die Radiostationen nochmal neu als Favoriten angelegt und jetzt läufts wie am Schnürchen!,
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: LordVoodoo am 21 Mai 2021, 19:14:55
Hallo,

ich mache gerade meine ersten Gehversuche mit Sonos/MQTT und bekomme deutlich zuverlässiger Play/Pause hin als über das FHEM-SONOS-Modul.
Jedoch gelingt es mir noch nicht einen Favoriten anzuwählen:

set Sonos_MQTT setAVTUri Chillout-Lounge

Anschließend erscheint im MQTT-Mitschnitt:


{ "command":"setavtransporturi",
  "error":
    {"Action":"SetAVTransportURI",
     "FaultCode":"s:Client",
     "Fault":"UPnPError",
     "UpnpErrorCode":714,
     "UpnpErrorDescription":
     "Illegal MIME-Type",
     "name":"SonosError"}}


Ich habe bewusst einen Favoriteneintrag ohne Leer-/Sonderzeichen verwendet.

Auch über die Kommandozeile, set ... play Favorite Chillout-Lounge, kommt der gleiche Fehler.

Sieht jemand meinen Denkfehler?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 21 Mai 2021, 19:26:03
Hi,

beim Befehl setAVTuri muss wirklich eine uri dahinter, also z.B. sowas:
"x-sonosapi-stream:s213886?sid=254&flags=8224&sn=0"
Was Du willst ist einen Favoriten abspielen den Du schon in der Liste hast? Versuch:
set Sonos_MQTT play Favorite Chillout-Lounge

Kann funktionieren, wenn die uri die dort hinterlegt ist, über den Befehl Befehl setAVTuri "spielbar" ist. Zeig im Zweifelsfall mal die Ausgabe von
{ReadingsVal('SonosBridge','Favorites','')}

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Phiolin am 22 Mai 2021, 08:49:25
Was mir hauptsächlich aus dem "alten" Sonos Modul beim MQTT noch fehlt, ist die Möglichkeit vor einer Sprachausgabe noch einen Gong o.ä. abzuspielen. Im Sonos Modul konnte man ja immer praktisch beliebige zusätzliche MP3 files im speak einbinden. Da ich die Sonos Boxen hauptsächlich dafür benutze, fällt das schon auf. Es ist einfach etwas merkwürdig, wenn die Box einfach so zu sprechen anfängt ohne sich vorher durch Gedudel bemerkbar zu machen. :D
Ich vermute aber mal, das ist nicht so einfach zu implementieren?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 22 Mai 2021, 09:57:30
Je nach dem wie man die Sprachausgabe macht. Mit der text2speech Variante geht das ja einfach, die kann das von Hause aus.
https://fhem.de/commandref_DE.html#Text2Speech

Ich bin nicht sicher ob ich das schon probiert habe, wüsste aber nicht warum das nicht gehen sollte.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 22 Mai 2021, 13:04:06
Hallo Otto,

du begeisterst mich mit deinen Ansätzen :-).

Auch ich beschäftige mich gerade mit dem Umstieg vom bisherigen Sonos-Modul auf die MQTT-Variante. Für meine Implementierung benötige ich allerdings folgende Möglichkeiten:


Kann ich das mit der vorhandenen Implementierung bereits realisieren? Wenn ja, gibst du mir Nachhilfe?
Wenn nein, was kann ich tun, damit ich das nachbilden kann?

Folgendes klappt nicht:

get SonosBridge Reply Favorites;sleep SonosBridge:Reply.*;setreading SonosBridge Favorites [SonosBridge:Reply]

"Reply" kennt die SonosBridge nicht. Und wenn ich nur ein get SonosBridge Favorites mache, bekomme ich die folgende Fehlermeldung:


Timeout reading answer for sonos/RINCON_5CAAFD164E9301400/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: LordVoodoo am 22 Mai 2021, 15:31:11
Ich habe versucht, einen bestimmten Favoriten zu laden:


Meine nächste Vermutung war, dass die Ergebnisliste des get-favorites-Befehl einen Treffer weg hat, jedoch war diese zumindest mal gültig laut Online-Validator:


{
"Result": [{
"AlbumArtUri": "https://d1uner0r1fcap8.cloudfront.net/image?w=1242&image=https:%2F%2Fcdn-radiotime-logos.tunein.com%2Fs20291g.png&partnerId=tunein",
"Title": "1. SWR1 Baden-Württemberg",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/45",
"ParentId": "FV:2",
"TrackUri": "x-sonosapi-stream:tunein:107920?sid=303&flags=8224&sn=7",
"ProtocolInfo": "x-sonosapi-stream:*:*:*"
}, {
"AlbumArtUri": "http://cdn-profiles.tunein.com/s20291/images/logoq.png?t=1",
"Title": "1. SWR1 Baden-Württemberg 94.7 (Gemischtes/Vielfalt)",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/49",
"ParentId": "FV:2",
"TrackUri": "x-sonosapi-stream:s20291?sid=254&flags=8224&sn=0",
"ProtocolInfo": "x-sonosapi-stream:*:*:*"
}, {
"AlbumArtUri": "https://m.media-amazon.com/images/I/61L+5RzpEiL.jpg",
"Title": "100 große Filmthemen Nehmen 2",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/40",
"ParentId": "FV:2"
}, {
"AlbumArtUri": "http://cdn-profiles.tunein.com/s24896/images/logoq.png",
"Title": "2. SWR3",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/30",
"ParentId": "FV:2",
"TrackUri": "x-sonosapi-stream:s76516?sid=254&flags=8224&sn=0",
"ProtocolInfo": "x-sonosapi-stream:*:*:*"
}, {
"AlbumArtUri": "https://d1uner0r1fcap8.cloudfront.net/image?w=60&image=https:%2F%2Fcdn-profiles.tunein.com%2Fs272862%2Fimages%2Flogog.jpg%3Ft%3D160623&partnerId=tunein",
"Title": "3. REGENBOGEN 2",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/47",
"ParentId": "FV:2",
"TrackUri": "x-sonosapi-stream:tunein:73172?sid=303&flags=8224&sn=7",
"ProtocolInfo": "x-sonosapi-stream:*:*:*"
}, {
"AlbumArtUri": "http://cdn-profiles.tunein.com/s281538/images/logoq.png",
"Title": "98.3 KSanta",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/21",
"ParentId": "FV:2",
"TrackUri": "x-sonosapi-stream:s281538?sid=254&flags=8224&sn=0",
"ProtocolInfo": "x-sonosapi-stream:*:*:*"
}, {
"AlbumArtUri": "https://m.media-amazon.com/images/I/51KvoQpKnmL.jpg",
"Title": "Acoustic Classics",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/35",
"ParentId": "FV:2",
"TrackUri": "x-rincon-cpcontainer:1004206ccatalog/albums/B019NBQP9Q/#album_desc?sid=201&flags=8300&sn=2",
"ProtocolInfo": "x-rincon-cpcontainer:*:*:*"
}, {
"AlbumArtUri": "http://cdn-radiotime-logos.tunein.com/s202574q.png",
"Title": "Amazing Chillout",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/11",
"ParentId": "FV:2",
"TrackUri": "x-sonosapi-stream:s202574?sid=254&flags=8224&sn=0",
"ProtocolInfo": "x-sonosapi-stream:*:*:*"
}, {
"Title": "bigFM Deutschland",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/23",
"ParentId": "FV:2",
"TrackUri": "x-sonosapi-stream:s84203?sid=254&flags=8224&sn=0",
"ProtocolInfo": "x-rincon-mp3radio:*:*:*"
}, {
"AlbumArtUri": "https://images-na.ssl-images-amazon.com/images/I/513DM6V3ILL._SCLZZZZZZZ__.jpg",
"Title": "Chillout-Lounge",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/27",
"ParentId": "FV:2",
"TrackUri": "x-rincon-cpcontainer:1006206ccatalog/playlists/B077XYJ377/#prime_playlist?sid=201&flags=8300&sn=2",
"ProtocolInfo": "x-rincon-cpcontainer:*:*:*"
}, {
"AlbumArtUri": "https://m.media-amazon.com/images/I/516osUBhBbL.jpg",
"Title": "Come on and Shine",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/37",
"ParentId": "FV:2",
"TrackUri": "x-rincon-cpcontainer:1004206ccatalog/albums/B00OW0YVMM/#album_desc?sid=201&flags=8300&sn=2",
"ProtocolInfo": "x-rincon-cpcontainer:*:*:*"
}, {
"AlbumArtUri": "http://cdn-radiotime-logos.tunein.com/s8254q.png",
"Title": "Deluxe Radio",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/4",
"ParentId": "FV:2",
"TrackUri": "x-sonosapi-stream:s8254?sid=254&flags=8224&sn=0",
"ProtocolInfo": "x-sonosapi-stream:*:*:*"
}, {
"AlbumArtUri": "https://images-na.ssl-images-amazon.com/images/I/61mWEJ4uNuL._SCLZZZZZZZ__.jpg",
"Title": "Entspannte Rockklassiker &amp; Oldies",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/28",
"ParentId": "FV:2",
"TrackUri": "x-rincon-cpcontainer:1006206ccatalog/playlists/B0763LGWK6/#prime_playlist?sid=201&flags=8300&sn=2",
"ProtocolInfo": "x-rincon-cpcontainer:*:*:*"
}, {
"AlbumArtUri": "https://m.media-amazon.com/images/I/81qWkXJonhL.jpg",
"Title": "Friends",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/36",
"ParentId": "FV:2",
"TrackUri": "x-rincon-cpcontainer:1004206ccatalog/albums/B00KWYHRXW/#album_desc?sid=201&flags=8300&sn=2",
"ProtocolInfo": "x-rincon-cpcontainer:*:*:*"
}, {
"AlbumArtUri": "https://m.media-amazon.com/images/I/61kR2AM4xfL.jpg",
"Title": "Home Suite Home",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/38",
"ParentId": "FV:2",
"TrackUri": "x-rincon-cpcontainer:1004206ccatalog/albums/B014LE0GSG/#album_desc?sid=201&flags=8300&sn=2",
"ProtocolInfo": "x-rincon-cpcontainer:*:*:*"
}, {
"AlbumArtUri": "http://cdn-radiotime-logos.tunein.com/s105880q.png",
"Title": "Hotmixradio Lounge",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/16",
"ParentId": "FV:2",
"TrackUri": "x-sonosapi-stream:s105880?sid=254&flags=8224&sn=0",
"ProtocolInfo": "x-sonosapi-stream:*:*:*"
}, {
"Title": "KINDER",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/50",
"ParentId": "FV:2",
"TrackUri": "x-rincon-playlist:RINCON_5CAAFD44113C01400#S://192.168.178.90/tui_wichtig/55_HOERBUECHER/KINDER",
"ProtocolInfo": "x-rincon-playlist:*:*:*"
}, {
"AlbumArtUri": "http://cdn-radiotime-logos.tunein.com/s247145q.png",
"Title": "Kinderlieder plus",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/24",
"ParentId": "FV:2",
"TrackUri": "x-sonosapi-stream:s247145?sid=254&flags=8224&sn=0",
"ProtocolInfo": "x-sonosapi-stream:*:*:*"
}, {
"AlbumArtUri": "http://cdn-radiotime-logos.tunein.com/s131665q.png",
"Title": "Lounge FM Chill Out",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/8",
"ParentId": "FV:2",
"TrackUri": "x-sonosapi-stream:s231678?sid=254&flags=8224&sn=0",
"ProtocolInfo": "x-sonosapi-stream:*:*:*"
}, {
"AlbumArtUri": "http://cdn-radiotime-logos.tunein.com/s17364q.png",
"Title": "Lounge-Radio.com",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/19",
"ParentId": "FV:2",
"TrackUri": "x-sonosapi-stream:s17364?sid=254&flags=8224&sn=0",
"ProtocolInfo": "x-sonosapi-stream:*:*:*"
}, {
"AlbumArtUri": "http://cdn-radiotime-logos.tunein.com/s228528q.png",
"Title": "Mediterranea Chillout",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/12",
"ParentId": "FV:2",
"TrackUri": "x-sonosapi-stream:s228528?sid=254&flags=8224&sn=0",
"ProtocolInfo": "x-sonosapi-stream:*:*:*"
}, {
"AlbumArtUri": "http://cdn-radiotime-logos.tunein.com/s241999q.png",
"Title": "Psy Chill Zone",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/15",
"ParentId": "FV:2",
"TrackUri": "x-sonosapi-stream:s241999?sid=254&flags=8224&sn=0",
"ProtocolInfo": "x-sonosapi-stream:*:*:*"
}, {
"AlbumArtUri": "https://d1uner0r1fcap8.cloudfront.net/image?w=60&image=https:%2F%2Fcdn-profiles.tunein.com%2Fs255339%2Fimages%2Flogog.jpg%3Ft%3D160384&partnerId=tunein",
"Title": "Radio Regenbogen - 90er",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/48",
"ParentId": "FV:2",
"TrackUri": "x-sonosapi-stream:tunein:63526?sid=303&flags=8224&sn=7",
"ProtocolInfo": "x-sonosapi-stream:*:*:*"
}, {
"AlbumArtUri": "http://cdn-profiles.tunein.com/s47800/images/logoq.jpg",
"Title": "RSA Radio 91.35 (Classic Rock)",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/33",
"ParentId": "FV:2",
"TrackUri": "x-sonosapi-stream:s57016?sid=254&sn=0",
"ProtocolInfo": "x-sonosapi-stream:*:*:*"
}, {
"AlbumArtUri": "https://m.media-amazon.com/images/I/61y3g9dLfJL.jpg",
"Title": "The Best Of",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/39",
"ParentId": "FV:2",
"TrackUri": "x-rincon-cpcontainer:1004206ccatalog/albums/B00255JGTE/#album_desc?sid=201&flags=8300&sn=2",
"ProtocolInfo": "x-rincon-cpcontainer:*:*:*"
}, {
"AlbumArtUri": "http://cdn-radiotime-logos.tunein.com/s89783q.png",
"Title": "X 181.FM Christmas Smooth Jazz",
"UpnpClass": "object.itemobject.item.sonos-favorite",
"ItemId": "FV:2/20",
"ParentId": "FV:2",
"TrackUri": "x-sonosapi-stream:s89783?sid=254&flags=8224&sn=0",
"ProtocolInfo": "x-sonosapi-stream:*:*:*"
}],
"NumberReturned": 26,
"TotalMatches": 26,
"UpdateID": 1
}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 22 Mai 2021, 16:02:19
Zitat von: Ralli am 22 Mai 2021, 13:04:06
Folgendes klappt nicht:

get SonosBridge Reply Favorites;sleep SonosBridge:Reply.*;setreading SonosBridge Favorites [SonosBridge:Reply]

"Reply" kennt die SonosBridge nicht. Und wenn ich nur ein get SonosBridge Favorites mache, bekomme ich die folgende Fehlermeldung:


Timeout reading answer for sonos/RINCON_5CAAFD164E9301400/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}}


Habe den Fehler gefunden: im Template ist noch in einer Zeile für die Bridge der Name hart codiert. Wenn man einen anderen Namen wählt (wie ich), gibt's ein Problem:


attr SonosBridge userReadings favlist:Favorites.* {sonos2mqtt_ur($name,'favlist')},\
grouplist:Favorites.* {sonos2mqtt_ur($name,'grouplist')}


Das muss noch mit "DEVICE" ersetzt werden. Ich habe das jetzt von Hand noch mal durchgeführt und danach das Setup-Kommando noch einmal aufgerufen, jetzt kann ich die Favoriten-Liste abrufen und danach auch Favoriten abspielen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 22 Mai 2021, 16:38:51
Zitat von: LordVoodoo am 22 Mai 2021, 15:31:11
Ich habe versucht, einen bestimmten Favoriten zu laden:


  • Bin in das Sonos-Bridge Device und Befehl "get Favorites"
  • Anschließend steht ein sehr großes JSON im Reading Favorites
  • Anschließend in das Kommandofeld set Sonos_MQTT play Favorite Chillout-Zone
  • Im MQTT Explorer steht anschließend Mailformed JSON mit Verweis auf Zeile 182 im sonos2mqtt-Modul, im Bridge Device steht im Reading favlist ebenfalls ein Fehler, Verweis auf Zeile 359

Aber ich finde in deinem json nur "Chillout-Lounge"  ??? Chillout-Zone ist nicht dabei...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 22 Mai 2021, 20:30:49
Zitat von: Ralli am 22 Mai 2021, 13:04:06


    set Sonosbox Alarm Enable All
    set Sonosbox Alarm Disable All
    set Sonosbox PlayURITemp ...
    Das Reading "AlarmRunning", wenn ein Alarm gerade läuft.
PlayUriTemp ist mMn notify, versuch das mal damit.
Zum Alarm muss ich mal nachdenken. Da hat ich schon was gemacht... Edit Ach nein das war Sleep Timer, alarm war ziemlich umfangreich
Das   AlarmRunning    Reading gab es mal, das haben wir eventuell mit der sonos/status/[^/]+/avtransport:.* {} ausgeknipst, weil da viel redundantes drin war. Wenn man hier Thread sucht Beitrag von: 87insane am 01 Juni 2020, 00:48:51 dann findet man das Reading :)

Hier gibt es an verschiedenen Stellen etwas zu Alarm:
https://svrooij.io/node-sonos-ts/sonos-device/services/services.html
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 23 Mai 2021, 10:36:33
Danke. Ich gestehe, ich bin in diesen Themen noch ganz am Anfang.

Laut https://svrooij.io/sonos2mqtt/global-commands.html sollte es ja das globale Kommando listalarms geben. Insofern habe ich im Bridge-Device einfach einmal die setList um ein "GetAlarmList:noArg $DEVICETOPIC/cmd/listalarms" erweitert und die readingList um "sonos/alarms:.* Alarms", in der Hoffnung, damit würde ich jetzt auslösen, dass eine Alarmliste im JSON in das Reading Alarms purzelt. Allerdings habe ich da wohl zu naiv gedacht. Eine Fehlermeldung bekomme ich allerdings auch nicht.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 23 Mai 2021, 13:05:19
Hallo Ralli,

das funktioniert bei mir auch nicht. Ich bilde mir ein, ich habe das schon mal mit adv-commands probiert, da kam eine XML Datei zurück.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 24 Mai 2021, 09:39:30
Da gibt's einen Fehler in der Doku.

Das cmd darf nicht listalarms sondern lediglich listalarm heißen.

Nun habe ich den JSON schon einmal in dem Reading drin:


[{"Duration":"01:00:00","Enabled":false,"ID":11417,"IncludeLinkedZones":false,"PlayMode":"SHUFFLE","ProgramMetaData":{"Title":"SWR3 99.6 (Top 40/Pop)","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/31","ParentId":"R:0/0"},"ProgramURI":"x-sonosapi-stream:s24896?sid=254&flags=8224&sn=0","Recurrence":"ON_1","RoomUUID":"RINCON_B8E99999FD2001400","StartLocalTime":"05:30:00","Volume":15},
{"Duration":"01:00:00","Enabled":false,"ID":11419,"IncludeLinkedZones":false,"PlayMode":"SHUFFLE","ProgramMetaData":{"Title":"SWR3 99.6 (Top 40/Pop)","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/31","ParentId":"R:0/0"},"ProgramURI":"x-sonosapi-stream:s24896?sid=254&flags=8224&sn=0","Recurrence":"ON_2345","RoomUUID":"RINCON_B8E99999FD2001400","StartLocalTime":"05:30:00","Volume":15},
{"Duration":"00:30:00","Enabled":true,"ID":11423,"IncludeLinkedZones":false,"PlayMode":"SHUFFLE","ProgramMetaData":{"Title":"SWR3 99.6 (Top 40/Pop)","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/31","ParentId":"R:0/0"},"ProgramURI":"x-sonosapi-stream:s24896?sid=254&flags=8224&sn=0","Recurrence":"WEEKDAYS","RoomUUID":"RINCON_B8E99998C80201400","StartLocalTime":"06:00:00","Volume":50},
{"Duration":"00:30:00","Enabled":true,"ID":11425,"IncludeLinkedZones":false,"PlayMode":"SHUFFLE","ProgramMetaData":{"Title":"SWR3 99.6 (Top 40/Pop)","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/31","ParentId":"R:0/0"},"ProgramURI":"x-sonosapi-stream:s24896?sid=254&flags=8224&sn=0","Recurrence":"WEEKDAYS","RoomUUID":"RINCON_B8E99998516801400","StartLocalTime":"06:00:00","Volume":25}]


Ich empfehle daher, das Template für die Bridge zu erweitern:

setList um ein "GetAlarmList:noArg $DEVICETOPIC/cmd/listalarm"
readingList um ein "sonos/alarms:.* Alarms"

Mit dem cmd setalarm und einem übergebenen JSON sollte die (modifizierte) Alarmliste auch wieder übergeben werden können. Kannst du mir hier noch einmal unter die Arme greifen, wie müsste der Aufruf dafür mit dem modifizierten Reading dann aussehen?

Wäre das dann bspw.


set MQQT_SonosServer publish {
  "command": "setalarm",
  "input": {
{"Duration":"01:00:00","Enabled":false,"ID":11417,"IncludeLinkedZones":false,"PlayMode":"SHUFFLE","ProgramMetaData":{"Title":"SWR3 99.6 (Top 40/Pop)","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/31","ParentId":"R:0/0"},"ProgramURI":"x-sonosapi-stream:s24896?sid=254&flags=8224&sn=0","Recurrence":"ON_1","RoomUUID":"RINCON_B8E99999FD2001400","StartLocalTime":"05:30:00","Volume":15},
{"Duration":"01:00:00","Enabled":false,"ID":11419,"IncludeLinkedZones":false,"PlayMode":"SHUFFLE","ProgramMetaData":{"Title":"SWR3 99.6 (Top 40/Pop)","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/31","ParentId":"R:0/0"},"ProgramURI":"x-sonosapi-stream:s24896?sid=254&flags=8224&sn=0","Recurrence":"ON_2345","RoomUUID":"RINCON_B8E99999FD2001400","StartLocalTime":"05:30:00","Volume":15},
{"Duration":"00:30:00","Enabled":true,"ID":11423,"IncludeLinkedZones":false,"PlayMode":"SHUFFLE","ProgramMetaData":{"Title":"SWR3 99.6 (Top 40/Pop)","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/31","ParentId":"R:0/0"},"ProgramURI":"x-sonosapi-stream:s24896?sid=254&flags=8224&sn=0","Recurrence":"WEEKDAYS","RoomUUID":"RINCON_B8E99998C80201400","StartLocalTime":"06:00:00","Volume":50},
{"Duration":"00:30:00","Enabled":true,"ID":11425,"IncludeLinkedZones":false,"PlayMode":"SHUFFLE","ProgramMetaData":{"Title":"SWR3 99.6 (Top 40/Pop)","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/31","ParentId":"R:0/0"},"ProgramURI":"x-sonosapi-stream:s24896?sid=254&flags=8224&sn=0","Recurrence":"WEEKDAYS","RoomUUID":"RINCON_B8E99998516801400","StartLocalTime":"06:00:00","Volume":25}
       }
}


? Oder noch einmal eckige Klammern um die ganzen Alarmdefinitionen?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: hydrotec am 24 Mai 2021, 16:38:56
Hallo binford6000,

stehe gerade vor dem selben Problem.
Zitat von: binford6000 am 24 April 2021, 11:27:19
Außerdem würde ich lieber die nodejs Variante bevorzugen. ...
sudo sonos-tts-polly --port 5601 --amazonKey KEY --amazonSecret SECRET
/usr/bin/sonos-tts-polly: 1: use strict: not found
/usr/bin/sonos-tts-polly: 2: Syntax error: "(" unexpected


Die Doku von Stefan zu node-sonos-tts-polly sagt halt auch nicht mehr. ...
Bekomme den sonos-tts-polly mit npm einfach nicht ans laufen.  :-[

Hast du das schon gelöst bekommen?
Und wenn ja, wie?

Dankeschön

Gruß, Karsten

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 24 Mai 2021, 16:53:41
ZitatHast du das schon gelöst bekommen?

Hi Karsten,
nein ich hab das nicht gelöst bekommen. Der Tipp von Otto mit
--ttsendpoint
hat leider auch nichts gebracht. Und da das Thema keine Prio hat hab ich abgebrochen.
Vermute wie mit listalarm(s) ein Fehler in der Doku oder eine nicht komplette Doku...  :-\

VG Sebastian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: hydrotec am 24 Mai 2021, 16:56:27
Danke Sebastian für die schnelle Rückmeldung  :)

Dann muss ich eben noch etwas Forschung betreiben  ;)

Gruß, Karsten
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 24 Mai 2021, 17:05:27
Zitat von: hydrotec am 24 Mai 2021, 16:56:27
Danke Sebastian für die schnelle Rückmeldung  :)

Dann muss ich eben noch etwas Forschung betreiben  ;)

Gruß, Karsten

Dann viel Erfolg! Und melde dich wenns geklappt hat  ;)
VG Sebastian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 24 Mai 2021, 22:48:43
Hallo Ralli,

was funktioniert ist: ein publish in der Art
sonos/cmd/setalarm {"ID":73,"Enabled":true}
Leider auch nicht exakt dokumentiert. Man kann offenbar einen der Alarme als komplettes json übergeben und andere Dinge ändern, z.B. Zeit, Dauer, Lautstärke usw. Einen neuen Alarm anlegen geht offenbar damit nicht.
Die ID habe ich aus der dem Reading aus listalarm.
Der Befehl setzt aber keinen neuen Alarm sondern de/aktiviert einen existierenden.
Es wird die Methode AlarmClockService.PatchAlarm aufgerufen, siehe https://github.com/svrooij/sonos2mqtt/blob/master/src/sonos-to-mqtt.ts
Ich habe in dem Code aber noch nicht genau verstanden, ob da nochmal etwas umgemapped wird. Eigentlich sieht es so aus wie dieses Kommando
https://svrooij.io/node-sonos-ts/sonos-device/services/alarm-clock-service.html#updatealarm

Einen neuen Alarm erstellen mit einer anderen Methode -> https://svrooij.io/node-sonos-ts/sonos-device/services/alarm-clock-service.html#createalarm
Allerdings habe ich derzeit keine Idee, wohin man das publishen müsste.

Wegen dem "listalarm vs. listalarms" hab ich bei Stephan mal einen issue aufgemacht :)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 24 Mai 2021, 22:51:37
Hallo Karsten,

der Container zaubert ja auch nicht - da könnte man notfalls reinschauen die Parameter gemappt werden. Hast Du den Container probiert? Funktioniert der?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: hydrotec am 25 Mai 2021, 06:13:40
Guten Morgen Otto,

Dankeschön für deine Rückmeldung.

Bis jetzt habe ich nur die Installation von node-sonos-tts-polly nach dieser Vorlage (https://github.com/svrooij/node-sonos-tts-polly#run-your-own-server-in-node) versucht.
Beim Starten von sonos-tts-polly --port 5601 --amazonKey your_amazon_key --amazonSecret your_amazon_secret kommt die Rückmeldung,
welche Sebastian auch schon gepostet (https://forum.fhem.de/index.php/topic,111711.msg1158625.html#msg1158625) hat.
Dachte eben, das diese Erweiterung out of the box funktioniert.
Mehr hatte ich noch nicht versucht, ausser, das ich die Erweiterung mit in meinen LXC Container von node-sonos-ts installiert habe, selbes Ergebnis.

Vielleicht eine kleine Umschreibung zu meinem System.
Ich arbeite mit LXD unter Ubuntu 20.04 server.
Meine LXC Container sind mit macvlan erstellt.
Seither habe ich meine, ich sag mal Services in eigene Container verpackt, und das funktioniert soweit auch recht gut.
FHEM <-> Sonos2mqtt funktioniert (ausgenommen TTS) ohne Probleme.

Zitat von: Otto123
... Hast Du den Container probiert? Funktioniert der?
Docker wollte ich mir eigentlich nicht auch noch antun.  ;)

Wie gesagt, ich bin bei meiner Ursachenforschung noch ganz am Anfang.

Gruß, Karsten
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 25 Mai 2021, 07:00:31
Hallo Otto,

vielen Dank für Deine Unterstützung.
Zitat von: Otto123 am 24 Mai 2021, 22:48:43
was funktioniert ist: ein publish in der Art
sonos/cmd/setalarm {"ID":73,"Enabled":true}

Ich kann bestätigen, dass das funktioniert, um einen Alarm zu modifizieren ohne die anderen vorhandenen Alarme zu löschen oder zu verändern.

Es klappt auch folgendes, um mehrere Einstellungen eines Alarms zu verändern:


set MQTT2_SonosServer publish sonos/cmd/setalarm {"Duration":"01:00:00","Enabled":true,"ID":11417,"IncludeLinkedZones":false,"PlayMode":"SHUFFLE",\
"ProgramMetaData":{"Title":"SWR3 99.6 (Top 40/Pop)","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/31","ParentId":"R:0/0"},\
"ProgramURI":"x-sonosapi-stream:s24896?sid=254&flags=8224&sn=0",\
"Recurrence":"ON_1","StartLocalTime":"05:30:00","Volume":15}


Damit kann ich jetzt schon einmal weiter arbeiten.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 25 Mai 2021, 09:11:06
Moin Ralli,

du wolltest ja sowas:
set Sonosbox Alarm Enable All
set Sonosbox Alarm Disable All

Da müsste man jetzt eventuell "einfach" das json Array aus listalarm, "Enabled":true gegen das "Gegenteil" austauschen (also aus true false machen bzw. umgekehrt) und mit setalarm zurückschreiben.
Leider nimmt er bei setalarm offenbar nicht einfach das array [vier Alarme] sondern nur den einzelnen Alarm. Da müsste man jetzt zerlegen und alle einzelnen senden. :-[

Nur mal mein erster Ansatz für die FHEM Kommandozeile
{my $s=ReadingsVal('SonosBridge','alarms','');;$s=~s/"Enabled":true/"Enabled":false/g;;return $s}

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 25 Mai 2021, 09:17:46
Hallo Karsten,

Zitat von: hydrotec am 25 Mai 2021, 06:13:40
Docker wollte ich mir eigentlich nicht auch noch antun.  ;)
Ob das nicht das geringere Übel ist? Den nodejs Kram finde ich auch schwer beherrschbar.
Aus meiner Erinnerung mit sonos2mqtt:
sudo npm install -g sonos2mqtt
node /usr/lib/node_modules/sonos2mqtt --version

Man beachte: als user mit sudo "global" installiert, dann aber als normaler user zum Test mal gestartet! Mal analog mit sonsos-tts-polly probieren?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 25 Mai 2021, 09:20:21
Moin Otto,

Zitat von: Otto123 am 25 Mai 2021, 09:11:06
Nur mal mein erster Ansatz für die FHEM Kommandozeile
{my $s=ReadingsVal('SonosBridge','alarms','');;$s=~s/"Enabled":true/"Enabled":false/g;;return $s}

vielen Dank.

Ich denke, ich werde die utils etwas erweitern. Dein Ansatz ist gut, wirkt aber dann tatsächlich auf ALLE Alarme ALLER Boxen. Ich brauche aber eine Steuerung pro Box. Ich bin schon am Experimentieren :-).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 25 Mai 2021, 09:27:21
Dann schau Dir in der Utils die sub sonos2mqtt_searchList, dort behandle ich die kompletten json der Favoriten und Playlisten usw.
Wenn Du das pro Box machen willst musst Du ja den Alarm anhand der "RoomUUID" der Box zuordnen. Primär brauchst Du dann ja die ID - aber mit der will man ja in der UI nicht arbeiten. :D
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 25 Mai 2021, 10:10:22
Hallo Otto,

ich habe folgendes vor:

1) Ich baue eine Funktion in die Utils ein, um über die Bridge die Liste der Alarme zu holen und dort in das Reading Alarms zu speichern und dann im Anschluss die Alarme in den entsprechenden Speakern in den Readings "Alarms" und "AlarmIDs" einzutragen.
2) Dann erweitere ich in den Utils die entsprechende(n) Funktion(en), um für die Speaker zunächst einmal nur das Kommando "alarm <(ID|all)> <(enable|disable)>" abzubilden. Wahrscheinlich werde ich dafür als Grundlage bereits "alarm <(ID|all)> <update> <"KEY":"Value" ...>" implementieren.

Wenn ich damit so weit bin, gebe ich dir den Code zum Review und ggf. Einbau.

Dann versuche ich mich noch dem Thema "AlarmRunning" als Reading zu nähern, damit bin ich nämlich noch nicht weitergekommen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 25 Mai 2021, 10:40:41
Ich würde die Ergänzung der Bridge um die Alarme zu holen in die Utils einbauen:
sub sonos2mqtt_setup
....
   sonos2mqtt_mod_list($devspec,'readingList',AttrVal($devspec,"devicetopic",'sonos').'/alarms:.* alarms');
   sonos2mqtt_mod_list($devspec,'getList','listalarms:noArg alarms sonos/cmd/listalarm');
...

Zum Probieren in der FHEM Kommandozeile.
   {my $devspec='SonosBridge';;   sonos2mqtt_mod_list($devspec,'readingList',AttrVal($devspec,"devicetopic",'sonos').'/alarms:.* alarms');;   sonos2mqtt_mod_list($devspec,'getList','listalarms:noArg alarms sonos/cmd/listalarm')}
Damit muss ich das Template nicht ändern und habe den Code an einer Stelle.

Wegen dem AlarmRunning Reading musst Du mal am Anfang des Threads schauen, da war es schon mal da. Notfalls muss man mal noch so ein "Urdevice" bauen :)
Tipp: geh hier im Thread auf "drucken" und dann mit ctrl+f nach AlarmRunning suchen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: hydrotec am 25 Mai 2021, 10:44:43
@Otto

Grundinstallation ist wie bei sonos2mqtt, welches einwandfrei funktioniert.


Nur mal auf die Schnelle versucht.

Eingabe:

sudo npm i -g @svrooij/sonos-tts-polly

Ergebnis:

changed 83 packages, and audited 84 packages in 4s

3 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities


Eingabe:

node /usr/lib/node_modules/sonos-tts-polly --version

Ergebnis:

internal/modules/cjs/loader.js:888
  throw err;
  ^

Error: Cannot find module '/usr/lib/node_modules/sonos-tts-polly'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:885:15)
    at Function.Module._load (internal/modules/cjs/loader.js:730:27)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at internal/main/run_main_module.js:17:47 {
  code: 'MODULE_NOT_FOUND',
  requireStack: []
}


Es fehlen also noch einige Sachen für die Erweiterung.
Werde ich mal in Ruhe ausklamüsern.

Gruß, Karsten
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 25 Mai 2021, 11:12:38
Ich sage ja, das nodejs ist auch nicht die logischste Lösung ... :)

Offenbar ist der Eintrag im Repository anders (ohne @svrooij wird es nicht gefunden) damit @svrooij/ wird aber auch der Installpfad verändert.

Versuch mal  :-X :-*
node /usr/lib/node_modules/@svrooij/sonos-tts-polly --version
Und dann vielleicht auch den testweisen Aufruf mit den Parametern so machen?
Final dann den Start mit pm2 wie ich das mal für sonos2mqtt beschrieben habe?

BTW: Der Aufruf aus #1008, den Sebastian dort mal vorgelegt hatte, geht nach meiner Überlegung wahrscheinlich gar nicht, oder maximal in einer Umgebung wo irgendwie alles auf node ausgerichtet ist :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: LordVoodoo am 25 Mai 2021, 11:33:28
Hallo,

ich bin ein bisschen weitergekommen und habe nochmal folgendes gemacht:


Der Befehl für den Radiosender FFH Soundtrack funktioniert:
set Dev_Schlafzimmer_Soundbar playUri x-sonosapi-stream:tunein:20753?sid=303&flags=8224&sn=1

Für das gespeichertes TIDAL-Album "The Greatest Video Game Music" klappt es nicht:
set Dev_Schlafzimmer_Soundbar playUri x-rincon-cpcontainer:1004206calbum%2f97375617?sid=174&flags=8300&sn=2

{"command":"setavtransporturi","error":{"Action":"SetAVTransportURI","FaultCode":"s:Client","Fault":"UPnPError","UpnpErrorCode":714,"UpnpErrorDescription":"Illegal MIME-Type","name":"SonosError"}}


Meine Vermutung war, dass das Sonderzeichen "/" den Fehler auslöst. Ich habe drei Varianten ausprobiert (Ersetzung durch \/, Ersetzung durch %2f und Ersetzung durch //), jedoch konnte ich das ganze nicht auflösen.

Wenn ich jedoch das genannte Album über die SONOS-App starte funktioniert das korrekte Auslesen der Informationen. Das Starten aus FHEM heraus ist das Problem.

Nutzt jemand TIDAL oder auch andere Streaming-Anbieter abseits von TuneIn / Radio, zur Steuerung?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: eddy242 am 25 Mai 2021, 12:39:52
Hallo zusammen,

sonos2mqtt finde ich hervorragend und im Vergleich zum klassischen Sonos Modul gefühlt bei mir stabiler. Dieses Problem hatte ich allerdings auch:

Zitat von: Phiolin am 22 Mai 2021, 08:49:25
Was mir hauptsächlich aus dem "alten" Sonos Modul beim MQTT noch fehlt, ist die Möglichkeit vor einer Sprachausgabe noch einen Gong o.ä. abzuspielen. Im Sonos Modul konnte man ja immer praktisch beliebige zusätzliche MP3 files im speak einbinden. Da ich die Sonos Boxen hauptsächlich dafür benutze, fällt das schon auf. Es ist einfach etwas merkwürdig, wenn die Box einfach so zu sprechen anfängt ohne sich vorher durch Gedudel bemerkbar zu machen. :D
Ich vermute aber mal, das ist nicht so einfach zu implementieren?

Ich habe mal ein kleines DOIF geschrieben was je nach Durchsagenart verschiedene Jingles in verschiedener Lautstärke abspielt und die Sprachnachricht zusätzlich. Dann habe ich gleich noch die Transportoption TelegramBot dazu genommen (in diesem Board natürlich off-topic), ich konnte so den "msg" Befehl redundant machen. Da in einem Zimmer auch ein Echo Dot steht und der Sprachbefehl dort anders funktioniert, habe ich das über 2 Parameter im Stammdatensatz konfigurierbar gemacht. Die elsif's in der Hauptroutine muss man natürlich je nach Geschmack und Einsatzzweck umformen. Die Pausenzeiten (nach "sleep") sollten mindestens die Dauer des mp3's sein + 1-2 Sekunden Sicherheitspuffer.

FHEM, sonos2mqtt und sonostts laufen bei mir jeweils in Docker Containern, d.h. die URL des Ausgabegeräts muss natürlich individuell angepasst werden.
Noch ein kleiner Hinweis, wenn man sich im sonostts ein volume wie u.a. mappt, kann man auf dem Docker-Host die Jingle Daten bequemer abladen.

    volumes:
      - /data/container/Sprachausgabe:/usr/src/app/.cache


Aufruf mit
set messaging message (telegram|audio) <TargetDevice> <Warntype> <Nachricht>
Beispiel: set messaging message audio Wohnzimmer alert Es wird sehr windig!




defmod messaging DOIF subs  {\
    push (@{$_devicesraw},[("Bernhard","MQTT2_RINCON_7828CA6EF12A01400","speak de-DE Vicki","1","1")]);;\
    push (@{$_devicesraw},[("Julia","ECHO_G090U50784070X3Q","speak","0","0")]);;\
    push (@{$_devicesraw},[("Heiko","MQTT2_RINCON_B8E93720C12001400","speak de-DE Vicki","1","1")]);;\
    push (@{$_devicesraw},[("Wohnzimmer","MQTT2_RINCON_48A6B8D0DC3401400","speak de-DE Vicki","1","1")]);;\
    push (@{$_devicesraw},[("Anton","MQTT2_RINCON_7828CA6EF11201400","speak de-DE Vicki","1","1")]);;\
\
    for (my $i=0;; $i < @{$_devicesraw};; $i++) {\
        push (@{$_targets},$_devicesraw[$i][0]);;\
        $_devices{$_devicesraw[$i][0]}{device}    = $_devicesraw[$i][1];;\
        $_devices{$_devicesraw[$i][0]}{speakcmd}  = $_devicesraw[$i][2];;\
        $_devices{$_devicesraw[$i][0]}{addloud}   = $_devicesraw[$i][3];;\
        $_devices{$_devicesraw[$i][0]}{canjingle} = $_devicesraw[$i][4];;\
    }\
\
    push (@{$_warntypesraw},[("info","oldtimer.mp3","sleep 4;;","25")]);;\
    push (@{$_warntypesraw},[("warn","tos_bosun_whistle_1.mp3","sleep 4;;","25")]);;\
    push (@{$_warntypesraw},[("alert","tng_red_alert2.mp3","sleep 8;;","40")]);;\
    push (@{$_warntypesraw},[("sleep","lautes-schnarchen.mp3","sleep 5;;","25")]);;\
    push (@{$_warntypesraw},[("call","tos_hailing_frequencies_open.mp3","sleep 4;;","60")]);;\
\
    for (my $i=0;; $i < @{$_warntypesraw};; $i++) {\
        push (@{$_warntypes},$_warntypesraw[$i][0]);;\
        $_warntype{$_warntypesraw[$i][0]}{jingle}   = $_warntypesraw[$i][1];;\
        $_warntype{$_warntypesraw[$i][0]}{pause}    = $_warntypesraw[$i][2];;\
        $_warntype{$_warntypesraw[$i][0]}{loudness} = $_warntypesraw[$i][3];;\
    }\
\
    $_debugmode = AttrVal("$SELF","debugmode","off") eq "on";;\
    fhem("deletereading $SELF (DEBUG.*|error.*)");;\
\
    sub speakcmd {\
        my ($myaudience,$mywarntype,$mymessagefulltext) = @_;;\
        my $returncmd = "";;\
        $returncmd .= "set ".$_devices{$myaudience}{device}." ".$_devices{$myaudience}{speakcmd}." ";;\
        $returncmd .= ($_devices{$myaudience}{addloud} eq "1" ? $_warntype{$mywarntype}{loudness} : "")." $mymessagefulltext;;";;\
        set_Reading("DEBUG.speakcmd",$returncmd) if ($_debugmode);;\
        return $returncmd;; \
    }\
    sub jinglecmd {\
        my ($myaudience,$mywarntype) = @_;;\
        my $returncmd = "";;\
        if ($_devices{$myaudience}{canjingle} eq "1") {\
            $returncmd .= "set ".$_devices{$myaudience}{device}." notify ".$_warntype{$mywarntype}{loudness};;\
            $returncmd .= " http://sonostts.fritz.box:5601/cache/".$_warntype{$mywarntype}{jingle}.";;";;\
        }\
        set_Reading("DEBUG.jinglecmd",$returncmd) if ($_debugmode);;\
        return $returncmd;;\
    }\
} \
\
incomingmessage {\
    my $messageraw = [$SELF:message];;\
    my ($transportmethod, $audience, $warntype, @messagetext) = split(/ /, $messageraw);; \
    my $messagefulltext = join(" ", @messagetext);;\
    my $cmd             = "";;\
\
    if ($_debugmode) {\
        set_Reading("DEBUG.transportmethod",  $transportmethod    ,1);;\
        set_Reading("DEBUG.audience",         $audience           ,1);;\
        set_Reading("DEBUG.warntype",         $warntype           ,1);;\
        set_Reading("DEBUG.message.content",  $messagefulltext    ,1);;\
        set_Reading("DEBUG.message.raw",      $messagefulltext    ,1);;\
    }\
\
    if (not grep {$_ eq $audience} (@{$_targets},"alle")) {\
        set_Reading("error", "invalid audience $audience Allowed: ".join(" ", (@{$_targets},"alle")));;\
        return;;\
    }\
    if (not grep {$_ eq $transportmethod} ("telegram","audio")) {\
        set_Reading("error", "invalid transportmethod $transportmethod");;\
        return;;\
    }\
    if (not grep {$_ eq $warntype} @{$_warntypes}) {\
        set_Reading("error", "invalid warntype $warntype Allowed: ".join(" ", @{$_warntypes}));;\
        return;;\
    }\
\
    if ($transportmethod eq "telegram" && $audience eq "Heiko") {\
        $cmd .= "set HLTelegramBot message $messagefulltext;;";; \
    } elsif ($warntype eq "sleep" && $transportmethod eq "audio" && $audience ne "alle") {\
        ## Beim "Gute Nacht" erst der Text dann der Schnarch-Jingle\
        $cmd .= speakcmd($audience,$warntype,$messagefulltext);; \
        $cmd .= $_warntype{$warntype}{pause};;\
        $cmd .= jinglecmd($audience,$warntype);;\
    } elsif ($warntype ne "sleep" && $transportmethod eq "audio" && $audience ne "alle") {\
        ## Sonst umgekehrt, erst Jingle, dann Text\
        $cmd .= jinglecmd($audience,$warntype);;\
        $cmd .= $_warntype{$warntype}{pause};;\
        $cmd .= speakcmd($audience,$warntype,$messagefulltext);; \
    } elsif ($warntype ne "sleep" && $transportmethod eq "audio" && $audience eq "alle") {\
        for (my $i=0;; $i < @{$_devicesraw};; $i++) {\
            $cmd .= jinglecmd($_devicesraw[$i][0],$warntype);;\
        }\
        $cmd .= $_warntype{$warntype}{pause};;\
        for (my $i=0;; $i < @{$_devicesraw};; $i++) {\
            $cmd .= speakcmd($_devicesraw[$i][0],$warntype,$messagefulltext);; \
        }\
    };;\
    \
    fhem($cmd) if ($cmd ne "");;\
    set_Reading("DEBUG.finalcommand", $cmd, 1) if ($_debugmode);;\
}\

attr messaging userattr debugmode:on,off
attr messaging DbLogExclude .*
attr messaging debugmode on
attr messaging readingList message
attr messaging room Labor
attr messaging setList message:textField\

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: hydrotec am 26 Mai 2021, 06:13:47
@Otto

Danke noch einmal für deine Unterstützung.
@svrooij/sonos-tts-polly ist schon etwas gewöhnungsbedürftig, vor allem die Dokumentation dazu.
Es ist ja definitiv nur eine Erweiterung zu node-sonos-ts, vermutlich.
Wie das alles zusammenhängt habe ich noch nicht rausgefunden.
Ehrlich gesagt, ist auch nicht so schlimm.
Mir geht es ähnlich wie Sebastian, ist nicht unbedingt "Prio rot".  ;)

Doch mal eine andere Frage, ohne dazu irgendetwas gelesen zu haben.
FHEM hat doch ein eigenes Text2Speech (https://wiki.fhem.de/wiki/Text2Speech) Modul,
könnte man das nicht auch für Sonos verwenden?

Gruß, Karsten
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 26 Mai 2021, 10:30:48
Hallo Karsten,

so ist es und so ist die default Einrichtung. Steht auch so im Wiki https://wiki.fhem.de/wiki/Sonos2mqtt

Zu sonos-tts-polly: Es ist alles eine Erweiterung der Erweiterung :) letztlich ist es ein Zoo aus nodejs Modulen.
Man kann npm sicher sagen: Installiere nicht in default sondern in diesen Pfad, hab ich aber irgendwie nicht verstanden wie.
Man kann auch sicher dieses /usr/bin/sonos-tts-polly Script starten - ich habe aber auch nicht verstanden wie :)
Letztlich hat das Ding ein paar Parameter beim Aufruf - find ich nicht so kompliziert. Die nodejs Dokumentation sind zum großen Teil automatisch generiert, besser als nix aber eben auch nur so gut wie sich es der Programmierer ausgedacht hat. Und der weiß ja wie sein Programm funktioniert ;)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: hydrotec am 26 Mai 2021, 10:50:29
Zitat von: Otto123
so ist es und so ist die default Einrichtung. Steht auch so im Wiki https://wiki.fhem.de/wiki/Sonos2mqtt

Hast du das heute Nacht noch schnell eingefügt?  ;)
Ne, hab ich, vor lauter lass mich auch mit, komplett überlesen.  :-[
Dankeschön für den Hinweis, werde es die Tage so versuchen.

Angenehmen Tag noch.  8)
Gruß, Karsten
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: LordVoodoo am 26 Mai 2021, 21:21:48
Hallo zusammen,

mal ungeachtet von meinen TIDAL-Problemen, habe ich einen anderen Ansatz gewählt für die Senderauswahl.
Ich lasse mir die Favoriten als einzelne FHEM-Objekte erstellen und habe einen Befehl "play_on" hinterlegt, um so den jeweiligen Favoriten auf einem bestimmten Gerät zu starten.

Im Moment sieht das wie folgt aus:

Notify zur Anlage der Favoriten:
define Rule_Sonos_Favoriten_anlegen notify .*:Favorites:.* {
my $regex = "/(?:\"Title.:\"(.*?)\",\"UpnpClass\":\"(.*?)\",.+?\"TrackUri\":\"(.*?)\")+/mg";
my $fav_json;

my $play_on = "-";

my @speakers =devspec2array("a:model=sonos2mqtt_speaker");

foreach my $speaker (@speakers)
{
  if ($defs{$speaker})
  {
    $play_on = $play_on eq "-" ? "play_on:".$speaker : $play_on.",".$speaker;
  }
}

my $decoded = $EVENT =~ s/^Favorites: //r;
$decoded = decode_json($decoded);
my $counter = 0;

fhem("delete TYPE=DUMMY:Filter=a:genericDeviceType=Sonos_Favorit");

foreach my $fav (@{$decoded->{'Result'}})
{
  fhem("define Sonos_Favorit_$counter DUMMY");
  fhem("attr Sonos_Favorit_$counter genericDeviceType Sonos_Favorit");
  fhem("setreading Sonos_Favorit_$counter title ".$fav->{"Title"});

  fhem("attr Sonos_Favorit_$counter alias Sonos - ".$fav->{"Title"});
  fhem("setreading Sonos_Favorit_$counter url ".$fav->{"TrackUri"});
  fhem("setreading Sonos_Favorit_$counter class ".$fav->{"UpnpClass"});

  $counter++;
  }
fhem("attr a:genericDeviceType=Sonos_Favorit setList $play_on");
}


Notify zum Starten des Abspielen
define Rule_Favorit_Sonos_starten notify Sonos_Favorit.*:play_on\s.* {

fhem("setreading $SELF debugging $EVTPART1");
my $url = ReadingsVal($NAME, "url", "-");

if ($defs{$EVTPART1} and $url ne "-")
{
   fhem("set $EVTPART1 playUri $url");
}
}


Man könnte dieses Szenario jetzt noch erweitern um folgenden Vorgang:
Wenn ein Gerät bereits einen Stream abspielt und ein weiteres Gerät wird mit dem gleichen Favoriten "beauftragt", dann wird das zweite Gerät in eine Gruppe mit dem ersten aufgenommen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 27 Mai 2021, 14:34:37
Hallo Otto,

ich habe dir die von mir erweiterte Utils per PM geschickt.

Zitat von: Otto123 am 25 Mai 2021, 10:40:41
Wegen dem AlarmRunning Reading musst Du mal am Anfang des Threads schauen, da war es schon mal da. Notfalls muss man mal noch so ein "Urdevice" bauen :)
Tipp: geh hier im Thread auf "drucken" und dann mit ctrl+f nach AlarmRunning suchen.

Habe das Reading jetzt durch eine Modifkation der readingsList der Speaker hinbekommen, es ist Teil von avtransport:


sonos/status/esszimmer/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }
sonos/status/esszimmer/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }


Wichtig ist hier, dass nicht die UUID sondern der Raum- bzw. Speakername verwendet wird - auch hier stimmt die Doku https://svrooij.io/sonos2mqtt/topics.html#avtransport-message also nicht.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 27 Mai 2021, 15:51:07
Ich schau mir das an.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 28 Mai 2021, 11:38:55
Danke.

Mir ist aufgefallen, dass in der setList der Bridge noch folgende Zeile fehlt:


setplayFav:noArg {sonos2mqtt($NAME,$EVENT)}


Damit wäre m.E. auch im Wiki der Punkt


{sonos2mqtt_mod_list('a:model=sonos2mqtt_speaker','setList','playFav:'.ReadingsVal((devspec2array('a:model=sonos2mqtt_bridge'))[0],'favlist','').q( {sonos2mqtt($NAME,$EVENT)}))}


obsolet bzw. durch das Ausführen von


set SonosBridge setplayFav


oder


{sonos2mqtt_mod_list('a:model=sonos2mqtt_speaker','setList','playFav:'.sonos2mqtt_getList($bridge,'Favorites').' {sonos2mqtt($NAME,$EVENT)}')}


nach dem get SonosBridge Favorites zu ersetzen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 29 Mai 2021, 22:40:05
Die Readings aus avtransport schau ich mir nochmal an. Ich habe damals nicht verstanden warum der Aufbau so ist. Da kommen sicher noch ein paar andere Dinge mit die dem Einen oder Anderen fehlten. Zumal irgendwie viel Redundanz dadurch kam.

Das mit setplayFav hatte ich mal eingebaut und dann irgendwie gezögert auf welchen Weg ich fokussiere. Das modifiziert immer wieder alle Player.
Die Alternative ist play Favorite <Name direkt aus dem Reading der Bridge> da wird nichts im Player modifiziert. Und konsequenter Weise hätte man setPlayRadio und setplayPlaylist noch machen müssen. Das geht alles mit einem Befehl play Favorite|Radio|Playlist <Name direkt aus dem Reading der Bridge> und wäre sogar erweiterbar auf mehr solche Listen.

Aber auch hier habe ich noch offene Baustellen. Bei den Listen gehen noch nicht alle Varianten.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 Juni 2021, 17:43:53
Zitat von: Ralli am 27 Mai 2021, 14:34:37
Habe das Reading jetzt durch eine Modifkation der readingsList der Speaker hinbekommen, es ist Teil von avtransport:


sonos/status/esszimmer/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }
sonos/status/esszimmer/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }


Wichtig ist hier, dass nicht die UUID sondern der Raum- bzw. Speakername verwendet wird - auch hier stimmt die Doku https://svrooij.io/sonos2mqtt/topics.html#avtransport-message also nicht.
Hallo Ralli,

die Doku ist schon richtig :) in dem Link von Dir steht:
ZitatAVTransport message
Topic: sonos/status/name_or_uuid_of_speaker/avtransport
Wie es geht steht hier: https://svrooij.io/sonos2mqtt/getting-started.html#configuration
Zitat--friendlynames    Use device name or uuid in topics (except the united topic, always uuid) [choices: "name", "uuid"]
Also konkret bei Verwendung der pm2 Variante
"pm2 -s start sonos2mqtt -- --friendlynames uuid"
Damit man jetzt nur das eine Reading bekommt und nicht den anderen (komplett redundanten?) Kram mit, habe ich das hier gebastelt:
sonos/status/RINCON_347E5C82560801400/avtransport:.* { if ($EVENT =~ m/("AlarmRunning":true|"AlarmRunning":false)/) {json2nameValue("{$1}") } }
Ich hoffe Beta-User fällt jetzt nicht heulend aus dem Sessel :)
Ich denke fast das geht noch einfacher, aber vielleicht ist das irgendwie konsequent (Verwendung des typischen json2nameValue() )

Da gab es schon mal diesen Thread (https://forum.fhem.de/index.php?topic=112737.15), der die Manipulation von $EVENT vor der Übergabe der Readings zum Inhalt hatte.
Durch den bin ich auf die Idee gekommen. ;)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 02 Juni 2021, 17:58:30
Zitat von: Otto123 am 02 Juni 2021, 17:43:53
Ich hoffe Beta-User fällt jetzt nicht heulend aus dem Sessel :)
ymmd :P

Aber da es nur ein einziges key/value-Paar ist, müßte es eigentlich auch so "direkt" gehen:
sonos/status/RINCON_347E5C82560801400/avtransport:.* { if ($EVENT =~ m/"AlarmRunning":(true|false)/) { { AlarmRunning => $1 } } }
(Ansonsten sind da ein paar m.E. unnötige bzw. inkonsistente Formatierungen drin:)
sonos/status/RINCON_347E5C82560801400/avtransport:.* { if ($EVENT =~ m/("AlarmRunning":true|"AlarmRunning":false)/) { json2nameValue($1) } }
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 02 Juni 2021, 18:26:55
Vielen Dank Euch beiden!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 Juni 2021, 19:56:56
@Jörg: Deine Variante funktioniert (an die hatte ich auch gedacht ;) ). Dein zweiter Satz geht mir immer noch durch den Kopf und ich weiß nicht wie ich den zuordne:
Zitat(Ansonsten sind da ein paar m.E. unnötige bzw. inkonsistente Formatierungen drin:)
Was genau meinst Du damit?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 02 Juni 2021, 20:05:00
Anhand dem gezeigten Beispiel nur die zwei geschweiften Klammern ? Ich hab mich nicht mit beschäftigt, keine Zeit und auch Lust.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 Juni 2021, 20:10:13
🙈jetzt sehe ich es🙈
Aber hier drin $1 "AlarmRunning":false steht doch nur der Innenteil vom json - da muss doch die Klammer { außen drum } ? ???
oder ist json2namevalue so tolerant?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 02 Juni 2021, 20:12:59
Zitat von: Otto123 am 02 Juni 2021, 19:56:56
Was genau meinst Du damit?
a) wofür waren die geschweiften Klammern um $1?
b) wofür die Quotes (dto)?
c) warum einmal mit Leerzeichen (hinten) und einmal ohne (vorne, jeweils rund um den j2nv()-Aufruf)?

Du hast vermutlich recht, dass j2nv() das passend formatiert haben will, Asche auf mein Haupt...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 Juni 2021, 20:16:24
Zitat von: Beta-User am 02 Juni 2021, 20:12:59
[/s]c) warum einmal mit Leerzeichen (hinten) und einmal ohne (vorne, jeweils rund um den j2nv()-Aufruf)?
also den gebe ich gerne zu! Wenn die Dorfkneipe am 17.6. wieder aufmacht, gebe ich eine überflüssige fehlende Leerzeichen Runde :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Beta-User am 02 Juni 2021, 20:46:50
Betr. Leerzeichen war mein Vorschlag allerdings: eines mehr erhöht die Lesbarkeit...

Trotzdem Prost!

Btw.: Rhasspy wäre evtl. ein cooles Thema für euren kommenden Stammtisch (nachdem mein MQTT-Workshop schon nicht staffgefunden hat (afaik))...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 07 Juni 2021, 22:52:08
Hi,

ich habe mal noch etwas zum AlarmRunning Reading gemacht. Damit ist es egal ob die uuid oder der friendly name im Topic steht. Man muss also den start über pm2 nicht ändern ;)

Die readingList um diesen Teil erweitert:
$DEVICETOPIC/status/(.*)/avtransport:.* { sonos2mqtt_reading($NAME,$EVENT,$TOPIC) }

und diese hier in die utils
sub sonos2mqtt_reading
{
my ($NAME,$EVENT,$TOPIC)=@_;
my $uuid = ReadingsVal($NAME,'uuid','');
my $player = lc( ReadingsVal($NAME,'name','') );
$TOPIC =~ m,.*/status/(.*)/avtransport,;
if ( ($1 eq $uuid or $1 eq $player) and $EVENT =~ m/"AlarmRunning":(true|false)/ ) {
    return { AlarmRunning => $1 }
  }
}

In der utils müsste das setup noch erweitert werden, so erstmal für die Kommandozeile
{ sonos2mqtt_mod_list( 'a:model=sonos2mqtt_speaker', 'readingList', '$DEVICETOPIC/status/(.*)/avtransport:.* { sonos2mqtt_reading($NAME,$EVENT,$TOPIC) }' ) }

@Ralli benutzt Du noch andere Readings aus dem topic avtransport?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 08 Juni 2021, 06:19:42
Hi Otto,

vielen Dank - auch für die Nachfrage. Ja, ich nutze noch die beiden Readings.

SleepTimerGeneration
SnoozeRunning

BTW: Wirst du meinen Beitrag in Sachen sonos2mqtt_Alarms in die Utils noch übernehmen?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 08 Juni 2021, 12:01:36
Klares Ja! Ich verhake mich manchmal in anderen Dingen, dann wird es nicht gleich ;)

Dann schau ich jetzt mal, wie es mit mehr als einem Reading geht. Ich will nicht diesen ganzen Korb an redundanten Readings übernehmen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 08 Juni 2021, 23:33:25
So da wären jetzt die 3 Readings :)
sub sonos2mqtt_reading
{
my ($NAME,$EVENT,$TOPIC)=@_;
my $uuid = ReadingsVal($NAME,'uuid','');
my $player = lc( ReadingsVal($NAME,'name','') );
$TOPIC =~ m,.*/status/(.*)/avtransport,;
if ( $1 eq $uuid or $1 eq $player )  {
    my %hash;
    if ($EVENT =~ m/"AlarmRunning":(true|false)/) {$hash{"AlarmRunning"}=$1}
    if ($EVENT =~ m/"SleepTimerGeneration":(\d+)/) {$hash{"SleepTimerGeneration"}=$1}
    if ($EVENT =~ m/"SnoozeRunning":(true|false)/) {$hash{"SnoozeRunning"}=$1}
    return \%hash
  }
}

Jetzt müsste man Snooze auch noch einbauen? Oder geht das auch am Gerät oder in der App? Bin irgendwie zu doof. Ich bekomme das nur mit dem Sonos Modul von Reiner hin. ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 09 Juni 2021, 06:43:53
 :)

Für ein per FHEM auszulösendes Snooze hatte ich bislang keinen Anwendungsfall, muss ich mich selbst erst einmal schlau machen. Ich reagiere nur auf das Reading, will also in FHEM mitbekommen, dass einer auf den berühmten Knopf gedrückt hat  8).
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 09 Juni 2021, 22:05:57
Wobei es keinen echten Knopf gibt sondern nur die Funktion in der App? Steht in irgendeiner Beschreibung, ich sehe ihn nicht  :'(

Von FHEM aus kann man den SnoozeKnopf so drücken - x_raw_payload:
{
  "command": "adv-command",
  "input": {
    "cmd": "AVTransportService.SnoozeAlarm",
    "val": {
      "InstanceID": 0,
      "Duration": "00:05:00"
      }
  }
}
siehe https://svrooij.io/node-sonos-ts/sonos-device/services/av-transport-service.html#snoozealarm
Kann man ja noch einbauen.  ;D
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: svrooij am 10 Juni 2021, 23:15:07
Zitat von: Otto123 am 26 Mai 2021, 10:30:48
Hallo Karsten,

so ist es und so ist die default Einrichtung. Steht auch so im Wiki https://wiki.fhem.de/wiki/Sonos2mqtt

Zu sonos-tts-polly: Es ist alles eine Erweiterung der Erweiterung :) letztlich ist es ein Zoo aus nodejs Modulen.
Man kann npm sicher sagen: Installiere nicht in default sondern in diesen Pfad, hab ich aber irgendwie nicht verstanden wie.
Man kann auch sicher dieses /usr/bin/sonos-tts-polly Script starten - ich habe aber auch nicht verstanden wie :)
Letztlich hat das Ding ein paar Parameter beim Aufruf - find ich nicht so kompliziert. Die nodejs Dokumentation sind zum großen Teil automatisch generiert, besser als nix aber eben auch nur so gut wie sich es der Programmierer ausgedacht hat. Und der weiß ja wie sein Programm funktioniert ;)

Gruß Otto

Did you see the documentation on sonos-tts-polly? https://github.com/svrooij/node-sonos-tts-polly#run-your-own-server-in-node

It's a small webserver, to start it you'll need 1. a free port to host on 2. an amazon key (see documentation). It then runs in the background and you can use it to generate mp3 files. The problem with Sonos is that to be able to play an mp3 from some webserver, the file name has to end with .mp3 for it to be recognized
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 11 Juni 2021, 12:45:08
Ich habe mal das Alarmhandling in die Utils eingebaut
Funktionsumfang
Der Wecker ist gekennzeichnet mit einer ID!, weitere Beschreibung der Parameter https://svrooij.io/node-sonos-ts/sonos-device/services/alarm-clock-service.html#updatealarm
Achtung: Es funktionieren nach meinen Tests nicht alle Parameter! Mir gelingt es z.B. nicht IncludeLinkedZones zu setzen.

Den Einbau in die sonos2mqtt_utils habe ich ein klein wenig anders gemacht als Ralli, aber danke für die Vorarbeit - die ich genutzt habe!  ;)
ich habe mich am Sonos Modul von Reiner orientiert.
Bridge
get SonosBridge listalarms liefert das Reading Alarms in der SonosBridge ( listalarms:noArg $DEVICETOPIC/cmd/listalarm)
set SonsoBridge setalarm - in der SonosBridge schreibt die Veränderung der Alarms zurück setList setalarm:textField $DEVICETOPIC/cmd/setalarm
Mit der Sub sonos2mqtt_alarm('SonosBridge','') werden die Readings AlarmListIDs und AlarmList in den Playern daraus erzeugt/zugeordnet. Das kann man mit einem "Dummy" userReadings in der Bridge automatisch machen. Dieser Teil ist noch nicht im Setup! Diese wird mit einem bedingten sleep von listalarms aufgerufen
Player
AVTransport liefert über eine Sub die Readings AlarmRunning, SleepTimerGeneration, SnoozeRunning mittels $DEVICETOPIC/status/(.*)/avtransport:.* { sonos2mqtt_reading($NAME,$EVENT,$TOPIC) }
Die sub sonos2mqtt_alarms:  realisiert die Funktion alarm enable|disable|update all|ids|json
Die Kommandos werden um snoozeAlarm erweitert. 5 Minuten weiter schlafen:
set alias=Arbeitszimmer snoozeAlarm 00:05:00Der setList und readingList werden über setup in Bridge und Player eingebaut.
Beispiele:
set alias=Arbeitszimmer alarm disable all
set alias=Arbeitszimmer alarm disable 73
set alias=Arbeitszimmer alarm enable 73,97,100
set alias=Arbeitszimmer alarm update {"ID":73,"Duration":"04:00:00"}
set alias=Arbeitszimmer alarm {(my $start = strftime("%H:%M:%S",localtime(time+5));; return qq(update {"ID":73,"StartLocalTime":"$start","Enabled":true,"Volume":20}))}
Achtung letztes Beispiel ist set magic mit Perl! Vorletztes Beispiel ist einfach ein json String!
Die verwendbaren Inhalte entnimmt man einfach den Readings AlarmList oder AlarmListIDs.
Das letzte Beispiel nutzt die Weckfunktion für einen zeitlich begrenzten Softstart in Kürze (5 sec)  8)

Die neue Utils sollte kompatibel zur alten sein! Wer sie runterladen will Achtung: Vorhandene wird überschrieben!
{ Svn_GetFile("contrib/AttrTemplate/99_sonos2mqttUtils.pm", "FHEM/99_sonos2mqttUtils.pm", sub(){ CommandReload(undef, "99_sonos2mqttUtils") }) }Dann einmal setup machen um die definitionen anzupassen
{sonos2mqtt_setup();;sonos2mqtt_setup('a:model=sonos2mqtt_bridge')}
Edit Dezember 2023:
diese Erweiterung eingebaut https://forum.fhem.de/index.php?topic=111711.msg1267736#msg1267736

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 11 Juni 2021, 14:17:24
Super, vielen Dank - und gerne  ;).

Zitat
Mit der Sub sonos2mqtt_alarm('SonosBridge','') werden die Readings AlarmListIDs und AlarmList in den Playern werden daraus erzeugt/zugeordnet. Das kann man mit einem "Dummy" userReadings in der Bridge automatisch machen. Dieser Teil ist noch nicht im Setup!


userReadings alarmLists:Alarms:.* {sonos2mqtt_alarm($name,'alarmlist')}


Mit dem von dir vorgeschlagenen Userreading klappt das bei (noch) nicht. Stattdessen behelfe ich mir so:


def SonosBridgeAlarmHelper notify MQTT2_SonosBridge:Alarms.* {sonos2mqtt_alarm('MQTT2_SonosBridge','')}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: svrooij am 11 Juni 2021, 20:25:16
Sorry for my English, while I can read Deutsch my writing is not that good.

You can load all alarms by calling the global command https://svrooij.github.io/sonos2mqtt/global-commands.html *ListAlarm* (bug, in beta renamed to *ListAlarms*). The alarms will then be published to sonos/alarms

There is also an advanced command https://svrooij.github.io/sonos2mqtt/control/advanced.html to update a few parameters of an alarm. The UpdateAlarm needs all parameters. The *PatchAlarm* loads the old values so you don't have to. It's "undocumented" because it's not available in the speaker, but I've build it myself.

Here is the code https://github.com/svrooij/node-sonos-ts/blob/08198914ab7b09eec2350c59a3bf08cd8e207c03/src/services/alarm-clock.service.extension.ts#L66

You can call it with the Advanced Command.

{
  "command": "adv-command",
  "input": {
    "cmd": "AlarmClockService.PatchAlarm",
    "val": {
      "ID": 1230,
      "Enabled": true
    }
  }
}

For other parameters see the above code link.

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 11 Juni 2021, 20:46:25
@Stephan thanks that you attend to the discussion :)
as I understand, the global command setalarm is doing the same job than PatchAlarm? Or setalarm is using the PatchAlarm?
So I can update certain Elements  like "Enabled" or "StartLocalTime" - I can see the code. This clarifies, that not all Parameter will working.

Ok. If I want doing more than setalarm, I have to use UpdateAlarm with a full qualified json - right?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 11 Juni 2021, 21:47:10
Lieber Otto,

für die nächste Veränderung/Erweiterung hätte ich noch eine Bitte:

Das Einstellen der Lautstärke mit volume xy sollte m.E. nicht per default mit Rampe sein sondern direkt. Eine Einstellung mit Rampe sollte dann eher mit einem zusätzlichen Parameter aktiviert werden.

Ich behelfe mir momentan mit "set Speaker 25 25", um direkt die Lautstärke 25 einzustellen. Das entspricht aber nicht dem sonst üblichen "Standard" in FHEM, denn als zusätzlicher Parameter wird eher die Ramptime angegeben (oder ein Startwert).

Also:

"set Speaker volume 25" sollte m.E. direkt auf 25 gehen,
"set Speaker volume 25 10" könnte das Verhalten, welches du bereits implementiert hast, abbilden - also von 10 auf 25 erhöhen. Die Kür wäre, wenn mit einem "set Speaker volume 25 -1" ein sukzessives Erhöhen oder eine sukzessive Reduktion vom aktuellen volume-Wert durchgeführt würde.

Gerade habe ich noch festgestellt, dass das Reading "Master" nicht korrekt gesetzt wird. Ist im Namen des Speakers ein Leerzeichen, wird bei diesem Reading abgeschnitten. Es steht also in dem Reading "Rumpelstilzchens" statt "Rumpelstilzchens Roam" drin.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 11 Juni 2021, 22:04:46
Zitat von: Ralli am 11 Juni 2021, 14:17:24
Mit dem von dir vorgeschlagenen Userreading klappt das bei (noch) nicht. Stattdessen behelfe ich mir so:


def SonosBridgeAlarmHelper MQTT2_SonosBridge:Alarms.* {sonos2mqtt_alarm('MQTT2_SonosBridge','')}

Ich habe jetzt ne Weile überlegt und hingeschaut, aber was machst Du mit der DEF (ein notify?) anders als ich mit dem userReadings? Der zweite Parameter ist völlig egal und der erste muss der Name der Bridge sein. Das ist er ja mit $name...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 11 Juni 2021, 22:16:02
Tja, mmh, es klappt halt mit dem userReading nicht, aber mit dem notify ...

Sorry, du hast natürlich Recht, in der Def fehlt das "notify" - ja, es ist eins  ::)

Edit:
Fehler gefunden. In den userReadings fehlte vor dieser neu eingefügten Zeile das Komma. Jetzt klappt's auch mit deinem Ansatz und ohne notify.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 12 Juni 2021, 09:36:03
ZitatIch behelfe mir momentan mit "set Speaker 25 25", um direkt die Lautstärke 25 einzustellen. Das entspricht aber nicht dem sonst üblichen "Standard" in FHEM, denn als zusätzlicher Parameter wird eher die Ramptime angegeben (oder ein Startwert).

+1 8)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 12 Juni 2021, 18:16:27
Zitat"set Speaker volume 25" sollte m.E. direkt auf 25 gehen,
"set Speaker volume 25 10" könnte das Verhalten, welches du bereits implementiert hast, abbilden - also von 10 auf 25 erhöhen. Die Kür wäre, wenn mit einem "set Speaker volume 25 -1" ein sukzessives Erhöhen oder eine sukzessive Reduktion vom aktuellen volume-Wert durchgeführt würde.
Hab ich so eingebaut, die Lösung gefällt mir besser! Und mit dem bisherigen Code war ich sowieso nicht sehr glücklich...

Das mit dem Master Reading habe ich gefunden: im userReading muss das + im split escaped werden  :-X  --> ' \+'
Edit: hab ich im Template gefixed, würde aber ein manuelles Fix am existierenden Player empfehlen :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 12 Juni 2021, 18:54:27
Vielen Dank, Otto.

Korrektur vom userReading klappt.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 12 Juni 2021, 19:35:52
Ich habe noch Einen nachgelegt :) das zusätzliche "dummy" userReadings  alarmLists:Alarms:.* wird nicht mehr benötigt. Ich starte bei listalarms jetzt auch die sonos2mqtt() und dort wird mit einem sleep SonosBridge:Alarms:.* auf das Reading gewartet.
{sonos2mqtt_setup('a:model=sonos2mqtt_bridge')} macht jetzt alles :)

Jetzt ist irgendwie noch das Thema mit den Favoriten und den uris offen. Das muss ich mir noch anschauen, da hatte ich in Reiners Modul noch eine Idee gefunden.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 12 Juni 2021, 21:03:11
Klappt - da ich das Setup nicht erneut ausführen wollte, musste ich nur das getList-Attribut der Bridge gemäß der neuen Utils anpassen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 11 August 2021, 18:24:55
Zitat von: Otto123 am 24 Mai 2021, 22:51:37
Hallo Karsten,

der Container zaubert ja auch nicht - da könnte man notfalls reinschauen die Parameter gemappt werden. Hast Du den Container probiert? Funktioniert der?

Gruß Otto

Hallo Otto, hallo Karsten,
ich habe mich jetzt mal wieder dran gesetzt und den sonos-tts-polly Container zum Laufen gebracht! Danke auch nochmal an PatrickR  ;)

In der Doku https://svrooij.io/sonos2mqtt/getting-started.html (https://svrooij.io/sonos2mqtt/getting-started.html) wird ein Docker-Compose Beispiel gezeigt.
Dort fehlt bei SONOS_TTS_CACHE_URI ein "/" am Ende! Mit / hats dann auch prompt funktioniert.
SONOS_TTS_CACHE_URI http://10.3.3.9:5601/cache/

VG Sebastian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 11 August 2021, 18:25:09
Hallo Otto,
du behandelst ja die Befehle ('stop','pause','toggle','volumeUp','volumeDown','next','previous') als easycmd und gibst diese 1:1 an sonos2mqtt weiter.
{return lc( qq($topic { "command": "$cmd" }) )}
In der sonos-2-mqtt Doku steht, dass der Befehl auch einen optionalen Parameter number kennt. Ich tippe (und hoffe) mal auf die Schrittweite. Ohne Parameter wird Volume um 4 Schritte erhöht. Das ist mir etwas zu viel, da ich mit einem Tradfri-Dimmer die Lautstärke verändern möchte.

Wie baue ich die volume(Up|Down) Befehle mit Parameter um? Ein
{return lc( qq($topic { "command": "volumeUp 2" }) )}
hat zwar keinen Fehler ausgegeben aber auch keine Lautstärke verändert.

Danke und VG,
Sebastian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 11 August 2021, 22:22:39
Hallo Sebastian,

Ich bin unterwegs und kann nichts testen. Aber wenn du hier am Anfang das Beispiel mit Volume anschaust:
https://svrooij.github.io/sonos2mqtt/control/commands.html

So wird es gehen?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 12 August 2021, 12:01:55
Zitat von: Otto123 am 11 August 2021, 22:22:39
Hallo Sebastian,

Ich bin unterwegs und kann nichts testen. Aber wenn du hier am Anfang das Beispiel mit Volume anschaust:
https://svrooij.github.io/sonos2mqtt/control/commands.html

So wird es gehen?

Gruß Otto

Hi Otto, jepp so gehts:
if($cmd eq 'volumeUp') {
   # Schrittlänge
   my $step = 2;
   return lc( qq($topic { "command": "$cmd", "input": $step}) )
}


Schön wäre natürlich ein optionaler Parameter "step" bei volumeUp|Down  - ohne Übergabe des Parameters wie gehabt step=4,

Danke!  8)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Smyr am 02 September 2021, 17:34:03
Hallo

ist es gewollt, dass alle Slaves in einer Gruppe automatisch den State PLAYING bekommen auch wenn der Master in der Gruppe gar keine Musik abspielt?

Ich würde gerne auf die States in einem notify reagieren um auf Knopfdruck einen Player zu einer Gruppe hinzuzufügen bzw. wenn kein Player läuft eine Playlist abzuspielen. Ein Slave mit dem State Playing verhindert das aber.

Gruß
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 03 September 2021, 00:28:16
Hi,

Die Mitglieder einer Gruppe erhalten keine Status Updates mehr. Das ist leider so und irgendwo hier Thread mal beschrieben, wenn ich mich richtig erinnere.

Ich habe die Aufgabe nicht verstanden. Musst Du näher erklären.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Smyr am 03 September 2021, 07:59:58
Zitat von: Otto123 am 03 September 2021, 00:28:16

Die Mitglieder einer Gruppe erhalten keine Status Updates mehr. Das ist leider so und irgendwo hier Thread mal beschrieben, wenn ich mich richtig erinnere.


Hallo

ich habe mir so etwas schon gedacht. Danke schon mal für die Auskunft.

Wird der State von FHEM oder von sonos2mqtt auf PLAYING gesetzt? Wenn man auf das verhalten Einfluss nehmen könnte wäre mir schon geholfen. Wenn die Mitglieder auf STOPPED bleiben würden wäre es für meinen Fall besser.

Ich habe 4 Sonos Lautsprecher. Mit einem Notify reagiere ich auf einen Tastendruck. Nun möchte ich, als Beispiel, dass der Lautsprecher im Badezimmer sich entweder mit einem anderen Lautsprecher Gruppiert wenn dieser bereits Musik abspielt oder aber wenn kein anderer Lautsprecher Musik abspielt soll er nur eine Playlist wiedergeben.

Funktioniert soweit auch nur wenn sich ein oder mehrere Lautsprecher in Gruppen befinden bekommen die Slaves den State "PLAYING" auch wenn die Gruppe keine Musik wiedergibt. Ich habe STATE genutzt um auszuwerten ob ein anderer Player Musik abspielt oder nicht.

Gruß
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 03 September 2021, 10:46:07
Hi,

sonos2mqtt liefert nur noch wenige Aktualisierungen für die Slaves, der transportState wird nicht mehr aktualisiert.
Du kannst vielleicht etwas bauen was den transportState auf den Slaves mit dem Master synchronisiert, die Informationen sollten alle da sein. Du kannst aber auch die Abfrage in deinem notify so machen, das Du Dir die nötigen Infos zusammensuchst. Du weißt ja ob er Master ist oder nicht und wenn er nicht sein Master ist musst Du eben den Master abfragen. Wer Master ist weißt Du auch.

Mit langem Tastendruck den nicht gruppierten, nicht spielenden Player in die spielende Gruppe aufnehmen ist aber eine Standardfunktion von Sonos. Die brauchst Du nicht zu erfinden!

Ebenfalls Sonos Standard: Wenn die Taste eines beliebigen Players in einer Gruppe gedrückt wird, wird die Gruppe mit dem gestartet was zuletzt war.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Smyr am 04 September 2021, 12:25:36
Hi

danke für die Unterstützung. Ich setze den transportState der Slaves nun automatisch auf Stopped. Der Master der Gruppe bekommt ja noch Status Updates und für meine Funktion genügt das.

Die Funktion mit langem Tastendruck war mir tatsächlich nicht bekannt. In meinem Anwendungsfall aber nicht zielführend da die Tasten nicht immer zu erreichen sind  :P

Gruß
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 04 September 2021, 13:39:58
Hi,

nur noch als Idee aus meiner Routine für das devStateIcon: ich denke damit kann man immer den STATE des Masters ermitteln:
Value((devspec2array('DEF='.ReadingsVal($name,'coordinatorUuid','0')))[0])

oder den transportState direkt auslesen:
ReadingsVal((devspec2array('DEF='.ReadingsVal($name,'coordinatorUuid','0')))[0],'transportState','STOPPED')
Das könnte man auch als stateFormat verwenden. Aber eventuell hakt es an der Aktualisierung...

Hab das nicht probiert, nur laut gedacht ;)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 25 September 2021, 07:37:01
Hallo Otto,

speziell für gruppierte Lautsprecher gibt's in der neuen Beta den neuen Wert "ExtendedTransportState":

https://github.com/svrooij/sonos2mqtt/issues/110

EDIT:

Und ab Version 3.1.2 ist der Typo "listalarm(s)" gelöst (https://github.com/svrooij/sonos2mqtt/issues/145). Betrifft die folgende Zeile in 99_sonos2mqttUtils.pm:


   if($cmd eq 'listalarms') {fhem("sleep $bridge:Alarms:.* ;{sonos2mqtt_alarm(\"$bridge\",'alarmlist')}");return "$devicetopic/cmd/listalarm"}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 25 September 2021, 17:13:40
Hallo Ralli,

die zweite Info hatte ich. Ich werde das einfach so einbauen und keine Rücksicht auf alte Versionen nehmen. Die es haben haben es, die neu anfangen nehmen ja die neue Version!?
Die erste Info ist ist interessant, danke :)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: christian.71 am 27 September 2021, 18:51:33
Ich frage mich gerade, ob es richtig ist, wenn ich an den Master einer Gruppe den speak Befehl mit "de-DE Vicki 30 Hier ist eine Durchsage" absetze, dass sich dann nur die Lautstärke vom Master auf die angegebene Volume Angabe ändert. Ist das normal? Oder muss der Befehl dann evtl. anders lauten, damit die Lautstärke an allen Speakern geändert wird?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 27 September 2021, 21:21:56
Hi,

ich habe mal nachgeschaut: https://svrooij.io/node-sonos-ts/sonos-device/notifications-and-tts.html
Das ist wohl genauso implementiert wie Du beschreibst. Die mp3 wird von allen gespielt aber nur der angesprochene Speaker wird in der Lautstärke verändert.
Da wirst Du erstmal selbst Hand anlegen müssen. Entweder jeden Speaker in der Gruppe die Lautstärke setzen oder mit dem advanced command SetRelativeGroupVolume(adjustment) die Gruppe anheben https://svrooij.io/node-sonos-ts/sonos-device/methods.html

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: christian.71 am 28 September 2021, 20:01:48
Danke Otto für die Antwort. Kannst du mir vielleicht sagen, wie ich das mit dem advanced command SetRelativeGroupVolume(adjustment) bewerkstelligen kann? Geht das irgendwie mit dem set x_raw_payload?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 28 September 2021, 22:12:45
Ja :)
Du musst das über x_raw_payload an den Master senden:
{
  "command": "adv-command",
  "input": {
    "cmd": "GroupRenderingControlService.SetRelativeGroupVolume",
    "val": {
      "InstanceID": 0,
      "Adjustment": 20
    }
  }
}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: christian.71 am 15 Oktober 2021, 20:15:35
Ich hätte da noch eine Frage zu den amazon polly Stimmen. Es gibt da ja mittlerweile auch eine neurale Version von der Stimme von Vicki. Diese klingt natürlicher und menschenähnlicher. Gibt es dafür bei dem speak Befehl einen anderen Syntax, wenn ich diese Stimme anwenden möchte? Bei speak de-DE Vicki wird ja nur die Standard Stimme von Vicki wiedergegeben.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 16 Oktober 2021, 10:53:54
Also es gab da wohl einen Issue zu https://github.com/svrooij/node-sonos-tts-polly/issues/5 und wenn ich das recht verstehe, ist die Standardengine fest hinterlegt (worden).

Du könntest einen Feature Request bei svrooij aufmachen, eventuell implementiert er dann etwas.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: christian.71 am 23 Oktober 2021, 13:10:42
svrooij hat jetzt freundlicherweise eine neue Version (1.0.9) von node-sonos-tts-polly bereitgestellt. https://github.com/svrooij/node-sonos-tts-polly/releases/tag/v1.0.9 Nun sollten wohl die neuralen Stimmen funktionieren. Aber vermutlich müsste noch die 99_sonos2mqttUtils.pm angepasst werden, oder?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 25 Oktober 2021, 12:41:48
Zitat von: christian.71 am 23 Oktober 2021, 13:10:42
Aber vermutlich müsste noch die 99_sonos2mqttUtils.pm angepasst werden, oder?
Ich denke nicht, hast Du es probiert wie beschrieben? Hat sich der Befehl in sonos2mqtt denn geändert? Die Stimme konnte doch schon immer als Parameter übergeben werden?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: christian.71 am 25 Oktober 2021, 17:48:05
svrooij hat jetzt noch geschrieben: This new functionality isn't yet implemented in the node-sonos-ts library, but I'll try that some where in the next weeks.
Also wenn ich das dann richtig verstehe, muss er noch etwas anpassen?!

ZitatDie Stimme konnte doch schon immer als Parameter übergeben werden?
Es gibt ja die Stimme von Vicki als Standard Stimme und als neurale Stimme. Das kann ja bisher nicht unterschieden werden. Beim speak Befehl de-DE Vicki wird ja immer die Standard Stimme verwendet.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 25 Oktober 2021, 19:13:02
ZitatAlso wenn ich das dann richtig verstehe, muss er noch etwas anpassen?!

Korrekt!
In sonos-tts-polly bereits integriert:
const request = new Request(
  'http://your_ip:5601/api/generate',
  {
    method: 'POST',
    headers: {
      'Content-type': 'application/json'
    },
    body: JSON.stringify({ text: 'Hello world', lang: 'en-US', gender: 'male', engine: 'neural' })
  }
)


In node-sonos-ts aber noch nicht:
sonos.PlayTTS({
    text: 'Someone at the front-door',
    lang: 'en-US',
    gender: 'male',
    volume: 50,
    endpoint: 'https://your.tts.endpoint/api/generate'
  })


VG Sebastian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: christian.71 am 25 Oktober 2021, 20:03:42
Zitat von: binford6000 am 25 Oktober 2021, 19:13:02
Korrekt!
In sonos-tts-polly bereits integriert

Dann ist es doch schon möglich die neurale Stimme von Vicki in fhem abzufragen? Oder ist die Anpassung in der node-sonos-ts wichtig dafür?
Sorry, aber irgendwie blick ich da nicht so richtig durch.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 05 Dezember 2021, 17:19:01
Hallo Otto,

hab mich länger nicht mit s2m beschäftigt, ich frage mich warum das Reading favlist bei mir nach einem get Favorites nicht geschrieben wird.
Der Zeitstempel ändert sich schon, es wird aber nicht die Liste in das Reading geschrieben, einfach nix, keine Fehlermeldung im Log.

99_sonos2mqttUtils.pm 24637 2021-06-15 14:19:41Z Otto123

defmod MQTT2_sonos_Bridge MQTT2_DEVICE mqttjs_a4b34a1c
attr MQTT2_sonos_Bridge IODev MQTT2_Server
attr MQTT2_sonos_Bridge bridgeRegexp sonos/(RINCON_[A-Z0-9]+)[:/].* "$1"
attr MQTT2_sonos_Bridge devStateIcon 0:10px-kreis-rot 1:10px-kreis-gelb 2:10px-kreis-gruen
attr MQTT2_sonos_Bridge devicetopic sonos
attr MQTT2_sonos_Bridge getList Favorites:noArg Favorites {sonos2mqtt($NAME,$EVENT)}\
Reply:Favorites,Radios,Playlists Reply {sonos2mqtt($NAME,$EVENT)}
attr MQTT2_sonos_Bridge group MQTT2_Bridges
attr MQTT2_sonos_Bridge icon mqtt_bridge_2
attr MQTT2_sonos_Bridge model sonos2mqtt_bridge
attr MQTT2_sonos_Bridge 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/connected:.* connected\
sonos/status/[^/]+/avtransport:.* {}\
sonos/status/[^/]+/renderingcontrol:.* {}
attr MQTT2_sonos_Bridge room MQTT2_DEVICE,Media
attr MQTT2_sonos_Bridge setList CheckSubscription:noArg $DEVICETOPIC/cmd/check-subscriptions\
PauseAll:noArg $DEVICETOPIC/cmd/pauseall\
announcementall:textField {sonos2mqtt($NAME,$EVENT)}\
notifyall:textField {sonos2mqtt($NAME,$EVENT)}
attr MQTT2_sonos_Bridge stateFormat connected
attr MQTT2_sonos_Bridge userReadings favlist:Favorites.* {sonos2mqtt_ur($name,'favlist')},\
grouplist:Favorites.* {sonos2mqtt_ur($name,'grouplist')},\
favRadios:Favorites.* {\
   my $json = ReadingsVal($name,'Favorites','{"Title":"none"}');;;;\
   $json =~ s/\s/./g;;;;\
   my $werte = json2nameValue($json,'','undef','Title');;  \
   my @a;;\
   while ( my ($key, $value) = each (%$werte)) {\
   push(@a,$value);;\
   }\
   return join ',',sort @a;;}

setstate MQTT2_sonos_Bridge 0
setstate MQTT2_sonos_Bridge 2021-12-05 17:06:44 Favorites {"Result":[{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s296020q.png","Title":"011.FM-NonStop60s","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/26","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://dtu8ldmaopof3.cloudfront.net/i/https:%2F%2Fderpimagecache.s3.amazonaws.com%2Fimage%2F475_288x162_2020-01-22-10-30-00-920.png_180.jpg","Title":"1A Deutsche Hits","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/41","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:rpde_svc_475?sid=232&flags=32&sn=4","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"1LIVE diggi","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/49","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s45087?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"AlbumArtUri":"http://dtu8ldmaopof3.cloudfront.net/i/https:%2F%2Fderpimagecache.s3.amazonaws.com%2Fimage%2F21_288x162_2018-12-18-16-03-52-837.png_180.jpg","Title":"ANTENNE THÜRINGEN","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/50","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:rpde_svc_21?sid=232&flags=32&sn=4","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://dtu8ldmaopof3.cloudfront.net/i/https:%2F%2Fderpimagecache.s3.amazonaws.com%2Fimage%2F1944_288x162_2019-02-12-13-40-09-357.png_640.jpg","Title":"COSMO Chillout","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/30","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s20295/images/logoq.png","Title":"DASDING","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/34","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s76488?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s84548/images/logoq.jpg","Title":"die neue welle 101.8 (Rock)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/39","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s84548?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s65628q.png","Title":"FM نجوم 100.6 (Arabisch)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/29","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s65628?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"Hitradio Ö3 99.9 (Österreichisch)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/37","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s8007?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"Hörbücher","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/32","ParentId":"FV:2","TrackUri":"x-rincon-playlist:RINCON_000E58F7F67C01400#S://192.168.188.26/OwnMusic/Hörbücher","ProtocolInfo":"x-rincon-playlist:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s228737/images/logoq.png?t=154228","Title":"NDR 2 Hamburg","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/43","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s228737?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s97066q.png","Title":"PsyRadio Chillout","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/15","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"Radio Regenbogen","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/52","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s272334?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"SWR4 Baden-Württemberg","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/48","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s20293?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"SWR4 Rheinland-Pfalz","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/47","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s1563?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"}],"NumberReturned":15,"TotalMatches":15,"UpdateID":7}
setstate MQTT2_sonos_Bridge 2021-12-05 10:53:11 IODev MQTT2_Server
setstate MQTT2_sonos_Bridge 2021-12-04 14:19:20 Radios {"Result":[{"Title":"011.FM - Non Stop 60s","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/27","ParentId":"R:0/0","TrackUri":"x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"1LIVE diggi (Top 40/Pop)","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/35","ParentId":"R:0/0","TrackUri":"x-sonosapi-stream:s45087?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"DASDING 92.5 (Euro-Hits)","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/33","ParentId":"R:0/0","TrackUri":"x-sonosapi-stream:s76488?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"die neue welle 101.8 (Rock)","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/40","ParentId":"R:0/0","TrackUri":"x-sonosapi-stream:s84548?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"Hitradio Ö3 99.9 (Österreichisch)","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/36","ParentId":"R:0/0","TrackUri":"x-sonosapi-stream:s8007?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"NDR 2","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/46","ParentId":"R:0/0","TrackUri":"x-sonosapi-stream:s228737?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"Nota Masria (Gemeinden)","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/23","ParentId":"R:0/0","TrackUri":"x-sonosapi-stream:s290159?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"PsyRadio Chillout","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/25","ParentId":"R:0/0","TrackUri":"x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"Radio Regenbogen","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/3","ParentId":"R:0/0","TrackUri":"x-sonosapi-stream:s272334?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"SWR4 Baden-Württemberg","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/5","ParentId":"R:0/0","TrackUri":"x-sonosapi-stream:s20293?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"SWR4 Rheinland-Pfalz","UpnpClass":"object.item.audioItem.audioBroadcast","ItemId":"R:0/0/1","ParentId":"R:0/0","TrackUri":"x-sonosapi-stream:s1563?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"}],"NumberReturned":11,"TotalMatches":11,"UpdateID":1}
setstate MQTT2_sonos_Bridge 2021-12-05 11:39:05 Reply {"Result":[{"AlbumArtUri":"http://192.168.188.23:1400/getaa?u=x-file-cifs:%2f%2f192.168.188.26%2fOwnMusic%2fBirdy%2fWings.mp3&v=475","Title":"Test","UpnpClass":"object.container.playlistContainer","ItemId":"SQ:2","ParentId":"SQ:","TrackUri":"file:///jffs/settings/savedqueues.rsq#2","ProtocolInfo":"file:*:audio/mpegurl:*"}],"NumberReturned":1,"TotalMatches":1,"UpdateID":0}
setstate MQTT2_sonos_Bridge 2021-05-19 13:06:55 attrTemplateVersion 20210303
setstate MQTT2_sonos_Bridge 2021-12-03 09:41:51 config_RINCON_000E58F7F67C01400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_000E58F7F67C01400/control","device":{"identifiers":["RINCON_000E58F7F67C01400"],"manufacturer":"Sonos","name":"Wohnzimmer"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_000E58F7F67C01400","name":"Wohnzimmer","state_topic":"sonos/RINCON_000E58F7F67C01400","unique_id":"sonos2mqtt_RINCON_000E58F7F67C01400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
setstate MQTT2_sonos_Bridge 2021-12-05 10:19:41 connected 0
setstate MQTT2_sonos_Bridge 2021-12-05 17:06:44 favRadios 011.FM-NonStop60s,1A.Deutsche.Hits,1LIVE.diggi,ANTENNE.THÜRINGEN,COSMO.Chillout,DASDING,FM.نجوم.100.6.(Arabisch),Hitradio.Ö3.99.9.(Österreichisch),Hörbücher,NDR.2.Hamburg,PsyRadio.Chillout,Radio.Regenbogen,SWR4.Baden-Württemberg,SWR4.Rheinland-Pfalz,die.neue.welle.101.8.(Rock)
setstate MQTT2_sonos_Bridge 2021-12-05 17:06:44 favlist
setstate MQTT2_sonos_Bridge 2021-12-05 17:06:44 grouplist Wohnzimmer,Wohnzimmer,Wohnzimmer


Wenn ich den Code aus sonos2mqtt_getList in der Kommandozeile ausführe wird mir die Liste zurückgegeben.

Siehst du oder wer anderes an was es liegen könnte ?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 05 Dezember 2021, 17:28:06
Favorites ist gefüllt. Und in den Playern müsste das Attribut setList um den Eintrag playFav: erweitert worden sein.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 05 Dezember 2021, 17:33:45
Nee, die setList ist auch nicht erweitert worden, da steht weiterhin der neue  :P dynamische playFav setter drin.

defmod Sonos_Wohnzimmer MQTT2_DEVICE RINCON_000E58F7F67C01400
attr Sonos_Wohnzimmer IODev MQTT2_Server
attr Sonos_Wohnzimmer comment {\
my $wpix = '250px';;\
my $groupname = ReadingsVal($name,'groupName','0');;\
my $sgroupname = (split(' ',ReadingsVal($name,'groupName','')))[0];;\
my $uuidtoname = (devspec2array('DEF='.ReadingsVal($name,'coordinatorUuid','0')))[0];;\
my $vol = ReadingsVal($name,'volume','');;\
my $img = ReadingsVal($name,'currentTrack_AlbumArtUri','');;\
my $mystate = $name eq $uuidtoname \
  ? ReadingsVal($name,'state','FEHLER') : ReadingsVal($uuidtoname,'state','');;\
my %stat2pic = (\
'PLAYING' => 'rc_PAUSE@red',\
'PAUSED_PLAYBACK' => 'rc_PLAY@green',\
'STOPPED' => 'rc_PLAY@green',\
'TRANSITIONING' => 'rc_PLAY@blue',\
'set_next' => 'rc_NEXT@blue',\
'set_previous' => 'rc_PREVIOUS@blue',\
'set_volumeUp' => 'rc_VOLUP@blue',\
'set_volumeDown' => 'rc_VOLDOWN@blue',\
'set_mute' => 'rc_MUTE@blue');;\
return my $playpic='rc_PLAY@yellow' if !$mystate;;\
$playpic = $stat2pic{$mystate};; \
my $mutecmd = ReadingsVal($name,'mute','0') eq 'false'?'true':'false';;\
my $mutepic = $mutecmd eq 'on'?'rc_MUTE':'rc_VOLUP';;\
my $show = 'FEHLER';;\
my $currentTrack_Artist = ReadingsVal($name,'currentTrack_Artist','FEHLER');;\
my $currentTrack_Title = ReadingsVal($name,'currentTrack_Title','FEHLER');;\
if ($currentTrack_Title =~ 'x-sonosapi-stream:'){$currentTrack_Title=''};;\
my $currentTrack = $mystate eq 'TRANSITIONING'\
  ? 'Puffern...' : $currentTrack_Artist.' - '.$currentTrack_Title;;\
my $nextTrack_Artist = ReadingsVal($name,'nextTrack_Artist','FEHLER');;\
my $nextTrack_Title = ReadingsVal($name,'nextTrack_Title','FEHLER');;\
my $nextTrack = $nextTrack_Artist.' - '.$nextTrack_Title;;\
my $previouspic = 'rc_PREVIOUS';;\
my $nextpic = 'rc_NEXT';;\
my $voldownpic = 'rc_VOLDOWN';;\
my $voluppic = 'rc_VOLUP';;\
my $leavegrouppic = 'rc_LEFT';;\
my $showlg = ReadingsVal($name,"name","0") ne $groupname ? "<a href=\"/fhem?cmd.dummy=set $name leaveGroup&XHR=1\">".FW_makeImage($leavegrouppic)."</a>" : "";;\
if (($mystate eq 'PLAYING')\
  || ($mystate eq 'TRANSITIONING' )\
  || ($mystate eq 'set_next' )\
  || ($mystate eq 'set_previous' )\
  || ($mystate eq 'set_volumeUp' )\
  || ($mystate eq 'set_volumeDown' )\
  || ($mystate eq 'set_mute' )) { \
    my $shownp = ReadingsVal($name,'name','') eq $sgroupname \
    ? "<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>\
       <a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>" : "";;  \
    $show = "$showlg <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>\
    <a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>\
    $shownp\
    <a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>\
    &nbsp;;&nbsp;;&nbsp;;&nbsp;;\
    <a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>";;\
  \
    if (ReadingsVal($name,'name','') eq $sgroupname) {\
      $show = ReadingsVal($name,'currentTrack_TrackUri','') =~ 'spdif'\
      ? 'TV': ReadingsVal($name,'enqueuedMetadata_UpnpClass','FEHLER') ne 'object.item.audioItem.audioBroadcast'\
      ? "$show<marquee style='width: $wpix'>Aktueller Track: $currentTrack<br>Nächster Track: $nextTrack</marquee>"\
      : "$show<marquee scrollamount='1' scrolldelay='1' style='width: $wpix'>Radio: $currentTrack</marquee>"\
    }\
    elsif (ReadingsVal($name,'name','') ne $groupname) {\
      $show = "$show Master: $sgroupname"}\
    }\
    else {\
      $show = $name eq $uuidtoname\
      ? "$showlg <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>"\
      : "$showlg <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a><br>Master: $sgroupname"\
    }\
  "<div>\
   <table>\
     <tr>\
       <td><div style='display: inline-block;; margin-right: 5px;; border: 1px solid lightgray;;\
              height: 4.00em;; width: 4.00em;; background-image: url($img);; background-size: contain;;'></div></td>\
       <td>$show</td>\
     </tr>\
   </table>\
   </div>"\
}\
\
011.FM-NonStop60s,1A.Deutsche.Hits,1LIVE.diggi.(Top.40/Pop),ANTENNE.THÜRINGEN,COSMO.Chillout,DASDING.92.5.(Euro-Hits),FM.نجوم.100.6.(Arabisch),Hitradio.Ö3.99.9.(Österreichisch),Hörbücher,NDR.2,PsyRadioChillout,SWR4.Baden-Württemberg,SWR4.Rheinland-Pfalz,die.neue.welle.101.8.(Rock)
attr Sonos_Wohnzimmer devStateIcon {\
my $wpix = '210px';;\
my $master = ReadingsVal($name,'Master',$name);;\
my $inGroup = ReadingsNum($name,'inGroup','0');;\
my $isMaster = ReadingsNum($name,'isMaster','0');;\
my $inCouple = ReadingsNum($name,'inCouple','0');;\
my $Input = ReadingsVal($name,'Input','');;\
my $cover = ReadingsVal($name,'currentTrack_AlbumArtUri','');;\
my $mutecmd = ReadingsVal($name,'mute','0') eq 'false'?'true':'false';;\
my $mystate = $isMaster ? Value($name) : Value((devspec2array('DEF='.ReadingsVal($name,'coordinatorUuid','0')))[0]);;\
my $playpic = $mystate eq 'PLAYING'\
  ? 'rc_PAUSE@red'    : $mystate eq 'PAUSED_PLAYBACK'\
  ? 'rc_PLAY@green'   : $mystate eq 'STOPPED'\
  ? 'rc_PLAY@green'   : $mystate eq 'TRANSITIONING'\
  ? 'rc_PLAY@blue'    : 'rc_PLAY@yellow';;\
my $mutepic = $mutecmd eq 'true'?'rc_MUTE':'rc_VOLUP';;\
my $line2 = '';;\
my $title = $mystate eq 'TRANSITIONING' ? 'Puffern...' : ReadingsVal($name,'enqueuedMetadata_Title','FEHLER');;\
my $linePic = ($inGroup and !$isMaster and !$inCouple) ? "<a href=\"/fhem?cmd.dummy=set $name leaveGroup&XHR=1\">".FW_makeImage('rc_LEFT')."</a>" : "";;\
if ($isMaster) {$linePic .= " <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>"};;\
   $linePic .= "&nbsp;;&nbsp"\
            ."<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage('rc_VOLDOWN')."</a>"\
            ."<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage('rc_PREVIOUS')."</a>"\
            ."<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage('rc_NEXT')."</a>"\
            ."<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage('rc_VOLUP')."</a>"\
            ."&nbsp;;&nbsp"\
            ."<a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a>";;\
if ($isMaster and $mystate eq 'PLAYING') {$line2 = $Input =~ /LineIn|TV/ ? $Input : "$title"}\
    elsif ($inGroup and !$isMaster or $inCouple) {$line2 .= $inCouple ? "Stereopaar":"Steuerung: $master"}\
my $style1 = 'display:inline-block;;margin-right:5px;;border:1px solid lightgray;;background-size:contain;;background-image:';;\
my $style2 ='background-repeat: no-repeat;; height:4.00em;;width:4.00em;;background-size: contain;; background-position: center center';;\
"<div><table>\
     <tr>\
       <td><div style='$style1 url($cover);;$style2'></div></td>\
       <td>$linePic<br><div>$line2</div></td>\
     </tr>\
  </table></div>"\
}
attr Sonos_Wohnzimmer event-on-change-reading .*
attr Sonos_Wohnzimmer group s2m
attr Sonos_Wohnzimmer icon audio_volume_low
attr Sonos_Wohnzimmer jsonMap volume_Master:volume mute_Master:mute transportState:state volume_LF:0 volume_RF:0 mute_LF:0 mute_RF:0 enqueuedMetadata_ItemId:0 enqueuedMetadata_ParentId:0 currentTrack_ItemId:0 currentTrack_ParentId:0 enqueuedMetadata_Title:playFav
attr Sonos_Wohnzimmer model sonos2mqtt_speaker
attr Sonos_Wohnzimmer readingList sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }\
sonos/RINCON_000E58F7F67C01400/error:.* { json2nameValue($EVENT) }\
sonos/RINCON_000E58F7F67C01400/sonosPlaylists:.* { json2nameValue($EVENT) }\
sonos/RINCON_000E58F7F67C01400/GetFavoritesReply:.* { json2nameValue($EVENT) }
attr Sonos_Wohnzimmer room MQTT2_DEVICE,Media
attr Sonos_Wohnzimmer setList sleep:slider,0,1,60,1 sonos/RINCON_000E58F7F67C01400/control {  "command": "sleep",  "input": $EVTPART1}\
stop:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "stop" }\
play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
pause:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "pause" }\
toggle:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "toggle" }\
volumeDown:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumedown" }\
volumeUp:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "volumeup" }\
volume:slider,0,1,100,5 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
mute:noArg { my $value = ReadingsVal($NAME,'mute','false') eq "true" ? "unmute" : "mute";; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
joinGroup:textField sonos/RINCON_000E58F7F67C01400/control { "command": "joingroup",  "input": "$EVTPART1"}\
leaveGroup:noArg { my $value = ReadingsVal("RINCON_000E58F7F67C01400","groupName","all");; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "leavegroup",  "input": "$value" } ) }\
setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
  playUri:textField {fhem("set $NAME setAVTUri $EVTPART1;; sleep 1;; set $NAME play")}\
  input:Queue { my $value = $EVTPART1 eq "TV" ? "tv" : $EVTPART1 eq "Line_In" ? "line" : "queue";; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "switchto$value" } ) }\
  notify:textField sonos/RINCON_000E58F7F67C01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":11,"volume":$EVTPART1,"delayMs":700}}\
  x_raw_payload:textField { my $payload = $EVENT;;$payload =~ s/$EVTPART0 //g;; qq(sonos/RINCON_000E58F7F67C01400/control $payload)}\
  speak:textField { my $tts="SonosTTS";;my ($cmd,$vol,$text)=split(' ', $EVENT,3);;fhem("set $tts tts $text;;sleep $tts:playing:.0 ;;set $NAME notify $vol [$tts:httpName]")}\
playF:011.FM-NonStop60s,1A.Deutsche.Hits,1LIVE.diggi.(Top.40/Pop),ANTENNE.THÜRINGEN,COSMO.Chillout,DASDING.92.5.(Euro-Hits),FM.نجوم.100.6.(Arabisch),Hitradio.Ö3.99.9.(Österreichisch),Hörbücher,NDR.2,PsyRadioChillout,SWR4.Baden-Württemberg,SWR4.Rheinland-Pfalz,die.neue.welle.101.8.(Rock) {use JSON;;use HTML::Entities;;use Encode qw(encode decode);;my $enc = 'UTF8';;my $uri='';;my $search=(split(' ', $EVENT,2))[1];;$search=~s/[\/()]/./g;;my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;my $read='Favorites';;my $decoded = decode_json(ReadingsVal($dev,$read,''));;my @arr=@{$decoded->{'Result'}};;foreach (@arr) {if (encode($enc, decode_entities($_->{'Title'}))=~/$search/i){$uri = $_->{'TrackUri'} }};;fhem("set $NAME playUri $uri") if ($uri ne '')}\
  playFav:{ReadingsVal('MQTT2_sonos_Bridge','favRadios','RPR1')} {use JSON;;use HTML::Entities;;use Encode qw(encode decode);;my $enc = 'UTF8';;my $uri='';;my $search=(split(' ', $EVENT,2))[1];;$search=~s/[\/()]/./g;;my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;my $read='Favorites';;my $decoded = decode_json(ReadingsVal($dev,$read,''));;my @arr=@{$decoded->{'Result'}};;foreach (@arr) {if (encode($enc, decode_entities($_->{'Title'}))=~/$search/i){$uri = $_->{'TrackUri'} }};;fhem("set $NAME playUri $uri") if ($uri ne '')}\
  toggleRadio:noArg {my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;my $r=Each($dev,ReadingsVal($dev,'favRadios',''));;my $tts="SonosTTS";;fhem("set $tts tts Es folgt $r;;sleep $tts:playing:.0;;set $NAME playUri [$tts:httpName];;sleep $NAME:play;;sleep $NAME:PLAYING;;sleep $NAME:STOPPED;;set $NAME playFav $r")}\
  playSound:textField {my $tts="SonosTTS";;my ($cmd,$vol,$file)=split(' ', $EVENT,3);;$file=($file=~m/\.mp3$/)?"$file":"$file.mp3";;fhem("set $NAME notify $vol http://[$tts:host]/fhem/cache/Toene/$file")}\
  sayText:textField { my $tts=ReadingsVal('SonosBridge','tts','SonosTTS');;my ($cmd,$text)=split(' ', $EVENT,2);;fhem("setreading $tts text ".ReadingsVal($tts,'text',' ').' '.$text.";;sleep 0.4 tts;;set $tts tts [$tts:text];;sleep $tts:playing:.0 ;;set $NAME notify [$tts:vol] [$tts:httpName];;deletereading $tts text")}
attr Sonos_Wohnzimmer 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.* {my $currentTrack_TrackUri = ReadingsVal($name,'currentTrack_TrackUri','');;\
   $currentTrack_TrackUri =~ 'x-rincon-stream'\
      ? 'LineIn': $currentTrack_TrackUri =~ 'spdif'\
      ? 'TV'    : ReadingsVal($name,'enqueuedMetadata_UpnpClass','') eq 'object.item.audioItem.audioBroadcast'\
      ? 'Radio' : 'Playlist'}
attr Sonos_Wohnzimmer verbose 2
attr Sonos_Wohnzimmer webCmd volume:playFav
attr Sonos_Wohnzimmer webCmdLabel Lautstärke\
:Favoriten

setstate Sonos_Wohnzimmer PLAYING
setstate Sonos_Wohnzimmer 2021-12-05 10:18:24 IODev MQTT2_Server
setstate Sonos_Wohnzimmer 2021-12-05 15:05:58 Input Radio
setstate Sonos_Wohnzimmer 2021-12-04 13:08:33 Master Wohnzimmer
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 bass 2
setstate Sonos_Wohnzimmer 2021-12-05 14:35:38 command play
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 coordinatorUuid RINCON_000E58F7F67C01400
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 currentTrack_AlbumArtUri http://192.168.188.23:1400/getaa?s=1&u=x-sonosapi-stream:s97066%3fsid%3d254%26flags%3d8224%26sn%3d0
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 currentTrack_Artist Saafi Brothers
setstate Sonos_Wohnzimmer 2021-12-05 15:05:57 currentTrack_Duration 0:00:00
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 currentTrack_ProtocolInfo sonos.com-http:*:*:*
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 currentTrack_Title Something Outside
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 currentTrack_TrackUri x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 currentTrack_UpnpClass object.item
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate Sonos_Wohnzimmer 2021-12-05 14:35:38 error_Action Play
setstate Sonos_Wohnzimmer 2021-12-05 14:35:38 error_Fault UPnPError
setstate Sonos_Wohnzimmer 2021-12-05 14:35:38 error_FaultCode s:Client
setstate Sonos_Wohnzimmer 2021-12-05 14:35:38 error_UpnpErrorCode 701
setstate Sonos_Wohnzimmer 2021-12-05 14:35:38 error_name SonosError
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 groupName Wohnzimmer
setstate Sonos_Wohnzimmer 2021-12-04 13:08:33 inCouple 0
setstate Sonos_Wohnzimmer 2021-12-04 13:08:33 inGroup 0
setstate Sonos_Wohnzimmer 2021-12-04 13:08:33 isMaster 1
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 mute false
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 name Wohnzimmer
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 playFav PsyRadio Chillout
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 playmode NORMAL
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 state PLAYING
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 treble -1
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 ts 1638721760434
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 uuid RINCON_000E58F7F67C01400
setstate Sonos_Wohnzimmer 2021-12-05 17:29:20 volume 10
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 Dezember 2021, 17:52:20
Hallo Tom,

in der letzten Variante hatte ich mich auf die Variante direkt auszulesen konzentriert. Die playFav musste so erzeugt werden:
https://wiki.fhem.de/wiki/Sonos2mqtt#Player_mit_Favoritenliste_und_Gruppenliste_ausstatten

Ich habe die Änderungen bez. setList schon mitbekommen, habe bloß noch keine Muße gefunden mich damit zubeschäftigen.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 05 Dezember 2021, 18:33:59
Du verlinkst wie der setter gesetzt wird darum gehts mir aber gar nicht und war nicht meine Frage, ich frage mich warum das userReading favlist in der Bridge nicht geschrieben wird.

Meinem Verständnis nach wird erst
sonos2mqtt_ur($name,'favlist')
ausgeführt, dort wird wieder
sonos2mqtt_getList ($name,'Favorites')
aufgerufen und es sollte die Liste im Reading favlist zurückgegeben werden.

Den Code in sonos2mqtt_getList hab ich ja geschrieben, hab ich in der Kommandozeile getestet und die Liste wird mir zurückgegeben.
Wo ist der Denkfehler.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 05 Dezember 2021, 18:48:53
Zitat von: Otto123 am 05 Dezember 2021, 17:52:20

Ich habe die Änderungen bez. setList schon mitbekommen, habe bloß noch keine Muße gefunden mich damit zubeschäftigen.

Gruß Otto

Im Prinzip macht man aus

{sonos2mqtt_mod_list('a:model=sonos2mqtt_speaker','setList','playFav:'.ReadingsVal((devspec2array('a:model=sonos2mqtt_bridge'))[0],'favlist','').q( {sonos2mqtt($NAME,$EVENT)}))}

nur

{sonos2mqtt_mod_list('a:model=sonos2mqtt_speaker','setList','playFav:'.q({ReadingsVal((devspec2array('a:model=sonos2mqtt_bridge'))[0],'favlist','')} {sonos2mqtt($NAME,$EVENT)}))}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 Dezember 2021, 19:06:50
ich weiß es nicht mehr. der _ur Aufruf liefert nichts zurück. Einfach eine Runde auslassen und den _getlist Aufruf in das userReadings setzen?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 05 Dezember 2021, 19:10:29
So versteh ich es.

edit:

und klappt es auch, aber irgendwas umgeht man doch, weil du dir dabei dich was gedacht haben musst, ich sehe es noch nicht.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 Dezember 2021, 22:02:16
ich habe es vielleicht bloß zur Rückwärtskompatibilät eingebaut und nicht alles bedacht?

Ich weiß ich muss da nochmal ran. ;)
Titel: FHEM resigniert
Beitrag von: marwal am 21 Januar 2022, 18:03:53
Hab gerade die npm Module installiert und seither klappt bei mir keine HUE-Schaltung mehr. Der FHEM-Server läuft und Homematic funktioniert auch, aber werder hue-bridge als auch conbee-bridge senden noch signale.  :(
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 21 Januar 2022, 21:44:33
Tut mir leid, ich kann da erstmal keinen Zusammenhang erkennen. Und zum weiteren Nachdenken fehlen mir Informationen
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: marwal am 22 Januar 2022, 10:30:14
Danke für die schnelle Antwort Otto, es lag nicht am Modul, zumindest nicht an diesem. Hatte kurz zuvor ein update gemacht u.a. für 30_HUEBridge und 31_HUEDevice ... nach einem restore klappt alles erstmal wieder.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: IBirner am 22 Januar 2022, 15:18:07
Hallo Zusammen,
nutze seit gestern auch sonos2mqtt, da das SONOS.pm bei mir zuviel Probleme bereitet :(
Leider habe ich so meine Schwierigkeiten, z.B. bei Sprachnachrichten...
Sowohl bei den Einzelplayern, als auch bei Ansage an alle Speaker:
- "set player speak": mp3-File wird angelegt und kann über PlayUri abgespielt werden (heisst für mich, Zugriff sollte kein Problem sein). Nur automatisch funktioniert es nicht.
- ähnlich bei "set bridge anouncementall": mp3-File wird angelegt und ich sehe in den mqtt-daten die korrekten Befehle.
- auf "set bridge pauseall"  reagieren die Speaker.

Bin ratlos... Vielen Dank für einen Hinweis.


### mqtt Rohdaten für announcement
sonos/cmd/notify {"trackUri":"http://mirror:8083/fhem/cache/15905f5936ee31a1df94bb5156e1d566.mp3","onlyWhenPlaying":false,"timeout":100,"volume":10,"delayMs":700}

### mqtt Rohdaten für pauseall
sonos/cmd/pauseall (null)

### mqtt Rohdaten für set speaker speak 33 test
sonos/RINCON_8676573265/control { "command":"notify","input":{"trackUri":"http://mirror:8083/fhem/cache/832ef86c494075ffffbcbe745e11519b.mp3","onlyWhenPlaying":false,"timeout":100,"volume":33,"delayMs":700}}


Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 22 Januar 2022, 17:26:34
Hi,

bin ich auch ratlos. Funktionieren Deine json oder die Beispiele von hier  (https://svrooij.io/sonos2mqtt/control/notifications.html#play-a-mp3)über x_raw_payload?
{
  "command": "notify",
  "input": {
    "trackUri": "https://cdn.smartersoft-group.com/various/pull-bell-short.mp3",
    "onlyWhenPlaying": false,
    "timeout": 10,
    "volume": 8,
    "delayMs": 700
  }
}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: IBirner am 22 Januar 2022, 18:12:12
Hi,
danke für die schnelle Antwort.

Über Mosquitto sehe ich folgendes bei "x_raw_payload {...}"
sonos/RINCON_347E5CC/control { "command": "notify", "input": { "trackUri": "https://cdn.smartersoft-group.com/various/pull-bell-short.mp3", "onlyWhenPlaying": false, "timeout": 10, "volume": 8, "delayMs": 700 } }

Über Mosquitto sehe ich folgendes bei "notify 10 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3"
sonos/RINCON_347E5CC/control { "command":"notify","input":{"trackUri":"https://cdn.smartersoft-group.com/various/pull-bell-short.mp3","onlyWhenPlaying":false,"timeout":100,"volume":10,"delayMs":700}}

Also identisch und beide leider ohne Output am Player... Play/Stop am gleichen Player sind iO :(

Viele Grüße,
Ingo
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: IBirner am 22 Januar 2022, 18:42:03
Update:
- ich sehe gerade, dass n_configSonos1 und n_configSonos2 nicht automatisch angelegt wurden
- n_configSonos1 konnt ich anlegen
- bei n_configSonos2 bekomme ich folgenden Fehler: Experimental aliasing via reference not enabled at (eval 6731) line 1

Kann es evtl. damit zusammenhängen?

Besten Dank!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 22 Januar 2022, 19:03:44
Woher nimmst Du jetzt diese Information zu n_configSonos1 und n_configSonos2?
Die Konfiguration der Player nach dem autocreate erfolgt mit n_configSonos. Wenn Du da jetzt was angelegt hast, ist das wahrscheinlich störend.

Welche Version sonos2mqtt hast Du denn installiert? Nach welcher Anleitung bist Du vorgegangen?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: IBirner am 22 Januar 2022, 23:15:54
nach deiner Anleitung :)
https://heinz-otto.blogspot.com/2020/05/sonos2mqtt-so-weit-bin-ich.html => Was passiert im Hintergrund?
Die zwei Notifys habe ich erst nach den ganzen Versuchen angelegt...
n_configSonos ist vorhanden und scheint zu funktionieren.

die sonos2mqtt Version ist die 3.1.2 (sollte die aktuelle sein)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 22 Januar 2022, 23:28:29
Zitat von: IBirner am 22 Januar 2022, 23:15:54
nach deiner Anleitung :)
Aber da steht ein gaaanz wichtiger erster Satz: Ich habe derzeit die aktuellste Anleitung ins FHEM Wiki geschrieben, aufgeteilt in 2 Artikel.
Hier geht es los: https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Sonos2Mqtt

Ich habe trotzdem keine Vorstellung was bei Dir schief läuft. Die mqtt Befehle sehen richtig aus. Du sagst das Gleiche per playUri funktioniert. Das bedeutet ja nur die notify Funktion geht nicht.

Wie ist sonos2mqtt installiert? docker? als nodejs Modul? Kommst Du an die Logs? Steht da was wenn Du den notify Befehl absetzt?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: IBirner am 23 Januar 2022, 12:00:15
Danke - ich habe alles gelöscht und starte nochmal von vorne. Speak hat mal funktioniert - allerdings nur auf einem Player.
System läuft als nodejs Modul... Wo finde ich die Logs?

Im fhem log sehe ich folgende Fehlermeldung beim Neustart
[PM2][Initialization] Environment variable HOME (Linux) or HOMEPATH (Windows) are not set!
[PM2][Initialization] Defaulting to /etc/.pm2
internal/fs/utils.js:332
    throw err;
    ^

Error: ENOENT: no such file or directory, open '/etc/.pm2/pm2.log'
    at Object.openSync (fs.js:497:3)
    at module.exports.Client.launchDaemon (/usr/lib/node_modules/pm2/lib/Client.js:228:12)
    at /usr/lib/node_modules/pm2/lib/Client.js:104:10
    at /usr/lib/node_modules/pm2/lib/Client.js:321:14
    at processTicksAndRejections (internal/process/task_queues.js:77:11)
    at runNextTicks (internal/process/task_queues.js:64:3)
    at listOnTimeout (internal/timers.js:526:9)
    at processTimers (internal/timers.js:500:7) {
  errno: -2,
  syscall: 'open',
  code: 'ENOENT',
  path: '/etc/.pm2/pm2.log'
}

Noch eine Frage zur Doku. Du schreibst Achtung dieser Code muss "am Block" in der Raw Def ausgeführt werden!
Du meinst Folgendes: define SonosBridge MQTT2_DEVICE ... Hier fehlt aber meines Erachtens noch "IODev", oder?
Ich habe die per Hand in die Kommandozeile eingegeben - kann es daran liegen?

Thx again
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 23 Januar 2022, 12:47:52
Zum Hinweis im Wiki define ... Danke ich habe es korrigiert. Da war noch alter Text drin, mittlerweile braucht man das attr IODev nicht mehr setzen.
Zum Fehler pm2 - keine Ahnung was da passiert. Mit Sicherheit läuft da was schief.
Ich habe es ewig nicht mehr so gemacht, ich verwende immer den docker Container. Diese nodejs Zeugs ist aus meiner Sicht der Untergang ...
Hier im Thread im ersten Beitrag ist noch der Start des sonos2mqtt nodejs Moduls zum Test beschrieben, das solltes Du unbedingt ausführen.

Achtung: man dann den nodejs Kram mehr als einmal starten unter mehreren Usern, in unterschiedlichen Pfaden. Alle Anleitungen dort ändern sich quasi mit jeder Version, deswegen habe ich das nicht Schritt für Schritt nochmal beschrieben.
Versuch das also mal im System zum laufen zubekommen.
pm2 bietet die Logs im Dialog auf Systemebene, dazu habe ich mal ein bisschen was aufgeschrieben https://heinz-otto.blogspot.com/2019/05/worx-landroid-m500.html
Bei sonos2mqtt lief das eigentlich stressfrei da brauchte ich das nicht :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: IBirner am 23 Januar 2022, 18:58:54
Ich glaube, ich habe das Problem gefunden :)
Wenn ich sonos2mqtt wie folgt ueber SSH starte, dann läuft es: pm2 start sonos2mqtt.
Das notify für Fhem habe ich nicht mehr angelegt... Mal sehen, wie stabil es laufen wird!
Danke für die Unterstützung.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 23 Januar 2022, 19:59:48
einen automatischen Start für pm2 musst Du aber dann noch einrichten:
https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Autostart_von_sonos2mqtt_im_System_mit_pm2_.28Alternative.29
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: christian.71 am 07 Februar 2022, 15:55:33
Stephan hat ja nun die Sonos2Mqtt so angepasst, dass man die neuralen Stimmen verwenden kann. siehe: https://github.com/svrooij/sonos2mqtt/issues/155
Nur, wie lautet nun der Befehl in Fhem? Muss da evtl. im Modul noch was angepasst werden?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 07 Februar 2022, 19:13:56
ich kann einen neuen Syntax nicht erkennen, gehe aber davon aus: er unterscheidet sich nicht?
Im speak Befehl ist die automatische Verwendung von sonos-tts ja implementiert (sonos-tts muss separat eingerichtet sein --ttsendpoint über den Start von sonos2mqtt setzen) , also einfach testen und sagen wenn es nicht geht.
Notfalls den (neuen?) Syntax mit x_raw_payload testen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 08 Februar 2022, 11:51:37
Gerade nochmal probiert, das klappt doch aber schon lange? - Vicki ist ja die einzige Deutsche: https://docs.aws.amazon.com/de_de/polly/latest/dg/ntts-voices-main.html
set alias=Arbeitszimmer speak de-DE Vicki 25 Test

Der Code ist quasi direkt aus dem Wiki und steht dort seit - knapp einem Jahr?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 08 Februar 2022, 11:58:28
AFAIK nutzt Vicky nicht zwingend die neurale Ausgabe, sondern Vicky kann _auch_ die neurale Ausgabe. Dafür muss man eigentlich im Befehl extra die neurale Engine auswählen (https://docs.aws.amazon.com/de_de/polly/latest/dg/NTTS-main.html).

Also muss man jetzt sowas übergeben:

{
  "command":"speak",
  "input": {
    "text": "Someone at the front-door",
    "endpoint": "https://your.tts.endpoint/api/generate",
    "lang": "en-US",
    "gender": "male",
    "name": "Salli",
    "volume": 50,
    "onlyWhenPlaying": false,
    "delayMs": 700
    "engine": "neural"
  }
}


Was aber laut https://github.com/svrooij/sonos2mqtt/issues/155#issuecomment-1031829261 nicht funktioniert.
Insofern macht es IMO noch keinen Sinn dies in das speak-alias zu übernehmen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: christian.71 am 08 Februar 2022, 12:10:20
Zitat von: kjmEjfu am 08 Februar 2022, 11:58:28
AFAIK nutzt Vicky nicht zwingend die neurale Ausgabe, sondern Vicky kann _auch_ die neurale Ausgabe. Dafür muss man eigentlich im Befehl extra die neurale Engine auswählen (https://docs.aws.amazon.com/de_de/polly/latest/dg/NTTS-main.html).

Genau so sehe ich das auch. Auf der Seite https://eu-west-1.console.aws.amazon.com/polly/home/SynthesizeSpeech kann man sich auch die Unterschiede von den Standard und Neuralen Stimmen anhören. In deutsch geht das im Moment nur bei Vicki.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 08 Februar 2022, 12:57:26
ok engine neural geht nicht. Ich teste mit Stephan gehosteten sonos-tts, meine sonos Container ist gestern aktualisiert.

Ansonsten kann man so etwas wie gesagt jederzeit testen, man beachte noch männlich / weiblich. ;D ;D ;D
Einfach in x_raw_payload werfen
{
  "command":"speak",
  "input": {
    "text": "Someone at the front-door",
    "lang": "en-US",
    "gender": "female",
    "name": "Salli",
    "volume": 50,
    "onlyWhenPlaying": false,
    "delayMs": 700
  }
}
Wenn es denn geht, kann ich neural noch einbauen. Ich bin nicht so der Computerstimmen Fetischist, ich komme mit der Standard Googletante klar  ;D
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: christian.71 am 19 Februar 2022, 15:07:04
Ich habe nun noch ein wenig rumprobiert und festgestellt, dass der payload nun doch mit den verschiedenen Stimmen funktioniert. Mein Fehler war nur, dass ich den cache nicht gelöscht hatte. Wenn der Cache nicht gelöscht wird und der gleiche Satz soll nochmals wiedergegeben werden, dann nimmt er das mp3 vom cache.

@ Otto Wenn du beim speak Befehl also noch eine Abfrage der engine (neural oder standard) einbauen könntest, wäre das super.  :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 20 Februar 2022, 10:01:48
cache? Von welcher Methode sprichst Du? Mit FHEM TTS oder sonos-tts? Beim FHEM TTS ist mir das mit dem cache klar, bei sonos-tts wusste ich nicht, dass es einen cache gibt?
Ich finde den speak Befehl so schon reichlich kompliziert, ich finde wenn sollte man das vielleicht einfach irgendwie einstellbar machen? Oder wechselt man bei jeder Ansage die Stimme?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: christian.71 am 20 Februar 2022, 11:39:34
Zitat von: Otto123 am 20 Februar 2022, 10:01:48
cache? Von welcher Methode sprichst Du? Mit FHEM TTS oder sonos-tts? Beim FHEM TTS ist mir das mit dem cache klar, bei sonos-tts wusste ich nicht, dass es einen cache gibt?
Ich finde den speak Befehl so schon reichlich kompliziert, ich finde wenn sollte man das vielleicht einfach irgendwie einstellbar machen? Oder wechselt man bei jeder Ansage die Stimme?

Ich spreche von sonos-tts. Ich nutze docker und habe dort bei den environment einen "SONOS_TTS_CACHE_URI" eingetragen. Ich weiß nicht, ob das nötig ist.
Da es nur bei der deutschen Stimme von Vicki auswählbar ist, wäre evtl. eine if-Abfrage denkbar. Aber da bin ich nicht fit genug. Da ich nur die Stimme von Vicki nutze, habe ich für mich die eine Zeile 137 in 99_sonos2mqttUtils.pm geändert in: return sprintf('%s {"command":"speak","input":{"lang": "%s", "name":"%s", "volume":%s, "text": "%s", "engine": "neural", "delayMs":700}}', $topic, $lang, $voice, $volume, join(" ", @text));
Somit ist aber nur noch die Stimme von Vicki nutzbar. Aber ich brauchte meine doif´s nicht ändern. ;-)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: m8ichael am 12 März 2022, 10:32:17
Hallo zusammen,

ich habe seit kurzem (seit einem SONOS-Firmware-Update) mit dem Modul das Problem, dass keine Sonos-Gruppen mehr gebildet werden können - seltsamerweise funktioniert das Auflösen von Gruppen, aber eben nicht (mehr) das Bilden von Gruppen. Ist dies ein generelles Problem? Oder bestehen bei euch derartige Probleme nicht?

Viele Grüße

Michael
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: christian.71 am 12 März 2022, 10:41:22
Hallo Michael,

Ich habe das gerade mal bei mir getestet. Wenn du das joinGroup und leaveGroup meinst, das funktioniert bei mir noch. Mein Sonos Controller hat die Version 14.4
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: m8ichael am 12 März 2022, 10:53:21
Hallo Chriatian,

Zitat von: christian.71 am 12 März 2022, 10:41:22
Ich habe das gerade mal bei mir getestet. Wenn du das joinGroup und leaveGroup meinst, das funktioniert bei mir noch. Mein Sonos Controller hat die Version 14.4

Ja, genau die beiden Befehle meine ich. leaveGroup funktioniert bei mir, allerdings nicht (mehr) joinGroup. In meiner App (Android) steht noch 14.3, aber dann dürfte ich wohl seitens der Firmware auf dem gleichen Stand sein...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 12 März 2022, 11:26:42
joinGroup geht ja ziemlich direkt einfach an den sonos2mqtt Dienst. Hast Du weitere Infos? Logeinträge? Haben die Gruppen Umlaute oder Leerzeichen?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 25 März 2022, 20:00:31
Hallo Otto,

ich habe mal vor knapp 1,5 Jahrem dieses sonos2mqtt installiert, abr seither nix mehr damit gemacht. Aktuell schalte ich lediglich einen Sonos über ein Zigbee Device ein und kann die Laustärke ändern.

Wahrscheinlich hat sich das Projekt weiterentwickelt und es sind neue Funktionen hinzugekommen. Meine Version ist:
node /usr/lib/node_modules/sonos2mqtt --version
3.1.1


Kann man das System über einen einfachen Befehl auf den neusten Stand bringen, oder muss man die komplette Installation erneut durchführen? Sorry, dass ich so blöd frage, habe von diesem nodejs keinen Plan. Das Ganze läuft auf einem Debian 10.

Danke und Gruß,
Spartacus.

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 25 März 2022, 20:13:12
Hallo Spartacus,

ob da entscheidende Dinge dazugekommen sind? https://github.com/svrooij/sonos2mqtt/releases ich glaube eigentlich nicht ...

Ich denke mit einem sudo npm install -g sonos2mqtt installiert er die neue Version - aber garantieren kann ich das nicht. Ich mag das node Zeugs nicht besonders und betreibe das deswegen gerne im docker container.
In der sonos2utils hab ich voriges Jahr im Juni mal noch was angepasst.

Aktuelle steht noch eine Überarbeitung wegen der neuralen Stimmen an, da bin ich aber noch nicht weiter gekommen.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 25 März 2022, 21:20:50
Hallo Otto,

ja, danke dir, das hat funktioniert. die sonos2utils wird doch sicherlich mit dem fhem update aktualisiert, oder?

Spartacus.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 25 März 2022, 21:24:10
nein, die liegt im contrib Ordner. Musst Du so per Hand aktualisieren:
{ Svn_GetFile("contrib/AttrTemplate/99_sonos2mqttUtils.pm", "FHEM/99_sonos2mqttUtils.pm", sub(){ CommandReload(undef, "99_sonos2mqttUtils") }) }
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 25 März 2022, 21:26:44
Hi Otto,

ah, ok! Ich danke dir. Die Warnings sind normal?

2022.03.25 21:24:55 1: SVN download of contrib/AttrTemplate/99_sonos2mqttUtils.pm to FHEM/99_sonos2mqttUtils.pm finished
2022.03.25 21:24:55 1: PERL WARNING: Subroutine sonos2mqttUtils_Initialize redefined at ./FHEM/99_sonos2mqttUtils.pm line 14.
2022.03.25 21:24:55 1: PERL WARNING: Subroutine sonos2mqtt redefined at ./FHEM/99_sonos2mqttUtils.pm line 22.
2022.03.25 21:24:55 1: PERL WARNING: Subroutine sonos2mqtt_searchList redefined at ./FHEM/99_sonos2mqttUtils.pm line 172.
2022.03.25 21:24:55 1: PERL WARNING: Subroutine sonos2mqtt_devStateIcon redefined at ./FHEM/99_sonos2mqttUtils.pm line 196.
2022.03.25 21:24:55 1: PERL WARNING: Subroutine sonos2mqtt_mod_list redefined at ./FHEM/99_sonos2mqttUtils.pm line 239.
2022.03.25 21:24:55 1: PERL WARNING: Subroutine sonos2mqtt_setup redefined at ./FHEM/99_sonos2mqttUtils.pm line 256.
2022.03.25 21:24:55 1: PERL WARNING: Subroutine sonos2mqtt_nty redefined at ./FHEM/99_sonos2mqttUtils.pm line 301.
2022.03.25 21:24:55 1: PERL WARNING: Subroutine sonos2mqtt_ur redefined at ./FHEM/99_sonos2mqttUtils.pm line 325.
2022.03.25 21:24:55 1: PERL WARNING: Subroutine sonos2mqtt_getList redefined at ./FHEM/99_sonos2mqttUtils.pm line 354.

Spartacus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 25 März 2022, 22:10:40
die zeigen an, dass durch das reload die Funktionen neu definiert wurden. Hat man immer bei einem reload xx.pm
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 25 März 2022, 22:15:06
Supi, danke dir. Ich habe im Post #1070  gesehen, dass du den Sleeptimer eingebaut hast. Den kann ich auch nach der Installation der neuen Utils nicht ansprechen. Die Bridge kennt  auch den Befehl "get SonosBridge listalarms " noch nicht. Irgendeine Idee?

Spartacus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 25 März 2022, 22:16:56
Hat sich erledigt, jetzt sind die Befehle da....
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 25 März 2022, 22:39:03
Hi,

sorry, eine Sache habe ich noch nicht verstanden. Wie stelle ich den Sleeptimer jetzt ein? Im Frontend habe ich den Befehl snoozeAlarm, aber wenn ich den jetzt setzte,
set MQTT2_RINCON_000E58F084FC01400 snoozeAlarm 00:05:00
dann bleibt SnoozeRunnung auf false.

Muss ich da vorher noch etwas in der Bridge konfigurieren?

Spartacus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 25 März 2022, 23:48:28
snoozeAlarm ist ja den Alarm/Wecker pausieren.
sleepTimer/Schlummer geht über
set alias=Wohnzimmer sleep 15
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: australien am 26 März 2022, 09:49:16
Hallo Otto123,

ich hatte jetzt auch nach langer Zeit das Update durchgeführt, die bridge und den player.
Nur wie komme ich nun wieder an die Favoriten? Ehemals playfav? Diese werden nicht automatisch in die setList geladen.

Danke
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 26 März 2022, 11:11:58
Da ist ein bug in der sonos2mqttutils.
Die Zeile 339 muss um ein return ergänzt werden:
return sonos2mqtt_getList ($name,'Favorites')
Ich baue das im svn später noch ein, ich will noch etwas anderes prüfen.
Könntest Du über edit files auf die Schnelle nachrüsten :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: australien am 26 März 2022, 11:34:45
Super!
Danke für die rasche Lösung!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 19 April 2022, 12:29:02
Hallo zusammen, seit gerade bin ich dann auch dabei :-) Vielen dank für die tolle Vorarbeit.

sonos2mqtt habe ich als Docker Container und die ersten Devices sind nun auch schon ins FHEM gerutscht.

Nun habe ich eine Sonos Base, die bereits erscheint, aber der Sub und die hinteren Sonos 1 Lautsprecher tauchen noch nicht auf.
Kann mir da jemand das Zauberwort nennen, damit die fehlenden Lautsprecher auch erzeugt werden?

EDIT: okay, hier habe ich die Antwort (https://forum.fhem.de/index.php/topic,111711.msg1143965.html#msg1143965) gefunden, falls es da noch nichts neueres zu gibt.

Ich verwende das sonos2mqtt_bridge_comfort template.

Gruß
   Christian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 19 April 2022, 12:36:25
Zitat von: ch.eick am 19 April 2022, 12:29:02
Hallo zusammen, seit gerade bin ich dann auch dabei :-) Vielen dank für die tolle Vorarbeit.

sonos2mqtt habe ich als Docker Container und die ersten Devices sind nun auch schon ins FHEM gerutscht.

Nun habe ich eine Sonos Base, die bereits erscheint, aber der Sub und die hinteren Sonos 1 Lautsprecher tauchen noch nicht auf.
Kann mir da jemand das Zauberwort nennen, damit die fehlenden Lautsprecher auch erzeugt werden?
Ich verwende das sonos2mqtt_bridge_comfort template.

Gruß
   Christian

Ich habe eine Beam mit Sub und 2x One als "Surround-Quartett"  - es wird aber nur die Beam als Device angelegt.
Genügt ja eigentlich auch oder dröselst du die Surround Speaker immer mal wieder auf? Wenn du das machst müssten
zumindest die Sourround Speaker als Geräte auftauchen...

VG Sebastian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 19 April 2022, 12:47:17
Zitat von: binford6000 am 19 April 2022, 12:36:25
Ich habe eine Beam mit Sub und 2x One als "Surround-Quartett"  - es wird aber nur die Beam als Device angelegt.
Genügt ja eigentlich auch oder dröselst du die Surround Speaker immer mal wieder auf? Wenn du das machst müssten
zumindest die Sourround Speaker als Geräte auftauchen...

VG Sebastian
Hi Sebastian,
danke für die Rückmeldung, das hatte ich unter dem Link auch schon gelesen. Es war halt nur anders als bisher, aber das ist schon okay.
Ich schalte nur zu der 5.1 Konfiguration noch 2x One zusätzlich dazu als pseudo 7.1 , das füllt den Raum besser :-)
Dazu muss ich dann jetzt das DOIF noch anpassen und dann sollte alles wieder gehen.
Ich hoffe, dass das disappear jetzt weg ist :-), was ich auch bei der 5.1 Kombination schon gesehen hatte.

Gruß
   Christian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 19 April 2022, 13:56:11
Hallo nochmal,
bisher habe ich anhand solch einer Abfrage erkannt, ob gerade das TV abspielt
[Sonos_Wohnzimmer:currentTrackHandle:[spdif<\/res>.*.<r:streamInfo>(\d)] ] ne "0"

Was habe ich denn jetzt für eine Möglichkeit?
Ich möchte sobald der Fernseher über spdif abgespielt wird eine Sonos Gruppe definieren und diese natürlich nach dem Abspielen wieder auflösen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 19 April 2022, 14:01:24
Zitat von: ch.eick am 19 April 2022, 13:56:11
Hallo nochmal,
bisher habe ich anhand solch einer Abfrage erkannt, ob gerade das TV abspielt
[Sonos_Wohnzimmer:currentTrackHandle:[spdif<\/res>.*.<r:streamInfo>(\d)] ] ne "0"

Was habe ich denn jetzt für eine Möglichkeit?
Ich möchte sobald der Fernseher über spdif abgespielt wird eine Sonos Gruppe definieren und diese natürlich nach dem Abspielen wieder auflösen.

Hallo Christian,
bei mir steht im reading Input dann TV drin. Allerdings kommt der über HDMI-ARC rein und nicht spdif.
Müsstest du mal schauen was bei spdif drin steht.

Ansonsten ggf. noch über den aktuellen Codec:
https://forum.fhem.de/index.php/topic,123728.msg1185263/topicseen.html#msg1185263 (https://forum.fhem.de/index.php/topic,123728.msg1185263/topicseen.html#msg1185263)

Internals:
   BUSY       0
   DEF        http://10.3.3.142:1400/status/zp 0
   FUUID      61883c8c-f33f-0308-2852-97d812062d530404
   FVERSION   98_HTTPMOD.pm:0.259620/2022-04-14
   Interval   0
   MainURL    http://10.3.3.142:1400/status/zp
   ModuleVersion 4.1.10 - 6.7.2021
   NAME       beam_codec
   NOTIFYDEV  global
   NR         361
   NTFY_ORDER 50-beam_codec
   STATE      nur Audio-Wiedergabe
   TYPE       HTTPMOD
   value     
   HttpUtils:
     NAME       
     addr       http://10.3.3.142:1400
     auth       0
     code       200
     compress   1
     conn       
     data       
     displayurl http://10.3.3.142:1400/status/zp
     header     
     host       10.3.3.142
     httpheader HTTP/1.1 200 OK
CONTENT-TYPE: text/xml
Server: Linux UPnP/1.0 Sonos/67.1-27100 (ZPS14)
Connection: close
     httpversion 1.0
     hu_blocking 0
     hu_filecount 1
     hu_port    1400
     hu_portSfx :1400
     ignoreredirects 1
     loglevel   4
     path       /status/zp
     protocol   http
     redirects  0
     timeout    2
     url        http://10.3.3.142:1400/status/zp
     sslargs:
   QUEUE:
   READINGS:
     2022-04-19 13:49:54   HTAudioInCode   21
     2022-04-19 13:49:54   audio_codec     nur Audio-Wiedergabe
   REQUEST:
     context    reading
     data       
     header     
     ignoreredirects 0
     num        unknown
     retryCount 0
     type       update
     url        http://10.3.3.142:1400/status/zp
   defptr:
     readingBase:
       HTAudioInCode reading
     readingNum:
       HTAudioInCode 01
     readingOutdated:
     requestReadings:
       update:
         HTAudioInCode reading 01
Attributes:
   alias      Beam Audio Codec
   enableXPath 1
   event-on-change-reading .*
   icon       sonos_play1
   reading01Name HTAudioInCode
   reading01XPath-Strict //HTAudioInCode/text()
   room       60_SONOS
   stateFormat audio_codec
   userReadings audio_codec {
  my $HTAudioInCode = ReadingsVal($name,"HTAudioInCode",0);
  my $r = "Code: $HTAudioInCode";
  if ($HTAudioInCode =~ /32|84934721/) {$r = "DTS";}
  if ($HTAudioInCode =~ /59/) {$r = "Doly Atmos";}
  if ($HTAudioInCode =~ /33554434/) {$r = "Stereo PCM 2.0";}
  if ($HTAudioInCode =~ /33554488/) {$r = "Dolby Digital 2.0";}
  if ($HTAudioInCode =~ /84934713/) {$r = "Dolby Digital 5.1";}
  if ($HTAudioInCode =~ /84934714/) {$r = "Dolby Digital Plus 5.1";}
  if ($HTAudioInCode =~ /22/) {$r = "keine Wiedergabe";} # Silence
  if ($HTAudioInCode =~ /33554454/) {$r = "keine Wiedergabe";} # Silence
  if ($HTAudioInCode =~ /0/) {$r = "keine Wiedergabe";} # No Signal   
  if ($HTAudioInCode =~ /21/) {$r = "nur Audio-Wiedergabe";} # No (Video)Signal
  return "$r";
}
   userattr   reading01Regex


VG Sebastian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Kurt77 am 19 April 2022, 15:39:32
Hallo,
bei mir werden nach dem Start keine Player gefunden.

Code:
-------------------------
[PM2] Spawning PM2 daemon with pm2_home=/opt/fhem/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /usr/bin/sonos2mqtt in fork_mode (1 instance)
[PM2] Done.
┌─────┬───────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name          │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼───────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ sonos2mqtt    │ default     │ N/A     │ fork    │ 32470    │ 0s     │ 0    │ online    │ 0%       │ 22.4mb   │ fhem     │ disabled │
└─────┴───────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
----------------------------------------

Danke und Gruß,
Kurt
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 19 April 2022, 15:44:21
Zitat von: binford6000 am 19 April 2022, 14:01:24
Hallo Christian,
bei mir steht im reading Input dann TV drin. Allerdings kommt der über HDMI-ARC rein und nicht spdif.
Müsstest du mal schauen was bei spdif drin steht.

Ansonsten ggf. noch über den aktuellen Codec:
https://forum.fhem.de/index.php/topic,123728.msg1185263/topicseen.html#msg1185263 (https://forum.fhem.de/index.php/topic,123728.msg1185263/topicseen.html#msg1185263)

VG Sebastian
Hallo nochmal,
Schritt für Schritt geht es weiter :-)

Bei Verwendung von spdif steht als Input auch TV drin. Geht der Fernseher aus, so erscheit nach ca 10 Minuten dann als Input Radio.
Die Steuerung der Gruppen ist auch etwas anders, aber das klappt schon mal.
Bei spdif scheint der Audio Codec nicht analysiert zu werden, der steht momentan fest auf 21, aber mal schauen, wenn mal ein Block Buster kommt :-)

Was jedoch noch fehlt ist Balance bei Stereo paaren.

VG
   Christian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 19 April 2022, 15:53:44
ZitatGeht der Fernseher aus, so erscheit nach ca 10 Minuten dann als Input Radio.

Das fange ich mit einem notify auf
(Beam|One|Play1|Roam):transportState:.(PLAYING|STOPPED|TRANSITIONING) {
if ($EVENT =~ /PLAYING/) {
   fhem("set beam_codec reread") if ($NAME eq "Beam");
[...] }

ab. Beim TV Betrieb wechselt das aber recht zügig wenn ich zB. Sender umschalte oder von TV auf
AppleTV/KODI gehe und dort eine zB. DTS Tonspur läuft.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 April 2022, 16:22:36
@Kurt
Du hast den nodejs auf der gleichen Maschine wie FHEM installiert?
Wie ist der Aufrufparameter?
Der MQTT2_SERVER läuft und die SonosBridge hast Du definiert?
https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Sonos2Mqtt

@christian
Zitatscheint der Audio Codec nicht analysiert zu werden, der steht momentan fest auf 21
der Audiocodec wird mW nicht von sonos2mqtt geliefert, der fällt sozusagen beim Einlesen der HardwareInformation über http mit an. Da wird von selbst nichts kommen, müsstest Du anders einlesen.
ZitatWas jedoch noch fehlt ist Balance bei Stereo paaren.
Will man die über FHEM einstellen? Geht in der SonosApp  - und ist doch nichts wo man ständig dreht? In der Front ist es in der SonosApp ja auch nicht angelegt.  ;)

Du kannst aber mit dem Haupt Links Lautsprecher die Lautstärke für beide regeln, mit dem Neben rechts Lautsprecher für diesen separat. War für mich so ein würgaround ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 April 2022, 16:49:16
Zum Input: den ermittle ich ja so:
if ($reading eq 'Input') {
   my $currentTrack_TrackUri = ReadingsVal($name,'currentTrack_TrackUri','');
   return $currentTrack_TrackUri =~ 'x-rincon-stream'
      ? 'LineIn': $currentTrack_TrackUri =~ 'spdif'
      ? 'TV'    : ReadingsVal($name,'enqueuedMetadata_UpnpClass','') eq 'object.item.audioItem.audioBroadcast'
      ? 'Radio' : 'Playlist'
  }
}
Da bin ich für Vorschläge offen: wenn es nicht line_in und nicht TV ist frage ich das Reading enqueuedMetadata_UpnpClass ab und wenn dort audioBroadcast drin steht wird es Radio - wenn nicht wird es Playlist. Ich weiß es derzeit nicht besser :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Kurt77 am 19 April 2022, 17:13:41
Zitat von: Otto123 am 19 April 2022, 16:22:36
@Kurt
Du hast den nodejs auf der gleichen Maschine wie FHEM installiert?
ja

Wie ist der Aufrufparameter?

pm2 start sonos2mqtt

Der MQTT2_SERVER läuft und die SonosBridge hast Du definiert?
ja

Danke und Gruß,
Kurt
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 April 2022, 17:29:56
@Kurt was gibt Dir dies zurück. Ich habe derzeit nur docker systeme am Start und kann nur aus dem Kopf sagen wo man schauen könnte.
pm2 list

Wie sieht die Bridge aus? Mach mal bitte einelist SonosBridge
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Kurt77 am 19 April 2022, 17:37:40
Zitat von: Otto123 am 19 April 2022, 17:29:56
@Kurt was gibt Dir dies zurück. Ich habe derzeit nur docker systeme am Start und kann nur aus dem Kopf sagen wo man schauen könnte.
pm2 list
code:
-----------------------------
                Start and Daemonize any application:                           
                $ pm2 start app.js                                             
                                                                               
                Load Balance 4 instances of api.js:                             
                $ pm2 start api.js -i 4                                         
                                                                               
                Monitor in production:                                         
                $ pm2 monitor                                                   
                                                                               
                Make pm2 auto-boot at server restart:                           
                $ pm2 startup                                                   
                                                                               
                To go further checkout:                                         
                http://pm2.io/                                                 
                                                                               
                                                                               
                        -------------                                           
                                                                               
[PM2] Spawning PM2 daemon with pm2_home=/home/pi/.pm2                           
[PM2] PM2 Successfully daemonized                                               
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name               │ mode     │ ↺    │ status    │ cpu      │ memory   │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
-----------------


Wie sieht die Bridge aus? Mach mal bitte einelist SonosBridge
code:
--------------------------------------
Internals:
   DEVICETOPIC sonos
   FUUID      625eab60-f33f-6c85-bdd9-f42a89adf78d9bf4
   IODev      MQTT2_SERVER
   NAME       SonosBridge
   NR         15
   STATE      connected
   TYPE       MQTT2_DEVICE
   READINGS:
     2022-04-19 14:31:21   attrTemplateVersion 20210303
Attributes:
   IODev      MQTT2_SERVER
   autocreate 1
   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/status/[^/]+/renderingcontrol:.* {}
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:.* {}
   room       MQTT2_DEVICE
   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
   stateFormat connected
   userReadings favlist:Favorites.* {sonos2mqtt_ur($name,'favlist')},
grouplist:Favorites.* {sonos2mqtt_ur($name,'g
---------------------------------------------------------


Danke und Gruß,
Kurt
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 19 April 2022, 17:46:38
Zitat von: Otto123 am 19 April 2022, 16:22:36
@christian der Audiocodec wird mW nicht von sonos2mqtt geliefert, der fällt sozusagen beim Einlesen der HardwareInformation über http mit an.
Wann wird denn bei mqtt etwas über http eingelesen?
Zitat
Da wird von selbst nichts kommen, müsstest Du anders einlesen.Will man die über FHEM einstellen? Geht in der SonosApp  - und ist doch nichts wo man ständig dreht? In der Front ist es in der SonosApp ja auch nicht angelegt.  ;)
Die Balance setze ich wenn ich die 2x One als Front Lautsprecher zur SonosBase dazu schalte.
Dann nehme ich die in die Gruppe auf und kopple über FHEM volume und mute.
Balance habe ich dann auf das Sofa ausgerichtet.

Zitat
Du kannst aber mit dem Haupt Links Lautsprecher die Lautstärke für beide regeln, mit dem Neben rechts Lautsprecher für diesen separat. War für mich so ein würgaround ;)
Das bedeutet, ich setze beim Haupt Lautsprecher der Stereo Gruppe zuerst die Lautstärke und anschließend sofort beim Rechten eine andere, damit er lauter wie der Linke ist??
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 19 April 2022, 17:49:14
@Kurt

das pm2 list ist als user fhem oder pi ?

Gestartet hast du als user fhem, dann musst auch als user fhem das pm2 list machen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 19 April 2022, 17:49:25
Zitat von: Otto123 am 19 April 2022, 16:49:16
Zum Input: den ermittle ich ja so:
< snip >Da bin ich für Vorschläge offen: wenn es nicht line_in und nicht TV ist frage ich das Reading enqueuedMetadata_UpnpClass ab und wenn dort audioBroadcast drin steht wird es Radio - wenn nicht wird es Playlist. Ich weiß es derzeit nicht besser :)
Für mich reicht das so erstmal, bei TV kann ich es aktivieren und wenn es dann auf etwas anderes geht schalte ich die Konfiguration wieder zurück.

Zitat von: binford6000 am 19 April 2022, 15:53:44
Das fange ich mit einem notify auf
(Beam|One|Play1|Roam):transportState:.(PLAYING|STOPPED|TRANSITIONING) {
if ($EVENT =~ /PLAYING/) {
   fhem("set beam_codec reread") if ($NAME eq "Beam");
[...] }

ab. Beim TV Betrieb wechselt das aber recht zügig wenn ich zB. Sender umschalte oder von TV auf
AppleTV/KODI gehe und dort eine zB. DTS Tonspur läuft.
Bei mir wechselt da noch nichts, da ich nur entweder einen TV über spdif oder halt Radio Streame.
Alle anderen Geräte kommen ebenfalls über das TV Gerät und da bekommt Sonos keine Information welche Quelle es ist.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 April 2022, 17:51:00
@Kurt Die SonosBridge hatte noch nie Kontakt zu sonos2mqtt. Wie hast Du den start mit pm2 gemacht? Auf Systemebene (Systemdienst) oder innerhalb von FHEM? einfach mit dem "FHEM Befehl" ?
"pm2 start sonos2mqtt"
Wenn innerhalb von FHEM, dann müsstest Du als User pi diesen befehl ausführen:
sudo -su fhem pm2 list
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 April 2022, 17:54:34
Zitat von: ch.eick am 19 April 2022, 17:46:38
Wann wird denn bei mqtt etwas über http eingelesen?

Das bedeutet, ich setze beim Haupt Lautsprecher der Stereo Gruppe zuerst die Lautstärke und anschließend sofort beim Rechten eine andere, damit er lauter wie der Linke ist??
1. gar nicht. Beim anlegen der Speaker (also beim setup) werden einmalig ein paar Systeminfos über http abgefragt, im laufenden Betrieb nie wieder.

2. Ja

ZitatFür mich reicht das so erstmal, bei TV kann ich es aktivieren und wenn es dann auf etwas anderes geht schalte ich die Konfiguration wieder zurück.
Wobei eben setzen und ermitteln zwei getrennte Schuhe sind. Gesetzt wird über sonos2mqtt, ermittelt wird quasi aus dem was gespielt wird (da liefert sonos2mqtt mW nichts)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 19 April 2022, 18:16:27
Zitat von: Otto123 am 19 April 2022, 17:54:34
Wobei eben setzen und ermitteln zwei getrennte Schuhe sind. Gesetzt wird über sonos2mqtt, ermittelt wird quasi aus dem was gespielt wird (da liefert sonos2mqtt mW nichts)
Sobald über sonos2mqtt etwas kommt wird momentan ein Event mit TV ausgelöst. Wenn der spdif Eingang 10 Minuten kein Signal sendet, dann schaltet die Sonos Base wieder zurück und es kommt ein Event mit Radio im FHEM Device. Das Input userreading reagiert ja auf currentTrack_TrackUri und die ändert sich nach ablauf der 10 Minuten. Somit ist Deine Analyse soweit okay.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Kurt77 am 19 April 2022, 18:50:13
Zitat von: Otto123 am 19 April 2022, 17:51:00
@Kurt Die SonosBridge hatte noch nie Kontakt zu sonos2mqtt. Wie hast Du den start mit pm2 gemacht? Auf Systemebene (Systemdienst) oder innerhalb von FHEM? einfach mit dem "FHEM Befehl" ?
"pm2 start sonos2mqtt"

Ich habe in der fhem-Kommandozeile folgenden Befehl ausgeführt:

code:
--------------------------------
{qx(pm2 start sonos2mqtt)}
------------------------

Hätte ich statt dessen in der linux-Konsole:
Code:
-------------------------------------
sudo -su fhem pm2 start sonos2mqtt
---------------------------

eingeben sollen?

Danke und Gruß,
Kurt

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 April 2022, 21:10:59
Hallo Kurt,

nein wahrscheinlich ist das in dem Fall identisch, da sich pm2 von sich aus in den Hintergrund verabschiedet. Zum Unterschied:
"der System Befehl in Anführungszeichen"
führt den Befehl im Hintergrund aus, Ausgaben erscheinen im Log. FHEM wird nicht blockiert.
{qx(Der System Befehl)}
wird im Vordergrund ausgeführt, qx wartet auf den Rückgabewert, FHEM wird für diesen Zeitraum blockiert.

Wir müssen jetzt herausbekommen ob der sonos2mqtt Dienst überhaupt läuft und was er macht.
Eigentlich kann an mit dem Befehl pm2 monit "zuschauen was er macht" - ich weiß, das ist für Dich schwierig.

Du könntest den Dienst im Vorderung starten und dann einen Moment warten, dann mit crtl+c beenden. Mal schauen was er da ausgibt. Auf der Linux Konsole, erstmal den Dienst beenden (falls er läuft) und dann im Vordergrund starten.
sudo -su fhem pm2 stop sonos2mqtt
sudo -su fhem pm2 start sonos2mqtt --no-daemon
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Kurt77 am 19 April 2022, 21:39:56
Hallo Otto,
und hir ist der Output:

Code:
------------------------------------
21:35:01 0|sonos2mqtt  |     at Object.<anonymous> (/usr/lib/node_modules/sonos2
mqtt/node_modules/yargs/build/index.cjs:1:57316)                               
21:35:01 0|sonos2mqtt  |     at Module._compile (internal/modules/cjs/loader.js:
778:30)                                                                         
21:35:01 0|sonos2mqtt  |     at Object.Module._extensions..js (internal/modules/
cjs/loader.js:789:10)                                                           
21:35:01 0|sonos2mqtt  |     at Module.load (internal/modules/cjs/loader.js:653:
32)                                                                             
21:35:01 0|sonos2mqtt  |     at tryModuleLoad (internal/modules/cjs/loader.js:59
3:12)                                                                           
21:35:01 0|sonos2mqtt  |     at Function.Module._load (internal/modules/cjs/load
er.js:585:3)                                                                   
21:35:01 0|sonos2mqtt  |     at Module.require (internal/modules/cjs/loader.js:6
92:17)                                                                         
21:35:01 0|sonos2mqtt  |     at Module.Hook._require.Module.require (/usr/lib/no
de_modules/pm2/node_modules/require-in-the-middle/index.js:80:39)               
21:35:01 0|sonos2mqtt  |     at require (internal/modules/cjs/helpers.js:25:18)
21:35:01 0|sonos2mqtt  |     at Object.<anonymous> (/usr/lib/node_modules/sonos2
mqtt/node_modules/yargs/index.cjs:5:30)                                         
21:35:01 PM2           | App [sonos2mqtt:0] exited with code [1] via signal [SIG
INT]                                                                           
21:35:01 PM2           | Script /usr/bin/sonos2mqtt had too many unstable restar
ts (16). Stopped. "errored"                                                     
----------------------------

Danke und Gruß,
Kurt
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 April 2022, 22:16:36
Hallo Kurt,

da ist mit dem Setup von sonso2mqtt irgendwas schief gegangen? Bei mir sieht die Ausgabe so aus:
Zitatpi@raspib3plus:~ $ sudo -su fhem pm2 start sonos2mqtt --no-daemon
pm2 launched in no-daemon mode (you can add DEBUG="*" env variable to get more messages)
[PM2] Applying action restartProcessId on app [sonos2mqtt](ids: 0)
[PM2] [sonos2mqtt](0) ✓
[PM2] Process successfully started
┌─────┬───────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name          │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼───────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ sonos2mqtt    │ default     │ N/A     │ fork    │ 24166    │ 0s     │ 1    │ online    │ 0%       │ 16.0mb   │ fhem     │ disabled │
└─────┴───────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

[--no-daemon] Continue to stream logs
[--no-daemon] Exit on target PM2 exit pid=1080
22:10:55 0|sonos2mqtt  | 2022-04-19T20:10:55.874Z [Information] Starting sonos2mqtt v3.1.1-beta.8
22:10:55 0|sonos2mqtt  | 2022-04-19T20:10:55.903Z [Information] LogLevel changed to information
22:10:56 0|sonos2mqtt  | 2022-04-19T20:10:56.096Z [Information] Found 7 sonos speakers
22:10:56 0|sonos2mqtt  | 2022-04-19T20:10:56.372Z [Information] Mqtt connection changed to connected: true
Was hats Du für ein Setup gemacht? Docker hast Du nicht am Start? Das find ich ja mittlerweile viel einfacher, vor allem für solche nodejs services.

Viele Grüße Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Kurt77 am 20 April 2022, 08:23:56
Hallo Otto,
ich nehme an, dass Du mit "setup" Docker oder nodejs meinst.
Ich bin den Weg über nodejs gegangen.
Danke und Gruß,
Kurt
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 20 April 2022, 08:55:15
Guten Morgen Kurt,

ja, dass Du nodejs gemacht hast ist mir klar. Aber dabei muss was schief gelaufen sein, der nodejs sonos2mqtt funktioniert offenbar nicht.
Welche nodejs Version?
node -v
Was ist global installiert?
npm list -g

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Kurt77 am 20 April 2022, 09:07:26
Hallo Otto,
Node-Version ist v10.24.1.

global:
Code:
-------------------------
  │   └─┬ color-convert@1.9.3                                                   
  │     └── color-name@1.1.3                                                   
  └─┬ yargs@17.1.1                                                             
    ├─┬ cliui@7.0.4                                                             
    │ ├── string-width@4.2.3 deduped                                           
    │ ├─┬ strip-ansi@6.0.1                                                     
    │ │ └── ansi-regex@5.0.1                                                   
    │ └─┬ wrap-ansi@7.0.0                                                       
    │   ├─┬ ansi-styles@4.3.0                                                   
    │   │ └─┬ color-convert@2.0.1                                               
    │   │   └── color-name@1.1.4                                               
    │   ├── string-width@4.2.3 deduped                                         
    │   └── strip-ansi@6.0.1 deduped                                           
    ├── escalade@3.1.1                                                         
    ├── get-caller-file@2.0.5                                                   
    ├── require-directory@2.1.1                                                 
    ├─┬ string-width@4.2.3                                                     
    │ ├── emoji-regex@8.0.0                                                     
    │ ├── is-fullwidth-code-point@3.0.0                                         
    │ └── strip-ansi@6.0.1 deduped                                             
    ├── y18n@5.0.8                                                             
    └── yargs-parser@20.2.9                                                     
----------------------------------------------------------

Danke und Gruß,
Kurt
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 20 April 2022, 10:31:09
ok sonos2mqtt fehlt, da musst Du nochmal ran
sudo npm install -g sonos2mqtt
Aber halt, Du hast nicht alles erwischt? da fehlt doch oben was!? bei mir sieht das so aus:
Zitatnpm list -g
/usr/lib
├── @svrooij/sonos-tts-polly@1.0.5
├── npm@7.10.0
├── pm2@4.4.1
└── sonos2mqtt@3.1.1-beta.8
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Kurt77 am 20 April 2022, 12:07:07
Hallo Otto,
sorry, ja, die list-Ausgabe ging über mehrere Bildschirme.
Bei Bildschirm 15 habe ich dann abgebrochen und sonos2mqtt nochmal installiert:

Code:
----------------------------
/usr/bin/sonos2mqtt -> /usr/lib/node_modules/sonos2mqtt/lib/index.js           
npm WARN notsup Unsupported engine for yargs@17.1.1: wanted: {"node":">=12"} (cu
rrent: {"node":"10.24.1","npm":"6.14.12"})                                     
npm WARN notsup Not compatible with your version of node/npm: yargs@17.1.1     
                                                                               
+ sonos2mqtt@3.2.0                                                             
updated 1 package in 6.974s                                                     
----------------------------

Daraus schließe ich messerscharf, dass ich eine andere noejs-Version installiern muss, aber welche?

Danke und Gruß,
Kurt

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 20 April 2022, 12:27:03
ZitatDaraus schließe ich messerscharf, dass ich eine andere noejs-Version installiern muss, aber welche?

wanted: {"node":">=12"} (current: {"node":"10.24.1","npm":"6.14.12"}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 20 April 2022, 13:11:37
Zitat von: Kurt77 am 20 April 2022, 12:07:07
sorry, ja, die list-Ausgabe ging über mehrere Bildschirme.
Bei Bildschirm 15 habe ich dann abgebrochen und sonos2mqtt nochmal installiert:
oh je - was ist da denn alles installiert?
Dann frag doch so ab:
npm list -g|grep sonos

Bei der Warnung geht es um yargs nicht um sonos. Ich empfehle Dir die Update Arie nicht unbedingt, bei mir läuft sonos2mqtt mit nodejs
nodejs -v
v10.24.1


Das hier sieht gut aus:
Zitat+ sonos2mqtt@3.2.0                                                             
updated 1 package in 6.974s           
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Kurt77 am 20 April 2022, 14:16:24
Zitat von: Otto123 am 20 April 2022, 13:11:37
npm list -g|grep sonos
└─┬ sonos2mqtt@3.2.0                                                           
  ├─┬ @svrooij/sonos@2.5.0-beta.8                                               

Danke und Gruß,
Kurt
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 20 April 2022, 17:29:22
hast Du jetzt nochmal den Start probiert?
sudo -su fhem pm2 start sonos2mqtt --no-daemon
Wie gesagt, wenn das richtig läuft darf da nur etwas weniger als ein Bildschirm gefüllt werden...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Kurt77 am 20 April 2022, 18:01:36
Hallo Otto,
nach dem Start kommen etliche Bildschirmseiten.

Gleich auf  der ersten Seite kommt der Fehler

Code:
------------------------------------
17:55:23 0|sonos2mqtt  | Error: yargs supports a minimum Node.js version of 12.
-----------------------------------------

Vielleicht sollte man es doch mal mit einer 12er -Version von nodejs versuchen?

Danke und Gruß,
Kurt
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 20 April 2022, 18:33:53
Hallo Kurt,

also bei mir gibt es kein yargs, ich weiß nicht wozu man das braucht, aber offenbar stört es wenn es da ist und nicht läuft. Ich weiß auch nicht wie es gelungen ist, ein Modul zu installieren was gar nicht zum System passt. Vielleicht ist das genau der Grund warum ich mich mit diesem nodejs Zeugs nicht beschäftigen mag und lieber den Container einsetze.
Egal - es ist jetzt so, und ich weiß nicht so recht wie ich weiter helfen soll. Ich war immer froh wenn ich geradlinig das setup von nodejs hinbekommen habe.
Ich weiß nicht was sonst bei Dir läuft (warum Du mehrere list Bildschirme hast) irgendwas hat ja das yargs mitgebracht und kann sein irgendwas braucht das nodejs 10 ?
Ich will auch nicht bange machen, vielleicht gibt es ein update und alles ist gut. Ich wollte nur sensibel darauf hinweisen.
sonos2mqtt braucht keine besondere Version ( but it should run on v10 or higher)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Kurt77 am 20 April 2022, 20:36:54
Zitat von: Otto123 am 20 April 2022, 18:33:53
geradlinig das setup von nodejs hinbekommen habe.
und kann sein irgendwas braucht das nodejs 10 ?
Hallo Otto,
das habe ich installiert, um sonos2mqtt zum Laufen zu bekommen.

Ich mache jetzt anders weiter. Ich gehe auf eine saubere Sicherung zurück und versuche mal mein Glück mit Docker. Habe zwar die Anleitung im Wiki beim ersten Durchlesen nicht verstanden, aber ich guck es mir noch mal genauer an.

Ggf. würde ich wieder um Deinen Rat bitten.

Danke und Gruß,
Kurt

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 20 April 2022, 21:53:20
Hallo Kurt,

na klar immer. Ich habe im sonos2mqtt Wiki ganz bewusst wenig Wert auf die Beschreibung der "allgemeinen" Dinge (wie nodejs oder docker an sich) gelegt. Das sind ja Sachen die sich schnell mal ändern.

Wenn Du gar keine Erfahrung mit docker hast, kannst Du bei "mir" etwas nachlesen: https://heinz-otto.blogspot.com/2021/06/docker-ein-kleiner-schnellstart-workshop.html
Ich habe keine Vorstellung wie gut das für Dich zu lesen ist, ich habe keine Ahnung wie man Barrierefrei schreibt. Du darfst mir gern Hinweise geben.
Für das Setup habe ich mir ein Script gebaut, damit hast Du eigentlich in kurzer Zeit eine docker Umgebung.
https://github.com/heinz-otto/raspberry/blob/master/setupBasisDocker.sh

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 25 April 2022, 09:47:55
Guten Morgen,

ich hatte jetzt auf meiner sonos2mqtt Testinstanz ähnliche Fehler wie Kurt, irgendwie war etwas passiert und der nodejs Kram passte nicht mehr zusammen. Relativ einfach ist mir eine update gelungen.
Ich bin einfach auf die offizielle Nodejs Seite (https://github.com/nodesource/distributions/blob/master/README.md) und habe das gemacht was da steht :)
Nachtrag
Beim nochmaligen drüberlesen, ist es offenbar "besser" gerade Versionen zu installieren, also hätte ich die 18.x nehmen sollen.

# Using Debian, as root
curl -fsSL https://deb.nodesource.com/setup_17.x | bash -
apt-get install -y nodejs

Als Abschluss habe ich einen system neustart gemacht.
Danach lief sonos2mqtt@3.2.0 wieder.
Monitoring
sudo -su fhem pm2 monit
Allerdings fand sonos2mqtt meine Player nicht mehr, keine Ahnung warum.
Irgendein Problem mit dem discovery?
Ich habe dann sonos2mqtt mal mit einer PlayerIP gestartet:
"pm2 -s start sonos2mqtt -- --device 192.168.56.238"
Mal schauen wie es läuft.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: coolice am 26 April 2022, 06:52:08
Guten Morgen zusammen, ich habe gestern vom Sonos Modul auf mqtt umgestellt. Lief auf Anhieb. Ich schalte morgens das Sonos im Bad durch einen Bewegungsmeldern an. Das klappt auch soweit, doch Sonos schaltet immer wieder kurz aus und wieder ein sobald jemand durch den Flur rennt und den Bewegungsmeldern auslöst. Kann mir jemand sagen wie man das unterbinden kann.

Code: ([05:10-06:10|12345] and [OG.fl.BM_Motion:state] eq "motion" and [MQTT2_RINCON_5CAAFD4A979C01400:STATE] ne "STOPPED")  (set alias=Bad playFav Radio Lippe, set alias=Bad volume 6;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 26 April 2022, 08:04:41
Zitat von: coolice am 26 April 2022, 06:52:08
Guten Morgen zusammen, ich habe gestern vom Sonos Modul auf mqtt umgestellt. Lief auf Anhieb. Ich schalte morgens das Sonos im Bad durch einen Bewegungsmeldern an. Das klappt auch soweit, doch Sonos schaltet immer wieder kurz aus und wieder ein sobald jemand durch den Flur rennt und den Bewegungsmeldern auslöst. Kann mir jemand sagen wie man das unterbinden kann.

Code: ([05:10-06:10|12345] and [OG.fl.BM_Motion:state] eq "motion" and [MQTT2_RINCON_5CAAFD4A979C01400:STATE] ne "STOPPED")  (set alias=Bad playFav Radio Lippe, set alias=Bad volume 6;)

Moin,
Du fragst beim Einschalten auf

and [MQTT2_RINCON_5CAAFD4A979C01400:STATE] ne "STOPPED"

ab, "ne" wären aber alle Zustände außer "STOPPED" . Somit wird bei jedem "motion" Event sobald das Radio läuft getriggert.
Mich wundert dann jedoch, dass das Radio morgens überhaupt an geht, da sollte es ja auf  eq "STOPPED" sein im Zustand Aus.

EDIT: Komisch, bei mir fehlt das playFav in der set Liste.
  Ich habe das sonos2mqtt_speaker Template zugeordnet und bei der Bridge das sonos2mqtt_bridge_comfort.
  Habe ich da auch etwas vergessen, da ich ebenfalls erst gerade umgestellt haben?


VG
   Christian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 26 April 2022, 11:26:58
@Christian Ich weiß ich bin irgendwann mit der Entwicklung etwas abgestorben, es gibt durchaus noch was zu "beheben" und zu verbessern. Es ist eine Art Baukasten :)
https://wiki.fhem.de/wiki/Sonos2mqtt#Player_mit_Favoritenliste_und_Gruppenliste_ausstatten

@coolice wolltest Du nicht auf ne "PLAYING" testen? Ich würde dabei den trigger rausnehmen, sonst rennt Dein DOIF jedes mal wieder los. Und den transportState nehmen, weil STATE kann man ja mit stateFormat auch ändern.
Deine Angabe ist aber eh falsch, STATE ist ein Internal!
ZitatInternals mit [<devicename>:&<internal>] angegeben.
[?MQTT2_RINCON_5CAAFD4A979C01400:transportState] ne "PLAYING"
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 26 April 2022, 12:55:19
Zitat von: Otto123 am 26 April 2022, 11:26:58
@Christian Ich weiß ich bin irgendwann mit der Entwicklung etwas abgestorben, es gibt durchaus noch was zu "beheben" und zu verbessern. Es ist eine Art Baukasten :)
https://wiki.fhem.de/wiki/Sonos2mqtt#Player_mit_Favoritenliste_und_Gruppenliste_ausstatten
Tausend Dank für Deine unermütlich Hilfe, ich hoffe ich gebe auch etwas zurück :-)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 26 April 2022, 13:04:27
Noch mal über den Satz nachgedacht:
ZitatMich wundert dann jedoch, dass das Radio morgens überhaupt an geht, da sollte es ja auf  eq "STOPPED" sein im Zustand Aus.
Das hier ist wahrscheinlich immer wahr :)
[MQTT2_RINCON_5CAAFD4A979C01400:STATE] ne "STOPPED"
in der [Klammer] steht nix (&fehlt) und das ist ungleich "STOPPED"

Das zeigt eigentlich die Tücke bei ne Vergleichen - die sind (ungewollt) in den meisten Fällen wahr. Insofern wäre es so besser
[?MQTT2_RINCON_5CAAFD4A979C01400:transportState] eq "STOPPED"
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 26 April 2022, 14:08:25
Zitat von: Otto123 am 26 April 2022, 13:04:27
Noch mal über den Satz nachgedacht:Das hier ist wahrscheinlich immer wahr :)
[MQTT2_RINCON_5CAAFD4A979C01400:STATE] ne "STOPPED"
in der [Klammer] steht nix (&fehlt) und das ist ungleich "STOPPED"

Das zeigt eigentlich die Tücke bei ne Vergleichen - die sind (ungewollt) in den meisten Fällen wahr. Insofern wäre es so besser
[?MQTT2_RINCON_5CAAFD4A979C01400:transportState] eq "STOPPED"
Sorry Otto,
da muss ich nochmal nachfragen

das hier verstehe ich nicht
Zitat
in der [Klammer] steht nix (&fehlt) und das ist ungleich "STOPPED"

Und was bedeutet das "?" in
Zitat
[?MQTT2_RINCON_5CAAFD4A979C01400:transportState] eq "STOPPED"
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 26 April 2022, 14:45:25
Dieser Ausdruck ist falsch, STATE ist ein Internal und kein Reading, er wird also nichts zurück liefern:
Zitat[MQTT2_RINCON_5CAAFD4A979C01400:STATE]
Damit wird "" ne "irgendwas" immer wahr sein.  ;)

Man müsste ihn laut DOIF Commandref so schreiben:
[MQTT2_RINCON_5CAAFD4A979C01400:&STATE]
dann würde er den Inhalt von STATE zurück liefern.

Das Fragezeichen am Anfang bedeutet, dieses Reading triggert das DOIF nicht (es wird also nicht angestoßen um die Bedingungen abzufragen). Wenn es angestoßen wird (im vorliegenden Fall durch motion) werden alle Bedingung, also auch der Wert von transportState, abgefragt.

Ohne Fragezeichen würde eine Änderung von MQTT2_RINCON_5CAAFD4A979C01400:transportState das DOIF triggern und es würde die anderen Bedingungen abfragen. Ist in dem Fall vielleicht egal, aber unnütz.

Das ? ist auch in der commandref von DOIF erklärt, es ist eine Besonderheit von DOIF.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 26 April 2022, 15:46:07
Zitat von: Otto123 am 26 April 2022, 14:45:25
Das Fragezeichen am Anfang bedeutet, dieses Reading triggert das DOIF nicht (es wird also nicht angestoßen um die Bedingungen abzufragen). Wenn es angestoßen wird (im vorliegenden Fall durch motion) werden alle Bedingung, also auch der Wert von transportState, abgefragt.

Ohne Fragezeichen würde eine Änderung von MQTT2_RINCON_5CAAFD4A979C01400:transportState das DOIF triggern und es würde die anderen Bedingungen abfragen. Ist in dem Fall vielleicht egal, aber unnütz.

Das ? ist auch in der commandref von DOIF erklärt, es ist eine Besonderheit von DOIF.
Okay, bisher hatte ich immer nur die Events aktiv, die ich auch wirklich benötige. Mit dem ? im DOIF könnte ich dann einen Trigger abwarten und zusätzliche Bedingungen abfragen. Das würde natürlich das DOIF etwas zur Ruhe bringen, gerade im Perl Modus habe ich das Problem, dass ich manchmal zu oft eine Auslösung habe.

Leider hat man ja nicht immer die Zeit alles an Doku zu lesen

VG
     Christian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 13 Mai 2022, 09:18:41
Guten morgen,

ich weiß, das dies nicht zu 100% hierhin gehört, aber vielleicht hat ja jemand eine Idee. Ich betreibe den Sonos2mqtt ebenfalls in fhem. Ich habe auf amazon music ca. 30-40 Playlisten erstellt. Ich bin mit dem amazon Service nicht mehr zufrieden und würde gerne zu Spotify wechseln. Einen "Playlisten-Konverter" der mir die Playlisten in Spotify Playlisten umwandelt, gibt es m.W nicht.

Die Idee ist, die Playlisten im Sonos zu laden und dann die Titel in eine Datei zu exportieren. Dann muss ich sie zwar händisch wieder in Spotify eintragen, aber gut, so ist es halt.

Gibt es eine Möglichkeit, die Titel der Listen mit Sonos2mqtt in eine csv Datei zu exportieren?

Spartacus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 13 Mai 2022, 09:58:14
Hallo Spartacus,

interessante Fragestellung, davor stand ich auch schon mal. Habe dann alles per Hand gemacht  :-\
Ich kann mir vorstellen das geht, ich weiß auch das man hier ansetzen kann https://svrooij.io/sonos2mqtt/control/browse.html#browse-with-own-query
Ich weiß jetzt bloß noch nicht die zielgenaue Abfrage.

Wenn man die Playliste hätte ist der Export bestimmt einfach machbar.
Fleißaufgabe ;)
Beispiel - dieser Abfragestring bei einem Player ins x_raw_payload Inputfeld geworfen:
{
  "command": "adv-command",
  "input": {
    "cmd": "ContentDirectoryService.BrowseParsed",
    "val": {
      "ObjectID": "Q:0",
      "BrowseFlag": "BrowseDirectChildren",
      "Filter": "*",
      "StartingIndex": 0,
      "RequestedCount": 0,
      "SortCriteria": ""
    },
    "reply": "Reply"
  }
}

Erzeugt in der SonosBridge im Reading Reply die aktuelle Playlist des Players in einem Json String. Aus dem müsste man jetzt die Titel extrahieren...

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 13 Mai 2022, 13:25:08
Hallo Otto,

vielen Dank für die schnelle Antwort und deinen Einsatz. Ich habe inzwischen eine Möglichkeit gefunden, die Playlisten direkt von amazon music nach Spotify zu übertragen. Das klappt bis zu 500 Titel sogar kostenlos und das geht wirklich schnell!

https://www.tunemymusic.com/de/


Christian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 16 Mai 2022, 12:53:49
Moin zusammen,

irgendwie bin ich zu blöd einen Radiosender zu laden und abzuspielen. Ih finde den Fehler nicht.

Zuerst habe ich die Radiosender geladen:

get SonosBridge Reply Radios;sleep SonosBridge:Reply.*;setreading SonosBridge Radios [SonosBridge:Reply]

Dann möchte ich WR2 in einen Player laden. Und das klappt schon nicht.

set MQTT2_RINCON_B8E9375131E201400 play Radios WDR2 Ruhrgebiet

In der Radioliste gibt es den Sender zwar, aber im Player wird einfach nichts geladen. Es steht dort dann keine Musik vorhanden und es schaut so aus, als würde er den Sender gar nicht finden. Hat jemand eine Idee?

Spartacus.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 16 Mai 2022, 13:24:32
single? Radio? :D
set MQTT2_RINCON_B8E9375131E201400 play Radio WDR2
set MQTT2_RINCON_B8E9375131E201400 play Radio WDR2 Ruhrgebiet
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 16 Mai 2022, 13:27:20
Zitat von: Spartacus am 16 Mai 2022, 12:53:49
Dann möchte ich WR2 in einen Player laden. Und das klappt schon nicht.

set MQTT2_RINCON_B8E9375131E201400 play Radios WDR2 Ruhrgebiet

In der Radioliste gibt es den Sender zwar, aber im Player wird einfach nichts geladen. Es steht dort dann keine Musik vorhanden und es schaut so aus, als würde er den Sender gar nicht finden. Hat jemand eine Idee?

Der Sender heißt "WDR2 Ruhrgebiet", richtig?
Halt also ein Leerzeichen im Namen.
AFAIK musst du das mit %20 escapen.

Also WDR2%20Ruhrgebiet
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 16 Mai 2022, 13:32:33
Es geht an der Stelle tatsächlich mir Leerzeichen :)
Bei mir ist der WDR2 allerdings WDR 2 ...
Aber eben Mehrzahl die Liste: Radios / Favorites / Playlists. Einzahl das einzelne Object: Radio / Favorite / Playlist
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Spartacus am 16 Mai 2022, 13:40:17
Moin,

cool! Hat jetzt geklappt, obwohl ich "Radio" auch probiert hatte. War vielleicht irgendeinen Tippfehler drin.

Danke Euch!
Spartacus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: m8ichael am 19 Mai 2022, 07:38:31
Hallo,

ich habe zwei Fragen zu diesem Thema:


Könnt ihr mir hier ein paar Tipps geben?

Vielen Dank und viele Grüße

Michael
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Mai 2022, 09:58:04
Hallo Michale,

zur ersten Frage müsste ich wissen, welche Funktion Du umsetzen willst: die mit dem TEXT2SPEECH Device oder die mit Amazon Polly?
funktioniert denn
set ... notify 25 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3
zur zweiten:
Naja Du kannst die Geräte einfach umbenennen. Ich habe das nicht eingebaut weil man da wieder Sonderbetrachtungen führen muss: aus was setzt man den Namen zusammen und so weiter.
Da ReadingsVal im Perlumfeld verwendet wird, kannst Du auch einleitend den Namen ermitteln:
my $Player = (devspec2array('alias=Wohnzimmer'))[0];

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: m8ichael am 19 Mai 2022, 10:04:47
Hi!

Zitat
zur ersten Frage müsste ich wissen, welche Funktion Du umsetzen willst: die mit dem TEXT2SPEECH Device oder die mit Amazon Polly?
funktioniert denn
Code: [Auswählen]

set ... notify 25 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3

Das ist genau das Problem. Auch das funktioniert nicht. Irgendwie kann ich keine URIs an die Geräte schicken. Ganz generell funktioniert aber die Verbindung, d.h., sowohl die Readings werden sauber abgelegt (wenn man das Gerät direkt ohne FHEM startet) und auch die generelle Steuerung über FHEM funktioniert (inkl. Favouriten-Listen, Radiostationen etc.). Nur eben das Abspielen von konkreten mp3s nicht.

Zitat
Naja Du kannst die Geräte einfach umbenennen.

OK, das wäre dann auch mein Ansatz gewesen. War mir nur nicht sicher, ob sich dadurch Folgeprobleme ergeben.

Danke schon mal!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Mai 2022, 10:10:15
funktioniert das über x_raw_payload?
{
  "command": "notify",
  "input": {
    "trackUri": "https://cdn.smartersoft-group.com/various/pull-bell-short.mp3",
    "onlyWhenPlaying": false,
    "timeout": 10,
    "volume": 15,
    "delayMs": 700
  }
}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: m8ichael am 19 Mai 2022, 10:37:08
Hallo,

Zitat
funktioniert das über x_raw_payload?
Code: [Auswählen]

{
  "command": "notify",
  "input": {
    "trackUri": "https://cdn.smartersoft-group.com/various/pull-bell-short.mp3",
    "onlyWhenPlaying": false,
    "timeout": 10,
    "volume": 15,
    "delayMs": 700
  }
}

Nein. leider auch nicht. Da scheint also irgendetwas in der MQTT-Verarbeitung schief zu laufen. Merkwürdig nur, dass der Rest einwandfrei funktioniert.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Mai 2022, 11:54:03
wie hast Du sonos2mqtt am laufen? nodejs lokal oder docker container? In beiden gibt es ein Log:
z.B. mit portainer ins log schauen bzw. lokal mit pm2 monit oder pm2 logs (allerdings als der user unter dem der nodejs läuft)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: m8ichael am 19 Mai 2022, 16:20:16
Hi!

Zitat
wie hast Du sonos2mqtt am laufen? nodejs lokal oder docker container? In beiden gibt es ein Log:
z.B. mit portainer ins log schauen bzw. lokal mit pm2 monit oder pm2 logs (allerdings als der user unter dem der nodejs läuft)

Alles klar, jetzt läuft es. Im Rahmen der Einrichtung lief der Prozess sonos2mqtt anscheinend mehrfach unter verschiedenen Benutzern.

Dankeschön!  :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: australien am 07 August 2022, 14:26:08
Hallo Otto123,

ich bekomme seit ein paar Tagen auf einen meiner drei sonos folgende Meldung
error_code     ECONNREFUSED

kann ich die irgend wie weg bekommen? Der Sonos reagiert auf nichts via mqtt.

Weiters ist mir aufgefallen, dass die IP der Speaker nicht mit der aktuellen übereinstimmt.
Sieht aus, also ob sich die Bridge nicht akutallisert, obwohl verbunden.

Danke
A.



Lösung: neustart des pm2 am Raspberry, warum notwendig, keine Ahnung.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 07 August 2022, 17:04:12
Hi,

ich habe auch festgestellt: wenn sich irgendwas an der Sonosumgebung ändert - neuer Speaker, ein Speaker war lange aus, Netzwerkrouter (DHCP) gewechselt o.ä. - dann muss man den sonos2mqtt Service neu starten.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: der-Lolo am 16 September 2022, 09:41:35
Best Practice?

Die nur gelegentlich genutzten Lautsprecher hier im Haus schalte ich via on-for-timer an - der Badezimmer Lautsprecher steht nur morgen für 90min zur Verfügung, oder nach anforderung via Taster im Bad.
Wie kann ich nun am schnellsten und zuverlässigsten reagieren wenn der Lautsprecher fertig ist mit Booten und bereit ist Befehle zu empfangen?

Im Badezimmer fall würde ich gerne sobald als möglich einen Radiosender laden und abspielen.

Aufgefallen ist mir das reading ts - es steht zwar nur eine Zahl drin, aber offensichtlich ist es das erste reading welches sich nach einem neustart ändert.

Welche möglichkeiten nutzt ihr? 
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 16 September 2022, 13:35:10
Zitat von: der-Lolo am 16 September 2022, 09:41:35
Best Practice?
Welche möglichkeiten nutzt ihr?

Ich schalte bei Abwesenheit alle SONOSe aus. Bei Anwesenheit schalten sie wieder ein und dann ein sleep bis die Bridge wieder online ist:
fhem("sleep SonosBridge:connected:.2; set Beam playFav ...")

VG Sebastian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: der-Lolo am 16 September 2022, 16:20:51
Hallo Sebastian,
das ist nicht ganz mein Anwendungsfall - ein Sonos Connect im Haus läuft 24/7, somit geht die Bridge gar nicht auf disconnect...
Gibt es noch andere work arounds?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: new_newbie am 17 September 2022, 22:00:26
Hallo,

mir ist ein Fehler in der 99_sonos2mqttUtils.pm aufgefallen. Die Funktion sonos2mqtt_ur liefert für die favlist in der Bridge ein leeres Ergebnis zurück nach einem "get Favorites". Hier fehlt ein return.

if ($reading eq 'favlist'){
return sonos2mqtt_getList ($name,'Favorites')
}
#### sub for userReadings
#
sub sonos2mqtt_ur
{
my $name = shift // return '';
my $reading = shift || 'reading';
my @out;

if ($reading eq 'grouplist'){
   for (devspec2array('a:model=sonos2mqtt_speaker')) {
     if (ReadingsVal($_,'isMaster','')) {
        push @out,ReadingsVal($_,'name','')
     }
   }
  return join(',', sort @out)
}
if ($reading eq 'favlist'){
return sonos2mqtt_getList ($name,'Favorites')
}

if ($reading eq 'Input') {
   my $currentTrack_TrackUri = ReadingsVal($name,'currentTrack_TrackUri','');
   return $currentTrack_TrackUri =~ 'x-rincon-stream'
      ? 'LineIn': $currentTrack_TrackUri =~ 'spdif'
      ? 'TV'    : ReadingsVal($name,'enqueuedMetadata_UpnpClass','') eq 'object.item.audioItem.audioBroadcast'
      ? 'Radio' : 'Playlist'
  }
}

Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 September 2022, 12:35:06
Danke new_newbie - ich hab den bugfix eingecheckt.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 10 Oktober 2022, 13:19:41
Hallo zusammen,
ich habe nun seit einiger Zeit meine Sonos auch auf ghcr.io/svrooij/sonos2mqtt im Docker umgestellt.
Die FHEM Devices sind alle angelegt und das klappt dann auch soweit.
Nun fehlt mir noch die Sprachausgabe, die ich früher schonmal verwendet hatte, ich steig aber einfach nicht durch, wie das bei mqtt2 einzurichten ist.

Von der alten Installation habe ich noch dieses Share, was direkt im Basis Linux des RPI liegt.

pi@raspberrypi:/ $ ls -l /media
drwxrwxrwx  2 root root 4096 Mär 19  2022 SonosSpeak

Aber da hatte ich auch etwas gelesen, was Samba im Docker Container verwendet, allerdings finde ich es nicht mehr :-)
EDIT: https://forum.fhem.de/index.php/topic,89745.msg1034994.html#msg1034994 (https://forum.fhem.de/index.php/topic,89745.msg1034994.html#msg1034994), aber da geht es nicht weiter zur Anleitung :-(

Gibt es zu dem Thema bereits eine Step by Step Anleitung? Ich würde da auch gerne wieder auf der grünen Wiese anfangen.

VG
   Christian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 10 Oktober 2022, 13:23:41
Hallo Christian,

ich nehme immer noch die TEXT2SPEECH Variante: https://wiki.fhem.de/wiki/Sonos2mqtt#Sprachausgabe

Das mit Samba ist umständlich ...

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 10 Oktober 2022, 13:26:10
Zitat von: Otto123 am 10 Oktober 2022, 13:23:41
Hallo Christian,

ich nehme immer noch die TEXT2SPEECH Variante: https://wiki.fhem.de/wiki/Sonos2mqtt#Sprachausgabe

Das mit Samba ist umständlich ...

Gruß Otto
Hallo Otto,
okay, dann lasse ich Samba auch weg und beginne mal mit dem TEXT2SPEECH im Wiki
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 10 Oktober 2022, 13:57:41
Hmm,
da fehlt wohl noch was, oder es muss noch was im sonos2mqtt Container konfiguriert werden?
FHEM läuft auch im Container und MP3Wrap ist wohl schon installiert.

EDIT: Für ARM/Raspbian sind die libttspico-utils leider nicht verfügbar,
      Brauch ich das im RPI FHEM Docker Container? Mir würde die Google Stimme reichen.

EDIT: http://192.168.178.40:8083/fhem/cache/
         File not found: cache/index.html

         http://192.168.178.40:8083/fhem/cache/cdd7bbbd4d163976240e58b236928cff.mp3
         Das wird im Browser mit einem freundlichen "Hallo" abgespielt.

EDIT: @otto
         Auf Deiner Seite steht noch etwas von /var/SonosSpeak und einem zusätzlichen userReadings cifsName , das habe ich auch mal versucht.
         Ich denke das /var/SonosSpeak wird sicherlich nicht benötigt, wenn man den HTTP FHEM cache verwendet.



2022.10.10 13:49:09.899 3: MQTT2_DEVICE set MQTT2_RINCON_949F3EE130B001400 sayText Hallo
2022.10.10 13:49:10.431 3: MQTT2_DEVICE set MQTT2_RINCON_949F3EE130B001400 notify 15 http://raspberrypi:8083/fhem/cache/cdd7bbbd4d163976240e58b236928cff.mp3
2022.10.10 13:49:10.440 2: After sleep: Deleted reading text for device SonosTTS
==> es ist nichts zu hören
2022.10.10 13:49:59.472 3: MQTT2_DEVICE set MQTT2_RINCON_949F3EE130B001400 speak Hallo
2022.10.10 13:49:59.476 1: PERL WARNING: Use of uninitialized value $text in concatenation (.) or string at ./FHEM/99_sonos2mqttUtils.pm line 141.
2022.10.10 13:49:59.477 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};{sonos2mqtt($NAME,$EVENT)}
2022.10.10 13:49:59.482 3: set SonosTTS tts ;sleep SonosTTS:playing:.0 ;set MQTT2_RINCON_949F3EE130B001400 notify Hallo [SonosTTS:httpName] : tts needs text parameter
==> es ist nichts zu hören

Was ist denn der [SonosTTS:httpName] ???

Hier mal meine momentanen Devices

Internals:
   ALSADEVICE
   CFGFN     
   DEF        none
   FUUID      63440379-f33f-61a8-5b14-d9a8e23aef0da15f
   MODE       SERVER
   NAME       SonosTTS
   NR         147200
   STATE      Initialized
   TYPE       Text2Speech
   VOLUME     100
   eventCount 11
   OLDREADINGS:
   READINGS:
     2022-10-10 13:35:21   host            raspberrypi:8083
     2022-10-10 13:49:10   httpName        http://raspberrypi:8083/fhem/cache/cdd7bbbd4d163976240e58b236928cff.mp3
     2022-10-10 13:49:10   lastFilename    cache/cdd7bbbd4d163976240e58b236928cff.mp3
     2022-10-10 13:49:10   playing         0
     2022-10-10 13:48:21   vol             15
   helper:
     TTS_PlayerOptions
     Text2Speech:
Attributes:
   DbLogExclude .*
   TTS_CacheFileDir cache
   TTS_Language Deutsch
   TTS_UseMP3Wrap 1
   room       Multimedia->Sonos
   userReadings httpName:lastFilename.* {'http://'.ReadingsVal($name,'host','set host:port first').'/fhem/'.ReadingsVal($name,'lastFilename','')}


Internals:
   CFGFN     
   DEF        cache cache SonosSpeakWeb
   FUUID      63440379-f33f-61a8-68cc-c00a439c0a2836ad
   NAME       SonosSpeakWeb
   NR         147201
   STATE      SonosSpeakWeb
   TYPE       HTTPSRV
   fhem:
     directory  cache
     friendlyname SonosSpeakWeb
     infix      cache
Attributes:
   DbLogExclude .*
   room       Multimedia->Sonos
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 10 Oktober 2022, 14:35:33
hier steht das reading host und httpName
Zitat2022-10-10 13:35:21   host            raspberrypi:8083
     2022-10-10 13:49:10   httpName        http://raspberrypi:8083/fhem/cache/cdd7bbbd4d163976240e58b236928cff.mp3
Wenn aber raspberrypi vom Namen her nicht nach 192.168.178.40 aufgelöst wird, funktioniert das nicht  ::)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 10 Oktober 2022, 14:36:55
Zitat von: Otto123 am 10 Oktober 2022, 14:35:33
hier steht das reading host und httpNameWenn aber raspberrypi vom Namen her nicht nach 192.168.178.40 aufgelöst wird, funktioniert das nicht  ::)
Ich habe schon einiges im letzten Post eingefügt, auch das mit der IP-Adresse, es klappt aber bisher immer noch nicht.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 10 Oktober 2022, 14:40:27
klappt denn einset MQTT2_RINCON_949F3EE130B001400 notify 15 http://192.168.178.40:8083/fhem/cache/cdd7bbbd4d163976240e58b236928cff.mp3

Zitatset MQTT2_RINCON_949F3EE130B001400 speak Hallo
ist falsch, dort ist es
set MQTT2_RINCON_949F3EE130B001400 speak 15 Hallo

ZitatEDIT: @otto
         Auf Deiner Seite steht noch etwas von /var/SonosSpeak und einem zusätzlichen userReadings cifsName , das habe ich auch mal versucht.
         Ich denke das /var/SonosSpeak wird sicherlich nicht benötigt, wenn man den HTTP FHEM cache verwendet.
Vergiss das, das ist nicht mehr aktuell. Das Wiki ist aktuell.
ZitatIch habe derzeit die aktuellste Anleitung ins FHEM Wiki geschrieben, aufgeteilt in 2 Artikel.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 10 Oktober 2022, 14:48:09
Zitat von: Otto123 am 10 Oktober 2022, 14:40:27
klappt denn einset MQTT2_RINCON_949F3EE130B001400 notify 15 http://192.168.178.40:8083/fhem/cache/cdd7bbbd4d163976240e58b236928cff.mp3
ist falsch, dort ist es
set MQTT2_RINCON_949F3EE130B001400 speak 15 Hallo
Vergiss das, das ist nicht mehr aktuell. Das Wiki ist aktuell.
Das funktioniert nicht.

2022.10.10 14:45:34.531 3: MQTT2_DEVICE set MQTT2_RINCON_949F3EE130B001400 notify 15 http://192.168.178.40:8083/fhem/cache/cdd7bbbd4d163976240e58b236928cff.mp3

Im Browser wird die Datei jedoch abgespielt, was für mich zeigt, dass sie im cache bereit steht.
Muss ich im sonos2mqtt noch etwas konfigurieren?

EDIT:
cifsName x-file-cifs://192.168.178.40:8083
/var/SonosShare
sind jetzt wieder raus.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 10 Oktober 2022, 14:50:58
klappt ein
set MQTT2_RINCON_949F3EE130B001400 notify 25 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3

Dürfen denn die Sonos Player mit http://192.168.178.40 reden? allowed ?

ZitatMuss ich im sonos2mqtt noch etwas konfigurieren?
eigentlich nicht
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 10 Oktober 2022, 15:04:22
Zitat von: Otto123 am 10 Oktober 2022, 14:50:58
klappt ein
set MQTT2_RINCON_949F3EE130B001400 notify 25 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3
Okay, es war beim ersten mal ziemlich verzögert, aber dann kam der Sound.

Zitat
Dürfen denn die Sonos Player mit http://192.168.178.40 reden? allowed ?
Das habe ich so im Docker

  sonos:
    image: ghcr.io/svrooij/sonos2mqtt
    # or the dockerhub svrooij/sonos2mqtt
    restart: unless-stopped
    ports:
      - "6329:6329"
    environment:
      - SONOS2MQTT_DEVICE=192.168.178.36 # Service discovery doesn't work very well inside docker, so start with one device.
      - SONOS2MQTT_MQTT=mqtt://192.168.178.40:1883 # mqtt2_server FHEM
      # - SONOS2MQTT_DISTINCT=true # if your want distinct topics
      - SONOS_LISTENER_HOST=192.168.178.40 # Docker host IP
      # - SONOS_TTS_ENDPOINT=http://sonos-tts:5601/api/generate # If you deployed the TTS with the same docker-compose
    depends_on:
      - "fhem"
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 10 Oktober 2022, 15:16:29
Also Sound geht prinzipiell, Deine Sonosplayer kommen offenbar nicht an den WebServer von FHEM.
Der Web Server von FHEM geht aber: Browsertest hat funktioniert  :-\
TTS funktioniert und erzeugt mp3 Dateien

Die Docker Konfiguration spielt da keine Rolle.
Deine Sonosplayer sind im gleichen IP Segment: 192.168.178.x ?
Das FHEMWEB ist im Zugriff nicht auf IP Adressen eingeschränkt?
zusätzliche Firewall aktiv?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 10 Oktober 2022, 15:22:51
Zitat von: Otto123 am 10 Oktober 2022, 15:16:29
Deine Sonosplayer sind im gleichen IP Segment: 192.168.178.x ?
ja

Zitat
zusätzliche Firewall aktiv?
Hausintern ist da nichts.

Zitat
Das FHEMWEB ist im Zugriff nicht auf IP Adressen eingeschränkt?
Da ist eine Benutzerkennung und ein Passwort drauf und das wird es sein...
In einem private Browser wird das beim Aufruf der mp3 abgefragt.
Wie kann ich das denn ohne große Sicherheitslücke für den cache ohne Passwort freigeben?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 10 Oktober 2022, 15:32:45
ZitatDa ist eine Benutzerkennung und ein Passwort drauf und das wird es sein...
Du wieder  ;D :o

Wie machst Du das nun: zus. FHEMWEB mit neuem Port definieren - Sonos2mqtt port umstellen und testen
Dann dieses WEB in der Nutzung auf das cache Directory einschränken - wenn ich wüßte ob und wie das geht  :-[

Oder anderen WEB Server starten der nichts mit FHEMWEB zu tun hat.
Also konsequenterweise einen kleinen Stino WEB Server Container, der das Arbeitsverzeichnis fhem/cache (oder anderes Verzeichnis in das auch TEXT2SPEECH schreibt) gemappt bekommt :)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 10 Oktober 2022, 15:50:56
Zitat von: Otto123 am 10 Oktober 2022, 15:32:45
Du wieder  ;D :o
Hast Du im Haus intern alles offen, oder wie sind da die Empfehlungen für FHEM?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 10 Oktober 2022, 16:52:30
Sooo, nun geht es.

Wer also eine Benutzerkennung mit Passwort verwendet muss sich einen zweiten FHEM Port konfigurieren und diesen dann z.B. auf die IP-Adresse des Sonos2mqtt limitieren.

Vielen Dank für die Hilfe
     Christian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 10 Oktober 2022, 18:36:55
Ja ich habe intern mein FHEM offen. Ne Empfehlung gibt es glaube ich nicht. Aber ich achte schon  auf Sicherheit :)
Meine Bemerkung galt weniger dem "nicht offen" sondern mehr Dir, hätte Dir ja einfallen können, dass Sonos Deinen Account nicht hat ;)
Funktioniert das wirklich mit der IP von sonso2mqtt? Ich habe das nie probiert, habe aber gedacht der Player bekommt nur die url zugeworfen und muss dann selbst holen. Wenn das funktioniert ist ja gut zu wissen.

Ich baue bei Gelegenheit mal noch ne Anleitung in Richtung Web Server Container.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: ch.eick am 10 Oktober 2022, 19:35:01
Zitat von: Otto123 am 10 Oktober 2022, 18:36:55
Ja ich habe intern mein FHEM offen. Ne Empfehlung gibt es glaube ich nicht. Aber ich achte schon  auf Sicherheit :)
Meine Bemerkung galt weniger dem "nicht offen" sondern mehr Dir, hätte Dir ja einfallen können, dass Sonos Deinen Account nicht hat ;)
Funktioniert das wirklich mit der IP von sonso2mqtt? Ich habe das nie probiert, habe aber gedacht der Player bekommt nur die url zugeworfen und muss dann selbst holen. Wenn das funktioniert ist ja gut zu wissen.
Wenn man den Mechanismuss versteht, kann man auch drauf kommen ;-)
Das zuwerfen und selber drum kümmern ist der Schlüssel hierbei.

Ich hatte schon einen weiteren Port für das FHEMWEB, der für eine API verwendt wird, dort habe ich nun die IP-Adresse des Sonos2mqtt Containers zugelassen.
Folgendes konnte man nach der Port Änderung im FHEM Log sehen

2022.10.10 16:36:22.306 3: MQTT2_DEVICE set MQTT2_RINCON_949F3EE130B001400 sayText Hallo
2022.10.10 16:36:22.839 3: MQTT2_DEVICE set MQTT2_RINCON_949F3EE130B001400 notify 15 http://192.168.178.40:8088/fhem/cache/cdd7bbbd4d163976240e58b236928cff.mp3
2022.10.10 16:36:22.847 2: After sleep: Deleted reading text for device SonosTTS
2022.10.10 16:36:22.915 1: Connection refused from 192.168.178.35:46435

Bisher konnte nur FHEM selber die WEBapi verwenden und nun halt auch Sonos2mqtt

allowfrom 192.168.178.40|192.168.178.35|127.0.0.1


VG Christian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: m8ichael am 11 Oktober 2022, 19:22:13
Hallo,

mal eine kurze Frage in die Runde: Gibt es bei sonos2mqtt etwas zu beachten bei der Angabe der MQTT-Zugangsdaten? Ich habe jetzt einmal das ganze neu installieren müssen und nun meckert sonos2mqtt stets, dass die Verbindung zum MQTT-Server zurückgewiesen wird. Dabei nutze ich die folgende Befehlszeile zum Start von sonos2mqtt:

sonos2mqtt -- --device 10.20.1.33 --mqtt mqtt://user:PASSWORT@127.0.0.1:1883

Als MQTT-Server nutze ich mosquitto auf der gleichen Maschine (also IP 127.0.0.1). Konfiguriere ich Mosquitto ohne Passwortsicherung, so funktioniert alles, wie es soll. Andersherum komme ich mit anderen Clients ganz normal auch bei aktiviertem Passwortschutz auf den MQTT-Server. Ich stehe irgendwie auf'n Schlauch...

Viele Grüße

Michael
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 11 Oktober 2022, 21:06:16
Hallo Michael,

keine Erfahrung damit, aber allgemeine Idee: Sonderzeichen im user:password Konstrukt? Wenn ja muss man die hier encodieren?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: m8ichael am 12 Oktober 2022, 07:42:39
Hallo Otto,

Zitat von: Otto123 am 11 Oktober 2022, 21:06:16
keine Erfahrung damit, aber allgemeine Idee: Sonderzeichen im user:password Konstrukt? Wenn ja muss man die hier encodieren?

Das scheint hier nicht der Fehler zu sein, da ich testweise auch ein Passwort vergeben habe, welches nur aus Kleinbuchstaben besteht. Auch hier wird ein Authorisierungsfehler seitens sonos2mqtt gemeldet.  :-\
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 12 Oktober 2022, 09:05:19
Tut mir leid, keine Erfahrung mit dem Betrieb mit mosquitto - ich verwende MQTT2_SERVER.
Wie startest Du sonos2mqtt? Deine Zeile sieht aus wie pm2?
Hast Du alternative config Methoden probiert? https://svrooij.io/sonos2mqtt/getting-started.html#local-installation
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: kjmEjfu am 12 Oktober 2022, 14:40:32
Ich wiederhole mich ja ungern ;-) aber Sonos2Mqtt ist prima für Docker geeignet und läuft da saustabil und mit viel weniger Problemen.
Man kann svrooij/sonos2mqtt nutzen und zusätzlich auch noch svrooij/sonos-tts-polly

Läuft einfach - auch mit mosquitto  ;D
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: new_newbie am 22 November 2022, 20:14:36
Hallo Otto,
mir ist noch etwas aufgefallen. Als Favoriten werden nur die Radiostationen übernommen, nicht aber die Sonos eigenen Sender. Hat das einen bestimmten Grund?

Ich habe in meiner Datei die Funktion sub sonos2mqtt_getList etwas erweitert, damit eben auch die Sonos eigenen Sender mit in die Favoriten übernommen werden.

Aus if ( $_->{'TrackUri'} =~ /x-sonosapi-stream/) habe ich if ( $_->{'TrackUri'} =~ /x-sonosapi-stream/ or $_->{'TrackUri'} =~ /x-sonosapi-radio/) gemacht.
Die komplette Funktion anbei.

# return a list of Titles from the favorite json Arrays
# the Favorites Array will be filtered and returns only Radio stations
sub sonos2mqtt_getList
{
my $name = shift // return '';
my $reading = shift || 'Favorites';
my @out;
   use JSON;
   use HTML::Entities;
   use Encode qw(encode decode);
   my $enc = 'UTF8';
   my $decoded = decode_json(ReadingsVal($name,$reading,''));
   my @arr  = @{$decoded->{'Result'}};
   for (@arr) {
     my $dec = encode($enc, decode_entities($_->{'Title'}));
     $dec =~ s/\s/./g;
     if ($reading eq 'Favorites') {
    if ( $_->{'TrackUri'} =~ /x-sonosapi-stream/ or $_->{'TrackUri'} =~ /x-sonosapi-radio/){
       push @out,$dec;
    }
} else {push @out,$dec;}
   }
  return join(',', @out);
}
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 23 November 2022, 17:34:33
Hi,

danke für die Info.
Zitat von: new_newbie am 22 November 2022, 20:14:36
mir ist noch etwas aufgefallen. Als Favoriten werden nur die Radiostationen übernommen, nicht aber die Sonos eigenen Sender. Hat das einen bestimmten Grund?
keinen bestimmten aber einfachen: ich wusste es nicht besser. Ich probiere es aus und bau es mit ein.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: christian.71 am 30 November 2022, 15:53:36
Hallo zusammen,

ich weiß nicht, ob es anderen auch schon aufgefallen ist, aber seitdem meine Sonos One und Sonos Arc auf die Version 14.19.1 geupdated wurden, werden keine Readings beim Template sonos2mqtt_speaker mehr aktualisiert (z. B. transportState bei SonosOne oder Volume beim Sonos Arc). Ist das ein Problem von der Firmware von Sonos oder vom Modul Sonos2mqtt?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 30 November 2022, 16:23:50
Ist das Sonos S2? Ich habe noch eine Version 11.6.1
Wo das Problem liegt kann ich so schwer sagen, dazu müsste dazu wissen ob lediglich etwas anderes gesendet wir?
Kannst Du im MQTT2 Server mal die raw Events anschauen, ob überhaupt was von den Boxen kommt?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: christian.71 am 30 November 2022, 20:35:45
Ja, das ist die Sonos S2. Dann hast du ja lange kein Update gemacht.  ;D
Ich habe mir mal den Traffic im MQTT2 Server angeschaut, da kommt schon nichts rein von Sonos.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 30 November 2022, 21:21:28
Alles aktuell, aber nicht bereit die Play5 wegzuschmeißen. Deswegen bleib ich wohl auf S1.

Ich glaube noch nicht dran, dass es ein Versionsproblem ist. Wie hast Du den nodejs sonos2mqtt eingebunden? Funktioniert der nicht mehr? Findet der keine Speaker mehr?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: christian.71 am 30 November 2022, 21:50:47
Bis vor kurzem hat auch noch alles funktioniert. Ich benutze die Sonos Steuerung über MQTT schon eine ganze Weile. Befehle mit set funktionieren auch noch. Nur bei den Readings kommt nix. Ich habe gerade auch noch mal nodejs geupdatet und ein fhem Update durchgeführt. Leider ohne Erfolg.  :-\
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 01 Dezember 2022, 00:11:51
sind die Readings in der Bridge oder in neuen Device gelandet?
Hast Du mal ein list SonosBridge ;)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 01 Dezember 2022, 07:17:38
Moinsen,
also bei meinen S2 Playern (P1, One, 2x Symfonisk + Beam) mit der neusten S2 Version sieht alles gut aus.
Events und Readings kommen wie gewohnt rein.

VG Sebastian
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: christian.71 am 01 Dezember 2022, 09:46:41
@Otto Mit der Bridge war ein guter Hinweis. Nachdem ich nun mal ein announcementall und ein notifyall beim Bridge Device durchgeführt habe, kommen auch wieder die Readings.  :)  keine Ahnung wieso, aber es geht nun wieder alles, so wie es soll. Danke für die Unterstützung.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 50watt am 05 Januar 2023, 15:32:12
@Otto: Nimmst du Änderungswünsche für 99_sonos2mqttUtils.pm entgegen?
Ich habe hier in der SonosApp die Radiostationen manuell (mit der Stream URL der Radiostation) hinzugefügt, um der TuneIn Werbung am Beginn der Wiedergabe zu entgehen (In der Sonos App -> TuneIn -> Meine Radiosender -> rechts oben auf "..." -> "Neuen Radiosender hinzufügen").
Diese Radiostationen erscheinen im Device SonosBridge" im Reading "Favorites", haben dann als "TrackUri" "x-rincon-mp3radio" (und nicht "x-sonosapi-stream").
Das führt dazu, dass im Device "SonosBridge" das userReading "favlist" leer bleibt.

Folgende Änderung in 99_sonos2mqttUtils.pm behebt das.
Zusätzlich wird die Erkennung für das userReading "Input" für "Radio" angepasst, damit die "manuell hinzugefügten Radiostationen" auch das userReading "Input" auf "Radio" setzen.


Index: 99_sonos2mqttUtils.pm
===================================================================
--- 99_sonos2mqttUtils.pm (revision 26966)
+++ 99_sonos2mqttUtils.pm (working copy)
@@ -343,7 +343,7 @@
    my $currentTrack_TrackUri = ReadingsVal($name,'currentTrack_TrackUri','');
    return $currentTrack_TrackUri =~ 'x-rincon-stream'
       ? 'LineIn': $currentTrack_TrackUri =~ 'spdif'
-      ? 'TV'    : ReadingsVal($name,'enqueuedMetadata_UpnpClass','') eq 'object.item.audioItem.audioBroadcast'
+      ? 'TV'    : ((ReadingsVal($name,'enqueuedMetadata_UpnpClass','') eq 'object.item.audioItem.audioBroadcast')||($currentTrack_TrackUri =~ 'x-rincon-mp3radio'))
       ? 'Radio' : 'Playlist'
   }
}
@@ -365,7 +365,7 @@
      my $dec = encode($enc, decode_entities($_->{'Title'}));
      $dec =~ s/\s/./g;
      if ($reading eq 'Favorites') {
-     if ( $_->{'TrackUri'} =~ /x-sonosapi-stream/) {
+     if (( $_->{'TrackUri'} =~ /x-sonosapi-stream/)||( $_->{'TrackUri'} =~ /x-rincon-mp3radio/)) {
       push @out,$dec
    }
} else {push @out,$dec}


Liebe Grüße 50watt
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 05 Januar 2023, 21:00:55
Hallo 50watt,

ich schau es mir an und arbeite das ein. Bin auch noch nicht dazu gekommen https://forum.fhem.de/index.php/topic,111711.msg1247194.html#msg1247194
Dies ist ja irgendwie die gleiche Baustelle ;)

Danke für Deine Zuarbeit.

Edit: Ich habe das mal so eingecheckt.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 50watt am 06 Januar 2023, 00:08:21
Guten Abend Otto123,
Danke für dein rasches Handeln.
Die Version im SVN funktioniert nicht:
346       ? 'TV'    : ReadingsVal($name,'enqueuedMetadata_UpnpClass','') eq 'object.item.audioItem.audioBroadcast' or $currentTrack_TrackUri =~ 'x-rincon-mp3radio'

So funktioniert es:
346              ? 'TV'    : ((ReadingsVal($name,'enqueuedMetadata_UpnpClass','') eq 'object.item.audioItem.audioBroadcast') or ($currentTrack_TrackUri =~ 'x-rincon-mp3radio'))

Würdest du das nochmals ansehen und aktualisieren?
Liebe Grüße
Dieter
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 06 Januar 2023, 09:07:02
Hallo Dieter,

ich habe es mit einem Klammernpaar weniger eingecheckt. Kannst Du nochmal testen? Bei mir geht das so.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 50watt am 06 Januar 2023, 10:34:11
Lieber Otto,
vielen Dank für die so rasche Antwort. Es funktioniert nicht.
Ich habe
{ Svn_GetFile("contrib/AttrTemplate/99_sonos2mqttUtils.pm", "FHEM/99_sonos2mqttUtils.pm", sub(){ CommandReload(undef, "99_sonos2mqttUtils") }) }
ausgeführt, das fhem log geprüft, und
shutdown restart
ausgeführt. Beim Starten eines Radio Senders wird im sonos2mqtt_speaker das Reading "Input" auf "1" gesetzt und nicht, wie erwünscht, auf "Radio".

Bitte aktualisiere 99_sonos2mqttUtils.pm nochmals ;-)

Liebe Grüße 50watt
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 06 Januar 2023, 12:19:29
Ja sorry - ich bin sparsam aber nicht fehlerfrei ;)
Man muss den ganzen Ausdruck klammern, aber die Teilausdrücke braucht man in dem Fall mMn nicht klammern.
Jetzt sollte es passen und auch für x-sonosapi-radio funktionieren.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 50watt am 06 Januar 2023, 13:02:23
Lieber Otto123,
für mich funktioniert die neue Version von 99_sonos2mqttUtils.pm nun.
Vielen Dank - was für ein Service!
Liebe Grüße
Dieter
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Loetkolben am 12 Januar 2023, 12:35:50
Nachdem ich mit dem normalen Sonos-Modul immer wieder Probleme hatte, bin ich jetzt auch auf Sonos2MQTT umgestiegen, mit Hilfe des Wiki eigentlich recht einfach.
Grundsätzlich klappt alles wunderbar, nur habe ich noch ne Frage zu den Favoriten.

Mit der alten Version hatten die einzelnen Sonos-Gerät eine eigene Favoritenliste, in TabletUI konnte man dann aus dem Reading 'FavouritesList' ein schönes DropDown bauen und hier z.B. einen Radiosender auswählen.

In der neuen Variante gibt es die Favoritenliste nicht in den einzelnen Playern, sondern nur im Device 'SonosBridge'.
Wie könnte man das hier machen.


Grüße - Andreas
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 12 Januar 2023, 14:08:25
Hallo Andreas,

das steht noch auf Handarbeit :)
https://wiki.fhem.de/wiki/Sonos2mqtt#Player_mit_Favoritenliste_und_Gruppenliste_ausstatten

Aber ich nix TableUI :)

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Loetkolben am 13 Januar 2023, 08:43:33
Hallo Otto,

den Abschnitt habe ich durch.
Damit wird im Player kein Reading erstellt, in dem die Favoriten sind - richtig?
Ich habe mir jetzt erstmal manuell ein Reading 'favlist' im Player erstellt, das kann ich über TabletUI auswerten und somit auch den Player vrsorgen.

Grüße - Andreas
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 13 Januar 2023, 09:42:08
Hallo Andreas,
Naja das grundlegende reading favlist entsteht an der Bridge - wozu braucht man diese Information redundant an jedem Player? Aber wenn man will kann man das mit einem Befehl aus der Bridge übernehmen. ;)
Am Player entsteht ein setter playFav der direkt die Favoritenlisten enthält - diese ist ja am Player in WebUI direkt verwendbar.

Ich wollte sogar vom Ansatz her auf diese Datenschubserei ganz verzichten, deswegen kann der Befehl play ja die Listen direkt nach Begriffen durchsuchen. Aber ich bediene mein Heim nur selten mit der FHEM WebUI. Ich setze auf unsichtbare Automation, zum Bedienen von Sonos nehme ich die Sonos App. ;D

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Reinschki am 16 Januar 2023, 16:45:35
Hallo in die Runde,

wie werden folgende set-Befehle an der Bridge angewendet und was muss passieren?

set SonosBridge announcementall
set SonosBridge notifyall
set SonosBridge PauseAll


Bei mir schmiert Fhem ab, wenn ich nichts weiter angebe...
Bei Angabe eines Textes passiert nix!
Bei PauseAll pausiert keiner der laufenden Player...

Grüße
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Reinschki am 16 Januar 2023, 17:00:38
Habe noch ne Frage...

Wie stelle ich es am geschicktesten an, wenn ich einen Sound gefolgt von einer Sprachnachricht an eine Gruppe Player senden will.
Die vorherige Gruppierung sollte am besten wieder hergestellt, das Programm fortgesetzt werden.

Hier die DEF meines aktuellen Doif:
([deCONZ_Switch_08:"^click$"])
((set a:model=sonos2mqtt_speaker:FILTER=alias=Roam|Flex|Wohnzimmer joinGroup Küche))
(set a:model=sonos2mqtt_speaker volume 30)
(set a:model=sonos2mqtt_speaker:FILTER=alias=Küche notify 50 {('http://[SonosTTS:host]/fhem/cache/Ship_Bell.mp3')})
({fhem("set a:model=sonos2mqtt_speaker:FILTER=alias=Küche speak es-ES Enrique 50 Buenas Noches la cena está lista. Buen provecho.")})


Die Angabe der Lautstärke muss ich vorher setzen, da sie unter der Angabe im notify nicht beachtet wird!?
Kann ich nach der Durchsage zum entgruppieren auf irgendetwas reagieren, so dass ich passgenau entkoppeln kann?

Grüße
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 16 Januar 2023, 18:43:29
Hi,

mal noch als Start https://forum.fhem.de/index.php/topic,111711.msg1136303.html#msg1136303

ZitatDie Angabe der Lautstärke muss ich vorher setzen, da sie unter der Angabe im notify nicht beachtet wird!?
Nein siehe Beispiel
Zitatwird mit set Player notify volume uri abgespielt.
Durch den "sonos2mqtt notify" Befehl wird die laufende Umgebung wiederhergestellt.

Wird der Sprachbefehl an den Gruppenmaster gesendet wird die mp3 Datei in der gesamten Gruppe gespielt.
Wird der Sprachbefehl an ein Mitglied einer Gruppe gesendet (nicht den Master) wird die Gruppe aufgetrennt und später wieder hergestellt.
set alias=Arbeitszimmer notify 20 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3
notifyall funktioniert wie notify - das ist genau wie pauseall einfach durchgereicht https://svrooij.io/sonos2mqtt/global-commands.html
PauseAll funktioniert bei mir bei allen Playern die etwas abspielen, also wo nicht der Eingang gespielt wird (TV zum Beispiel)
announcementall sehe ich gerade, wird nur funktionieren wenn SonosTTS definiert ist - da muss man wohl nochmal nacharbeiten.  :-[
Könnte man aber mit x_raw_payload direkt schicken, wenn TTS endpoint eingerichtet ist: siehe speak hier https://svrooij.io/sonos2mqtt/global-commands.html

"Abstürzen" bedeutet FHEM startet neu?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Reinschki am 17 Januar 2023, 12:59:20
Zitat"Abstürzen" bedeutet FHEM startet neu?
Der set Befehl ohne weitere Angabe von Parametern
set SonosBridge announcementall
erzeugt den Neustart und das im Log:
2023.01.17 12:53:33.012 3: MQTT2_DEVICE set SonosBridge announcementall
2023.01.17 12:53:33.017 1: PERL WARNING: Use of uninitialized value $text in concatenation (.) or string at ./FHEM/99_sonos2mqttUtils.pm line 38.
2023.01.17 12:53:33.017 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $NAME=   $evalSpecials->{'%NAME'};{sonos2mqtt($NAME,$EVENT)}
2023.01.17 12:53:33.017 3: setreading SonosTTS text   ;sleep 0.4 tts;set SonosTTS tts [SonosTTS:text];sleep SonosTTS:playing:.0 ;set SonosBridge notifyall [SonosTTS:vol] [SonosTTS:httpName];deletereading SonosTTS text : Usage: setreading <name> [YYYY-MM-DD HH:MM:SS] <reading> <value>
where <name> is a single device name, a list separated by comma (,) or a regexp. See the devspec section in the commandref.html for details.
Can't locate object method "name" via package "Empty string, empty guess" (perhaps you forgot to load "Empty string, empty guess"?) at ./FHEM/98_Text2Speech.pm line 627.
/entry.sh: line 621: kill: (17580) - No such process
Abrupt daemon termination, starting 10s countdown .../entry.sh: line 625: kill: (17580) - No such process
10/entry.sh: line 625: kill: (17580) - No such process
9/entry.sh: line 625: kill: (17580) - No such process
8/entry.sh: line 625: kill: (17580) - No such process
7/entry.sh: line 625: kill: (17580) - No such process
6/entry.sh: line 625: kill: (17580) - No such process
5/entry.sh: line 625: kill: (17580) - No such process
4/entry.sh: line 625: kill: (17580) - No such process
3/entry.sh: line 625: kill: (17580) - No such process
2/entry.sh: line 625: kill: (17580) - No such process
1/entry.sh: line 625: kill: (17580) - No such process
/entry.sh: line 632: kill: (17580) - No such process
0
Automatic restart ...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Reinschki am 17 Januar 2023, 13:14:29
Zitatnotifyall funktioniert wie notify - das ist genau wie pauseall einfach durchgereicht https://svrooij.io/sonos2mqtt/global-commands.html
PauseAll funktioniert bei mir bei allen Playern die etwas abspielen, also wo nicht der Eingang gespielt wird (TV zum Beispiel)

Beides funktioniert nicht, es erfolgt keine Durchsage bzw. die Player spielen weiter!
set SonosBridge PauseAll
set SonosBridge notifyall 20 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3


Das funktioniert einwandfrei:
set MQTT2_RINCON_542A1BBE498001400 notify 20 https://cdn.smartersoft-group.com/various/pull-bell-short.mp3

Vielleicht hast du ja noch ein paar Tipps für mich!?

Beste Grüße
Reiner
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 17 Januar 2023, 13:48:36
Hallo Reiner,

zeig mal bitte die Ausgabe von
list SonosBridge devicetopic setList

announcementall schau ich mir an.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Reinschki am 17 Januar 2023, 15:43:00
Hallo Otto,

hier das List:

SonosBridge                                devicetopic     sonos
                                           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


Gruß & Danke für Kümmern
Reiner
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 17 Januar 2023, 16:42:08
alles richtig.   :-\
Das klingt mir danach, als ob die Bridge kein publish absetzen kann?
Was hast Du als mqtt Server?
Siehst Du dort den publish ? Beispiel MQTT2_SERVER mit Show MQTT Traffic ...
16:39:15.138 SENT sonos/cmd/pauseall
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Reinschki am 17 Januar 2023, 22:25:49
Ich nutze mosquitto im Docker Container.
Im traffic kann ich den publish sehen...

:(
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 18 Januar 2023, 09:03:49
Moin,

klingt also so, als ob der Weg von der Bridge an den sonos2mqtt Container gestört wird?  :o
Die Steuerung der einzelnen Player geschieht über den topic sonos/RINCON_123456789012345678/control/
Die Steuerung aller Player gemeinsam bzw. zentrale Funktionen passiert über den topic sonos/cmd/ - der scheint bei Dir gestört.

Kann also irgendwie nur sein, dass der mosquitto Container diesen topic nicht weiter an an den sonos2mqtt Container reicht?

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Reinschki am 18 Januar 2023, 21:06:46
Hallo Otto,
ist echt Rätselhaft. Habe heute viel experimentiert. Leider ohne Erfolg...

Immer das gleiche Ergebnis. Es lässt sich alles einzeln steuern. Nur über die Bridge geht es nicht!
Dann habe ich mich mit MQTT.fx mit dem Broker verbunden und sehe per Subscribe das sonos/cmd/pauseall.
Meine Schlussfolgerung ist das die Daten von Fhem an den Broker ausgeliefert werden.
Es muss also was auf der Strecke zwischen dem Broker mosquitto und sonos2mqtt verloren gehen!?

Ich kapier es im Moment nicht.
Für heute mache ich Schluss.

Schönen Abend!

Gruß
Reiner
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Januar 2023, 09:53:32
Moin Reiner,

in Deiner Versuchsreihe fehlte dann aber MQTT2_SERVER :)

Kannst Du mal das logging im sonos Container hochschrauben, geht mit einem publish an sonos/cmd/setlogging verbose siehe https://svrooij.io/sonos2mqtt/global-commands.html
Und dann schauen was beim pauseall im Log passiert? Interessant bei mir: das Kommando wird ausgeführt aber sonos2mqtt wirft danach einen Fehler und startet neu.

Oder was passiert wenn Du über Deinen MQTT Server ein publish absetzt sonos/cmd/pauseall

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Reinschki am 19 Januar 2023, 12:17:19
Gesagt , getan!
Hier der Wechsel auf ein höheres Log-Level und der Output nach dem command pauseall.

2023-01-19T11:01:13.597Z [Information] LogLevel changed to verbose
2023-01-19T11:01:48.656Z [Debug] Mqtt got generic command pauseall
2023-01-19T11:01:48.656Z [Debug] Got generic command pauseall from mqtt
/usr/local/lib/node_modules/sonos2mqtt/node_modules/@svrooij/sonos/lib/services/base-service.js:226
            if (typeof errorResponse['s:Envelope']['s:Body']['s:Fault'] !== 'undefined') {
                                                  ^
TypeError: Cannot read properties of undefined (reading 's:Body')
    at AVTransportService.handleErrorResponse (/usr/local/lib/node_modules/sonos2mqtt/node_modules/@svrooij/sonos/lib/services/base-service.js:226:51)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async AVTransportService.handleRequest (/usr/local/lib/node_modules/sonos2mqtt/node_modules/@svrooij/sonos/lib/services/base-service.js:188:16)
    at async AVTransportService.SoapRequestWithBodyNoResponse (/usr/local/lib/node_modules/sonos2mqtt/node_modules/@svrooij/sonos/lib/services/base-service.js:123:16)
    at async AVTransportService.Pause (/usr/local/lib/node_modules/sonos2mqtt/node_modules/@svrooij/sonos/lib/services/av-transport.service.js:169:53)
    at async SonosDevice.Pause (/usr/local/lib/node_modules/sonos2mqtt/node_modules/@svrooij/sonos/lib/sonos-device.js:938:28)
    at async Promise.all (index 1)
Node.js v17.3.0
2023-01-19T11:01:49.315Z [Information] Starting sonos2mqtt v3.2.0
2023-01-19T11:01:49.324Z [Information] LogLevel changed to information
2023-01-19T11:01:49.399Z [Information] Found 7 sonos speakers
2023-01-19T11:01:49.426Z [Information] Mqtt connection changed to connected: true


Sagt dir das was?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Januar 2023, 12:50:47
Bei mir wird das Kommando ausgeführt und es entsteht (offenbar danach) ein upnp Fehler
Meine Interpretation von Deinem Log:
Bei Dir erhält er das Kommando und erzeugt einen Fehler, den er selbst nicht kennt.

Passiert das auch wenn Du direkt über den MQTT Server ein publish absetzt -> sonos/cmd/pauseall
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Reinschki am 19 Januar 2023, 13:23:30
Das publish -> sonos/cmd/pauseall erzeugt über den MQTT Server sowie über MQtt.fx exakt den gleichen Fehler innerhalb von sonos2mqtt!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Januar 2023, 13:48:36
Welche Parameter hast Du definiert?
Ich habe diese in der docker compose Datei:
      - SONOS2MQTT_DEVICE=192.168.56.238 # Service discovery doesn't work very well inside docker, so start with one device.
      - SONOS2MQTT_MQTT=mqtt://fhem:1883
      - SONOS_LISTENER_HOST=192.168.56.121 #  Docker host IP
      - SONOS_TTS_ENDPOINT=http ....
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Reinschki am 19 Januar 2023, 13:59:44
Bei mir sieht das so aus:
- SONOS2MQTT_DEVICE=192.168.178.51
- SONOS2MQTT_MQTT=mqtt://192.168.178.80:1883
- SONOS_LISTENER_HOST=192.168.178.80
- SONOS_TTS_ENDPOINT=http://sonos-tts:5601/api/generate
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 19 Januar 2023, 14:27:49
ok da gehen mir jetzt die Ideen aus. Offenbar stört ihn etwas in deiner Sonos Landschaft.
Bei mir stört etwas in der UPNP Landschaft, bei mir kommt der Fehler auch in einer lokal installierten Instanz also unabhängig von Docker und irgendwelchen Listener Adressen.
Also ich merke den Fehler nicht, wenn ich nicht ins Log schaue.

Du kannst nur mal Stephan anfragen, ob er zu dem Fehler ein Idee hat. Ich denke ja, es hat nicht mit unsere Anbindung mit FHEM zu tun. Du setzt den Befehl über den von ihm empfohlenen MQTT Server ab, alles Docker, alles soweit definiert...

notifyall schau ich mir mal an ob ich da was stricken kann.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Reinschki am 19 Januar 2023, 15:55:59
Die Anfrage läuft...
Ich Informiere dich zu etwaigen Neuigkeiten!

Nochmals vielen Dank für deine Unterstützung.

Gruß
Reiner
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Reinschki am 20 Januar 2023, 18:52:11
Hallo Otto,

mit der svrooij/sonos2mqtt:3.2.0-beta.11 wurde das Problem gelöst!
:)

Schönes Wochenende!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 26 Januar 2023, 23:15:37
ich habe den Befehl set SonosBridge speak  ... nachgerüstet. Der ersetzt eigentlich den Befehl announcementall und funktioniert analog zum speak Befehl am Player.

{ Svn_GetFile("contrib/AttrTemplate/99_sonos2mqttUtils.pm", "FHEM/99_sonos2mqttUtils.pm", sub(){ CommandReload(undef, "99_sonos2mqttUtils") }) }
Am einfachsten in der setList von der SonosBridge die folgende Zeile nachrüsten
speak:textField {sonos2mqtt($NAME,$EVENT)}

Danach geht so eine Nachricht an alle Player
set SonosBridge speak de-DE Vicki 25 Rundruf Test
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 31 Januar 2023, 20:23:34
Hallo Zusammen,

seit langem "Musste" ich mal wieder etwas in fhem machen.
Habe mich nun doch durchgerungen auf S2 zu gehen, obwohl mein AMP nur S1 kann.
Jetzt habe ich das ganze getrennt.
Kann ich denn S1 und S2 zusammen über sonos2mqtt in fhem bringen?

Sorry, wenn das hier schon irgendwo steht, die Suche war nicht erfolgreich.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 31 Januar 2023, 20:40:50
ich habe das nicht (obwohl ich auch altes und neues habe) aber schau hier https://sonos2mqtt.svrooij.io/splitted-system.html
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 31 Januar 2023, 20:54:23
Das kenne ich, Danke Otto.
Habe aber kein Docker und konnte das in Ubuntu nicht nachbauen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 31 Januar 2023, 21:02:19
Ich glaube nicht, dass es docker spezifisch ist, wenn auch aus meiner Sicht viel einfacher.
https://sonos2mqtt.svrooij.io/getting-started.html#configuration
Du müsstest nur zwei sonos2mqtt Instanzen aufbauen, keine Ahnung wie das unter nodejs geht - aber Du hast ja proxmox. ;)
... zwei Maschinen mit sonso2mqtt bauen?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 31 Januar 2023, 21:23:45
Genau so hatte ich das heute probiert, zwei VMs.
Ich bin auch so weit gekommen, dass ich eine Instanz für S1 und eine für S2 habe.
Mir fehlt quasi ein Parameter, den es beim Docker gibt: SONOS_LISTENER_PORT
Rest war nicht so schwer aus dieser Liste zu holen:
Usage: index.js [options]

Options:
      --prefix           instance name. used as prefix for all topics   [default: "sonos"]
      --mqtt             mqtt broker url. See
                         https://svrooij.io/sonos2mqtt/getting-started.html#configuration
                                                             [default: "mqtt://127.0.0.1"]
      --clientid         Specify the client id to be used
      --wait             Number of seconds to search for a speaker, until exit
                                                                    [number] [default: 30]
      --log              Set the loglevel
                     [choices: "warning", "information", "debug"] [default: "information"]
  -d, --distinct         Publish distinct track states          [boolean] [default: false]
  -h, --help             Show help                                               [boolean]
      --ttslang          Default TTS language                           [default: "en-US"]
      --ttsendpoint      Default endpoint for text-to-speech
      --device           Start with one known IP instead of device discovery.
      --discovery        Emit retained auto-discovery messages for each player.
                                                                [boolean] [default: false]
      --friendlynames    Use device name or uuid in topics (except the united topic,
                         always uuid)                            [choices: "name", "uuid"]
      --tvGroup        The UUID of the coordinator to which the Soundbar should be joined
      --tvUuid         The UUID of the soundbar which should auto stop the tvGroup
      --tvVolume       Volume the soundbar should go to when TV playback starts
      --version          Show version number 


Was mir nicht ganz klar ist, mal von der ID abgesehen, brauche ich auch zwei Sonos Bridges? Evtl. sogar zwei MQTT Server?

Angelegt wurde mir der S1 Amp, aber nicht richtig.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 31 Januar 2023, 21:53:59
hat er was nicht dokumentiert? einfach --port probieren?

Zwei Bridges - gute Frage. es werden zwei unterschiedliche topics man muss wahrscheinlich bloß die regex anpassen? Da denke ich nochmal drüber nach.
Edit: Naja das wird ev. etwas komplexer, man muss ja die Rückfunktion aufdröseln. Eventuell die S2 mit sonos topic und die S1 mit sonos1 und dann regex in der Bridge so machen, dass es auf beide matched und die zentralen Funktionen manuell duplizieren? Ich habe mal das die Player funktionieren mit geändertem sonos topics oder ob es da eine Leiche im Code gibt :)

Ich meine, hier im Thread war schon mal die Rede von S1 und S2 ?
Edit: war nur die Aussage geht mit beiden...
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Mitch am 31 Januar 2023, 22:24:41
Ich hatte viel zu kompliziert gedacht.
Zweite VM mit sonos2mqtt und den prefix anders benennen.

Dann gibt es in fhem ein Device, dieses wie in der Beschreibung als Bridge Comfort definieren und schon kommt der Player.
Leider lässt er sich nicht über fhem bedienen. Set Befehle geht noch, da muss ich nochmal schauen.

Edit: musste noch die readings vom alten Device manuel ändern, jetzt geht es!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: rallye am 07 Februar 2023, 08:58:09
Guten Morgen! Ich habe kürzlich den Docker für mich entdeckt und u.a. den sonos2mqtt in den Docker verpackt. Und weil es so schön ist, gleich das TTS dazu. Die Steuerung meines Sonos One (2.Gen) aus FHEM funktioniert hervorragend. Nur mit dem TTS komme ich einfach nicht zurecht. Ich weiss nichtmal wo ich anfangen soll. Hier meine Definitionen in FHEM:
SonosBridge
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-02-06 13:50:10 Favorites {"Result":[{"AlbumArtUri":"http://cdn-profiles.tunein.com/s302528/images/logoq.png?t=151601","Title":"ANTENNE PARTYHITMIX","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/4","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s302528?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"Deep House Ibiza","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/18","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s303543?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"Deep House Music","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/17","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s304600?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"HOUSE FM","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/16","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s92189?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"kronehit 105.8 (Top 40/Pop)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/15","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s15532?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s150204/images/logoq.png?t=1","Title":"kronehit clubland (Electro)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/19","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s150204?sid=254&flags=8232&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s309945/images/logoq.png?t=1","Title":"kronehit our house","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/13","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s309945?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"Lerne Sonos Radio kennen","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/0","ParentId":"FV:2"},{"Title":"Wien","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/3","ParentId":"FV:2"}],"NumberReturned":9,"TotalMatches":9,"UpdateID":1}
setstate SonosBridge 2023-02-05 18:35:18 attrTemplateVersion 20210303
setstate SonosBridge 2023-02-07 08:47:06 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-02-07 08:47:06 connected 2
setstate SonosBridge 2023-02-06 13:50:10 favlist ANTENNE.PARTYHITMIX,Deep.House.Ibiza,Deep.House.Music,HOUSE.FM,kronehit.105.8.(Top.40/Pop),kronehit.clubland.(Electro),kronehit.our.house
setstate SonosBridge 2023-02-06 13:50:10 grouplist Esszimmer

Sonos One

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) }\
sonos/RINCON_F0F6C18AF44201400/error:.* { json2nameValue($EVENT) }
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')}
attr MQTT2_RINCON_F0F6C18AF44201400 webCmd volume

setstate MQTT2_RINCON_F0F6C18AF44201400 PLAYING
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:06 AlarmRunning false
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-05 18:36:00 CopyrightInfo © 2003-2021, Sonos, Inc. All rights reserved.
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-05 18:36:00 DisplaySoftwareVersion 14.20.1
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-05 18:36:00 Flags 0
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-05 18:36:00 HTAudioIn 0
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-05 18:36:00 HardwareVersion 1.26.1.9-2.2
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-05 18:35:59 IODev MQTT_Shellies
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-05 18:36:00 IPAddress 192.168.57.77
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 Input Radio
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-05 18:36:00 MACAddress F0:F6:C1:8A:F4:42
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 Master Esszimmer
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-05 18:36:00 SerialNumber F0-F6-C1-8A-F4-42:C
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:06 SleepTimerGeneration 0
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:06 SnoozeRunning false
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-05 18:36:00 SoftwareVersion 70.4-36090
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-06 14:21:16 associatedWith SonosBridge
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-05 18:36:00 attrTemplateVersion 20210303
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 bass 5
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-06 18:03:13 command speak
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 coordinatorUuid RINCON_F0F6C18AF44201400
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 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-02-07 08:47:33 currentTrack_Artist topic & a7s
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-06 18:13:48 currentTrack_Duration 0:00:02
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 currentTrack_ItemId -1
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 currentTrack_ParentId -1
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 currentTrack_ProtocolInfo sonos.com-http:*:*:*
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 currentTrack_Title kernkraft 400 (a better day)
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 currentTrack_TrackUri x-sonosapi-stream:tunein:6778?sid=303&flags=8232&sn=1
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 currentTrack_UpnpClass object.item
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-06 13:30:40 enqueuedMetadata_AlbumArtUri https://cdn-profiles.tunein.com/s15532/images/logoq.png?t=636887910150000000
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 enqueuedMetadata_ItemId -1
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 enqueuedMetadata_ParentId -1
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 enqueuedMetadata_Title kronehit 105,8
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-06 18:03:13 error_Action GetTtsUriFromEndpoint
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-06 14:24:44 error_Fault UPnPError
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-06 14:24:44 error_FaultCode s:Client
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-06 18:03:13 error_HttpStatusCode 404
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-06 18:03:13 error_HttpStatusText Not Found
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-06 14:24:44 error_UpnpErrorCode 714
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-06 14:24:44 error_UpnpErrorDescription Illegal MIME-Type
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-06 18:03:13 error_name HttpError
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 groupName Esszimmer
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 inCouple 0
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 inGroup 0
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 isMaster 1
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 model Sonos One
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-05 18:36:00 modelNumber S18
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 mute false
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 mute_LF false
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-05 18:35:59 mute_Master false
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 mute_RF false
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 name Esszimmer
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 playmode NORMAL
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:24 state toggle
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 transportState PLAYING
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 treble -1
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 ts 1675756052952
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 uuid RINCON_F0F6C18AF44201400
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 volume 7
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 volume_LF 100
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-05 18:35:59 volume_Master 7
setstate MQTT2_RINCON_F0F6C18AF44201400 2023-02-07 08:47:33 volume_RF 100


Und die Dockerdefinitionen:

version: '3'
services:
  sonos:
    image: ghcr.io/svrooij/sonos2mqtt
    # or the dockerhub svrooij/sonos2mqtt
    restart: unless-stopped
    ports:
      - "6329:6329"
    environment:
      - SONOS2MQTT_DEVICE=192.168.57.77 # Service discovery doesn't work very well inside docker, so start with one device.
      - SONOS2MQTT_MQTT=mqtt://192.168.57.34:1883 #
      # - SONOS2MQTT_DISTINCT=true # if your want distinct topics
      - SONOS_LISTENER_HOST=192.168.57.34 # Docker host IP
      - SONOS_TTS_ENDPOINT=http://sonos-tts:5601/api/generate
#
  sonos-tts:
    image: svrooij/sonos-tts-polly
    volumes:
      - /home/josef/cache:/cache
    ports:
      - "5601:5601"
    environment:
      - SONOS_TTS_AMAZON_KEY=ABCDEFGHIJKLMNOPQRSTUVWXYZ
      - SONOS_TTS_AMAZON_SECRET=1234567890abcdefghijklmnopqrstuvwxyz
      - SONOS_TTS_AMAZON_REGION=eu-west-1
      - SONOS_TTS_CACHE_URI=http://192.168.57.34:5601/cache
      - SONOS_TTS_ALLOW_GET=true
      - SONOS_TTS_CACHE_FOLDER=/cache

Dass ich meinen Sonos mit dieser Definition
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-02-06 13:14:40 host RasPi-Testsystem:8083
setstate SonosTTS 2023-02-06 18:00:09 httpName http://RasPi-Testsystem:8083/fhem/cache/ab0028b2ab16b4a8a4dc21c6e197db77.mp3
setstate SonosTTS 2023-02-06 18:00:09 lastFilename cache/ab0028b2ab16b4a8a4dc21c6e197db77.mp3
setstate SonosTTS 2023-02-06 18:00:09 playing 0
setstate SonosTTS 2023-02-06 13:24:19 vol 15

auch wegen UseMP3Wrap 1 nicht zum Sprechen bringe ist mir klar. Aber wie kann ich ihn mit Amazon-Polly Sprachnachrichten ausgeben lassen?

Vielleicht hat jemand Erfahrungen? Otto eventuell, wenn ich den Thread aus Mitte Jänner so verfolge?

Danke

Nachtrag: ein
MQTT2_DEVICE set SonosBridge speak de-DE Vicki 25 Rundruf Test
lässt den Speaker verstummen (als ob eine Sprachausgabe erfolgen würde, aber am Ende des Tages doch keine kommt), danach spielt das Radioprogramm weiter
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 07 Februar 2023, 12:21:34
Hallo rallye,

warum meinst Du, funktioniert die Ausgabe mit SonosTTS nicht?
Zitatauch wegen UseMP3Wrap 1 nicht zum Sprechen bringe ist mir klar.
Die fehlt das SonosSpeakWeb Device?

Zu dem Dockercontainer mit sonos-tts kann ich leider nicht viel sagen, ich betreibe den nicht.
Deine Definition sieht eigentlich gut aus.

Gruß Otto
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: rallye am 07 Februar 2023, 13:21:44
Zitat von: Otto123 am 07 Februar 2023, 12:21:34
Hallo rallye,

warum meinst Du, funktioniert die Ausgabe mit SonosTTS nicht?Die fehlt das SonosSpeakWeb Device?


Nun, weil ich beim SonosTTS eben angebe, dass es mp3wrap verwenden soll?

Ok, ich versuche das Ganze nun mal ohne sonos-tts im Docker auf meinem Testsystem. Mal sehen wie weit ich komme.

Danke inzwischen

Grüße Rallye
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 07 Februar 2023, 14:36:30
ZitatNun, weil ich beim SonosTTS eben angebe, dass es mp3wrap verwenden soll?
Das ist aber kein Problem sondern eher die Lösung für flüssige Ausgabe. mW werden bei längeren Texten mehrere mp3 Dateien erzeugt und damit dann zusammengefügt.
ZitatTTS_UseMP3Wrap
Optional: Für eine flüssige Sprachausgabe ist es zu empfehlen, die einzelnen vorher geladenen Sprachbausteine zu einem einzelnen Sprachbaustein zusammenfassen zu lassen bevor dieses per Mplayer ausgegeben werden. Dazu muss Mp3Wrap installiert werden.
apt-get install mp3wrap
Achtung: Nur bei einer lokal definierten Text2Speech-Instanz möglich!
Aber Du kannst das zum testen auch löschen.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: christian.71 am 07 Februar 2023, 15:52:59
#
  sonos-tts:
    image: svrooij/sonos-tts-polly
    volumes:
      - /home/josef/cache:/cache
    ports:
      - "5601:5601"
    environment:
      - SONOS_TTS_AMAZON_KEY=ABCDEFGHIJKLMNOPQRSTUVWXYZ
      - SONOS_TTS_AMAZON_SECRET=1234567890abcdefghijklmnopqrstuvwxyz
      - SONOS_TTS_AMAZON_REGION=eu-west-1
      - SONOS_TTS_CACHE_URI=http://192.168.57.34:5601/cache
      - SONOS_TTS_ALLOW_GET=true
      - SONOS_TTS_CACHE_FOLDER=/cache


Ich habe mal mit meiner docker Konfig verglichen. Ich habe bei mir eine andere Region:
- SONOS_TTS_AMAZON_REGION=eu-central-1
Probier die doch mal.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: carlos am 07 Februar 2023, 16:04:48
Ich habe mal eine Frage.
Kann Sonos2mqtt auch bei einem Sonos Move die Umschaltung zwischen Bluetooth und Wlan?
Das wäre cool wenn das gehen würde.
Auch batterie abfrage, im moment helfe ich mir so:

http://<IP>:1400/status/batterystatus
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: rallye am 07 Februar 2023, 16:12:37
Zitat von: christian.71 am 07 Februar 2023, 15:52:59
Ich habe mal mit meiner docker Konfig verglichen. Ich habe bei mir eine andere Region:
- SONOS_TTS_AMAZON_REGION=eu-central-1
Probier die doch mal.

Danke, habe ich ohne Veränderung des Ergebnisses (Sonos für einige Zeit aus, in welcher der Text gesprochen werden sollte, und dann wieder an). Könnte es sein, dass ich bei der Definition/Einrichten von Amazon-Polly etwas falsch gemacht habe? Wie kann ich das testen?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: rallye am 07 Februar 2023, 16:27:00
Zitat von: Otto123 am 07 Februar 2023, 12:21:34
Zu dem Dockercontainer mit sonos-tts kann ich leider nicht viel sagen, ich betreibe den nicht.
Deine Definition sieht eigentlich gut aus.

Gruß Otto
Nun habe ich den TTS-Teil aus dem Docker heraus genommen und wollte es mal "zu Fuß" probieren. sonos2mqtt ist weiterhin im Docker und sieht nun sie aus:
version: '3'
services:
  sonos:
    image: ghcr.io/svrooij/sonos2mqtt
    # or the dockerhub svrooij/sonos2mqtt
    restart: unless-stopped
    ports:
      - "6329:6329"
    environment:
      - SONOS2MQTT_DEVICE=192.168.57.77 # Service discovery doesn't work very well inside docker, so start with one device.
      - SONOS2MQTT_MQTT=mqtt://192.168.57.34:1883 #
      # - SONOS2MQTT_DISTINCT=true # if your want distinct topics
      - SONOS_LISTENER_HOST=192.168.57.34 # Docker host IP
#      - SONOS_TTS_ENDPOINT=http://sonos-tts:5601/api/generate
#


Alle im ursprünglichen Post definierten Devices sind unverändert. Nach einem Neustart von sonos2mqtt im Docker lässt sich der Sonos One weiterhin steuern. Auch ein "pauseall" funktioniert. Aber ein TTS bekomme ich auc so nicht hin. Mit
MQTT2_DEVICE set MQTT2_RINCON_F0F6C18AF44201400 speak de-DE Vicki 25 Test
läuft der Radiosender einfach weiter, im FHEM-log nur ein Eintrag, dass der Befehl abgesetzt wurde und im Docker die Meldungen:
2023-02-07T15:14:38.271Z [Information] Starting sonos2mqtt v3.2.0
2023-02-07T15:14:38.339Z [Information] LogLevel changed to information
2023-02-07T15:14:38.418Z [Information] Found 1 sonos speakers
2023-02-07T15:14:38.714Z [Information] Mqtt connection changed to connected: true
2023-02-07T15:21:03.868Z [Warning] Error executing speak for Esszimmer (RINCON_F0F6C18AF44201400)
Error: TTS endpoint is required, check the documentation.
    at Function.TtsOptionsToNotification (/usr/local/lib/node_modules/sonos2mqtt/node_modules/@svrooij/sonos/lib/helpers/tts-helper.js:53:19)
    at SonosDevice.PlayTTS (/usr/local/lib/node_modules/sonos2mqtt/node_modules/@svrooij/sonos/lib/sonos-device.js:452:64)
    at Function.ExecuteCommand (/usr/local/lib/node_modules/sonos2mqtt/lib/sonos-command-mapping.js:103:41)
    at Function.ExecuteControl (/usr/local/lib/node_modules/sonos2mqtt/lib/sonos-command-mapping.js:8:46)
    at EventEmitter.<anonymous> (/usr/local/lib/node_modules/sonos2mqtt/lib/sonos-to-mqtt.js:84:84)
    at EventEmitter.emit (node:events:390:28)
    at SmarthomeMqtt.handleIncomingMessage (/usr/local/lib/node_modules/sonos2mqtt/lib/smarthome-mqtt.js:102:29)
    at MqttClient.<anonymous> (/usr/local/lib/node_modules/sonos2mqtt/lib/smarthome-mqtt.js:38:74)
    at MqttClient.emit (node:events:390:28)
    at MqttClient._handlePublish (/usr/local/lib/node_modules/sonos2mqtt/node_modules/mqtt/lib/client.js:1277:12)

Somit bekomme ich mittlerweile nicht mal mehr eine "normale" TTS-Ausgabe hin.

Als Anmerkung: die gesamte npm-Umgebung habe ich nicht installiert, da mein sonsos2mqtt im Docker läuft.

An der Lösung wäre mir gelegen, da ich sonst nicht verifizieren kann, dass nicht das Amazon-Polly das Problem darstellt.

Danke
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 07 Februar 2023, 16:40:34
der speak Befehl "codiert" ob sonos-tts oder SonosTTS verwendet wird :)
set MQTT2_RINCON_F0F6C18AF44201400 speak de-DE Vicki 25 Test
so mit Text2Speech
set MQTT2_RINCON_F0F6C18AF44201400 speak 25 Test
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 07 Februar 2023, 16:44:44
Zitat von: carlos am 07 Februar 2023, 16:04:48
Ich habe mal eine Frage.
Kann Sonos2mqtt auch bei einem Sonos Move die Umschaltung zwischen Bluetooth und Wlan?
Das wäre cool wenn das gehen würde.
Auch batterie abfrage, im moment helfe ich mir so:

http://<IP>:1400/status/batterystatus
Ich weiß nicht ob das per mqtt übertragen / gefunden wird. Da musst Du bei Stephan schauen ob Du was findest und ihn eventuell fragen.
https://sonos2mqtt.svrooij.io/control/commands.html
Oder wird das in der App als LineInput dargestellt?
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: carlos am 08 Februar 2023, 08:53:12
Ich habe dazu bisher nichts gefunden auch in der App kann man das nicht umstellen.
Nur mit dem Taster am Move selbst.
Scheint in der Hardware selbst zu sein.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: svrooij am 15 Februar 2023, 21:38:03
Hi my German friends,

I'll do this in English because meine Deutsch is nicht ser gut.

The latest beta of sonos2mqtt https://github.com/svrooij/sonos2mqtt/releases/tag/v3.2.0-beta.12 has support for the AudioClip endpoint for sending notifications. This is the native sonos way to play notifications and is super stable.
You can try it out by installing the latest beta (3.2.0-beta.12) and starting the application with the --experimental flag. I'm really curious to your feedback.
So if you have feedback please let me know here https://github.com/svrooij/sonos2mqtt/discussions/191

eine schone abend gewunst!
Stephan (aus Niederlande)
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: svrooij am 15 Februar 2023, 21:41:05
Zitat von: carlos am 07 Februar 2023, 16:04:48
Ich habe mal eine Frage.
Kann Sonos2mqtt auch bei einem Sonos Move die Umschaltung zwischen Bluetooth und Wlan?
Das wäre cool wenn das gehen würde.
Auch batterie abfrage, im moment helfe ich mir so:

http://<IP>:1400/status/batterystatus

Can you provide the exact output of that http request in a new issue here https://github.com/svrooij/node-sonos-ts then I'll implement it in sonos2mqtt eventually, for all speakers that have a battery.
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 16 Februar 2023, 10:36:16
Für einen Sonos Move:


<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="/xml/review.xsl"?><ZPSupportInfo><LocalBatteryStatus>
<Data name="Health">GREEN</Data>
<Data name="Level">100</Data>
<Data name="Temperature">NORMAL</Data>
<Data name="PowerSource">SONOS_CHARGING_RING</Data>
</LocalBatteryStatus><!-- SDT: 0 ms --></ZPSupportInfo>


Für einen Sonos Roam:


<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="/xml/review.xsl"?><ZPSupportInfo><LocalBatteryStatus>
<Data name="Health">GREEN</Data>
<Data name="Level">80</Data>
<Data name="Temperature">NORMAL</Data>
<Data name="PowerSource">SONOS_CHARGING_RING</Data>
</LocalBatteryStatus><!-- SDT: 0 ms --></ZPSupportInfo>


"hubecker" hat bereits ein Issue aufgemacht: https://github.com/svrooij/node-sonos-ts/issues/176
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 11 März 2023, 11:52:05
@Otto:

Die 99_sonos2mqttUtils.pm habe ich wie folgt minimal ergänzt, um beim Einschalten eines/mehrerer Alarms/Alarme auch noch die Lautstärke mitgeben zu können (eines meiner Kinder regelt die gerne über die Sonos-App wieder runter 8)):


...
if ($cmd eq 'alarm') {
   my $annex = "";
   $arr[-1] =~ /^[Vv]olume.([0-9]+)$/;
   if (defined($1)) {
      $annex .= ',"Volume":'.$1;
      pop @arr;
   }
   my $acmd = lc shift @arr;
   my $ids = shift @arr //return 'all|id[,id]|json missing, usage alarm enable|disable|update all|id[,id]|json';
   my %t=('enable'=>'true','disable'=>'false');
   if ($acmd eq 'update') {
      fhem(qq(set $bridge setalarm $ids));
      return '';
   } elsif ($acmd eq 'enable' or $acmd eq 'disable') {
       if ($ids eq "all") { $ids = ReadingsVal($NAME,"AlarmListIDs","")}
       for (split ',',$ids) {
         fhem(qq(set $bridge setalarm {"ID":$_,"Enabled":$t{$acmd}$annex}));
       }
     return '';
   }
} else {return 'usage alarm enable|disable|update all|id[,id]|json'}
}
...


Damit ist ein Kommando wie


set MQTT2_RINCON_xxxxx alarm enable all volume=10


möglich. Vielleicht magst du das ja ergänzen. Die Lösung mit $annex .= habe ich deswegen gewählt, weil dies m.E. einen generischen Ansatz darstellt, über den man auch ggf. noch weitere Modifier mit einbauen könnte.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: viegener am 06 Juni 2023, 16:21:55
Ich bekomme bei mir keine Playlist (als Favoriten) zum Laufen. Sowohl Playlists aus Spotify oder lokale Sonos-PLaylists, die als Sonos-Favoriten definiert sind können gestartet werden.

Hat das jemand gelöst?

Ich vermute, dass der Aufruf folgendermassen ablaufen sollte:
set <sonos-mqtt-device> play Playlist <name der playlist>
Problem ist mit diesem Aufruf gibt es einen Fehler:

2023.06.06 10:05:44.071 1: ERROR evaluating my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $NAME=   $evalSpecials->{'%NAME'};{sonos2mqtt($NAME,$EVENT)}: malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "(end of string)") at ./FHEM/99_sonos2mqttUtils.pm line 194.

Dieser lässt sich vermutlich darauf zurückführen, dass in den Utils versucht wird ein Reading "Playlists" zu durchsuchen nach dem entsprechenden Eintrag - dieses existiert aber nicht



Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 06 Juni 2023, 17:39:49
bist Du denn danach vorgegangen und hast das Reading erstellt?
https://wiki.fhem.de/wiki/Sonos2mqtt#Listen_der_Favoriten_Radios_und_Playlist_erstellen
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: viegener am 06 Juni 2023, 23:11:27
Zitat von: Otto123 am 06 Juni 2023, 17:39:49bist Du denn danach vorgegangen und hast das Reading erstellt?
https://wiki.fhem.de/wiki/Sonos2mqtt#Listen_der_Favoriten_Radios_und_Playlist_erstellen

Guter Hinweis - Danke !
Ich hatte das nur für Favoriten gemacht, da ich auch die Playlists als Favoriten angelegt habe.

Zusatzfrage: Sollte das auch mit sonos-PLaylists gehen, wenn diese spotify-Listen sind?
Bei mir kommt dann in den error readings folgendes:
     2023-06-06 23:08:19   error_Action    AddURIToQueue
     2023-06-06 23:08:19   error_Fault     UPnPError
     2023-06-06 23:08:19   error_FaultCode s:Client
     2023-06-06 23:08:19   error_UpnpErrorCode 804
     2023-06-06 16:26:55   error_UpnpErrorDescription Illegal MIME-Type
     2023-06-06 23:08:19   error_name      SonosError


Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 07 Juni 2023, 07:10:55
Ich verwende spotify nicht...
Die Behandlung der Favoriten, Playlist usw. ist mehr gefrickelt als gut gelöst - sorry. Da ändert sich bei Sonos auch immer wieder was.
Wann kommt der Fehler? Beim einlesen der Playlist oder beim abspielen?
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: viegener am 08 Juni 2023, 01:02:52
Zitat von: Otto123 am 07 Juni 2023, 07:10:55Ich verwende spotify nicht...
Die Behandlung der Favoriten, Playlist usw. ist mehr gefrickelt als gut gelöst - sorry. Da ändert sich bei Sonos auch immer wieder was.
Wann kommt der Fehler? Beim einlesen der Playlist oder beim abspielen?

Der Fehler kommt, wenn ich per "set <mqtt-device> play Playlist <name der playlist>" das "Laden" auslöse - das nachfolgende play habe ich dnn gar nicht mehr gesendet.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 08 Juni 2023, 10:22:33
Und ist das bei jeder Playlist oder bloß wenn spotify in der Playlist ist?
Was liefert er zurück wenn Du das in die FHEM Kommandozeile wirfst
{sonos2mqtt('<mqtt-device>','play Playlist <name der playlist>')}
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: viegener am 08 Juni 2023, 19:11:31
Ich habe es jetzt gelöst. Ich habe die Playlist aus Sonos gelöscht und dann im Sonos-Controller über den Spotify-Account zur Playlist navigiert. Dann über den Eintrag "Add to Sonos Playlist" eine neue PLaylist in Sonos mit dem gleichen Namen angelegt. Leider geht dabei die Verbindung zu Spotify verloren (es wird wohl eine getrennte Kopie erzeugt).

Ich habe dabei auch nochmal meine verschiedenen Versuche gelöscht und dabei festgestellt, dass das Problem wohl etwas anders gelagert ist. Und auch meine Beschreibung oben nicht ganz korrekt. Das Problem ist eigentlich nicht das Abspielen der spotify PLaylist über "play Playlist" sondern, dass die spotify-Playlists sich nur als Favoriten in sonos ablegen lassen und die Favoriten nicht spielbar sind. Als Playlists lassen sie sich wohl in Sonos nur als Kopien (s.o.) anlegen.

Es ist halt etwas verwirrend, dass Sonos-Playlists (wo die Titelliste lokal in Sonos geführt wird) funktionieren aber Spotify-Playlisten, die sich in Sonos als Favoriten anlegen lassen bei mir nicht funktionieren. Der obengenannte Fehler kam eigentlich wenn die Spotify-Playlist als Sonos-Favorit abgespielt werden soll.

Also habe ich Deinen Befehl jetzt nochmals entsprechend abgewandelt:

{sonos2mqtt('<mqtt-device>','play Favorite <name der playlist>')}
Ergebnis:

sonos/RINCON_949F3E5815AE01400/control { "command": "setavtransporturi", "input": "x-rincon-cpcontainer:10062a6cspotify:playlist:5DHDTX3GdisuhzKty2eOfu?sid=9&flags=10860&sn=1"}
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Miami am 08 Juni 2023, 19:46:36
Hallo,
Ich habe sonos2mqtt eingerichtet und es funktioniert gut, aber leider werden bei mir damit nicht immer die Cover in FHEM angezeigt.
Ich verwende fast ausschließlich meine Musikbibliothek auf einem NAS (Fritzbox-NAS-Funktion).

Ich habe festgestellt, dass bei Dateinamen mit Apostroph, das Cover in FHEM nicht angezeigt wird, z.B. bei Janet Jackson - That's The Way Love Goes.mp3:
Im Reading currentTrack_AlbumArtUri des Players ist &apos; enthalten, es muss aber durch %2527 ersetzt werden:
Also habe ich in der 99_sonos2mqttUtils.pm nach der Zeile
my $cover = ReadingsVal($name,'currentTrack_AlbumArtUri','');folgende Zeile ergänzt:
$cover =~ s/&apos;/%2527/gm; # Code für Apostroph ersetzenKlappt nun wunderbar auch bei Dateinamen mit Apostroph.

Leider werden die Cover auch nicht angezeigt, wenn der Dateiname (runde) Klammern enthält. Die durch %2527 bzw. %2528 zu ersetzen hilft nicht.
Hat jemand eine Idee, woran das liegen könnte?
(Heute erneut getestet, und es funktioniert auch bei Dateien mit Klammern, hatte vermutlich zu viel rumprobiert)
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 09 Juni 2023, 10:55:16
@viegener Die Behandlung von Favoriten und Playlisten in meiner sono2mqttutils ist unterschiedlich, weil die Abbildung in Sonos unterschiedlich ist. Das kann gut sein, dass es so nicht perfekt ist. Die packen manches (ich glaube vor allen Playlists) als eine Art "container" in einen weiteren "container".
Am Anfang hatte es mal genügt einfach eine uri zu starten (dein return als Beispiel) bei Playlisten muss man die queue bearbeiten. Wenn jetzt playlisten in Favoriten liegen, müsste man das vielleicht wieder getrennt behandeln. Oder es findet sich mal noch ein universeller Weg. Mühsam das Ganze, ich finde da aktuell keine Zeit.

@Miami Bei mir funktionieren Cover mit Apostroph (Deezer). Kann sein, dass das Problem in der Kodierung der Bibliothek in deiner NAS zustande kommt und besser dort gelöst werden könnte?
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Miami am 09 Juni 2023, 18:21:37
Zitat von: Otto123 am 09 Juni 2023, 10:55:16@Miami Bei mir funktionieren Cover mit Apostroph (Deezer). Kann sein, dass das Problem in der Kodierung der Bibliothek in deiner NAS zustande kommt und besser dort gelöst werden könnte?

In FHEM steht im Player-Device im Reading currentTrack_AlbumArtUri z.B.:
http://192.168.178.70:1400/getaa?u=x-file-cifs%3a%2f%2ffritz.box%2fnas%2fMusik%2fTom%2520Petty%2520-%2520I%2520Won&apos;t%2520Back%2520Down.mp3&v=13Fhem zeigt kein Cover an, auch der Internet-Browser nicht, wenn ich es in seine Adresszeile kopiere.

Ersetze ich den Apostroph, zeigt auch der Browser das Cover an:
http://192.168.178.70:1400/getaa?u=x-file-cifs%3a%2f%2ffritz.box%2fnas%2fMusik%2fTom%2520Petty%2520-%2520I%2520Won%2527t%2520Back%2520Down.mp3&v=13Ich vermute daher, dass sonos2mqtt oder 99_sonos2mqttUtils.pm das falsch im Reading ablegt, denn die Sonos-App (iOS) und VLC (Windows) haben keine Probleme mit den Covern im meinen mp3-Dateien, auch nicht mit dehnen mit Apostroph.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 09 Juni 2023, 22:58:04
Zitat von: Miami am 09 Juni 2023, 18:21:37Ich vermute daher, dass sonos2mqtt oder 99_sonos2mqttUtils.pm das falsch im Reading ablegt
Die Readings werden direkt von der Funktion json2nameValue() übernommen und eingetragen. die Utils spielt an der Stelle nicht mit.
Soweit ich sehe ist der MQTT Datenstrom noch korrekt, da steht ' einfach als Zeichen drin, also:
Zitatwon't%2520be
d.h. sonos2mqtt liefert auch richtig.

Ich muss mal tiefer eintauchen :)
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: m8ichael am 06 Juli 2023, 16:25:06
Hallo zusammen,

ich bekomme den "Unterbau" sonos2mqtt irgendwie nicht persistent zum Laufen. Generell bin ich nach Anleitung vorgegangen, dann läuft auch alles, allerdings übersteht die Installation keinen Neustart meines Systems.

Konkret betreibe ich sonos2mqtt auf meinem Raspberry Pi mittels pm2, wobei ich auf der Benutzerebene "pi" mittels

pm2 start sonos2mqtt -- --mqtt mqtt://<IP>:1883

den Prozess starte. Dieser läuft auch

┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name               │ mode     │ ↺    │ status    │ cpu      │ memory   │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0  │ sonos2mqtt         │ fork     │ 0    │ online    │ 0%       │ 16.1mb   │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘

allerdings erhalte ich nach einem Reboot des Geräts dort mittels pm2 list nur noch die folgene Anzeige:

┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name               │ mode     │ ↺    │ status    │ cpu      │ memory   │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0  │ 127.0.0            │ fork     │ 7    │ online    │ 0%       │ 42.6mb   │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘

Danach ist sonos2mqtt nicht mehr nutzbar. Die Konfiguration habe ich natürlich mittels "pm2 save" zwischenzeitlich gespeichert.

Hat jemand einen Tipp, wo bei mir der Knoten ist?

Viele Grüße

Michael
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Miami am 06 Juli 2023, 18:14:31
Hast Du kein Notify "n_pm2_sonos" angelegt?
Lies (nochmal) den Abschnitt Autostart von sonos2mqtt mit FHEM im Wiki (https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Sonos2Mqtt (https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Sonos2Mqtt))
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 06 Juli 2023, 20:56:36
Zitat von: m8ichael am 06 Juli 2023, 16:25:06nach einem Reboot des Geräts
Hast Du denn einen Autostart für pm2 eingerichtet? Vermutung, du konfigurierst alles mit user a, der Start beim reboot erfolgt mit user b. User a hat eine funktionierende Konfiguration, user b hat gar keine und startet "leer".
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 06 Juli 2023, 23:50:58
Zitat... wobei ich auf der Benutzerebene "pi" ...


Was steht denn in der dump.pm2 ? Ist da s2m mit einem Eintrag vorhanden ?

Im Homeverzeichnis:

nano .pm2/dump.pm2
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: aski71 am 12 September 2023, 10:48:53
Hallo, danke für das spannende Modul, das ich gerade erstmalig eingerichtet habe.
Es scheint grundsätzlich alles funktioniert zu haben und SonosBridge zeigt "connected".
Allerdings wurden bei mir keine Lautsprecher-Devices eingerichtet und ich finde gerade auch nirgendwo was, wie das nun geht.
Autocreate scheint nicht stattgefunden zu haben.
Was muss ich tun?
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 12 September 2023, 12:32:57
Eigentlich steht hier alles
ZitatEs gibt jetzt zwei Wiki Artikel für die Einrichtung und die Ergebnisse aus diesem Thread:
https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Sonos2Mqtt
https://wiki.fhem.de/wiki/Sonos2mqtt
Die "Lautsprecher" werden automatisch erzeugt.
Zeig bitte ein list von deinem MQTT2 Server und von deiner SonosBridge
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: aski71 am 12 September 2023, 14:02:38
Zitat von: Otto123 am 12 September 2023, 12:32:57Eigentlich steht hier alles
ZitatEs gibt jetzt zwei Wiki Artikel für die Einrichtung und die Ergebnisse aus diesem Thread:
https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Sonos2Mqtt
https://wiki.fhem.de/wiki/Sonos2mqtt
Die "Lautsprecher" werden automatisch erzeugt.
Zeig bitte ein list von deinem MQTT2 Server und von deiner SonosBridge

Eigentlich bin ich genau nach dem vorgegangen, was da eigentlich steht.  ;)
Da gibt's aber auch den ein oder anderen Link, der nur zu 404 führt. Zum Beispiel diesen hier:
https://svrooij.io/sonos2mqtt/getting-started.html

Internals:
   FUUID      6500229b-f33f-2248-8ad8-32a8f5fae86977f2
   NAME       SonosBridge
   NR         592
   STATE      connected
   TYPE       MQTT2_DEVICE
   READINGS:
     2023-09-12 10:34:53   attrTemplateVersion 20210303
     2023-09-12 10:45:11   state           CheckSubscription
Attributes:
   alias      SonosBridge
   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/status/[^/]+/renderingcontrol:.* {}
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:.* {}
   room       MQTT2_DEVICE
   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')}

Was meinst Du mit einem list von vom MQTT2 Server? Davon lese ich nichts. Nur vom sonos2mqtt Server.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: aski71 am 12 September 2023, 15:50:09
Ich bin inzwischen weiter gekommen und habe festgestellt: Ich hatte einen mosquitto am Laufen, aber kein MQTT2_CLIENT device.
Das wäre für MQTT Neulinge ein guter Hinweis in der Doku, dass man einen MQTT2_SERVER oder MQTT2_CLIENT einrichten muss.

Jetzt hab ich das und: autocreate hat funktioniert.

Was ich jetzt aber sehe ist, dass mein Sonos Arc offensichtlich nicht richtig erkannt wird.
Da gibt es nur einen Play Button und kein Symbol. Was kann das sein?
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: aski71 am 12 September 2023, 18:20:43
Habe mit einigem Herumspielen nun auch Arc scheinbar richtig am Start.

Jetzt doch noch eine Frage: Wie erkenne ich, wenn ein Lautsprecher nicht am Strom angeschlossen ist?

Ich kriege über CheckSubscription nichts zurück. Egal, ob der betreffende Lautsprecher am Strom ist oder nicht.
Auch nach Zeit nicht.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 12 September 2023, 20:28:22
Zitat von: aski71 am 12 September 2023, 14:02:38Da gibt's aber auch den ein oder anderen Link, der nur zu 404 führt.
Das schaue ich mir an, ja ist halt ein Problem wenn sich der verlinkte Artikel ändert. Sorry  ;D
Zitat von: aski71 am 12 September 2023, 15:50:09Das wäre für MQTT Neulinge ein guter Hinweis in der Doku, dass man einen MQTT2_SERVER oder MQTT2_CLIENT einrichten muss.
Wiki ist für alle :) ich habe das alles für m(eine) Umgebung durchgespielt und beschrieben. Wäre toll wenn Du die Beschreibung im Wiki ergänzt.
Zitat von: aski71 am 12 September 2023, 18:20:43Jetzt doch noch eine Frage: Wie erkenne ich, wenn ein Lautsprecher nicht am Strom angeschlossen ist?
Das bekommst Du über dieses Konstrukt so nicht direkt mit. Ideen dazu:
Zitat von: aski71 am 12 September 2023, 18:20:43Ich kriege über CheckSubscription nichts zurück.
Das fragt das externe sonos2mqtt Modul ab, einen konkreten Status zu einem Lautsprecher liefert das aber nicht.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: aski71 am 12 September 2023, 23:00:34
Zitat von: Otto123 am 12 September 2023, 20:28:22
Zitat von: aski71 am 12 September 2023, 15:50:09Das wäre für MQTT Neulinge ein guter Hinweis in der Doku, dass man einen MQTT2_SERVER oder MQTT2_CLIENT einrichten muss.
Wiki ist für alle :) ich habe das alles für m(eine) Umgebung durchgespielt und beschrieben. Wäre toll wenn Du die Beschreibung im Wiki ergänzt.

Kann ich das so einfach? Wie geht das denn? Hab ich noch nie gemacht.

Zitat von: Otto123 am 12 September 2023, 20:28:22
Zitat von: aski71 am 12 September 2023, 18:20:43Jetzt doch noch eine Frage: Wie erkenne ich, wenn ein Lautsprecher nicht am Strom angeschlossen ist?
Das bekommst Du über dieses Konstrukt so nicht direkt mit. Ideen dazu:
  • Du hast die IPAdress als Reading - Du kannst mit einem PRESENCE Device (ja geht nicht direkt in der DEF) den Status ermitteln.
  • userReadings mit Perlfunktion zur Abfrage analog Presence.
  • Du schaltest den Strom eh über FHEM? Dann hast Du da den Status.

Ah, ok. Schade. Im alten Modul wurde ja die Presence oder Absence je Lautsprecher angezeigt. Dachte, das ginge hier auch irgendwie.
Dann muss ich mir dafür wohl was anderes bauen.
Mein Einsatzfall war ja hier folgender: Ich hab mir ein recht komplexes Script gebaut, das regelbasiert Lautsprecher in anderen Räumen einem Master zugeschaltet werden, wenn dort der Bewegungsmelder getriggert wird, oder das Licht angeht. Wenn dazu erst die Steckdose angehen muss, dauert es ja noch eine Weile, bis der Lautsprecher tatsächlich bereit ist, Befehle entgegen zu nehmen. Das war im alten Modul praktisch, weil ich quasi auf das Event reagiert habe, dass der Lautsprecher online gegangen ist. Das funktioniert leider weder mit IP Presence noch mit Einschalten der Steckdose gut ...

Zitat von: Otto123 am 12 September 2023, 20:28:22
Zitat von: aski71 am 12 September 2023, 18:20:43Ich kriege über CheckSubscription nichts zurück.
Das fragt das externe sonos2mqtt Modul ab, einen konkreten Status zu einem Lautsprecher liefert das aber nicht.

Ich hatte aus diesem Satz im Wiki abgeleitet, dass CheckSubscription mir die presence/absence von Lautsprechern mitteilt, oder irgendwo ein entsprechendes Reading erzeugt oder ein Event auslöst:
ZitatWerden Player temporär abgeschaltet, merkt das der Server nach einer Zeit selbst, oder man forciert dies mit einem CheckSubscription an der Bridge.
Was ist mit diesem Satz tatsächlich gemeint?

Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 13 September 2023, 00:04:35
Fürs Wiki kannst Du einen Account beantragen und dann kann es losgehen. https://wiki.fhem.de/wiki/FHEMWiki:Support
Zitat von: aski71 am 12 September 2023, 23:00:34Was ist mit diesem Satz tatsächlich gemeint?
Siehe hier check-subscription https://sonos2mqtt.svrooij.io/global-commands.html#commands
Zitat von: aski71 am 12 September 2023, 23:00:34weil ich quasi auf das Event reagiert habe, dass der Lautsprecher online gegangen ist.
Dazu habe ich derzeit nicht wirklich eine konkrete, zuverlässige Idee. Am ehesten, dass man einen bestimmten Port auf Erreichbarkeit testet und damit sicher weiß jetzt ist er da. Ich habe da sowas als function im PRESENCE rennen. Ist nicht so toll, weil es blocking läuft.
sub ServiceMonitor {
    my ($host, $port)    = @_;
    return qx( if nc -z -w 1 $host $port 2>/dev/null;then printf 1; else printf 0; fi; );
}
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: binford6000 am 13 September 2023, 10:08:36
ZitatJetzt doch noch eine Frage: Wie erkenne ich, wenn ein Lautsprecher nicht am Strom angeschlossen ist?

Da gibt es ein issue zu:
https://github.com/svrooij/sonos2mqtt/issues/131

Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: aski71 am 16 September 2023, 13:32:12
Zitat von: Otto123 am 13 September 2023, 00:04:35Fürs Wiki kannst Du einen Account beantragen und dann kann es losgehen. https://wiki.fhem.de/wiki/FHEMWiki:Support
Zitat von: aski71 am 12 September 2023, 23:00:34Was ist mit diesem Satz tatsächlich gemeint?
Siehe hier check-subscription https://sonos2mqtt.svrooij.io/global-commands.html#commands
Zitat von: aski71 am 12 September 2023, 23:00:34weil ich quasi auf das Event reagiert habe, dass der Lautsprecher online gegangen ist.
Dazu habe ich derzeit nicht wirklich eine konkrete, zuverlässige Idee. Am ehesten, dass man einen bestimmten Port auf Erreichbarkeit testet und damit sicher weiß jetzt ist er da. Ich habe da sowas als function im PRESENCE rennen. Ist nicht so toll, weil es blocking läuft.
sub ServiceMonitor {
    my ($host, $port)    = @_;
    return qx( if nc -z -w 1 $host $port 2>/dev/null;then printf 1; else printf 0; fi; );
}

Darf ich fragen, warum Du nicht nur auf die IP Presence gehst, die mit der PRESENCE ja non-blocking ist?
Wird der Port erst zu einem späteren Zeitpunkt verfügbar nach dem Einschalten?
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 16 September 2023, 15:08:55
Zitat von: aski71 am 12 September 2023, 23:00:34Das funktioniert leider weder mit IP Presence noch
Ich habe das Problem gar nicht, meine Sonos Boxen sind immer an. ;) Du hast gesagt es geht nicht gut?
Zitat von: aski71 am 16 September 2023, 13:32:12die mit der PRESENCE ja non-blocking ist?
Bist Du da sicher? Ich bin nicht auf dem aktuellen Stand, ich weiß dass es da einen Fork gab und JoWiemann Anfang des Jahres das Modul übernommen hat. SVN sagt, da ist noch nichts passiert:
73_PRESENCE.pm 20782 2019-12-19 10:51:06Z markusbloch
ZitatWird der Port erst zu einem späteren Zeitpunkt verfügbar nach dem Einschalten?
Ist ja eigentlich immer so: erst wird Netzwerk aktiv (ping geht) dann starten Dienste ...
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: andre07 am 01 Oktober 2023, 20:03:51
Kann es sein das keine Player angelegt werden wenn noch das andere Modul im System ist.Player werden bei mir keine erzeugt.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 02 Oktober 2023, 11:51:02
Beides kann ohne Probleme parallel laufen.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: andre07 am 03 Oktober 2023, 15:31:20
Dann habe ich wohl ein anderes Problem.
Frag mich nur was das sein könnte die angelegte Bridge steht auf connected
also läuft sonos2mqtt mein mqtt2 Server
Steht auf autocreate simple aber kein Player wird angelegt.Sonos läuft weil das andere Modul noch funktioniert.
Werd mal nachschauen ob man in logs was finden kann
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 03 Oktober 2023, 23:55:48
Sonos2mqtt muss aber auch deine sonosplayer ermitteln können. Du kannst zuerst dort im log schauen.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: andre07 am 07 Oktober 2023, 12:51:59
In der sonos2mqtt-error log fällt mir diese Fehlermeldung auf
Error: listen EADDRINUSE: address already in use 0.0.0.0:6329

netstat -ltup
sagt mir das dieser port von node verwendet wird was ja auch so sein
soll da es ja von sonos2mqtt benötigt wird oder liege ich da falsch.
Das dazugehörige notify zum start so
global:INITIALIZED "pm2 -s start sonos2mqtt  -- --mqtt mqtt://mikelsoft:becherovka@192.168.178.78:1884"In fhem.log gibt es keine feldermeldung zum Modul


Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 08 Oktober 2023, 13:28:08
Du kannst die Funktion monitoren, im Terminamlfenster:
sudo -u fhem pm2 monit
Meine Vermutung zur Fehlermeldung: sonos2mqtt läuft zweimal? Als user xxx und als user fhem?
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: andre07 am 13 Oktober 2023, 16:16:44
Hab den Fehler gefunden irgendwann wurde ein upgrade auf S2 durchgeführt ein downgrade auf S1 und die Player wurden gefunden und eingerichtet
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 13 Oktober 2023, 16:34:55
Aber meines Wissen (kann es selbst nicht testen) hat sonos2mqtt kein Problem mit S2
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: 87insane am 13 Oktober 2023, 17:53:37
Hat es nicht. Hab selber diverse Sonos ohne Probleme mit S2.
Arc und era300 usw...
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: rainerxxl am 26 Oktober 2023, 15:59:13
Hallo Otto,
erst einmal vielen Dank für das Modul.
Nach einigen Wochen habe ich es zum Laufen bekommen und es läuft zur Zeit auf der Testumgebung sehr gut.
Ich spiele auf meinem Sonossystem gerne "Konserven" ab und ich habe dabei immer den "Shuffle" Befehl eingebunden.
Wenn ich das Ganze richtig durchforstet habe, wird anscheinend dieser Befehl nicht bereitgestellt.
Wie kann man diesen Befehl einrichten?

Gruß Rainer
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 26 Oktober 2023, 16:22:31
Hallo Rainer,

auf die Schnelle als Parameter für x_raw_payload Kommando: { "command": "shuffle", "input": "true" }
siehe https://sonos2mqtt.svrooij.io/control/commands.html#supported-commands

Längerfristig: müsste man den Befehl in der Utils und in der setList verankern. ;)

Gruß Otto
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: rainerxxl am 29 Oktober 2023, 17:17:37
Hallo Otto,

recht vielen Dank.
Den Link  https://sonos2mqtt.svrooij.io/control/commands.html#supported-commands kannte ich schon, hatte mir dort den Befehl herausgesucht.
Mit dem Parameter x_raw_payload Kommando: { "command": "shuffle", "input": "true" } funktioniert es nicht.

Ich habe folgende Eingabe mit "mute" gemacht und in der Verbose eine Rückmeldung erhalten:

2023.10.29 15:53:40 3: MQTT2_DEVICE set MQTT2_RINCON_7828CA6DCBF201400 x_raw_payload { "command": "mute", "input": "true" }
2023.10.29 15:53:40 4: MQTT2_DEVICE_Parse: MQTT2_RINCON_7828CA6DCBF201400 sonos/RINCON_7828CA6DCBF201400 => { json2nameValue($EVENT,'',$JSONMAP) }

2023.10.29 17:00:06 3: MQTT2_DEVICE set MQTT2_RINCON_7828CA6DCBF201400 x_raw_payload {"command": "mute","input":{"cmd":"mute","val":"true"}}
2023.10.29 17:00:06 4: MQTT2_DEVICE_Parse: MQTT2_RINCON_7828CA6DCBF201400 sonos/RINCON_7828CA6DCBF201400 => { json2nameValue($EVENT,'',$JSONMAP) }

Wenn ich das gleiche mit "shuffle" mache, bekomme ich keinerlei Rückmeldungen. Anscheinend ist das Komanndo dafür falsch.

2023.10.29 15:56:28 3: MQTT2_DEVICE set MQTT2_RINCON_7828CA6DCBF201400 x_raw_payload { "command": "shuffle", "input": "true" }
2023.10.29 17:01:23 3: MQTT2_DEVICE set MQTT2_RINCON_7828CA6DCBF201400 x_raw_payload {"command": "shuffle","input":{"cmd":"shuffle","val":"true"}}

Die setList und Utils habe ich mir auch angesehen und das könnte ich ändern.

Gruß Rainer
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 29 Oktober 2023, 23:40:53
Zitat von: rainerxxl am 29 Oktober 2023, 17:17:37Wenn ich das gleiche mit "shuffle" mache, bekomme ich keinerlei Rückmeldungen. Anscheinend ist das Komanndo dafür falsch.
Zitat von: rainerxxl am 29 Oktober 2023, 17:17:37Wenn ich das gleiche mit "shuffle" mache, bekomme ich keinerlei Rückmeldungen. Anscheinend ist das Komanndo dafür falsch.
Das Kommando ist schon richtig. Wenn ich jetzt noch mal teste, funktioniert es leider auch nur ab und zu. Verstehen tu ich das momentan nicht.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: rainerxxl am 31 Oktober 2023, 12:34:30
Hallo Otto,

recht vielen Dank, ich glaube die Lösung gefunden zu haben.

Folgende Befehle führen zum Ergebnis:

set MQTT2_RINCON_7828CA6DCBF201400 x_raw_payload { "command": "playmode", "input": "SHUFFLE" }
set MQTT2_RINCON_7828CA6DCBF201400 x_raw_payload { "command": "playmode", "input": "NORMAL" }

Ist es möglich diese Befehle in der Utils einzubinden?

Gruß Rainer

Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 31 Oktober 2023, 13:33:33
Hallo Rainer,

so ganz auf die Schnelle zum Selbermachen ;), Ergänzung für die setList:
playmode:NORMAL,REPEAT_ALL,SHUFFLE,SHUFFLE_NOREPEAT {fhem('set $NAME x_raw_payload { "command": "playmode", "input": "$EVTPART1" }');return ""}
Gruß Otto
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: rainerxxl am 01 November 2023, 14:44:35
Hallo Otto,

funktioniert ausgezeichnet, recht vielen Dank für Deine Unterstützung.

Gruß Rainer
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: valvak am 08 November 2023, 18:26:21
Hallo zusammen,

Ich bin gerade dabei mein FHEM etwas auf den neuen Stand zu bringen. Ich hatte eine VM in der die gesamte Umgebung lief.
Ich hab das alles jetzt etwas aufgedröselt und LXCs anstatt einer großen VM.

Also hab ich mir auch mal Sonos2MQTT aufgesetzt und die Docker-compose des Projektes genutzt.
Per MQTT2_Device den EMQX Broker mit fhem verbunden.

Ich kann auch ein PauseAll absetzen, nur ein autocreate klappt nicht.

Autocreate ist aktiv und im device steht es auf simple.

Ich hab keine Ahnung woran es liegt, ist es möglich dass es nur mit MQTT2_Server klappt?
Zumindest lese ich die Wiki so, da meine Vorgehensweise nirgends beschrieben wurde.

Gruß
Mark
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 08 November 2023, 18:54:13
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
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 08 November 2023, 18:56:03
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
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: valvak am 08 November 2023, 23:12:27
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

Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: valvak am 08 November 2023, 23:17:11
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 .*
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag 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/....?

Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: valvak am 09 November 2023, 09:50:54
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.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: valvak am 09 November 2023, 10:09:21
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
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag 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?
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: valvak am 10 November 2023, 16:35:03
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.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Ralli am 10 November 2023, 17:40:34
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.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 20 November 2023, 16:29:15
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.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 20 November 2023, 16:41:13
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
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 20 November 2023, 16:47:01
FHEM hängt kurz, die Datei wird abgespielt, aber nicht ganz.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 20 November 2023, 16:54:01
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
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 20 November 2023, 18:35:48
Das dies überhaupt funktioniert? Da passt doch jetzt SonosSpeakWeb und FileDir nicht zusammen?
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 20 November 2023, 20:01:08
ZitatDa passt doch jetzt SonosSpeakWeb und FileDir nicht zusammen?

Ja, ok. Aber muss in der HTTPSRV-Definition <infix> <directory> das Verzeichnis cache heissen und genau dort liegen ?
Kann ich nicht irgendeinen anderen Ordner angeben ?

Ich habs schon so versucht gehabt:
defmod SonosSpeakWeb HTTPSRV www/sounds www/sounds SonosSpeakWebund
attr SonosTTS TTS_CacheFileDir www/sounds
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 20 November 2023, 20:13:06
ZitatNotice: All links are relative to http://hostname:8083/fhem.
Ich meine laut dem Beispiel in der commandref es ist so:
defmod SonosSpeakWeb HTTPSRV cache cache SonosSpeakWeb
der Pfad liegt in /opt/fhem/cache
der Zugriff ist http://hostname:8083/fhem/cache

defmod SonosSpeakWeb HTTPSRV cache www/sounds SonosSpeakWeb
der Pfad liegt in /opt/fhem/www/sounds
der Zugriff ist http://hostname:8083/fhem/cache

defmod SonosSpeakWeb HTTPSRV willi /home/lustig/sounds SonosSpeakWeb
der Pfad liegt in /home/lustig/sounds
der Zugriff ist http://hostname:8083/fhem/willi

BTW: der erste Aufruf mit set ... notify 40 datei.mp3 funktioniert bei mir auch nur als kurzes Bruchstück. Danach wird immer sauber gespielt.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 20 November 2023, 20:44:31
Zitatdefmod SonosSpeakWeb HTTPSRV cache www/sounds SonosSpeakWeb
der Pfad liegt in /opt/fhem/www/sounds

so weit komm ich mit und klappt auch mit:
defmod 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 20:29:33 httpName http://192.168.188.30:8084/fhem/www/sounds/42eb2a6d84f64027c88d1ed59ef1d50f.mp3
setstate SonosTTS 2023-11-20 20:29:33 lastFilename www/sounds/42eb2a6d84f64027c88d1ed59ef1d50f.mp3
setstate SonosTTS 2023-11-20 20:29:33 playing 0

Das verstehe ich (noch) nicht:
Zitatder Zugriff ist http://hostname:8083/fhem/cache

Der Zugriff erfolgt doch über die URL in httpName, oder lieg ich da falsch?
Ich verstehe <infix> immer noch nicht, die "gespeicherten Sprachausgaben" landen ja jetzt auch in www/sounds, die hätte ich irgendwie gerne in cache gehabt.
ZitatBTW: der erste Aufruf mit set ... notify 40 datei.mp3 funktioniert bei mir auch nur als kurzes Bruchstück. Danach wird immer sauber gespielt.
Gut zu hören dass das bei Dir auch so ist.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 20 November 2023, 21:06:22
naja es sind doch zwei Dinge:
Der eine (TTS) schreibt eine Datei in ein Verzeichnis der andere (HTTPSRV) stellt die über eine URL zur Verfügung. Die URL muss funktionieren und der HTTPSRV muss richtig konfiguriert werden

Im TTS Device ist der Name der Sprachdatei bekannt, deswegen baut TTS hilfsweise den String für die URL zusammen.

Wenn jetzt lastFilename (welcher den Pfad enthält) nicht zum Webserver passt funktioniert das so einfach nicht. Dann musst Du das userReadings httpName anders bauen. Bei cache cache funktioniert es, bei willi willi auch, bei willi lustig liefert das TTS Device die falsche URL!
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 20 November 2023, 22:18:58
Danke für das ausführliche erläutern, glaube das hat mich weiter gebracht (in der Theorie), muss mich aber noch mit beschäftigen und genau nachvollziehen.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 21 November 2023, 12:22:16
ZitatDas dies überhaupt funktioniert? Da passt doch jetzt SonosSpeakWeb und FileDir nicht zusammen?

Braucht man denn wirklich SonosSpeakWeb ?
Wir nutzen doch die Text2speech-Definition im Server-Modus! Wenn du Lust und Zeit hast, lösch mal bitte SonosSpeakWeb. Die Dateien abspielen und die Sprachausgaben sind dann trotzdem möglich. Man braucht gar keine zusätzliche http-Server-Definition, alle Dateien die sich in TTS_CacheFileDir befinden werden doch "bereitgestellt" oder übersehe ich was ?
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 21 November 2023, 13:00:29
Ich denke das passt schon so.

Wenn ich jetzt in TTS_CacheFileDir www/s2m angebe und meinen setter von
playSound:textField {my $tts="SonosTTS";my ($cmd,$vol,$file)=split(' ', $EVENT,3);$file=($file=~m/.*\.mp3$/)?"$file":"$file.mp3";fhem("set $NAME notify $vol http://[$tts:host]/fhem/[a:$tts:TTS_CacheFileDir]/$file")}auf
ZitatplaySound:textField {my $tts="SonosTTS";my ($cmd,$vol,$file)=split(' ', $EVENT,3);$file=($file=~m/.*\.mp3$/)?"$file":"$file.mp3";fhem("set $NAME notify $vol http://[$tts:host]/fhem/[a:$tts:TTS_CacheFileDir]/".'sounds/'.$file)}
ändere, dann hab ich wie ich mir das in etwa vorstellte einen extra Ordner für die gespeicherten Sprachausgaben und einen für die Sounds.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 21 November 2023, 14:22:14
Zitat von: TomLee am 21 November 2023, 12:22:16Wir nutzen doch die Text2speech-Definition im Server-Modus!
Hier zur Erklärung: Server-Modus bedeutet doch nur, dass TTS selbst kein play Kommando absetzt sondern einfach nur die Datei erzeugt.

Ich vermute Du verwendest bei deinem Test jetzt anstatt dem SonosSpeakWeb einfach den FHEMWEB Server, weil die Verzeichnisstruktur zufällig passt.

Das mit der Änderung des userReadings wäre auch mein Vorschlag für Dich gewesen. 
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 21 November 2023, 15:47:15
Zitat... weil die Verzeichnisstruktur zufällig passt.

Da ist was dran, auch wenn ich das Attribut TTS_CacheFileDir (default dann cache) lösche oder irgendeinen anderen Pfad angebe, sind die Dateien in www/s2m weiterhin im Browser aufrufbar.
Nicht nur die in www/s2m, sondern immer alle Dateien die sich in einem Unterordner von www befinden, die in www direkt nicht.
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: frinkenstein am 21 Dezember 2023, 07:55:46
Hallo zusammen,

nach jahrelangem mitlesen/lernen hier im/vom Forum trau ich mich mal (da ich dazu bisher nichts fand aber brauchte) etwas (kleines) beizusteuern:nachdem sonos2mqtt erfreulicherweise stabiler als SONOS/SONOSPLAYER (disconnect, Radio artist/titel-Anzeige seeehr selten) läuft, ich aber den ganzen Tag nebenbei Radio höre und gerne mal schau wer da was "singt" hab ich versucht das ins DeviceOverview der Sonos Beam über Anpassung in der 99_sonos2mqttUtils.pm des devStateIcon sub sonos2mqtt_devStateIcon anzeigen zu lassen - Artist und Titel zusammen bekam ich nicht hin, nur jeweils eins von beiden.

Alternativ fiel mir nur ein dann dem Mouseover über die Sound-Buttons mit attr MQTT2_RINCON_XYZ123 stateFormat transportState: currentTrack_Artist: currentTrack_Title die Anzeige beizubringen, was sogar recht schick ausschaut.Vielleicht kanns jemand gebrauchen - oder hat ne bessere Idee.

Davon ab vielen Dank für euren bisherigen Output - speziell hier an Otto123.

frinkenstein
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: JudgeDredd am 23 Dezember 2023, 10:02:59
Hallo Zusammen,

ich habe meinen SONOS Play:1 aus dem Keller gezerrt, entstaubt und wollte mal sonos2mqtt aus Neugier ausprobieren.
Die Einrichtung ging problemlos und die Beispiele funktionieren auch so wie sie sollen.

Da ich aber ungern den gesamten Beitrag einzeln durchklickern wollte und die Suche innerhalb eines Themas nun schon über 9 Monate nicht mehr funktioniert, hoffe ich mal auf Euer Wissen/Erinnerung der 92 Seiten.

Ich bin auf der Suche nach einem Topic, welches mir den Inhalt meiner eigenen Musikbibliothek im Modus Shuffle wiedergibt.
(Die Bibliothek ist eine SMB Freigabe, die ich mit der APP konfiguriert habe und funktioniert)

Vielleicht kann mir ja da einer behilflich sein.

Gruß,
JudgeDredd
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 23 Dezember 2023, 12:41:52
Moin,

Du meinst das? https://forum.fhem.de/index.php?topic=111711.msg1291486;topicseen#msg1291486
Ich weiß das mit der Suche ist blöd, aber ich hatte schon früher Probleme damit und habe mir immer so beholfen:
Thema "drucken" und dann einfach Browser Suche ctrl+f

Gruß Otto
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: JudgeDredd am 23 Dezember 2023, 13:16:03
Hallo Otto,
Zitat von: Otto123 am 23 Dezember 2023, 12:41:52Du meinst das? https://forum.fhem.de/index.php?topic=111711.msg1291486;topicseen#msg1291486 (https://forum.fhem.de/index.php?topic=111711.msg1291486;topicseen#msg1291486)
vielen Dank für den Hinweis, zwischenzeitlich habe ich das sogar schon bei mir gelöst.
Es lag aber an einer falschen Playlist-ID. Ich bin dem Beispiel auf GitHub gefolgt, aber meine Playlist-ID ist gar nicht numerisch sondern alphanumerisch.
Playlist starten/stoppen funktioniert nun wie ich es hätte.
Zitat von: Otto123 am 23 Dezember 2023, 12:41:52Ich weiß das mit der Suche ist blöd, aber ich hatte schon früher Probleme damit und habe mir immer so beholfen:
Thema "drucken" und dann einfach Browser Suche ctrl+f
Der Tip ist ja fast noch besser, als die Sonos Geschichte 👍

frohe Weihnachten,
JudgeDredd
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Otto123 am 23 Dezember 2023, 14:10:28
Zitat von: JudgeDredd am 23 Dezember 2023, 13:16:03Der Tip ist ja fast noch besser, als die Sonos Geschichte 👍
;D

Dir auch schöne Weihnachten
Otto
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: aski71 am 08 Januar 2024, 21:01:07
Hallo zusammen,
seit ein paar Wochen habe ich sonos2MQTT im Einsatz.
Nun habe ich festgestellt, dass das System von zwei meiner sechs konfigurierten Lautsprechern keine MQTT Messages bekommt. Ich kann da zwar z.B. Play in fhem drücken, aber fhem bekommt keine Message, dass der Player tatsächlich was abspielt.
Ich habe mal den MQTT Monitor laufen lassen und einen der Lautsprecher händisch eingeschaltet: Keine MQTT Message zu sehen, keine Statusänderung in fhem.
Was kann ich tun?
Danke, Alex
Titel: Aw: Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: Axel_S am 13 Februar 2024, 22:14:18
Hallo zusammen,
erst einmal vielen Dank für dieses tolle Modul!
Ich habe sonos2mqtt nach Anleitung installiert und eingerichtet, seit ca. 2 Wochen läuft alles stabil. Nur tts funktioniert trotz aller Versuche noch nicht richtig. Die Erzeugung der mp3 über VoiceRSS klappt, diese werden auch im Verzeichnis /opt/fhem/cache abgelegt und lassen sich extern abspielen. SonosSpeakWeb ist mit cache cache angelegt. Zum testen hab ich ein notify (mit https://cdn.smartersoft-group.com/various/pull-bell-short.mp3) abgeschickt, das wird sauber abgespielt. Wenn ich aber ein notify mit einer vorher erzeugten Sprachdatei abschicke (http://192.168.100.XX:8083/fhem/cache/4d082aa86ab506dce974c4b36667f05d.mp3) gibt es nur eine Pause und es wird nichts abgespielt. Es muss also wohl an der Bereitstellung der mp3-Dateien im cache-Verzeichnis liegen. Ein Aufruf von http://192.168.100.XX:8083/fhem/cache/4d082aa86ab506dce974c4b36667f05d.mp3 über einen Webbrowser ist möglich, führt komischerweise aber zu der Abfrage ob die Datei als .wav gespeichert werden soll, auch wenn der Browser mp3 eigentlich abspielen soll.
Vielleicht hat jemand eine Idee, ich bin jetzt leider erstmal am Ende mit meinem Latein.
Gruß Axel