Hallo.
Ich habe ein Script, welches Batteriewerte meiner Sensoren und Schalter aggregiert und in eigenen Datenpunkten ablegt. Leider funktioniert das Script nicht wie erwartet und ich verstehe nicht wieso. Ich habe das Problem in einem Repro extrahiert und würde mich freuen, wenn ihr mal draufschauen könntet und mir meinen Fehler zeigt.
Erwartetes Verhalten:
- Datenpunkt wird mit der Clear()-Methode gelöscht
- Der Datenpunkt enthält ein leeres serialisiertes JSON-Array
- Ein string ("test1") wird dem Datenpunkt mit der Add()-Methode hinzugefügt
- Der Datenpunkt enthält ein serialisiertes JSON-Array mit einem Item: "test1"
Beobachtetes Verhalten:
- Run, Clear() ist erfolgreich
11:16:10.846 info javascript.0 (27065) Start javascript script.js.dev.mvp
11:16:10.853 info javascript.0 (27065) script.js.dev.mvp: add: [] | | test1
11:16:10.853 info javascript.0 (27065) script.js.dev.mvp: content: []
11:16:10.853 info javascript.0 (27065) script.js.dev.mvp: registered 0 subscriptions and 0 schedules
11:16:10.856 info javascript.0 (27065) script.js.dev.mvp: arrayjavascript.0.DEV.repro cleared: []
11:16:10.856 info javascript.0 (27065) script.js.dev.mvp: added test1 to list
- Run, Clear() ist nicht erfolgreich
11:16:43.390 info javascript.0 (27065) Start javascript script.js.dev.mvp
11:16:43.397 info javascript.0 (27065) script.js.dev.mvp: add: ["test1"] | test1 | test1
11:16:43.397 info javascript.0 (27065) script.js.dev.mvp: content: ["test1"]
11:16:43.397 info javascript.0 (27065) script.js.dev.mvp: registered 0 subscriptions and 0 schedules
11:16:43.399 info javascript.0 (27065) script.js.dev.mvp: arrayjavascript.0.DEV.repro cleared: ["test1"]
Script:
createState("DEV");
createArray("DEV.repro");
Test();
function Test() {
const id = "javascript.0.DEV.repro";
let data = "test1";
Clear(id);
Add(id, data);
Remove(id, data);
Add(id, "test2");
log("content: " + getState(id).val);
}
function createArray(name) {
let data = [];
createState(name, "", {
read: true,
write: true,
desc: "Beschreibung",
type: "string",
def: JSON.stringify(data)
});
}
function Add(array, value) {
let data = [];
let raw = getState(array).val;
if(raw.length > 2) {
data = JSON.parse(raw);
}
log("add: " + raw + " | " + data + " | " + value);
if(!data.includes(value)) {
data.push(value);
setState(array, JSON.stringify(data));
log("added " + value + " to list");
}
}
function Clear(array) {
let data = [];
log(JSON.stringify(data));
setState(array, JSON.stringify(data));
log("array" + array + " cleared: " + getState(array).val);
}
Workarounds
Ich hatte die Vermutung, dass es sich um ein Timing-Problem handelt und habe daher versucht, beim setState() mit Callbacks zu arbeiten. Leider ändert sich nichts, laut Log. Clear() ist immer nur jedes zweite Mal erfolgreich.
function Clear(array, callback) {
let data = [];
setState(array, JSON.stringify(data), false, callback);
}
...
Clear(id, function() {
log("array" + id + " cleared: " + getState(id).val);
Add(id, data, function() {
log("content: " + getState(id).val);
});
});
...
Was mache ich falsch?