NEWS
VIS html binding mit Variable
-
Hallo,
hat jemand eine Erklärung, warum folgendes Script in einem html widget nicht richtig funktioniert und ob es eine Lösung dafür gibt...
Fixed = <span id="fixed"></span> <br> Variable = <span id="variable"></span> <script> var resultFixed = '{0_userdata.0.log.year.2021.KW23}'; document.getElementById('fixed').innerHTML = resultFixed; var kw = "23"; var resultVariable = '{0_userdata.0.log.year.2021.KW' + kw + '}'; document.getElementById('variable').innerHTML = resultVariable; </script>
Im VIS Editor zeigt er bei beiden den richtigen Pfad an:
In der Anzeige zeigt er mir bei "Fixed" den richtigen Wert an, bei "Variable" eine "null".
Jemand eine Idee?
Danke! -
@bluefish Eine Idee schon - aber die Lösung muss wohl eine andere sein.
Sprich die Bindung findet statt bevor der Code ausgeführt wird. Deswegen nutzt Dir das nicht das variabel zu gestalten.
Du musst wohl oder übel über Deine Logikmaschine einen konstanten Datenpunkt verwenden und über Deine Logikmaschine den aktuellen Verbrauch dynamisch da rein schreiben.
In NodeRed definiert man einen eigenen CodeBlock damit man dort auf das Nachrichtenobjekt zugreifen kann. Wahrscheinlich ginge das im VIS ähnlich, da hier das Binding statt auf das Nachrichtenobjekt auf die iobroker Datenbank geht.
-
@bluefish sagte in VIS html binding mit Variable:
Hallo,
hat jemand eine Erklärung, warum folgendes Script in einem html widget nicht richtig funktioniert und ob es eine Lösung dafür gibt...
Fixed = <span id="fixed"></span> <br> Variable = <span id="variable"></span> <script> var resultFixed = '{0_userdata.0.log.year.2021.KW23}'; document.getElementById('fixed').innerHTML = resultFixed; var kw = "23"; var resultVariable = '{0_userdata.0.log.year.2021.KW' + kw + '}'; document.getElementById('variable').innerHTML = resultVariable; </script>
Im VIS Editor zeigt er bei beiden den richtigen Pfad an:
In der Anzeige zeigt er mir bei "Fixed" den richtigen Wert an, bei "Variable" eine "null".
Jemand eine Idee?
Danke!Es gibt kein dynamisches Binding.
Die Bindings wird beim start der view gesucht.
Wenn der Name da noch nicht feststeht, dann ist es kein gültiges Bindingum states vom server abzurufen musst du die folgende funktion verwenden
vis.conn.getStates(dps, function (error, states) { }
dps ist ein array mit ein oder mehreren datenpunkten
in states kommt dann ein array der datenpunkte als objekte zurück. -
@mickym Danke für deine Antwort! An diese Lösung habe ich auch schon gedacht. Ich dachte nur ich könnte mir so vielleicht unzählige Datenpunkte sparen (ist nicht der einzige Wert mit Variable, den ich ausgeben will)...
Aber wenn das Binding stattfindet bevor der Code ausgeführt wird, dürfte doch die "fixed" Ausgabe auch nicht klappen?
@OliverIO Auch danke für deine Antwort! Aber müsste dann nicht zumindest der Wert beim Start der view einmal gefunden werden - und sich später halt nicht ändern...?
-
@bluefish sagte in VIS html binding mit Variable:
@mickym Danke für deine Antwort! An diese Lösung habe ich auch schon gedacht. Ich dachte nur ich könnte mir so vielleicht unzählige Datenpunkte sparen (ist nicht der einzige Wert mit Variable, den ich ausgeben will)...
Aber wenn das Binding stattfindet bevor der Code ausgeführt wird, dürfte doch die "fixed" Ausgabe auch nicht klappen?
@OliverIO Auch danke für deine Antwort! Aber müsste dann nicht zumindest der Wert beim Start der view einmal gefunden werden - und sich später halt nicht ändern...?
In Node-Red gibt es so ein ähnliches Code Fragement, um im script Block die Bindung zu ermöglichen - ich denke es müsste im VIS ähnlich gehen, da ich glaube dass der Bindungsmechanismus ähnlich ist.
(function(scope){ scope.$watch('msg', function(msg) { .... }); })(scope);
Statt msg und function(msg) muss da was anderes stehen im VIS - aber das übersteigt meinen Horizont.
-
@bluefish sagte in VIS html binding mit Variable:
@mickym Danke für deine Antwort! An diese Lösung habe ich auch schon gedacht. Ich dachte nur ich könnte mir so vielleicht unzählige Datenpunkte sparen (ist nicht der einzige Wert mit Variable, den ich ausgeben will)...
Aber wenn das Binding stattfindet bevor der Code ausgeführt wird, dürfte doch die "fixed" Ausgabe auch nicht klappen?
@OliverIO Auch danke für deine Antwort! Aber müsste dann nicht zumindest der Wert beim Start der view einmal gefunden werden - und sich später halt nicht ändern...?
ja richtig, deswegen funktioniert ja auch die erste abfrage.
bei der 2. Abfrage steht der datenpunkt-name ja noch nicht fest, sondern wird erst bei Aufruf der funktion ermittelt. Das findet vis dann nicht.
vis sucht mit regex nach allem was sich zwischen den spitzen klammern befindet, macht ein paar Prüfungen und was dann übrigbleibt wird beim server angefragt. wenn dann dazu werte kommen, dann werden die auch angezeigt und danach bei änderung auch aktualisiert.in meinem vorigen post habe ich den code für das einmalige abfragen geschrieben. um die abfrage und automatische aktualisierung nachzubilden ist noch ein wenig mehr code notwendig und ist nicht ganz so benutzerfreundlich.
hier ein Beispiel aus meinen widgets
https://github.com/oweitman/ioBroker.tvprogram/blob/4a413bc434850ec667b52fa3c70689307d0e700a/widgets/tvprogram/js/tvprogram.js#L2222 -
@oliverio vielen Dank für die Rückmeldung und die Lösung, die ich allerdings nicht verstehe. (Was aber nicht an deiner Erklärung, sondern an meinen Kenntnissen liegt)
Daher muss ich wohl die Bindings im javascript Adapter zusammensetzen und halt in eigenen Datenpunkten ablegen. Die Lösung gefällt mir zwar nicht, ich finde sie nicht wirklich elegant...
Schade, dass es in vis keine einfachere Lösung gib mit Variablen auf Datenpunkte zuzugreifen.