NEWS
maximum of 1000 setState during boot
-
@hschief sagte: spezielles Zusammenspiel beim booten zu sein.
Es ist mir unerklärlich wie Node.js zwischen Start nach Boot und normalem Neustart von ioBroker unterscheiden kann.
Vielleicht passiert etwas Eigenartiges beim Shutdown? Hast du mal ioBroker vor dem Shutdown gestoppt? -
@hschief sagte in maximum of 1000 setState during boot:
function Test1() { log('In Function','error'); setState('0_userdata.0.Allgemein.TestBoot', 'test', false); }; log('Script Test1 gestartet:','error'); setTimeout(function(){schedule("*/10 * * * * *", Test1 )},50000);
Ich habe das eben mit der Verzögerung getestet.:
2024-04-18 11:42:27.863 - info: host.iob instance system.adapter.javascript.0 started with pid 705 2024-04-18 11:42:28.702 - info: javascript.0 (705) starting. Version 7.8.0 in /opt/iobroker/node_modules/iobroker.javascript, node: v18.20.2, js-controller: 5.0.19 2024-04-18 11:42:28.931 - info: javascript.0 (705) requesting all states 2024-04-18 11:42:28.932 - info: javascript.0 (705) requesting all objects 2024-04-18 11:42:29.223 - info: javascript.0 (705) received all objects 2024-04-18 11:42:29.269 - info: javascript.0 (705) received all states 2024-04-18 11:42:29.383 - info: javascript.0 (705) Start javascript script.js.Scripte.CronJobs 2024-04-18 11:42:29.405 - error: javascript.0 (705) script.js.Scripte.CronJobs: Script Test1 gestartet: 2024-04-18 11:42:29.406 - info: javascript.0 (705) script.js.Scripte.CronJobs: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 2024-04-18 11:42:31.861 - info: host.iob instance system.adapter.simple-api.0 started with pid 720 2024-04-18 11:42:32.347 - info: simple-api.0 (720) starting. Version 2.7.2 in /opt/iobroker/node_modules/iobroker.simple-api, node: v18.20.2, js-controller: 5.0.19 2024-04-18 11:42:32.355 - warn: simple-api.0 (720) Information for Developer: Using the direct "Let's encrypt" module import is deprecated and will be removed in the next js-controller version, use @iobroker/webserver instead 2024-04-18 11:42:32.358 - info: simple-api.0 (720) simpleAPI server listening on port 8087 2024-04-18 11:42:32.358 - info: simple-api.0 (720) Allow states only when user is owner: false 2024-04-18 11:42:32.362 - info: simple-api.0 (720) http server listening on port 8087 2024-04-18 11:42:35.867 - info: host.iob instance system.adapter.socketio.0 started with pid 735 2024-04-18 11:42:36.419 - info: socketio.0 (735) starting. Version 6.6.1 in /opt/iobroker/node_modules/iobroker.socketio, node: v18.20.2, js-controller: 5.0.19 2024-04-18 11:42:36.433 - warn: socketio.0 (735) Information for Developer: Using the direct "Let's encrypt" module import is deprecated and will be removed in the next js-controller version, use @iobroker/webserver instead 2024-04-18 11:42:36.452 - info: socketio.0 (735) socket.io server listening on port 8088 2024-04-18 11:43:20.004 - error: javascript.0 (705) script.js.Scripte.CronJobs: In Function 2024-04-18 11:43:30.001 - error: javascript.0 (705) script.js.Scripte.CronJobs: In Function
Somit bei mir wie es soll.
-
@wildbill sagte in maximum of 1000 setState during boot:
Ich meine, mal gelesen zu haben, dass der Adapter-Ersteller hier zumindest selbst Abhängigkeiten hingterlegen kann, so dass voneinander abhängige Adapter/Instanzen in korrekter Reihenfolge starten.
Genau, es gibt verschiedene Tier-Level, welche die Startreihenfolge festlegen. Damit zB Logikadapter laufen, bevor die ersten Werte kommen
-
@haus-automatisierung Vielen Dank für die tollen Antworten und auch die Information, dass der Fehler bei euch nicht reproduziert werden kann, Ich werde das Issue in GitHub erstmal schliessen und weiter forschen um das Problem einzugrenzen. Ich berichte was sich weiter ergibt.
-
@haus-automatisierung sagte in maximum of 1000 setState during boot:
Genau, es gibt verschiedene Tier-Level, welche die Startreihenfolge festlegen. Damit zB Logikadapter laufen, bevor die ersten Werte kommen
Also eigentlich genau andersrum, wie ich es manuell mache? Ich starte die Logiken eben erst, wenn alle Werte da sind, damit ich keine falschen Werte verarbeite, die bei manchen Adaptern beim Start auftreten.
Die Tier-Level kann man als User aber vermutlich nicht selbst festlegen, oder? Die werden vom Adapter-Ersteller fest eincodiert?Gruss, Jürgen
-
@wildbill sagte in maximum of 1000 setState during boot:
vermutlich nicht selbst festlegen, oder
oder!
vermute ich.
Hab im Expertenmodus mal was gesehen, was genau dafür sein könnte -
@homoran rischtisch
-
@homoran Gerade mal geschaut, Du meinst das hier:
Das sieht in der Tat danach aus. Da schraub ich jetzt aber nix rum, meine manuelle Methode funktioniert mindestens genausogut.
Gruss, Jürgen
-
@djmarc75 Gibt es einen Grund, warum logikverarbeitende Adapter da als Erstes gestartet werden? Es gibt ja doch einige Adapter, bei denen zum Start eben nicht alle Werte der „Wahrheit“ entsprechen. Die Logik da als Letztes zu starten erscheint mir da eher „logisch“. Oder gibt es gute Gründe, die ich gar nicht sehe?
Gruss, Jürgen
-
@wildbill sagte in maximum of 1000 setState during boot:
warum logikverarbeitende Adapter da als Erstes gestartet werden?
kann ich Dir leider nicht beantworten, habe mich damit noch nicht beschäftigt.
-
@wildbill
Einer der Gründe ist (wahrscheinlich) dass man sicherstellen will, dass eine Logik anspricht wenn der Adapter einen (neuen) Wert schreibt. Wird der javascript erst noch dem Adapterstart gestartet dann kann er ev auf das Setzen eines Zustands (via subscription) nicht mehr reagieren weil er das Setzen gar nicht mitbekommt.Bezüglich device-watcher rege ich an da einen Feature Request beim Adapter zu erstellen. Es erscheint mir sinnvoll wenn der Devicewatcher selbst eine gewisse Zeit nach seinem Start wartet bevor er prüft / alamiert.
Und ja man kann die Startsequenz im grob einstellen. Es gibt 3 Tiers die in der Reihenfolge 1 - 2 - 3 gestartet werden. Aller Adapter innerhalb einers Tiers werden in nicht festgelegter Reihenfolge gestartet. Diese Einstellung kann vom User vorgenommen werden wobei es wahrscheinlich weniger Sinn macht eine vis in Tier 1 zu legen :-).
-
@mcm57 Danke für die Erläuterungen. Issue bzw. feature request habe ich bei device watcher mal erstellt.
Bezüglich JavascriptAdapter. Genau deshalb beende ich ihn ja vorab manuell. Gewisse Adapter bzw. Geräte haben die Angewohnheit, beim Start kurz mal auf 0 zu springen und dann erst wieder auf den korrekten Wert. Ich meine, bei Homematic-Zwischensteckern mit Strommessung war das bei mir so bei aktueller Leistung und kumuliertem Wert. Das hat eben Scripte dann falsch ausgelöst und beim Sourceanalytix jedesmal die Meldung gebracht, der Wert hätte sich resettet. Da war/ist es mir lieber, bei Systemstart erstmal quasi die erste Änderung nicht mitzubekommen und dann eben erst, wenn sich alle "beruhigt" hat und die Werte "stabil" sind.
Vielleicht mache ich bei Gelegenheit nochmal einen Test und beende keinen Adapter manuell und schaue, wie es sich mittlerweile verhält. Denn ich mache das bestimmt schon seit 1-2 Jahren so (problemlos).Gruss, Jürgen
-
@wildbill
Ich glaub es wird schwierig da eine für alle System passende Lösung zu finden. Wenn es aber Adapter gibt die beim Start den Wert mal so auf 0 setzen, dann kann man da ruhig auch ein Issue erstellen damit der Maintainer schaut ob es dafür einen technischen Grund gibt oder ob nur irgendwo eine an sich unnötige Initialisierung erfolgt.@peterfido
Ev. check mal ob ev. beim Start von ioBroker im Zuge eine Bootvorgangs die Systemzeit (noch) nicht stimmt (RTC ev defekt / verstellt?) und diese dann erst zeitnahe aktualisisert wird z.B. durch NTP Daemon. Ist aber nur so mal ein Idee ohne dass ich sowas schon mal erlebt hätte. -
@hschief sagte in maximum of 1000 setState during boot:
auch die Information, dass der Fehler bei euch nicht reproduziert werden kann, Ich werde das Issue in GitHub erstmal schliessen und weiter forschen um das Problem einzugrenzen. Ich berichte was sich weiter ergibt.
Habs noch nicht probiert zu reproduzieren. Lass gerne offen und teile weitere Erkenntnisse im Issue
-
@mcm57 ich habe da keine Probleme mit der Uhrzeit. Alle VMs nutzen die RTC vom Proxmox-Host.
Mir kam nur die Idee, ob es evtl. beim TO da Probleme geben könnte.
-
Solved: In der Tat war der NTP beim boot zu langsam und die Zeit nicht richtig gesetzt. Als Lösung habe ich das Startscript vom IOBroker im systemd deaktiviert. Anschließend dann im /etc/local.rc sichergestellt das die Uhrzeit mittels ntpdate gesetzt wird und danach wird der IObroker gestart.
Vielen Dank für eure Unterstützung!!!!!!!
-
@hschief Und dann wird die Zeit korrigiert und alle „verpassten“ Schedule-Events in der Zeitdifferenz ausgelöst? Das wäre ja auch nicht so schön bzw. ein Bug aus meiner Sicht.
-
@haus-automatisierung said in maximum of 1000 setState during boot:
@hschief Und dann wird die Zeit korrigiert und alle „verpassten“ Schedule-Events in der Zeitdifferenz ausgelöst? Das wäre ja auch nicht so schön bzw. ein Bug aus meiner Sicht.
Müsste man genauer ansehen.
Kann gut seind ass der ntp daemon keinen Sprung macht sondern die Zeit "schneller" in kleineren Schritten vorsetzt. Dann hätte der scheduler keine Chance.Aber im Prinzip könnten "man" das ja testen indem man manuell die Zeit umsetzt. Wär aber dann ja was was im O/S oder node zu fixen wäre.
-
@mcm57 sagte in maximum of 1000 setState during boot:
Kann gut seind ass der ntp daemon keinen Sprung macht sondern die Zeit "schneller" in kleineren Schritten vorsetzt.
Ja, genau das macht der ntp im Normalfall. Die Zeit wird gestaucht oder gedehnt, bis irgendwann das Delta zwischen der Zeit vom ntp-Server und der lokal geführten Uhrzeit minimal ist. Das kann u. U. auch mehrere Tage dauern. Der Prozess läuft dauernd im Hintergrund und 'groovt' sich auf die gemessenen Abweichungen ein. Je ungenauer die Lokale Eieruhr tickt desto länger dauert das auch.
Harte Zeitsprünge sind zu vermeiden. -
@haus-automatisierung Hi, ich setzt direkt nach dem booten die Zeit,
# set the clock before iobroker is start # wait 20s for network /usr/bin/sleep 20 /usr/sbin/service ntp stop /usr/sbin/ntpdate -s x.x.x.x /usr/sbin/service ntp start
somit gibt es zu diesem Zeitpunkt noch keine Events die recorded werden. Nachdem die Zeit aktualisiert ist, starte ich den iobroker:
/usr/sbin/service iobroker start
Ab diesem Zeitpunkt laufen die events dann in die states und werden durch die scripte sauber verarbeitet.
Ich war bisher der Meinung, dass der ntp service beim booten die Zeit auch direkt richtig setzt, ich habe in diesem Fall gelernt, dass dies mal bis zu 5 Minuten dauern kann.