Sonos2mqtt - vielleicht hat jemand Lust mitzumachen

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

Vorheriges Thema - Nächstes Thema

87insane

#270
Okay..

Nur kurz wegen Zeit..

Dann nimm das letzte OHNE Bugs als Vorzeige Temp OHNE Perl.
Das mit PERL hatte ich eh schon halb fertig. Mal sehen wann ich es beenden kann. Hatte das nur aufgehört, da es anfangs nicht sein sollte. Ich meine - KLAR - was ich hier mache und im Forum zeige.... Aber mal ehrlich. Ich finde es sollte eine Einheit geben. Wenn du so argumentierst, welchen Sinn hat dann stateFormat und dann noch mehrzeilig usw? Dieses wird komplett ignoriert mit setStateList. Ich finde die Funktion an sich gut. Ich habe sie auch durch die Übung verstehe gelernt. Aber sie darf nicht stateFormat beeinflussen! Fakt! Dann müsste es ein anderes stateFormat geben, welches eine höhere Prio hätte o.ä. Jeder der stateFormat definiert, wird vermutlich kein Perl nutzen wollen, da es bei den meisten Dingen einfach über FHEM in fast Klartext geht. Aber dieser "jeder" wird dann von diesem side effect verwundert sein. Ich weiß nicht ob ich das schlecht beschreibe oder wie ich einen CR einreichen kann, aber das wird vermutlich jeder Tester verstehen können.

Wie oben schon gesagt, es sollte eine Prio oder eine Trennung geben...DANN wäre setStateList ein mächtiges Werkzeug! Aktuell kann man es nutzen und damit Dinge beseitigen aber damit verschwindet mit dieser Funktionalität auch das 21 Jahrhundert. Ich würde gerne helfen bei der Verbesserung aber dafür brauche ich noch einige Lese-Stunden... Ich hoffe aber Anreiz liefern zu können und ggf. auf Verständnis  zu stoßen!

PS: Ich finde es super das die kleinen Biester so gesprächig sind! Gerade deswegen mag ich auch MQTT. Das zieht nichts und geht in Netzen wo eigentlich schon nichts mehr ankommen sollte. Das ganze auch Verschlüsselt. Ich glaube, wir müssen gucken wie wir in allen FHEM MQTT Instanzen diese ganzen Infos, wie der User das wünscht, am besten bereit stellen. Wenn das alles eine gesamte Einheit wäre....träume das ganze gerade ein wenig durch... Du hast aber mit den Templates begonnen und immer weiter gemacht. Nun ist es mit der Sprachsteuerung auch langsam grade usw... Ich weiß du hast unendlich viel Zeit hier rein gesteckt. Aber wenn gut, dann richtig :) Ich kann nicht "nicht" sagen ich habe nicht an der Flasche gerieben aber ich wünsche mir dann auch das "perfekte" Ergebnis :)

binford6000

Hallo Zusammen,
ich habe heute mal etwas getestet und dabei sind mir einige Dinge aufgefallen und auch noch etwas
schleierhaft...


  • Die Bridge macht eigentlich was? In den Playern habe ich den mqtt2 Server eingetragen damit play pause volume etc funktioniert.
  • Spielen die Player alleine wird currentTrack korrekt angezeigt
  • Sobald aber gruppiert wird geht das nicht mehr! Sieht man ganz gut in den Screenshots unten
  • Next Track bleibt bei tunein weiter stehen. Das macht aber eigentlich keinen Sinn

Ansonsten tolle Arbeit!
VG Sebastian

87insane

Kurz weil Handy...

Die Bridge soll eigentlich nur weiter reichen bzw neue Player erzeugen. Was hast du da, wo genau eingetragen?

Das mit dem gruppieren muss ich mal nachstellen. Welche Version vom Player hast du genommen? Die mit Feedback im ersten Button oder ohne?

Das er bei tunein next behält ist für mich okay gewesen. Es wird nicht unterschieden ob es Radio ist oder nicht. Es läuft was also werden die Button eingeblendet. Muss mal schauen ob man es logisch ändern kann.

Mich freut aber das du direkt mal die Player probiert hast :) danke

TomLee

#273
ZitatDafür aber eben meinen heiß geliebten Feedback Button verloren

ist er nicht weiterhin vorhanden wenn man alle Befehle in setstateList einträgt wo nix zurückkommt ?
Dann kann man das set_... in state für das Feedback-Icon nutzen solange bis was zurückkommt und es wird kein Reading angelegt in dem immer nur set steht.

Hab mich gefragt ob man in devstateIcon wenn stateformat multiline verwendet wird auch irgendwie HTML reinbekommt um das Image aus enqueuedMetadata_AlbumArtUri darzustellen, gelingt mir aber nicht. Dazu hab ich devstateIcon auf Perl umgestellt. ( \ sind escaped, die Farbangaben hätte man auch escapen können hab sie aber entfernt und bei den Feedback-Icons teilweise einfach refresh-Icon genommen)
HTML geht bei mehrzeiligem stateformat wohl nicht mehr oder doch irgendwie ?
Hab mit Inline und Block Elementen gespielt nichts klappt.

Beim Mute-Feedback-Icon hab ich getrickst, auch wenns nicht richtig ist und auch mute mit in setstateList aufgenommen so kann man das set_mute ausnutzen fürs Feedback-Icon und dann halt das refresh-Icon anzeigen.

edit: Weiterhin mit dem Nachteil das alle Symbole eingeblendet bleiben wenn die Bridge offline ist oder es keinen Player gibt.

defmod Test99 MQTT2_DEVICE RINCON_000E58F7F67C01400
attr Test99 IODev MQTT2_Server
attr Test99 devStateIcon {my $imgct = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");;\
"0:10px-kreis-rot 1:10px-kreis-gelb 2:10px-kreis-gruen\
(0|1).(STOPPED|PAUSED_PLAYBACK|PLAYING):rc_BLANK\
2.(STOPPED|PAUSED_PLAYBACK):rc_PLAY:play\
2.TRANSITIONING:refresh\
(2.set_play|set_play):refresh\
(2.set_stop|set_stop):refresh\
set_mute:refresh\
2.PLAYING:rc_STOP:stop\
(STOPPED|PAUSED_PLAYBACK|set_stop).(false|previous|next|volumeDown|volumeUp|CURRENT.*|NEXT.*|PAUSED_PLAYBACK):rc_BLANK\
\\b(?!(STOPPED|PAUSED_PLAYBACK)\\b)\\w+.previous:rc_PREVIOUS:previous\
\\b(?!(STOPPED|PAUSED_PLAYBACK)\\b)\\w+.next:rc_NEXT:next\
\\b(?!(STOPPED|PAUSED_PLAYBACK)\\b)\\w+.volumeDown:rc_VOLDOWN:volumeDown\
\\b(?!(STOPPED|PAUSED_PLAYBACK)\\b)\\w+.volumeUp:rc_VOLUP:volumeUp\
\\b(?!(STOPPED|PAUSED_PLAYBACK)\\b)\\w+.false:rc_VOLUP:mute+true\
\\b(?!(STOPPED|PAUSED_PLAYBACK)\\b)\\w+.true:rc_MUTE:mute+false\
\b(?!(STOPPED|PAUSED_PLAYBACK)\\b)\\w+.set.false:rc_VOLUP:mute+true\
\\b(?!(STOPPED|PAUSED_PLAYBACK)\\b)\\w+.set.true:rc_MUTE:mute+false\
\\b(?!(STOPPED|PAUSED_PLAYBACK)\\b)\\w+.set.false:rc_MUTE:mute+false\
<div style='float:left;;padding:10px;;'>\
<img src='$imgct' style='width:265px;;height:265px;;border-radius:5px;;'></div>"}
attr Test99 devStateStyle style='text-align:left'
attr Test99 event-on-change-reading .*
attr Test99 getList getFavourites:noArg sonos/RINCON_000E58F7F67C01400/Favourites
attr Test99 icon audio_volume_low
attr Test99 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 Test99 model sonos2mqtt_speaker
attr Test99 readingList sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }\
sonos/RINCON_000E58F7F67C01400/error:.* { json2nameValue($EVENT) }\
sonos/RINCON_000E58F7F67C01400/Favourites:.* {json2nameValue($EVENT,'Favourite_',$JSONMAP) }\
sonos/connected:.* connected
attr Test99 room Test,MQTT2_DEVICE
attr Test99 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:iconSwitch,false,rc_MUTE,true,rc_VOLUP { my $value = $EVTPART1 eq "true" ? "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 Test99 setStateList play pause stop volumeUp volumeDown next previous mute toggle
attr Test99 stateFormat [$name:connected]\
[$name:connected].[$name:state]\
[$name:state].previous\
[$name:state].next\
[$name:state].volumeDown\
[$name:state].volumeUp\
&nbsp;;&nbsp;;&nbsp;;\
[$name:state].[$name:mute]\
<br>\
[$name:state] CURRENT: [$name:currentTrack_Artist] - [$name:currentTrack_Title] - ([$name:currentTrack_Duration])\
<br>\
[$name:state] NEXT: &nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;[$name:nextTrack_Artist] - [$name:nextTrack_Title] - ([$name:nextTrack_Duration])
attr Test99 webCmd volume

setstate Test99 2\
2.PLAYING\
PLAYING.previous\
PLAYING.next\
PLAYING.volumeDown\
PLAYING.volumeUp\
&nbsp;;&nbsp;;&nbsp;;\
PLAYING.false\
<br>\
PLAYING CURRENT: Ava Max - Kings &amp;; Queens - (0:14:23)\
<br>\
PLAYING NEXT: &nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;Iqulah - Revelation Time - (0:03:09)
setstate Test99 2020-06-21 18:26:24 connected 2
setstate Test99 2020-06-21 18:20:13 currentTrack_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test99 2020-06-21 18:26:34 currentTrack_AlbumArtUri https://cdn-profiles.tunein.com/s57109/images/logoq.png
setstate Test99 2020-06-21 18:26:34 currentTrack_Artist Ava Max
setstate Test99 2020-06-21 18:20:13 currentTrack_Duration 0:14:23
setstate Test99 2020-06-21 18:26:34 currentTrack_ProtocolInfo x-rincon-mp3radio:*:*:*
setstate Test99 2020-06-21 18:26:34 currentTrack_Title Kings &amp;; Queens
setstate Test99 2020-06-21 18:26:34 currentTrack_TrackUri x-rincon-mp3radio://http://hr-edge-2048.dus-lg.cdn.addradio.net/hr/hr3/live/mp3/128/stream.mp3?ar-distributor=f0a1
setstate Test99 2020-06-21 18:26:34 currentTrack_UpnpClass object.item
setstate Test99 2020-06-21 18:20:13 enqueuedMetadata_Album Dr. Heinrich Hoffmann - Der Struwwelpeter
setstate Test99 2020-06-21 18:26:34 enqueuedMetadata_AlbumArtUri https://cdn-profiles.tunein.com/s57109/images/logoq.png
setstate Test99 2020-06-21 18:20:13 enqueuedMetadata_Artist Johannes Ackner
setstate Test99 2020-06-21 18:26:34 enqueuedMetadata_Title 89.3 hr 3 Frankfurt
setstate Test99 2020-06-21 18:26:34 enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate Test99 2020-06-21 18:26:34 groupName Wohnzimmer
setstate Test99 2020-06-21 18:26:34 mute false
setstate Test99 2020-06-21 18:26:34 name Wohnzimmer
setstate Test99 2020-06-21 18:20:13 nextTrack_Album The Mission
setstate Test99 2020-06-21 18:19:59 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=82
setstate Test99 2020-06-21 18:20:13 nextTrack_Artist Iqulah
setstate Test99 2020-06-21 18:20:13 nextTrack_Duration 0:03:09
setstate Test99 2020-06-21 18:20:13 nextTrack_ProtocolInfo x-file-cifs:*:audio/aiff:*
setstate Test99 2020-06-21 18:20:13 nextTrack_Title Revelation Time
setstate Test99 2020-06-21 18:20:13 nextTrack_TrackUri x-file-cifs://192.168.188.26/OwnMusic/Iqulah/05 - Revelation Time.aif
setstate Test99 2020-06-21 18:20:13 nextTrack_UpnpClass object.item.audioItem.musicTrack
setstate Test99 2020-06-21 18:26:34 playmode NORMAL
setstate Test99 2020-06-21 18:26:34 state PLAYING
setstate Test99 2020-06-21 18:26:34 ts 1592756793313
setstate Test99 2020-06-21 18:26:34 uuid RINCON_000E58F7F67C01400
setstate Test99 2020-06-21 18:26:34 volume 16

87insane

Mit Perl hätte ich da auch Ideen aber hatte am WE keine Zeit mehr. Den simplen Player hatte ich aber (glaube ich) mal gepostet.
Baue ich aber noch aus...

Bei dem aktuellem, ich nenne ihn mal "mini Player", ist setStateList, so wie Beta-User sagte das beste Ergebnis. Allerdings kann man natürlich die Zeitstempel der Readings nutzen. Finde ich aber etwas unschön.

Wenn du multiline devStateIcon nutzt, bitte stateFormat ganz löschen. Guck dir als Beispiel mal die Templates für mqtt2 an.... Ist verhältnismäßig einfach. Nur den Slider wüsste ich nicht wie der gehen soll. Den würde ich wieder über webcmd machen müssen, in erster Instanz...

kumue

bevor ich mir die 19 Seiten durchlese, wollte ich mal fragen, ob man darüber dann auch den Sonos-Wecker steuern kann.
Ich habe mal grob in der sonosmqtt-doc nach alarm gesucht, wurde aber nicht fündig..

87insane

Zum aktuellen Zeitpunkt noch nicht... Bauen ja gerade noch an den "Grundfunktionen". Wenn die perfekt sind, bin ich sicher kommt auch der Rest :)

binford6000


Moin,
Die Bridge soll eigentlich nur weiter reichen bzw neue Player erzeugen. Was hast du da, wo genau eingetragen?
Hab versuchsweise die Bridge als IODev in den Playern eingetragen...  :o

Das mit dem gruppieren muss ich mal nachstellen. Welche Version vom Player hast du genommen? Die mit Feedback im ersten Button oder ohne?
Die mit Feedback.

Das er bei tunein next behält ist für mich okay gewesen. Es wird nicht unterschieden ob es Radio ist oder nicht. Es läuft was also werden die Button eingeblendet. Muss mal schauen ob man es logisch ändern kann.
Das ist ja auch nur kosmetisch. Wichtig wäre mE. dass die Anzeige mit und ohne Gruppen passt  ;)

VG Sebastian

Beta-User

Dass die "bridge" nur die Funktion hätte, neue Player zu erzeugen, ist m.E. etwas kurz gegriffen. Dafür würde es genügen, bei einem der Player eine bridgeRegexp zu ergänzen.
Funktional repräsentiert die bridge - übrigens bei allen diesen Konstruktionen, in denen es irgendein zentrales "Ding" gibt (einen Dienst wie zigbee2mqtt, sonos2mqtt, ebus-mqtt ... oder eine Hardware wie OpenMQTTGateway oder Sidoh-MiLight-Hub) - genau dieses zentrale Element, über das alle Daten "gebrückt" werden, und das meistens noch irgendwelche Zusatzfunktionalität bietet.
Ich finde es daher schlicht übersichtlicher, diese Art der klaren Kennzeichnung der zentralen Komponente überall zu machen, und bei mir finden sich diese dann auch im Raum "Steuerung->Interfaces".



Ich hatte gestern noch die templates upgedatet und den einfachen Speaker ohne die input-Wahl, dafür aber mit der dynamischen-Icon-Variante von 87insane eingecheckt und ein weiteres template, das den "input"-selector hat (und ansonsten den bisherigen Vorschlag konserviert).
Die Weiterentwicklung mit dem Vorschlag, alles, was keine sinnvollen Readings erzeugt in setStateList zu packen, gefällt mir übrigens recht gut; vielleicht kann dann jemand das am Ende als template(s) so zusammenfassen, dass ich das ab jetzt nicht mehr "halbblind" einchecke?



Zur "Gesprächigkeit" von manchen MQTT-Devices allgemein:
Vermutlich gibt es keine wirklichen Vorgaben dazu, ich kann mich daher nur auf mein "Bauchgefühl" berufen, und das sagt mir ziemlich eindeutig, dass das Dauersenden von allen Infos schlicht und ergreifend eine Unsitte ist. In dem "Holzscheitkessel-Thread" hatte ich dazu etwas mehr geschrieben. Das Problem ist, dass "immeralles" dazu führt, dass man keine vernünftigen Zeitstempel hat. Man kann das reparieren, indem man den auch noch mitschickt (siehe den Vorschlag von https://github.com/mqtt-smarthome/mqtt-smarthome/blob/master/Architecture.md#message-format zu "lc", wobei ich das auch nicht als "Bibel" ansehen würde), aber mMn. ist es besser, von vornherein nur jeweils "delta-updates" zu schicken und für "kaputte Kommunikation" (bzw. beendete) den LWT-Mechanismus zu nutzen.

Ich zitiere dazu mal die Selbstdarstellung von mqtt.org:
ZitatMQTT is a machine-to-machine (M2M)/"Internet of Things" connectivity protocol. It was designed as an extremely lightweight publish/subscribe messaging transport. It is useful for connections with remote locations where a small code footprint is required and/or network bandwidth is at a premium.
Ziel sollte daher sein, bei der Datenübertragung IMMER alles wegzulassen, was man NICHT braucht. Wer "menschenlesbare" Formate haben will, kann http nutzen, um normale Webseiten darzustellen.
Ein MQTT2_DEVICE sollte daraus dann wieder im FHEM-Kontext menschenlesbares Format herstellen, kein Thema. Aber eben mit möglichst wenigen sinnlosen "Events" bzw. ohne größeren Aufwand, (sinnlose) Events zu unterdrücken...

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

binford6000

Zitat von: Beta-User am 22 Juni 2020, 10:33:27
Funktional repräsentiert die bridge - übrigens bei allen diesen Konstruktionen, in denen es irgendein zentrales "Ding" gibt (einen Dienst wie zigbee2mqtt, sonos2mqtt, ebus-mqtt ... oder eine Hardware wie OpenMQTTGateway oder Sidoh-MiLight-Hub) - genau dieses zentrale Element, über das alle Daten "gebrückt" werden, und das meistens noch irgendwelche Zusatzfunktionalität bietet.
Ich finde es daher schlicht übersichtlicher, diese Art der klaren Kennzeichnung der zentralen Komponente überall zu machen, und bei mir finden sich diese dann auch im Raum "Steuerung->Interfaces".

+1

TomLee

Was mich interessiert ob es zu bestimmten Zeitpunkten Vorteile hat Titel und Artist aus dem AV-Zweig zu nehmen (wie das 87insane bisher macht) oder es nicht ausreichend ist diese aus dem Rincon-Pfad zu nehmen ?
Selbst versuche ich nur mit dem Rincon-Zweig auszukommen, renderingcontrol und avtransport nehm ich erst gar nicht in die RL mit auf, braucht man die (bisher) wirklich ?




Zitat von: Otto123 am 31 Mai 2020, 18:30:55
Ich verwende das Sonos Modul im minimalem Umfang, die Visualisierung spielt dabei für mich keine Rolle:

Mit den letzten Seiten bewegen wir uns überwiegend in dem Bereich Visualisierung, wäre dafür nicht eigentlich ein eigener Thread angebracht ?

87insane

Hey,

ich hab einfach irgend ein vorhandenes Reading genommen, welches so kam wie ich das brauchte. Du kannst aber auch ein anderes nehmen.... Was genau die "Besten" sind, ist für mich noch nicht ganz klar.

87insane

#282
Abend....

Anbei ein attrList. Dieses beinhaltet den Player mit komplettem Feedback, setStateList (wie sie hierfür Sinn macht) usw. Es ist komplettes Feedback enthalten usw. In meinen Augen der beste Player bisher (von mir).
Attributes:
   IODev      sonosmqtt
   alias      Wohnzimmer
   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
"
}
   icon       audio_volume_low
   jsonMap    volume_Master:volume mute_Master:mute transportState:state
   model      sonos2mqtt_speaker
   readingList sonos/connected:.* bridgeConnected
sonos/status/wohnzimmer/avtransport:.* { json2nameValue($EVENT,'AV_',$JSONMAP) }
  sonos/status/wohnzimmer/renderingcontrol:.* { json2nameValue($EVENT,'REND_',$JSONMAP) }
  sonos/RINCON_7828CAF427B201400:.* { json2nameValue($EVENT,'',$JSONMAP) }
sonos/RINCON_7828CAF427B201400/error:.* { json2nameValue($EVENT) }
   room       MQTT2_DEVICE
   setList    stop:noArg sonos/RINCON_7828CAF427B201400/control { "command": "stop" }
  play:noArg sonos/RINCON_7828CAF427B201400/control { "command": "play" }
  pause:noArg sonos/RINCON_7828CAF427B201400/control { "command": "pause" }
  toggle:noArg sonos/RINCON_7828CAF427B201400/control { "command": "toggle" }
  volumeUp:noArg sonos/RINCON_7828CAF427B201400/control { "command": "volumeup" }
  volumeDown:noArg sonos/RINCON_7828CAF427B201400/control { "command": "volumedown" }
  switchToQueue:noArg sonos/RINCON_7828CAF427B201400/control { "command": "switchtoqueue" }
  switchToTv:noArg sonos/RINCON_7828CAF427B201400/control { "command": "switchtotv" }
  switchToLine:noArg sonos/RINCON_7828CAF427B201400/control { "command": "switchtoline" }
  volume:slider,0,1,100 sonos/RINCON_7828CAF427B201400/control { "command": "volume", "input": $EVTPART1 }
  mute:iconSwitch,false,rc_MUTE,true,rc_VOLUP { my $value = $EVTPART1 eq "true" ? "mute" : "unmute";; qq(sonos/RINCON_7828CAF427B201400/control { "command": "$value" } ) }
  next:noArg sonos/RINCON_7828CAF427B201400/control { "command": "next" }
  previous:noArg sonos/RINCON_7828CAF427B201400/control { "command": "previous" }
  x_raw_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(sonos/RINCON_7828CAF427B201400/control $payload)}
  joinGroup:textField sonos/RINCON_7828CAF427B201400/control { "command": "joingroup",  "input": "$EVTPART1"}
  leaveGroup:noArg { my $value = ReadingsVal("RINCON_7828CAF427B201400","groupName","all"); qq(sonos/RINCON_7828CAF427B201400/control { "command": "leavegroup",  "input": "$value" } ) }
  setAVTUri:textField sonos/RINCON_7828CAF427B201400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}
  notify:textField sonos/RINCON_7828CAF427B201400/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


(Nicht wundern aber wegen der Übersicht habe ich das Format so gelassen. Auch weil sicher viele Verbesserungs-Ideen kommen könnten...)

Der Player hat quasi alle Vorteile aus meinen Versionen. Hinzu kommen ein par kleine Design Verbesserungen. Sowas wie CURRENT oder NEXT gibt es nicht mehr. Puffern wird besser angezeigt usw.
PS: Auch die Readings habe ich von AV_.* entfernt und auf normal gesetzt. Und der Player ist kompakter wenn er nicht genutzt wird da man mit Perl besser ausblenden kann.




Was ich nicht knacken konnte ist der Slider.... Ich bekomme x Slider dar gestellt aber leider keinen Output/Input vom oder zum Slider. Deswegen hier erstmal weiter mit webcmd.

Mal ein Auszug aus dem HTML von FHEM..
<td><div class=col3><div style=display:inline-block tabindex=0 class=slider_widget informid=MQTT2_RINCON_7828CAF427B201400-volume title='volume'><div class=slider id=slider.MQTT2_RINCON_7828CAF427B201400><div class=handle style=left:0px;>0</div></div></div></div></td>

Zudem gibt es eine Funktion mit der ich aber auch nicht klar komme (FW_createSlider).

Auch habe ich im Netz schöne HTML Slider gefunden die auch alle an zu sehen sind oder zumindest beweglich. Aber ich bekomme keinen set volume 123 damit hin oder eben die Rückmeldung damit er da steht wo auch Volume ist.
<label for="fader">Volume</label>
<input type="range" min="0" max="100" value="50" id="fader"
step="1" oninput="outputUpdate(value)">
<output for="fader" id="volume">50</output>


Für Hilfe zu dem Slider wäre ich dankbar!
Für Feedback und Verbesserungs-Wünsche zum Player auch.

Viel Spaß beim testen!

PS: Wie ist der aktuelle speak Status?

TomLee

Hey,

ZitatPS: Wie ist der aktuelle speak Status?

Im ersten Satz vom ersten Post hat Otto seinen Stand verlinkt, denke  keiner hat bisher eine andere Lösung.




Kenne attrList bisher nicht und auch noch nicht mit beschäftigt, würde das gerne ab und an direkt nachvollziehen was du postest, das geht am Tablet, Handy oder auch am PC mit der Darstellung nur umständlich, kannst das eventuell mal auf RAW-Code umstellen ?
Wie würdest du das mit deinem bereitgestellten Code machen ? Doch nur auf Umwegen ?

87insane

#284
Hey und guten Abend...

Das ist nur ein list bei dem ich alles bis auf die Attribute gelöscht habe, da unwichtig.
Du übernimmst einfach das was bei dir an Attributen anders ist. Und löscht was zu viel ist. Einfach kopieren...Finde das gut so, sa jedes Attribut einzelne angezeigt wird.
Zudem (da es ein list ist) müsstes du den rincon Namen zb auf deinen anpassen. Es ist ja noch kein template.
Also ist es fast nur copy & paste.