Sonos2mqtt - vielleicht hat jemand Lust mitzumachen

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

Vorheriges Thema - Nächstes Thema

87insane

Hey zusammen,

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

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

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

Hat schon jemand den neuen "mini-Player" getestet? Anregungen?

TomLee

Würd gern, bekomms aber nicht hin  ;D

Bekomme nur den state angezeigt:

Hier mal ein List :

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

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

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

Aktueller Track: $currentTrack

Nächster Track: $nextTrack";}

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

"

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

87insane

Okaaayyyy....

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

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

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

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

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


readinglist:

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


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


setstatelist:
play pause stop next previous volumeUp volumeDown mute

webcmd:
volume

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

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

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

Aktueller Track: $currentTrack

Nächster Track: $nextTrack";}

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

"

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


PS: Sieht aus als hättest du keinen online Stati. Der kommt vom Dienst. Einfach mal neustarten.... Wenn das irgendwann fest mit drin ist braucht man das nicht mehr.

TomLee

Okaaayyyy....

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

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

mit RAW-Code passiert das erst gar nicht.

87insane

Nachvollziehen kann ich das nicht. Geht wunderbar. Hatte im letzten nur ein status hinzugefügt, der Rest blieb gleich.
Komisch komisch.

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

Lange rede kurzer Sinn....
Was noch fehlen kann sind stati die meine Geräte nicht haben. Zb hat eine Sonos play 1 stopped auch bei Pause im state. Die play one macht aber paused_playback bei Pause. Ich arbeite aktuelle mit s2 und hatte s1 aber noch anfangs getestet. Sollten also stati fehlen, sollten diese neben dem Punkt angezeigt werden.
Diese bräuchte ich noch, wenn jemand was findet.

87insane

#290
Resdingslist: Ach ja ... Ich glaube man braucht eigentlich echt nur den solo Pfad. Zumindest bei der Version von Player. Ich hatte bisher schlicht weg keine Lust das weiter zu comparen. Wer sowas mag darf sich frei fühlen :)

Ideen sind gern willkommen. Wir können das auch weiter ausbauen. Find es mit (ich nenne es mal so) "full Feedback" echt gut und auch auf Handy/Tablet super zu bedienen. Daumen auf zb nächster Track aber das erste Symbol zeigt kurz weiter an. Da geht aber sicher noch mehr mit euch allen :)

TomLee

Warum hast noch kein Album-Bild mit reingenommen oder willst das  jetzt nicht mehr und was hältst davon die Readings von den Titel und Artist-Readings zu kürzen wie ich das gemacht hatte ?
Mag das nicht wenn die DeviceOverview in der Höhe rumzappelt, wenn das Reading überlang ist wie das bspw. der Fall ist wenn man Radiosender spielt.

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

Mir gefällt die Variante es mit Perl in devstateIcon zu lösen auf jedenfall besser, auch wenn das wie ich es bisher verstanden habe nicht der präferierte Weg sein soll, sondern so wie du es zuvor in devstateIcon mit mehrzeiligem stateformat gemacht hast.

87insane

Schlicht weg hab ich in meinen Augen alles gegeben eine "ohne perl" Variante zu liefern. Mehr kann ich da nicht machen. Hab das Ding bei mir aber nicht am laufen. War quasi nur für hier ein Abend testen..sicher auch nicht zu 100% perfekt.

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

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

Ich finde die Cover bzw bild Geschichte sollte als auswählbare Option rein. Baue ich gern ein aber bitte schick kurz die Zeile wie ihr das gelöst hattet. Habe viele Seiten nicht gelesen da es in Menge zu viel und monoton war. Sicher für die Leser, unser Text auch :-/ :-P
Finde das man eben wählen können sollte. Der eine mag mit der andere ohne. Oder nur in gewissen Fällen x mit und y ohne...usw. Würde es vermutlich morgen einbauen können.

TomLee

ZitatBau es mal ein und dann sind wir schon ein Level weiter :) bin gespannt wie du das genau meinst.
attr Test26 devStateIcon {\
my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...';; };;\
my $mystate = ReadingsVal($name,"state","FEHLER");;\
my $amp = ReadingsVal($name,"bridgeConnected","0") eq "0"\
? "rot"\
: ReadingsVal($name,"bridgeConnected","0") eq "1"\
? "gelb"\
: "gruen";;\
my $playpic = $mystate eq "PLAYING"\
? 'rc_PAUSE@red'\
: $mystate eq "PAUSED_PLAYBACK"\
? 'rc_PLAY@green'\
: $mystate eq "STOPPED"\
? 'rc_PLAY@green'\
: $mystate eq "TRANSITIONING"\
? 'rc_PLAY@yellow'\
: $mystate eq "set_next"\
? 'rc_NEXT@yellow'\
: $mystate eq "set_previous"\
? 'rc_PREVIOUS@yellow'\
: $mystate eq "set_volumeUp"\
? 'rc_VOLUP@yellow'\
: $mystate eq "set_volumeDown"\
? 'rc_VOLDOWN@yellow'\
: $mystate eq "set_mute"\
? 'rc_MUTE@yellow'\
: $mystate;;\
my $mutecmd = ReadingsVal($name,"mute","0") eq "false"\
? "true"\
: "false";;\
my $mutepic = ReadingsVal($name,"mute","0") eq "false"\
? 'rc_MUTE'\
: 'rc_VOLUP';;\
my $show = "FEHLER";;\
my $currentTrack = $mystate eq "TRANSITIONING"\
? "Puffern..."\
: $trim30->(ReadingsVal($name,"currentTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"currentTrack_Title","FEHLER"));;\
my $nextTrack = $trim30->(ReadingsVal($name,"nextTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"nextTrack_Title","FEHLER"));;\
my $previouspic = 'rc_PREVIOUS';;\
my $nextpic = 'rc_NEXT';;\
my $voldownpic = 'rc_VOLDOWN';;\
my $voluppic = 'rc_VOLUP';;\
\
if (ReadingsVal($name,"bridgeConnected","0") ne "2") {\
$show = " ".FW_makeImage("rc_BLANK")." ";;}\
\
elsif (($mystate eq "PLAYING")\
|| ($mystate eq "TRANSITIONING" )\
|| ($mystate eq "set_next" )\
|| ($mystate eq "set_previous" )\
|| ($mystate eq "set_volumeUp" )\
|| ($mystate eq "set_volumeDown" )\
|| ($mystate eq "set_mute" )) {\
$show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>\
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>\
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>\
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>\
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>\
&nbsp;;&nbsp;;&nbsp;;&nbsp;;\
<a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>\
Aktueller Track: $currentTrack<br>\
Nächster Track: $nextTrack";;}\
\
else {$show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>";;}\
\
"<div>\
".FW_makeImage("10px-kreis-".$amp)."\
$show\
</div>"\
}

87insane

#294
Gut..

Hast du die Cover Zeile parat für morgen?

Hab mir auch die Gruppen Dynamik angesehen. Das wird lustig. Ohne CR in meinen Augen nur ungenau machbar. Der gruppenname ist immer Name vom Master + 1,2,3,xxxx.
Nur wer mit wem verbunden ist, bekomme ich nicht raus. Jetzt könnte man gucken welcher player noch läuft aber was wenn eine weitere Zone läuft? Es gibt über die aktuellen readings keine Zuordnung der Gruppen oder gruppenname oder aber Geräte im Detail. Ich glaube jede Umsetzung mit aktueller konfig wäre sinnfrei. Wir müssen den Programmierer (Stephan @svrooij) nochmal anschreiben. Sieht jemand einen anderen weg?

TomLee

my $img = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");
<img src='$img' style='width:200px;height:250px;border-radius:5px;'>


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

Ich weiß auch nicht was richtig ist, hatte mich für divs entschieden.

87insane

Auf den ersten Blick schön. Einzig müsste ich gucken (html) wie ich das variabel in devstateicon bekomme. Es solle maximal so groß sein wie eben der Content vorher. Das zu fixen in Pixel ist dann suboptimal. Aber da muss ich auch erst lesen. Sicher gibt es da was...
An sich würde ich das auch in div packen außer man hätte noch einen Link zum album oder so. Dann würde ich den dahinter setzen. Was mich an fhem und Sonos auch immer stört, gescheit kann man es eigentlich nicht nutzen. So wie die App o.ä. ist es eben nicht. Denke aber man kann bohren.

87insane

#297
Moin,

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

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

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

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

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


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

PS: Das Gruppenverhalten muss noch komplett untersucht werden. Das ist mega "komisch" aktuell. Aber das liegt nicht am Player sondern an dem, was geliefert wird.

TomLee

Zitat... ein paar Versuche zum Slider gesehen. Bist du da weiter?

Den Stand dazu kannst du in etwa hier den folgenden Beiträgen entnehmen.

Ich frag nicht an kompetenter Stelle, wenn ich nichtmal eine kompetente Frage bzw. Antworten liefern kann, dazu hab ich, bis jetzt, zu wenig verstanden.

87insane

Interessanter Thread!

Aber wie da schon gesagt, es muss gehen - Nur wie?
Ich teste auch noch ein wenig weiter. Denke der Player kann so aber komplett genutzt werden, oder was meinst du?