NEWS
getState im vis Script
-
Hallo,
als newbie versuche ich im js eines vis Buttons einen Datenpunkt auszulesen.
Mit getState probiert, no luck.
Dies bringt den richtigen Wert eines selbstdefinierten DP: var Clima=vis.states.attr('0_userdata.0.AutoStatusClima.val');
Dies : var Clima=vis.states.attr('bmw.0.xxxxxxxxxx.state.climateControlState.activity.val'); bringt "undefined" (mit oder ohne dem ".val")Was mache ich falsch? Wie geht's richtig?
Besten Dank! -
@mike1429 sagte in getState im vis Script:
var Clima=vis.states.attr('0_userdata.0.AutoStatusClima.val');
versuche mal
var Clima=getState('0_userdata.0.AutoStatusClima').val;
Ro75.
-
Den Wert kann ich ja schon ermitteln, mein Problem ist, wie ich den Wert von 'bmw.0.xxxxxxxxxx.state.climateControlState.activity' auslese.
-
@mike1429 sagte in getState im vis Script:
vis.states.attr('bmw.0.xxxxxxxxxx.state.climateControlState.activity.val');
du bist schon auf der richtigen fährte.
allerdings musst du vis dazu bringen, den state auch zu abonnieren. nur dann
steht da auch ein wert drinfrüher wurden nur alle datenpunkte beim ersten aufruf eines vis-projektes abonniert.
mittlerweile gibt es wohl auch eine javascript funktion, mit der man nachträglich das auch noch machen kann. die habe ich mir aber noch nicht angeschaut.
daher der einfachste weg der auch funktioniert ist, du packst irgendwo ein widget hin und trägst dort die object id ein. dann müsste es funktionieren.warum willst du diesen wert den auslesen? diese tricks sollten normalerweise nicht notwendig sein, da du für viele usecases auch widgets hast, bei denen du dich da nicht drum kümmern musst
der vorgeschlagene getStates Befehl gibt es unter vis so direkt nicht.
Man kann den schon ausführen, ist aber etwas komplitzierter, da man an den server über das connection objekt eine nachricht schicken muss und dann auf dem rückweg den wert erhält (geht auch mit den anderen iobroker befehlen, sollte man sich aber 3x überlegen ob es keinen anderen weg gibt) -
@oliverio
Vielen Dank, OliverIO !
werde das mit dem Widget probieren.Warum ich den Weg gehe? Die Idee ist, ein Symbol (Lüfter) für die Standklimatisierung des E-Autos in vis bauen, dass wie folgt reagiert:
...Wenn das Symbol grau ist (also Klima aus), drauf klicken um einschalten. Dann wird das Symbol auch rot oder blau (also heizen oder kühlen)
...Wenn das Symbol farbig ist, drauf klicken und ausschalten.
...Wenn die Klimatisierung über die BMW App ein- oder ausgeschaltet wird, soll das Symbol auch entsprechend gesetzt werden.Geht das auch anders?
-
ja das geht auch anders.
für reinen an/aus knopf mit bild kann man aus den hqwidgets den On/Off Button nehmen.
Da kannst du direkt ein Bild für Aus definieren.
Bei an, würde ich dann einen Hilfs-Datenpunkt definieren und im widget diesen Datenpunkt per Binding verbinden.
In einen skript im javascript-adapter wird dann festgestellt, welches An-Bild da angezeigt werden soll (rot oder blau). Der Dateiname wird dann in diesen Hilfsdatenpunkt geschrieben, das widget bekommt das dann über die bindingkonstruktion mit und aktualisiert das bild im client.Woran stellt man fest ob rot oder blau angezeigt werden soll, wenn An?
-
@oliverio
Werde ich auf jeden Fall probieren, wobei es nicht weniger komplex klingt, wie was ich gemacht habe.
Rot ist Heizung, Blau Kühlung. Der Wert im 'bmw....activity' steht entweder "INACTIVE", "HEATING" oder "COOLING".
Eine kleine Komplikation kommt dazu...das Symbol kann auch gelb sein, also neuer Status ans Auto gesendet, noch nicht bestätigt.
Passt so OliverIO, hab was dazu gelert, danke! -
ok, dann musst du im javascript diese verschiedenen zustände auswerten und den richtigen bildnamen in den datenpunkt reinschreiben.
bei dem gelben symbol müsstest du wahrscheinlich noch die ack-information des datenpunktes auswerten. false=wert ist gesetzt aber noch nicht bestätigt, true=wert wurde gesetzt und durch den adapter/bzw des eigentlichen gerätes bestätigt.das mag zwar gleich komplex sein, aber es ist der vis-Weg.
Der vis-weg sollte für die zukunft auch noch möglich sein.
die javascript-funktionen mit vis.states.attr sind sozusagen inoffiziell und nicht dokumentiert. d.h. es besteht in zukunft keine garantie, das es so bleibt.aktuell wird vis2 entwickelt. vis2 verwendet react, also ein komplett anderes framework. man hat glück, das eine kleine kompatibilitätsschicht eingefügt wurde, so das vis1 dinge noch funktionieren, aber es hätte auch anders kommen können.