NEWS
Ich hänge fest, while Schleife [gelöst]
-
Abend Community,
Nach 8 Stunden Probieren und immer noch keine Idee an was es hackt wende ich mich an Euch.
Hintergrund zu dem Script:
Da ich PV auf dem Dach habe steuer ich meine Hauptverbraucher, funzt auch alles jedoch wollte ich ein BlocklyScript opimieren welches mir den Status z.B. der Spülmaschine ausliest. Da die Spülmaschine noch nicht Smart ist und somit nur über einen Shelly gesteuert wird kann ich bei Stromaufnahme ein Einschalten feststellen, jedoch das ENDE der Spülmaschine gestaltet sich ein wenig schwierig da sie zwischendurch mal Phasen hat in denen sie kein Strom braucht, das Programm ist aber noch nicht beendet. Um meine Visualisierung richtig zu Versorgen bzgl. "Spülmaschine läuft" oder eben fertig hab ich über Blockly ein Script gebaut das auch funktioniert, wenn der Strom weniger 1 Watt ist dann warte 3 Minuten, wenn imer noch nochmals 3 Minuten ....... bis nach 30 Minuten das Bit Spülmaschine abgelöscht wird. Fängt sie zwischen den 30 Minuten nochmals an was zu machen fängt das Skript von vorne an, wie gesagt das funktioniert.
Jetzt dachte ich ich probiere das mal über Java direkt mit einer Funktion. Solange der Strom ("2power") bei null ist funktioniert die Schleife, also beendet sich nach 10 mS. Wenn ich aber "2power" auf 3 setze und anschließend wieder zurück hängt die Schleife, Raspberry geht auf 100% ........ Warum hängt die ????? Wenn der "2power" wieder auf 0 ist sollte doch "StartZeit" auf aktuelles Datum gesetzt werden und nach 10 mS sich die Schleife beenden ??
Ich bin mir auch nicht Sicher ob das der richtige Ansatz ist für meine "Optimierung" des Blocklys, trotzdem würde mich interessieren warum das nicht läuft ??Vielen Dank im voraus ......
function verstrZeit(t0,t1) { var differenz = (t1.getTime() - t0.getTime()); return differenz; } var StartZeit = new Date(); console.error("1"); while (verstrZeit(StartZeit,new Date()) < 10) { console.error("2"); if (getState("javascript.0.Solar.2power").val > 1) { console.error("3"); StartZeit = new Date(); } Ansonsten setze Variable XY zurück ...... } setState("javascript.0.scriptEnabled.Solar.y01_Status-Spuelm", false);
-
@flyer99 anstatt while eher setInterval nutzen und mit stopInterval beenden
die while schleife macht richtig stress, weil sie dauernd arbeitet - habe ich noch nie in meiner skripte gebraucht
bei setinterval kannst du definieren, wie oft es pro zeiteinheit durchläuft und innen im setinterval alles checken und steuern
-
ps das ist javascript und nicht java
@flyer99 sagte in Ich hänge fest, while Schleife:
dachte ich ich probiere das mal über Java direkt mit einer Funktion.
-
var timeoutSpuelmaschine; // Trigger auf Objekt ID für Leistungsmessung on({id: 'javascript.0.Solar.2power', change: "ne"}, async function (obj) { if (obj.state.val > 1) { // Wenn weiteres Event von Trigger, erneut 3 Min (function () {if (timeoutSpuelmaschine) {clearTimeout(timeoutSpuelmaschine); timeoutSpuelmaschine = null;}})(); timeoutSpuelmaschine = setTimeout(async function () { // Wenn 3 Min. kein (>1)-Event mehr vom Trigger , abschalten setState("javascript.0.scriptEnabled.Solar.y01_Status-Spuelm", false); }, 180000); } });
würde ich ebenfalls wie @liv-in-sky lösen.
Eine While-Schleife läuft sich einen Wolf, wenn keine Abbruchbedingung existiert oder entsprechende Pausen eingebaut werden. Ist völlig normal, dass dann bei einer Endlosschleife der Prozessor auf 100% geht. Besser mit Trigger und setTimeout
-
Vielen Dank für die Antworten, dann werde ich mal diesen Weg probieren .....
-
Abend, habs nun so für mich am laufen und funzt.
Vielleicht hilft es ja jemandem, Logik: Innerhalb von 15 Minuten darf kein Stromverbrauch auftauchen ....setState("javascript.0.Solar.Script_Spuelmaschine_Status_laeuft", true); let vergangenezeit_spuelm = 1; let sekundenzaehler_spuelm = setInterval(Zeit, 1000); //1000 für Interval 1 Sekunde function Zeit() { vergangenezeit_spuelm++; if (getState("shelly.0.SHPLG2-1#283A90#1.Relay0.Power").val > 1) { vergangenezeit_spuelm = 0; } if (vergangenezeit_spuelm > 900 ) { //900 gleich 15 Minuten da Intervall = 1 Sekunde clearInterval(sekundenzaehler_spuelm); setState("javascript.0.Solar.Spuelm_gestartet",false); setState("javascript.0.Solar.Script_Spuelmaschine_Status_laeuft", false); setState("javascript.0.scriptEnabled.Solar.Spuelmaschine_Status", false); } }