Sonos2mqtt - vielleicht hat jemand Lust mitzumachen

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

Vorheriges Thema - Nächstes Thema

Otto123

#390
Moin,

ich habe gestern mal noch was fürs Auge getan ;) zwei Dinge könnte man vielleicht einfach im Basistemplate mit ausliefern:
Ein ganz minimalistisches devStateIcon für die Player.
attr MQTT2_RINCON_.* devStateIcon (STOPPED|PAUSED_PLAYBACK):rc_PLAY:toggle PLAYING:rc_PAUSE:pause .*:refresh:play
und auch für die Bridge
attr SonosBridge devStateIcon 0:10px-kreis-rot 1:10px-kreis-gelb 2:10px-kreis-gruen
attr SonosBridge stateFormat connected


Die aufwendige Variante von 87insane habe ich mal etwas abgeändert/erweitert/gekürzt ;) :

  • der TV Eingang (spdif) wird erkannt
  • absolute Namen sind raus
  • der Bridge Zustand ist raus
  • die bedingte Ausführung des kompletten Codes vom connected Zustand der Bridge ist raus.
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

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?)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

87insane

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

Otto123

#393
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

  • Setup auf Systemebene
  • Setup in FHEM als Grundlage
  • Speak Text
  • komfortable Bedienung
Ü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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

carlos

#394
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
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Otto123

#396
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:

  • SonosTTS modifizieren / definieren
  • definieren SonosSpeakWeb
  • notify definieren (keine Änderung gegenüber vorher)
  • bei allen Playern Speak nachrüsten falls noch nicht vorhanden
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Reinerlein

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

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

carlos

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
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

Otto123

Hallo Carlos,

Dein m2s hat eventuell complex als autocreate?

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

carlos

#401
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
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

87insane

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

Otto123

Zitat von: carlos am 29 Juli 2020, 14:32:51

Vielleicht sollte man das in die Doku mit aufnehmen.
Danke für die Bestätigung, habe ich in der Doku schon notiert ;)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Otto123

Moin 87insane,

Du kannst noch die "neutralisierte" Zeile für den Gruppenmeister von mir übernehmen:
my $uuidtoname = (devspec2array('DEF='.ReadingsVal($name,'coordinatorUuid','0')))[0];
Und bei der zusätzlichen Erkennung ob der TV Eingang aktiv ist fand ich mich auch nicht schlecht :)
    if (ReadingsVal($name,'name','') eq $sgroupname) {\
      $show = ReadingsVal($name,'currentTrack_TrackUri','') =~ 'spdif'\
     ? 'TV': ReadingsVal($name,'enqueuedMetadata_UpnpClass','FEHLER') ne 'object.item.audioItem.audioBroadcast'\
     ? "$show Aktueller Track: $currentTrack<br>Nächster Track: $nextTrack"\
     : "$show Radio: $currentTrack"}\


Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz