Sonos2mqtt - vielleicht hat jemand Lust mitzumachen

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

Vorheriges Thema - Nächstes Thema

svrooij

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
Hardcore software developer. See https://github.com/svrooij/

Beta-User

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>"}

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

Beta-User

Zitat von: svrooij am 10 Juni 2020, 16:29:32
This question also might interest you, I'm looking for feedback:
https://github.com/svrooij/sonos2mqtt/issues/101

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

TomLee

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



Otto123

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

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

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

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

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

Dauert keine 10 Minuten (also wesentlich kürzer als die Einarbeitung in samba!), ich kann nur nicht sagen, wie unsicher das ist (das Binding an eine bestimmte Hardwareschnittstelle scheint "kaputt" zu sein, sonst was wenig dazu zu finden, der Dienst selbst ist aber sehr verbreitet).
ZitatStephan überlegt jetzt wie er die get's verarbeitet :) wie ich ihn jetzt einschätze, haben wir in Kürze die Möglichkeit jede Menge Informationen von den Playern und die Response auf unsere set's zu bekommen.
Das klingt gut!
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

TomLee

ZitatBin irritiert, auf meinem normalen System,mit der letzten Definition von oben wird kein devstateicon angezeigt, es läuft kein s2m aber die Readings hab ich ja durch das RAW, im Log steht hier jetzt:

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



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

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

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


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

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

Das ist auf dem Test und Hauptsystem so.

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

2020.06.11 10:00:04 1: PERL WARNING: Subroutine trim30 redefined at (eval 95) line 1.

Beta-User

Zeige bitte den vollständigen code. Vorab bitte Zeile 8 ansehen ;) .
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

TomLee

#218
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 ?


Beta-User

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","");;\
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

TomLee

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]





TomLee

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.

TomLee

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

TomLee

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



Otto123

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