Überschuss-Ladung aus Photovoltaik (Scripte inside)

Überschuss-Ladung aus Photovoltaik (Scripte inside)

Beitragvon ChristianF » Sa 21. Jul 2018, 23:26

Hallo,

nachdem mehrfach nach der Steuerung meiner Überschuss-Ladung aus der PV-Anlage gefragt wurde, habe ich hier einmal die Systeme zusammengestellt und stelle die Scripte zur Verfügung. Es ist alles "quick and dirty", der Code ist sicherlich einfacher machbar und schöner realisierbar, aber es funktioniert so :)

Was ist technisch vorhanden?

- Eine Photovoltaikanlage mit 9,66kWp auf Ost, Süd und Westseite (SolarEdge Lösung, maximale Leistung etwa 7kWp)
- Eine Ladelösung fürs e-Auto basieren auf dem Phoenix Contact Ladecontroller EM-CP-PP-ETH
- eine virtuelle Maschine mit Debian Linux und ioBroker (http://www.iobroker.net)

Zu den Kosten: die PV-Anlage haben wir beim Hausbau schon installiert. Sie trägt sich nahezu selbst. Der Phoenix Controller hat irgendwas um die 200-250EUR gekostet. Der gesamte Software-Stack basiert auf kostenfrei erhältlicher Open Source Software.

Technisch funktioniert es wie folgt: eine Reihe von Scripten checkt in regelmäßigen Abständen, wie viel Strom gerade im Haus verbraucht wird, wieviel Strom durch die PV erzeugt wird und errechnet daraus den Überschuss. Das passiert etwa alle 30 Sekunden. Der überschüssige Strom wird, sobald mehr als 1000W übrig sind, der Ladelösung zur Verfügung gestellt. Um kurze Schwankungen (zB eine Wolke vor der PV oder ein kurzzeitig aktiver großer Verbraucher im Haus, die dafür sorgen könnten dass Strom aus dem Netz benötigt wird) abzufangen und nicht alle paar Sekunden die Ladeleistung an- und abzuschalten, zählt eine Reihe von Timern die Abstände zwischen den Messungen und zählt einen virtuellen Counter rauf bzw. runter, der die Ladeleistung zum Auto final freigibt.

Hier die Ladestromsteuerung in Abhängigkeit von der Überproduktion der PV Anlage:

Als erstes gibt es drei Modi: 0=Überschussladung durch PV, 1=20A Ladung egal woher der Strom kommt (auch ausm Netz), 2=Ladestation gesperrt:

Code: Alles auswählen
on({id: 'javascript.0.Ladestation.1.Modus', change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  console.log('Lademodus Änderung!');
  if (getState("javascript.0.Ladestation.1.Modus").val == 1) {
    console.log('Modus 1 = Vollgas 20A');
    setState("modbus.2.holdingRegisters.300_Ladestromstaerke"/*CP-Level Ladestromstaerke*/, 20);
    setStateDelayed("modbus.2.coils.400_Ladefreigabe"/*CP-Coil*/, true, 1000, false);
  } else if (getState("javascript.0.Ladestation.1.Modus").val == 2) {
    console.log('Modus 2 = gesperrt');
    setStateDelayed("modbus.2.coils.400_Ladefreigabe"/*CP-Coil*/, false, 1000, false);
  }
});


Wenn die Steuerung im Modus 0 ist, wird nach Solar-Überschuss geladen. Und zwar immer genauso viel, wie gerade übrig ist, minus 1A. Warum? Damit im Zweifel übriger Strom ins Netz gespeist wird anstatt dass Strom aus dem Netz zugekauft werden muss.

Dies besorgt das folgende Script:

Code: Alles auswählen
var Ladestrom_verfuegbar, Aktueller_Ladestrom, Neuer_Ladestrom;


schedule("*/30 * * * * *", function () {
  // Wenn der WR im Nachtmodus ist, machen wir hier gar nix.
  if (getState("modbus.0.holdingRegisters.40108_OP-State").val != 2) {
    if (getState("javascript.0.Ladestation.1.Modus").val == 0) {
      // Wenn die Erzeugungslogik zu wenig Ertrag aufweist, sperren wir hier.
      if (getState("javascript.0.SolarEdge.Minimalerzeugung_erreicht").val == true) {
        // Minimalerzeugung ist erreicht, also los..
        if (getState("modbus.2.coils.400_Ladefreigabe").val == false) {
          setState("modbus.2.coils.400_Ladefreigabe"/*CP-Coil*/, true);
          setStateDelayed("modbus.2.coils.400_Ladefreigabe"/*CP-Coil*/, true, 3000, false);
        }
        // Aktuellen Ladestrom in Variable schreiben
        Ladestrom_verfuegbar = 0;
        Ladestrom_verfuegbar = getState("modbus.2.inputRegisters.120_W_L1-N").val + (getState("javascript.0.Stromzaehler.Einspeisung_aktuell").val - getState("javascript.0.Stromzaehler.Netzbezug_aktuell").val);
        Aktueller_Ladestrom = getState("javascript.0.Ladestation.1.Ladestrom_Ueberschussladen").val;
        // Den neuen LS kennen wir noch nicht -> 0
        Neuer_Ladestrom = 0;
        if (Ladestrom_verfuegbar <= 1610) {
          if (Ladestrom_verfuegbar >= 1000 && Ladestrom_verfuegbar <= 1610) {
            // 6A ist Minimum, und da wir immer ein bisschen übrig haben wollen, gehen wir bis unter die Grenze von 7A hoch (1610W)
            Neuer_Ladestrom = 6;
          } else if (false) {
          }
        } else if (Ladestrom_verfuegbar >= 1611 && Ladestrom_verfuegbar <= 1840) {
          Neuer_Ladestrom = 7;
        } else if (Ladestrom_verfuegbar >= 1841 && Ladestrom_verfuegbar <= 2070) {
          Neuer_Ladestrom = 8;
        } else if (Ladestrom_verfuegbar >= 2071 && Ladestrom_verfuegbar <= 2300) {
          Neuer_Ladestrom = 9;
        } else if (Ladestrom_verfuegbar >= 2301 && Ladestrom_verfuegbar <= 2530) {
          Neuer_Ladestrom = 10;
        } else if (Ladestrom_verfuegbar >= 2531 && Ladestrom_verfuegbar <= 2760) {
          Neuer_Ladestrom = 11;
        } else if (Ladestrom_verfuegbar >= 2761 && Ladestrom_verfuegbar <= 2990) {
          Neuer_Ladestrom = 12;
        } else if (Ladestrom_verfuegbar >= 2991 && Ladestrom_verfuegbar <= 3220) {
          Neuer_Ladestrom = 13;
        } else if (Ladestrom_verfuegbar >= 3221 && Ladestrom_verfuegbar <= 3450) {
          Neuer_Ladestrom = 14;
        } else if (Ladestrom_verfuegbar >= 3451 && Ladestrom_verfuegbar <= 3680) {
          Neuer_Ladestrom = 15;
        } else if (Ladestrom_verfuegbar >= 3681 && Ladestrom_verfuegbar <= 3910) {
          Neuer_Ladestrom = 16;
        } else if (Ladestrom_verfuegbar >= 3911 && Ladestrom_verfuegbar <= 4140) {
          Neuer_Ladestrom = 17;
        } else if (Ladestrom_verfuegbar >= 4141 && Ladestrom_verfuegbar <= 4370) {
          Neuer_Ladestrom = 18;
        } else if (Ladestrom_verfuegbar >= 4371 && Ladestrom_verfuegbar <= 4600) {
          Neuer_Ladestrom = 19;
        } else if (Ladestrom_verfuegbar >= 4601) {
          Neuer_Ladestrom = 20;
        }
        // Jetzt wissen wir den neuen Ladestrom! Alt=neu?
        if (Aktueller_Ladestrom != Neuer_Ladestrom) {
          // Oh, was Neues! Gleich an PV_Ladestrom geben!
          console.log((['Ladestrom verändert, wird von ',Aktueller_Ladestrom,' verändert auf ',Neuer_Ladestrom].join('')));
          setState("javascript.0.Ladestation.1.Ladestrom_Ueberschussladen"/*Ladestrom_Ueberschussladen*/, Neuer_Ladestrom, true);
          setState("modbus.2.holdingRegisters.300_Ladestromstaerke"/*CP-Level Ladestromstaerke*/, Neuer_Ladestrom);
        } else {
          // Nix Neues, nix zu tun
          console.log((['Ladestrom gleichgeblieben, bleibt bei ',Aktueller_Ladestrom,' (neu wäre ',Neuer_Ladestrom,' gewesen)'].join('')));
          setState("modbus.2.holdingRegisters.300_Ladestromstaerke"/*CP-Level Ladestromstaerke*/, Neuer_Ladestrom);
        }
      } else {
        // Minimalerzeugung nicht erreicht, also wird nicht nach PV-Überschuss geladen!
        if (getState("modbus.2.coils.400_Ladefreigabe").val == true) {
          setState("modbus.2.coils.400_Ladefreigabe"/*CP-Coil*/, false);
          setStateDelayed("modbus.2.coils.400_Ladefreigabe"/*CP-Coil*/, false, 3000, false);
        }
      }
    } else {
      // Wir sind nicht im AUTO Modus des Ladereglers, nix zu tun
    }
  } else {
    // Wechselrichter schläft, nix zu tun.
  }
});


Das Script basiert auf einer sog. Mindesteinspeisung, die durch das folgende Script errechnet wird (und auf Erreicht=Ja/Nein gesetzt wird). Faustformel: wenn mehr als 1000W übrig sind, ist die Minimaleinspeisung erreicht.

Code: Alles auswählen
var Mindesteinspeisung, timeout, timeout2, timeout3, timeout4, timeout5, timeout6, timeout7, timeout8, timeout9, timeout10, timeout11;


on({id: 'javascript.0.SolarEdge.Minimalerzeugung_Counter', change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  if (getState("modbus.0.holdingRegisters.40108_OP-State").val != 2) {
    if (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val >= 8) {
      setState("javascript.0.SolarEdge.Minimalerzeugung_erreicht"/*Minimalerzeugung_erreicht*/, true, true);
      setState("javascript.0.SolarEdge.Minimalerzeugung_erreicht"/*Minimalerzeugung_erreicht*/, true);
    }
    if (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val < 3) {
      setState("javascript.0.SolarEdge.Minimalerzeugung_erreicht"/*Minimalerzeugung_erreicht*/, false, true);
      setState("javascript.0.SolarEdge.Minimalerzeugung_erreicht"/*Minimalerzeugung_erreicht*/, false);
    }
  }
});

schedule("*/3 * * * *", function () {
  // Wir machen nur weiter, wenn der WR aktiv ist (OP=2)
  Mindesteinspeisung = 1000;
  if (getState("modbus.0.holdingRegisters.40108_OP-State").val != 2) {
    console.log('CRON /3 ist durch, WR Ungleich 2: es geht los');
    timeout = setTimeout(function () {
      console.log((['Stufe 1. ','Energiewert: ',getState("javascript.0.Energie").val,'; Verbrauch_ohAuto: ',getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'; Mindesteinspeis: ',getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'Counter: ',getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val].join('')));
      if (getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val >= Mindesteinspeisung) {
        setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val + 1));
      } else {
        setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val - 1));
      }
      timeout2 = setTimeout(function () {
        console.log((['Stufe 2. ','Energiewert: ',getState("javascript.0.Energie").val,'; Verbrauch_ohAuto: ',getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'; Mindesteinspeis: ',getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'Counter: ',getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val].join('')));
        if (getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val >= Mindesteinspeisung) {
          setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val + 1));
        } else {
          setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val - 1));
        }
        timeout3 = setTimeout(function () {
          console.log((['Stufe 3. ','Energiewert: ',getState("javascript.0.Energie").val,'; Verbrauch_ohAuto: ',getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'; Mindesteinspeis: ',getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'Counter: ',getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val].join('')));
          if (getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val >= Mindesteinspeisung) {
            setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val + 1));
          } else {
            setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val - 1));
          }
          timeout4 = setTimeout(function () {
            console.log((['Stufe 4. ','Energiewert: ',getState("javascript.0.Energie").val,'; Verbrauch_ohAuto: ',getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'; Mindesteinspeis: ',getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'Counter: ',getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val].join('')));
            if (getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val >= Mindesteinspeisung) {
              setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val + 1));
            } else {
              setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val - 1));
            }
            timeout5 = setTimeout(function () {
              console.log((['Stufe 5. ','Energiewert: ',getState("javascript.0.Energie").val,'; Verbrauch_ohAuto: ',getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'; Mindesteinspeis: ',getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'Counter: ',getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val].join('')));
              if (getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val >= Mindesteinspeisung) {
                setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val + 1));
              } else {
                setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val - 1));
              }
              timeout6 = setTimeout(function () {
                console.log((['Stufe 6. ','Energiewert: ',getState("javascript.0.Energie").val,'; Verbrauch_ohAuto: ',getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'; Mindesteinspeis: ',getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'Counter: ',getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val].join('')));
                if (getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val >= Mindesteinspeisung) {
                  setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val + 1));
                } else {
                  setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val - 1));
                }
                timeout7 = setTimeout(function () {
                  console.log((['Stufe 7. ','Energiewert: ',getState("javascript.0.Energie").val,'; Verbrauch_ohAuto: ',getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'; Mindesteinspeis: ',getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'Counter: ',getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val].join('')));
                  if (getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val >= Mindesteinspeisung) {
                    setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val + 1));
                  } else {
                    setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val - 1));
                  }
                  timeout8 = setTimeout(function () {
                    console.log((['Stufe 8. ','Energiewert: ',getState("javascript.0.Energie").val,'; Verbrauch_ohAuto: ',getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'; Mindesteinspeis: ',getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'Counter: ',getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val].join('')));
                    if (getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val >= Mindesteinspeisung) {
                      setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val + 1));
                    } else {
                      setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val - 1));
                    }
                    timeout9 = setTimeout(function () {
                      console.log((['Stufe 9. ','Energiewert: ',getState("javascript.0.Energie").val,'; Verbrauch_ohAuto: ',getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'; Mindesteinspeis: ',getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'Counter: ',getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val].join('')));
                      if (getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val >= Mindesteinspeisung) {
                        setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val + 1));
                      } else {
                        setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val - 1));
                      }
                      timeout10 = setTimeout(function () {
                        console.log((['Stufe 10. ','Energiewert: ',getState("javascript.0.Energie").val,'; Verbrauch_ohAuto: ',getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'; Mindesteinspeis: ',getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'Counter: ',getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val].join('')));
                        if (getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val >= Mindesteinspeisung) {
                          setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val + 1));
                        } else {
                          setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val - 1));
                        }
                        timeout11 = setTimeout(function () {
                          console.log((['Stufe 11. ','Energiewert: ',getState("javascript.0.Energie").val,'; Verbrauch_ohAuto: ',getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'; Mindesteinspeis: ',getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val,'Counter: ',getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val].join('')));
                          if (getState("javascript.0.Energie").val - getState("javascript.0.Stromzaehler.Verbrauch_ohneAuto").val >= Mindesteinspeisung) {
                            setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val + 1));
                          } else {
                            setState("javascript.0.SolarEdge.Minimalerzeugung_Counter"/*Minimalerzeugung_Counter*/, (getState("javascript.0.SolarEdge.Minimalerzeugung_Counter").val - 1));
                          }
                        }, 15000);
                      }, 15000);
                    }, 15000);
                  }, 15000);
                }, 15000);
              }, 15000);
            }, 15000);
          }, 15000);
        }, 15000);
      }, 15000);
    }, 15000);
  }
});


Für die Minimaleinspeisung brauchen wir die aktuellen Stromverbrauchs- und Stromerzeugungswerte, die dieses Script liefert (wobei javascript.0.Energie die aktuelle Leistung des WR in W ist):

Code: Alles auswählen
var timeout, timeout2;


on({id: 'smartmeter.0.1-0:1_8_0_255.value', change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  // Der Bezugszähler 1.8.0 hat sich verändert -> BEZUG
  timeout = setTimeout(function () {
    setState("javascript.0.Stromzaehler.Netzbezug_aktuell"/*Netzbezug_aktuell*/, getState("smartmeter.0.1-0:15_7_0_255.value").val, true);
    setState("javascript.0.Stromzaehler.Einspeisung_aktuell"/*Einspeisung_aktuell*/, 0, true);
    setState("javascript.0.Stromzaehler.Verbrauch"/*Verbrauch*/, (getState("smartmeter.0.1-0:15_7_0_255.value").val + getState("javascript.0.Energie").val), true);
    setState("javascript.0.Stromzaehler.Verbrauch_ohneAuto"/*Verbrauch_ohneAuto*/, ((getState("smartmeter.0.1-0:15_7_0_255.value").val + getState("javascript.0.Energie").val) - getState("modbus.2.inputRegisters.120_W_L1-N").val), true);
  }, 200);
});

on({id: 'smartmeter.0.1-0:2_8_0_255.value', change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  // Der Lieferzähler 2.8.0 hat sich verändert -> EINSPEISUNG
  timeout2 = setTimeout(function () {
    setState("javascript.0.Stromzaehler.Einspeisung_aktuell"/*Einspeisung_aktuell*/, getState("smartmeter.0.1-0:15_7_0_255.value").val, true);
    setState("javascript.0.Stromzaehler.Netzbezug_aktuell"/*Netzbezug_aktuell*/, 0, true);
    setState("javascript.0.Stromzaehler.Verbrauch"/*Verbrauch*/, (getState("javascript.0.Energie").val - getState("smartmeter.0.1-0:15_7_0_255.value").val), true);
    setState("javascript.0.Stromzaehler.Verbrauch_ohneAuto"/*Verbrauch_ohneAuto*/, ((getState("javascript.0.Energie").val - getState("smartmeter.0.1-0:15_7_0_255.value").val) - getState("modbus.2.inputRegisters.120_W_L1-N").val), true);
  }, 200);
});


So, das sollten dann alle Scripte sein. In der Vis wird neben ein paar Zahlen auch der Ladestatus im Klartext angezeigt, den erzeugt dieses kleine Script hier:

Code: Alles auswählen
on({id: new RegExp('modbus\\.2\\.inputRegisters\\.100_CP-Status' + "|" + 'modbus\\.2\\.inputRegisters\\.120_W_L1-N'), change: "ne"}, function (obj) {
    if (getState("modbus.2.inputRegisters.100_CP-Status").val == 65) {
    // 65 = A = kein Auto angeschlossen
    setState("javascript.0.Ladestation.1.Status_Text"/*Status_Text*/, 'kein Auto verbunden', true);
  } else if (getState("modbus.2.inputRegisters.100_CP-Status").val == 66) {
    // 66 = B = Auto angeschlossen, nicht bereit
    setState("javascript.0.Ladestation.1.Status_Text"/*Status_Text*/, 'Auto verbunden,Lade-Ende', true);
  } else if (getState("modbus.2.inputRegisters.100_CP-Status").val == 67 && getState("modbus.2.inputRegisters.120_W_L1-N").val <= 10) {
    // 66 = C = Auto angeschlossen, ladebereit (aber <10W Abnahme)
    setState("javascript.0.Ladestation.1.Status_Text"/*Status_Text*/, 'Auto verbunden,Vorbereitung..', true);
  } else if (getState("modbus.2.inputRegisters.100_CP-Status").val == 67 && getState("modbus.2.inputRegisters.120_W_L1-N").val > 10) {
    // 67 = D = Auto angeschlossen, lädt (Abnahme >10W)
    setState("javascript.0.Ladestation.1.Status_Text"/*Status_Text*/, 'Auto verbunden, lädt', true);
  } else if (getState("modbus.2.inputRegisters.100_CP-Status").val == 69) {
    // 69 = E = Auto angeschlossen, Kurzschluss/kein Strom
    setState("javascript.0.Ladestation.1.Status_Text"/*Status_Text*/, 'Kurzschluss oder kein Strom', true);
  } else if (getState("modbus.2.inputRegisters.100_CP-Status").val == 70) {
    // 70 = F = Auto angeschlossen, Systemfehler
    setState("javascript.0.Ladestation.1.Status_Text"/*Status_Text*/, 'Systemfehler', true);
  }
});


Darüber hinaus gibt es noch Spielereien wie zB ein Script, das den Akkustand aus dem Auto liest und rechtzeitig vor einem neuen Arbeitstag benachrichtigt, falls der Autoakku nicht für den Weg zur Arbeit reichen sollte:

Code: Alles auswählen
schedule("0,30 19-21 * * 0-5", function () {
  if (getState("hm-rega.0.7462").val == true && getState("javascript.0.CarNet.eGolf.BatteryPercentage").val <= 25) {
    sendTo("telegram", "send", {
        text: (['Achtung! Es ist jetzt ',formatDate(new Date(), "hh:mm"),' Uhr und der Akku des eGolf ist nicht voll! Letzter Stand: ',getState("javascript.0.CarNet.eGolf.BatteryPercentage").val,'% bzw. ',getState("javascript.0.CarNet.eGolf.ElectricRange").val,'km um ',formatDate(getDateObject(getState("javascript.0.CarNet.eGolf.ElectricRange").lc), "hh:mm")].join(''))
    });
    console.log("telegram: " + (['Achtung! Es ist jetzt ',formatDate(new Date(), "hh:mm"),' Uhr und der Akku des eGolf ist nicht voll! Letzter Stand: ',getState("javascript.0.CarNet.eGolf.BatteryPercentage").val,'% bzw. ',getState("javascript.0.CarNet.eGolf.ElectricRange").val,'km um ',formatDate(getDateObject(getState("javascript.0.CarNet.eGolf.ElectricRange").lc), "hh:mm")].join('')));
  }
});


Der Akkustand kommt übrigens via CarNet ins System, das passende Script dazu findet Ihr hier: vw-e-golf-infotainment/neues-car-net-t24218-390.html#p789032

Ich wünsche viel Spass mit den Scripten (die natürlich jeder an seine Umgebung anpassen muss). Hoffe ich habe nix vergessen. Bei Fragen, gern melden.

VG
Christian
Zuletzt geändert von ChristianF am Sa 21. Jul 2018, 23:50, insgesamt 5-mal geändert.
Viele Grüße,
Christian

e-Up seit 2017 und e-golf 300 seit 2018
Überschussladung mit Leistungssteuerung an eigener PV-Anlage
ChristianF
 
Beiträge: 505
Registriert: Di 2. Feb 2016, 21:01

Anzeige

Re: Überschuss-Ladung aus Photovoltaik (Scripte inside)

Beitragvon ChristianF » Sa 21. Jul 2018, 23:27

Ergebnis ist dann übrigens solch ein Graph von einem sonnigen Wochenende-Tag Anfang Juni:

lad.jpg


Man sieht relativ gut, dass gegen 7:15 Uhr das erste Mal die Mindesteinspeisung von 1000W erreicht waren und das Auto zu laden angefangen hat. Mit steigender Erzeugung durch die PV-Anlage ist der Ladestrom linear mit angestiegen, bis er gegen 10:15 Uhr rapide abfällt, da das Auto dann voll war.

Wie man oben sieht, haben wir an dem Tag 23,12 kWh Strom verbraucht, wovon wir 17,48kWh selbst erzeugt haben. Ein Großteil davon ist ins Auto geflossen. Aus dem Netz zugekauft haben wir 5,64kWh, von denen nicht eine einzige ins Auto gegangen ist, sondern von denen wir größtenteils die Nachzeit plus die kleine Spitze gegen 18:00 Uhr bedient haben. Da wir insgesamt etwa 8,5 Stunden Nacht und somit keine Erzeugung durch die PV Anlage hatten, ergibt das bei einer Grundlast von ca. 450-500W (ja, ich weiß..) ziemlich genau 4kWh Nachtverbrauch, die 1,5kWh am Abend sind fürs Essenkochen draufgegangen ;)

Ende vom Lied: wir haben ein 100% regenerativ aufgeladenes Auto und haben dafür NICHTS bezahlt. In der Gegenrechnung könnte man sagen: wir haben für den selbstverbrauchten Strom keine Einspeisevergütung bekommen, die bei etwa 12,5ct pro kWh liegt. Dafür sind mindestens 15kWh Strom ins Auto geflossen. Rechnet man jetzt mal einen Verbrauch von 15kWh Strom auf 100km, so haben wir 100km Reichweite "getankt", dafür nichts bezahlt und lediglich entgangene Einnahmen von 15*12,5ct = 1,87€ zu verzeichnen. Andersrum kann man sagen: 100km Autofahren und dafür 1,87€ für 100% renegerative Energieversorgung bezahlen :)
Viele Grüße,
Christian

e-Up seit 2017 und e-golf 300 seit 2018
Überschussladung mit Leistungssteuerung an eigener PV-Anlage
ChristianF
 
Beiträge: 505
Registriert: Di 2. Feb 2016, 21:01

Re: Überschuss-Ladung aus Photovoltaik (Scripte inside)

Beitragvon Dentec » So 22. Jul 2018, 09:10

Sehr schön.
Es werden gefühlt immer mehr solcher Anlagen. 100% sinnvoll.
Ich lade selbst auch seit Mitte März ausschließlich eigenen PV-Strom ins Auto.
Steuerung mache ich ebenso über Modbus mit dem Phoenix Controller und Linux Skript auf einem Raspberry PI.
Grüße
Model 3 reserviert
BMW I3 "Yello Connect" seit 16.02.2018
PV-gesteuertes Laden
Benutzeravatar
Dentec
 
Beiträge: 177
Registriert: Mi 29. Jun 2016, 11:33

Re: Überschuss-Ladung aus Photovoltaik (Scripte inside)

Beitragvon multifluid » So 22. Jul 2018, 12:24

Sehr interessante Lösung. Wir haben einen i3 der über eine Wallbox mit EVSE geladen wird. Leider haben wir, als wir gebaut haben, keine Solarmodule bekommen (nicht mal ein Angebot, 7 Jahre her). Heute bedaure ich, nicht mehr Druck gemacht zu haben.

Mich würde aber grundsätzlich interessieren, ob man das Ganze nicht auch mit DC machen könnte. Die PV erzeugt DC und das Auto kann mit DC geladen werden. Eventuell mit Batteriepuffer, denn die meisten werden ihr Auto nachts laden wollen.

Weiter hört man immer von Energieüberschuss bei der Erzeugung durch Wind. Dafür wären e Autos doch der ideale Abnehmer. Ich warte auf Tarife, ähnlich wie Nachtspeicher, die so etwas anbieten.
BMW i3 94Ah seit März 2018.
multifluid
 
Beiträge: 4
Registriert: Di 13. Mär 2018, 14:27

Re: Überschuss-Ladung aus Photovoltaik (Scripte inside)

Beitragvon ChristianF » So 22. Jul 2018, 18:08

Eine DC-DC-Kopplung würde ich auch interessant finden, ist aber wohl nicht ganz einfach hinzubekommen. Weiterhin wäre die Frage, in wie weit sich das wirklich lohnt. Die AC-Welt ist schnell und einfach gebaut, bei DC müssten die Komponenten schon in vergleichbaren Dimensionen liegen, damit es sich wirklich lohnt. Gefühlt würde DC aber vermutlich erheblich teurer werden, sodass die eingesparten Wandlungsverluste vermutlich niemals die erhöhten Kosten kompensieren würden.

Unser lokales Stadtwerk bietet jetzt eine erste Idee an, Regelenergie aus Windkraft zu nutzen. Leider ist die Umsetzung nicht wirklich elektroautotauglich. Infos gibts hier: https://www.stadtwerke-norderstedt.de/u ... nt/new-40/
Viele Grüße,
Christian

e-Up seit 2017 und e-golf 300 seit 2018
Überschussladung mit Leistungssteuerung an eigener PV-Anlage
ChristianF
 
Beiträge: 505
Registriert: Di 2. Feb 2016, 21:01

Re: Überschuss-Ladung aus Photovoltaik (Scripte inside)

Beitragvon Schneemann » So 22. Jul 2018, 20:49

Bei uns übernimmt der Hausspeicher die Überbrückung wenn mal eine Wolke durchzieht und die Leistung der PV nicht ausreicht. Wenn ausreichend Leistung zur Verfügung steht, wird angestöpselt. Zumindest in den Sommermonaten wird das Auto dann auch nur regenerativ vom eigenen Dach geladen. Nicht ganz so ausgeklügelt wie bei dir, aber funktioniert auch.
Meine Erfahrungen mit der E-Mobilität auf Kennzeichen E

In the year 5555
Your arms hanging limp at your sides
Your legs got nothing to do
Some machine’s doing that for you
Benutzeravatar
Schneemann
 
Beiträge: 948
Registriert: Di 31. Mai 2016, 18:49
Wohnort: Quickborn-Heide

Re: Überschuss-Ladung aus Photovoltaik (Scripte inside)

Beitragvon ChristianF » Mo 23. Jul 2018, 00:02

Hmm, Hausspeicher.. ich weiß nicht, bisher habe ich noch kein Modell gefunden wo nicht zumindest eine schwarze Null rauskommt.. Im Endeffekt war der selbst erzeugte, eingespeicherte und dann selbst verbrauchte Strom immer teurer als eine aus dem Netz bezogene kWh..
Viele Grüße,
Christian

e-Up seit 2017 und e-golf 300 seit 2018
Überschussladung mit Leistungssteuerung an eigener PV-Anlage
ChristianF
 
Beiträge: 505
Registriert: Di 2. Feb 2016, 21:01

Re: Überschuss-Ladung aus Photovoltaik (Scripte inside)

Beitragvon Ilchi » Mo 23. Jul 2018, 07:08

War bei meinen Betrachtungen auch immer so. Der Speicher wird immer von der Photovoltaik subventioniert - auch bei Sonnen, E3DC oder wie sie auch immer heißen.
Hinzu kommt, dass man bei guter Eigenverbrauchssteuerung - und die lohnt sich durchaus - keinen Akku mehr braucht. Im Winter habe ich keinen Strom mehr zum Speichern, im Sommer fast keinen Bedarf abseits der Sonne. Ich komme über das Jahr auf rund 55 % Autarkie, mit Elektroauto und Wärmepumpe (11 kWp und ca. 7.000 kWh Jahresverbrauch). Ich könnte ungefähr 400 kWh zusätzlich über einen Akku schicken. Da ist alleine der Standbyverbrauch der zusätzlichen Komponenten höher...
Ioniq seit 04/2017
Ilchi
 
Beiträge: 395
Registriert: So 12. Apr 2015, 13:27

Re: Überschuss-Ladung aus Photovoltaik (Scripte inside)

Beitragvon ecopowerprofi » Mo 23. Jul 2018, 16:35

Ilchi hat geschrieben:
Der Speicher wird immer von der Photovoltaik subventioniert

Das hängt nur von dem Stromverbrauch ab. Bei einem EFH mit 4000 kWh/a Stromverbrauch gebe ich Dir vollkommen recht. Eine Wirtschaftlichkeit fängt so bei 8000 bis 10000 kWh an. Da muss man aber das Verbrauchsprofil ansehen und damit rechnen.

Ilchi hat geschrieben:
bei Sonnen, E3DC oder wie sie auch immer heißen.

Die von denen angebotene Spielspeicher mit 4 bis 6 kWh rechnen sich nie. Die werden immer schön gerechnet.

Ilchi hat geschrieben:
Ich komme über das Jahr auf rund 55 % Autarkie

Das hängt wiederum von Deinen Verbrauch und der Größe der PV-Anlage ab. Auch da wird kräftig schön gerechnet. Wichtig ist nicht die Autarkie sondern die Eigenverbrauchsquote. Nur eine hohe Eigenverbrauchsquote ergibt eine hohe Rendite. Weniger ist da oft mehr.
Rechnen hilft. Bleistift, Stück Papier und ein Taschenrechner und man wird sich über einige Ergebnisse wundern. :idea:
http://www.perdok.info Ladeboxe und mehr.
3x Renault ZOE, Stromtankstelle ecoLOAD 22kW mit Typ2 öffentlich und kostenlos 24/7
Benutzeravatar
ecopowerprofi
 
Beiträge: 2959
Registriert: So 6. Dez 2015, 08:16
Wohnort: 46562 Voerde

Re: Überschuss-Ladung aus Photovoltaik (Scripte inside)

Beitragvon Schneemann » Mo 23. Jul 2018, 18:38

Rendite ist bei mir nicht die treibende Kraft. Mich interessiert mehr, wie lange sich das Haus selbst versorgen kann.
Meine Erfahrungen mit der E-Mobilität auf Kennzeichen E

In the year 5555
Your arms hanging limp at your sides
Your legs got nothing to do
Some machine’s doing that for you
Benutzeravatar
Schneemann
 
Beiträge: 948
Registriert: Di 31. Mai 2016, 18:49
Wohnort: Quickborn-Heide

Anzeige

Nächste

Zurück zu Private Lade-Infrastruktur

 
  • Ähnliche Themen
    Antworten
    Zugriffe
    Letzter Beitrag
  • Ähnliche Artikel im Blog

Wer ist online?

Mitglieder in diesem Forum: Ranzoni und 6 Gäste