NEWS
[GELÖST] state auslesen und state setzen
-
Hi,
ich versuche mich gerade eine JS zu schreiben, ich möchte es irgendwann auch verstehen, die folgendes tun soll:
1. Aus "dwd.0.warning.text" auslesen was da steht und mit z.B. obj.newState.val == "FROST" vergleichen.
2. Wenn dies übereinstimmt, dann soll er einen Wert in ein neuen state schreiben.
Mein Versuch:
createState(idWarn, "", {type: 'string'}); schedule('1 0 * * *', function() on('dwd.0.warning.text', function(obj) { if (obj.newState.val == "FROST") { setState("Warn","1"); } if (obj.newState.val == "GLÄTTE") { setState("Warn","2"); } if (obj.newState.val == "STURM") { setState("Warn","3"); } } setState(idWarn, Warn);
Gruß,
Tom
-
const idWarn = 'DWD.Warnung'; createState(idWarn, "", {type: 'string'}); on('dwd.0.warning.text', function(obj) { var Warn = "0"; if (obj.newState.val == "FROST") Warn = "1"; if (obj.newState.val == "GLÄTTE") Warn = "2"; if (obj.newState.val == "STURM") Warn = "3"; setState(idWarn, Warn, true); });
-
Hi Paul,
danke für das Script, aber es wird kein State geschrieben obwohl dwd.o.warning.text = FROST ist.
Dann sollte doch unter Warn eine 1 stehen?
Gruß,
Tom
-
aber es wird kein State geschrieben obwohl dwd.o.warning.text = FROST ist. `
Der Trigger reagiert nur auf Änderung des Inhalts des Datenpunktes 'dwd.0.warning.text'. Solange der Inhalt auf konstant "FROST" bleibt, passiert nichts. Wenn bei Skriptstart der Datenpunkt "javascript.0.DWD.Warnung" auch gesetzt werden soll, dann muss das Script erweitert werden.const idWarn = 'DWD.Warnung'; const idText = 'dwd.0.warning.text'; function setWarn(obj) { var Warn = "0"; if (obj.newState.val == "FROST") Warn = "1"; if (obj.newState.val == "GLÄTTE") Warn = "2"; if (obj.newState.val == "STURM") Warn = "3"; setState(idWarn, Warn, true); } createState(idWarn, "", {type: 'string'}, function() { var dp = getObject(idText); dp.newState = getState(idText); setWarn(dp); }); on(idText, setWarn); // Triggert bei Wertänderung
-
Anmerkung: Gibt es einen Grund, weshalb Du den Ziel-Datenpunkt vom Typ "string" deklariert hast ? Typ "number" wäre naheliegender.
Du benutzt die "veraltete" Eigenschaft newState, die zwar (aus dem Grund der Kompatibilität) gültig ist, aber schon seit einiger Zeit durchdie Eigenschaft state ersetzt wurde. In meiner Schreibweise benutze ich den Variablenbezeichner dp für Datenpunkte, die sämtliche Eigenschaften wie common, native, type, state und oldState enthalten. Deshalb modifiziere ich das letzte Script in diese Richtung:
const idWarn = 'DWD.Warnung'; const idText = 'dwd.0.warning.text'; function setWarn(dp) { var Warn = 0; if (dp.state.val == "FROST") Warn = 1; if (dp.state.val == "GLÄTTE") Warn = 2; if (dp.state.val == "STURM") Warn = 3; setState(idWarn, Warn, true); } createState(idWarn, 0, {type: 'number'}, function() { var obj = getObject(idText); obj.state = getState(idText); setWarn(obj); }); on(idText, setWarn); // Triggert bei Wertänderung
-
Guten Morgen Paul,
erstmal, Danke, Danke und nochmal Danke.
Der Grund warum ich den Typ "String" gewählt habe ist Copy&Paste…
Ich versuche gerade endlich Javascript zu verstehen und zu Lernen und deswegen versuche ich mich an kleinen Scripts um zu verstehen wie sieh funktionieren.
Es ist für mich sehr Hilfreich das du mir auch bestimmte Zustände erklärt hast, wie z.B. das der Datenpunkt erst Aktuallisiert wird wenn er geändert wird und mir aber auch aufzeigst wie mann dies erzwingen kann.
Vielen Dank, da habe ich wieder etwas gelernt!
Schöne Ostern und Gruß,
Tom