NEWS
Werte on Objekten aktualisieren sich nicht
-
Hallo zusammen
Ich befasse mich seit kurzen mit iobroker und Javascript.
Ich übertrage ein Word, in welchem die 16 bit’s, Zustände von Ausgängen einer SPS sind (Lampen Steckdosen usw.). In iobroker möchte ich diese nun bitweise auslesen und Objekten zuweisen, welche ich dann in der Vis darstellen kann. Einmalig funktioniert das auch, jedoch werden die Werte bei Änderungen nicht aktualisiert. Was muss ich anpassen, dass die Werte aktualisiert werden? unterstehend mein bisheriger Code.Besten Dank im Voraus für eure Inputs.
var SPSOutWord_02 = getState('modbus.2.inputRegisters.30003_SPSEingangssWord_2').val; //Check of Bit in Word 1 oder 0 ist function BitCheck(Word, Bit) { if ((Word >> Bit)&1) return 1; else return 0;} // Bit Check SPS Ausgang Word 2 var word = 'QW00_' var schritt=0 var schrittst for (schritt = 0; schritt <16; schritt ++){ schrittst = String(schritt); if (schritt < 10){ schrittst = '0' + String(schritt);} else { schrittst = String(schritt);} createState('WagoSPS.Out.'+ word + schrittst); setState('WagoSPS.Out.'+ word + schrittst, BitCheck(SPSOutWord_02, schritt)); }
-
@chucky sagte:
werden die Werte bei Änderungen nicht aktualisiert.
Es fehlt der Trigger. getState() liest nur bei Skriptstart ein.
Anmerkung: In Javascript / ioBroker verwendet man keine binären Werte (0/1), sondern boolesche Werte (false/true).
-
@paul53 sagte in Werte on Objekten aktualisieren sich nicht:
Es fehlt der Trigger.
Ein Trigger ist
on()
oder auchsubscribe()
(ist beides dasselbe). -
Hallo UncleSam und paul53
Besten Dank für eure Rückmeldung und Hinweis.
OK. Das bedeutet, das Programm wird nicht zyklisch durchlaufen sondern reagiert nur auf einen Trigger?Ich habe ein paar Beispiele mit dem Trigger gefunden. Könnt ihr mir einen Tipp geben wie ich das mit der Schlaufe aufbauen kann?
-
@chucky sagte:
Könnt ihr mir einen Tipp geben
Etwa so:
const idWord2 = 'modbus.2.inputRegisters.30003_SPSEingangssWord_2'; const path = '0_userdata.0.WagoSPS.Out.QW00_'; function word2bits(word) { for (let schritt = 0; schritt < 16; schritt++){ let schrittst = String(schritt); if (schritt < 10) schrittst = '0' + schrittst; if(existsState(path + schrittst)) setState(path + schrittst, (word >> schritt) & 1, true); else createState(path + schrittst, (word >> schritt) & 1, {type: 'number', role: 'value'}); } } word2bits(getState(idWord2).val); // Skriptstart on(idWord2, function(dp) { word2bits(dp.state.val); });
Aber: @paul53 sagte in Werte on Objekten aktualisieren sich nicht: Anmerkung: In Javascript / ioBroker verwendet man keine binären Werte (0/1), sondern boolesche Werte (false/true):
const idWord2 = 'modbus.2.inputRegisters.30003_SPSEingangssWord_2'; const path = '0_userdata.0.WagoSPS.Out.QW00_'; function word2bits(word) { for (let schritt = 0; schritt < 16; schritt++){ let schrittst = String(schritt); if (schritt < 10) schrittst = '0' + schrittst; if(existsState(path + schrittst)) setState(path + schrittst, !!((word >> schritt) & 1), true); else createState(path + schrittst, !!((word >> schritt) & 1), {type: 'boolean', role: 'indicator'}); } } word2bits(getState(idWord2).val); // Skriptstart on(idWord2, function(dp) { word2bits(dp.state.val); });
-
Vielen Dank für das Beispiel. Habe es soeben getestet, funktioniert einwandfrei! Habe die werte "0 und 1" durch "true und false" ersetzt. Ebenfalls "number" durch "boolean".
Noch für mein Verständnis:
der Funktionsaufruf in Zeile 13, ruft die Funktion bei Skript Start auf.
Der Trigger "on" in Zeile 15, überwacht den Wert von "idword2" und ruft bei Veränderung die Funktion(in Zeile) wieder auf. Der Wert in Klammern (dp.state.val) bezieht sich auf "idWord2" von der Zeile 15?Ach übrigens: das Überprüfen des bestehendes Objekt mittels "existState" finde ich ein sehr elegante Lösung
-
@chucky sagte:
Funktionsaufruf in Zeile 13, ruft die Funktion bei Skript Start auf.
Ja.
@chucky sagte in Werte on Objekten aktualisieren sich nicht:
Der Trigger "on" in Zeile 15, überwacht den Wert von "idword2" und ruft bei Veränderung die Funktion(in Zeile) wieder auf.
Ja, wenn sich der Wert ändert.
@chucky sagte in Werte on Objekten aktualisieren sich nicht:
Der Wert in Klammern (dp.state.val) bezieht sich auf "idWord2" von der Zeile 15?
Ja, das ist der Wert des Trigger-Datenpunktes.
-
@paul53
Beten Dank für deine Rückmeldung und Hilfe, ist eine super Sache!Ich wünsche dir einen schönen Abend
Gruss Chucky