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 --versionWenn 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:1800Per 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:1800ist 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

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
Zitat
Wie 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.

Zitat
Wichtig 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

Zitat
der 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)

Zitat
dient 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
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.

Zitat
Du 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
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?
Zitat
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:
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
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
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
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
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...
Zitat
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...
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_configerzeugt 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
Zitat
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?
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.
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) }

Zitat
Sorry 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
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
Zitat
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

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?

Zitat
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?
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.

Zitat
wie 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).

Zitat
bzw. 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
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?

[...] 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
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
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.

Zitat
Status 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
Zitat
B) 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
Zitat
Ich 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
@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!)

Ich 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
Zitat
mit 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

Zitat
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...
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
Zitat
Gerä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?).

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
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
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.

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.mp3Dateien 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
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
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
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
Auch eigentlich unnötig:
qed: Nicht nur ich empfinde diesen Unsinn (aus FHEM-Sicht) als unnötig...
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.
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_?).

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
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.

Zitat
nur 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
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)?

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
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
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
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) ...

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
Zitat
Mute will be fixed soon (see svrooij/node-sonos-ts#59)
SwitchToTv was a bug in the sonos-command-mapping, good spot!
Zitat
This 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
Zitat
This 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
Zitat
straight 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.3In 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
@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
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.

Zitat
Viele 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
Zitat
Was 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.

Zitat
Mein 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
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
Zitat
Wä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.

Zitat
Das 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:
Zitat
Was 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?

Zitat
Was 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
Zitat
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.
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.

Zitat
volumeup_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

Zitat
Ziel 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
Zitat
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.

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
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).

Zitat
Allgemein, 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).

Zitat
Zu 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
Zitat
Das 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
Zitat
Grundsä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
Zitat
mal 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
Zitat
Kann 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
Zitat
Dieser 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
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
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
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
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.

Zitat
Kannst 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
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:
{ 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 playWie 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
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
Zitat
ich 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...)

Zitat
BTW: 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
Zitat
Ermuntert 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!
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
Zitat
Müß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
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
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
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
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).
Zitat
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.
Das klingt gut!
Titel: Antw:Sonos2mqtt - vielleicht hat jemand Lust mitzumachen
Beitrag von: TomLee am 11 Juni 2020, 10:10:55
Zitat
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:

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
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
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
Zitat
If 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
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
Zitat
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...

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
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).

Zitat
Wenn 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

Zitat
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.
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?

Zitat
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.
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:
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
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
? 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.

Was deine Zeile genau macht, habe ich auf die Schnelle nicht erkennen können.
Dann teste es halt, ob es macht, was ich schreibe:
Er stellt eben nur entweder ein mute oder ein unmute-Symbol in webCmd dar.
Zitat
EDIT: 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
Zitat
Er 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..

Zitat
Das 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
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 ;) .

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
Zitat
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....).

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 ;) ).

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
Zitat
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).
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.

Zitat
Bei 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..

Zitat
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 ;) ).
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.

Zitat
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).
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
Zitat
It 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
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"

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
Zitat
Kannst 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!


Zitat
BASE_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
Zitat
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.
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
Zitat
Dafü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:
Zitat
MQTT 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
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 ?



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,

Zitat
PS: 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
Zitat
Bau 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
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 listOder 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 -gIst 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
Zitat
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.

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
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
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,

Zitat
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.
Finde ich auch... Habs so gelassen, da ich nicht genau weiß was Beta-User vor hat damit ....

Zitat
ich 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?

Zitat
Was 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
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
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 :)

Zitat
Was 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
Zitat
Ich 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
Zitat
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.
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

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
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
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
Zitat
Was noch etwas stört ist der nächste Track, der passt nicht beim Radio
sehe da kein Problem.. bekomme ich weg.

Zitat
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
Worauf bezogen?

Zitat
Ich 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?

Zitat
Eh 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
@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:
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
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
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
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
Zitat
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).
Wie geht das? Beispiel(e)?

Zitat
der 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
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 ;) .
Zitat
Da 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.

Zitat
Ich 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 :) )
Zitat
Bei 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
ich verspreche ich designe / beschreibe es in Zukunft ordentlich (ohne 777 :) )
:)

Zitat
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.
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.

Zitat
Ich  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
..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ä!

Zitat
Für Automatisierung (sage jemanden "nicht interaktiv": spiele diesen Titel) ist das offenbar nicht gedacht.
Genau!

Zitat
smb 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
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
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
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
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
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
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
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
(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!
...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
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 ;) )
Zitat
Bis 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
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:playund 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