Navigation

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

    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

    E3DC Hauskraftwerk steuern

    This topic has been deleted. Only users with topic management privileges can see it.
    • smartboart
      smartboart @ArnoD last edited by

      Würde gerne diese Zeiten gleich in MEZ bzw. MESZ anzeigen, da mit UTC ständig überlegt werden muss, wann der Regelbeginn ist.

      Finde ich super das du das aufgenommen hast.. Das war ja auch der Grund warum ich es auch angemerkt hatte...

      1 Reply Last reply Reply Quote 0
      • smartboart
        smartboart @ArnoD last edited by

        @ArnoD denke auch das proplanta genauer liegt... Hab nochmal genauer geschaut.. Die Kurve von proplanta passt generell zur prognose.. Ist halt bei mir zu hoch weil ich die nutzbare Energie messe.... Aber das geht ja mit dem korrekturfaktor klar...
        Vlt.. Hilft aber zusaetzlich auch ein Kupfer Nagel...

        1 Reply Last reply Reply Quote 0
        • A
          ArnoD last edited by

          Neue Version 0.2.06 hochgeladen und neue View Stand 14.08.2020.

          Änderungen:
          Version: 0.2.06 Regelzeitraum Start, Ende und Ladezeitende werden jetzt nach der Formel von
          Eberhard berechnet und je nach Einstellung in MEZ oder MESZ in VIS angezeigt. Es wird die Systemzeit vom IoBroker verwendet, da ich über Modbus keine Zeit vom E3DC bekomme.
          Wenn diese beiden Zeiten nicht synchron sind, stimmen die Zeiten natürlich nicht. Die manuelle
          Anwahl der 5 Einstellungen ist jetzt möglich, Danke an smartboart für seine Vorarbeit.

          Version: 0.2.05 Zeiten werden in MEZ umgerechnet und in eigenen States gespeichert:'Winterminimum_MEZ','Sommermaximum_MEZ','Sommerladeende_MEZ','HTon_MEZ','HToff_MEZ'. Fehler in der PrognoseBerechnung_kWh_heute korrigiert, durch die laufende Neuberechnung muss die bereits produzierte PV-Leistung von der Prognose Tag abgezogen werden und das Gleiche bei nEigenverbrauchTag in kWh. nKorrFaktor geändert, es wird jetzt der % Wert angegeben um den die Prognose reduziert werden soll.

          Version: 0.2.04 Nach der Aktualisierung Proplanta wird die Function main() aufgerufen und neu berechnet

          smartboart 3 Replies Last reply Reply Quote 1
          • smartboart
            smartboart @ArnoD last edited by

            @ArnoD super... Komm heut nicht mehr dazu... Werds morgen gleich testen...

            1 Reply Last reply Reply Quote 0
            • smartboart
              smartboart @ArnoD last edited by smartboart

              @ArnoD sagte in E3DC Hauskraftwerk steuern:

              Version: 0.2.05 Zeiten werden in MEZ umgerechnet und in eigenen States

              Hallo Arno...

              Wenn ich das richtig deute, muss zwischen Sommerzeit und Winterzeit
              über vis umgestellt werden...

              ich habe hierzu etwas um das zu automatisieren...siehe script unten..

              https://forum.iobroker.net/topic/2730/sommerzeit-winterzeit-in-script-abfragen

              es muss allerdings das npm modul is-it-bst im javascript adapter eingebunden werden.

              const idSommerzeit ='javascript.1.PVAnlage.E3DC-Control.Allgemein.Anwahl_MEZ_MESZ'/*true = MESZ ,false = MEZ*/;
              // Sommerzeit ermitteln
              var dst = require('is-it-bst');
              setState(idSommerzeit, dst());  // Script start
              if(LogAusgabe)log('MESZ Status '+dst);
              schedule("0 4 24-31 3,10 7", function() {
              setState("Sommerzeit", dst());
              if(LogAusgabe)log('MESZ Status '+dst);
              });
              

              das kommt dann zurück. siehe log..


              javascript.1 (11597) script.js.common.Tests.Sommerzeit: Statusfunction (date) { date = date || new Date(); var year = date.getUTCFullYear(), timestamp = date.getTime(), day, x; // see if date is before the 1am on the last sunday in march x = new Date(year + '-03-31 01:00Z'); day = x.getUTCDay(); if (day !== 0) x = new Date(year + '-03-' + (31 - day) + ' 01:00Z'); if (timestamp < x.getTime()) return false; // see if date is after the last sunday in october x = new Date(year + '-10-31 01:00Z'); day = x.getUTCDay(); if (day !== 0) x = new Date(year + '-10-' + (31 - day) + ' 01:00Z'); if (timestamp >= x.getTime()) return false; // it's summer return true; }

              A 1 Reply Last reply Reply Quote 0
              • smartboart
                smartboart @ArnoD last edited by smartboart

                @ArnoD
                und noch ne kleine Änderung...
                Hab hier noch ne Verzögerung eingebaut..
                Besseres Handling und um Programmwahl nicht 2 mal ausführen zu müssen wenn die Automatik nicht schnell genug abgewählt wurde...

                on({id: instanz + PfadEbene1 + PfadEbene2[1] + 'EinstellungAnwahl'}, function(obj) {
                    EinstellungAnwahl = getState(obj.id).val
                    setState(instanz + PfadEbene1 + PfadEbene2[1]+'Automatik',false,true);
                    if(LogAusgabe)log("Trigger manuelle Programmvorwahl");
                    setTimeout(function(){main();},200);//Automatik Abwahl Zeit geben bevor main ausgeführt wird
                });
                
                A 1 Reply Last reply Reply Quote 0
                • A
                  ArnoD @smartboart last edited by ArnoD

                  @smartboart sagte in E3DC Hauskraftwerk steuern:

                  @ArnoD sagte in E3DC Hauskraftwerk steuern:

                  Version: 0.2.05 Zeiten werden in MEZ umgerechnet und in eigenen States

                  Hallo Arno...

                  Wenn ich das richtig deute, muss zwischen Sommerzeit und Winterzeit
                  über vis umgestellt werden...

                  ich habe hierzu etwas um das zu automatisieren...siehe script unten..

                  https://forum.iobroker.net/topic/2730/sommerzeit-winterzeit-in-script-abfragen

                  es muss allerdings das npm modul is-it-bst im javascript adapter eingebunden werden.

                  const idSommerzeit ='javascript.1.PVAnlage.E3DC-Control.Allgemein.Anwahl_MEZ_MESZ'/*true = MESZ ,false = MEZ*/;
                  // Sommerzeit ermitteln
                  var dst = require('is-it-bst');
                  setState(idSommerzeit, dst());  // Script start
                  if(LogAusgabe)log('MESZ Status '+dst);
                  schedule("0 4 24-31 3,10 7", function() {
                  setState("Sommerzeit", dst());
                  if(LogAusgabe)log('MESZ Status '+dst);
                  });
                  

                  das kommt dann zurück. siehe log..


                  javascript.1 (11597) script.js.common.Tests.Sommerzeit: Statusfunction (date) { date = date || new Date(); var year = date.getUTCFullYear(), timestamp = date.getTime(), day, x; // see if date is before the 1am on the last sunday in march x = new Date(year + '-03-31 01:00Z'); day = x.getUTCDay(); if (day !== 0) x = new Date(year + '-03-' + (31 - day) + ' 01:00Z'); if (timestamp < x.getTime()) return false; // see if date is after the last sunday in october x = new Date(year + '-10-31 01:00Z'); day = x.getUTCDay(); if (day !== 0) x = new Date(year + '-10-' + (31 - day) + ' 01:00Z'); if (timestamp >= x.getTime()) return false; // it's summer return true; }

                  Hatte die Umschaltung zuerst automatisch, doch dann war ich mir nicht sicher ob das international funktioniert.
                  Sollte aber zumindest in der Schweiz,Österreich und Italien funktionieren. 🙂
                  Werde es einbauen Danke.

                  1 Reply Last reply Reply Quote 0
                  • A
                    ArnoD @smartboart last edited by

                    @smartboart sagte in E3DC Hauskraftwerk steuern:

                    @ArnoD
                    und noch ne kleine Änderung...
                    Hab hier noch ne Verzögerung eingebaut..
                    Besseres Handling und um Programmwahl nicht 2 mal ausführen zu müssen wenn die Automatik nicht schnell genug abgewählt wurde...

                    on({id: instanz + PfadEbene1 + PfadEbene2[1] + 'EinstellungAnwahl'}, function(obj) {
                        EinstellungAnwahl = getState(obj.id).val
                        setState(instanz + PfadEbene1 + PfadEbene2[1]+'Automatik',false,true);
                        if(LogAusgabe)log("Trigger manuelle Programmvorwahl");
                        setTimeout(function(){main();},200);//Automatik Abwahl Zeit geben bevor main ausgeführt wird
                    });
                    

                    Hatte es bei mir gestestet und keine Probleme festgestellt, musste die Verzögerung beim Aufruf der main() funktion nur bei der Abfrage der Proplanta Werte einbauen, da die Rückantwort zu langsam war. Aber es schadet generel nicht etwas zu warten und ich werde auch das übernehmen. 🙂

                    smartboart 1 Reply Last reply Reply Quote 0
                    • smartboart
                      smartboart @ArnoD last edited by

                      @ArnoD ich muss es nochmal los werden... Das ist wirklich wieder richtig Klasse Arbeit die du hier ablieferst.. 👍 👍 👍

                      1 Reply Last reply Reply Quote 0
                      • A
                        ArnoD last edited by ArnoD

                        Neue Version 0.2.07 hochgeladen

                        Änderungen:
                        Version: 0.2.07 Umschaltung MEZ oder MESZ wird automatisch ausgeführt. Man kann aber immer noch manuell umschalten.
                        Verzögerung beim Aufruf der main() function nach manueller Anwahl der Einstellungen 1-5.
                        Es muss das NPM-Module "is-it-bst" in der Javascript Instanz installiert werden.

                        smartboart A 2 Replies Last reply Reply Quote 0
                        • smartboart
                          smartboart @ArnoD last edited by smartboart

                          @ArnoD
                          Hallo Arno, ich habe ein script geschrieben, welches dein Script ohne source Analytics auskommen lässt.
                          Bei Sekunden Pollzeit des Modbusadapter, sollte das Script so genau sein wie source analytics.

                          Je kleiner die Pollzeit vom modbus adapter desto genauer wird das Ergebnis sein...

                          Ich hoffe ich habe keinen Denkfehler, heute Abend weiß ich ob es ordentlich gezählt hat.

                          Habe vernommen, dass du ja auch auf den adapter verzichten möchtest?

                          Da es für die Prognose wohl doch besser ist mit dem Ertrag zu rechnen und nicht mit dem was entnommen wird, da der Verbrauch im Haus und Ladung bzw Batterieentnahme doch eher schwankt, habe ich das nun so gelöst.

                          Wenn du Interesse hast es zu übernehmen, kannst du mit testen wie genau es ist.. hier das Script...

                          createState('javascript.1.PVAnlage.PVArbeitE3DC.heute',    0, {name: 'PV Leistung Heute laufender Tag', type: 'number', unit: 'kWh' });
                          
                          const idLeistung = 'modbus.1.holdingRegisters.40068_PV_Leistung';
                          const idPVErtrag = 'javascript.1.PVAnlage.PVArbeitE3DC.heute'
                          
                          var debug = false;
                          var logging = true;
                          var count = 0;
                          var Summe = 0;
                          
                          // Zaehlem
                          on(idLeistung, function(dp) {
                          var Leistung = getState(idLeistung).val;
                          if(Leistung >= 1){
                          count ++
                          Summe = Summe + Leistung;
                          if(debug)log(['Summe: ' + Summe, ' Zaehler: '+count, ' Addition: + ' +Leistung ].join(''));
                              }
                          });
                          
                          // jede minute in W/h umrechen W = P*t
                          schedule ("* * * * *", function () { 
                          if(debug)log('minütlicher Schedule aktiv');    
                          if(count >0 && Summe >0){    
                          var PVErtrag = getState (idPVErtrag).val    
                          var Pmin = Summe/count;
                          setState(idPVErtrag, PVErtrag + Pmin/60/1000,true);//kWh
                          if(debug)log(['Schedule Umrechnen W = P*t.  Minutenwert Leistung: '+ Pmin, ' Minutenwert Arbeit: ' + (Pmin/60/1000), ' Tageswert Ertrag: ' +PVErtrag ].join(''));
                          setTimeout(function(){
                          count=0;
                          Summe=0;
                          if(debug)log(['verzögerter Reset: Count =  '+ count, ' Summe = ' + Summe ].join(''));
                          },100);
                              }
                          });
                          
                          // jeden Tag um 23:59 Tageswert nullen.
                          schedule({hour: 0, minute: 1}, function () { 
                          setState(idPVErtrag,0,true);
                          if (logging)log('Tagesertragswert auf 0 gesetzt');
                          });
                          

                          EDIT: hatte noch nen Fehler bei 0 Leistungswerten...
                          ist oben korrgiert.
                          Arbeite noch daran den minütlichen schedule zu stoppen wenn nicht mehr benötigt...

                          smartboart 1 Reply Last reply Reply Quote 0
                          • smartboart
                            smartboart @smartboart last edited by smartboart

                            @ArnoD

                            und hier nochmal mit Aktivierung und Deaktivierung des minütlichen Schedule.
                            Somit werden der minütliche Schedule auch nur ausgeführt wenn es was zum Rechnen gibt...

                            Hab es noch nicht testen können, also hier weiß ich erst morgen ob es klappt oder noch ne Kleinigkeit geändert werden muss...

                            createState('javascript.1.Test.E3DC.Ertrag_Heute',    0, {name: 'Ertrag Heute laufender Tag', type: 'number', unit: 'kWh' });
                            
                            const idLeistung = 'modbus.1.holdingRegisters.40068_PV_Leistung';
                            const idPVErtrag = 'javascript.1.Test.E3DC.Ertrag_Heute'
                            
                            var debug = true;
                            var logging = true;
                            var count = 0;
                            var Summe = 0;
                            var Timer = null;
                            var merker = false;
                            
                            
                            // Zaehlem
                            on(idLeistung, function(dp) {
                                var Leistung = getState(idLeistung).val;
                                if(Leistung >= 1){
                                if(merker)schedulestart();
                                merker = false;
                                count ++
                                Summe = Summe + Leistung;
                                if(debug)log(['Summe: ' + Summe, ' Zaehler: '+count, ' Addition: + ' +Leistung ].join(''));
                                }
                            });
                            
                            //Skriptstart
                            schedulestart()
                            
                            // jede minute in W/h umrechen W = P*t
                            function schedulestart(){
                            if(debug)log('Funktion Schedulestart aktiv');     
                            var AufDieMinute =  '* * * * *';
                            Timer = schedule(AufDieMinute, function(){   
                            if(debug)log('minuten Schedule aktiv');       
                            var PVErtrag = getState (idPVErtrag).val;   
                            var Pmin = Summe/count;
                            if(count>0 && Summe >0){
                            setState(idPVErtrag, PVErtrag + Pmin/60/1000,true);//kWh
                            if(debug)log(['Schedule Umrechnen W = P*t.  Minutenwert Leistung: '+ Pmin, ' Minutenwert Arbeit: ' + (Pmin/60/1000), ' Tageswert Ertrag: ' +PVErtrag ].join(''));
                            setTimeout(function(){
                            count=0;
                            Summe=0;
                            if(debug)log(['Reset: Count =  '+ count, ' Summe = ' + Summe ].join(''));
                            },100);
                                }else{
                                    if(count===0 && Summe ===0){
                                        clearSchedule(Timer);
                                        merker = true;
                                        if(logging)log('minuten Schedule gestoppt');
                                        }
                                    }  
                                });
                            }
                            
                            
                            // jeden Tag um 23:59 Tageswert nullen.
                            schedule({hour: 0, minute: 1}, function () { 
                            setState(idPVErtrag,0,true);
                            if (logging)log('Tagesertragswert auf 0 gesetzt');
                            });
                            
                            
                            A 2 Replies Last reply Reply Quote 0
                            • A
                              Abyss @ArnoD last edited by

                              @ArnoD

                              Auch von meiner Seite nochmal ein großes DANKE!! für deine Arbeit.
                              So macht der E3DC gleich noch mehr Spaß.

                              kurzer Hinweis zu der neuen Version 0.2.07, evtl sollte hier noch ein Hinweis ins Changelog, dass ein zusätzliches Javascript Modul "is-it-bst" notwendig ist.

                              A 2 Replies Last reply Reply Quote 0
                              • A
                                ArnoD @smartboart last edited by

                                @smartboart Das ist ja super. 🙂
                                Werde es heute integrieren und testen.

                                1 Reply Last reply Reply Quote 0
                                • A
                                  ArnoD @Abyss last edited by

                                  @Abyss
                                  Ja richtig, sollte auf alle Fälle drin stehen.
                                  Danke.

                                  1 Reply Last reply Reply Quote 0
                                  • A
                                    ArnoD @Abyss last edited by

                                    @Abyss habe es bei der Anleitung im ersten Post hier ergänzt und werde es auch ins Changelog eintragen.

                                    1 Reply Last reply Reply Quote 0
                                    • A
                                      ArnoD @smartboart last edited by

                                      @smartboart

                                      Habe mir das Script jetzt mal angeschaut und verstehe nicht ganz wann dein merker auf true gesetzt wird.
                                      Beim Start wird dieser auf false gesetzt und dürfte eigentlich nie true werden oder übersehe ich hier was. 🙂

                                      smartboart 1 Reply Last reply Reply Quote 0
                                      • smartboart
                                        smartboart @ArnoD last edited by

                                        @ArnoD sagte in E3DC Hauskraftwerk steuern:

                                        @smartboart

                                        Habe mir das Script jetzt mal angeschaut und verstehe nicht ganz wann dein merker auf true gesetzt wird.
                                        Beim Start wird dieser auf false gesetzt und dürfte eigentlich nie true werden oder übersehe ich hier was. 🙂

                                                if(count===0 && Summe ===0){
                                        
                                                    clearSchedule(Timer);
                                        
                                                    merker = true;
                                        
                                                    if(logging)log('minütlicher Schedule gestoppt');
                                        
                                        smartboart 1 Reply Last reply Reply Quote 0
                                        • smartboart
                                          smartboart @smartboart last edited by smartboart

                                          oh ja...habe den scriptstart vergessen zu kopieren...

                                          //skriptstart
                                          schedulestart();
                                          

                                          habs oben geändert..

                                          1 Reply Last reply Reply Quote 0
                                          • A
                                            ArnoD last edited by

                                            Ok habe dein Script jetzt mal übernommen und lass beide Zähler Parallel laufen, mal schauen wie groß der Unterschied ist.
                                            Ich habe im Modbus Adapter Pol delay auf 1 sek, eingestellt um die Abtastrate zu erhöhen.
                                            bild1.png

                                            Das scheint aber source Analytics nicht weiter zu beeinflussen, vermute das dort eine andere Pol Zeit verwendet wird.
                                            Über dein Script wird auf alle Fälle eine höherer PV Ertrag berechnet.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            501
                                            Online

                                            31.7k
                                            Users

                                            79.9k
                                            Topics

                                            1.3m
                                            Posts

                                            70
                                            3339
                                            1369976
                                            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