FHEM Forum

FHEM => Frontends => FHEMapp => Thema gestartet von: binford6000 am 31 Oktober 2026, 13:29:20

Titel: Dynamische Einträge in Menu-Elementen
Beitrag von: binford6000 am 31 Oktober 2026, 13:29:20
Hallo FHEMApp Community,
ich möchte euch hier ein kleines Projekt vorstellen, bei dessen Entwicklung eine nette Erweiterung für FHEMApp herausgekommen ist.

Im Rahmen eine Projektes für einen digitalen Bilderrahmen mit Immich und ImgKiosk habe ich natürlich auch ein Steuerungs-Element für FHEMApp benötigt. Dabei kam schnell der Wunsch auf, dass neue Alben in Immich automatisch in die Auswahlliste kommen. Dem Stand allerdings entgegen, dass Menu-Elemente in FHEMApp manuell gesetzt werden müssen (und auch im FHEM dummy...).

Daraufhin habe ich einige Sitzungen mit ✴️ Claude verbracht und das Ergebnis ist mMn. sehr gut geworden.

Mit dem beigefügten Code und den Beispiel Devices (dummy + notify) kann man die Funktionalität gut nachvollziehen:
defmod wz_szene.d dummy
attr wz_szene.d readingList alben
attr wz_szene.d setList alben:PorscheMuseum,Urlaub,Halloween
attr wz_szene.d stateFormat Album: alben

defmod n_scenesMenu notify global:ATTR.wz_szene.d.setList.* {MyScenesMenu('wz_szene.d')}

Wichtige Änderungen sind Inline kommentiert und müssen entsprechend auf Euer Setup angepasst werden.
Aufhübschungen mit Emojis, wie im Bilderrahmen Panel zu sehen sind, habe ich bewusst weggelassen.
Bei Interesse gerne per PM melden.  ;)

Viele Grüße,
Sebastian




Titel: Aw: Dynamische Einträge in Menu-Elementen
Beitrag von: TomLee am 31 Oktober 2026, 19:07:34
Die setList in dem dummy könntest Du auch dynamisch machen, wenn aus FHEM Zugriff auf die Ordner PorscheMuseum, Urlaub und Halloween hast:

{
  "Arg":"wz_szene.d",
  "Results": [
  {
    "Name":"wz_szene.d",
    "PossibleSets":"alben:Ordner1,Ordner2,Ordner3 ",
    "PossibleAttrs":"alias comment:textField-long eventMap:textField-long group room suppressReading userattr userReadings:textField-long verbose:0,1,2,3,4,5  disable disabledForIntervals readingList setExtensionsEvent:1,0 setList useSetExtensions event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading ASC:0,1,2 alexaName alexaProactiveEvents:1,0 alexaRoom cmdIcon devStateIcon:textField-long devStateStyle fhem_widget_channels fhem_widget_command fhem_widget_command_2 fhem_widget_command_3 genericDeviceType:security,ignore,switch,outlet,light,blind,thermometer,thermostat,contact,garage,window,lock,scene homebridgeMapping:textField-long icon mqttAlias:textField-long mqttDefaults:textField-long mqttDisable:both,incoming,outgoing mqttForward:all,none mqttPublish:textField-long mqttSubscribe:textField-long msgContactAudio msgContactLight msgContactMail msgContactPush msgContactScreen msgParams msgPriority msgRecipient msgRecipientAudio msgRecipientLight msgRecipientMail msgRecipientPush msgRecipientScreen msgRecipientText msgTitle msgTitleShrt msgType:text,push,mail,screen,light,audio,queue siriName sortby webCmd webCmdLabel:textField-long widgetOverride",
    "Internals": {
      "CFGFN": "",
      "FUUID": "6ae62c1d-f33f-c86b-63a6-81294fdbe7368245",
      "NAME": "wz_szene.d",
      "NR": "771",
      "STATE": "???",
      "TYPE": "dummy"
    },
    "Readings": { },
    "Attributes": {
      "readingList": "alben",
      "room": "Test",
      "setList": "alben:{join(',',map{s{.*/}{};;$_}grep{-d$_}glob(\"/opt/fhem/www/Testordner/*\"))}",
      "useSetExtensions": "1"
    }
  }  ],
  "totalResultsReturned":1
}

pi@fhempi:/opt/fhem/www/Testordner $ ls -l
insgesamt 12
drwxr-xr-x 2 fhem dialout 4096 31. Okt 18:49 Ordner1
drwxr-xr-x 2 fhem dialout 4096 31. Okt 18:49 Ordner2
drwxr-xr-x 2 fhem dialout 4096 31. Okt 18:49 Ordner3
Titel: Aw: Dynamische Einträge in Menu-Elementen
Beitrag von: binford6000 am 31 Oktober 2026, 19:45:08
ZitatDie setList in dem dummy könntest Du auch dynamisch machen,...

Mache ich im "echten" dummy für den Bilderrahmen auch.

In der angehängten 99_imgKioskUtils.pm könnt Ihr alle Fn's einsehen.

VG Sebastian

Titel: Aw: Dynamische Einträge in Menu-Elementen
Beitrag von: TomLee am 31 Oktober 2026, 20:41:11
Claude nutz ich auch.

Zusammenfassung mit meinen Gedanken dazu:

Ah, ok, dann war mein Vorschlag am Thema vorbei: Immich-Alben sind ja keine
Ordner, da hilft kein glob. Und das notify aufs ATTR-Event würde bei meiner
Variante auch nie auslösen, weil sich das Attribut gar nicht ändert.

Was mir an der at-Lösung aber nicht so gefällt: Wirklich dynamisch ist das ja
nicht, und per CommandAttr hast du bei jedem neuen Album das Fragezeichen bei
save. Wäre es nicht einfacher, die Liste in ein Reading zu schreiben und in der
setList nur noch das Reading zu lesen?

attr <dummy> useSetExtensions 1
attr <dummy> setList album:{ReadingsVal("<dummy>","albumList","")}

Das Attribut bleibt dann gleich, also kein Fragezeichen mehr. Neue Alben kommen
natürlich trotzdem erst mit dem nächsten at-Lauf. Im Modul müssten dafür Zeile
306-313 das Reading schreiben und Zeile 112 es lesen. Das Menü aktualisierst du
ja eh direkt aus dem Modul (Zeile 322), das sollte also weiter klappen. Das
notify aus deinem Beispiel löst dann allerdings nicht mehr aus. Wichtig: Der
Perl-Code in der setList darf keine Leerzeichen enthalten (SetExtensions.pm,
Zeile 98).

Wenn du nur das Fragezeichen loswerden willst, reicht wohl auch:

CommandAttr(undef, "-silent $dev setList $sl") if($sl ne $old);

Die neue Liste landet dann aber erst beim nächsten save in der fhem.cfg.

Hab Claude mal über die 99_imgKioskUtils.pm schauen lassen, dabei sind noch ein
paar Kleinigkeiten aufgefallen:
- Zeile 315 ff.: Mit readingsBulkUpdateIfChanged spart man sich bei jedem Abruf
  die Events, auch die mit dem kompletten JSON.
- Zeile 407 ff.: print und close werden nicht geprüft, bei voller Platte könnte
  also eine abgeschnittene Datei die Config ersetzen.
- Zeile 146: Es werden nur Bilder gezählt. Falls bei dir auch Videos laufen, wird
  die berechnete Dauer zu kurz.

Getestet hab ich das alles nicht, FHEMApp läuft bei mir nicht. Oder übersehe ich
was und du hast das mit dem Attribut bewusst so gemacht?