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
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
ZitatDie setList in dem dummy könntest Du auch dynamisch machen,...
Mache ich im "echten" dummy für den Bilderrahmen auch.
- Ein at prüft regelmäßig ob es neue Alben gibt
- Diese werden dann in die setList eingefügt (ohne Emojis)
- Das FHEMApp Panel wird entsprechend erweitert:
- Angepinnte Einträge belieben an oberster Stelle (Favoriten, letzte drei Urlaube usw)
- die FHEMApp Menü Liste wird mit den original Immich Alben Namen versehen (inkl. Emojis)
- Alben Rotation ist ebenfalls eingebaut
- Anzeige von Bilderanzahl, Slide Anzahl (2x Hochkant Darstellung)
- Anzeige Dauer (Ende / % angezeigt)
- Steuerung: Aus/Ein, Bild/Album vor/zurück, Bild zu Favoriten, Albumauswahl
- Kleine Vorschau des aktiven Albums als iFrame
In der angehängten 99_imgKioskUtils.pm könnt Ihr alle Fn's einsehen.
VG Sebastian
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?