Sonos2mqtt - vielleicht hat jemand Lust mitzumachen

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

Vorheriges Thema - Nächstes Thema

Beta-User

Zitat von: TomLee am 12 Juni 2020, 19:50:14
Zum nachvollziehen für unseren blinden Helfer ( aber wsl. ist dir das eh klar):

Dieses Device wurde bei mir angelegt nach einem {   "command": "adv-command",   "input": {     "cmd": "GetFavoriteRadioStations",     "reply": "DougRadio"   } }
Falls das an meine Adresse ging: Das war mir nicht klar, und ich finde den Mechanismus auch irgendwie irritierend. Mir ist nicht klar, welchen Sinn es hat, den Rückmeldepfad konfigurieren zu können. Topic-Trees sind in meinem Weltbild eher was statisches, aber vermutlich übersehe ich in dem Gesamtkontext grade mal wieder was...

Es dürfte auch nicht so einfach werden, was mit den Readings anzufangen, aber auch dazu fehlen mir vermutlich die Zusammenhänge, so dass ich grade nicht glaube, eine große Hilfe sein zu können.
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

ZitatFalls das an meine Adresse ging: Das war mir nicht klar, und ich finde den Mechanismus auch irgendwie irritierend. Mir ist nicht klar, welchen Sinn es hat, den Rückmeldepfad konfigurieren zu können. Topic-Trees sind in meinem Weltbild eher was statisches, aber vermutlich übersehe ich in dem Gesamtkontext grade mal wieder was...

Ob der Pfad nun konfigurierbar ist oder nicht, ist das am Ende nicht egal, man gibt ihn einmal an und ändert ihn doch nicht mehr.
Kann mans nicht auch auch von der anderen Seite sehen, das wir so den Pfad nennen können wir möchten.

Es dürfte auch nicht so einfach werden, was mit den Readings anzufangen, aber auch dazu fehlen mir vermutlich die Zusammenhänge, so dass ich grade nicht glaube, eine große Hilfe sein zu können.

Wenn man den Readings noch einen Namen gibt {json2nameValue($EVENT,'FavoriteRadioStation',$JSONMAP) } aber schon oder verstehe ich dich bloß nicht.

Ich sehe die Result_4_Title und Result_5_TrackUri in einem select-setter, mir ist nur nicht klar ob und wenn dann wie das überhaupt geht.

Nur die TrackUri ins select-Widget zu bekommen, das krieg ich (mit etwas Hirnschmalz) noch hin, mein ich.
Aber das die Titel in der Auswahl zu sehen sind, die TrackUri aber ausgeführt werden, das mir völlig unklar ob das gehen könnte.

Und weiter stell ich mir die Frage, sry für meine Unwissenheit, ob und wenn wie, es möglich ist alle anderen Readings aus dem Pfad gar nicht erst anzulegen. jsonMap macht hier ja wenig Sinn.


Beta-User

Zitat von: TomLee am 15 Juni 2020, 14:10:51
Kann mans nicht auch auch von der anderen Seite sehen, das wir so den Pfad nennen können wir möchten.
Kann man. Aber die Erfahrung lehrt: Wenn es zu flexibel ist, gibt's kreative Nutzer, die es übertreiben und genau deswegen darüber stolpern. (War nicht auf jemanden konkreten gemünzt).

ZitatWenn man den Readings noch einen Namen gibt {json2nameValue($EVENT,'FavoriteRadioStation',$JSONMAP) } aber schon oder verstehe ich dich bloß nicht.
Nun ja, wenn man jsonMap nutzt, machen (zu) lange Präfixe m.E. wenig Sinn

ZitatIch sehe die Result_4_Title und Result_5_TrackUri in einem select-setter, mir ist nur nicht klar ob und wenn dann wie das überhaupt geht.
Wie üblich dürfte auch das "irgendwie" gehen, aber eigentlich kommt mir das sehr kompliziert vor. Einfacher wäre es, man wählt einfach eine Stationstaste und würde die Tastennummer übermitteln und sonos2mqtt den Rest erledigen lassen. Weiß aber nicht, ob das geht oder vorgesehen ist. In Widgets (https://wiki.fhem.de/wiki/FHEMWEB/Widgets) sieht es mir jedenfalls so aus, als könnte man den label für 23iconLabel irgendwie per Perl festlegen?

ZitatUnd weiter stell ich mir die Frage, sry für meine Unwissenheit, ob und wenn wie, es möglich ist alle anderen Readings aus dem Pfad gar nicht erst anzulegen. jsonMap macht hier ja wenig Sinn.
Na ja, man müßte mal wieder etwas Perl bemühen und ggf. die Daten filtern. Aber auch hier stelle ich mir die Frage, ob es nicht besser wäre, einfach weniger/anders zu senden? (Das müßtet ihr aber entsprechend aufarbeiten, so dass Stefan weiß, was eigentlich gewollt ist - mir ist das im Moment eine Spur zu abstrakt...).
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

#243
Hab nun lange nicht mehr rein gesehen (Zeit :-\).
Nun habe ich heute mal ein FHEM Update gemacht und alles neu erstellt.

Dabei ist mir aufgefallen das es noch keine wirkliche Anzeige (die schön ist) zur Steuerung gibt.
Da ich hier mal an Beta-Users Worte dachte habe ich das mal OHNE PERL umgesetzt. Die Icons gehen sicher besser aber ich finde das erstmal okay.
Hinzu habe ich das mal mit mute angepasst, das es auch drin steht wenn es aktiv ist.

Anbei mal die attr des Gerätes...
Attributes:
   IODev      sonosmqtt
   alias      Badezimmer
   cmdIcon    mute:rc_MUTE previous:rc_PREVIOUS next:rc_NEXT play:rc_PLAY pause:rc_PAUSE stop:rc_STOP shuffleT:rc_SHUFFLE repeatT:rc_REPEAT volumeDown:rc_VOLDOWN volumeUp:rc_VOLUP
   devStateIcon (pause|stop):rc_STOP@red:play STOPPED:rc_PLAY@green:play PLAYING:rc_STOP@red:stop play:rc_PLAY:stop TRANSITIONING:rc_PLAY@yellow:stop mute:audio_volume_mute@yellow volume:audio_volume_mid@yellow volumeDown:audio_volume_low@yellow volumeUp:audio_volume_high@yellow
   icon       audio_volume_low
   jsonMap    volume_Master:volume mute_Master:mute transportState:state
   model      sonos2mqtt_speaker
   readingList sonos/status/badezimmer/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }
  sonos/status/badezimmer/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }
  sonos/RINCON_5CAAFD79D52801400:.* { json2nameValue($EVENT,'',$JSONMAP) }
   room       MQTT2_DEVICE
   setList    stop:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "stop" }
  play:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "play" }
  pause:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "volumedown" }
  switchToQueue:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "switchtoqueue" }
  switchToTv:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "switchtotv" }
  switchToLine:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "switchtoline" }
  volume:slider,0,1,100 sonos/RINCON_5CAAFD79D52801400/control { "command": "volume", "input": $EVTPART1 }
  mute:true,false { my $value = $EVTPART1 eq "true" ? "mute" : "unmute"; qq(sonos/RINCON_5CAAFD79D52801400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "next" }
  previous:noArg sonos/RINCON_5CAAFD79D52801400/control { "command": "previous" }
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_5CAAFD79D52801400/control $payload)}
  joinGroup:textField sonos/RINCON_5CAAFD79D52801400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_5CAAFD79D52801400","groupName","all"); qq(sonos/RINCON_5CAAFD79D52801400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_5CAAFD79D52801400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  notify:textField sonos/RINCON_5CAAFD79D52801400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
  webCmd     previous:play:pause:next::::volumeDown:volume:volumeUp:mute
  webCmdLabel     ::::::::::Mute


Finde das so ein wenig schöner und gut zu verwalten... Habe die X Seiten hierzwischen nicht nachgelesen. Ich freue mich über Feedback. Danke

HINWEIS: Habe um 11:32 nochmal was angepasst (verschiedene Player sprechen verschieden. Die Play ONE hat bei mir z.B. kein TRANSITIONING. Die Play 1 aber schon).

Beta-User

Diese Ansicht finde ich auch nett!

Vielleicht noch das hier:
Zitat von: Beta-User am 09 Juni 2020, 18:01:21
attr Test10 readingList [...]
  mute:iconSwitch,on,rc_MUTE,off,rc_VOLUP { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
[...]
und setStateList?

Ich bin mir auch nicht sicher, ob wir play/stop/pause nicht irgendwie in "state" bekommen sollten (dann könnte man auch iconSwitch für play/pause verwenden?), aber da fehlt mir grade auch der Überblick, wie da was dazu zurückkommt...(?)
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

#245
Weil keiner mehr was zu dem Status-Icon ohne Perl in devstateIcon der Bridge sagte hab ich mir was ausgedacht wie man einen Text passend zum Icon anzeigt, wenn man überhaupt einen will.
Mit der Umsetzung kann ich aber auch völlig auf dem Holzweg sein.

Ganz ohne Perl gings aber nicht, dafür aber in der RL.
Habs versucht direkt im connected-Readinglist-Eintrag umzusetzen aber nicht hinbekommen.

defmod MQTT2_SONOS_BRIDGE MQTT2_DEVICE mqttjs_77e3f505
attr MQTT2_SONOS_BRIDGE IODev MQTT2_Server
attr MQTT2_SONOS_BRIDGE bridgeRegexp sonos/(RINCON_[A-Z0-9]+):.* "$1"
attr MQTT2_SONOS_BRIDGE devStateIcon icon.2:10px-kreis-gruen icon.1:10px-kreis-gelb icon.0:10px-kreis-rot
attr MQTT2_SONOS_BRIDGE icon mqtt_bridge_2
attr MQTT2_SONOS_BRIDGE model sonos2mqtt_bridge
attr MQTT2_SONOS_BRIDGE readingList sonos/connected:.* connected\
sonos/connected:.* {my $var = $EVENT == 0 ? "offline" : $EVENT == 1 ? "online": "connected";;{'state' => $var}}\
homeassistant/music_player/RINCON_([0-9A-Z]+)/sonos/config:.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),;; { "config_$1"=>$EVENT }}\
  sonos/status/[^/]+/avtransport:.* {}\
  sonos/status/[^/]+/renderingcontrol:.* {}
attr MQTT2_SONOS_BRIDGE room MQTT2_DEVICE
attr MQTT2_SONOS_BRIDGE stateFormat icon:connected\
state

setstate MQTT2_SONOS_BRIDGE icon:2\
connected
setstate MQTT2_SONOS_BRIDGE 2020-06-18 14:04:14 config_RINCON_000E58F7F67C01400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_000E58F7F67C01400/control","device":{"identifiers":["RINCON_000E58F7F67C01400"],"manufacturer":"Sonos","name":"Wohnzimmer"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_000E58F7F67C01400","name":"Wohnzimmer","state_topic":"sonos/RINCON_000E58F7F67C01400","unique_id":"sonos2mqtt_RINCON_000E58F7F67C01400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
setstate MQTT2_SONOS_BRIDGE 2020-06-18 14:04:14 connected 2
setstate MQTT2_SONOS_BRIDGE 2020-06-18 14:04:14 state connected


edit:

bezogen auf die letzte Frage hier dann so:

defmod MQTT2_SONOS_BRIDGE MQTT2_DEVICE mqttjs_77e3f505
attr MQTT2_SONOS_BRIDGE IODev MQTT2_Server
attr MQTT2_SONOS_BRIDGE bridgeRegexp sonos/(RINCON_[A-Z0-9]+):.* "$1"
attr MQTT2_SONOS_BRIDGE comment {my $var = ReadingsVal($name,"connected","no artist") eq "0" ? "not connected" : ReadingsVal($name,"connected","no artist") eq "1" ? "no SONOS Device" : "connected";;\
{qq(connected<br>$var)};;}
attr MQTT2_SONOS_BRIDGE devStateIcon icon.2:10px-kreis-gruen icon.1:10px-kreis-gelb icon.0:10px-kreis-rot
attr MQTT2_SONOS_BRIDGE icon mqtt_bridge_2
attr MQTT2_SONOS_BRIDGE model sonos2mqtt_bridge
attr MQTT2_SONOS_BRIDGE readingList sonos/connected:.* connected\
sonos/connected:.* {my $var = $EVENT == 0 ? "disconnected" : "running";;{'state' => $var}}\
homeassistant/music_player/RINCON_([0-9A-Z]+)/sonos/config:.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),;;;; { "config_$1"=>$EVENT }}\
homeassistant/music_player/RINCON_([0-9A-Z]+)/sonos/config:.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),;; { "config_$1"=>$EVENT }}\
  homeassistant/music_player/RINCON_([0-9A-Z]+)/sonos/config:.* { $TOPIC =~ m,(RINCON_[0-9A-Z]+),;; { "config_$1"=>$EVENT }}\
  sonos/status/[^/]+/avtransport:.* {}\
  sonos/status/[^/]+/renderingcontrol:.* {}
attr MQTT2_SONOS_BRIDGE room MQTT2_DEVICE
attr MQTT2_SONOS_BRIDGE stateFormat icon:connected\
state

setstate MQTT2_SONOS_BRIDGE icon:2\
running
setstate MQTT2_SONOS_BRIDGE 2020-06-19 12:28:11 config_RINCON_000E58F7F67C01400 {"available_commands":["adv-command","clearqueue","command","joingroup","leavegroup","mute","next","notify","pause","play","playmode","previous","queue","seek","selecttrack","setavtransporturi","sleep","speak","stop","switchtoline","switchtoqueue","switchtotv","toggle","unmute","volume","volumedown","volumeup"],"command_topic":"sonos/RINCON_000E58F7F67C01400/control","device":{"identifiers":["RINCON_000E58F7F67C01400"],"manufacturer":"Sonos","name":"Wohnzimmer"},"device_class":"speaker","icon":"mdi:speaker","json_attributes":true,"json_attributes_topic":"sonos/RINCON_000E58F7F67C01400","name":"Wohnzimmer","state_topic":"sonos/RINCON_000E58F7F67C01400","unique_id":"sonos2mqtt_RINCON_000E58F7F67C01400_speaker","availability_topic":"sonos/connected","payload_available":"2"}
setstate MQTT2_SONOS_BRIDGE 2020-06-19 12:28:11 connected 2
setstate MQTT2_SONOS_BRIDGE 2020-06-19 12:28:11 state running


87insane

#246
Zitat von: Beta-User am 18 Juni 2020, 12:53:56
Diese Ansicht finde ich auch nett!

Vielleicht noch das hier:und setStateList?

Ich bin mir auch nicht sicher, ob wir play/stop/pause nicht irgendwie in "state" bekommen sollten (dann könnte man auch iconSwitch für play/pause verwenden?), aber da fehlt mir grade auch der Überblick, wie da was dazu zurückkommt...(?)

Hab mir mal Mühe gegeben und hab etwas ganz ohne Perl gebaut. Aber nochmal anders als vorhin und alles in devstateicon gepackt. So kann ich auch ein/ausblenden.
Ich weiß nur nicht wie ich den Slider da noch rein bekomme (deswegen aktuell zusätzlich in webcmd). Das ist nur ein erster Entwurf und auch die 1px Schummelei, da ich kein Perl nutzen kann und keine bessere Idee hab. Aber in diese Richtung wird sich das bei mir bewegen. Track Info usw wollte ich noch einbauen...

Attributes:
   IODev      sonosmqtt
   alias      Küche
   devStateIcon STOPPED:rc_PLAY@green:play
(pause|stop):rc_STOP@red:play
PLAYING:rc_STOP@red:stop
(TRANSITIONING|play):rc_PLAY@yellow:stop
mute:audio_volume_mute@yellow
volume:audio_volume_mid@yellow
volumeDown:audio_volume_low@yellow
volumeUp:audio_volume_high@yellow
next:rc_NEXT@yellow:stop
previous:rc_PREVIOUS@yellow:stop
(next|mute|volumeDown|volumeUp|previous|pause|volume|STOPPED|TRANSITIONING|play|stop).(false|previous|next|volumeDown|volumeUp|[0-9]+):1px-spacer
PLAYING.previous:rc_PREVIOUS:previous
PLAYING.next:rc_NEXT:next
PLAYING.volumeDown:rc_VOLDOWN:volumeDown
PLAYING.volumeUp:rc_VOLUP:volumeUp
PLAYING.false:audio_volume_high:mute+true
PLAYING.true:audio_volume_mute:mute+false
   icon       audio_volume_low
   jsonMap    volume_Master:volume mute_Master:mute transportState:state
   model      sonos2mqtt_speaker
   readingList sonos/status/küche/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }
  sonos/status/küche/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }
  sonos/RINCON_7828CAF4289001400:.* { json2nameValue($EVENT,'',$JSONMAP) }
   room       MQTT2_DEVICE
   setList    stop:noArg sonos/RINCON_7828CAF4289001400/control { "command": "stop" }
  play:noArg sonos/RINCON_7828CAF4289001400/control { "command": "play" }
  pause:noArg sonos/RINCON_7828CAF4289001400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_7828CAF4289001400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_7828CAF4289001400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_7828CAF4289001400/control { "command": "volumedown" }
  switchToQueue:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtoqueue" }
  switchToTv:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtotv" }
  switchToLine:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtoline" }
  volume:slider,0,1,100 sonos/RINCON_7828CAF4289001400/control { "command": "volume", "input": $EVTPART1 }
  mute:true,false { my $value = $EVTPART1 eq "true" ? "mute" : "unmute"; qq(sonos/RINCON_7828CAF4289001400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_7828CAF4289001400/control { "command": "next" }
  previous:noArg sonos/RINCON_7828CAF4289001400/control { "command": "previous" }
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_7828CAF4289001400/control $payload)}
  joinGroup:textField sonos/RINCON_7828CAF4289001400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_7828CAF4289001400","groupName","all"); qq(sonos/RINCON_7828CAF4289001400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_7828CAF4289001400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  notify:textField sonos/RINCON_7828CAF4289001400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
   stateFormat [$name:state]
[$name:state].previous
[$name:state].next
[$name:state].volumeDown
[$name:state].[$name:volume]
[$name:state].volumeUp
[$name:state].[$name:mute]
   webCmd     volume


Hier werden auch die ganzen zwischenstati mitgenommen. Also wenn z.B. Play gedrückt wird, buffert er erstmal und das wird gelblich dargestellt. Das erste Icon nehme ich zur Anzeige aller Befehel. Also wenn z.B. volumeUp genutzt wird, wird das erste Icon kurz gelb und zeigt ein entsprechendes Icon an. So hat man auch direkt Feedback ob man getroffen hat und was.

Dazu sieht man einen laufenden Player sofort.

EDIT: IST ABER AUCH NOCH NICHT GANZ FERTIG!

Beta-User

? Mein vorheriger Post macht doch nicht mehr Perl? Er stellt eben nur entweder ein mute oder ein unmute-Symbol in webCmd dar...?

Und bitte klärt asap, was in setStateList soll. Erst danach macht es Sinn, über devStateIcon und die dortigen Ersetzungsregexe zu spekulieren (ohne Perl).
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

#248
Zitat von: Beta-User am 18 Juni 2020, 14:48:47
? Mein vorheriger Post macht doch nicht mehr Perl? Er stellt eben nur entweder ein mute oder ein unmute-Symbol in webCmd dar...?

Und bitte klärt asap, was in setStateList soll. Erst danach macht es Sinn, über devStateIcon und die dortigen Ersetzungsregexe zu spekulieren (ohne Perl).

Das mit dem "kein Perl" ist darauf bezogen das du dir das mal gewünscht hattest und ich an dem Tag keine Zeit und Lust mehr hatte. Was deine Zeile genau macht, habe ich auf die Schnelle nicht erkennen können.

Ich finde es gut wenn alles über state kommt. Ich finde man muss hier nichts auslagern. Ich möchte ja die zwischen Stati von mqtt2sonos nutzen und brauche keine mit Rückinfo von FHEM. (wenn ich nicht verstehe wofür du es genau siehst, sag bitte warum....).


EDIT: Weiß jemand wie ich den Slider in devStateIcon bekomme? Da steht aktuell im Bild z.B. "PLAYING.6"

Beta-User

Ich finde es selten gut, wenn Anweisungen, die sich auf Readings beziehen, nicht _dort_ als "set_.*" auftauchen, sondern über state laufen.

Ist sicher auch Geschmackssache, aber spätestens dann, wenn man nur Differenzupdates bekommt, steht veraltete Info in state, wenn man das nicht so macht. Von daher stellt sich mir die Frage, warum man den Kreis nicht an der Stelle von vornherein sauber schließt...

Und die "einfache" Form finde ich (auch) eine elegante Sache, von daher fände ich es gut, wenn der User die Wahl zwischen beiden Varianten hat.

Zitat von: 87insane am 18 Juni 2020, 14:54:41
Was deine Zeile genau macht, habe ich auf die Schnelle nicht erkennen können.
Dann teste es halt, ob es macht, was ich schreibe:
Zitat von: Beta-User am 18 Juni 2020, 14:48:47
Er stellt eben nur entweder ein mute oder ein unmute-Symbol in webCmd dar.
ZitatEDIT: Weiß jemand wie ich den Slider in devStateIcon bekomme? Da steht aktuell im Bild z.B. "PLAYING.6"
Das geht nur mit Perl, sonst kann man slider nur via webCmd "rechts" sichtbar machen.
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

ZitatEr stellt eben nur entweder ein mute oder ein unmute-Symbol in webCmd dar.
Ich habe ein mute und unmute Symbol... Das ist da alles schon drin.

Was setStateList angeht, diskutiere ich gerne mit aber habe nach ein wenig testen echt besser Infos bekommen in dieser Form.
Ich werde mal weiter basteln und ggf. findet sich jemand der anhand dessen beurteilen kann, was er lieber so oder so hätte. Dann könnte man das quasi anders rum erschlagen, wenn gewünscht..

ZitatDas geht nur mit Perl, sonst kann man slider nur via webCmd "rechts" sichtbar machen.
Okay - So hab ichs ja..

Beta-User

Zitat von: 87insane am 18 Juni 2020, 15:08:21
Ich habe ein mute und unmute Symbol... Das ist da alles schon drin.
Und ich schlage nur _ein_ mute _oder_ unmute Symbol vor... Man braucht immer nur eines der beiden, nämlich das, das grade passend ist ;) .

Zitat von: 87insane am 18 Juni 2020, 15:08:21
Was setStateList angeht, diskutiere ich gerne mit aber habe nach ein wenig testen echt besser Infos bekommen in dieser Form.
Was besser ist, hängt eben auch davon ab, was zurückkommt, und da bin ich ziemlich blind. Ich _glaube_ aber, dass wir eine sehr viel feinere Weiterverarbeitung bräuchten als das derzeit der Fall ist, von daher ist das in der jetzigen Form vermutlich eben nur "soso lala" bzw. "ganz ok", aber eben nicht "top cool" bzw. "akkurat", und es wäre sinnvoll, die Energie eher in die weitere Aufarbeitung zu stecken, bevor man die Feinarbeiten macht... (ihr kennt ja meine Ansprüche und hattet an der Lampe gerieben  :P ...)
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

Dann reibe ich noch mehr dran und bitte um Beispiele. Du weißt das unsere Sprachen nicht immer so ganz kompatibel sind ;)

Beta-User

...dann also nochmal:
1. Tausche die Zeile für mute aus.
2. Vorläufig mal "play pause stop" nach setStateList schreiben, (evtl. noch toggle, falls das zwischen play und pause wechselt?).

Zum Rest würde ich "traffic" benötigen. Um es mal auf zwei Sachverhalte runterzubrechen:

a) Setzt man volume (auf 65), wird der Readingwert (mit obiger setStateList) zu "set_65". Kommt Vollzug zurück, wird "volume" auf "65" gesetzt => alles gut...

b) Ich gehe z.B. davon aus, dass wenn man "volumeUp" schaltet, man irgendwas zurückbekommt, aber die Frage ist: Was? Nur "volume", oder kommt auch (?) was auf "volumeup" (bzw. das via jsonMap umgeleitete passende Reading) zurück? Wenn da z.B. "done" oder der neue volume-Wert nach ->volumeup zurückkommt, ist der Kreis geschlossen. Also: User-Anweisung macht "volumeUp set_volumeUp", via MQTT kommt '"volumeup":70' zurück, jsonMap macht daraus "70" als neuen Wert von "volumeUp" => mMn. alles bestens. Kommt der Befehl nicht an, sieht man, welcher dass es war, und der wird auch nicht durch "offline" oä. überschrieben.

Klarer jetzt?
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

#254
Hab das den setList Eintrag angepasst. Bei mir ändert sich dann nur das Symbol wenn ich im Gerät auf set mute gehe. Dann steht da eben nicht true/false sondern ist dieses Icon.

Das mit setStateList soll bitte jemand machen, der sich damit auskennt. Ich verstehe die Beschreibung und gebe mir echt mühe dem zu folgen aber hier bin ich wohl zu blöd für!
Aladin möchte also eigentlich sowas wie einen internen "Bug-Finder"... So verstehe ich das zumindest. Ich lösche bis heute immer die ganzen setStateList aus allen Templates rauß... Ich komme da nicht in deiner Welt aus .-\
Verstehe das mit z.B. Volumen. Habe es ja auch oft schon gesehen... naja :-\

Wenn man volumeUp schaltet, geht es um 5 höher oder so. Man bekommt aber im Reading REND_Volume_Master .... auch einfach die PCT. Das ist bei fast allen Sachen so.


Hab aber mal ein wenig rum gebastelt und bin wieder ein wenig weiter gekommen. Man muss die Menge ja auch animieren weiter zu machen :)
@Beta-User: Bitte keine Schläge....

@alle Anderen... Bitte sagt was dazu und ggf. geht ihr noch auf die Anforderungen von Beta-User ein. Das Projekt soll nicht einschlafen :)

Anbei attr. List:
Attributes:
   IODev      sonosmqtt
   alias      Küche
   devStateIcon STOPPED:rc_PLAY@green:play
(pause|stop):rc_STOP@red:play
PLAYING:rc_STOP@red:stop
(TRANSITIONING|play):rc_PLAY@yellow:stop
mute:audio_volume_mute@yellow
volume:audio_volume_mid@yellow
volumeDown:audio_volume_low@yellow
volumeUp:audio_volume_high@yellow
next:rc_NEXT@yellow:stop
previous:rc_PREVIOUS@yellow:stop
STOPPED.(false|previous|next|volumeDown|volumeUp|[0-9]+|CURRENT.*|NEXT.*):rc_BLANK
\b(?!STOPPED\b)\w+.previous:rc_PREVIOUS:previous
\b(?!STOPPED\b)\w+.next:rc_NEXT:next
\b(?!STOPPED\b)\w+.volumeDown:rc_VOLDOWN:volumeDown
\b(?!STOPPED\b)\w+.volumeUp:rc_VOLUP:volumeUp
\b(?!STOPPED\b)\w+.false:rc_VOLUP:mute+true
\b(?!STOPPED\b)\w+.true:rc_MUTE:mute+false
   icon       audio_volume_low
   jsonMap    volume_Master:volume mute_Master:mute transportState:state
   model      sonos2mqtt_speaker
   readingList sonos/status/küche/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }
  sonos/status/küche/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }
  sonos/RINCON_7828CAF4289001400:.* { json2nameValue($EVENT,'',$JSONMAP) }
   room       MQTT2_DEVICE
   setList    stop:noArg sonos/RINCON_7828CAF4289001400/control { "command": "stop" }
  play:noArg sonos/RINCON_7828CAF4289001400/control { "command": "play" }
  pause:noArg sonos/RINCON_7828CAF4289001400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_7828CAF4289001400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_7828CAF4289001400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_7828CAF4289001400/control { "command": "volumedown" }
  switchToQueue:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtoqueue" }
  switchToTv:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtotv" }
  switchToLine:noArg sonos/RINCON_7828CAF4289001400/control { "command": "switchtoline" }
  volume:slider,0,1,100 sonos/RINCON_7828CAF4289001400/control { "command": "volume", "input": $EVTPART1 }
  mute:iconSwitch,true,rc_MUTE,false,rc_VOLUP { my $value = $EVTPART1 eq "true" ? "mute" : "unmute";; qq(sonos/RINCON_7828CAF4289001400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_7828CAF4289001400/control { "command": "next" }
  previous:noArg sonos/RINCON_7828CAF4289001400/control { "command": "previous" }
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_7828CAF4289001400/control $payload)}
  joinGroup:textField sonos/RINCON_7828CAF4289001400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_7828CAF4289001400","groupName","all"); qq(sonos/RINCON_7828CAF4289001400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_7828CAF4289001400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  notify:textField sonos/RINCON_7828CAF4289001400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
   stateFormat [$name:state]
[$name:state].previous
[$name:state].next
[$name:state].volumeDown
[$name:state].volumeUp
[$name:state].[$name:mute]
<br>
[$name:state] CURRENT: [$name:AV_CurrentTrackMetaData_Artist] - [$name:AV_CurrentTrackMetaData_Title]
<br>
[$name:state] NEXT: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[$name:AV_NextTrackMetaData_Artist] - [$name:AV_NextTrackMetaData_Title]



So wie im Bild zu sehen, reagiert meine Version aktuell auf alle Befehle. So sieht man im ersten Icon immer was man geklickt hat. Dies verschwindet nach kurzer Zeit und wird wieder zum normalem Play Button.....usw
Man sieht vermutlich in der Programmierung auch wo ich gefudelt habe. Aber das wäre Perl freies devstateicon mit stateformat.

EDIT: MUTE Symbol ist in den Bildern noch das falsche aber ist korrigiert.