NEWS
Absturz / Deaktivierung von Instanz bei Blockly Programm
-
Hallo zusammen,
ich bin neu hier und habe versucht mein erstes Blockly Programm zu schreiben, wo ich "überschüssige" Energie (bevor ich diese Einspeise), benutze um mit meiner Klimaanlage zu heizen. Hierfür lese ich über Modus die aktuelle "Leistung", welche in das Netz gespeist wird aus. Liegt diese Leistung oberhalb des Schwellenwertes, soll nach nochmaligem Durchlauf einer Schleife (wird verwendet, um über 10 Minuten einen Mittelwert zu ermitteln), die Klimaanlage gestartet werden. Liegt die Leistung am Übergabepunkt unterhalb eines Wertes und ist die Klimaanlage an, wird diese ausgeschaltet.
Die übergeordnete Schleife habe ich nur verwendet, damit das Programm dauerhaft durchlaufen wird.
Generell funktioniert das Programm, nur nach einer bestimmten Zeit, wird die Java Instanz deaktiviert bzw. das Programm wird nicht mehr durchlaufen.
Könnt Ihr mir bitte helfen??
-
@sebastianb sagte: wird die Java Instanz deaktiviert
So erzeugt man eine Endlosschleife, die zum Absturz führt.
Bilder bitte nicht als Foto hochladen. -
@sebastianb sagte in Absturz / Deaktivierung von Instanz bei Blockly Programm:
ich bin neu hier und habe versucht mein erstes Blockly Programm zu schreiben
Es fehlt der Trigger... Lesestoff, hier im Forum: https://forum.iobroker.net/post/1085370
-
@sebastianb das skript ist so nicht sauber. Allerdings sind die Antworten von @paul53 und @FredF nur zum Teil passend:
Du willst ja ein Skript haben welches immer arbeitet - soweit ok. Es muss also nicht unbedingt durch einen trigger laufen.
Eine Endlosschleife ist da, darf aber auch sein.
Du hast aber eine Schleife die komplett ohne Wartezeiten durchrauscht, und damit die Prozessorlast soweit hoch schraubt das der Adapter sich beendet, das liegt daran das es zwischen deinem falls und sonst-falls Zweig eine Option gibt bei der in der Schleife nichts passiert.
Trotzdem ist das was @FredF gepostet hat wichtige Lektüre. Du solltest überlegen wie du deine Ziel-Logik Event-basiert (und damit durch trigger gesteuert) umsetzt.
Ein Vorschlag: du triggerst auf Änderung der einspeisungsleistung.
Darin bildest du einen gleitenden Durchschnitt über die Werte der letzten 10 Sekunden. Wenn sich der Mittelwert dann im einschalt oder ausschalt band bewegst schaltest du die Klimaanlage.Ich habe dein Skript nicht im Detail durch gearbeitet - Fotos von Bildschirmen sind echt die Pest, dafür gibt es Screenshots und exportierte Skripte. Die kann man dann lesen.
A.
-
@asgothian
Vielen Dank für das Feedback! Das hilft.
Den Trigger habe ich versucht (auch genau auf die Leistung am Übergabepunkt) und habe die anderen Bedingungen in den Trigger gepackt.
Leider mache ich hier aber was falsch, weil die Bedingungen im Trigger nicht durchlaufen werden, sondern ständig das Programm durchlaufen wird. -
@sebastianb sagte in Absturz / Deaktivierung von Instanz bei Blockly Programm:
@asgothian
Vielen Dank für das Feedback! Das hilft.
Den Trigger habe ich versucht (auch genau auf die Leistung am Übergabepunkt) und habe die anderen Bedingungen in den Trigger gepackt.
Leider mache ich hier aber was falsch, weil die Bedingungen im Trigger nicht durchlaufen werden, sondern ständig das Programm durchlaufen wird.Zeig den Versuch mit trigger mal - als Screenshot, dann können wir schauen wo es klemmt.
A.
-
@asgothian
Hier der Versuch mit dem Trigger. Es scheint aber so, als ob der gesamte Programmcoe nicht durchlaufen wird. Ich weiß nur nicht warum.... -
@sebastianb sagte in Absturz / Deaktivierung von Instanz bei Blockly Programm:
@asgothian
Hier der Versuch mit dem Trigger. Es scheint aber so, als ob der gesamte Programmcoe nicht durchlaufen wird. Ich weiß nur nicht warum....na ja - der code läuft (leider) mehrfach parallel, da bei jeder Änderung ein 10 Sekündiger Ablauf gestartet wird. Wenn der Wert sich also dazwischen nochmal ändert bekommst du einen 2.
Anbei ein Vorschlag wie du das mit dem rolling average machen kannst.
Hinweise dazu:
- die Bausteine mit dem kleinen Pfeil davor (
) sind alle der gleiche Baustein aus dem Trigger Bereich - da voreingestellt auf "wert", umgestellt auf verschiedene Eigenschaften
- die Bausteine
sind auch alle der gleiche Baustein aus dem Listen Bereich, entsprechend umdefiniert.
Funktionsweise:
- in der Variable Liste_Zeitstempel wird gespeichert wann die jeweiligen Änderungen des DP auftreten.
- in der Variable Liste_Werte wird das Produkt aus Wert der Leistung und der Zeit über den diese Leistung ansteht (in ms) gespeichert - mit einer Begrenzung auf eine Dauer von 10 sekunden
- beim Durchgehen der Liste wird zunächst geschaut wieviele Werte aus der Liste herausfallen müssen, weil sie älter als 10 sekunden sind.
- Danach werden die jeweiligen Listen um diese Werte (von vorne) gekürzt.
- erst danach wird der aktuelle Zeitstempel und Wert*dauer in die beiden Listen eingetragen - als letztes Element.
Das Skript muss also mindestens 10 sekunden laufen bevor der erste echte Durchschnittswert vorliegt. Davor kann es Störungen geben - das sollte aber für die Funktion erst einmal nicht kritisch sein. Wenn es das doch ist dann lässt sich das auch noch unterbinden.
Viel spass beim Nachbauen
A.
Nachtrag: Auch die Zeit-Konstante (rolling average über X sekunden lässt sich durchaus noch anpassen - das hab ich erst einmal fix eingebranntWäre aber eine kleine Anpassung
- die Bausteine mit dem kleinen Pfeil davor (
-
@asgothian
Vielen Dank für die Hilfe!