NEWS
setState mit eigenem Kennzeichen versehen
-
Hallo
wie kann man dem Wert eines Objektes mitgeben (eigene ID) wer den Wert geschrieben hat?Hintergrund ist ein allgemeiner Alarm-Auslöser, der von mehreren Scripten beschrieben werden kann.
Wenn der Alarmzustand eines Scriptes beendet ist, dann soll der Alarm nur dann gelöscht werden können,
wenn der letzte Alarmauslöser auch von diesem Script gesetzt wurde.Oder gibt es hierzu eine elegantere Methode, z.B. dass der letzte Alarm angezeigt wird, bis
alle Auslöser ihren Alarm auch wieder gelöscht haben, das wäre ideal.
Wobei der Alarm verschiedene Typen haben soll, z.B. Alarm 4 von ID 333, Alarm 1 von ID 555 usw.setState("javascript.0.zigbee.0.AlarmLicht", {val: 3, ID: xyz})
-
@hanss sagte:
setState("javascript.0.zigbee.0.AlarmLicht", {val: 3, ID: xyz})
Datenpunkte vom Typ "Objekt" können es aufnehmen. Aber nicht den Bezeichner val im Objekt verwenden, denn val hat in Datenpunkten eine besondere Bedeutung.
-
@paul53
Ich kriegs einfach nicht hin.
Wann verwendet man denn getState und getObject?createState("javascript.0.zigbee.0.Test", { name: "objekt", type: 'object', }); var Alarm = { Wert: 0, Last: '' }; Alarm.Wert = 5 Alarm.Last = "Heizung" setState("javascript.0.zigbee.0.Test", Alarm) Alarm = getObject("javascript.0.zigbee.0.Test") var x = Alarm.Wert var y = Alarm.Last log("Lesen- Wert: " + x + " Last: "+y)
-
@hanss
createState() und setState() arbeiten asynchron, was bedeutet, dass man nicht sofort den Wert mit getState() einlesen kann. Man erhält den "alten" Wert. -
@hanss sagte:
Alarm = getObject("javascript.0.zigbee.0.Test")
ist falsch. Richtig:
Alarm = getState("javascript.0.zigbee.0.Test").val;
Besser:
on("javascript.0.zigbee.0.Test", function(dp) { Alarm = dp.state.val; log("Lesen- Wert: " + Alarm.Wert + " Last: " + Alarm.Last); });
-
@paul53 sagte in setState mit eigenem Kennzeichen versehen:
@hanss sagte:
Alarm = getObject("javascript.0.zigbee.0.Test")
ist falsch. Richtig:
Alarm = getState("javascript.0.zigbee.0.Test").val;
Und wie erhalte ich dann:
var x = Alarm.Wert // Fehlermeldung -
@hanss sagte:
Und wie erhalte ich dann:
var x = Alarm.Wert // FehlermeldungGenau so. Bringt der Compiler eine Fehlermeldung, Javascript zur Laufzeit oder der Editor ? Eine rote Wellenlinie im Editor kannst Du ignorieren.
-
@paul53
zur Laufzeit: TypeError: Cannot read property 'Wert' of nullEs ist auch im Objekt nichts von Alarm oder Wert oder Last eingetragen:
{ "common": { "name": "objekt", "type": "object", "unit": "", "role": "state" }, "native": {}, "type": "state", "from": "system.adapter.javascript.0", "user": "system.user.admin", "ts": 1584874455228, "_id": "javascript.0.zigbee.0.Test", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" } }
-
@hanss sagte:
Cannot read property 'Wert' of null
Nach einem 2. Script-Start sollte der Fehler nicht mehr kommen, da dann setState() den Wert geschrieben hat.
-
@hanss sagte:
Es ist auch im Objekt nichts von Alarm oder Wert oder Last eingetragen:
Das darf auch nicht im statischen Objekt erscheinen, sondern im Zustand (state) des Datenpunktes.
-
Egal wie oft ich dieses Script starte, der Fehler erscheint immer:
createState("javascript.0.zigbee.0.Test", { name: "objekt", type: 'object', }); var Alarm = { Wert: 0, Last: '' }; Alarm.Wert = 4 Alarm.Last = "Heizung" setState("javascript.0.zigbee.0.Test", Alarm) Alarm = getState("javascript.0.zigbee.0.Test").val; var x = Alarm.Wert var y = Alarm.Last log("Lesen-Wert: " + x + " Last: "+y)
-
@hanss sagte:
Egal wie oft ich dieses Script starte, der Fehler erscheint immer:
Das Script läuft unter der Instanz javascript.0 ?
-
@paul53
Jawohl -
@hanss
Welche Javascript-Version ? -
Wenn du der einzige bist, der den State beschreibt, dann schreib doch einfach Ein JSON Objekt mit zwei Attributen rein (Value und Source)
Dann musst du nicht so viel rum experimentieren -
@paul53
Node.js: v10.19.0 Script Engine 4.4.3 -
@hanss sagte:
Node.js: v10.19.0 Script Engine 4.4.3
Damit muss es funktionieren so wie mit meiner Version 4.4.0.
-
@paul53
Könntest Du freundlicherweise einmal das Script von oben einmal bei Dir laufen lassen?
(Egal wie oft ich dieses Script starte, der Fehler erscheint immer:)Jetzt funktionierts, ich weis aber nicht warum, ich habe nur die Kommentare aus dem
Script gelöscht.Vielen, vielen Dank.
-
@hanss sagte:
setState("javascript.0.zigbee.0.Test", Alarm)
Hat auch bei mir nicht funktioniert.
setState("javascript.0.zigbee.0.Test", Alarm, true);
funktioniert.
-
@paul53
Du hast recht, das true macht´s aus.
Mann, da war die MSBasic Syntax ja richtig einfach dagegen.