NEWS
getState() in Callback von createState() gibt not found
-
Hallo allerseits,
ich hab eine kurze Frage zu callbacks: Nach meinem Verständnis wird alles in der callback-Funktion erst aufgerufen nachdem der auslösende Befehl vollständig durchgelaufen ist. Beim Testen mit createState() hab ich aber das Problem dass ein getState() immer den Fehler "... not found" zurückgibt. Hier ein einfaches Testskript:
createState('javascript.0.variables.test', 'test init', {name: 'test Variable'}, function(){ console.log(getState('javascript.0.variables.test').val) })
Hier die dazugehörige Fehlermeldung:
javascript.0 2021-12-15 14:12:23.429 info script.js.common.Hilfsskripte.test: null javascript.0 2021-12-15 14:12:23.429 warn at processImmediate (internal/timers.js:466:21) javascript.0 2021-12-15 14:12:23.428 warn at Immediate._onImmediate (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:342:38) javascript.0 2021-12-15 14:12:23.428 warn at Object.<anonymous> (script.js.common.Hilfsskripte.test:6:17) javascript.0 2021-12-15 14:12:23.426 warn getState "javascript.0.variables.test" not found (3) javascript.0 2021-12-15 14:12:23.356 info script.js.common.Hilfsskripte.test: registered 0 subscriptions and 0 schedules
Benutze ich hingegen ein setState im callback gibt es keinen Fehler beim setzen des neues Werts (und der Wert wird auch korrekt geschrieben), die getState-Funktion ist aber immer noch "zu schnell" und kann den State nicht finden. Mache ich etwas falsch oder funktionieren callbacks doch anders als ich dachte? Hoffe jemand kann mir helfen.
-
Hi,
Fehlermeldung kommt bei mir auch (JS-Adapter v5.2.16, node.js 14.17.1).
Dein Aufbau steht ja so in der Doku als "short type":
createState('myVariable', 1, {name: 'My own variable', unit: '°C'})
- create variable if does not exist with specific name and unitsWas geht ist, wenn du
initialValue
im "Common"-Teil indef
(=Default) übergibst.
Hier ein Beispiel mit Callback, und ein zweites mit async/await.const state123 = '0_userdata.0.test123'; createState(state123, {name:'test variable', def:'test init', type:'string', read:true, write:true, role:'state' }, (obj) => { log(`Value of ${state123}: '${getState(state123).val}'`); }) // Und noch Test per async/await test(); async function test() { try { const state456 = '0_userdata.0.test456'; await createStateAsync(state456, {name:'test variable', type:'string', read:true, write:true, role:'state', def:'test init' }); const r = await getStateAsync(state456); log(`Value of ${state456}: '${r.val}'`); } catch(error) { log(error.stack, 'warn'); } }
Fazit soweit:
createState() / createStateAsync() mag wohlinitialValue
als zweiten Parameter nicht, wenn als dritter Parameter das common-Objekt folgt.
Bin mir nicht sicher ob ein das an unklarer Doku ist, oder tatsächlich ein Bug. -
@acgua sagte: unklarer Doku ist, oder tatsächlich ein Bug.
Das ist ein Bug.
-
@paul53 said in getState() in Callback von createState() gibt not found:
Das ist ein Bug.
Hab Issue aufgemacht: Github: ioBroker.javascript issue #924
-
@paul53 sagte in getState() in Callback von createState() gibt not found:
Das ist ein Bug.
sehr seltsam, ich kann das nicht nachvollziehen, weder in javascript.0.variables(wo eig. kein eigener DP hingehört), noch in 0_userdata.0. Getestet mit dem script aus dem ersten Post und der heute erschienenen JS 5.2.18
18:10:24.893 info javascript.1 (21510) Start javascript script.js.Forum.test1234 18:10:24.899 info javascript.1 (21510) script.js.Forum.test1234: registered 0 subscriptions and 0 schedules 18:10:24.912 info javascript.1 (21510) script.js.Forum.test1234: setForeignState(id=javascript.0.variables.test1234, state={"val":"test init","ack":true,"c":"script.js.Forum.test1234"}) 18:10:24.962 info javascript.1 (21510) script.js.Forum.test1234: getState(id=javascript.0.variables.test1234, timerId=undefined) => {"val":"test init","ack":true,"ts":1639588224920,"q":0,"c":"script.js.Forum.test1234","from":"system.adapter.javascript.1","user":"system.user.admin","lc":1639588224920} 18:10:24.963 info javascript.1 (21510) script.js.Forum.test1234: test init
-
@fastfoot sagte: ich kann das nicht nachvollziehen
Stimmt, ich auch nicht:
Javascript v5.2.13.
Man sollte doch erst testen, bevor man eine Aussage trifft. -
@paul53 sagte in getState() in Callback von createState() gibt not found:
Stimmt, ich auch nicht:
@apollon77 hat es mittlerweile im issue erklärt, scheint ein timing problem zu sein, welches wir dann wohl nicht haben
-
Das mit dem Timing-Problem macht sehr viel Sinn, ist ein Raspberry Pi 3 mit relativ wenig freiem Arbeitsspeicher und vielen anderen Skripten die im Hintergrund laufen. Habe vor kurzem die States auch auf Redis umgestellt, was evtl. auch eine zusätzliche Verzögerung bedeuten kann (?). Werde mal probieren den Initialwert mit def zu übergeben sobald ich wieder Zeit habe, danke für eure Hilfe.