NEWS
Iobroker "hängt" - Stoppuhr zählt nicht korrekt
-
Was kann da los sein und wie kann ich die Ursache finden?
Mein Iobroker läuft wohl nicht reibungsfrei - es äußert sich z. B. dass eine einfach gestrickt Stoppuhr zu langsam läuft bzw. hängenbleibt:
Immer bei ca. 30 Sekunden. Läuft dann zwar weiter, aber mit wenigen Sekunden Verzögerung.
Hier z. B. mein einfaches Stoppuhr Skript:
-
Was kann da los sein und wie kann ich die Ursache finden?
Mein Iobroker läuft wohl nicht reibungsfrei - es äußert sich z. B. dass eine einfach gestrickt Stoppuhr zu langsam läuft bzw. hängenbleibt:
Immer bei ca. 30 Sekunden. Läuft dann zwar weiter, aber mit wenigen Sekunden Verzögerung.
Hier z. B. mein einfaches Stoppuhr Skript:
- was heist "einige sekunden" ? Reden wir von einem Versatz von 2-5 sekunden, oder eher 30-90 sekunden ?
- wie hast du das nachgewiesen ? Aktualisierung des Objektbaumes ? Abspeichern von Werten in History ?
- auf welcher Hardware läuft der ioBroker ?
- Was läuft da noch ?
A.
-
- was heist "einige sekunden" ? Reden wir von einem Versatz von 2-5 sekunden, oder eher 30-90 sekunden ?
- wie hast du das nachgewiesen ? Aktualisierung des Objektbaumes ? Abspeichern von Werten in History ?
- auf welcher Hardware läuft der ioBroker ?
- Was läuft da noch ?
A.
@Asgothian
Hi,
ursprünglich hatte ich einen Countdownzähler in Blockly gemacht. Der ging anfänglich. Irgendwann, Wochen später, fiel mir auf, dass die Zeit nicht stimmt.Jetzt wollte ich die Ursache ermitteln, dafür habe ich die einfache Stoppuhr gemacht. Hier stimmt die Zeit auch nicht.
Die Abweichung ist wenige Sekunden pro Minute.
Also 5 Minuten und ca. 25 Sekunden Abweichung.Die Stoppuhr Werte lass ich mir anzeigen per Widget über vis.
Iobroker läuft auf einem Raspi4 mit 4 GB RAM, nicht stark ausgelastet wie ich meine (siehe aktuelles Bild von der app "Raspcontroller"), CPU auslastung schwankend, aber so gut wie nie > 50%
Zu den Anwendungen, die da noch laufen:
Da hab ich mittlerweile schon ganz schön viele, weiß gar nicht wo ich da anfangen soll...
da laufen viele Deconz Objekte, Sonoffs, MQTT, text2speech...
soll ich auflisten? (..sag mir wie???)

-
@Asgothian
Hi,
ursprünglich hatte ich einen Countdownzähler in Blockly gemacht. Der ging anfänglich. Irgendwann, Wochen später, fiel mir auf, dass die Zeit nicht stimmt.Jetzt wollte ich die Ursache ermitteln, dafür habe ich die einfache Stoppuhr gemacht. Hier stimmt die Zeit auch nicht.
Die Abweichung ist wenige Sekunden pro Minute.
Also 5 Minuten und ca. 25 Sekunden Abweichung.Die Stoppuhr Werte lass ich mir anzeigen per Widget über vis.
Iobroker läuft auf einem Raspi4 mit 4 GB RAM, nicht stark ausgelastet wie ich meine (siehe aktuelles Bild von der app "Raspcontroller"), CPU auslastung schwankend, aber so gut wie nie > 50%
Zu den Anwendungen, die da noch laufen:
Da hab ich mittlerweile schon ganz schön viele, weiß gar nicht wo ich da anfangen soll...
da laufen viele Deconz Objekte, Sonoffs, MQTT, text2speech...
soll ich auflisten? (..sag mir wie???)

@brokeling
Mehr info ist nicht notwendig. Ich habe eine Vermutung, kann diese aber aktuell nicht beweisen. Dafür müsste ich wissen wie das Intervall im JSController intern abgebildet ist.Ich gehe davon aus das ein Intervall intern als Kette von timeouts abgebildet ist. Dadurch ist jedes einzelne Intervall minimal länger als eigentlich angegeben. Die von Dir angegebene Abweichung von 8-10% ist eigentlich zu hoch, allerdings hängt das auch davon ab wie der ioBroker intern belastet ist.
Generell gilt: Eine Kette von kleinen Timeouts ist immer weniger genau als ein grosser Timeout. Selbst kleine Verzögerungen addieren sich auf. Als Ausweg bietet sich diese Methode an (als Beispiel für ein Stoppuhr Script):

Die Logik dahinter ist das der eigentliche Zeitablauf und die Aktualisierung des Datenpunktes voneinander getrennt werden.
Zu dem Punkt "der ioBroker hängt sich fest" - es mehrere Einflussgrössen die eine derartige Verzögerung erzeugen Können. Das alleine an dem Skript fest zu machen ist schwierig. Wenn es wirklich zu Aussetzern von mehreren Sekunden kommt dann ist da durchaus etwas faul. Übliche Verdächtige dazu sind Zugriffe auf die Speicherkarte (swapping ?). Um das zu identifizieren muss aber erst geklärt werden ob das Skript wirklich über mehrere Sekunden pausiert. Das liesse sich so abfangen:

Wenn Du das Skript mal laufen lässt und dann im Log nach den Warn-Meldungen Ausschau hältst, dann sollte erkennbar sein:
- wie lange das Skript pausiert hat
- wie oft das auftritt
- ob es dazu eine Regelmässigkeit gibt.
A.
-
@brokeling
Mehr info ist nicht notwendig. Ich habe eine Vermutung, kann diese aber aktuell nicht beweisen. Dafür müsste ich wissen wie das Intervall im JSController intern abgebildet ist.Ich gehe davon aus das ein Intervall intern als Kette von timeouts abgebildet ist. Dadurch ist jedes einzelne Intervall minimal länger als eigentlich angegeben. Die von Dir angegebene Abweichung von 8-10% ist eigentlich zu hoch, allerdings hängt das auch davon ab wie der ioBroker intern belastet ist.
Generell gilt: Eine Kette von kleinen Timeouts ist immer weniger genau als ein grosser Timeout. Selbst kleine Verzögerungen addieren sich auf. Als Ausweg bietet sich diese Methode an (als Beispiel für ein Stoppuhr Script):

Die Logik dahinter ist das der eigentliche Zeitablauf und die Aktualisierung des Datenpunktes voneinander getrennt werden.
Zu dem Punkt "der ioBroker hängt sich fest" - es mehrere Einflussgrössen die eine derartige Verzögerung erzeugen Können. Das alleine an dem Skript fest zu machen ist schwierig. Wenn es wirklich zu Aussetzern von mehreren Sekunden kommt dann ist da durchaus etwas faul. Übliche Verdächtige dazu sind Zugriffe auf die Speicherkarte (swapping ?). Um das zu identifizieren muss aber erst geklärt werden ob das Skript wirklich über mehrere Sekunden pausiert. Das liesse sich so abfangen:

Wenn Du das Skript mal laufen lässt und dann im Log nach den Warn-Meldungen Ausschau hältst, dann sollte erkennbar sein:
- wie lange das Skript pausiert hat
- wie oft das auftritt
- ob es dazu eine Regelmässigkeit gibt.
A.
@Asgothian
danke für deine Hilfe.
ich habe herausgefunden, dass die "Pause" immer nach so 30 Sekunden geschieht. Und das reproduzierbar.
Auch andere Aktionen des Iobrokers scheinen dann zu hängen.
Im log wird dabei nichts ausgegeben. Also weiß ich nicht so recht, ob das mit den Timeouts zusammenhängt...Nun zu deinem Skript - danke für die Idee hier eine unabhängige Größe zu nehmen, die Tageszeit in s.
Am Skript vertehe ich leider die If-Anweisung nicht:

...weiß nicht was da geschehen soll... -
@Asgothian
danke für deine Hilfe.
ich habe herausgefunden, dass die "Pause" immer nach so 30 Sekunden geschieht. Und das reproduzierbar.
Auch andere Aktionen des Iobrokers scheinen dann zu hängen.
Im log wird dabei nichts ausgegeben. Also weiß ich nicht so recht, ob das mit den Timeouts zusammenhängt...Nun zu deinem Skript - danke für die Idee hier eine unabhängige Größe zu nehmen, die Tageszeit in s.
Am Skript vertehe ich leider die If-Anweisung nicht:

...weiß nicht was da geschehen soll... -
@Asgothian
danke für deine Hilfe.
ich habe herausgefunden, dass die "Pause" immer nach so 30 Sekunden geschieht. Und das reproduzierbar.
Auch andere Aktionen des Iobrokers scheinen dann zu hängen.
Im log wird dabei nichts ausgegeben. Also weiß ich nicht so recht, ob das mit den Timeouts zusammenhängt...Nun zu deinem Skript - danke für die Idee hier eine unabhängige Größe zu nehmen, die Tageszeit in s.
Am Skript vertehe ich leider die If-Anweisung nicht:

...weiß nicht was da geschehen soll...da ist ein "clickfehler" drin. Statt
startTimeInSeconds < StartTimeInSecondssollte da stehen:
actual time as seconds in day < startTimeInSecondsDer Baustein "seconds in day" liefert die Sekunden seit Mitternacht. Wenn Du also deine Stoppuhr um 1 Minute vor Mitternacht startest ist die StartTime 86340. 1 Minute nach Mitternacht ist "seconds in day" aber 60. Deswegen wird wenn das passier die Startzeit um 1 Tag erhöht (24x60x60)
A.
-
@Asgothian
danke für deine Hilfe.
ich habe herausgefunden, dass die "Pause" immer nach so 30 Sekunden geschieht. Und das reproduzierbar.
Auch andere Aktionen des Iobrokers scheinen dann zu hängen.
Im log wird dabei nichts ausgegeben. Also weiß ich nicht so recht, ob das mit den Timeouts zusammenhängt...Nun zu deinem Skript - danke für die Idee hier eine unabhängige Größe zu nehmen, die Tageszeit in s.
Am Skript vertehe ich leider die If-Anweisung nicht:

...weiß nicht was da geschehen soll...@brokeling sagte in Iobroker "hängt" - Stoppuhr zählt nicht korrekt:
ich habe herausgefunden, dass die "Pause" immer nach so 30 Sekunden geschieht. Und das reproduzierbar.
Auch andere Aktionen des Iobrokers scheinen dann zu hängen.Immer so 30 sekunden nach Start des Timers, oder alle 30 sekunden ?
A.
-
@brokeling sagte in Iobroker "hängt" - Stoppuhr zählt nicht korrekt:
ich habe herausgefunden, dass die "Pause" immer nach so 30 Sekunden geschieht. Und das reproduzierbar.
Auch andere Aktionen des Iobrokers scheinen dann zu hängen.Immer so 30 sekunden nach Start des Timers, oder alle 30 sekunden ?
A.
@Asgothian
es ist unabhängig vom Start des Timers. Die Abstände der "Haltepausen" sind 30 Sekunden. Also das muss wohl was anderes, unabhängiges von der Stoppuhr sein. -
da ist ein "clickfehler" drin. Statt
startTimeInSeconds < StartTimeInSecondssollte da stehen:
actual time as seconds in day < startTimeInSecondsDer Baustein "seconds in day" liefert die Sekunden seit Mitternacht. Wenn Du also deine Stoppuhr um 1 Minute vor Mitternacht startest ist die StartTime 86340. 1 Minute nach Mitternacht ist "seconds in day" aber 60. Deswegen wird wenn das passier die Startzeit um 1 Tag erhöht (24x60x60)
A.
@Asgothian said in Iobroker "hängt" - Stoppuhr zählt nicht korrekt:
Der Baustein "seconds in day" liefert die Sekunden seit Mitternacht. Wenn Du also deine Stoppuhr um 1 Minute vor Mitternacht startest ist die StartTime 86340. 1 Minute nach Mitternacht ist "seconds in day" aber 60. Deswegen wird wenn das passier die Startzeit um 1 Tag erhöht (24x60x60)
A.
sehr gut, an alles gedacht!Dennoch, ich muss herausfinden warum mein System hängt.
Nur wie?
So ein Stopp kann doch nicht normal sein.
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden