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.5k

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

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

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.
  • A ArnoD

    Ich habe dieses Topic eröffnet, um gemeinsam an einer Überschusssteuerung des E3DC Hauskraftwerks in ioBroker zu arbeiten.
    Dankeschön an dieser Stelle an Eberhard und sein Programm E3DC-Control, ohne ihn wäre das alles nicht möglich gewesen.
    Großes Lob und Danke auch an Uli, der den Adapter e3dc-rscp programmiert hat, über den die Steuerung im ioBroker erst möglich wurde.

    Ziel der Steuerung ist:
    Mit der Steuerung soll erreicht werden, dass der Batteriespeicher möglichst schonend geladen wird, um die Lebensdauer zu erhöhen.

    • Speicher soll nie längere Zeit auf 100 % geladen werden oder auf 0 % entladen werden.
    • Möglichst gleichmäßige Ladeleistung beim Laden.
    • PV-Überschuss soll gespeichert werden, um nicht in die 70 % Abriegelung zu kommen.
    • Bei Überschreitung WR Begrenzung soll Überschuss in die Batterie gespeichert werden.

    ioBroker
    Es werden folgende Adapter benötigt:

    • Javascript (NPM-Module: axios, is-it-bst)
    • e3dc-rscp

    Für die View Beispiele in VIS werden noch folgende Adapter benötigt:

    • vis-hqwidgets
    • vis-materialdesign
    • vis-timeandweather

    Beispiel View zum Importieren und das Skript Charge-Control, sowie eine Anleitung findet ihr auf GitHub:
    https://github.com/ArnoD15/iobroker_E3DC

    Einstellbare Parameter:
    Unload: Wenn der SoC Wert der Batterie > Wert „Unload“ ist, wird der Batteriespeicher mit Beginn Solarproduktion bis Beginn Regelzeitraum, auf SOC Wert Parameter "Unload" entladen. Ist Unload < Ladeschwelle wird bis Ladeschwelle geladen und Unload ignoriert.

    Ladeschwelle: Mit Beginn Solarproduktion wird die Batterie mit der maximalen Ladeleistung bis zum Wert Ladeschwelle geladen. Erst wenn der Batterie SOC den Wert Ladeschwelle erreicht, wird mit dem geregelten Laden begonnen. Danach wird bis SOC Wert „Ladeende“ gleichmäßig geladen, mit Ausnahme, wenn die PV-Leistung das Einspeiselimit oder die WR-Maxleistung übersteigt, wird die Ladeleistung um den Wert erhöht, um das Einspeiselimit oder WR-Limit einhalten zu können. Bei unterschreiten von dem Wert Einspeiselimit oder WR-Limit, wird wieder mit neu berechneter Ladeleistung, gleichmäßig bis „Ladeende" geladen. Bei großem Überschuss kann die gleichmäßige Ladeleistung bis auf 0 abgesenkt werden. Parameter "Ladeschwelle" hat Vorrang vor "Unload", d.h. "Unload" wird ignoriert, falls "Ladeschwelle" größer sein sollte als „Unload“.

    Ladeende: SoC Wert Speicher, der zum Ende des Regelzeitraums erreicht werden soll.

    Ladeende2: SoC Wert Speicher, der zum Ende Sommer Ladeende erreicht werden sollten.

    Unterer Ladekorridor: Der „Untere Ladekorridor“ definiert nur den min. Wert, ab dem mit dem Laden der Batterie gestartet wird. Erst wenn die berechnetet Ladeleistung den Wert „unteren Ladekorridor“ übersteigt, wird mit dem Laden der Batterie gestartet.

    Offset Regelbeginn Zeit in hh:mm, die von der Astro Zeit "solarNoon" (höchster Sonnenstand) abgezogen wird.

    Offset Regelende Zeit in hh:mm, die zu der Astro Zeit "solarNoon" (höchster Sonnenstand) dazu addiert wird.

    Offset Ladeende Zeit in hh:mm, die von der Astro Zeit "sunset" (Sonnenuntergang) abgezogen wird.

    70c4baad-fc5b-45bb-8c02-45b0b14f89ea-grafik.png
    Eigenverbrauch: Der geschätzte Eigenverbrauch pro Tag in kWh. Wird für die Überschussberechnung der Prognose verwendet.

    Notstrom min.: Speicherreserve in % bei Wintersonnenwende 21.12

    Notstrom Sockel: min. SOC Wert bei Tag-/Nachtgleiche 21.3./21.9.

    Berechnung Notstrom: 21.12 (Wintersonnenwende) ist der Bezugs-SoC = Wert „Notstrom min“ und wird bis zum 21.3 (Tag-/Nachtgleiche) auf Wert „Notstrom Sockel“ reduziert und bis zum 20.06 (Sommersonnenwende) um ca. weitere 10% reduziert. Ab dem 20.06 (Sommersonnenwende) steigt der Bezugs-SoC wieder bis zum 21.09 (Tag-/Nachtgleiche) auf den Wert „Notstrom Sockel“ und bis zum 21.12 (Wintersonnenwende) auf den Wert „Notstrom min“. Je Monat ändert sich somit der SoC um ca. +- 3,3%. Mit Notstrom min. und Notstrom Sockel kann man eine Dynamische Notstromreserve vorhalten, Vorteil ist, dass der Speicher nicht alle 3 Wochen entladen wird wie bei der Notstromreserve von E3DC.

    Starten wir am 21.12 (Wintersonnenwende) der kürzeste Tag, da wird der Speicher bis auf Notstrom min = 20% entladen.
    Ab jetzt werden die Tage immer länger, bis zum 21.3 (Tag-/Nachtgleiche) wo die Tage und Nächte gleich lang sind.
    Das bedeutet deine Speicherreserve kann immer geringer werden je länger die Tage sind, da ja mehr PV-Leistung zur Verfügung steht. Es wird somit jeden Monat die Speichergrenze um ca.3,33% reduziert bis zum 21.03 auf den Wert Notstrom Sockel = 10%.

    Ab dem 21.03 werden die Tage immer länger bis zum 20.06 (Sommersonnenwende) dem längsten Tag im Jahr.
    Es wird also die Speichergrenze weiter jeden Monat um ca. 3,33% reduziert bis zum 20.06 auf 0%,
    Ab diesem Zeitpunkt werden die Tage wieder kürzer bis zum 21.9 (Tag-/Nachtgleiche) wo die Tage und Nächte wieder gleich lang sind und die Speicherreserve wird jeden Monat um ca. 3,33% erhöht auf Notstrom Sockel = 10%.
    Die Tage werden immer kürzer bis zum 21.12 (Wintersonnenwende) und die Speichergrenze wird weiter jeden Monat um ca. 3,33% erhöht auf den Wert Notstrom min = 20%

    Notstrom Sockel ist somit der min. SOC Wert, wenn die Tage und Nächte gleich lang sind, also am 21.3 und 21.09 und
    Notstrom min wenn die Tage am kürzesten sind am 21.12 .

    Laderegelung:
    Mit Beginn Solarproduktion wird die Batterie mit der maximalen Ladeleistung bis zum Wert Ladeschwelle geladen oder bis zum SOC Wert Unload entladen. Erst wenn der Batterie SOC den Wert Ladeschwelle erreicht, wird mit dem geregelten Laden begonnen.

    Mit Start Regelzeitraum wird die benötigte Ladeleistung berechnet, um den SOC Ladeende bis zum Ende Regelzeitraum zu erreichen.

    Bei Überschreitung der Zeit, Ende Regelzeitraum wird die benötigte Ladeleistung neu berechnet, um den SOC Ladeende2 bis zur Zeit Ladeende zu erreichen.

    Wenn die Zeit Ladeende erreicht ist und die Batterie noch nicht den SOC Ladeende2 erreicht hat, wird das Laden mit maximal noch zur Verfügung stehender PV-Leistung freigegeben.

    Ausnahme: Wenn die PV-Leistung das Einspeiselimit oder die maximale Wechselrichterleistung übersteigt, wird die Ladeleistung um den Wert erhöht, um das Einspeiselimit oder die maximale Wechselrichterleistung einhalten zu können. Bei Unterschreiten von dem Wert Einspeiselimit oder WR-Limit, wird mit neu berechneter Ladeleistung, gleichmäßig geladen.

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

    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.");
        }
    });
    
    smartboartS 1 Antwort Letzte Antwort
    0
    • S stevie77

      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.");
          }
      });
      
      smartboartS Offline
      smartboartS Offline
      smartboart
      schrieb am zuletzt editiert von smartboart
      #643

      @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 Antwort Letzte Antwort
      0
      • smartboartS 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 Offline
        S Offline
        stevie77
        schrieb am zuletzt editiert von
        #644

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

        smartboartS 1 Antwort Letzte Antwort
        0
        • S stevie77

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

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

          @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 Antwort Letzte Antwort
          0
          • smartboartS 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 Offline
            S Offline
            stevie77
            schrieb am zuletzt editiert von
            #646

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

              script nochmal aktualisiert ...auf grund der letzten Diskussion habe ich Wirkungsgrad und Tiefenentladeschutz mit in die Berechnung einbezogen und somit die Erkenntnisse einfliessen lassen. Beide Werte sind nun konfigurierbar. Hinweise dahinter beachten...

              var Wirkungsgrad = 0.88; // Faktor Systemwirkungsgrad > 88% beiS10 E Pro Beispiel 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
              
              

              https://forum.iobroker.net/topic/32976/e3dc-hauskraftwerk-steuern/591

              A Offline
              A Offline
              Abyss
              schrieb am zuletzt editiert von
              #647

              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

              smartboartS 1 Antwort Letzte Antwort
              0
              • A Abyss

                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

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

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

                smartboartS 1 Antwort Letzte Antwort
                0
                • smartboartS smartboart

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

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

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

                    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 Offline
                    S Offline
                    stevie77
                    schrieb am zuletzt editiert von
                    #650

                    @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);
                    });
                    
                    smartboartS 1 Antwort Letzte Antwort
                    0
                    • S stevie77

                      @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);
                      });
                      
                      smartboartS Offline
                      smartboartS Offline
                      smartboart
                      schrieb am zuletzt editiert von smartboart
                      #651

                      @stevie77
                      Unbenannt.JPG
                      Unbenannt.JPG

                      1 Antwort Letzte Antwort
                      0
                      • A Offline
                        A Offline
                        ArnoD
                        schrieb am zuletzt editiert von ArnoD
                        #652

                        @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 Antwort Letzte Antwort
                        0
                        • A ArnoD

                          Ich habe dieses Topic eröffnet, um gemeinsam an einer Überschusssteuerung des E3DC Hauskraftwerks in ioBroker zu arbeiten.
                          Dankeschön an dieser Stelle an Eberhard und sein Programm E3DC-Control, ohne ihn wäre das alles nicht möglich gewesen.
                          Großes Lob und Danke auch an Uli, der den Adapter e3dc-rscp programmiert hat, über den die Steuerung im ioBroker erst möglich wurde.

                          Ziel der Steuerung ist:
                          Mit der Steuerung soll erreicht werden, dass der Batteriespeicher möglichst schonend geladen wird, um die Lebensdauer zu erhöhen.

                          • Speicher soll nie längere Zeit auf 100 % geladen werden oder auf 0 % entladen werden.
                          • Möglichst gleichmäßige Ladeleistung beim Laden.
                          • PV-Überschuss soll gespeichert werden, um nicht in die 70 % Abriegelung zu kommen.
                          • Bei Überschreitung WR Begrenzung soll Überschuss in die Batterie gespeichert werden.

                          ioBroker
                          Es werden folgende Adapter benötigt:

                          • Javascript (NPM-Module: axios, is-it-bst)
                          • e3dc-rscp

                          Für die View Beispiele in VIS werden noch folgende Adapter benötigt:

                          • vis-hqwidgets
                          • vis-materialdesign
                          • vis-timeandweather

                          Beispiel View zum Importieren und das Skript Charge-Control, sowie eine Anleitung findet ihr auf GitHub:
                          https://github.com/ArnoD15/iobroker_E3DC

                          Einstellbare Parameter:
                          Unload: Wenn der SoC Wert der Batterie > Wert „Unload“ ist, wird der Batteriespeicher mit Beginn Solarproduktion bis Beginn Regelzeitraum, auf SOC Wert Parameter "Unload" entladen. Ist Unload < Ladeschwelle wird bis Ladeschwelle geladen und Unload ignoriert.

                          Ladeschwelle: Mit Beginn Solarproduktion wird die Batterie mit der maximalen Ladeleistung bis zum Wert Ladeschwelle geladen. Erst wenn der Batterie SOC den Wert Ladeschwelle erreicht, wird mit dem geregelten Laden begonnen. Danach wird bis SOC Wert „Ladeende“ gleichmäßig geladen, mit Ausnahme, wenn die PV-Leistung das Einspeiselimit oder die WR-Maxleistung übersteigt, wird die Ladeleistung um den Wert erhöht, um das Einspeiselimit oder WR-Limit einhalten zu können. Bei unterschreiten von dem Wert Einspeiselimit oder WR-Limit, wird wieder mit neu berechneter Ladeleistung, gleichmäßig bis „Ladeende" geladen. Bei großem Überschuss kann die gleichmäßige Ladeleistung bis auf 0 abgesenkt werden. Parameter "Ladeschwelle" hat Vorrang vor "Unload", d.h. "Unload" wird ignoriert, falls "Ladeschwelle" größer sein sollte als „Unload“.

                          Ladeende: SoC Wert Speicher, der zum Ende des Regelzeitraums erreicht werden soll.

                          Ladeende2: SoC Wert Speicher, der zum Ende Sommer Ladeende erreicht werden sollten.

                          Unterer Ladekorridor: Der „Untere Ladekorridor“ definiert nur den min. Wert, ab dem mit dem Laden der Batterie gestartet wird. Erst wenn die berechnetet Ladeleistung den Wert „unteren Ladekorridor“ übersteigt, wird mit dem Laden der Batterie gestartet.

                          Offset Regelbeginn Zeit in hh:mm, die von der Astro Zeit "solarNoon" (höchster Sonnenstand) abgezogen wird.

                          Offset Regelende Zeit in hh:mm, die zu der Astro Zeit "solarNoon" (höchster Sonnenstand) dazu addiert wird.

                          Offset Ladeende Zeit in hh:mm, die von der Astro Zeit "sunset" (Sonnenuntergang) abgezogen wird.

                          70c4baad-fc5b-45bb-8c02-45b0b14f89ea-grafik.png
                          Eigenverbrauch: Der geschätzte Eigenverbrauch pro Tag in kWh. Wird für die Überschussberechnung der Prognose verwendet.

                          Notstrom min.: Speicherreserve in % bei Wintersonnenwende 21.12

                          Notstrom Sockel: min. SOC Wert bei Tag-/Nachtgleiche 21.3./21.9.

                          Berechnung Notstrom: 21.12 (Wintersonnenwende) ist der Bezugs-SoC = Wert „Notstrom min“ und wird bis zum 21.3 (Tag-/Nachtgleiche) auf Wert „Notstrom Sockel“ reduziert und bis zum 20.06 (Sommersonnenwende) um ca. weitere 10% reduziert. Ab dem 20.06 (Sommersonnenwende) steigt der Bezugs-SoC wieder bis zum 21.09 (Tag-/Nachtgleiche) auf den Wert „Notstrom Sockel“ und bis zum 21.12 (Wintersonnenwende) auf den Wert „Notstrom min“. Je Monat ändert sich somit der SoC um ca. +- 3,3%. Mit Notstrom min. und Notstrom Sockel kann man eine Dynamische Notstromreserve vorhalten, Vorteil ist, dass der Speicher nicht alle 3 Wochen entladen wird wie bei der Notstromreserve von E3DC.

                          Starten wir am 21.12 (Wintersonnenwende) der kürzeste Tag, da wird der Speicher bis auf Notstrom min = 20% entladen.
                          Ab jetzt werden die Tage immer länger, bis zum 21.3 (Tag-/Nachtgleiche) wo die Tage und Nächte gleich lang sind.
                          Das bedeutet deine Speicherreserve kann immer geringer werden je länger die Tage sind, da ja mehr PV-Leistung zur Verfügung steht. Es wird somit jeden Monat die Speichergrenze um ca.3,33% reduziert bis zum 21.03 auf den Wert Notstrom Sockel = 10%.

                          Ab dem 21.03 werden die Tage immer länger bis zum 20.06 (Sommersonnenwende) dem längsten Tag im Jahr.
                          Es wird also die Speichergrenze weiter jeden Monat um ca. 3,33% reduziert bis zum 20.06 auf 0%,
                          Ab diesem Zeitpunkt werden die Tage wieder kürzer bis zum 21.9 (Tag-/Nachtgleiche) wo die Tage und Nächte wieder gleich lang sind und die Speicherreserve wird jeden Monat um ca. 3,33% erhöht auf Notstrom Sockel = 10%.
                          Die Tage werden immer kürzer bis zum 21.12 (Wintersonnenwende) und die Speichergrenze wird weiter jeden Monat um ca. 3,33% erhöht auf den Wert Notstrom min = 20%

                          Notstrom Sockel ist somit der min. SOC Wert, wenn die Tage und Nächte gleich lang sind, also am 21.3 und 21.09 und
                          Notstrom min wenn die Tage am kürzesten sind am 21.12 .

                          Laderegelung:
                          Mit Beginn Solarproduktion wird die Batterie mit der maximalen Ladeleistung bis zum Wert Ladeschwelle geladen oder bis zum SOC Wert Unload entladen. Erst wenn der Batterie SOC den Wert Ladeschwelle erreicht, wird mit dem geregelten Laden begonnen.

                          Mit Start Regelzeitraum wird die benötigte Ladeleistung berechnet, um den SOC Ladeende bis zum Ende Regelzeitraum zu erreichen.

                          Bei Überschreitung der Zeit, Ende Regelzeitraum wird die benötigte Ladeleistung neu berechnet, um den SOC Ladeende2 bis zur Zeit Ladeende zu erreichen.

                          Wenn die Zeit Ladeende erreicht ist und die Batterie noch nicht den SOC Ladeende2 erreicht hat, wird das Laden mit maximal noch zur Verfügung stehender PV-Leistung freigegeben.

                          Ausnahme: Wenn die PV-Leistung das Einspeiselimit oder die maximale Wechselrichterleistung übersteigt, wird die Ladeleistung um den Wert erhöht, um das Einspeiselimit oder die maximale Wechselrichterleistung einhalten zu können. Bei Unterschreiten von dem Wert Einspeiselimit oder WR-Limit, wird mit neu berechneter Ladeleistung, gleichmäßig geladen.

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

                          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 A 2 Antworten 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. :-)

                            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 Offline
                                    A Offline
                                    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 Offline
                                      A Offline
                                      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 Offline
                                        A Offline
                                        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
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          766

                                          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