Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Ich hänge fest, while Schleife [gelöst]

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Ich hänge fest, while Schleife [gelöst]

    This topic has been deleted. Only users with topic management privileges can see it.
    • F
      flyer99 last edited by flyer99

      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);
      liv-in-sky Armilar 3 Replies Last reply Reply Quote 0
      • liv-in-sky
        liv-in-sky @flyer99 last edited by

        @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

        1 Reply Last reply Reply Quote 1
        • liv-in-sky
          liv-in-sky @flyer99 last edited by

          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.

          1 Reply Last reply Reply Quote 1
          • Armilar
            Armilar Most Active Forum Testing @flyer99 last edited by Armilar

            @flyer99

            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

            1 Reply Last reply Reply Quote 0
            • F
              flyer99 last edited by

              Vielen Dank für die Antworten, dann werde ich mal diesen Weg probieren .....

              1 Reply Last reply Reply Quote 0
              • F
                flyer99 last edited by

                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);
                	}
                }
                
                1 Reply Last reply Reply Quote 1
                • First post
                  Last post

                Support us

                ioBroker
                Community Adapters
                Donate

                940
                Online

                31.9k
                Users

                80.1k
                Topics

                1.3m
                Posts

                3
                6
                361
                Loading More Posts
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes
                Reply
                • Reply as topic
                Log in to reply
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                The ioBroker Community 2014-2023
                logo