Sonos2mqtt - vielleicht hat jemand Lust mitzumachen

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

Vorheriges Thema - Nächstes Thema

Wuppi68

Habe heute nur vom Firmenrechner mitgelesen ;-)

meine Config ist folgende

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

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

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

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

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

Danke das s2m Ball im Spiel ist ;-)



PS.: imho sollte doch der FHEM MQTT Server die Client ID gar nicht vor das Topic hängen. Die sehe ich doch auch gar nicht bei einem extern Broker in dem entsprechenden referenzierten Topic
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen

Otto123

Zitat von: kjmEjfu am 08 Juni 2020, 16:16:27
Sagt mal, Sonos hat ja heute seine App aufgesplittet (eine für die älteren Geräte, eine für die neueren). Hat das irgendwelche Auswirkungen auf Sonos2mqtt oder habt ihr da noch nichts beobachten können?
Ich habe gerade Update gemacht. Bei mir steht überall S1 - sicher weil ich noch einen Play5 im Bestand habe, obwohl der derzeit nicht aktiv ist.

Wenn Du S2 hast: Mut zur Lücke, probier es einfach aus mit sonos2mqtt. Es ist unkompliziert und läuft hervorragend parallel.
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

87insane

Hab s2..alles schön.

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

Gesendet von meinem LM-G810 mit Tapatalk


Otto123

#183
Ich habe mal ein funktionales Template gemacht. Und hier eingereicht:
https://forum.fhem.de/index.php/topic,94495.msg1062306.html#msg1062306

Gut so?
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

kumue

Zitat von: Otto123 am 08 Juni 2020, 22:48:42
Ich habe mal ein funktionales Template gemacht. Und hier eingereicht:
https://forum.fhem.de/index.php/topic,111711.msg1062302.html#msg1062302

Gut so?

irgendwie hab ich ein problem mit dem link... ???
wo hast du das template eingereicht..?

87insane

Es gibt einmal SVN und dann noch Ottos git.

Gesendet von meinem LM-G810 mit Tapatalk


Beta-User

#186
Vielleicht noch eine "kleine Knobelaufgabe" im Hinblick auf https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV#Kommandos...

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

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

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

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



Grundsätzlich auch nochmal die an anderer Stelle angedeutete Frage: Wann gibt es welche/wieviele Events? Müssen/sollten wir da ggf. was ausdünnen?
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

Info: Demnach müssten die Kollegen das sonos und Echo Modul anpassen. Steak dürfte nicht sein. Müsste sayText sein.

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

Gesendet von meinem LM-G810 mit Tapatalk


Beta-User

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

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

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

Empfangsseitig fehlt mir noch die Vorstellung, was da nach "Vollzug" via MQTT zurückkommt. Da muß man bestimmt auch irgendwas eventMap-pen oder userReadings festlegen.
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

Otto123

#189
Zitat von: kumue am 09 Juni 2020, 02:55:33
irgendwie hab ich ein problem mit dem link... ???
wo hast du das template eingereicht..?
Sorry da war beim copy & paste der Kopf nicht dazwischen :)
Ich habe den Link in meinem Post korrigiert. mittlerweile alles schon Schnee von gestern, siehe nächster Post :)
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

Oder statt des Links jetzt schon die weiter aktualisierte Fasung direkt aus dem svn:
Zitat von: TomLee am 02 Juni 2020, 17:26:16
{ Svn_GetFile("FHEM/lib/AttrTemplate/mqtt2.template", "FHEM/lib/AttrTemplate/mqtt2.template", sub(){ AttrTemplate_Initialize() }) }
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

#191
kleines update


  • die Readings kürz ich jetzt mit substr() (weil mir das mit text-overflow: ellipsis; nicht gelingt) damit sind die span immer einzeilig und es verschiebt sich nichts mehr im zweiten div
  • ein Bild zu nextTrack_AlbumArtUri gibts jetzt
  • die Bilder sind leicht abgerundet
  • wie man das mit mute macht hab ich mich immer noch nicht mit beschäftigt

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

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



Otto123

Sehr schön, an der Schönheit wird auch gearbeitet  :D

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

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

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

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

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

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

ZitatBTW: Unser holländischer Freund hat 3.0.6 released
Scheint allen Beteiligten Spaß zu machen. (Auch wenn ich etwas irritiert bin, dass manche die Entwicklungsgeschwindigkeit@diesem attrTemplate als sehr schnell empfinden. Ist zwar im Detail etwas kniffelig, aber nichts revolutionär neues, wenn man von dem sehr komplexen devStateIcon von TomLee absieht... (ausdrücklich: Thumbs up!))
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

ZitatErmuntert dadurch, dass das mit der sub so toll klappt,

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

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