Hauptmenü

FW_summaryFn

Begonnen von Damian, 24 November 2017, 23:00:03

Vorheriges Thema - Nächstes Thema

Damian

Hallo,

ich möchte die Kontrolle über die Statuszeile im Modul übernehmen.

Dazu nutze ich den Aufruf über FW_summaryFn.

Beim Seitenaufbau werden korrekt eigene Widgets gesetzt und in der Statuszeile dargestellt, bei einer Statusänderung des Moduls werden allerdings Änderungen am HTML-Aufbau vorgenommen und die eigenen Widgets gelöscht.

Wie könnte ich in FW_summaryFn erkennen, ob der Aufruf wegen Seitenaufbaus oder wegen Statusänderung stattfindet und diesen abfangen, da die Widget-Updates über eigene Mechanismen vorgenommen werden? 

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

herrmannj

#1
Wenn ich die Frage richtig verstehe (bin mir nicht sicher, was genau meinst Du mit "Kontrolle der Statuszeile" ?):

geht meiner Meinung nach nicht direkt sonder nur über den Umweg die entsprechenden HTML Elemente via javascript auszutauschen und anschließend die longpoll Funktionen zu nutzen um mit dem dadurch erzeugten Element zu sprechen.

edit:
zum Verständnis: Du lieferst etwas via summary aus, ein longpoll liefert eigenen HTML code welcher "das von Dir ausgelieferte" wieder überschreibt. Richtig ?

edit2:
der javascript kann auch inline via summary geliefert werden.

Damian

Im Anhang ein Beispiel für ein paar Widgets gleicher HTML-Aufbau (return) bei FW_detailFn wie bei  FW_summaryFn. Beim ersten Aufruf (oder Page-Reload) ist alles OK. Nach Statusänderung nicht mehr - klar FHEMWEB nimmt Änderungen durch Update vor.

Meine aktuelle Lösung, die mir aber nicht gefällt: Ich erzeuge keine Events bei eigenen Readings und rufe FW_Notify rekursiv auf, dann bekommt FHEMWEB es nicht mit und packt den Status nicht an - eigene Update-Mechanismen greifen dennoch - Darstellung wird aktualisiert aber nicht zerschossen.



Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rudolfkoenig

ZitatBeim Seitenaufbau werden korrekt eigene Widgets gesetzt und in der Statuszeile dargestellt, bei einer Statusänderung des Moduls werden allerdings Änderungen am HTML-Aufbau vorgenommen und die eigenen Widgets gelöscht.

Um genauer zu sein: bei einer Statusaenderung wird (unter anderem) eine Zeile an FHEMWEB geschickt, bestehend aus devicename, status, und der via FW_devState berechnete Darstellung. fhemweb.js sucht ein HTML-Element mit informid=devicename, und ersetzt den Inhalt mit der "Darstellung".

FW_devState baut die Darstellung so:
- falls showtime gesetzt ist, dann wird die Zeit angezeigt
- falls desired-temp oder desiredTemperature gesetzt ist, dann wird measured-temp/temprature angezeigt
- sonst wird ein Bild berechnet (mit oder ohne devStateIcon)
- falls devStateStyle gesetzt ist, wird entsprechend eingefuegt
- falls das Modul ein FW_summaryFn definiert, dann wird sie mit ($FW_wname, $d, $FW_room, $extPage) aufgerufen, und, falls was zurueckgeliefert wird, dieser Text fuer die Darstellung verwendet. $extPage bleibt erhalten fuer die Darstellung einer Seite, d.h. falls die Funktion auf der gleichen Seite oefters aufgerufen wird, dann kann der erste Aufruf darueber dem zweiten Aufruf was mitgeben.

Ich verstehe noch nicht, warum beim Update die Seite "kaputt" ist, eigentlich sollte das nicht sein, wenn man nichts unerwartetes tut.

ZitatWie könnte ich in FW_summaryFn erkennen, ob der Aufruf wegen Seitenaufbaus oder wegen Statusänderung stattfindet und diesen abfangen, da die Widget-Updates über eigene Mechanismen vorgenommen werden? 
Ich sehe noch keinen Grund, warum summaryFn sowas erkennen sollte. Eine effiziente Statusaenderung baut man anders: mit einem JavaScript Widget (wie knob, slider, etc), dessen setValueFn bei jeder Aenderung mit dem Inhalt von state aufgerufen wird.

Damian

Hallo Rudi,

danke für die Infos. Naja es sind ja JavaScript-Widgets. Was du siehst sind FHEMWEB-Widgets. Sie werden in  FW_detailFn bzw. in FW_summary über

    return "<div class='fhemWidget' cmd='$cmd' reading='$reading' dev='$dev' arg='$widget' current='$value' type='$type'></div>";

registriert.

Und über
         FW_directNotify("#FHEMWEB:$_", "doifUpdateCell('$pn','informid','$dev-$reading','$value')","")
aktualisiert.

Der Updatemechanismus ist im DOIF-Modul implementiert.

Die Sache funktioniert in FW_detailFn wie gewünscht.

FW_summary wird im Gegensatz zu FW_detailFn bei Statusänderungen jedes Mal aufgerufen.

Der User kann, so wie ich es sehe, nicht sagen "nichts tun". Die Alternativen sind:

undef: Status über FHEMWEB abwickeln

oder eben etwas übergeben, hier also jedes Mal Widgets registrieren.

Was ich nicht überprüfen kann ist, ob die Registrierung das Problem ist, oder der Updatemechanismus über InformId von FHEMWEB, aber dieser würde ja auch bei  FW_detailFn zuschlagen, oder?

Naja, es war als Draufgabe gedacht, ohne Events funktioniert es ja, wie schon geschrieben, auch bei FW_summary, weil es dann nur beim Seitenaufbau aufgerufen wird und die Updates nur über doifUpdateCell erfolgen. Allerdings reicht schon ein setreading auf ein Reading des Moduls um es zunichte zu machen. Wahrscheinlich nimm ich es bei FW_summary wieder raus.





Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

herrmannj

ich habe das "früher" für WifiLight implementiert, da gab es noch keine farbigen icons und ich hatte keine lobby um fhemweb.js Änderungen zu erwirken.

Also ging es auch nur aus der summary. Der Trick ist es die informid der div zu löschen. Danach findet longpoll die nicht mehr und kann sie nicht austauschen. Irgendwann habe ich das (system) aber eingestellt weil ich das UI gewechselt habe und ich es nicht pflegen wollte.

Das ganze widget system kam danach, damit müsste es eigentlich gehen.

Wenn gar nichts geht: per js (jquery) die informid im html löschen, die div gegen ein eigenes widget (whatever) tauschen (andere id, keine informid)  und die setValueFn in fhemweb.js registrieren. Dort dann die events abgreifen.

Damian

Naja, die Informid setzt sich aus device und reading zusammen, wenn man sie löscht, dürften die FHEMWEB-Widgets nicht mehr richtig funktionieren und die sollen ja gerade nutzbar sein. Eigene Elemente insb. dynamische Styles werden über eine eigene doifId abgewickelt. Diese Schiene funktioniert sauber, weil FHEMWEB davon nichts mitbekommt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

herrmannj

Dann verstehe ich dein Ziel nicht. Klar kann man die löschen. Und ja: dann musst du die Funktion mit eigenen Code übernehmen. Sollte dich aber von selbst erklären  ;)

Damian

Zitat von: herrmannj am 25 November 2017, 14:43:04
Dann verstehe ich dein Ziel nicht. Klar kann man die löschen. Und ja: dann musst du die Funktion mit eigenen Code übernehmen. Sollte dich aber von selbst erklären  ;)

Ich will aber nicht alle FHEM-Widgets nachbauen, der Trick war die gleiche Schnittstelle zu nutzen und damit kompatibel zu FHEMWEB zu sein.

Es würde vermutlich schon reichen, wenn ein Device für sich longpoll abschalten könnte.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

herrmannj

Alle ?

Ich glaube das ist ein x-y Problem. "Ich möchte x machen um y zu erreichen. Wie mache ich x?" Besser wäre "was muss ich machen um y zu erreichen?"

Byte09

#10
Zitat von: herrmannj am 25 November 2017, 14:11:29

....
Also ging es auch nur aus der summary. Der Trick ist es die informid der div zu löschen. Danach findet longpoll die nicht mehr und kann sie nicht austauschen.
.....

hallo herrmannj,

ich stehe gerade vor einem ähnlichen problem und kämpfe schon den ganzen tag damit . ich müsste aus dem von der summaryfn erzeugten code die informid löschen, bin aber leider bei javascript ganz schwach . ich weiss nicht wie ich zugriff auf dieses element bekomme, um die informid gegen eine andere zu ersetzen .

letztendlich habe ich ja nur die möglichkeit in der sub X_summary($) etwas in der folgenden art zu generieren :

return 'IRGENDEIN DARZUSTELLENDER TEXT
<script>
// ERSETZE AUS DIESEM SCRIPT DIE INFORMID DUCH WHATEVER
</script>';


das ergiebt dann in der HTML-Seite folgendes :

......
        <td informId="DEVICE">IRGENDEIN DARZUSTELLENDER TEXT
<script>
// ERSETZE AUS DIESEM SCRIPT DIE INFORMID DUCH WHATEVER
</script></td>
        ......


kannst du mir ggf. auf die sprünge helfen , wie ich aus dem script die informid löschen kann ?

danke und Gruss Byte09

nachtrag: das problem ansich ist , dass ich aufgrund meiner script-schwäche nicht weiss wie ich zugriff auf das <td> element bekomme, da es keine class , name oder id hat ( über die ich sonst darauf zugreifen würde )

herrmannj

Moin,

a) ich habe das "damals" gemacht als es noch keine widgets gab. Schau mal bitte ob Du Deine Aufgabe mit widgets besser lösen kannst.
b)

FW_summaryFn bekommt ja den Namen des Device als Parameter. Beim injizieren des scriptes schickst den Namen also mit (zb als var name oder inline als Text). Dann kannst Du per selector das Zelle auswählen die (Attribut) "informID" gleich "DeviceName" hat. https://api.jquery.com/attribute-equals-selector/
Anschließend dann normal per jquery gegen "whatever" austauschen und in den FHEM widgets registrieren um die Updates zu bekommen.

Wenn Du bei jquery und js blank bist wird es aber ein Lernprozess.

vg
joerg

Byte09

Danke für die Info erstmal.
Ich fürchte das ich es nicht über widgets lösen kann , da ich schlicht gar keine Aktualisierung mehr brauchen kann in der raumansicht , und das auch nur dann nicht , wenn es sich um einen bestimmten raumnanen handelt .

Das heisst ich möchte ereichen , das keine Aktualisierungen mehr kommen , bei einer bestimmten (definierten) raumansicht .

.... und ja , ich bin diesbezüglich blank.

Gruss Byte09

Gesendet von meinem SM-G900F mit Tapatalk


Byte09

#13
Zitat von: herrmannj am 15 Januar 2018, 21:15:16
Moin,

a) ich habe das "damals" gemacht als es noch keine widgets gab. Schau mal bitte ob Du Deine Aufgabe mit widgets besser lösen kannst.
b)

FW_summaryFn bekommt ja den Namen des Device als Parameter. Beim injizieren des scriptes schickst den Namen also mit (zb als var name oder inline als Text). Dann kannst Du per selector das Zelle auswählen die (Attribut) "informID" gleich "DeviceName" hat. https://api.jquery.com/attribute-equals-selector/
Anschließend dann normal per jquery gegen "whatever" austauschen und in den FHEM widgets registrieren um die Updates zu bekommen.

Wenn Du bei jquery und js blank bist wird es aber ein Lernprozess.

vg
joerg

dank dir für den Schubs in die richtige Richtung, ich habe es nun so:
$( "td[informId|='ZU AENDERN']" ).attr("informId", 'GEAENDERT');
hinbekommen.   

................ zumindest wird nicht mehr aktuaklisiert

gruss Byte09

rudolfkoenig

es gibt auch noch die Funktion .removeAttr()