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

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    E3DC Hauskraftwerk steuern

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

      @ArnoD Ich dachte bisher vor Beginn der Regelzeit würde sich E3DC-Control gar nicht einmischen, also keine Steuerbefehle an das Hauskraftwerk senden und der Speicher einfach mit volle Pulle (heute zwischen 4 und 5 kW) laden bis Ladeschwelle (bei mir heute 100 %) erreicht ist? Und erst bei Erreichen von Ladeschwelle wird so weitergeladen (und geregelt), dass zum Ladeende der Zielwert erreicht ist? Andererseits wurde aber möglicherweise auch schon geregelt um den Sockel zu erreichen (muss ja z.B. falls Unload noch nicht erfüllt wurde bis Regelbeginn). Ich bin verwirrt...im Sommer war das einfacher festzustellen, als die Zeitpunkte viel weiter auseinander lagen... 🙂

      Jedenfalls gehe ich also falsch in der ursprünglichen Annahme, dass E3DC-Control immer nur im Zeitfenster Start und Ende Regelzeitraum regelt. Wäre mir vielleicht besser aufgefallen, wenn es im Sommer schon die Zeitangaben übersichtlich in ioBroker gegeben hätte... 😉

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

        Mal was anderes: Ihr (@ArnoD und @smartboart) habt ja deutlich mehr Erfahrung mit ioBroker als ich. Ich hab' hier ne Funktion durch den Scheduler ausgelöst, die läuft einige Tage gut genau um 10:02 Uhr, dann jedoch gibt es irgendwann einen Tag und es passiert nichts. Ich müsste im Log unterhalb des Skripts wenigstens eine Logausgabe sehen. Selbst im heruntergeladen Log für den vollständigen heutigen Tag taucht der Name des Skripts nicht auf, also keine Logausgabe.

        Habt ihr das auch mal festgestellt, dass der Scheduler nicht mehr auslöst? Anders kann ich mir die fehlenden Logausgaben im Log nicht erklären...

        // Ablauf: Um 10:00 Uhr beendet die Wasserpumpe die Gartenbewässerung, um 10:01 Uhr werden die beiden Motorkugelhähne
        // geschlossen, um 10:02 Uhr kann frühestens die Teichbewässerung starten.
        schedule('{"time":{"exactTime":true,"start":"10:02"},"period":{"days":1}}', function(){
            log("Scheduler Pondwaterlevel am " + new Date());
            if (getState(pondWaterLevelAutomaticStateId).val){
                checkAndFillPondWithWater();
            } else {
                log("Automatischer Wasserausgleichausgleich für den Teich ist ausgeschaltet, keine Bewässerung.");
            }
        });
        
        smartboart 1 Reply Last reply Reply Quote 0
        • smartboart
          smartboart @stevie77 last edited by smartboart

          @stevie77 sagte in E3DC Hauskraftwerk steuern:

          // Ablauf: Um 10:00 Uhr beendet die Wasserpumpe die Gartenbewässerung, um 10:01 Uhr werden die beiden Motorkugelhähne

          nein meine schedule funktionieren zuverlässig....
          baue die auch anders auf...
          probier mal den schedule...
          '2 10 * * *'
          schedule('2 10 * * *', function(){

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

            @smartboart sagte in E3DC Hauskraftwerk steuern:

            2 10 * * *

            Probier' ich mal parallel. Mal sehen, welche Funktion die nächsten Tage länger loggt...
            Das Komische ist ja, es funktioniert ja einige Tage lang und dann setzt es irgendwann aus. Ist aber offiziell über die Skriptfunktion rechts oben im ioBroker generiert (auf die Arno glaub' ich irgendwann mal hier hingewiesen hatte), sollte ja schon eigentlich passen. Einige andere Schedules, die so ähnlich sind, laufen auch lange zuverlässig.

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

              @stevie77
              ja aber du hast ein wizard konfiguriert und kein cron...
              Was auch immer der unterschied ist...
              ich würde es auch so schreiben...

              // Ablauf: Um 10:00 Uhr beendet die Wasserpumpe die Gartenbewässerung, um 10:01 Uhr werden die beiden Motorkugelhähne
              
              // geschlossen, um 10:02 Uhr kann frühestens die Teichbewässerung starten.
              
              schedule('2 10 * * *', function(){
              log("Scheduler Pondwaterlevel am " + new Date());
              var Automatic = getState(pondWaterLevelAutomaticStateId).val;
              if (Automatic){
              checkAndFillPondWithWater();
              } else {
              log("Automatischer Wasserausgleichausgleich für den Teich ist ausgeschaltet, keine Bewässerung.");
                  }
              });
              
              S 1 Reply Last reply Reply Quote 0
              • S
                stevie77 @smartboart last edited by

                @smartboart Mir ist der Unterschied zwischen cron und wizard nicht wirklich klar. Und 5 min googeln brachte auch keine Erhellung. Werden die Daten im ioBroker-Skript nicht über den Wizard ebenfalls in einen cron-Job umgesetzt? Kann natürlich sein, dass der Wizard teilweise buggy ist, aber ich hätte jetzt vermutet, dass er im Hintergrund ebenfalls einen cron-Job anlegt und es dann aufs gleiche raus kommt (da es ja einige Tage funktioniert).

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

                  Ich komm jetzt auch endlich mal wieder dazu eure Scripte auf den aktuellen Stand zu bringen...

                  Was ich nicht ganz rauslesen konnte:
                  Ist das Autonomiezeitscript jetzt in Arnos Script mit integriert, oder muss ich mir das als eigenständiges Script zusätzlich mit anlegen?

                  Danke schonmal

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

                    @Abyss sagte in E3DC Hauskraftwerk steuern:

                    Ich komm jetzt auch endlich mal wieder dazu eure Scripte auf den aktuellen Stand zu bringen...

                    Was ich nicht ganz rauslesen konnte:
                    Ist das Autonomiezeitscript jetzt in Arnos Script mit integriert, oder muss ich mir das als eigenständiges Script zusätzlich mit anlegen?

                    Danke schonmal

                    Ist ein eigenständiges script...

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

                      Habe heute entdeckt, dass ich nen neue Firmware / Update erhalten habe. Muss irgendwann zwischen letzter und dieser Woche passiert sein..
                      P10_2020_068
                      Muss mal ne Pushnachicht aktivieren für das Objekt...

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

                        @smartboart sagte in E3DC Hauskraftwerk steuern:

                        Habe heute entdeckt, dass ich nen neue Firmware / Update erhalten habe. Muss irgendwann zwischen letzter und dieser Woche passiert sein..
                        P10_2020_068
                        Muss mal ne Pushnachicht aktivieren für das Objekt...

                        Ich hab's seit 28.10.2020 02:04:25.
                        Oder so...und wie funktioniert ne Push-Nachricht? Mit nem Mail-Adapter o.ä.?

                        // Speichert zum Zeitpunkt eines Firmware-Updates das Datum des Updates und die alte Versionsnummer.
                        const lastFirmwareUpdate = 'javascript.0.e3dc.lastFirmwareUpdate';
                        const lastFirmware = 'javascript.0.e3dc.lastFirmware';
                        createState(lastFirmwareUpdate);
                        createState(lastFirmware);
                        const firmware = 'modbus.0.holdingRegisters.40052_Firmware';
                        
                        on(firmware, function(obj){
                            var actualDate = new Date();
                            var actualDateString = formatDate(actualDate, "DD.MM.YYYY hh:mm:ss");
                            setState(lastFirmwareUpdate, actualDateString);
                            setState(lastFirmware, obj.oldState.val);
                        });
                        
                        smartboart 1 Reply Last reply Reply Quote 0
                        • smartboart
                          smartboart @stevie77 last edited by smartboart

                          @stevie77
                          Unbenannt.JPG
                          Unbenannt.JPG

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

                            @stevie77 sagte in E3DC Hauskraftwerk steuern:

                            Ich hab's seit 28.10.2020 02:04:25.

                            Wo hast du eigentlich das Datum auslesen können ?
                            Wenn ich mir das Änderungsdatum im Adapter ansehe ist dort der 05.11.2020 eingetragen, was eigentlich nicht sein kann.
                            In der Übersicht im E3DC sehe ich nur das Datum der einzelnen Versionen und dort ist das aktuellste Datum der 23.10.2020 und 28.10.2020
                            und geändert wurden:
                            libSanyoBattery 23.10.2020
                            libTimeSource 23.10.2020
                            libNetworkService 23.10.2020
                            libP10BatteryDetector 23.10.2020
                            libP10StorageEntity 23.10.2020
                            libBatteryToDatabase 28.10.2020

                            @smartboart
                            Die Lösung funktioniert für Telegram für Pushover kann folgende function verwendet werden:

                            
                            function send_pushover (device, message, titel, prio) {
                               sendTo("pushover.0", { 
                                    device: device,
                                    message: message, 
                                    title: titel, 
                                    priority: prio,
                                    retry: 30,
                                    expire: 3600,
                                    html: 1
                                }); 
                            }
                            

                            @stevie77
                            Es gibt verschiedene Adapter im IoBroker mit denen Push Nachrichten möglich sind.
                            Eine gute Auflistung der Vor und Nachteile findest du hier:
                            Link Text

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

                              Hmm, Telegram hab' ich nicht (und lege ich mir deswegen nicht zu), die anderen erwähnten scheinen kostenpflichtig zu sein. Was ist mit der guten alten E-Mail geworden? 😉
                              Naja, ist mir auch nicht so wichtig. Wenn mir ein Update auffällt, dann schaue ich nach, wann es gekommen ist.
                              @ArnoD Das Datum wird durch mein kleines Skript geschrieben, das ich weiter unten gepostet hatte. Auch mal ein kleiner Beitrag von mir, hehe. 🙂

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

                                @stevie77 email geht auch mittels Script... Sent to mail... Mit dem email Adapter..Damit kannst dein Script ganz leicht erweitern...
                                Gibt sogar einen WhatsApp Adapter.. Ob der auch so komfortabel über die objejtliste geht Weiss ich nicht... Benutze nur telegramm als messenger..

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

                                  Was is mit proplanta los diesen Monat?
                                  Screenshot_20201107_094951_de.ozerov.fully.jpg

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

                                    @smartboart Bei mir auch kein so richtig überzeugendes Bild...ist wohl schwer in der Jahreszeit?! 🙂

                                    d94fefee-515c-460c-a891-748eda711d9c-image.png

                                    E-Mail gucke ich mir dann vielleicht mal an, danke für den Tipp.

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

                                      @stevie77 sagte in E3DC Hauskraftwerk steuern:

                                      @smartboart Bei mir auch kein so richtig überzeugendes Bild...ist wohl schwer in der Jahreszeit?!

                                      Komisch der letzte Monat war ne Punktlandung.. Kam aber auch nix von oben..

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

                                        @smartboart
                                        sieht bei mir mit Proplanta auch nicht besser aus 😞
                                        Habe gestern auf Forecast umgeschaltet.
                                        Bild1.png

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

                                          @stevie77 sagte in E3DC Hauskraftwerk steuern:

                                          Hmm, Telegram hab' ich nicht (und lege ich mir deswegen nicht zu), die anderen erwähnten scheinen kostenpflichtig zu sein.

                                          Ich verwende Pushover. Man muss sich zwar registrieren, ist aber kostenlos wenn mann nicht über 7500 Nachrichten im Monat verschickt.
                                          Diese Grenze habe ich noch nie erreicht 🙂
                                          Der Vorteil ist einfach die Geschwindigkeit der Übertragung und die möglichen Schnittstellen. Wenn es bei mir an der Türe klingelt, bekomme ich das sofort mit und nicht eben Zeitverzögert.
                                          Mann hat z.B. bei Pushover eine E-Mail Adresse an die mann auch Nachrichten schicken kann um diese über die App zu empfangen. Das nutze ich bei der Homematic, um eine Meldungen bei Fehler an mein Handy zu schicken.

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

                                            Ich habe jetzt mal die Scriptsammlung für E3DC Modbus etwas aufgeräumt und geordnet. 🙂
                                            Wenn das jemand auch übernehmen will hier das Script:

                                            /*
                                            Script Sammlung für E3DC
                                            Modbus Register 40082 Aufteilung "Autarkie und Eigenverbrauch in Prozent                             Autor:Andre Germann
                                            Modbus Register 40002 Aufteilung "Modbus Firmware Version"                                           Autor:Andre Germann
                                            Modbus Register 40085 "EMS-Status" Datenwort Dez. in BIT_Ausgabe für Vis umwandeln                   Autor:ArnoD
                                            Modbus Register 40088 "Wallbox_x_CTRL" Datenwort Dez. in BIT_Ausgabe für Vis umwandeln	             Autor:ArnoD
                                            E3DC dynamische Autonomiezeitberechnung V0.0.8                                                       Autor:Smartboard
                                            Bei Firmware-Updates das Datum des Updates und die alte Versionsnummer speichern                     Autor:stevie77
                                            */
                                            
                                            // Konfiguration 
                                            var logging = false;
                                            var debug = false;
                                            var Speicherbrutto = 39; // kw/h hier die Speichergröße in kwh eintragen
                                            var Wirkungsgrad = 0.88; // Faktor Systemwirkungsgrad > 88% beiS10 E Pro abzüglich des Systemwirkungsgrad eintragen Bei 13 KW 13 / 100 * 88 = 11.44
                                            var Entladetiefe = 0.9; // Faktor Tiefenentladeschutz 90% Nutzbar weil Tiefenentladungsschutz von E3DC 11.44 / 100 * 90 = 10,296
                                            var E3DCReserve = 0; // % eingestellte Notstromreserve in Prozent bei E3dC. Wenn diese nicht verwendet wird dan 0 eintragen.
                                            var cron1 = 10; // hier die Schedulezeit - Triggerhäufigkeit alle x Sekunden für Zeitberechnung eintragen
                                            var counter = 24; // Hier die Anzahl der Zeitberechnungen eintragen um einen Durchschnitswert zu ermitteln
                                            
                                            const fC = false;
                                            const Statepfad = 'javascript.' + instance + '.e3dc.modbus.';
                                            
                                            const idBatEntnahme = 'modbus.0.holdingRegisters.40070_Batterie_Leistung'/*Batterie-Leistung in Watt*/;
                                            const idBatSoc = 'modbus.0.holdingRegisters.40083_Batterie_SOC'/*Batterie-SOC in Prozent*/;
                                            const idHTSockel = '0_userdata.0.E3DC-Control.Parameter.HTsockel';
                                            const idHTon = '0_userdata.0.E3DC-Control.Parameter.HTon';
                                            const idHToff = '0_userdata.0.E3DC-Control.Parameter.HToff'; 
                                            const idNotstrombetrieb = 'modbus.0.holdingRegisters.40084_Emergency_Power_Status'/*Emergency-Power Status*/;
                                            const idRegister40082 = 'modbus.0.holdingRegisters.40082_Autarkie_Eigenverbrauch';
                                            const idRegister40002 = 'modbus.0.holdingRegisters.40002_Modbus_Firmware';
                                            const idRegister40088 = 'modbus.0.holdingRegisters.40088_WallBox_0_CTRL';
                                            const idRegister40085 = 'modbus.0.holdingRegisters.40085_EMS_Status';
                                            const idLastFirmwareUpdate = Statepfad + 'lastFirmwareUpdate';
                                            const idLastFirmware = Statepfad + 'lastFirmware';
                                            const idFirmware = 'modbus.0.holdingRegisters.40052_Firmware';
                                            const idAutonomiezeit = Statepfad + 'Autonomiezeit';   
                                            const idBatSockWh = Statepfad + 'Batteriekapazitaet';
                                            //ab hier muss nichts geändert werden
                                            
                                            
                                            createState(idLastFirmwareUpdate);
                                            createState(idLastFirmware);
                                            createState(idAutonomiezeit, 0, fC, { type: 'string', name: 'Autonomiezeit',role:'text'});
                                            createState(idBatSockWh, 0, fC, { type: 'number', name: 'Batteriekapazität',role:'value', unit: ' kWh'});
                                            createState(Statepfad + 'Autarkie');
                                            createState(Statepfad + 'Eigenverbrauch');
                                            createState(Statepfad + 'MajorVersion');
                                            createState(Statepfad + 'MinorVersion');
                                            createState(Statepfad + 'WallBox_0_CTRL_Bit_0', {'def':0, 'name':'Wallbox vorhanden und verfügbar=1' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'WallBox_0_CTRL_Bit_1', {'def':0, 'name':'Solarbetrieb aktiv=1 Mischbetrieb aktiv=0' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'WallBox_0_CTRL_Bit_2', {'def':0, 'name':'Laden abgebrochen=1 Laden freigegeben=0' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'WallBox_0_CTRL_Bit_3', {'def':0, 'name':'Auto lädt=1 Auto lädt nicht=0' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'WallBox_0_CTRL_Bit_4', {'def':0, 'name':'Typ-2-Stecker verriegelt=1' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'WallBox_0_CTRL_Bit_5', {'def':0, 'name':'Typ-2-Stecker gesteckt=1' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'WallBox_0_CTRL_Bit_6', {'def':0, 'name':'Schukosteckdose1 an = 1' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'WallBox_0_CTRL_Bit_7', {'def':0, 'name':'Schukostecker1 gesteckt = 1' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'WallBox_0_CTRL_Bit_8', {'def':0, 'name':'Schukostecker1 verriegelt = 1' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'WallBox_0_CTRL_Bit_9', {'def':0, 'name':'Relais an, 16A, 1 Phase,Schukosteckdose = 1' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'WallBox_0_CTRL_Bit_10', {'def':0, 'name':'Relais an, 16A, 3 Phasen, Typ 2 = 1' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'WallBox_0_CTRL_Bit_11', {'def':0, 'name':'Relais an, 32A, 3 Phasen, Typ 2 = 1' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'WallBox_0_CTRL_Bit_12', {'def':0, 'name':'Eine Phase aktiv=1 drei Phasen aktiv=0' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'EMS_Status_Bit_0', {'def':0, 'name':'Laden der Batterien ist gesperrt=1' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'EMS_Status_Bit_1', {'def':0, 'name':'Entladen der Batterien ist gesperrt=1' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'EMS_Status_Bit_2', {'def':0, 'name':'Notstrommodus ist möglich=1' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'EMS_Status_Bit_3', {'def':0, 'name':'Wetterbasiertes Es wird Ladekapazität zurückgehalten=1 Es wird keine Ladekapazität zurückgehalten=0' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'EMS_Status_Bit_4', {'def':0, 'name':'Abregelungs-Status es wird abgeregelt=1 es wird nicht abgeregelt=0' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'EMS_Status_Bit_5', {'def':0, 'name':'Ladesperrzeit aktiv = 1' , 'type':'number', 'role':'State'});
                                            createState(Statepfad + 'EMS_Status_Bit_6', {'def':0, 'name':'Entladesperrzeit aktiv = 1' , 'type':'number', 'role':'State'});
                                            
                                            
                                            //Modbus Register 40082 ***************** Aufteilung "Autarkie und Eigenverbrauch in Prozent"
                                            on(idRegister40082, function (obj) {
                                            setState(Statepfad + 'Autarkie', (obj.state.val >> 8) & 0xFF, true);
                                            setState(Statepfad + 'Eigenverbrauch', obj.state.val & 0xFF, true);
                                            });
                                             
                                            //Modbus Register 40002 ***************** Aufteilung "Modbus Firmware Version"
                                            on(idRegister40002, function (obj) {
                                                log(obj.state.val);
                                                setState(Statepfad + 'MajorVersion', (obj.state.val >> 8) & 0xFF, true);
                                                setState(Statepfad + 'MinorVersion', obj.state.val & 0xFF, true);
                                            });
                                            
                                            // Modbus Register 40088 ***************** "Wallbox_x_CTRL" Datenwort Dez. in BIT_Ausgabe für Vis umwandeln
                                            on({id: Statepfad + 'WallBox_0_CTRL_Bit_1', change: "ne"}, function (obj){if (CallingInstance(obj) == 3){WriteModbusDez(obj)}});
                                            on({id: Statepfad + 'WallBox_0_CTRL_Bit_2', change: "ne"}, function (obj){if (CallingInstance(obj) == 3){WriteModbusDez(obj)}});
                                            on({id: Statepfad + 'WallBox_0_CTRL_Bit_12', change: "ne"}, function (obj){if (CallingInstance(obj) == 3){WriteModbusDez(obj)}});
                                            
                                            on(idRegister40088, function (obj) {
                                                var myDez = obj.state.val;
                                                var myBin = myDez.toString(2); //Decimal in Bin 
                                                myBin = new Array(17 - myBin.length).join('0') + myBin;
                                                log('Wallbox_x_CTRL Dez ='+myDez+'/ BIN ='+myBin);
                                                if(myBin[15]==1){setState(Statepfad + 'WallBox_0_CTRL_Bit_0',1)}else{setState(Statepfad + 'WallBox_0_CTRL_Bit_0',0)};
                                                if(myBin[14]==1){setState(Statepfad + 'WallBox_0_CTRL_Bit_1',1)}else{setState(Statepfad + 'WallBox_0_CTRL_Bit_1',0)};
                                                if(myBin[13]==1){setState(Statepfad + 'WallBox_0_CTRL_Bit_2',1)}else{setState(Statepfad + 'WallBox_0_CTRL_Bit_2',0)};
                                                if(myBin[12]==1){setState(Statepfad + 'WallBox_0_CTRL_Bit_3',1)}else{setState(Statepfad + 'WallBox_0_CTRL_Bit_3',0)};
                                                if(myBin[11]==1){setState(Statepfad + 'WallBox_0_CTRL_Bit_4',1)}else{setState(Statepfad + 'WallBox_0_CTRL_Bit_4',0)};
                                                if(myBin[10]==1){setState(Statepfad + 'WallBox_0_CTRL_Bit_5',1)}else{setState(Statepfad + 'WallBox_0_CTRL_Bit_5',0)};
                                                if(myBin[9]==1){setState(Statepfad + 'WallBox_0_CTRL_Bit_6',1)}else{setState(Statepfad + 'WallBox_0_CTRL_Bit_6',0)};
                                                if(myBin[8]==1){setState(Statepfad + 'WallBox_0_CTRL_Bit_7',1)}else{setState(Statepfad + 'WallBox_0_CTRL_Bit_7',0)};
                                                if(myBin[7]==1){setState(Statepfad + 'WallBox_0_CTRL_Bit_8',1)}else{setState(Statepfad + 'WallBox_0_CTRL_Bit_8',0)};
                                                if(myBin[6]==1){setState(Statepfad + 'WallBox_0_CTRL_Bit_9',1)}else{setState(Statepfad + 'WallBox_0_CTRL_Bit_9',0)};
                                                if(myBin[5]==1){setState(Statepfad + 'WallBox_0_CTRL_Bit_10',1)}else{setState(Statepfad + 'WallBox_0_CTRL_Bit_10',0)};
                                                if(myBin[4]==1){setState(Statepfad + 'WallBox_0_CTRL_Bit_11',1)}else{setState(Statepfad + 'WallBox_0_CTRL_Bit_11',0)};
                                                if(myBin[3]==1){setState(Statepfad + 'WallBox_0_CTRL_Bit_12',1)}else{setState(Statepfad + 'WallBox_0_CTRL_Bit_12',0)};
                                             
                                            });
                                            
                                            // Modbus Register 40085 ***************** "EMS-Status" Datenwort Dez. in BIT_Ausgabe für Vis umwandeln
                                            on({id: idRegister40085, change: "ne"}, function (obj) {
                                                var myDez = obj.state.val;
                                                var myBin = myDez.toString(2); //Decimal in Bin 
                                                myBin = new Array(17 - myBin.length).join('0') + myBin;
                                                log('EMS-Status Dez ='+myDez+'/ BIN ='+myBin);
                                                if(myBin[15]==1){setState(Statepfad + 'EMS_Status_Bit_0',1)}else{setState(Statepfad + 'EMS_Status_Bit_0',0)};
                                                if(myBin[14]==1){setState(Statepfad + 'EMS_Status_Bit_1',1)}else{setState(Statepfad + 'EMS_Status_Bit_1',0)};
                                                if(myBin[13]==1){setState(Statepfad + 'EMS_Status_Bit_2',1)}else{setState(Statepfad + 'EMS_Status_Bit_2',0)};
                                                if(myBin[12]==1){setState(Statepfad + 'EMS_Status_Bit_3',1)}else{setState(Statepfad + 'EMS_Status_Bit_3',0)};
                                                if(myBin[11]==1){setState(Statepfad + 'EMS_Status_Bit_4',1)}else{setState(Statepfad + 'EMS_Status_Bit_4',0)};
                                                if(myBin[10]==1){setState(Statepfad + 'EMS_Status_Bit_5',1)}else{setState(Statepfad + 'EMS_Status_Bit_5',0)};
                                                if(myBin[9]==1){setState(Statepfad + 'EMS_Status_Bit_6',1)}else{setState(Statepfad + 'EMS_Status_Bit_6',0)};
                                                
                                            });
                                            
                                            function WriteModbusDez(obj)
                                            {
                                                var myBin='000';
                                                if(getState(Statepfad + 'WallBox_0_CTRL_Bit_12').val == 1){myBin = myBin+'1'}else{myBin = myBin+'0'};
                                                if(getState(Statepfad + 'WallBox_0_CTRL_Bit_11').val == 1){myBin = myBin+'1'}else{myBin = myBin+'0'};
                                                if(getState(Statepfad + 'WallBox_0_CTRL_Bit_10').val == 1){myBin = myBin+'1'}else{myBin = myBin+'0'};
                                                if(getState(Statepfad + 'WallBox_0_CTRL_Bit_9').val == 1){myBin = myBin+'1'}else{myBin = myBin+'0'};
                                                if(getState(Statepfad + 'WallBox_0_CTRL_Bit_8').val == 1){myBin = myBin+'1'}else{myBin = myBin+'0'};
                                                if(getState(Statepfad + 'WallBox_0_CTRL_Bit_7').val == 1){myBin = myBin+'1'}else{myBin = myBin+'0'};
                                                if(getState(Statepfad + 'WallBox_0_CTRL_Bit_6').val == 1){myBin = myBin+'1'}else{myBin = myBin+'0'};
                                                if(getState(Statepfad + 'WallBox_0_CTRL_Bit_5').val == 1){myBin = myBin+'1'}else{myBin = myBin+'0'};
                                                if(getState(Statepfad + 'WallBox_0_CTRL_Bit_4').val == 1){myBin = myBin+'1'}else{myBin = myBin+'0'};
                                                if(getState(Statepfad + 'WallBox_0_CTRL_Bit_3').val == 1){myBin = myBin+'1'}else{myBin = myBin+'0'};
                                                if(getState(Statepfad + 'WallBox_0_CTRL_Bit_2').val == 1){myBin = myBin+'1'}else{myBin = myBin+'0'};
                                                if(getState(Statepfad + 'WallBox_0_CTRL_Bit_1').val == 1){myBin = myBin+'1'}else{myBin = myBin+'0'};
                                                if(getState(Statepfad + 'WallBox_0_CTRL_Bit_0').val == 1){myBin = myBin+'1'}else{myBin = myBin+'0'};
                                                var myDez = parseInt(myBin, 2);
                                                setState(idRegister40088,myDez);
                                            }; 
                                            
                                            
                                            // ***************** E3DC dynamische Autonomiezeitberechnung
                                            
                                            //Variable für Cronjob start stop
                                            var Timer = null;
                                            //Variable Hilfsmerker
                                            var Merker = true;
                                            //Variable zur Berechnung der Zeit
                                            var Autonomiezeit = 0;
                                            //Variable für Berechnung 
                                            var Reserve = 0;
                                            // Variablen für Durchschnittsberechnung
                                            var count = 0;
                                            var Summe = 0;
                                            // Wert gleich anzeigen
                                            var Anzeige = false;
                                            // Variable für Bat Soc in kwh abzüglich Notstromreserve
                                            var BatSockWh = null;
                                            var Entnahme = null;
                                            var BatSoc = null;
                                            var Batterie = Speicherbrutto*Wirkungsgrad; 
                                            var Speicher = Speicherbrutto*Wirkungsgrad*Entladetiefe; 
                                            
                                            if(fC && logging)log('force Creation Aktiv States angelegt oder überschrieben');
                                            setState(idAutonomiezeit, '0' ,true); 
                                            if ( debug )log('Batterie E3DC: Die Speichergröße ist ' + Speicherbrutto + ' kWh. abzüglich Wirkungsgrad ' + Batterie + ' kWh und abzüglich des Tiefenentladeschutz bleiben Netto '+ Speicher+ ' kWh.')
                                            
                                            setTimeout( function(){Berechnung();},500);
                                            
                                            // Trigger Berechnung Aktueller Bat Soc in kwh 
                                            on(idBatSoc, function(dp) {
                                                BatSoc = dp.state.val; 
                                            	if(debug)log('Trigger BatSoc aktiv. BatSoc beträgt: '+ BatSoc +' %.'); 
                                            	Berechnung();
                                            });
                                            
                                            //Berechnung Aktueller Bat Soc in kwh und Wert in State schreiben
                                            function Berechnung(){    
                                                BatSoc = getState(idBatSoc).val;    
                                            	setState(idBatSockWh,Math.round(((Speicher/100) * BatSoc)*100)/100,true);  
                                            	if(debug)log('Batterie E3DC: Die Aktuell verfügbare Speicherkapazität ist: '+ getState(idBatSockWh).val+' kWh'); 
                                            }
                                            
                                            // Schedule Berechnung Autonomiezeit starten bei Entnahme
                                            on(idBatEntnahme, function(dp) {
                                                if(dp.state.val < 0 ){
                                            		if(Merker)schedulestart();
                                            		Merker = false;
                                            		if(debug)log('Batterie E3DC: Aktuelle Entnahmeleistung: ' + dp.state.val +' Watt');
                                                }
                                            });
                                            
                                            //Berechnung Autonomiezeit
                                            function schedulestart(){
                                            	if(debug)log('Funktion Schedulestart aktiv');  
                                            	var cronjob = "*/"+cron1+" * * * * *";  
                                            	Timer = schedule(cronjob, function(){   
                                            		if(debug)log('Schedule cronjob aktiv');       
                                            		Entnahme = getState (idBatEntnahme).val;
                                            		BatSockWh = getState (idBatSockWh).val;
                                            		var Sockel = parseFloat(getState (idHTSockel).val);
                                            		var HToff = getState (idHToff).val;
                                            		var HTon = getState (idHTon).val;
                                            		var Notstrombetrieb = getState(idNotstrombetrieb).val;
                                                    if (HTon === HToff && E3DCReserve === 0 && Notstrombetrieb === 2){
                                            			Reserve=Sockel;
                                            			if(debug)log('Die Notstrom Reserve entsprichte der Einstellung in E3DC Control und beträgt: ' + Reserve +' %');
                                            		}
                                            		if (E3DCReserve >0 && Notstrombetrieb === 2){
                                            			Reserve = E3DCReserve;
                                            			if(debug)log('Die Notstrom Reserve entspricht der User Konfig Einstellun und beträgt'+ Reserve + ' %');
                                            		}
                                            		if ((HTon != HToff && E3DCReserve === 0) || Notstrombetrieb !=2){
                                            			Reserve=0;
                                            			if(debug)log('Es wird keine Notstrom Reserve bei der Berechnung berücksichtigt. Wert auf ' + Reserve +' % gesetzt.');
                                            		}
                                            		setTimeout(function(){
                                            			if(Entnahme<0){
                                            				BatSockWh = Math.round(BatSockWh - (Speicher/100*Reserve*100)/100);
                                            				if(debug)log('aktuelle Gesamtkapazität abzüglich der Notstromreserve ist:  '+ BatSockWh + ' kWh.');
                                            				setTimeout(function(){
                                            					Autonomiezeit = Math.round(BatSockWh*1000/Entnahme*-1*100)/100;    
                                            					Durchschnitt();
                                            					// gleich Anzeigen
                                            					if(Anzeige === false && Autonomiezeit >0){
                                            						setState(idAutonomiezeit, Autonomiezeit +' h',true);
                                            						Anzeige = true;
                                            					}
                                            					if(debug)log('Autonomiezeit neu berechnet auf:  '+ Autonomiezeit + ' h.');
                                            				},100);
                                            			}else{
                                            				//Berechnung stoppen bei Entnahme 0 und Autonomiezeit auf 0 setzen
                                            				if(Entnahme >=0){
                                            					clearSchedule(Timer);
                                            					Merker = true;
                                            					if(logging)log('Schedule cronjob gestoppt weil keine Entnahme');
                                            					setState(idAutonomiezeit,'0',true);
                                            					Anzeige = false;
                                                            }
                                                        }
                                                    },100);   
                                                });
                                            }
                                            
                                            // Zaehler für Durchschnittsberechnung
                                            function Durchschnitt(){
                                            	count ++
                                            	Summe = Summe + Autonomiezeit;
                                            	if(debug)log ('Summe: ' + Summe + ' Zaehler: '+count+ ' Addition: + ' + Autonomiezeit);
                                            	if(count===counter){
                                            		var Zeit= Summe/count;
                                            		setTimeout(function(){
                                            			if(logging)log('Batterie E3DC: Aktuelle Speicherkapazität beträgt: '+ getState(idBatSockWh).val+' kWh, abzüglich der Notstromreserve '+BatSockWh+ ' kWh' );     
                                            			if(Zeit>=1){    
                                            				setState(idAutonomiezeit,+ Math.round(Zeit*100)/100 +' h',true);  
                                            				if(logging)log('Autonomiezeit in h beträgt: '+ Math.round(Zeit*10)/10 + ' h');
                                            			}
                                            			if(Zeit<1 && Zeit >0){            
                                            				setState(idAutonomiezeit, + Math.round((Zeit*60)*100/100)+' min',true);
                                            				if(logging)log('Autonomiezeit in min beträgt: '+Math.round((Zeit*60)*100/100) +' min.');
                                            			}    
                                            			if(Zeit < 0){
                                            				setState(idAutonomiezeit, '0' ,true);
                                            				if(logging)log('Batterie E3DC: Autonomiezeit beträgt: 0 min.');
                                            			}
                                            			count=0;
                                            			Summe=0;
                                            			if(debug)log('Reset: Count =  '+ count+ ' Summe = ' + Summe);
                                            		},100);  
                                            	}
                                            }
                                             
                                            // Speichert zum Zeitpunkt eines Firmware-Updates das Datum des Updates und die alte Versionsnummer.
                                            on(idFirmware, function(obj){
                                                var actualDate = new Date();
                                                var actualDateString = formatDate(actualDate, "DD.MM.YYYY hh:mm:ss");
                                                setState(idLastFirmwareUpdate, actualDateString);
                                                setState(idLastFirmware, obj.oldState.val);
                                            });
                                            
                                            //Function prüft welche Instanz aufruft und gibt als Ergebnis admin=1 javascript= 2 web=3 zurück
                                            function CallingInstance(obj){
                                                let CallingAdmin = ''+obj.state.from.match(/admin/ig)
                                                let CallingJavascript = ''+obj.state.from.match(/javascript/ig)
                                                let CallingWeb = ''+obj.state.from.match(/web/ig)
                                                if (CallingAdmin === 'admin'){return 1;}
                                                if (CallingJavascript === 'javascript'){return 2;}
                                                if (CallingWeb === 'web'){return 3;}
                                                return 0;
                                            }
                                            
                                            M 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            730
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            70
                                            3331
                                            1362121
                                            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