Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. PV Überschuss Steckdose

    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

    PV Überschuss Steckdose

    This topic has been deleted. Only users with topic management privileges can see it.
    • kmxak
      kmxak Most Active last edited by kmxak

      Moin, ich habe mir da mal ein Script gebastelt und wollte mal fragen ob da mal einer drüber schauen könnte der sich "richtig" auskennt und natürlich euch auch zur verfügung stellen.

      Neueste Version

      // Konfiguration
      var threshold = -1100; // Schwellenwert für den Stromüberschuss
      var averageTimeMinutes = 30; // Zeitraum für den Durchschnitt in Minuten
      var powerOnTimeoutMinutes = 30; // Timeout für das Einschalten in Minuten, X Minuten bleibt das Gerät definitiv an.
      var powerOffTimeoutMinutes = 5; // Timeout für das Ausschalten in Minuten, X Minuten bleibt das Gerät definitiv aus.
      var devicePowerConsumption = 400; // Leistungsaufnahme des Gerätes in Watt
      var debugMode = false; // Debug-Modus ein-/ausschalten
      
      var entpreller = 0;
      var istAn = false;
      var averagePower = [];
      
      on({ id: [].concat(['sonoff.0.Hichi_Stromzähler. _16_7_0']), change: 'ne' }, async (obj) => {
       var value = obj.state.val;
       var timestamp = obj.state.ts;
      
       var deltaTime = 0;
       if (averagePower.length > 0) {
         var lastTimestamp = averagePower[0].timestamp;
         deltaTime = (timestamp - lastTimestamp) / (1000 * 60);
       }
      
       var powerChange = 0;
       if (averagePower.length > 0) {
         var lastValue = averagePower[0].value;
         powerChange = value - lastValue;
       }
       var powerChangeRate = deltaTime > 0 ? powerChange / deltaTime : 0;
      
       averagePower.unshift({ value: value, timestamp: timestamp });
       if (averagePower.length > averageTimeMinutes) {
         averagePower.pop();
       }
      
       var weightedAverage = 0;
       var weightSum = 0;
       for (var i = 0; i < averagePower.length; i++) {
         var weight = Math.exp(-i / 5);
         weightedAverage += averagePower[i].value * weight;
         weightSum += weight;
       }
       var average = Math.round(weightedAverage / weightSum);
      
       // Debug-Protokollierung für den aktuellen Wert des Stromzählers
       if (debugMode) {
         console.log("Aktueller Wert des Stromzählers: " + value);
       }
      
       // Debug-Protokollierung für den Durchschnitt
       if (debugMode) {
         console.log("Durchschnitt über " + averageTimeMinutes + " Minuten: " + average);
       }
      
       if (entpreller == 0 && istAn == false && average < (threshold + devicePowerConsumption) && compareTime('10:00', '19:00', 'between', null)) {
         entpreller = 1;
         setState('sonoff.0.Gosund_16A_3.POWER', true);
         istAn = true;
         console.log('PV Steckdose ein! Stromüberschuss vorhanden.');
         sendTo("telegram.0", "send", {
           text: 'PV Steckdose ein! Stromüberschuss vorhanden.'
         });
         setTimeout(() => {
           entpreller = 0;
         }, powerOnTimeoutMinutes * 60000); // Umwandlung von Minuten in Millisekunden
       }
      
       if (entpreller == 0 && istAn == true && average > (threshold - devicePowerConsumption)) {
         entpreller = 1;
         setState('sonoff.0.Gosund_16A_3.POWER', false);
         istAn = false;
         console.log('PV Steckdose aus! Kein Stromüberschuss vorhanden.');
         sendTo("telegram.0", "send", {
           text: 'PV Steckdose aus! Kein Stromüberschuss vorhanden.'
         });
         setTimeout(() => {
           entpreller = 0;
         }, powerOffTimeoutMinutes * 60000); // Umwandlung von Minuten in Millisekunden
       }
      });
      
      

      Alte Version

      // Konfiguration
      var threshold = -1500; // Schwellenwert für den Stromüberschuss
      var averageTimeMinutes = 45; // Zeitraum für den Durchschnitt in Minuten
      var powerOnTimeoutMinutes = 30; // Timeout für das Einschalten in Minuten, X Minuten bleibt das Gerät definitiv an.
      var powerOffTimeoutMinutes = 5; // Timeout für das Ausschalten in Minuten, X Minuten bleibt das Gerät definitiv aus.
      var debugMode = false; // Debug-Modus ein-/ausschalten
      
      
      var entpreller, istAn, timeout, timeout2;
      var averagePower = []; // Array zur Speicherung der letzten Durchschnittszeit Leistungswerte
      entpreller = 0;
      istAn = false;
      
      on({ id: [].concat(['sonoff.0.Hichi_Stromzähler. _16_7_0']), change: 'ne' }, async (obj) => {
        let value = obj.state.val;
        let oldValue = obj.oldState.val;
        
        // Debug-Protokollierung für den aktuellen Wert des Stromzählers
        if (debugMode) {
          console.log("Aktueller Wert des Stromzählers: " + getState('sonoff.0.Hichi_Stromzähler. _16_7_0').val);
        }
        
        // Hinzufügen des aktuellen Werts zum Durchschnittsarray
        averagePower.push(value);
        if (averagePower.length > averageTimeMinutes) {
          averagePower.shift(); // Entfernen des ältesten Werts, wenn die Länge überschritten ist
        }
        
        // Berechnung des Durchschnitts und Rundung auf ganze Zahl
        let average = Math.round(averagePower.reduce((acc, curr) => acc + curr, 0) / averagePower.length);
        
        // Debug-Protokollierung für den Durchschnitt
        if (debugMode) {
          console.log("Durchschnitt über " + averageTimeMinutes + " Minuten: " + average);
        }
        
        if ((entpreller == 0 && istAn == false && average < threshold && compareTime('10:00', '19:00', 'between', null))) {
          entpreller = 1;
          setState('sonoff.0.Gosund_16A_3.POWER' /* Gosund_16A_3 POWER */, true);
          istAn = true;
          console.log('PV Steckdose ein! Stromüberschuss vorhanden.');
          sendTo("telegram.0", "send", {
              text: 'PV Steckdose ein! Stromüberschuss vorhanden.'
          });
          timeout = setTimeout(async () => {
            timeout = null;
            entpreller = 0;
          }, powerOnTimeoutMinutes * 60000); // Umwandlung von Minuten in Millisekunden
        }
        
        if ((entpreller == 0 && istAn == true && average > threshold)) {
          entpreller = 1;
          setState('sonoff.0.Gosund_16A_3.POWER' /* Gosund_16A_3 POWER */, false);
          istAn = false;
          console.log('PV Steckdose aus! Kein Stromüberschuss vorhanden.');
          sendTo("telegram.0", "send", {
              text: 'PV Steckdose aus! Kein Stromüberschuss vorhanden.'
          });
          timeout2 = setTimeout(async () => {
            timeout2 = null;
            entpreller = 0;
          }, powerOffTimeoutMinutes * 60000); // Umwandlung von Minuten in Millisekunden
        }
      });
      
      

      Es soll wenn ich Überschuss habe eine Steckdose einschalten oder wenn ich zu wenig habe diese wieder ausschalten.
      Paar Timeouts und den Durchschnittswert sollen verhindern das sich das Gerät andauernd an und aus schaltet. Nicht jede Wolke soll das können sondern nur langanhaltendes schlechtes Wetter 😀

      Was haltet Ihr davon und habt ihr anregungen?

      Gruß Alex

      Rene55 paul53 2 Replies Last reply Reply Quote 0
      • Rene55
        Rene55 @kmxak last edited by

        @kmxak Hallo Alex, was hast du mit der Steckdose vor? Strom verbraten?

        Ich hab es noch nicht komplett durchgesehen aber schau mal nach 'sonoff.0.Hichi_Stromzähler. _16_7_0'. Da ist ein Blank drin - scheint mir nicht richtig.

        kmxak 1 Reply Last reply Reply Quote 0
        • kmxak
          kmxak Most Active @Rene55 last edited by

          @rene55 moin, doch das ist richtig. Muss mal in Tasmota schauen ob da was falsch ist.

          Ich schalte damit einen Entfeuchter der im Keller steht. Es ist nicht unbedingt nötig diesen zu Entfeuchten aber dort ist ein Gästezimmer mit Bett und bevor da etwas am stocken ist schalte ich den ab und zu an. Und nun halt immer mit Stromüberschuss.

          da_Woody 1 Reply Last reply Reply Quote -1
          • da_Woody
            da_Woody @kmxak last edited by

            @kmxak Leerstellen in DPs sind selten gut...

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

              @kmxak sagte: Was haltet Ihr davon und habt ihr anregungen?

              Da der Entfeuchter durch Ein-/Ausschalten auf den PV-Überschuss zurück wirkt, muss man eine Hysterese vorsehen, die etwas größer ist als die Leistungsaufnahme des Entfeuchters.

              Prinzip in Blockly:

              Blockly_temp.JPG

              kmxak 1 Reply Last reply Reply Quote 0
              • kmxak
                kmxak Most Active @paul53 last edited by

                @paul53

                soetwas?

                // Konfiguration
                var threshold = -1500; // Schwellenwert für den Stromüberschuss
                var averageTimeMinutes = 45; // Zeitraum für den Durchschnitt in Minuten
                var powerOnTimeoutMinutes = 30; // Timeout für das Einschalten in Minuten, X Minuten bleibt das Gerät definitiv an.
                var powerOffTimeoutMinutes = 5; // Timeout für das Ausschalten in Minuten, X Minuten bleibt das Gerät definitiv aus.
                var devicePowerConsumption = 400; // Leistungsaufnahme des Gerätes in Watt
                var debugMode = false; // Debug-Modus ein-/ausschalten
                
                var entpreller = 0;
                var istAn = false;
                var averagePower = [];
                
                on({ id: [].concat(['sonoff.0.Hichi_Stromzähler. _16_7_0']), change: 'ne' }, async (obj) => {
                  var value = obj.state.val;
                  var oldValue = obj.oldState.val;
                  
                  // Debug-Protokollierung für den aktuellen Wert des Stromzählers
                  if (debugMode) {
                    console.log("Aktueller Wert des Stromzählers: " + value);
                  }
                  
                  // Hinzufügen des aktuellen Werts zum Durchschnittsarray
                  averagePower.push(value);
                  if (averagePower.length > averageTimeMinutes) {
                    averagePower.shift(); // Entfernen des ältesten Werts, wenn die Länge überschritten ist
                  }
                  
                  // Berechnung des Durchschnitts und Rundung auf ganze Zahl
                  var average = Math.round(averagePower.reduce((acc, curr) => acc + curr, 0) / averagePower.length);
                  
                  // Debug-Protokollierung für den Durchschnitt
                  if (debugMode) {
                    console.log("Durchschnitt über " + averageTimeMinutes + " Minuten: " + average);
                  }
                  
                  if (entpreller == 0 && istAn == false && average < (threshold + devicePowerConsumption) && compareTime('10:00', '19:00', 'between', null)) {
                    entpreller = 1;
                    setState('sonoff.0.Gosund_16A_3.POWER', true);
                    istAn = true;
                    console.log('PV Steckdose ein! Stromüberschuss vorhanden.');
                    sendTo("telegram.0", "send", {
                        text: 'PV Steckdose ein! Stromüberschuss vorhanden.'
                    });
                    setTimeout(() => {
                      entpreller = 0;
                    }, powerOnTimeoutMinutes * 60000); // Umwandlung von Minuten in Millisekunden
                  }
                  
                  if (entpreller == 0 && istAn == true && average > (threshold - devicePowerConsumption)) {
                    entpreller = 1;
                    setState('sonoff.0.Gosund_16A_3.POWER', false);
                    istAn = false;
                    console.log('PV Steckdose aus! Kein Stromüberschuss vorhanden.');
                    sendTo("telegram.0", "send", {
                        text: 'PV Steckdose aus! Kein Stromüberschuss vorhanden.'
                    });
                    setTimeout(() => {
                      entpreller = 0;
                    }, powerOffTimeoutMinutes * 60000); // Umwandlung von Minuten in Millisekunden
                  }
                });
                
                
                1 Reply Last reply Reply Quote 0
                • kmxak
                  kmxak Most Active last edited by

                  nochmal eine neue Version mit einem gleitenden Durchschnitt

                  // Konfiguration
                  var threshold = -1100; // Schwellenwert für den Stromüberschuss
                  var averageTimeMinutes = 30; // Zeitraum für den Durchschnitt in Minuten
                  var powerOnTimeoutMinutes = 30; // Timeout für das Einschalten in Minuten, X Minuten bleibt das Gerät definitiv an.
                  var powerOffTimeoutMinutes = 5; // Timeout für das Ausschalten in Minuten, X Minuten bleibt das Gerät definitiv aus.
                  var devicePowerConsumption = 400; // Leistungsaufnahme des Gerätes in Watt
                  var debugMode = false; // Debug-Modus ein-/ausschalten
                  
                  var entpreller = 0;
                  var istAn = false;
                  var averagePower = [];
                  
                  on({ id: [].concat(['sonoff.0.Hichi_Stromzähler. _16_7_0']), change: 'ne' }, async (obj) => {
                    var value = obj.state.val;
                    var timestamp = obj.state.ts;
                  
                    var deltaTime = 0;
                    if (averagePower.length > 0) {
                      var lastTimestamp = averagePower[averagePower.length - 1].timestamp;
                      deltaTime = (timestamp - lastTimestamp) / (1000 * 60);
                    }
                  
                    var powerChange = 0;
                    if (averagePower.length > 0) {
                      var lastValue = averagePower[averagePower.length - 1].value;
                      powerChange = value - lastValue;
                    }
                    var powerChangeRate = deltaTime > 0 ? powerChange / deltaTime : 0;
                  
                    averagePower.push({ value: value, timestamp: timestamp });
                    if (averagePower.length > averageTimeMinutes) {
                      averagePower.shift();
                    }
                  
                    var sumPowerChange = averagePower.reduce((acc, curr, index, array) => {
                      if (index < array.length - 1) {
                        return acc + (curr.value - array[index + 1].value);
                      } else {
                        return acc;
                      }
                    }, 0);
                  
                    var average = Math.round(sumPowerChange / averagePower.length);
                  
                    // Debug-Protokollierung für den aktuellen Wert des Stromzählers
                    if (debugMode) {
                      console.log("Aktueller Wert des Stromzählers: " + value);
                    }
                  
                    // Debug-Protokollierung für den Durchschnitt
                    if (debugMode) {
                      console.log("Durchschnitt über " + averageTimeMinutes + " Minuten: " + average);
                    }
                  
                    if (entpreller == 0 && istAn == false && average < (threshold + devicePowerConsumption) && compareTime('10:00', '19:00', 'between', null)) {
                      entpreller = 1;
                      setState('sonoff.0.Gosund_16A_3.POWER', true);
                      istAn = true;
                      console.log('PV Steckdose ein! Stromüberschuss vorhanden.');
                      sendTo("telegram.0", "send", {
                        text: 'PV Steckdose ein! Stromüberschuss vorhanden.'
                      });
                      setTimeout(() => {
                        entpreller = 0;
                      }, powerOnTimeoutMinutes * 60000); // Umwandlung von Minuten in Millisekunden
                    }
                  
                    if (entpreller == 0 && istAn == true && average > (threshold - devicePowerConsumption)) {
                      entpreller = 1;
                      setState('sonoff.0.Gosund_16A_3.POWER', false);
                      istAn = false;
                      console.log('PV Steckdose aus! Kein Stromüberschuss vorhanden.');
                      sendTo("telegram.0", "send", {
                        text: 'PV Steckdose aus! Kein Stromüberschuss vorhanden.'
                      });
                      setTimeout(() => {
                        entpreller = 0;
                      }, powerOffTimeoutMinutes * 60000); // Umwandlung von Minuten in Millisekunden
                    }
                  });
                  
                  
                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  791
                  Online

                  31.9k
                  Users

                  80.2k
                  Topics

                  1.3m
                  Posts

                  4
                  7
                  489
                  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