NEWS
[gelöst] Seltsames Verhal. von "für jeden Wert a. d. Liste"
-
Hallo zusammen,
zuerst einmal die Daten meines Systems:
Iobroker ist parallel zu OMV auf einem Selbstbau-NAS installiert und läuft seit Jahren Problemlos.node / nodejs: 21.2.0
npm: 10.2.3
der iobroker-Version (js-controller) zu finden unter Hosts: 5.0.16
des admin-Adapters: 6.12.0
Linux-Version: Debian Bullseyeich habe das Problem, daß ein Blockly-Script nicht wie erwartet funktioniert.
Zuerst einmal das Blockly als Bild und dann noch der zugehörige Javascript-Code.
Darunter folgen dann Erklärungen zum Script.for (var j_index in Raum) { j = Raum[j_index]; Parameter = Raum.indexOf(j) + 1; Parameter = String(ParamId[(Parameter - 1)]) + ':1'; console.log(j); console.log(Parameter); Raumtext = ['0_userdata.0.General.Heizgruppen.',j,'.P'].join(''); console.log(Raumtext); sendTo('hm-rpc.1', 'getParamset', { 'ID': Parameter, 'paramType': 'MASTER' }, async (result) => { ERGEBNIS = result; console.log(ERGEBNIS); }); console.debug("hm-rpc.1: " + ""); }
Ziel des Scriptes:
Das Script soll nacheinander mehrere Datensätze aus einer Raspberrymatic lesen und diese weiterverarbeiten.
Der Teil zum weiterverarbeiten funktioniert und ist daher hier nicht mit aufgeführt.Die Listen:
Die Liste "Raum" enthält die Werte "EG.BZ" und "EG.WZ"
Die Liste "ParamId" enthält die Werte "INT0000002" und "INT0000004"Erwartetes verhalten des Scriptes:
Für jeden Wert der Liste Raum werden die Befehle innerhalb der Schleife der Reihe nach ausgeführt.
1.) Zuerst wird die Position des Schleifenwertes in der Liste "Raum" ermittelt, um dann in der Folgezeile den Wert an der gleichen Position in der Liste "ParamId" zu bekommen.
Ergebnis: Wertepaarungen "EG.BZ - INT0000002" und "EG.WZ - INT0000004" funktioniert einwandfrei.
2.) Das setzen der Variable "Raumtext" ist hier nebensächlich und wird nur im nicht dargestellten Teil des Scriptes benötigt
3.) In jedem Schleifendurchgang soll jetzt mit dem SendTo-Befehl an hm-rpc.1 das Ergebnis-Json abgerufen und ausgegebe werden.
Auch das funktioniert für sich gesehen einwandfrei. Der Aufruf liefert das korrekte Ergebnis zurück.Es soll also im Endeffekt für jeden Raum das entsprechende Ergebnis-Json abgerufen und ausgegeben werden.
Das Problem:
Es wird, so wie es aussieht, zuerst zweimal die Positionen 1.) und 2.) ausgeführt.
Erst danach springt das Script in den SendTo-Teil und führt diesen zweimal aus.
Ich hatte das dadurch festgestellt, daß ich die Variable "Raumtext" im SendTo-Teil nochmals hatte ausgeben lassen und folgende Ausgabe bekam:23:06:34.881 info javascript.0 (643292) Start javascript script.js.common.test103 23:06:34.883 info javascript.0 (643292) script.js.common.test103: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 23:06:34.886 info javascript.0 (643292) script.js.common.test103: EG.BZ 23:06:34.886 info javascript.0 (643292) script.js.common.test103: INT0000002:1 23:06:34.886 info javascript.0 (643292) script.js.common.test103: 0_userdata.0.General.Heizgruppen.EG.BZ.P 23:06:34.886 info javascript.0 (643292) script.js.common.test103: EG.WZ 23:06:34.886 info javascript.0 (643292) script.js.common.test103: INT0000004:1 23:06:34.886 info javascript.0 (643292) script.js.common.test103: 0_userdata.0.General.Heizgruppen.EG.WZ.P 23:06:34.924 info javascript.0 (643292) script.js.common.test103: {'result':{'P2_ENDTIME_THURSDAY_7':1440, ... ,'P5_TEMPERATURE_THURSDAY_10':17},'error':null} 23:06:34.924 info javascript.0 (643292) script.js.common.test103: 0_userdata.0.General.Heizgruppen.EG.WZ.P 23:06:34.949 info javascript.0 (643292) script.js.common.test103: {'result':{'P2_ENDTIME_THURSDAY_7':1440, ... ,'P5_TEMPERATURE_THURSDAY_10':17},'error':null} 23:06:34.949 info javascript.0 (643292) script.js.common.test103: 0_userdata.0.General.Heizgruppen.EG.WZ.P
Die beiden JSON-Ausgaben habe ich stark eingekürzt, weil jede mehrere hundert Positionen beinhaltet.
Meine Frage ist jetzt, wie dieses seltsame Verhalten zu erklären ist und wie ich es abstellen kann.
Ich habe IoBroker jetzt seit ca. 3 Jahren laufen und auch schon jede Menge Blocklys für die verschiedensten Aufgaben erstellt, aber hier finde ich den Fehler einfach nicht.
Vielen Dank schon mal im Voraus für eure Hilfe und Mühe
Christoph
-
@christophh sagte in Seltsames Verhalten von "für jeden Wert aus der Liste":
node / nodejs: 21.2.0
Falsche Version. Ungerade Versionen sind nicht "stable". Aktuell empfohlen für ioBroker ist 18.
Linux-Version: Debian Bullseye
Sollte ebenfalls aktualisiert werden.
-
@christophh sagte in Seltsames Verhalten von "für jeden Wert aus der Liste":
Meine Frage ist jetzt, wie dieses seltsame Verhalten zu erklären ist und wie ich es abstellen kann.
Nur ein Schuss ins Blaue: vielleicht braucht der sendto-Block mehr Zeit. Setze doch mal nach diesem Block eine Pause, vielleicht klappt es dann.
-
@samson71 said in Seltsames Verhalten von "für jeden Wert aus der Liste":
@christophh sagte in Seltsames Verhalten von "für jeden Wert aus der Liste":
node / nodejs: 21.2.0
Falsche Version. Ungerade Versionen sind nicht "stable". Aktuell empfohlen für ioBroker ist 18.
Bin gerade dabei, auf 18 zu aktualisieren. Vielen Dank für den Hinweis.
Linux-Version: Debian Bullseye
Sollte ebenfalls aktualisiert werden.
Gebe ich dir recht, allerdings läuft Openmediavault noch nicht unter Debian Bookworm. Habe ich schonmal nachgesehen.
Muß also erstmal auf Bullseye bleiben, wird aber aktualisiert, sobald OMV unter Bookworm läuft.Edit:
nodejs ist jetzt auf v18.19.0 -
@dr-bakterius said in Seltsames Verhalten von "für jeden Wert aus der Liste":
@christophh sagte in Seltsames Verhalten von "für jeden Wert aus der Liste":
Meine Frage ist jetzt, wie dieses seltsame Verhalten zu erklären ist und wie ich es abstellen kann.
Nur ein Schuss ins Blaue: vielleicht braucht der sendto-Block mehr Zeit. Setze doch mal nach diesem Block eine Pause, vielleicht klappt es dann.
Das war es, vielen Dank. Es reicht bei mir eine Pause von 100ms.
Damit ist das Problem gelöst