Es freut mich, dass du mithelfen willst, Gerald.
Leider gibt es keine Entwickler-Doku und das Gesamtsystem ist wirklich nicht leicht zu durchschauen.
Unterdessen bin ich soweit, dass ich wohl jede Stelle im Code kenne und damit eine solche Doku erstellen könnte. Allerdings sollte zuerst 2.9 released werden (ich hatte die letzten Tage nicht so viel Zeit).
In der nächsten Version möchte ich auch den Datenfluss überarbeiten, weil es da zu viele Redundanzen hat und die Zuständigkeit der einzelnen Module IMHO nicht klar ist.
Zusammengefasst funktioniert es aktuell so (am Beispiel mit SmartHomeNG als Backend):
Für dein Vorhaben ist noch wichtig zu wissen, dass bei den Plots der Zeitabschnitt quasi Teil des Items wird. Am Beispiel von plot.period wird in /widgets/plot.html 84-89 an das eigentliche Item die Aggregatsfunktion, tmin, tmax und count angefügt. Wenn das Item also z.B. 'mein.item' heisst, wird daraus etwa 'mein.item.min.1h.now.100'. Dies wird dann in /driver/io_smarthome.py.js 250-261 wieder auseinandergebröselt.
Um die Zeitspanne zu ändern, müsste als sicher mindestens folgendes gemacht werden:
Das Abonnement der nicht mehr benötigten Items würde dabei nie gekündigt und bleibt bestehen, bis du die Webseite schliesst oder F5 drückst. Wenn du also vielleicht 10 Mal die Zeitspanne änderst, wird ab dann im Hintergrund jeder Datenpunkt 10 mal gesendet.
Hast du nun z.B. ein Tablet an der Wand für die Visu, bei dem du eigentlich nie neu lädst, kann das auf Dauer zu massivem Datentransfer führen.
Leider gibt es keine Entwickler-Doku und das Gesamtsystem ist wirklich nicht leicht zu durchschauen.
Unterdessen bin ich soweit, dass ich wohl jede Stelle im Code kenne und damit eine solche Doku erstellen könnte. Allerdings sollte zuerst 2.9 released werden (ich hatte die letzten Tage nicht so viel Zeit).
In der nächsten Version möchte ich auch den Datenfluss überarbeiten, weil es da zu viele Redundanzen hat und die Zuständigkeit der einzelnen Module IMHO nicht klar ist.
Zusammengefasst funktioniert es aktuell so (am Beispiel mit SmartHomeNG als Backend):
- Beim allerersten Aufruf wird in /pages/base/root.html auf Zeile 156 der Backend-Treiber als io initialisiert (also z.B. /driver/io_smarthome.py.js).
- Beim erstmaligen Aufruf jeder Seite werden die JavaScript-Objekte der Widgets erzeugt. Für die aktuell integrierten Widgets sind dies jQuery Mobile Widgets, welche in /widgets/*.js definiert sind und durch jQuery Mobile automatisch initialisiert werden. Früher oder bei selbst eingebauten wurden in /widgets/widget.js bei onpagebeforeshow Events an die DOM-Objekte gebunden (mehr Details zum Unterschied unter Punkt 6).
- Bei jedem Wechsel zwischen Seiten (also erstmalig oder späteres zurückkehren) wird io.run() aufgerufen (/pages/base/root.html Zeile 177).
- In io.run() von /driver/io_smarthome.py.js Zeilen 78 - 84 geschehen zwei Aufrufe:
- widget.refresh() von /lib/base/base.js 1212 bis 1229, welches die Widgets auf der Seite mit bereits früher erhaltenen Werten aus dem Backend befüllt (wie das genau geschieht steht in Schritt 6).
- io.monitor() von /driver/io_smarthome.py.js 238-269, welches in SmartHomeNG alle Items abonniert, welche auf der aktuellen Seite vorkommen (auch bereits vorhandene - dass diese nicht doppelt abonniert werden, muss das Backend sicherstellen).
Die Plots werden hier separat behandelt, weil diese anders abonniert werden müssen.
- SmartHomeNG sendet dann asynchron die abonnierten Daten, welche in io.socket.onmessage von /driver/io_smarthome.py.js 143-212 empfangen werden und an widget.update() in /lib/base/base.js 1150-1192 übergeben werden.
- widget.update() unterscheiden zwischen den aktuellen Widgets (welche ich u.A. aus Performancegründen umgebaut hatte) und veralteten aus externen Quellen:
- Für aktuelle Widgets wird die update-Methode des Basis-Widgets aufgerufen, welche in /base/base.js 1686-1692 implementiert ist.
Diese ruft dann wiederum die Implementation _update() jedes einzelnen Widgets mit den für dieses Widget benötigten Item-Werten auf. - Ältere Widgets müssen für jedes Item einzeln im DOM gesucht werden und dann das per jQuery angebundene update-Event mit den benötigten Item-Werten aufgerufen werden.
- Für aktuelle Widgets wird die update-Methode des Basis-Widgets aufgerufen, welche in /base/base.js 1686-1692 implementiert ist.
Für dein Vorhaben ist noch wichtig zu wissen, dass bei den Plots der Zeitabschnitt quasi Teil des Items wird. Am Beispiel von plot.period wird in /widgets/plot.html 84-89 an das eigentliche Item die Aggregatsfunktion, tmin, tmax und count angefügt. Wenn das Item also z.B. 'mein.item' heisst, wird daraus etwa 'mein.item.min.1h.now.100'. Dies wird dann in /driver/io_smarthome.py.js 250-261 wieder auseinandergebröselt.
Um die Zeitspanne zu ändern, müsste als sicher mindestens folgendes gemacht werden:
- die Items im HTML-Dom ändern
- das Highcharts-Objekt verwerfen
- die neuen Items abonnieren
- Evtl. muss das jQuery Mobile Widget noch neu gebildet werden, weil dieses nämlich die Attribute aus dem DOM-Einliesst (ich bin mir grad nicht sicher, zu welchem Zeitpunkt das geschieht).
Das Abonnement der nicht mehr benötigten Items würde dabei nie gekündigt und bleibt bestehen, bis du die Webseite schliesst oder F5 drückst. Wenn du also vielleicht 10 Mal die Zeitspanne änderst, wird ab dann im Hintergrund jeder Datenpunkt 10 mal gesendet.
Hast du nun z.B. ein Tablet an der Wand für die Visu, bei dem du eigentlich nie neu lädst, kann das auf Dauer zu massivem Datentransfer führen.
Kommentar