NEWS
Tabellen in Vis aus Script mit Binding
-
Hallo zusammen,
ich erstelle mir via Script diverse Tabellen, die ich dann in Vis darstelle. Das Funktioniert mit diversen Datenpunkten aus wunderbar.
Jetzt möchte ich aber gerne eine Tabelle haben, die mir von meinen Gosund-Steckdosen den aktuellen Verbrauch anzeigt. Da ich hier keinen Sinn sehe, die Tabelle alle 10 Sekunden via Script neu zu erstellen, dachte ich, ich übergebe den Datenpunkt via Binding.
Zeile im Script wäre dann z.B. <td>{Datenpunkt}</td>.
Wenn ich das so im Vis-Editor im Basic-HTML-Widget eingebe, funktioniert das auch, aus einem Script heraus funktioniert das Binding aber offensichtlich nicht.
Habe ich einen Denkfehler?
Ich könnte die Tabelle natürlich im HTML-Widget von Hand aufbauen, allerdings müsste ich dann ja jedesmal wenn Steckdosen hinzukommen die Tabelle händisch erweitern, deshlab favorisiere ich die Idee mit dem Script.Bin für jeden Tip dankbar.
Gruß Chrunchy
-
@Chrunchy sagte in Tabellen in Vis aus Script mit Binding:
ich erstelle mir via Script...
Hi, du erzeugst also per JS/Blockly/Node-RED einen HTML-Quelltext der unter anderem dann ein Binding enthällt?
Wie stellst du den nun erzeugten Quellcode augenblicklich im VIS dar?
Eine Möglichkeit wäre den erzeugten HTML-Quellcode in einen Datenpunkt zu schreiben und zur Anzeige dann ein Basic-HTML-Widget mit einem Binding genau auf diesen Datenpunkt zu nutzen. -
vielen Dank für die Idee,
führt aber leider zu keiner geänderten Ausgabe.
Wie oben beschrieben, läuft ein Script, welches den Status meiner Steckdosen auswertet Ein, Aus und not available. Das funktioniert auch gut und erzeugt einen String mit HTML-Tabelle, welcher anschließend in einen Datenpunkt geschreiben wird. Jetzt würde ich eben gerne auch den Verbrauch in der Tabelle anzeigen.
Der Teil im Script hängt zum Testen folgende Zeile an die Tabelle, die ansonsten wunderbar funktioniert.
MDTbl = MDTbl+'<tr><td>Test</td><td>Akt. Verbrauch</td><td>{sonoff.0.TV Lampe links.ENERGY_Total}</td></tr>';
Bereits ebenfalls versucht habe ich das Binding in der Form:
{DP:sonoff.0.TV Lampe links.ENERGY_Total; DP}In der Vis wird aber der Zelleninhalt 1zu1 ausgegeben, also geschweifte Klammern mit Inhalt. Es findet hier keine Interpretation des Bindings statt.
-
@Chrunchy
So funktioniert das binding nicht.
Das binding wird einmal bei start von vis geprüft und sozusagen "kompliert".
Danach findet keine erneute Überprüfung statt. Aus diesem Grund funktionieren in vis auch keine dynamischen bindings.skripte laufen auf der serverseite (also im iobroker). der server kennt binding nicht.
du musst im skript den inhalt des datenpunkts mit getState holen und dann in deinen String einsetzen.
-
Das verstehe ich nur zum Teil...
Wenn ich
<table><tr><td>Test</td><td>Akt. Verbrauch</td><td>{sonoff.0.TV Lampe links.ENERGY_Total}</td></tr></table>
in das HTML-Widget eingebe, funktioniert es.
Noch mehr iritiert mich aber das folgende, was ich gerade festgestellt habe...
Zum Testen habe ich den Tip von @SBorg genommen und im HTML-Widget nur den Datenpunkt als Binding aufgerufen.Ergebnis wie vorher. in der Tabelle steht der Eintrag aus dem Script {...
Danach habe ich im HTML-Widget das einfache binding überprüft dazu habe ich einfach zwei binding in das Widget gesetzt. Das Ergebnis ist im Bild 1 zu sehen. Plötzlich wird in der Tabelle das binding interpretiert und das einzelne vom Datenpunkt darunter nicht.
Irgendwie sieht das für mich komisch, um nicht zu sagen falsch aus.
-
@OliverIO sagte in Tabellen in Vis aus Script mit Binding:
@Chrunchy
skripte laufen auf der serverseite (also im iobroker). der server kennt binding nicht.Der Server muss das nicht kennen... ich möchte das binding ja in der Tabelle haben. Es soll nur in der vis interpretiert werden.
du musst im skript den inhalt des datenpunkts mit getState holen und dann in deinen String einsetzen.
Genau das will ich nicht, Für den aktuellen Verbrauch, würde ansonsten ja das Script bei einem OnChange alle 10 Sekunden die Tabelle neu erzeugen. Das halte ich dann doch für etwas übertrieben.
-
na fakt ist, skript wird auf dem server ausgeführt. da gibt es kein binding.
das interpretieren von binding erfolgt nur in vis und nur am anfang wenn vis geladen wird.wenn du dynamisch einen datenpunkt mit text nachlädst, der wie binding aussieht, interessiert es vis nicht
wenn sich der wert alle 10 sekunden ändert, dann willst du ihn ja doch auch angezeigt bekommen?
Alternativ kannst du das skript immer in regelmäßigen Abständen laufen (jede Stunde?) über die schedule funktion -
OK, jetzt habe ich es verstanden. Das Problem ist also das Nachladen der Inhalte mit Binding.
Dann werde ich wohl eher die Tabelle mit Binding direkt in das HTML-Widget schreiben.
Aber woher kommt der Effekt, dass bei meinem Versuch mit dem zweiten Binding im Widget plötzlich der erste Wert aus der Script-erzeugten-Tabelle interpretiert wird?
Vielleicht muss man ein "Blind-Widget" nutzen, wo man quasi die Werte initialisiert.
Und ja, den Verbrauch hätte ich dann schon gerne aktuell, deshalb möchte ich ja nicht alle paar Sekunden die Tabelle neu durch das Script erzeugen.
-
@Chrunchy
iobroker gibt über den on-befehl nur signal wenn der wert sich tatsächlich ändert.
mach dir keine gedanken darüber wie oft die tabelle neu geschrieben wird.
der browser kann das sehr schnell, wahrscheinlich merkst du nicht einmal was davon,
das die tabelle neu aufgebaut wird. -
Die Darstellung im Vis macht mir an der Stelle auch weniger Sorgen...
Aber das Script im iobroker, welches die Tabelle aufbaut, macht dies ja beim aktuellen Verbrauch für ca. 5-8 Steckdosen (Gosund mit Tasmota). Die senden alle 10 Sek. den Status... Allerdings wohl eher nicht synchron. Kann also im worstcase sein, dass das Script alle 2 Sekunden triggert...
Und ich denke das geht dann schon ein wenig auf die Performance. iobroker läuft bei mir im Docker auf dem NAS.
Vielleicht ist das aber auch wirklich zu vernachlässigen, das weiß ich nicht, da ich ja gerade erst anfange mich mit iobroker zu beschäftigen.
Oder bezieht sich dein Hinweis auf den Verzicht des Scripts und der Tabellendarstellung im HTML-Widget mit Bindings?
-
@Chrunchy
probiere es aus. du kannst ja im log jeweils die milisekunden ausgeben, die es braucht um das zu verarbeiten.meine adapter squeezeboxrpc ruft alle 950ms (also weniger wie eine sekunde) daten zu 3 playern ab und schreibt für jeden ca 25 states. das juckt den rechner relativ wenig, da das alles im speicher abläuft. die kommunikation zwischen server und client läuft sehr effizient über websockets ab.
da iobroker für jeden adapter doch einiges an speicher benötigt, ist auf einem rapsi eher der speicher knapp und erst ab 10-15 adapter spielt das mit der prozessorperformance eine rolle.
-
Das mit der Zeitangabe im log klingt interessant.
Kannst du mir etwas genauer sagen, wie ich das anstelle? -
-
OK, das ist die Zeit im ms seit dem 1.1.1970.
Habe aber im Netz was gefunden, mittels start und endzeit setzten und am Ende subtrahieren.
-
@Chrunchy
ja genau.
du machst eine zeile am anfang und eine zeile am ende.
dann siehst du wie lange das ca braucht. kannst es natürlich auch genau ausrechnen
ich schätze deine paar zeilen werden nicht mehr als 100-200 ms benötigen. je nach system -
Ja. Wobei ich gerade noch etwas Teste...
Beim Start zeigt er 20ms an, bei einem Aufruf aus der Subscription gerade 103.
Derzeit sind aber die aktuellen Verbräuche noch nicht eingebunden.Werde das so erstmal beobachten. Vielen Dank.