Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Eigenverbrauchsoptimierung

    NEWS

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    • Save The Date: ioBroker@Smart Living Forum Solingen, 14.06.

    Eigenverbrauchsoptimierung

    This topic has been deleted. Only users with topic management privileges can see it.
    • O
      opöl last edited by

      Hallo Community,
      vor einiger Zeit hatte ich schon einmal einen Versuch mit Blockly gestartet, werde aber mit dem Tool nicht warm. Daher habe ich mich an Java versucht, um meinen Eigenverbrauch entsprechend der zur Verfügung stehenden Energie aus der PV zu optimieren.
      Platt ausgedrückt: In leistungsarmen Phasen sollen Kühl- und Gefrierschrank (und später auch andere Geräte) nacheinander laufen.
      Ich habe jetzt mal damit angefangen, Kühl- und Gefrierschrank gegeneinander so zu verriegeln, dass sie, falls das nötig ist, nacheinander laufen. Grundsätzlich klappt das auch. Allerdings gibt es beim Umschalten noch ein Phänomen, das ich bisher noch nicht in den Griff bekommen habe.
      Wenn der Kühlschrank aus- und der Gefrierschrank eingeschaltet wird, geschieht das nicht „sauber“, sondern in dieser Reihenfolge: Kühlschrank aus -> Gefrierschrank ein -> Kühlschrank aus -> Kühlschrank ein. Dann läuft es wieder stabil. Anders herum klappt das Umschalten problemlos.
      Da Problem ist, dass der Gefrierschrank bis zum Anlaufen eine „Gedenkminute“ braucht, bis „gefrierschrank_aktiv“ auf „true“ wechselt. Da muss noch eine Verzögerung rein, die ich einfach nicht hinbekomme.

      Kann mir da jemand einen Tipp geben?

      Gruß

      /*
       *
       * Das Umschalten klappt noch nicht optimal
       *
       *  Script zur optimierung des Verbrauchs durch Anpassen der Einschaltzeit von Verbrauchern 
       *  an den aktuellen PV Überschuss. Große Verbraucher mit geringer Einschaltzeit (Waschmaschine / Heizung)
       *  haben Priorität gegenüber kleineren Verbrauchern, die dafür länger laufen (Kühlgeräte).
       * 
       * 
       *    
       * Skript Name:      Verbrauchsoptimierung
       * Skript Version:   0.7  | 15. Mai 2024
       * Erstell-Datum:    25. April 2024
      */
      
      // Erfasste / gesteuerte Geräte:
          // Küchensteckdosen
          // Spülmaschine
          // Waschmaschine
          // Kühlschrank
          // Gefrierschrank
      
      var pverzeugung =0;                 // aktuelle PV Leistung
      var leistung =0;                    // aktuelle Gesamtleistung am Zähler
      var einspeisung =0;                 // aktuell eingespeiste Leistung (Wenn Leistung negativ ist)
      var verbrauch_kueche =0;            // aktuelle Leistung Küchensteckdosen
      var verbrauch_kuehlschrank =0;      // aktuelle Leistung Kühlschrank
      var verbrauch_kuehlschrank_alt =0; 
      var verbrauch_gefrierschrank =0;    // aktuelle Leistung Gefrierschrank
      var verbrauch_gefrierschrank_alt =0; 
      var verbrauch_waschmaschine =0;     // aktuelle Leistung Waschmaschine
      var verbrauch_spuelmaschine =0;     // aktuelle Leistung Spülmaschine
      // Boolsche Variablen
      var status_kueche =true;          	// Küchensteckdosen eingeschaltet
      var status_waschmaschine =true;   	// Waschmaschine eineschaltet
      var status_spuelmaschine =true;   	// Spuelmaschine eingeschaltet
      
      var status_kuehlschrank;    		// Kühlschrank eingeschaltet
      var kuehlschrank_aktiv;           	// Kühlschrank ist aktiv 0/1
      var status_gefrierschrank;  		// Gefrierschrank eingeschaltet
      var gefrierschrank_aktiv;         	// Gefrierschrank aktiv 0/1
      
      var warten = true; // 1 Minute warten
      // Counter für (K)ühlschrank und (G)efrierschrank, damit die Geräte nach max. 60 Minuten eingeschaltet werden.
      var cnt_k = 0;
      var cnt_g = 0;
      var debug =true; // Debug schaltet die Ausgabe der Werte im Log ein. Default = "0"
      
      
      function Optimierung () {
          getAll ()
          if (debug) {
              console.log('Debug aktiv');
              Showall ()   
          }
              
          // Hauptprogramm
              //console.log ('Hauptprogramm');
      		if (kuehlschrank_aktiv) {                                       // Kühlschrank läuft jetzt (wurde aktiv)	
                  console.error('Kühlschrank ist AKTIV');				    
                  if (status_gefrierschrank) {						        // Wenn der Gefrierschrank eingeschaltet ist
                      Gefrierschrank_off ()                                   // Dann Gefrierschrank ausschalten
                      console.log('Gefrierschrank war noch eingeschaltet und wurde ausgeschaltet ');
                  }   
              } else {
      // Kühlschrank ist nicht (mehr) aktiv, also warten bis der Gefrierschrank aktiv wird
      
                  if (status_kuehlschrank) {
                      Kuehlschrank_off ()
                      console.log('Kühlschrank war noch eingeschaltet und wurde ausgeschaltet ');
                  }
                  if (!status_gefrierschrank) {				        	    // Wenn der Gefrierschrank ausgeschaltet ist
                      Gefrierschrank_on ()                              	    // Dann Gefrierschrank einschalten
                      console.log('Gefrierschrank war noch ausgeschaltet und wurde eingeschaltet ');
                  }   
              }
      		
      		if (gefrierschrank_aktiv) { 								    // Gefrierschrank läuft jetzt (wurde aktiv)
                  console.error('Gefrierschrank ist AKTIV');
                  if (status_kuehlschrank) {								    // Wenn der Kühlschrank eingeschaltet ist
                      Kuehlschrank_off ()                                     // Dann Kuehlschrank ausschalten
                      warten = true;                                          // Warten nur bei Statusänderung
                      console.log('Kuehlschrank war noch eingeschaltet und wurde ausgeschaltet ');
                  }   
              } else {
                  if (status_gefrierschrank) {
                      Gefrierschrank_off ()
                      //warten = true;                                        // Warten nur bei Statusänderung
                      console.log('Gefrierschrank war noch eingeschaltet und wurde ausgeschaltet ');
                  }
                  if (!status_kuehlschrank) {				                    // Wenn der Gefrierschrank ausgeschaltet ist
                      Kuehlschrank_on ()                                      // Dann Gefrierschrank einschalten
                      warten = true;                                          // Warten nur bei Statusänderung
                      console.log('Kuehlschrank war noch ausgeschaltet und wurde eingeschaltet ');
                      
                  
                  }  
             
              }
      }
      
      
      
      function getAll() {
          pverzeugung = getState('sonoff.0.PV-Anlage.SENSOR.ENERGY.Power').val;
          leistung = getState('sonoff.0.Stromzaehler.SENSOR.Stromz.Power').val;
          if (leistung < 0) {
              einspeisung = Math.abs(leistung); 							    // Einspeisung ist der Betrag der negativen Gesamtleistung
          } else {
              // Netzbezug
          }
      
          verbrauch_kuehlschrank_alt = verbrauch_kuehlschrank; 			    // alten Wert merken
          status_kuehlschrank = getState('shelly.0.shellyplusplugs#Kuehlschrank#1.Relay0.Switch').val;
          if (status_kuehlschrank) {
              verbrauch_kuehlschrank = getState('shelly.0.shellyplusplugs#Kuehlschrank#1.Relay0.Power').val;
          } else {
             verbrauch_kuehlschrank = 0;
          }
      
          verbrauch_gefrierschrank_alt = verbrauch_gefrierschrank; 		    // alten Wert merken
          status_gefrierschrank = getState('shelly.0.shellyplusplugs#Gefrierschrank#1.Relay0.Switch').val;
          if (status_gefrierschrank) {
              verbrauch_gefrierschrank = getState('shelly.0.shellyplusplugs#Gefrierschrank#1.Relay0.Power').val;
          } else {
             verbrauch_gefrierschrank = 0;
          } 
      
      // "Aktiv" / "Inaktiv" signalisiert den Statuswechsel!!!!
          
          if (verbrauch_gefrierschrank > (verbrauch_gefrierschrank_alt + 20)) {
              console.error('Gefrierschrank ist jetzt AKTIV... Verbrauch neu: ' + verbrauch_gefrierschrank + ' Verbrauch alt: ' + verbrauch_gefrierschrank_alt);
              gefrierschrank_aktiv = true;
          }
          if (verbrauch_gefrierschrank < (verbrauch_gefrierschrank_alt - 20)) {
              console.error('Gefrierschrank ist jetzt INAKTIV... Verbrauch neu: ' + verbrauch_gefrierschrank + ' Verbrauch alt: ' + verbrauch_gefrierschrank_alt);
              gefrierschrank_aktiv = false;
          }
      
      	if (verbrauch_kuehlschrank > (verbrauch_kuehlschrank_alt + 20)) {
              console.error('Kühlschrank ist jetzt AKTIV... Verbrauch neu: ' + verbrauch_kuehlschrank + ' Verbrauch alt: ' + verbrauch_kuehlschrank_alt);
              kuehlschrank_aktiv = true;
          }
          if (verbrauch_kuehlschrank < (verbrauch_kuehlschrank_alt - 20)) {
              console.error('Kühlschrank ist jetzt INAKTIV... Verbrauch neu: ' + verbrauch_kuehlschrank + ' Verbrauch alt: ' + verbrauch_kuehlschrank_alt);
              kuehlschrank_aktiv = false;
          }
      
      	
          
      }
      
      function Kuehlschrank_off() {
      	// Kühlschrank ausschalten
          if (status_kuehlschrank){
              setState('shelly.0.shellyplusplugs#Kuehlschrank#1.Relay0.Switch',false);
              //kuehlschrank_aktiv = false;  
              status_kuehlschrank = false; 
              console.log('Kühlschrank_off hat Status auf false gesetzt'); 
          }    
      	console.log('Kühlschrank ist ausgeschaltet');  
      }
      
      function Kuehlschrank_on() {
          // Kühlschrank einschalten falls ausgeschaltet
          if (!status_kuehlschrank) {
              setState('shelly.0.shellyplusplugs#Kuehlschrank#1.Relay0.Switch',true);
              console.log('Kühlschrank_on hat Status auf true gesetzt');  
          }
          console.log('Kühlschrank ist eingeschaltet');
      }
      
      function Gefrierschrank_off() {  
      		// Gefrierschrank  ausschalten
          if (status_gefrierschrank){
              setState('shelly.0.shellyplusplugs#Gefrierschrank#1.Relay0.Switch',false);
              gefrierschrank_aktiv = false;  
              //status_gefrierschrank = false;    
              console.log('Gefrierschrank_off hat Status auf false gesetzt');
          }
          console.log('Gefrierschrank ist ausgeschaltet');  
      }
      
      function Gefrierschrank_on() {  
          // Gefrierschrank eingeschalten falls ausgeschaltet
          if (!status_gefrierschrank) {
              setState('shelly.0.shellyplusplugs#Gefrierschrank#1.Relay0.Switch',true);
              console.log('Gefrierschrank_on hat Status auf true gesetzt');
          }
          console.log('Gefrierschrank ist eingeschaltet');  
      }
      
      function Showall () { 
      console.error('Aktuelle Messungen: ')
          if (status_kuehlschrank) {
              console.error('Kühlschrank ist eingeschaltet'); 
          } else {
              console.error('Kühlschrank ist ausgeschaltet'); 
          }
          if (kuehlschrank_aktiv) {
              console.error('Kühlschrank ist Aktiv. Verbr. neu:   ' + verbrauch_kuehlschrank + ' Verbr. alt: ' + verbrauch_kuehlschrank_alt);
          } else{
              console.error('Kühlschrank ist Inaktiv. Verbr. neu: ' + verbrauch_kuehlschrank + ' Verbr. alt: ' + verbrauch_kuehlschrank_alt);
          }
      
          if (status_gefrierschrank) {
              console.error('Gefrierschrank ist eingeschaltet'); 
          } else {
              console.error('Gefrierschrank ist ausgeschaltet'); 
          }
          if (gefrierschrank_aktiv) {
              console.error('Gefrierschrank ist Aktiv. Verbr. neu:   ' + verbrauch_gefrierschrank + ' Verbr. alt: ' + verbrauch_gefrierschrank_alt);
          } else{
              console.error('Gefrierschrank ist Inaktiv. Verbr. neu: ' + verbrauch_gefrierschrank + ' Verbr. alt: ' + verbrauch_gefrierschrank_alt);
          }
       }
      
          
      
      // Jede Minute ausführen
      schedule('0 * * * * *', Optimierung); 
      // Zur Sicherheit alle Kühlgeräte abends aktiv einschalten
      // schedule('0 21 * * * *', Kuehlung_on);
      
      B 1 Reply Last reply Reply Quote 0
      • B
        berndsolar13 @opöl last edited by

        @opöl

        bin auch so ein Optimierer 😄
        Aber Kühl und Gefrierschrank hab ich nur in der Überwachung, denn der Läuft doch von selbst an.
        Bei mir geht der jede Stunde 1x an, für 20 min, dann ist er wieder 40 Minuten aus.

        Den manuell zu schalten ? Ich denke nicht das dies eine gute Idee ist.
        Oder ist deine Steuerung kaputt ?

        O 1 Reply Last reply Reply Quote 0
        • O
          opöl @berndsolar13 last edited by

          @berndsolar13

          Naja, mir sind die Bedenken bekannt.
          Aber erstens werden die Geräte ja leistungslos geschaltet, also ausgeschaltet, wenn sie inaktiv sind. Beim Einschalten sind sie eh immer inaktiv. Das Aktivieren und Inaktivieren bleibt ja bei der internen Logik.
          Dann soll das ja nicht dauernd, sondern nur bei nicht ausreichender PV Leistung stattfinden. Und letztlich habe ich natürlich gemessen, dass das Kühlergebnis nicht leidet.
          Ich konstruiere mal einen Fall um klar zu machen, was ich erreichen möchte:

          Angenommen ich habe einen PV Überschuss von 50 W in den Morgenstunden. Ist halt nur eine Balkon PV😎
          Dann möchte ich zuerst meinen Kaffee kochen und die Kühlgeräte sollen aus sein, Danach sollen sie nacheinander aktiv sein, um diese 50 W zu nutzen (Kühlschrank hat 50W, Gefrierschrank hat 60W Leistungsaufnahme). Damit habe ich den zur Verfügung stehenden Überschuss durchgehend genutzt.
          Die alternative ist, alle drei Geräte laufen zufallsgesteuert gleichzeitig und ich kaufe den Strom und danach speise ich die 50W ein, weil alles aus ist. Das hört sich zwar nach Erbsenzählerei an, aber hochgerechnet auf wieviele Haushalte macht das wieviel?
          Und dann kommt noch der Spieltrieb dazu.

          Über einen Tipp, wie ich die Hysterese beim Umschalten in den Griff kriege, würde ich mich freuen.
          Gruß

          B 1 Reply Last reply Reply Quote 0
          • B
            berndsolar13 @opöl last edited by berndsolar13

            @opöl

            Du könntest es auch eleganter lösen.
            Du schaust wann der Gefrierschrank aus gegangen ist.
            Bei mir würde es 40 Minuten dauern, bis er wieder anspringt.

            In dem Zeitfenster hättest du zeit zum Kaffee kochen 😉

            Noch besser du automatisierst es, und die Maschine schalter IOBroker an 😄

            O 1 Reply Last reply Reply Quote 0
            • O
              opöl @berndsolar13 last edited by

              @berndsolar13
              Sorry, ich verfolge eigentlich den Ansatz, iobroker die Optimierung zu übertragen.
              Unbestritten ist, dass es auch andere Lösungen gibt.

              Gruß

              B 1 Reply Last reply Reply Quote 0
              • B
                berndsolar13 @opöl last edited by

                @opöl

                hätte da was für dich
                https://www.youtube.com/watch?v=ozHthXD9cN0

                Die Idee ist klasse, das werde ich mal ausprobieren 😉

                O 1 Reply Last reply Reply Quote 0
                • O
                  opöl @berndsolar13 last edited by

                  @berndsolar13

                  vielen Dank. Das kannte ich noch nicht.
                  Bis auf das noch nicht vorhandene E- Auto und die größere PV Fläche verfolgen wir exakt den gleichen Ansatz. Das bestärkt mich doch glatt darin, dass meine Idee so blöd nicht ist.

                  Auf die Idee, den Gefrierschrank als Puffer zu benutzen bin ich allerdings noch nicht gekommen.
                  Da mache ich mich mal schlau, wie das im Detail geregelt wurde.

                  Wäre übrigens trotzdem schön, wenn mir jemand bei der ursprünglichen Frage helfen könnte.

                  Gruß

                  B 1 Reply Last reply Reply Quote 0
                  • B
                    berndsolar13 @opöl last edited by

                    @opöl

                    hab mal einen meiner Tuya Wlan Sensoren in den Gefrierschrank gesteckt.
                    Bei -13 ist scheinbar Ende, tiefer geht er wohl nicht.

                    Bis -30° ob es dafür einen "drahtlosen" Sensor gibt ?

                    O 1 Reply Last reply Reply Quote 0
                    • O
                      opöl @berndsolar13 last edited by

                      @berndsolar13
                      Der Copilot meint, der TAPO T315 Temperatur- und Feuchtigkeitsmonitor Sensor wäre geeignet. Geht bis -20 Grad.

                      Sonst wohl so etwas: DS18B20 Temperatursensor Adapter ESP8266 ESP-01 ESP-01S WIFI Wireless Modul https://encr.pw/ILooN
                      Muss man halt ein eigenes Gehäuse drum bauen und mal schauen, wie weit man mit einer Batterie so kommt. Ich denke, das mache ich mal nach meinem Urlaub. Die 2 Taler habe ich übrig.

                      Gruß

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

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      919
                      Online

                      31.6k
                      Users

                      79.4k
                      Topics

                      1.3m
                      Posts

                      2
                      9
                      379
                      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