Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. settimeout - leider wird nicht gewartet

    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

    settimeout - leider wird nicht gewartet

    This topic has been deleted. Only users with topic management privileges can see it.
    • N
      Nachtfuchs 0 last edited by Nachtfuchs 0

      Kurz zur Erklärung:
      mittels RGB-Shelly und Kemo-Komponenten möchte ich die Last eines Verbrauchers steuern. Das funktioniert auch.
      Dazu aus einem EM3 die Werte ausgelesen, auf einen Datenpunkt geschrieben und diese Änderung wieder als Trigger für die Auswertung
      Auch das funktioniert.

      Nun habe ich eine Nulleinspeisung. Daher soll bei Überschuss langsam die ohmesche Last über den RGB-Shelly erhöht werden, um nicht gegeneinander zu arbeiten.

      soweit das Intro und Erklärung vom Script:

      //Als Trigger dient die Wertänderung einer Phase. So wird auf den Datenpunkt der Phasennummer (0. 1 oder 2)
      //geschrieben.
      //Diese Änderung auf dem Datenpunkt dient wiederrum, um die Werte der einzelnen Phasen auszulessen und zu
      //addieren. Das derekte Auslesen der GesamtLeistung beim EM3 ist zu träge, daher die extra Summenbildung  
      
      // Variablen-Deklaration
      //
      //77
      //88
      
      
      let P_Heizung = 1000; // Heizung maximale Leistung, wird wohl nicht gebraucht, da Array
      let P_0 ; let P_1; let P_2;  // aktuelle Watt der Phasen 
      let P_Summe; // Summe der einzelen Wattwerte der Phasen 1..3
      
      // Phase 0
      on({ id: 'shelly.0.SHEM-3#BCFF4DFD0DEF#1.Emeter0.Power', change: 'ne' }, async (obj) => {
        setState('0_userdata.0.EM3.P1_or_P2_or_P3_geaendert', 0 );  //console.log('Phase 0'); 
        //let Wert_Phase_1 = obj.state.val;  //console.log({'Phase 1' : Wert_Phase_1 });  
      });
      
      // Phase 1
      on({ id: 'shelly.0.SHEM-3#BCFF4DFD0DEF#1.Emeter1.Power', change: 'ne' }, async (obj) => {
        setState('0_userdata.0.EM3.P1_or_P2_or_P3_geaendert', 1 ); //console.log('Phase 1');
        //let Wert_Phase_1 = obj.state.val;  //console.log({'Phase 1' : Wert_Phase_1 }); 
      });
      
      // Phase 2
      on({ id: 'shelly.0.SHEM-3#BCFF4DFD0DEF#1.Emeter2.Power', change: 'ne' }, async (obj) => {
        setState('0_userdata.0.EM3.P1_or_P2_or_P3_geaendert', 2 );  //console.log('Phase 2');
        //let Wert_Phase_2 = obj.state.val;  //console.log({'Phase 2' : Wert_Phase_2 });
      });
      
      // Phasen gesamt
      
      let HeizStufe_1_Leistung_zu_Prozent = 
        [{'W': 4, 'P':12},{'W':  6,'P':14},{'W': 11,'P':16},{'W': 16,'P':18},{'W': 23,'P':20},{'W': 35,'P':22},
         {'W': 46,'P':24},{'W': 58,'P':26},{'W': 70,'P':28},{'W': 86,'P':30},{'W':107,'P':32},{'W':133,'P':34},
         {'W':149,'P':36},{'W':172,'P':38},{'W':202,'P':40},{'W':225,'P':42},{'W':254,'P':44},{'W':272,'P':46},
         {'W':304,'P':48},{'W':329,'P':50},{'W':354,'P':52},{'W':379,'P':54},{'W':403,'P':56},{'W':413,'P':58},
         {'W':422,'P':60},{'W':432,'P':62},{'W':436,'P':64},{'W':440,'P':66},{'W':443,'P':68},{'W':449,'P':70},
         {'W':10000,'P':100}];   //10000:10 damit die Suche nich ins Leere läuft
      
      
      on({ id: '0_userdata.0.EM3.P1_or_P2_or_P3_geaendert', change: 'ne' }, async (obj) => {
        P_0 = getState('shelly.0.SHEM-3#BCFF4DFD0DEF#1.Emeter0.Power').val;   //console.log({'P_0 :' : P_0});
        P_1 = getState('shelly.0.SHEM-3#BCFF4DFD0DEF#1.Emeter1.Power').val;   //console.log({'P_1 :' : P_1});
        P_2 = getState('shelly.0.SHEM-3#BCFF4DFD0DEF#1.Emeter2.Power').val;   //console.log({'P_3 :' : P_2});  
        // wird auf 2 Stellen gerundet, immer wieder Werte mit 5 Nachkommastellen zu sehen sind
        P_Summe = P_0 + P_1 + P_2;    P_Summe = Math.round(P_Summe *100) /-100;
      
        //console.log({'Phase gesamt errechnet ' : P_Summe });
        console.log('Start');
        setTimeout(() => {
          console.log({'Phase gesamt errechnet ' : P_Summe });
          if (P_Summe > 0) {
            console.log({'Einspeisung Watt' : P_Summe});     
            // @ts-ignore
            let Prozent =  (HeizStufe_1_Leistung_zu_Prozent.find( e => e.W > P_Summe ) ).P ;   
            //let Prozent = 35;
            console.log({'Prozent für RGB-Shelly': Prozent});
            setState('shelly.0.SHRGBW2#80A12A#1.white3.brightness', Prozent );
          } else {
            console.log('Netzbezug');
            setState('shelly.0.SHRGBW2#80A12A#1.white3.brightness', 0 );         
          };
          console.log('ich warte nicht');
        },2000 );
        console.log('Ende');
      });
      

      leider funktioniert das setTimeout nicht wie gewünscht.

      aus dem log:

      avascript.0
      2024-03-19 16:05:35.541 info script.js.EM3_1+2+3+gesamt: Start
      javascript.0
      2024-03-19 16:05:34.607 info script.js.EM3_1+2+3+gesamt: ich warte nicht
      javascript.0
      2024-03-19 16:05:34.607 info script.js.EM3_1+2+3+gesamt: { 'Prozent für RGB-Shelly': 40 }
      javascript.0
      2024-03-19 16:05:34.606 info script.js.EM3_1+2+3+gesamt: { 'Einspeisung Watt': 194.72 }
      javascript.0
      2024-03-19 16:05:34.606 info script.js.EM3_1+2+3+gesamt: { 'Phase gesamt errechnet ': 194.72 }
      javascript.0
      2024-03-19 16:05:34.552 info script.js.EM3_1+2+3+gesamt: ich warte nicht
      javascript.0
      2024-03-19 16:05:34.551 info script.js.EM3_1+2+3+gesamt: { 'Prozent für RGB-Shelly': 40 }
      javascript.0
      2024-03-19 16:05:34.551 info script.js.EM3_1+2+3+gesamt: { 'Einspeisung Watt': 194.72 }
      javascript.0
      2024-03-19 16:05:34.550 info script.js.EM3_1+2+3+gesamt: { 'Phase gesamt errechnet ': 194.72 }
      javascript.0
      2024-03-19 16:05:34.548 info script.js.EM3_1+2+3+gesamt: ich warte nicht
      javascript.0
      2024-03-19 16:05:34.547 info script.js.EM3_1+2+3+gesamt: { 'Prozent für RGB-Shelly': 40 }
      javascript.0
      2024-03-19 16:05:34.547 info script.js.EM3_1+2+3+gesamt: { 'Einspeisung Watt': 194.72 }
      javascript.0
      2024-03-19 16:05:34.546 info script.js.EM3_1+2+3+gesamt: { 'Phase gesamt errechnet ': 194.72 }
      javascript.0
      2024-03-19 16:05:32.605 info script.js.EM3_1+2+3+gesamt: Ende
      javascript.0
      2024-03-19 16:05:32.604 info script.js.EM3_1+2+3+gesamt: Start
      javascript.0
      2024-03-19 16:05:32.547 info script.js.EM3_1+2+3+gesamt: Ende
      javascript.0
      2024-03-19 16:05:32.546 info script.js.EM3_1+2+3+gesamt: Start

      Hinweis: ich lasse zu Testzwecken erst mal eine gewisse Menge Einspeisen, daher die Einspeisewerte.

      das "Start" und "Ende" bei jedem Ereignis kommt ist logisch.
      Aber alles was nach der setTimeout kommt sollte nach meiner Meinung 2000ms warten, tut es aber nicht.

      Hmmm.....

      Ich habe zwar schon alle SetTimeout-Fragestellungen durchforstet, konnte aber nichts brauchbares finden.
      Ich danke für einen kleinen Hinweis.

      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @Nachtfuchs 0 last edited by paul53

        @nachtfuchs-0 sagte: 2000ms warten, tut es aber nicht.

        Tut es. Zwischen erstem "Start" und der ersten Logausgabe aus dem Timeout liegen 2 Sekunden.

        2024-03-19 16:05:34.546 info script.js.EM3_1+2+3+gesamt: { 'Phase gesamt errechnet ': 194.72 }
        javascript.0
        2024-03-19 16:05:32.605 info script.js.EM3_1+2+3+gesamt: Ende
        javascript.0
        2024-03-19 16:05:32.604 info script.js.EM3_1+2+3+gesamt: Start
        javascript.0
        2024-03-19 16:05:32.547 info script.js.EM3_1+2+3+gesamt: Ende
        javascript.0
        2024-03-19 16:05:32.546 info script.js.EM3_1+2+3+gesamt: Start
        

        Was soll das Timeout bewirken?

        N 1 Reply Last reply Reply Quote 0
        • N
          Nachtfuchs 0 @paul53 last edited by Nachtfuchs 0

          @paul53
          Was soll das Timeout bewirken?
          es soll langsam die Last zugeführt werden.
          Also bei der Nulleinspeisung werden immer 7..10 Watt eingespeist.
          Somit habe ich einen Indikator.
          Ich schalte jetzt 50 Watt dazu --> will 4 Sekunden warten bis die Nulleinspeisung sich wieder einpendelt.
          werden wieder 7..10 Watt eingespeist kommen die nächten Watt dazu

          Das über den RGB-Shelly an die Kemo-Komponenten, die dann die ohmsche Last steuern.

          Derzeit schalte ich die Last zu, leider wird nicht gewartet, der EM3 sagt Netzbezug, macht den RGB-Shelly zu, und das Spiel beginnt von vorn.
          Derzeit lese ich noch die Wattzahl aus dem Array aus und schalte entsprechend die Prozente.

          javascript.0
          	2024-03-19 16:30:27.510	info	script.js.EM3_1+2+3+gesamt: Ende
          javascript.0
          	2024-03-19 16:30:27.509	info	script.js.EM3_1+2+3+gesamt: Start
          javascript.0
          	2024-03-19 16:30:27.507	info	script.js.EM3_1+2+3+gesamt: Ende
          javascript.0
          	2024-03-19 16:30:27.506	info	script.js.EM3_1+2+3+gesamt: Start
          javascript.0
          	2024-03-19 16:30:26.937	info	script.js.EM3_1+2+3+gesamt: ich warte nicht
          javascript.0
          	2024-03-19 16:30:26.937	info	script.js.EM3_1+2+3+gesamt: { 'Prozent für RGB-Shelly': 12 }
          javascript.0
          	2024-03-19 16:30:26.936	info	script.js.EM3_1+2+3+gesamt: { 'Einspeisung Watt': 3 }
          javascript.0
          	2024-03-19 16:30:26.936	info	script.js.EM3_1+2+3+gesamt: { 'Phase gesamt errechnet ': 3 }
          javascript.0
          	2024-03-19 16:30:26.853	info	script.js.EM3_1+2+3+gesamt: ich warte nicht
          javascript.0
          	2024-03-19 16:30:26.852	info	script.js.EM3_1+2+3+gesamt: { 'Prozent für RGB-Shelly': 12 }
          javascript.0
          	2024-03-19 16:30:26.851	info	script.js.EM3_1+2+3+gesamt: { 'Einspeisung Watt': 3 }
          javascript.0
          	2024-03-19 16:30:26.850	info	script.js.EM3_1+2+3+gesamt: { 'Phase gesamt errechnet ': 3 }
          javascript.0
          	2024-03-19 16:30:26.848	info	script.js.EM3_1+2+3+gesamt: ich warte nicht
          javascript.0
          	2024-03-19 16:30:26.848	info	script.js.EM3_1+2+3+gesamt: { 'Prozent für RGB-Shelly': 12 }
          javascript.0
          	2024-03-19 16:30:26.847	info	script.js.EM3_1+2+3+gesamt: { 'Einspeisung Watt': 3 }
          javascript.0
          	2024-03-19 16:30:26.847	info	script.js.EM3_1+2+3+gesamt: { 'Phase gesamt errechnet ': 3 }
          javascript.0
          	2024-03-19 16:30:24.935	info	script.js.EM3_1+2+3+gesamt: Ende
          javascript.0
          	2024-03-19 16:30:24.935	info	script.js.EM3_1+2+3+gesamt: Start
          javascript.0
          	2024-03-19 16:30:24.849	info	script.js.EM3_1+2+3+gesamt: Ende
          javascript.0
          	2024-03-19 16:30:24.848	info	script.js.EM3_1+2+3+gesamt: Start
          javascript.0
          	2024-03-19 16:30:24.846	info	script.js.EM3_1+2+3+gesamt: Ende
          javascript.0
          	2024-03-19 16:30:24.845	info	script.js.EM3_1+2+3+gesamt: Start
          javascript.0
          	2024-03-19 16:29:57.089	info	script.js.EM3_1+2+3+gesamt: ich warte nicht
          javascript.0
          	2024-03-19 16:29:57.088	info	script.js.EM3_1+2+3+gesamt: { 'Prozent für RGB-Shelly': 40 }
          javascript.0
          	2024-03-19 16:29:57.088	info	script.js.EM3_1+2+3+gesamt: { 'Einspeisung Watt': 173.67 }
          javascript.0
          	2024-03-19 16:29:57.086	info	script.js.EM3_1+2+3+gesamt: { 'Phase gesamt errechnet ': 173.67 }
          javascript.0
          	2024-03-19 16:29:57.081	info	script.js.EM3_1+2+3+gesamt: ich warte nicht
          javascript.0
          	2024-03-19 16:29:57.080	info	script.js.EM3_1+2+3+gesamt: { 'Prozent für RGB-Shelly': 40 }
          javascript.0
          	2024-03-19 16:29:57.079	info	script.js.EM3_1+2+3+gesamt: { 'Einspeisung Watt': 173.67 }
          javascript.0
          	2024-03-19 16:29:57.078	info	script.js.EM3_1+2+3+gesamt: { 'Phase gesamt errechnet ': 173.67 }
          javascript.0
          	2024-03-19 16:29:57.072	info	script.js.EM3_1+2+3+gesamt: ich warte nicht
          javascript.0
          	2024-03-19 16:29:57.072	info	script.js.EM3_1+2+3+gesamt: { 'Prozent für RGB-Shelly': 40 }
          javascript.0
          	2024-03-19 16:29:57.071	info	script.js.EM3_1+2+3+gesamt: { 'Einspeisung Watt': 173.67 }
          javascript.0
          	2024-03-19 16:29:57.070	info	script.js.EM3_1+2+3+gesamt: { 'Phase gesamt errechnet ': 173.67 }
          javascript.0
          	2024-03-19 16:29:55.085	info	script.js.EM3_1+2+3+gesamt: Ende
          javascript.0
          	2024-03-19 16:29:55.085	info	script.js.EM3_1+2+3+gesamt: Start
          

          Stimmt, er wartet wirklich 2 Sekunden. Aber warum kommen die anderen Meldungen noch so häufig?

          paul53 1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @Nachtfuchs 0 last edited by

            @nachtfuchs-0 sagte: warum kommen die anderen Meldungen noch so häufig?

            Weil so häufig getriggert wird.

            N 1 Reply Last reply Reply Quote 0
            • N
              Nachtfuchs 0 @paul53 last edited by

              @paul53
              hmm.. "Start" und "Ende" klar. Aber sollte dann nicht alles was innerhalb setTimeout steht für 2 Sekunden ruhen?

              
              2024-03-19 16:30:26.936 { 'Phase gesamt errechnet ': 3 }
              
              2024-03-19 16:30:26.850 { 'Phase gesamt errechnet ': 3 }
              
              2024-03-19 16:30:26.847 { 'Phase gesamt errechnet ': 3 }
              
              2024-03-19 16:29:57.086 { 'Phase gesamt errechnet ': 173.67 }
              
              2024-03-19 16:29:57.078 { 'Phase gesamt errechnet ': 173.67 }
              
              2024-03-19 16:29:57.070 { 'Phase gesamt errechnet ': 173.67 }
              

              ... mal nur den einen Meldungstext rauskopiert.

              paul53 1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @Nachtfuchs 0 last edited by paul53

                @nachtfuchs-0 sagte: sollte dann nicht alles was innerhalb setTimeout steht für 2 Sekunden ruhen?

                Nein, Timeout verzögert nur alles um 2 s.

                Dein Trigger ist ungeeignet. Bilde besser die Summe über die 3 Phasen aus den zeitlich zusammenhängenden Werten.

                const idP0 = 'shelly.0.SHEM-3#BCFF4DFD0DEF#1.Emeter0.Power';
                const idP1 = 'shelly.0.SHEM-3#BCFF4DFD0DEF#1.Emeter0.Power';
                const idP2 = 'shelly.0.SHEM-3#BCFF4DFD0DEF#1.Emeter2.Power';
                const idsPower = [idP0, idP1, idP2]; 
                const idPower = '0_userdata.0.EM3.Power'; // Gesamtleistung
                
                var timer = null;
                on(idsPower, function() {
                    clearTimeout(timer);
                    timer = setTimeout(function() {
                        const P_0 = getState(idP0).val;   //console.log({'P_0 :' : P_0});
                        const P_1 = getState(idP1).val;   //console.log({'P_1 :' : P_1});
                        const P_2 = getState(idP2).val;   //console.log({'P_3 :' : P_2});  
                        setState(idPower, P_0 + P_1 + P_2, true);
                    }, 200);
                });
                

                Diesen Summenwert nimm dann zum Triggern der Einspeiseregelung.

                on(idPower, (dp) => {
                    // wird auf 2 Stellen gerundet, immer wieder Werte mit 5 Nachkommastellen zu sehen sind
                    const P_Summe = Math.round(dp.state.val * 100) / -100;
                
                N 1 Reply Last reply Reply Quote 1
                • N
                  Nachtfuchs 0 @paul53 last edited by

                  @paul53
                  erst mal Danke für den andere Denkansatz.

                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  974
                  Online

                  31.8k
                  Users

                  80.0k
                  Topics

                  1.3m
                  Posts

                  2
                  7
                  204
                  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