Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. E3DC Hauskraftwerk steuern

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.4k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.0k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.6k

E3DC Hauskraftwerk steuern

Geplant Angeheftet Gesperrt Verschoben JavaScript
3.5k Beiträge 70 Kommentatoren 1.6m Aufrufe 61 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • S stevie77

    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. :-)

    smartboartS Offline
    smartboartS Offline
    smartboart
    schrieb am zuletzt editiert von smartboart
    #654

    @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..

    smartboartS 1 Antwort Letzte Antwort
    0
    • smartboartS 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..

      smartboartS Offline
      smartboartS Offline
      smartboart
      schrieb am zuletzt editiert von
      #655

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

      S 1 Antwort Letzte Antwort
      0
      • smartboartS smartboart

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

        S Offline
        S Offline
        stevie77
        schrieb am zuletzt editiert von
        #656

        @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.

        smartboartS 1 Antwort Letzte Antwort
        0
        • S stevie77

          @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.

          smartboartS Offline
          smartboartS Offline
          smartboart
          schrieb am zuletzt editiert von
          #657

          @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 Antwort Letzte Antwort
          0
          • smartboartS smartboart

            @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 Online
            A Online
            ArnoD
            schrieb am zuletzt editiert von
            #658

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

            1 Antwort Letzte Antwort
            0
            • S stevie77

              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. :-)

              A Online
              A Online
              ArnoD
              schrieb am zuletzt editiert von
              #659

              @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 Antwort Letzte Antwort
              0
              • A Online
                A Online
                ArnoD
                schrieb am zuletzt editiert von ArnoD
                #660

                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 Antwort Letzte Antwort
                0
                • A 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 Offline
                  M Offline
                  michael74
                  schrieb am zuletzt editiert von
                  #661

                  @ArnoD Hab das Script für Modbus gerade mal übernommen. Bekomme aber eine Fehlermeldung:

                  (6530) Error in callback: ReferenceError: CallingInstance is not defined

                  mit dem Bezug auf eine der drei Zeilen:

                  // 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)}});
                  
                  

                  CallingInstance ist im Editor auch schon rot unterstrichen mit dem Hinweis Cannot find name.

                  Fehlt mir da noch ein Modul, oder wo liegt mein Fehler?

                  A 1 Antwort Letzte Antwort
                  0
                  • M michael74

                    @ArnoD Hab das Script für Modbus gerade mal übernommen. Bekomme aber eine Fehlermeldung:

                    (6530) Error in callback: ReferenceError: CallingInstance is not defined

                    mit dem Bezug auf eine der drei Zeilen:

                    // 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)}});
                    
                    

                    CallingInstance ist im Editor auch schon rot unterstrichen mit dem Hinweis Cannot find name.

                    Fehlt mir da noch ein Modul, oder wo liegt mein Fehler?

                    A Online
                    A Online
                    ArnoD
                    schrieb am zuletzt editiert von
                    #662

                    @michael74
                    Ja, mein Fehler habe beim Kopieren nicht alles markiert. Da fehlt noch eine Funktion am Ende vom Script.
                    Habe es jetzt oben in meinem post korrigiert.

                    smartboartS 1 Antwort Letzte Antwort
                    0
                    • A ArnoD

                      @michael74
                      Ja, mein Fehler habe beim Kopieren nicht alles markiert. Da fehlt noch eine Funktion am Ende vom Script.
                      Habe es jetzt oben in meinem post korrigiert.

                      smartboartS Offline
                      smartboartS Offline
                      smartboart
                      schrieb am zuletzt editiert von
                      #663

                      Hallo,

                      aus aktuellem Anlass, mal ne Frage in die Runde..

                      Ich habe gerade eine Batterie nachgerüstet. Dabei wird erstmal ein Batterietraining angestoßen.
                      Während dem Training wird erst entladen und mit Sonne wieder voll geladen. Bis es das 1. mal voll ist wird aus der Batterie welche trainiert wird keine Leistung entnommen. Das sieht natürlich in der ioB Vis Anzeige erstmal komisch aus.
                      Das Batterie Training wird signalisiert im Display der Anlage. Leider gibt es den status nicht über Modbus...

                      Die RSCP Geschichte wird aktuell nicht weiter verfolgt oder?

                      S 1 Antwort Letzte Antwort
                      0
                      • A Online
                        A Online
                        ArnoD
                        schrieb am zuletzt editiert von
                        #664

                        Die RSCP Geschichte scheitert im Moment an der Umsetzung :-)
                        Wenn sich jemand findet der das in Javascript programmieren kann wäre es natürlich super.

                        Den Status Batterie Training könnte man eventuell über Modbusregister 40085 erkennen.
                        Vermute das Bit1 ==1 und Bit2 ==0 ist, müsste man aber testen.

                        smartboartS 2 Antworten Letzte Antwort
                        0
                        • smartboartS smartboart

                          Hallo,

                          aus aktuellem Anlass, mal ne Frage in die Runde..

                          Ich habe gerade eine Batterie nachgerüstet. Dabei wird erstmal ein Batterietraining angestoßen.
                          Während dem Training wird erst entladen und mit Sonne wieder voll geladen. Bis es das 1. mal voll ist wird aus der Batterie welche trainiert wird keine Leistung entnommen. Das sieht natürlich in der ioB Vis Anzeige erstmal komisch aus.
                          Das Batterie Training wird signalisiert im Display der Anlage. Leider gibt es den status nicht über Modbus...

                          Die RSCP Geschichte wird aktuell nicht weiter verfolgt oder?

                          S Offline
                          S Offline
                          stevie77
                          schrieb am zuletzt editiert von
                          #665

                          @smartboart sagte in E3DC Hauskraftwerk steuern:

                          Ich habe gerade eine Batterie nachgerüstet.

                          Du Glücklicher! Ich suche schon einige Wochen nach einem Installateur für eine Batterieerweiterung, 2 Leistungsmesser, SGReady und Wallboxanschluss. Bisher nur Absagen oder gar keine Rückmeldung. Ich bin langsam wechselweise am Verzweifeln oder am Kotzen... :confounded:

                          smartboartS 1 Antwort Letzte Antwort
                          0
                          • S stevie77

                            @smartboart sagte in E3DC Hauskraftwerk steuern:

                            Ich habe gerade eine Batterie nachgerüstet.

                            Du Glücklicher! Ich suche schon einige Wochen nach einem Installateur für eine Batterieerweiterung, 2 Leistungsmesser, SGReady und Wallboxanschluss. Bisher nur Absagen oder gar keine Rückmeldung. Ich bin langsam wechselweise am Verzweifeln oder am Kotzen... :confounded:

                            smartboartS Offline
                            smartboartS Offline
                            smartboart
                            schrieb am zuletzt editiert von smartboart
                            #666

                            @stevie77 ja die Wallbox habe ich auch direkt mal mitbestellt... Warte schon auf die Kohle von der KFW...
                            Aber ein E- Auto habe ich trotzdem nicht....Die Kohle würde ich am liebsten auch noch mitnehmen...
                            Aber was für ein Auto? Und das hieße ich müsste mein Cabrio dafür opfern...Dazu bin ich noch nicht bereit...

                            Früher oder später werde ich / wir alle ja dafür auch zur Kasse gebeten...

                            1 Antwort Letzte Antwort
                            0
                            • A ArnoD

                              Die RSCP Geschichte scheitert im Moment an der Umsetzung :-)
                              Wenn sich jemand findet der das in Javascript programmieren kann wäre es natürlich super.

                              Den Status Batterie Training könnte man eventuell über Modbusregister 40085 erkennen.
                              Vermute das Bit1 ==1 und Bit2 ==0 ist, müsste man aber testen.

                              smartboartS Offline
                              smartboartS Offline
                              smartboart
                              schrieb am zuletzt editiert von
                              #667

                              @ArnoD sagte in E3DC Hauskraftwerk steuern:

                              Den Status Batterie Training könnte man eventuell über Modbusregister 40085 erkennen.
                              Vermute das Bit1 ==1 und Bit2 ==0 ist, müsste man aber testen.

                              ok, werde mal darauf achten... muss ja nochmal ins training, da ein zu kurzes Kabel mitgeliefert wurde. Das muss ich noch ersetzen und deshalb ist die neue nicht in Dauerbetrieb gegangen. Soll am Dienstag kommen...

                              1 Antwort Letzte Antwort
                              0
                              • A ArnoD

                                Die RSCP Geschichte scheitert im Moment an der Umsetzung :-)
                                Wenn sich jemand findet der das in Javascript programmieren kann wäre es natürlich super.

                                Den Status Batterie Training könnte man eventuell über Modbusregister 40085 erkennen.
                                Vermute das Bit1 ==1 und Bit2 ==0 ist, müsste man aber testen.

                                smartboartS Offline
                                smartboartS Offline
                                smartboart
                                schrieb am zuletzt editiert von
                                #668

                                @ArnoD
                                Hi ArnoD,

                                mal ne Frage zu der Regelzeit start - ende und ladeende zeit Berechnung im Script..
                                Sind das die Werte die auch in screen angezeigt werden, wenn ja habe ich hier Abweichungen festgestellt. ist das bei dir auch so? siehe Bild

                                Unbenannt.PNG

                                A 2 Antworten Letzte Antwort
                                0
                                • smartboartS smartboart

                                  @ArnoD
                                  Hi ArnoD,

                                  mal ne Frage zu der Regelzeit start - ende und ladeende zeit Berechnung im Script..
                                  Sind das die Werte die auch in screen angezeigt werden, wenn ja habe ich hier Abweichungen festgestellt. ist das bei dir auch so? siehe Bild

                                  Unbenannt.PNG

                                  A Online
                                  A Online
                                  ArnoD
                                  schrieb am zuletzt editiert von
                                  #669

                                  @smartboart
                                  Ja hast recht, ist bei mir auch so.
                                  Das muss ich mir bei Gelegenheit noch mal anschauen.

                                  1 Antwort Letzte Antwort
                                  0
                                  • G Offline
                                    G Offline
                                    goelectric
                                    schrieb am zuletzt editiert von
                                    #670

                                    Hallo ArnoD und alle anderen Mitprogrammierer!

                                    Ich hatte mich vor langer Zeit bereits einmal gemeldet und dachte es geht Alles schneller.
                                    Mittlerweile liegen bei alle Module auf den Dächern, der S10 Pro ist mittlerweile aufgestellt und einsatzbereit, dass ist nach einem halben Jahr schon ein Teilerfolg!
                                    Was fehlt ist der zweite Wechselrichter, da aufgrund der Leistung jeder Tracker nur mit einem String belegt werden kann (unterschiedliche Himmelsrichtungen) und die beiden Wallboxen. Stöhnen auf hohem Niveau.
                                    Ich habe mich in der letzten Woche durch diesen gesamten Thread durchgearbeitet, mit dem Erfolg "Ich sehe vor lauter Bäumen den Wald nicht mehr".
                                    Wäre es möglich, irgendwo eine Anlaufstelle zu schaffen, wo alle aktuellen Skripte, Views, etc. aufgelistet sind? Es kann natürlich auch sein, dass ich diese Stelle komplett übersehen habe!

                                    Für Eure Arbeit von mir allerhöchsten Respekt!

                                    A 1 Antwort Letzte Antwort
                                    0
                                    • G goelectric

                                      Hallo ArnoD und alle anderen Mitprogrammierer!

                                      Ich hatte mich vor langer Zeit bereits einmal gemeldet und dachte es geht Alles schneller.
                                      Mittlerweile liegen bei alle Module auf den Dächern, der S10 Pro ist mittlerweile aufgestellt und einsatzbereit, dass ist nach einem halben Jahr schon ein Teilerfolg!
                                      Was fehlt ist der zweite Wechselrichter, da aufgrund der Leistung jeder Tracker nur mit einem String belegt werden kann (unterschiedliche Himmelsrichtungen) und die beiden Wallboxen. Stöhnen auf hohem Niveau.
                                      Ich habe mich in der letzten Woche durch diesen gesamten Thread durchgearbeitet, mit dem Erfolg "Ich sehe vor lauter Bäumen den Wald nicht mehr".
                                      Wäre es möglich, irgendwo eine Anlaufstelle zu schaffen, wo alle aktuellen Skripte, Views, etc. aufgelistet sind? Es kann natürlich auch sein, dass ich diese Stelle komplett übersehen habe!

                                      Für Eure Arbeit von mir allerhöchsten Respekt!

                                      A Online
                                      A Online
                                      ArnoD
                                      schrieb am zuletzt editiert von
                                      #671

                                      @goelectric

                                      Das aktuelle Script E3DC findest du immer im ersten Post von mir, die aktuellen VIS View sind immer in meinem sechsten Post, also etwas weiter unten.
                                      Oder meinst du die Scriptsammlung für die Modbus Schnittstelle ??

                                      smartboartS 1 Antwort Letzte Antwort
                                      0
                                      • A ArnoD

                                        @goelectric

                                        Das aktuelle Script E3DC findest du immer im ersten Post von mir, die aktuellen VIS View sind immer in meinem sechsten Post, also etwas weiter unten.
                                        Oder meinst du die Scriptsammlung für die Modbus Schnittstelle ??

                                        smartboartS Offline
                                        smartboartS Offline
                                        smartboart
                                        schrieb am zuletzt editiert von smartboart
                                        #672

                                        hab heute die Wallbox in Betrieb genommen und mal mt dem Tesla von einem Bekannten getestet...hab ja noch kein Eauto....
                                        Hat jemand von euch schon die Wallbox visualisiert? Wie kommen wir an die Messwerte der Wallbox...Scheint im Moment noch nicht über Modbus zu gehen..
                                        sollte doch kein Problem sein für E3DC das umzusetzen oder...

                                        S 1 Antwort Letzte Antwort
                                        0
                                        • smartboartS smartboart

                                          hab heute die Wallbox in Betrieb genommen und mal mt dem Tesla von einem Bekannten getestet...hab ja noch kein Eauto....
                                          Hat jemand von euch schon die Wallbox visualisiert? Wie kommen wir an die Messwerte der Wallbox...Scheint im Moment noch nicht über Modbus zu gehen..
                                          sollte doch kein Problem sein für E3DC das umzusetzen oder...

                                          S Offline
                                          S Offline
                                          stevie77
                                          schrieb am zuletzt editiert von
                                          #673

                                          @smartboart Da hoffe ich mal mit der bestellten openWB keine Probleme mit zu haben. ;-) Muss aber noch 2 Monate warten, bis ich das testen kann (Inbetriebnahme an ner normalen Steckdose), dann wahrscheinlich nochmals 2 Monate bis mein E3/DC-Installateur sie einbaut.

                                          smartboartS 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          863

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe