NEWS
Abfrage MQTT Variable
-
Hallo Forum,
anbei ein Bild, hier möchte ich den COUNTER C1 Wert abfragen, leider konnte ich nichts zur korrekten Syntax finden,
wie Heisst die genaue Variable um mit dieser in einem Java Script weiterarbeiten zu koennen? -
-
@codierknecht Danke fuer die Schnelle Antwort!
um wieder in das ganze thema Java einzusteigen wollte ich noch den Korrekten Zählerstand in die
Uservariable schreiben... irgendwo scheint hier noch etwas zu haken...
desweiteren Stelle ich mir die Frage, wie oft wird das Script pro Zeiteinheit ueberhaupt ausgefuehrt? -
@neueklasse sagte in Abfrage MQTT Variable:
desweiteren Stelle ich mir die Frage, wie oft wird das Script pro Zeiteinheit ueberhaupt ausgefuehrt?
So wird das Ganze nur 1x beim Start des Script ausgeführt.
Du brauchst einen Trigger, der auf Änderungen reagiert.on({id: "mqtt.0.tele.Gascounter.SENSOR", change: "ne"}, async function (obj) { var GascounterESP32 = getAttr(obj.state.val, 'Counter.C1'); // hier Dein Code });
By the way: Scripte und Ausgaben aus Log oder Terminal nicht als Screenshot sondern in Code-Tags </> posten.
Nicht jeder hat Lust, das Ganze nochmal abzutippen. Und auf dem Handy sind Screenshots nur schwer lesbar. -
@codierknecht ahh... ok Danke,
var CounterCalc = 0; on({id: "mqtt.0.tele.Gascounter.SENSOR", change: "ne"}, async function (obj) { // trigger var GascounterESP32 = getAttr(obj.state.val, 'Counter.C1'); // write state into Variable CounterCalc = (GascounterESP32 / 10); // calculation setState('0_userdata.0.Gaszaehler.Gaszaehlerstand'/*Gaszaehlerstand*/,CounterCalc); // calculated value into uservalue });
könntest Du mir noch bitte sagen wieso er die uservariable mit setState nicht überschreibt mit CounterCalc?
-
@neueklasse
Könnte man noch etwas vereinfachen:on({id: "mqtt.0.tele.Gascounter.SENSOR", change: "ne"}, async function (obj) { setState('0_userdata.0.Gaszaehler.Gaszaehlerstand', parseInt(getAttr(obj.state.val, 'Counter.C1')) / 10); });
Der Wert wird geschrieben, sobald sich der der DP
mqtt.0.tele.Gascounter.SENSOR
das nächste mal ändert.
Wenn das Script gestartet wird, solltest Du im Log etwas mit1 Subscriptions
sehen. -
@neueklasse sagte in Abfrage MQTT Variable:
@codierknecht Danke fuer die Schnelle Antwort!
um wieder in das ganze thema Java einzusteigen ….
Du steigst nicht in Java ein, sondern in Javascript. Das ist ein gewaltiger Unterschied.
-
@mickym Stimmt!
javascript.0 (193) script.js.User_Scripts.Gascounter: setForeignState(id=0_userdata.0.Gaszaehler.Gaszaehlerstand, state={"val":null,"ack":false,"ts":1675419639482,"q":0,"from":"system.adapter.javascript.0","lc":1675419639482,"c":"script.js.User_Scripts.Gascounter"})
auf die vorherige sowie 'kurze' variante gibt es eine subscription, aber bei value steht "null" drin. (oben gezeigter Log)
-
@codierknecht
getAttr() wurde für Blockly entwickelt und wird in Javascript nicht benötigt.@neueklasse sagte in Abfrage MQTT Variable:
wie oft wird das Script pro Zeiteinheit ueberhaupt ausgefuehrt?
Man benötigt einen Trigger.
const idSensor = 'mqtt.0.tele.Gascounter.SENSOR'; const idZaehler = '0_userdata.0.Gaszaehler.Gaszaehlerstand'; on(idSensor, function(dp) { let zaehler = Math.round(dp.state.val.Counter.C1) / 10; setState(idZaehler, zaehler, true); });
-
hier bekomme ich einen
error javascript.0 (193) at Object.<anonymous> (script.js.User_Scripts.Gascounter:8:51)
(in Zeile 8 befindet sich "let zaehler =")
hatte vorher einen Denkfehler, das durch 10 Teilen ist falsch.. ich moechte hier nur von
Integer auf float (statt 1234567 auf 12345.67) -
@neueklasse sagte: nur von Integer auf float (statt 1234567 auf 12345.67)
Dann kann das Runden weggelassen werden. Laut erstem Beitrag muss "COUNTER" groß geschrieben werden.
const idSensor = 'mqtt.0.tele.Gascounter.SENSOR'; const idZaehler = '0_userdata.0.Gaszaehler.Gaszaehlerstand'; on(idSensor, function(dp) { let zaehler = dp.state.val.COUNTER.C1 / 100; setState(idZaehler, zaehler, true); });
-
@paul53 COUNTER Grossgeschrieben, das hatte ich auch versucht, ändert leider nichts an dem Error
-
@paul53 sagte in Abfrage MQTT Variable:
getAttr() wurde für Blockly entwickelt und wird in Javascript nicht benötigt.
Danke für den Hinweis - sollte aber doch trotzdem funktionieren.
Das hier funzt jedenfalls einwandfrei:
const idSensor = 'mqtt.0.tele.Gascounter.SENSOR'; const idZaehler = '0_userdata.0.Gaszaehler.Gaszaehlerstand'; on({id: idSensor, change: "ne"}, async function (obj) { let zaehler = parseInt(getAttr(obj.state.val, "COUNTER.C1")) / 100; setState(idZaehler, zaehler, true); });
-
@codierknecht Jap, das funzt! Danke,
@paul53 mich würde trotzdem interessieren wieso es ohne die getAttr im moment noch nicht geht.
-
@neueklasse sagte: ändert leider nichts an dem Error
Dann enthält der Datenpunkt kein Objekt, sondern ein JSON.
const idSensor = 'mqtt.0.tele.Gascounter.SENSOR'; const idZaehler = '0_userdata.0.Gaszaehler.Gaszaehlerstand'; on(idSensor, function(dp) { let zaehler = JSON.parse(dp.state.val).COUNTER.C1 / 100; setState(idZaehler, zaehler, true); });
-
@paul53 sagte in Abfrage MQTT Variable:
Dann enthält der Datenpunkt kein Objekt, sondern ein JSON.
Davon war ich bei MQTT einfach mal ausgegangen
-
@neueklasse sagte in Abfrage MQTT Variable:
mich würde trotzdem interessieren wieso es ohne die getAttr im moment noch nicht geht.
Mich auch
-
@neueklasse sagte: wieso es ohne die getAttr im moment noch nicht geht.
Es fehlte JSON.parse().
-
@paul53
Jepp - wenn man dann auch die korrekte Groß- und Kleinschreibung verwendet, klappt's auch mit dem Nachbarn
In meinem Test-DP stand das noch alsCounter
. -
@paul53, @Codierknecht Funktionieren beide! Danke ihr Beiden!!
ist das hier der richtige thread für... gibt es eine moeglichkeit von einer
zahl z.b. 32,4 in der VIS nur die 2. Stelle auszugeben?also bei ems-esp.0.boiler.actual boiler temperature => hier betraegt die Object ID 32,4. wenn ich nur die 2. Stelle anzeigen lassen wollen würde, gibt es hier eine möglichkeit, oder muss ich separate Variablen erstellen in die ich per script die einzelnen stellen verteile?