Hallo,
ich möchte gerne einen in einem DOIF definierten uiTable als Popup durch Klicken auf ein Icon in einer ReadingsGroup öffnen. Erste Idee war
- einen Weblink definieren
- und diesen in der Definition der readingsGroup angeben.
Das funktioniert wohl nicht. Alternativ habe ich dann versucht,
- den uiTable per DOIF_tablePopUp in einer readingsGroup im Attribut valueFormat aufzurufen.
Das funktioniert so halb:
- Direkt nachdem man das Attribut valueFormat gesetzt hat gehts.
- Nach fhem-Neustart gehts aber nicht mehr:
- Wenn die readingsGroup vor dem DOIF initialisiert wird (kleinerer Wert im internal "NR"), dann erscheint in der readingsGroup anstatt des Icons die Meldung "no device ChooseColorWidget or attribut uiTable."
- Wenn das DOIF vor der readingsGroup initialisiert wird, dann erscheint der Name des Icons in der readingsGroup anstatt des Icons, ist aber klickbar und öffnet das Popup.
Letzteres Verhalten ist auch dokumentiert in https://wiki.fhem.de/wiki/DOIF/uiTable:
ZitatBesonderheiten
DOIF-Funktion PUP(<Name des anderen DOIF>,<Iconname@optionale Farbe>), wenn das Icon nicht existiert wird der Text als Link in Standardfarbe angezeigt.
Was kann ich tun?
- Ich könnte das Attribut valueFormat immer nach fhem-Start dynamisch neu setzen. Würde wahrscheinlich gehen, gefällt mir als Idee aber gar nicht, weil das jedesmal als Konfigurationsänderung bearbeitet werden würde und gespeichert werden müßte.
- Dass ich eine Initialisierungsreihenfolge einhalten müßte, wäre für mich akzeptabel. Aber das tut ja auch nicht... Könnte ich das Icon vorher anlegen, damit es eben schon existiert, wenn ich PUP aufrufe?
- Oder gibts andere Möglichkeiten, auf die ich noch nicht gekommen bin?
Danke für Eure Hilfe!
Das wird alles schwierig sein, da es zwei verschiedene Module sind, die nicht aufeinander abgestimmt sind.
PUP ist eine Funktionalität des DOIFs, die außerhalb eines DOIFs wohl nicht funktionieren wird.
Was möchtest du in Readingsgroup darstellen und was soll aus dem DOIF kommen?
Meine Idee war, in der readingsGroup eine Übersicht über die verschiedenen Beleuchtungsmöglichkeiten inkl. Status und Ein-/Ausschaltmöglichkeit zu geben, und die Detail-Einstellungsmöglichkeiten zu Farbtemperatur, Helligkeit usw. in ein Popup zu verlegen, um es übersichtlich zu halten.
Es ist natürlich schon irgendwo eine "Vergewaltigung" von DOIF, es als Vehikel für ein Popup zu verwenden. Ich hatte aber gar kein schlechtes Gewissen, denn DOIF kann ja schon echt viel, und es ist ja auch möglich und zulässig, einen Weblink zu definieren, der so ein Popup öffnet. Das ist ja auch ein anderes Modul, und wenn man den Weblink einer Gruppe zuordnet, dann erscheint er z.B auch im Dashboard, wenn die Gruppe dort angezeigt wird. Also da geht schon viel, warum dann nicht in einer readingsGroup...?
Zitat von: beaune am 15 Februar 2022, 11:25:53
Meine Idee war, in der readingsGroup eine Übersicht über die verschiedenen Beleuchtungsmöglichkeiten inkl. Status und Ein-/Ausschaltmöglichkeit zu geben, und die Detail-Einstellungsmöglichkeiten zu Farbtemperatur, Helligkeit usw. in ein Popup zu verlegen, um es übersichtlich zu halten.
Es ist natürlich schon irgendwo eine "Vergewaltigung" von DOIF, es als Vehikel für ein Popup zu verwenden. Ich hatte aber gar kein schlechtes Gewissen, denn DOIF kann ja schon echt viel, und es ist ja auch möglich und zulässig, einen Weblink zu definieren, der so ein Popup öffnet. Das ist ja auch ein anderes Modul, und wenn man den Weblink einer Gruppe zuordnet, dann erscheint er z.B auch im Dashboard, wenn die Gruppe dort angezeigt wird. Also da geht schon viel, warum dann nicht in einer readingsGroup...?
Naja, Dashboard, wie auch Floorplan arbeiten intern anders als Readingsgroup.
Evtl. kannst du das, was du in Readingsgroup darstellst, komplett in DOIF darstellen - so mache ich es. Es ist ja schließlich eine Tabelle. Mit entsprechender For-Scheife kann man beliebig viele Zeilen produzieren - nicht nur zum Visualisieren, sondern auch zum Steuern. So wie z. B. hier: https://wiki.fhem.de/wiki/DOIF/Automatisierung#Steuerung_von_Raumthermostaten_f.C3.BCr_mehrere_R.C3.A4ume_mit_GUI
Hier scheint mir tatsächlich eine gewisse Nicht-Durchgängigkeit in fhem vorzuliegen:
- Die Idee, die Tabelle mit DOIF zu erzeugen, geht nicht, weil webCmd nicht umgesetzt ist (siehe https://forum.fhem.de/index.php/topic,125767.0.html).
- Aber DOIF in readingsGroup ist offenbar auch problematisch.
Ich hab es jetzt so gelöst:
- Der Popup-Inhalt ist wie bisher als uiTable in einem DOIF definiert.
- Den Popup-Link definiere ich mit PUP als uiState im selben DOIF.
- In der ReadingsGroup binde ich das DOIF als devStateIcon ein.
Das ist zwar nicht so ganz geradlinig, scheint aber zumindest zu funktionieren.
Zitat von: beaune am 15 Februar 2022, 15:39:40
Hier scheint mir tatsächlich eine gewisse Nicht-Durchgängigkeit in fhem vorzuliegen:
- Die Idee, die Tabelle mit DOIF zu erzeugen, geht nicht, weil webCmd nicht umgesetzt ist (siehe https://forum.fhem.de/index.php/topic,125767.0.html).
- Aber DOIF in readingsGroup ist offenbar auch problematisch.
Ich hab es jetzt so gelöst:
- Der Popup-Inhalt ist wie bisher als uiTable in einem DOIF definiert.
- Den Popup-Link definiere ich mit PUP als uiState im selben DOIF.
- In der ReadingsGroup binde ich das DOIF als devStateIcon ein.
Das ist zwar nicht so ganz geradlinig, scheint aber zumindest zu funktionieren.
Kannst du mal zeigen, was du in Readingsgroup bzw. im DOIF darstellst?
Ich hab mal Screenshots beigefügt. Der bunte Kreis im State-Teil des DOIF ist der Link:
attr ChooseColorWidget uiState PUP("ChooseColorWidget","color,, myColorSVG")
Der uiTable ist der Popup-Inhalt:
attr ChooseColorWidget uiTable
{package ui_Table}
"Farbauswahl"| widget([Moodlight:RGB],"colorpicker,HSV")
"Lichttemperatur"| widget([Moodlight:ColorTemp],"colorpicker,CT,2000,10,6500")
"Helligkeit"| widget([Moodlight:Brightness],"colorpicker,BRI,0,1,100")
Die readingsGroup definiert dann den Aufbau der Tabellenzeile wie folgt:
defmod Beleuchtung readingsGroup
Moodlight:state,state@ChooseColorWidget,<RGB_red>,<RGB_green>,<white_warm>,<white_cold>,<br>,<>,<>,<Scene>
attr Beleuchtung valueIcon { state => '%devStateIcon' }
Damit bekomme ich mit relativ wenig Platz den Lampenstatus angezeigt, kann durch licken auf Glühbirne oder die Preset-Felder Ein-/Ausschalten, und wenn ich was anderes als die Presets haben will das opup öffnen.
Da funktioniert bereits mehr als ich erwartet hätte :)
Im Status des DOIFs sehe ich aber noch drei weitere Symbole (rot, grün, blau), wie kommen die denn dahin?
Hast du noch etwas im DOIF definiert?
Ja, im Grunde gar nicht so schlecht :). Mir wär nur wichtig, dass das auch eine beabsichtigte Funktion ist, die nach dem nächsten Update auch noch geht...
Die 3 Symbole stammen aus dieser Definition, die ich der Übersichtlichkeit halber unterschlagen hatte:
attr ChooseColorWidget webCmd RGB ff0000:RGB 00ff00:RGB 0000ff
attr ChooseColorWidget widgetOverride RGB:colorpicker,RGB
Das war mir eigentlich gar nicht so wichtig, weil ich die Farb-Presets in der readingsGroup haben wollte und da ja auch definiert habe. Das war im Grunde nur ein Versuch, weil Du geschrieben hattest, dass webCmd im DOIF-Device selbst funktioniert, aber eben nicht im uiTable. Hat aber mit der eigentlichen Fragestellung nach einem Popup in der readingsGroup nix zu tun.
Ich habe uiState erst vor Kurzem eingebaut, weil es im FHEM-Modus nicht gut funktionierte, im Perlmodus scheint es besser zu funktionieren, solange der Status nicht irgendwie gesetzt wird. Allerdings habe ich PUP auf die eigene Tabelle nie getestet - es scheint ja zu funktionieren.
Die komplette FHEM-Mimik wurde zwar übernommen: ReadigList, setList, webCmd, webCmdLabel, devStateIcon, CmdIcon, ...
um kompatibel zu sein.
Allerdings hat mir diese Vorgehensweise nie gefallen. Wie viele Attribute muss man denn noch setzen, um einen set-Befehl auf ein Device abzusetzen oder ein Reading über ein Icon setzen?
Daher finde ich die Nutzung der FHEM-Widgets wie iconSwitch, iconRadio, iconButtons, usw. über die widget-Funktion, wesentlich einfacher. Da brauche ich kein einziges weiteres Attribut zu definierten, um über ein beliebiges Icon einen Set-Befehl bzw. setreading auf irgendein Devices/Reading auszuführen.