Hauptmenü

Connected und menu

Begonnen von australien, 03 Oktober 2022, 11:42:52

Vorheriges Thema - Nächstes Thema

australien

Hallo zusammen,

ich hab bei meinen Sonos eine Mqtt Version. In dem device SonosBridge gibt es 2 Readings, einmal Favorites und einmal favlist. Diese zwei sollen im menue angezeigt werden, nur ich schaffe es irgendwie nicht.

Das addOption wird im device Esszimmer aufgerufen.

Danke für eure Hilfe

oder wie bekommt Ihr die Favoriten in ein Menü?

addOptions

appOptions

{"template": "sonosmqtt", "connected": {"favquelle":"SonosBridge"}, "name": "Sonos Esszimmer", "dashboard": true, "group": "Sonos", "sortby": "2"}


template:
{
  "name": "sonosplay_mqtt",
  "author": "robert",
  "date": "2022-03-24",
  "expand": true,
  "status": {
    "bar": ["transportState:PLAYING:100:success","transportState:TRANSITIONING:100:warning","transportState:(STOPPED|PAUSED_PLAYBACK):100:error"],
"error": []
  },
  "main": [
    {
      "leftBtn": ["currentTrack_ProtocolInfo:sonos.com-http:mdi-skip-previous:disabled","currentTrack_ProtocolInfo::mdi-skip-previous"],
      "leftClick": ["transportState::previous"],
      "midBtn": ["transportState:PLAYING:mdi-pause", "transportState::mdi-play"],
      "midClick": ["transportState::toggle"],
      "rightBtn": ["currentTrack_ProtocolInfo:sonos.com-http:mdi-skip-next:disabled","currentTrack_ProtocolInfo::mdi-skip-next"],
      "rightClick": ["state::next"]
    },
    {
      "leftBtn": ["mute:false:mdi-volume-high", "mute:true:mdi-volume-mute"],
      "leftClick": ["mute:false:mute true", "mute:true:mute false"],
      "slider": ["volume::volume %v:%n:0:70"],

    "rightBtn": "mdi-menu",
        "rightMenu": ["Connected.favquelle.Readings.favlist.Value.%s:Connected.favquelle.Readings.Favorites.Value.%s"
    },
{
      "leftBtn": ["currentTrack_ProtocolInfo:sonos.com-http:mdi-skip-previous:disabled","currentTrack_ProtocolInfo::mdi-skip-previous"],
      "leftClick": ["transportState::previous"],
      "rightBtn": ["currentTrack_ProtocolInfo:sonos.com-http:mdi-skip-next:disabled","currentTrack_ProtocolInfo::mdi-skip-next"],
      "rightClick": ["state::next"]
    },
{
      "text": ["nextTrack_Artist::%s"],
      "text2": ["nextTrack_Title::%s"]
    }
  ],
  "info": {
    "left1": ["mute:true::mdi-volume-off", "transportState:PLAYING::mdi-play", "transportState:::mdi-pause"],
    "left2": ["currentTrack_Artist:$:%s"],
    "right2": ["currentTrack_Title::%s"]
  }
}


Readings  Favorites in SonosBridge
{"Result":[{"AlbumArtUri":"http://cdn-profiles.tunein.com/s172072/images/logoq.png","Title":"2Day Buddha (Chill)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/9","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s172072?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s202791/images/logoq.png?t=155748","Title":"Boom","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/4","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s202791?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"https://static.radio.de/images/broadcasts/22/0c/2703/1/c300.png","Title":"FM4","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/22","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:STATION:2703?sid=264&flags=8232&sn=7","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"https://static.radio.de/images/broadcasts/37/bf/4524/1/c175.png","Title":"Gold FM","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/5","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:STATION:4524?sid=264&flags=8224&sn=3","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"https://static.radio.de/images/broadcasts/6e/9c/122244/1/c175.png","Title":"Heart 80s","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/8","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:STATION:122244?sid=264&flags=8224&sn=3","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"https://static.radio.de/images/broadcasts/47/5f/4511/c175.png","Title":"Hitradio Ö3","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/21","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:STATION:4511?sid=264&flags=8224&sn=7","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"https://static.radio.de/images/broadcasts/c5/c5/9012/1/c300.png","Title":"ooe Radio Oberösterreich","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/11","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:STATION:9012?sid=264&flags=8224&sn=3","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"https://static.radio.de/images/broadcasts/a3/fe/9807/1/c300.png","Title":"ORF Radio Burgenland","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/12","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:STATION:9807?sid=264&flags=8224&sn=3","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s265024/images/logoq.jpg?t=158163","Title":"smooth fm Brisbane","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/6","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s265024?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s8786/images/logoq.jpg?t=153330","Title":"Sydneys-2CH","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/7","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s8786?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s294407q.png","Title":"Triple M Greatest Hits (Classic Rock)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/10","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s294407?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"}],"NumberReturned":11,"TotalMatches":11,"UpdateID":2}

Readings favlist in SonosBridge
Day.Buddha.(Chill),Boom,FM4,Gold.FM,Heart.80s,Hitradio.Ö3,ORF.Radio.Burgenland,Sydneys-2CH,Triple.M.Greatest.Hits.(Classic.Rock),ooe.Radio.Oberösterreich,smooth.fm.Brisbane
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

australien

Ist es eigentlich möglich ein Menü aus einem array zu erstellen?
Das ist glaub ich jetzt, das eigentliche Problem.
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

jemu75

Das Menü ist recht einfach aufgebaut und kann nur mit fest definierten "Wertepaaren", bestehend aus einem Text und einem Kommando, befüllt werden. Siehe dazu auch die Beschreibung unter https://github.com/jemu75/fhemApp#eigene-templates-erstellen

Grüße
Jens :)

jemu75

Beinhalten die beiden Readings die selben Favoriten?

australien

Die Readings kommen aus der SonosBridge.
Das eine favlist beinhaltet den Text und die Favorites den Befehl (html). Die Reihenfolge ist natürlich die gleiche.

Reading favlist

2Day.Buddha.(Chill),Boom,FM4,Gold.FM,Heart.80s,Hitradio.Ö3,ORF.Radio.Burgenland,Sydneys-2CH,Triple.M.Greatest.Hits.(Classic.Rock),ooe.Radio.Oberösterreich,smooth.fm.Brisbane


Readings Favorites
{"Result":[{"AlbumArtUri":"http://cdn-profiles.tunein.com/s172072/images/logoq.png","Title":"2Day Buddha (Chill)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/9","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s172072?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s202791/images/logoq.png?t=155748","Title":"Boom","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/4","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s202791?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"https://static.radio.de/images/broadcasts/22/0c/2703/1/c300.png","Title":"FM4","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/22","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:STATION:2703?sid=264&flags=8232&sn=7","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"https://static.radio.de/images/broadcasts/37/bf/4524/1/c175.png","Title":"Gold FM","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/5","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:STATION:4524?sid=264&flags=8224&sn=3","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"https://static.radio.de/images/broadcasts/6e/9c/122244/1/c175.png","Title":"Heart 80s","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/8","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:STATION:122244?sid=264&flags=8224&sn=3","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"https://static.radio.de/images/broadcasts/47/5f/4511/c175.png","Title":"Hitradio Ö3","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/21","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:STATION:4511?sid=264&flags=8224&sn=7","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"https://static.radio.de/images/broadcasts/c5/c5/9012/1/c300.png","Title":"ooe Radio Oberösterreich","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/11","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:STATION:9012?sid=264&flags=8224&sn=3","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"https://static.radio.de/images/broadcasts/a3/fe/9807/1/c300.png","Title":"ORF Radio Burgenland","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/12","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:STATION:9807?sid=264&flags=8224&sn=3","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s265024/images/logoq.jpg?t=158163","Title":"smooth fm Brisbane","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/6","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s265024?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-profiles.tunein.com/s8786/images/logoq.jpg?t=153330","Title":"Sydneys-2CH","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/7","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s8786?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"},{"AlbumArtUri":"http://cdn-radiotime-logos.tunein.com/s294407q.png","Title":"Triple M Greatest Hits (Classic Rock)","UpnpClass":"object.itemobject.item.sonos-favorite","ItemId":"FV:2/10","ParentId":"FV:2","TrackUri":"x-sonosapi-stream:s294407?sid=254&flags=8224&sn=0","ProtocolInfo":"x-sonosapi-stream:*:*:*"}],"NumberReturned":11,"TotalMatches":11,"UpdateID":1}
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

jemu75

Mir erschließt sich noch nicht, wozu du das Reading favlist verwenden möchtest. Der Name befindet sich auch in dem Reading Favorites, wenn ich das richtig sehe. (steht in der JSON Definition unter "Title")
Gibt es da einen Unterschied zwischen den beiden Readings?

VG
Jens

australien

#6
Stimmt, hatte ich übersehen. Sorry.

Aber du verstehst was ich vor habe? Oder?
Ist jetzt nicht so, dass sich die Favoriten permanent ändern, aber so wäre es halt für andere auch gut zu verwenden. Bzw vielleicht/sicher gibt es noch andere dynamischen Menüpunkte.

Zu meinem Problem zurück.
Sollte also mit regex zu machen sein, wenn ich das nur könnte 🥲
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

jemu75

Wie schon geschrieben, lässt sich die Definition für menu bisher nicht dynamisch füllen. Und regex wird dir hier auch nicht weiterhelfen. Ich könnte mir generell nochmal Gedanken machen, wie sich menu dynamisch befüllen lassen könnte. Auf jeden Fall benötige ich für jeden Menüeintrag eine Bezeichnung (Text) und ein zugehoriges Kommando. Beides müsste optimaler Weise aus jedem FHEM Device in gleicher Form auslesbar sein, damit ich nicht für jede Art von Device (im konkreten Fall sonosbridge) eine individuelle Implementierung bauen müsste. Wie das FHEM-seitig am besten zu realisieren wäre, habe ich bisher noch nicht rausgefunden und wäre für Ideen offen.  :)

Jens

mark24

ich stehe vor der gleichen Herausforderung mit den Menu Einträgen.
Für mich klingt der Versuch das mit einer wie auch immer geartete Logik in FHEMapp zu lösen, nicht sinnvoll da es imho unnötig Komplexität rein bringt.
Einfacher wäre es doch die Logik in FHEM zu belassen und dort die fertige Syntax in ein Reading zu speichern.
FHEMapp zieht dann "nur" den Wert des readings und baut daraus das Menu (sollte das bereits funktionieren, brauch ich mal bitte ein Beispiel zum abschreiben).


Das Ergebnis der FHEM Logik mal simuliert:

setreading Sonos_Wohnzimmer appMenu ["George FM:StartFavourite George%20FM", "Jump FM:StartFavourite Jump%20FM"]


im FHEMapp template:

"rightMenu": ["appMenu %s"]


Sofern der Ansatz überhaupt realisierbar ist, wäre der flexibel einsetzbar.

grüße
Marcus

binford6000

Zitat von: mark24 am 04 November 2022, 23:50:12
ich stehe vor der gleichen Herausforderung mit den Menu Einträgen.
Für mich klingt der Versuch das mit einer wie auch immer geartete Logik in FHEMapp zu lösen, nicht sinnvoll da es imho unnötig Komplexität rein bringt.
Einfacher wäre es doch die Logik in FHEM zu belassen und dort die fertige Syntax in ein Reading zu speichern.
FHEMapp zieht dann "nur" den Wert des readings und baut daraus das Menu (sollte das bereits funktionieren, brauch ich mal bitte ein Beispiel zum abschreiben).


Das Ergebnis der FHEM Logik mal simuliert:

setreading Sonos_Wohnzimmer appMenu ["George FM:StartFavourite George%20FM", "Jump FM:StartFavourite Jump%20FM"]


im FHEMapp template:

"rightMenu": ["appMenu %s"]


Sofern der Ansatz überhaupt realisierbar ist, wäre der flexibel einsetzbar.

grüße
Marcus

Moin,
ohne Eingriff in die FHEMapp durch Jens wird das m.E. nichts werden...
Ich hatte mir mal was gebaut um dark/light-Theme, Debug-Modus und Update zu steuern. Dabei ändere ich die config.json per sed:
fhemapp.d:.* {
  if ($EVENT =~ /light/) {
    fhem("\"sed -i 's/\"dark\": true,/\"dark\": false,/g' ./www/fhemapp/cfg/config.json\"")
  }
  elsif ($EVENT =~ /dark/) {
    fhem("\"sed -i 's/\"dark\": false,/\"dark\": true,/g' ./www/fhemapp/cfg/config.json\"")
  }
  elsif ($EVENT =~ /on/) {
    fhem("\"sed -i 's/\"debugMode\": false,/\"debugMode\": true,/g' ./www/fhemapp/cfg/config.json\"")
  }
  elsif ($EVENT =~ /off/) {
    fhem("\"sed -i 's/\"debugMode\": true,/\"debugMode\": false,/g' ./www/fhemapp/cfg/config.json\"")
  }
  elsif ($EVENT =~ /debug_level/) {
    my $level = (split ' ', $EVENT)[-1];
    fhem("\"sed -i 's/\"debugLevel\": .*/\"debugLevel\": $level/g' ./www/fhemapp/cfg/config.json\"")
  }
  elsif ($EVENT =~ /update/) {
    fhem("\"/opt/fhem/scripts/update_fhemapp.sh\"")
  }
}


Sowas könnte man auch auf ein SONOS-Template anwenden um die Favourites zu ändern.
Nur mal so als Denkanstoß...  ;)

VG sebastian

jemu75

Vielen Dank für eure Rückmeldungen. Ich wäre grundsätzlich bereit, in FHEMapp was passendes zu implementieren. Optimaler Weise aber eben so, dass ich nicht für jedes FHEM Device eine spezielle Implementierung bauen muss. Der Ansatz mit dem setreading sieht auf jeden Fall schonmal gut aus. Sowas könnte ich in FHEMapp auslesen und das menu damit befüllen.
Gut wäre natürlich, wenn sich das setreading automatisch aus den Sonos Favoriten generieren würde. Ansonsten läuft es ja letztlich wieder auf eine manuelle Definition der Menüeinträge raus. Nur, dass diese dann im setreading anstatt im Template hinterlegt werden.

mark24

#11
Quelle: reading FavouritesListAlias der Sonos

FavouritesListAlias: 1LIVE diggi - Multimedia - 1LIVE|BBC Radio 1 98.8 (Top 40/Pop)|BBC Radio 1Xtra (Hip Hop)|DASDING|Fritz vom rbb|George FM


Logik:

attr sonos userReadings appMenu:FavouritesListAlias.* {\
my $result;; my $command=':StartFavourite ';;\
foreach my $item (split(/\|/, ReadingsVal($name, "FavouritesListAlias" ,""))) { \
   my $item_html = $item;;\
   $item_html =~ s/\s/%20/g;;\
   if($result ne "") {$result .= ', '}\
   $result .= '"' . $item . $command . $item_html . '"';;\
};;\
{return $result};;\
}


Ergebins: neues reading appMenu

appMenu: "1LIVE diggi - Multimedia - 1LIVE:StartFavourite 1LIVE%20diggi%20-%20Multimedia%20-%201LIVE", "BBC Radio 1 98.8 (Top 40/Pop):StartFavourite BBC%20Radio%201%2098.8%20(Top%2040/Pop)", "BBC Radio 1Xtra (Hip Hop):StartFavourite BBC%20Radio%201Xtra%20(Hip%20Hop)", "DASDING:StartFavourite DASDING", "Fritz vom rbb:StartFavourite Fritz%20vom%20rbb", "George FM:StartFavourite George%20FM"


Wenn es eine Möglichkeit gibt, das FHEMapp im Command Teil nicht nach dem ersten Space aufhört, könnte der ganze $item_html und das replace entfallen.

jemu75

Das ist ein guter Ansatz!  :)
Wenn das userReading ein Array mit folgendem Inhalt liefert, würde ich das als Grundlage verwenden -> ["text1:command1", "text2:command2", "text3:command3", ...]
Die Leerzeichen in den Kommandos fange ich intern in FHEMapp bereits ab. Das könnte also in der Definition des userReading entfallen.

Ich mache mir mal Gedanken, wie ich das in die Definition menu implementiere und würde dann ein neues Release zur Verfügung stellen.

Jens.  :)

mark24

ich sehe dass FHEMapp space in %20 umwandelt


Request: http://fhem:80/fhem?fwcsrf=csrf_1234&cmd=set%20Sonos_Kueche%20StartFavourite%20DASDING


aber das scheint für den Fall eines Wertes mit Leerzeichen nicht zu reichen.


Request: http://fhem:80/fhem?fwcsrf=csrf_1234&cmd=set%20Sonos_Kueche%20StartFavourite%20George%20FM

Sonos_Kueche: LastActionResult: StartFavourite: Favourite "George" not found. Choose one of: ...,"George FM",...


mit %20 im Kommando sieht es so aus

Request: http://fhem:80/fhem?fwcsrf=csrf_1234&cmd=set%20Sonos_Kueche%20StartFavourite%20George%2520FM

und startet wie gewünscht.


noch das Update für die [ ]

attr Sonos_Kueche userReadings appMenu:FavouritesListAlias.* {\
my $result;; my $command=':StartFavourite ';;\
foreach my $item (split(/\|/, ReadingsVal($name, "FavouritesListAlias" ,""))) { \
   if($result ne "") {$result .= ', '}\
   $result .= '"' . $item . $command . $item . '"';;\
};;\
$result = '[' . $result . ']';;\
{return $result};;\
}



appMenu: ["1LIVE diggi - Multimedia - 1LIVE:StartFavourite 1LIVE diggi - Multimedia - 1LIVE", "BBC Radio 1 98.8 (Top 40/Pop):StartFavourite BBC Radio 1 98.8 (Top 40/Pop)", "BBC Radio 1Xtra (Hip Hop):StartFavourite BBC Radio 1Xtra (Hip Hop)", "DASDING:StartFavourite DASDING"]

jemu75

Ich wollte das eben testen und habe festgestellt, dass es bei meinen Sonosplayern kein Reading mit dem Name FavouritesListAlias gibt.  ???