FHEMWEB Erweiterungen

Begonnen von rudolfkoenig, 22 April 2013, 20:59:47

Vorheriges Thema - Nächstes Thema

rudolfkoenig

In der Diskussion http://forum.fhem.de/index.php?t=msg&goto=71861&rid=8#msg_71861 hat mich andre zu folgenden Erweiterungen gedraengt (ok, ich wollte Teile davon auch schon seit laengerem haben :)

Falls ein Modul die Funktion FW_summaryFn definiert, dann wird der Rueckgabewert dieser Funktion an der Stelle des Status-Icons angezeigt. Analog dazu gibt es ein FW_detailFn, dessen Output wird im Detail-Ansicht fuer das Geraet angezeigt. Ich habe als Beispiel fuer diese Funktionen den weblink bzw. FileLog spezifischen Code aus FHEMWEB.pm in die beiden Module ausgelagert. Die Funktionen werden mit den Argumenten $FW_wname, $deviceName, $FW_room aufgerufen:
- FW_wname ist der Name der aktuell verwendeten FHEMWEB Instanz
- deviceName ist der Name des aktuell zu zeigenden FHEM-Geraetes
- FW_room ist das aktuelle Raum
Zusaetzlich kriegt FW_summaryFn ein (am Anfang leeres) Hash mit, damit sie hinterlegen kann, ob seitenspezifische Elemente wie zoom-buttons schon gerendert wurden. Grundsaetzlich kann man beide Faelle mit der gleichen Funktion loesen, siehe die Beispiele.

Die zweite Baustelle: Darstellung von webCmd Elementen wie z.Bsp. dropdown/timepicker/slider/etc. Dazu muss man einen Eintrag in $data{webCmdFn} machen, z.Bsp.: $data{webCmdFn}{slider} = "FW_sliderFn"; Dann ruft FHEMWEB die Funktion sliderFn mit den Argumenten $FW_wname, $deviceName, $FW_room, $cmd, $values auf, wobei:
- FW_wname ist der Name der aktuell verwendeten FHEMWEB Instanz
- deviceName ist der Name des aktuell zu zeigenden FHEM-Geraetes
- FW_room ist das aktuelle Raum
- cmd ist der Name des aktuellen Kommandos
- values sind die aus "set dev ?" zu diesem Kommando gewonnene Attribute, die hinter dem ersten : stehen. Fuer dimdown:slider,0,1,100 sind sie also slider,0,1,100.
Falls die aufgerufene Funktion etwas zurueckliefert (kein undef oder ""), dann wird das angezeigt, und die Such-Schleife abgebrochen. Als Beispiel hierfuer habe ich in 01_FHEMWEB.pm den bisheringe Code in die Funktionen FW_sliderFn, FW_timepickerFn und FW_dropdownFn ausgelagert.

Die dritte Baustelle (javascript laden) war schon implementiert: mit $data{FWEXT}{<NAME>}{SCRIPT} kann man jeweils eine javascript Datei spezifizieren, diese werden immer geladen. Falls das Argument hier mit / beginnt, dann wird es ab www gesucht, wenn nicht, dann in www/pgm2. Beispiel:
$data{FWEXT}{myMod}{SCRIPT} = "/myMod/myScript.js"

Ich habe die Aenderungen so gut es ging getestet und eingecheckt. Fuer den Anwender sollten (hoffentlich) nur leichte Aenderungen bei der Darstellung der FileLog links bemerkbar sein.

justme1968

ich habe eben angefangen den colorpicker auf deine neue schnittstelle umzustellen und habe gleich die ersten fragen:

- um webCmdFn sinnvoll zu nutzen brauche ich wie bei FW_summaryFn auch $FW_room sonst kann ich den raum im auszuführenden kommando nicht sezten und lande auf der haupt seite. ich vermute bei deiner slider beispiel implementierung fällt das nicht auf weil du zugriff auf die globale variable hast. oder habe ich etwas übersehen?

- du hattest damals gesagt das jscolor ist klein genug um es mit einzuchecken. gilt das noch? wenn ich $data{FWEXT}{<NAME>}{SCRIPT} verwende muss ich es unter pgm2 einchecken. ist das auch ok?
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Danke fuer den Hinweis, ich habe den ersten Beitrag modifiziert. Aenderungen:
- detailFn und summaryFn werden mit FW_wname statt FW_chash aufgerufen
- webCmdFn kriegt die Argumente $FW_wname,$d,$FW_room,$cmd,$values. Die ersten 3 sind damit mit detailFn/summaryFn identisch. Das Problem ist mir nicht aufgefallen, weil ich die Funktionen in FHEMWEB.pm belassen habe.
- falls  $data{FWEXT}{myModul}{SCRIPT} mit / anfaengt, dann wird die Datei in www/... gesucht, sonst direkt in www/pgm2 (wie bisher).

Die jscolor Dateien bitte in einem separaten Verzeichnis www/jscolor einzuchecken, damit man sie zuordnen kann. Fuer updatefhem muss ich dieses Verzeichnis manuell aktivieren, bitte Bescheid geben, falls es soweit ist.

justme1968

ich habe jscolor eben unter www eingecheckt.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Habe fhemupdate aktualisiert und ausgefuehrt. Wir sollten die HUEDeveice/jscolor betreffende Diskussion in einem separaten Thread fuehren.

justme1968

noch zwei fragen zum vorgehen wenn mehr als ein modul die gleiche webCmdFn verwenden sollen. wo soll der eigentliche code dann stehen? und wie soll er eingebunden werden?
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Ich kann es leider nicht beantworten: ich scheue mich noch davor zurueck fuer FHEMWEB auch noch ein autoloader Funktion zu bauen, samt Ablage und Doku. Vorschlag: Solange sowas nicht existiert, koennen das die beiden Module selbst mit einem "require webCmd....pm" loesen.

justme1968

willst/kannst du den mechanismus mit dem z.b. der slider aktualsiert wird wenn sich das zugehörige reading ändert dokumentieren so das er auch für andere webCmdFn objekte verwendet werden kann?
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Das ist z.Zt. hartcodiert in fhemweb.js/FW_doUpdate()

Hier kommen die mit inform=<raumname> bei FHEMWEB bestellten Aenderungen an, falls man als Benutzer longpoll gesetzt hat. Die Daten (STATE + readings) sind jeweils auf eine Zeile verpackt, und mit << getrennt: das erste Stueck ist Element-Id, das Zweite das Wert, das Dritte ist das, was FHEMWEB als Status (Bild/etc) malen wuerde, fuer Readings ist es mit dem Zweiten identisch.

FW_doUpdate sucht nach Element-Id, und ersetzt es mit dem dritten Wert. Dabei erkennt es select bzw. slider Elemente anhand Nodename bzw. element-id, und aktualisiert diese speziell.

Um Moduldefinierte-Elemente behandeln zu koennen, muesste vermutlich im gefundenen Element nach einem Attribut FhemFn suchen, und falls vorhanden, dessen Wert als Funktion aufrufen.
Damit koennte man auch select bzw. slider-Elemente behandeln.
Statt ID-Suche (liefert ein Element zurueck) sollte man nach Namen suchen, und alle Elemente behandeln. Bedeutet auch, dass die bisherigen Elemente umgestellt werden muessen.

Kann ich machen, wird etwas noch dauern.

justme1968

das mit der id hatte ich gefunden und gehofft es das zusammen mit einer callback funktion schon reicht.

auch wenn ich zur zeit der einzige mit modulen bin die das gebrauchen könnten wäre es eine meiner meinung nach schön wenn das möglich wäre.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

justme1968

ich denke die formulierung
Zitatdann wird der Rueckgabewert dieser Funktion an der Stelle des Status-Icons angezeigt
in der bescheibung von FW_summaryFn ist zumindest etwas irreführend. es wird ja nicht das device status icon ersetzt sondern der gesamte inhalt der device zeile nach dem namen wird ersetzt. inklusive webCmd liste.

nur das device icon zu setzen geht nach wie vor nur mit der von dir ungeliebten art wie ich devStateIcon verwende und einen default dafür vorgebe. oder hast du deine meinung hierzu geändert?
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Sorry, mein Fehler, da war ein "next" zuviel. summaryFn sollte so funktionieren wie beschrieben, webCmd sollte nun moeglich sein.

Weitere Aenderung: Ich habe fuer summaryFn-Faelle id von deviceName in type.deviceName geaendert, sonst ersetzt fhemweb.js es bei der ersten Aktualisierung wieder mit dem Bild/Text.
Das muss ich ja auch noch aendern.

justme1968

jetzt geht es.

noch eine kleinigkeit: es wäre schön wenn summaryFn undef liefert den standart (state) anzuzeigen und nur bei "" nichts.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig


justme1968

leider ist noch ein fehler rein gerutscht. beim auswerten der summaryFn ist in zeile 1076 ein my zu viel. der rückgabewert verlässt sonst nie das if.

die änderung der id in type.deviceName hat zur folge das das device icon in der raum übersicht nicht mehr aktualisiert wird wenn sich der state ändert. oder hattest du mit 'Das muss ich ja auch noch aendern.' gemeint das das noch nicht fertig war?

ansonsten ist mir beim fehler suchen eben noch aufgefallen das ein reading state in der detail ansicht nicht mit aktualisiert wird. erst beim refresh der seite ist der aktuelle wert zu sehen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968