NEWS
VIS-2: vis.states[] liefert beim 1. Aufruf immer undefined
-
Hallo,
bin ziemlich neu in ioBroker. Aber komme gut voran. Ziel ist, in VIS-2 einen DP auszulesen und davon abhängig etwas zu schalten.
Zum Test habe ich das hier gemacht (geht kein Bildschirm an, nennt sich nur so):
<div onclick="toggleBildschirm();" style="cursor: pointer;"> Wert: {0_userdata.0.System.Bildschirm_an} </div> <script> function toggleBildschirm() { let currentValue = vis.states['0_userdata.0.System.Bildschirm_an.val']; console.log('Wert ' + currentValue); vis.setValue("0_userdata.0.System.Bildschirm_an", currentValue ? false : true); } </script>
Problem: Beim 1. Mal, wenn ich hier auf das Widget klicke, kommt immer "undefined" im log. Danach geht es, wie es soll.
Interessant hierbei: Ich habe in vielen Beiträgen gelesen, dass man den DP als Binding in einem anderen Widget braucht, um so drauf zuzugreifen. Aber zum einen geht das auch ohne (der DP wird beim 1. Aufruf von vis.states wohl automatisch abonniert) und zum anderen geht es nie ohne undefined beim 1. Aufruf, selbst wenn der DP sogar in genau diesem Widget ein Binding ist, wie oben, auch nicht in einem anderen Widget.
Wie kriege ich das mit dem undefined weg? Viele Dank!
-
stimmt, habe ich ausprobiert.
Meiner Meinung nach ist das ein Fehler.Bei vis1 wurden alle widgets bei vis start darauf untersucht ob irgendwo object IDs stehen.
Diese wurden beim server abonniert und sobald dann die werte eintrudeln dann in vis aktualisiert.
Hier passiert das abonnieren und aktualisieren zwar, aber vis.states wird nicht aktualisiert.
Das vis Objekt unter vis2 ist eigentlich nur eine kompatibilitäts abbildung um mit vis1 kompatibel zu bleiben. das passiert in diesem fall nicht.Am besten da mal schaun ob es auf github schon ein issue gibt und ggfsl einen anlegen.
workaround wäre platziere ein nicht sichtbares widget bspw basic bool checkbox und trage den datenpunktnamen ein. dann ist die information auch beim ersten mal in vis.states verfügbar.
allerdings wohl nur mit "true" als string.zum testen kannst du direkt als erste zeile der funktion toggleBildschirm
debugger;
eintragen, dann kannst du in der web devloper console direkt debuggen
-
@oliverio Vielen Dank. Mit einer Bool-Checkbox geht es tatsächlich sofort korrekt, sowohl false als auch true. Ich dachte, es müsste auch gehen, wenn man ein Binding macht, z.B. mit
{0_userdata.0.System.Bildschirm_an}
in einem einfachen HTML Widget. Aber damit geht es nicht. Oder hab ich das falsch verstanden? Ist das der Fehler, von dem Du sprichst?
Da ich noch etliche solcher DP auf diese Weise nutzen will (anklickbare HTML-Widgets), was wäre denn da das sinnvollste Vorgehen, um diese alle auf einmal direkt verfügbar zu machen? Geht das irgendwie mit einem Seiten-Skript, mit dem man die gebündelt einbindet?
-
@koilapo
Nein, das so zu notieren sollte schon gehen und in vis1 funktioniert das auch.