Sonos2mqtt - vielleicht hat jemand Lust mitzumachen

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

Vorheriges Thema - Nächstes Thema

TomLee

Ergänze doch mal getList mit

Favorites:noArg Favorites sonos/RINCON_XXXXXXXXXXXXX/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}}

dann verstehst du was ich meine.

Otto123

Ja ich habe, das glaube ich verstanden, aber der Code schreibt ja einfach den Text $item in den getter.
Insofern sieht der getter so aus wie Du willst?
Wenn ja ist er doch verkehrt, weil es ist doch ein publish Befehl der abgesetzt wird und dort darf doch kein regExp rein!?
Wenn nein (so versteh ich den Post während ich schreibe) dann weiß ich nicht wie man es machen könnte.

Man müsste eine liste der RINCONs haben und einfach einen auswählen?
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

Otto123

sorry hatte irgendwie aus Versehen das Thema geschlossen. Meine Maus ist kaputt :(
So als Vorschlag? Irgendeine RINCON ...
{ my @devlist = devspec2array('MQTT2_RINCON_.*');; my @arr;; foreach (@devlist) {push @arr,InternalVal($_,'DEF','')}  return $arr[int(rand(@arr))]}
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

TomLee

Ja jetzt hast mich verstanden, auch wenn ich auf dem Schlauch stand.

Keine Ahnung wie ich das jetzt mit dem q() aneinander hänge, ohne wieder zurück zu "" zu gehen, hab mir irgendwas zusammengereimt:

{my @devlist = devspec2array('model=sonos2mqtt_bridge');;\
my @devlist2 = devspec2array('MQTT2_RINCON_.*');;\
my @arr2;;\
foreach (@devlist2) {push @arr2,InternalVal($_,'DEF','')};;\
my $arr1= $arr2[int(rand(@arr2))].q(/control  {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}});;\
my $attr = 'getList';;\
my $item = q(Favorites:noArg Favorites sonos/);;\
$item.= $arr1;;\
my $first=split(' ',$item,2);;\
foreach (@devlist) {\
   my @arr = grep {$_ !~ $first} split("\n",AttrVal($_,$attr,''));;\
   push @arr,$item;;\
   my $val = join "\n",@arr;;\
   $val =~ s/;;/;;;;/g;;\
   fhem("attr $_ $attr $val")}\
return "$attr in ".scalar(@devlist)." Definitionen modifiziert"\
}





Frag mich mittlerweile warum so Umwege händisch oder per Codeschnipsel bspw. sonos/RINCON_([0-9A-Z]+)/Favorites:.* Favorites zu ergänzen, du hast mich erst auf die Idee gebracht mit einem Codeschnipsel getList zu ergänzen.

Das kann man doch alles mit attrTemplate in einem Wasch ausliefern und gut ist ?
Dafür sind die Templates doch da, um vorkonfigurierte Geräte zu erhalten.

Otto123

#514
Zitat von: TomLee am 15 August 2020, 23:14:40
Das kann man doch alles mit attrTemplate in einem Wasch ausliefern und gut ist ?
Dafür sind die Templates doch da, um vorkonfigurierte Geräte zu erhalten.
Ja, definitiv. Aber jetzt wo wir jeden Tag was ändern und dazu lernen, finde ich das für mich eine gute Methode. Ich kopiere ein paar Codezeilen und habe alles neu gemacht.

Und ich weiß noch nicht wieviel man Templates gießen sollte. ;)

Ich würde das Item gleich so machen, mein Testcode :)
{my @devlist2 = devspec2array('MQTT2_RINCON_.*');;\
my @arr2;;\
foreach (@devlist2) {push @arr2,InternalVal($_,'DEF','')};;\
my $item= q(Favorites:noArg Favorites sonos/).$arr2[int(rand(@arr2))].q(/control  {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}});;\
}


Wenn man so wie hier keine getList hat sondern einfach eine neu macht, kann man natürlich den "Klamauk" mit ersetzen weglassen und einfach setzen ;)
fhem("attr model=sonos2mqtt_bridge getList $item")
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

Otto123

Aaaber: Wenn wir dann mal Templates machen die sich ergänzen, also wie ein Baukasten, dann brauchen wir entweder genau diese Routinen um Bestehendes zu ergänzen auch in den Templates(oder?), oder wir machen ein Mammut Template - was sich schlechter warten lässt?
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

TomLee

Ok, umständlich gedacht wie meist.

Dann wär ich für ungefähr folgende Ergänzung im Wiki im Abschnitt Favoriten starten, ganz unten, zwischen dem letzten </syntaxhighlight> und ToDo, solange es keinen getter im Template gibt.
Eventuell noch angepasst das nicht einfach nur ergänzt sondern ersetzt wird wenn zuvor vorhanden.

Wer das nicht immer per Hand machen will erstellt sich einen get-Befehl im Bridge-Device, hier der Code für die Raw Definition:<syntaxhighlight lang="perl">
{my @devlist = devspec2array('model=sonos2mqtt_bridge');;\
my @devlist2 = devspec2array('MQTT2_RINCON_.*');;\
my $attr = 'getList';;\
my @devlist2 = devspec2array('MQTT2_RINCON_.*');;\
my @arr2;;\
foreach (@devlist2) {push @arr2,InternalVal($_,'DEF','')};;\
my $item= q(Favorites:noArg Favorites sonos/).$arr2[int(rand(@arr2))].q(/control  {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}});;\
my $first=split(' ',$item,2);;\
foreach (@devlist) {\
   my @arr = grep {$_ !~ $first} split("\n",AttrVal($_,$attr,''));;\
   push @arr,$item;;\
   my $val = join "\n",@arr;;\
   $val =~ s/;;/;;;;/g;;\
   fhem("attr $_ $attr $val")}\
return "$attr in ".scalar(@devlist)." Definitionen modifiziert"\
}
</syntaxhighlight>





Was ist den bisher in die Templates geflossen außer die Standardfunktionen? noch nicht viel, im Vergleich zum Sonos-Modul  :P.

Otto123

#517
Schau Dir es mal an, ich habe jetzt ne Zwischenlösung ins Wiki gemacht.
Ich denke man sollte einfach die beiden Blöcke die jetzt zur Bridge dastehen zusammen fassen. Gehört thematisch zusammen. Aber morgen ist auch noch ein Tag. ;D

Und die getList könnte auch gleich ins Bridge Template. Einziges Problem: Wenn wir das anwenden gibt es die Player(RINCON_) noch nicht  :o
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

Otto123

genau genommen müsste es für die playFav in ihrer jetzigen Ausprägung mit Auswahlbox ein notify geben:
define SonosBridge_notify_1 notify SonosBridge:Favorites:.{"Result":.*} {Code für playFav neu schreiben}
Damit, wenn man die Favoriten neu holt dieser setter neu gemacht wird.
Oder man baut sich so ein Konstrukt:
get SonosBridge Favorites;sleep SonosBridge:Favorites:.{"Result":.*}{Code für playFav neu schreiben}
Btw ich weiß gar nicht ob das mit den {} im Trigger funktioniert, aber der creator im Eventmonitor hat es so vorgeschlagen

Aber es wird langsam Zeit den Code im "normalen Perl Syntax" in eine 99_mySonos2mqttUtils.pm zu packen damit das Ganze übersichtlich bleibt.

Irgendwie ist es auch blöd, das man die Auswahlliste nicht aus einem Reading lesen kann. So wird jedesmal eine Configänderung draus. Oder gibt es dafür schon einen Weg?
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

TomLee

ZitatDamit, wenn man die Favoriten neu holt dieser setter neu gemacht wird.
Oder man baut sich so ein Konstrukt:

Hab ich doch vor rd. 2 Wochen so vorgeschlagen.

ZitatIrgendwie ist es auch blöd, das man die Auswahlliste nicht aus einem Reading lesen kann.

Hab ich doch auch schon gemacht gehabt, gehört dann wohl noch umgebaut auf j2nm mit filter.

Zwei Readings, einmal die Titel und einmal die Uris:

sonos/RINCON_([0-9A-Z]+)/Reply:.* {my $werte = json2nameValue($EVENT);my @a; while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_([0-9]+)_Title,g){push (@a, "$key $value")}};my @s = sort @a; my $g =join (',',@s);$g =~ s/ /./g;$g =~ s/Result_([0-9]+)_Title.//g;{"Reply_Favorites"=>$g}}
sonos/RINCON_([0-9A-Z]+)/Reply:.* {my $werte = json2nameValue($EVENT);my @a; while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._TrackUri,g){push (@a,"$key $value")}};my @s = sort @a;; my $g =join (',',@s);$g =~ s/Result_._TrackUri.//g;{"Reply_TrackUris"=>$g}}


der playFav dazu war so, der hat aber auch das Problem mit den Umlauten und arabischen Schriftzeichen:

playFa:select,Hörbücher,NDR.2,PsyRadioChillout,SWR4.Baden-Württemberg,SWR4.Rheinland-Pfalz,011.FM-NonStop60s,1A.Deutsche.Hits,1LIVE.diggi.(Top.40/Pop),Antenne.Thüringen.80er.(80er),COSMO.Chillout,DASDING.92.5.(Euro-Hits),die.neue.welle.101.8.(Rock),FM.نجوم.100.6.(Arabisch),Hitradio.Ö3.99.9.(Österreichisch) {my $werte = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));my @ar;while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._Title,g){push (@ar, "$key $value")}};my @s = sort @ar;my $g =join (',',@s);$g =~ s/ /./g;$g =~ s/Result_._Title.//g;my $werte2 = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));my @ar2;while ( my ($key2, $value2) = each (%$werte2)) {if ($key2 =~ m,Result_._TrackUri,g){push (@ar2,"$key2 $value2")}};my @s2 = sort @ar2;my $g2 =join (',',@s2);$g2 =~ s/Result_._TrackUri.//g;my @a = split(',',$g); my ($index) = grep { $a[$_] eq $EVTPART1 } (0 .. @a-1);;my $d = defined $index ? $index : -1;my @b = split(',',$g2);my $u = $b[$d];fhem("set $NAME setAVTUri $u; sleep 1; set $NAME play")}

Hier mein Test-Device mit den Readings:

defmod SonosControl MQTT2_DEVICE
attr SonosControl userattr favRadios
attr SonosControl IODev m2s
attr SonosControl comment playUri:textField {fhem("set $NAME setAVTUri $EVTPART1;; sleep 1;; set $NAME play")}\
setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
StartRadio:select {my $rf = ReadingsVal("SonosControl","Reply_Favorites","unknown");;;;",".$rf." bla";;;;}
attr SonosControl devStateIcon {my $wpix = '250px';;\
my $groupname = ReadingsVal($name,'groupName','0');;\
my $sgroupname = (split(' ',ReadingsVal($name,'groupName','')))[0];;\
my $uuidtoname = (devspec2array('DEF='.ReadingsVal($name,'coordinatorUuid','0')))[0];;\
my $vol = ReadingsVal($name,'volume','');;\
my $img = ReadingsVal($name,'currentTrack_AlbumArtUri','');;\
my $mystate = $name eq $uuidtoname \
  ? ReadingsVal($name,'state','FEHLER') : ReadingsVal($uuidtoname,'state','');;\
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@blue'    : $mystate eq 'set_next'\
  ? 'rc_NEXT@blue'    : $mystate eq 'set_previous'\
  ? 'rc_PREVIOUS@blue': $mystate eq 'set_volumeUp'\
  ? 'rc_VOLUP@blue'   : $mystate eq 'set_volumeDown'\
  ? 'rc_VOLDOWN@blue' : $mystate eq 'set_mute'\
  ? 'rc_MUTE@blue'    : 'rc_PLAY@yellow';;\
my $mutecmd = ReadingsVal($name,'mute','0') eq 'false'?'on':'off';;\
my $mutepic = $mutecmd eq 'on'?'rc_MUTE':'rc_VOLUP';;\
my $show = 'FEHLER';;\
my $currentTrack_Artist = ReadingsVal($name,'currentTrack_Artist','FEHLER');;\
my $currentTrack_Title = ReadingsVal($name,'currentTrack_Title','FEHLER');;\
if ($currentTrack_Title =~ 'x-sonosapi-stream:'){$currentTrack_Title=''};;\
my $currentTrack = $mystate eq 'TRANSITIONING'\
  ? 'Puffern...' : $currentTrack_Artist.' - '.$currentTrack_Title;;\
my $nextTrack_Artist = ReadingsVal($name,'nextTrack_Artist','FEHLER');;\
my $nextTrack_Title = ReadingsVal($name,'nextTrack_Title','FEHLER');;\
my $nextTrack = $nextTrack_Artist.' - '.$nextTrack_Title;;\
my $previouspic = 'rc_PREVIOUS';;\
my $nextpic = 'rc_NEXT';;\
my $voldownpic = 'rc_VOLDOWN';;\
my $voluppic = 'rc_VOLUP';;\
my $leavegrouppic = 'rc_LEFT';;\
my $showlg = ReadingsVal($name,"name","0") ne $groupname ? "<a href=\"/fhem?cmd.dummy=set $name leaveGroup&XHR=1\">".FW_makeImage($leavegrouppic)."</a>" : "";;\
if (($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' )) { \
    my $shownp = ReadingsVal($name,'name','') eq $sgroupname \
    ? "<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>" : "";;  \
    $show = "$showlg <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>\
    <a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>\
    $shownp\
    <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>";;\
  \
    if (ReadingsVal($name,'name','') eq $sgroupname) {\
      $show = ReadingsVal($name,'currentTrack_TrackUri','') =~ 'spdif'\
      ? 'TV': ReadingsVal($name,'enqueuedMetadata_UpnpClass','FEHLER') ne 'object.item.audioItem.audioBroadcast'\
      ? "$show<marquee scrollamount=2 style='width: $wpix'>Aktueller Track: $currentTrack<br>Nächster Track: $nextTrack</marquee>"\
      : "$show<marquee scrollamount=2 style='width: $wpix'>Radio: $currentTrack</marquee>"\
    }\
    elsif (ReadingsVal($name,'name','') ne $groupname) {\
      $show = "$show Master: $sgroupname"}\
    }\
    else {\
      $show = $name eq $uuidtoname\
      ? "$showlg <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>"\
      : "$showlg <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a><br>Master: $sgroupname"\
    }\
  "<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>$show</td>\
     </tr>\
   </table>\
   </div>"\
}
attr SonosControl favRadios 011.FM-NonStop60s,1A.Deutsche.Hits,FM.نجوم.100.6.(Arabisch)
attr SonosControl getList Favorites:noArg Reply_Favorites sonos/RINCON_000E58F7F67C01400/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Reply"}}\

attr SonosControl jsonMap volume_Master:volume mute_Master:mute transportState:state
attr SonosControl readingList sonos/RINCON_([0-9A-Z]+)/Reply:.* Replykomplett\
sonos/RINCON_([0-9A-Z]+)/Reply:.* {my $werte = json2nameValue($EVENT);;my @a;; while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_([0-9]+)_Title,g){push (@a, "$key $value")}};;my @s = sort @a;; my $g =join (',',@s);;$g =~ s/ /./g;;$g =~ s/Result_([0-9]+)_Title.//g;;{"Reply_Favorites"=>$g}}\
sonos/RINCON_([0-9A-Z]+)/Reply:.* {my $werte = json2nameValue($EVENT);;my @a;; while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._TrackUri,g){push (@a,"$key $value")}};;my @s = sort @a;;;; my $g =join (',',@s);;$g =~ s/Result_._TrackUri.//g;;{"Reply_TrackUris"=>$g}}\
sonos/RINCON_000E58F7F67C01400:.* { json2nameValue($EVENT,'',$JSONMAP) }\
sonos/RINCON_000E58F7F67C01400/ZoneInfo:.* { json2nameValue($EVENT) }\
sonos/RINCON_000E58F7F67C01400/error:.* { json2nameValue($EVENT) }
attr SonosControl room MQTT2_DEVICE
attr SonosControl 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" }\
volume:slider,0,1,100 sonos/RINCON_000E58F7F67C01400/control { "command": "volume", "input": $EVTPART1 }\
next:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "next" }\
previous:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "previous" }\
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" } ) }\
mute:on,off { my $value = $EVTPART1 eq "on" ? "mute" : "unmute";; qq(sonos/RINCON_000E58F7F67C01400/control { "command": "$value" } ) }\
playUri:textField {fhem("set $NAME setAVTUri $EVTPART1;; sleep 1;; set $NAME play")}\
setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
playFav:011.FM-NonStop60s,1A.Deutsche.Hits,1LIVE.diggi.(Top.40/Pop),Antenne.Thüringen.80er.(80er),COSMO.Chillout,DASDING.92.5.(Euro-Hits),FM.نجوم.100.6.(Arabisch),Hitradio.Ö3.99.9.(Österreichisch),Hörbücher,NDR.2,PsyRadioChillout,SWR4.Baden-Württemberg,SWR4.Rheinland-Pfalz,die.neue.welle.101.8.(Rock) {use JSON;;use HTML::Entities;;use Encode qw(encode decode);;my $enc = 'UTF8';;my $uri='';;my $search = (split(' ', $EVENT,2))[1];;$search=~s/[\/()]/./g;;my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;my $read = 'Favorites';;my $decoded = decode_json(ReadingsVal($dev,$read,''));;my @arr  = @{$decoded->{'Result'}};;foreach (@arr) {if (encode($enc, decode_entities($_->{'Title'})) =~ /$search/i){$uri = $_->{'TrackUri'} }};;fhem("set $NAME playUri $uri") if ($uri ne '')}\
playFa:select,Hörbücher,NDR.2,PsyRadioChillout,SWR4.Baden-Württemberg,SWR4.Rheinland-Pfalz,011.FM-NonStop60s,1A.Deutsche.Hits,1LIVE.diggi.(Top.40/Pop),Antenne.Thüringen.80er.(80er),COSMO.Chillout,DASDING.92.5.(Euro-Hits),die.neue.welle.101.8.(Rock),FM.نجوم.100.6.(Arabisch),Hitradio.Ö3.99.9.(Österreichisch) {my $werte = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));;my @ar;;while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._Title,g){push (@ar, "$key $value")}};;my @s = sort @ar;;my $g =join (',',@s);;$g =~ s/ /./g;;$g =~ s/Result_._Title.//g;;my $werte2 = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));;my @ar2;;while ( my ($key2, $value2) = each (%$werte2)) {if ($key2 =~ m,Result_._TrackUri,g){push (@ar2,"$key2 $value2")}};;my @s2 = sort @ar2;;my $g2 =join (',',@s2);;$g2 =~ s/Result_._TrackUri.//g;;my @a = split(',',$g);; my ($index) = grep { $a[$_] eq $EVTPART1 } (0 .. @a-1);;;;my $d = defined $index ? $index : -1;;my @b = split(',',$g2);;my $u = $b[$d];;fhem("set $NAME setAVTUri $u;; sleep 1;; set $NAME play")}\
togglefavRadios:noArg {my $l = AttrVal($NAME,"favRadios","none");;;;my $l = Each($NAME, $l);;;;fhem("set $NAME playFav $l")}\
speak:textField { my $tts="SonosTTS";;my ($cmd,$vol,$text)=split(' ', $EVENT,3);;fhem("set $tts tts $text;;sleep $tts:playing:.0 ;;set $NAME notify $vol [$tts:httpName]")}\
notify:textField sonos/RINCON_000E58F7F67C01400/control { "command":"notify","input":{"trackUri":"$EVTPART2","onlyWhenPlaying":false,"timeout":10,"volume":$EVTPART1,"delayMs":700}}
attr SonosControl stateFormat enqueuedMetadata_Title

setstate SonosControl PsyRadio Chillout
setstate SonosControl 2020-08-16 12:50:54 Reply_Favorites Hörbücher,NDR.2,PsyRadioChillout,SWR4.Baden-Württemberg,SWR4.Rheinland-Pfalz,011.FM-NonStop60s,1A.Deutsche.Hits,1LIVE.diggi.(Top.40/Pop),Antenne.Thüringen.80er.(80er),COSMO.Chillout,DASDING.92.5.(Euro-Hits),die.neue.welle.101.8.(Rock),FM.نجوم.100.6.(Arabisch),Hitradio.Ö3.99.9.(Österreichisch)
setstate SonosControl 2020-08-16 13:02:51 Reply_TrackUris x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0,x-sonosapi-stream:rpde_svc_475?sid=232&flags=32&sn=4,x-sonosapi-stream:s45087?sid=254&flags=8224&sn=0,x-sonosapi-stream:s104196?sid=254&flags=8224&sn=0,x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4,x-sonosapi-stream:s76488?sid=254&flags=8224&sn=0,x-sonosapi-stream:s84548?sid=254&flags=8224&sn=0,x-sonosapi-stream:s65628?sid=254&flags=8224&sn=0,x-sonosapi-stream:s8007?sid=254&flags=8224&sn=0
setstate SonosControl 2020-08-16 12:50:54 Replykomplett {"Result":[{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s296020q.png","Title":"011.FM-NonStop60s","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/26","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s296020?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://dtu8ldmaopof3.cloudfront.net/i/https:%2F%2Fderpimagecache.s3.amazonaws.com%2Fimage%2F475_288x162_2020-01-22-10-30-00-920.png_180.jpg","Title":"1A Deutsche Hits","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/41","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:rpde_svc_475?sid=232&flags=32&sn=4","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"1LIVE diggi (Top 40/Pop)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/49","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s45087?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s104196/images/logoq.png?t=153253","Title":"Antenne Thüringen 80er (80er)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/42","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s104196?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://dtu8ldmaopof3.cloudfront.net/i/https:%2F%2Fderpimagecache.s3.amazonaws.com%2Fimage%2F1944_288x162_2019-02-12-13-40-09-357.png_640.jpg","Title":"COSMO Chillout","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/30","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:rpde_svc_1944?sid=232&flags=32&sn=4","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s20295/images/logoq.png","Title":"DASDING 92.5 (Euro-Hits)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/34","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s76488?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s84548/images/logoq.jpg","Title":"die neue welle 101.8 (Rock)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/39","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s84548?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s65628q.png","Title":"FM نجوم 100.6 (Arabisch)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/29","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s65628?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"Hitradio Ö3 99.9 (Österreichisch)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/37","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s8007?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"Hörbücher","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/32","ParentId":"FV:2","TrackUri":"x-rincon-playlist:RINCON_000E58F7F67C01400#S://192.168.188.26/OwnMusic/Hörbücher","ProtocolInfo":"x-rincon-playlist:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s228737/images/logoq.png?t=154228","Title":"NDR 2","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/43","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s228737?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s97066q.png","Title":"PsyRadioChillout","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/15","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"Title":"SWR4 Baden-Württemberg","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/48","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s20293?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"},{"Title":"SWR4 Rheinland-Pfalz","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/47","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s1563?sid=254&flags=8224&sn=0","ProtocolInfo":"x-rincon-mp3radio:*:*:*"}],"NumberReturned":14,"TotalMatches":14,"UpdateID":9}
setstate SonosControl 2020-08-16 13:03:09 command play
setstate SonosControl 2020-08-16 17:02:52 coordinatorUuid RINCON_000E58F7F67C01400
setstate SonosControl 2020-08-16 15:51:05 currentTrack_Album Sprachdurchsagen
setstate SonosControl 2020-08-16 17:02:52 currentTrack_AlbumArtUri http://192.168.188.23:1400/getaa?s=1&u=x-sonosapi-stream:s97066%3fsid%3d254%26flags%3d8224%26sn%3d0
setstate SonosControl 2020-08-16 17:02:52 currentTrack_Artist Psyonysus
setstate SonosControl 2020-08-16 15:57:35 currentTrack_Duration 0:00:14
setstate SonosControl 2020-08-16 17:02:52 currentTrack_ItemId -1
setstate SonosControl 2020-08-16 17:02:52 currentTrack_ParentId -1
setstate SonosControl 2020-08-16 17:02:52 currentTrack_ProtocolInfo sonos.com-http:*:*:*
setstate SonosControl 2020-08-16 17:02:52 currentTrack_Title Exit Samsara
setstate SonosControl 2020-08-16 17:02:52 currentTrack_TrackUri x-sonosapi-stream:s97066?sid=254&flags=8224&sn=0
setstate SonosControl 2020-08-16 17:02:52 currentTrack_UpnpClass object.item
setstate SonosControl 2020-08-16 17:02:52 enqueuedMetadata_ItemId -1
setstate SonosControl 2020-08-16 17:02:52 enqueuedMetadata_ParentId -1
setstate SonosControl 2020-08-16 17:02:52 enqueuedMetadata_Title PsyRadio Chillout
setstate SonosControl 2020-08-16 17:02:52 enqueuedMetadata_UpnpClass object.item.audioItem.audioBroadcast
setstate SonosControl 2020-08-16 13:03:09 error_Action Play
setstate SonosControl 2020-08-16 13:03:09 error_Fault UPnPError
setstate SonosControl 2020-08-16 13:03:09 error_FaultCode s:Client
setstate SonosControl 2020-08-16 13:03:09 error_UpnpErrorCode 701
setstate SonosControl 2020-08-16 13:03:09 error_name SonosError
setstate SonosControl 2020-08-16 17:02:52 groupName Wohnzimmer
setstate SonosControl 2020-08-14 17:43:15 mute false
setstate SonosControl 2020-08-14 17:43:15 mute_LF false
setstate SonosControl 2020-08-14 17:43:15 mute_RF false
setstate SonosControl 2020-08-16 17:02:52 name Wohnzimmer
setstate SonosControl 2020-08-16 17:02:52 playmode NORMAL
setstate SonosControl 2020-08-16 17:02:52 state PLAYING
setstate SonosControl 2020-08-16 17:02:52 ts 1597590171809
setstate SonosControl 2020-08-16 17:02:52 uuid RINCON_000E58F7F67C01400
setstate SonosControl 2020-08-16 17:02:52 volume 13
setstate SonosControl 2020-08-16 17:02:52 volume_LF 100
setstate SonosControl 2020-08-16 17:02:52 volume_RF 100




Otto123

Das ist doch aber nichts anderes wie jetzt? Eine statische Auswahlbox ::)
playFa:select,Hörbücher,NDR.2....
Was ich gerne hätte wäre sowas in der Art:
playFa:{ReadingsVal('SonosBridge','Liste','')} {Code zum Start}

Damit muss man bei Favoriten Änderung den Setter nicht neu schreiben sondern nur ein Reading.

Oder ich versteh Dich mal wieder nicht :(
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

TomLee

#521
Ja das stimmt, das nichts anderes.


Mir gings jetzt eigentlich nur um die zwei Readings Reply_Favorites und Reply_Favorites, die es geben könnte, um ReadingsVal überhaupt verwenden zu können

Mir kommt jetzt, den playFav könnte man dann vlt. komplett in {} schreiben und dort ReadingsVal('SonosBridge','Liste','') verwenden ?
Weil so wie du es jetzt schreibst playFa:{ReadingsVal('SonosBridge','Liste','')} {Code zum Start} kann es nicht gehen, wegen dem select-Widget, hatten wir doch schon.

TomLee

ZitatMir gings jetzt eigentlich nur um die zwei Readings Reply_Favorites und Reply_Favorites, die es geben könnte, um ReadingsVal überhaupt verwenden zu können

aus dem JSON ziehen wir uns eh nur die Titel und Uris, was nur noch interessant wäre ist AlbumArtUri, aber das haben wir ja eh im Player als Reading


Otto123

#524
Zitat von: PatrickR am 13 August 2020, 17:58:32
Hallo zusammen,

es tut sich was bei der Problematik, dass unter bestimmten Umständen keine Events mehr kommen. Der Entwickler hat das Refreshen der Verbindung getunt und es gibt einen mqtt-Command, mit dem man den Refresh forcieren kann.

https://github.com/svrooij/sonos2mqtt/issues/112

Patrick
Moin,

ich habe das jetzt mal getestet: Einen Player ausgeschaltet und am nächsten Tag wieder angeschaltet. Der Player ist danach in gewissem Umfang steuerbar, aber es kommen keine Events. Ein
set mqtt2s publish sonos/cmd/check-subscriptions
behebt das Problem sofort.
Man müsste den Befehl jetzt irgendwie in der Bridge einbauen.
Wenn jemand die Player on/off betreibt kann so einfach mit gewisser Wartezeit nach dem Wiedereinschalten die Struktur aktualisiert werden.

Ich habe irgendwie nur im Quelltext eine Beschreibung gefunden:
Zitatset mqtt2s publish sonos/cmd/pauseall
set mqtt2s publish sonos/cmd/check-subscriptions
|Command|Description|Input|
|-------|-----------|-----|
|`notify`|Play a notification on all groups|See [notifications](control/notifications.html) |
|`speak`|Play a text-to-speech message on all speakers| See [text-to-speech](control/notifications.html#text-to-speech) |
|`pauseall`|Pause all speakers| - |
|`listalarms`|Fetch all alarms and post to `sonos/alarms`| - |
|`setalarm`|Set some properties of the alarm. | JSON object like you got from listing alarms.|
|`setlogging`|Change logging level at runtime.| `off` / `error` / `warning` / `information` / `debug` / `verbose`|
|`check-subscriptions`|Force refreshing the events that trigger everything in this app. After power cuts for instance.| - |

Nachtrag: Heute wurde das MQTT2 Gerät ca. 5 min nach dem Einschalten wieder mit Events versorgt. Also scheint auch der neu eingebaute Aktualisierungsmechanismus zu greifen.👍

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz