„Mini-PV“ mit Überschussladen dank Shelly 3EM pro saldierend, openHAB und go-e charger

Seit Anfang 2021 sind wir elektrisch unterwegs. Ende 2021 stieg dann der Strompreis dank Stromanbieterpleite kurzzeitig auf 90Ct /kWh. Zwei Gründe, sich mit dem Thema PV näher zu beschäftigen, wenn man das Geld nicht zum Fenster rauswerfen möchte…

Erster Gedanke: Eine Firma beauftragen. Problem: Auf meinem Reihenmittelhausdach ist nicht so richtig viel Platz am Flachdach. Vor allem, weil mitten am Dach schon vier große Solarthermie-Paneele hochkant stehen, die ich auch nicht umstellen / verändern kann. Daraus resultiert dahinter ein gewisser Schattenwurf. String-Wechselrichter waren aufgrund Schatten kaum geeignet, Optimierer schieden aus anderen Gründen leider auch aus und generell kurz gesagt: Keine Firma wollte den Job haben, trotz vieler, vieler Anfragen meinerseits. Woanders verdient man als Firma mit PV eben leichter Geld.

Zweiter Gedanke – je mehr ich mich mit dem Thema zwangsläufig selbst beschäftig habe- war: Selber machen.

Und so hat es sich am Ende dann auch ergeben und inzwischen erzeugt eine kleine Anlage auf dem Dach nun Strom. Folgende Konstellation ergibt insgesamt eine Leistung von 3,12kWp:

  • 8x Paneele à 390 Watt (JA-Solar jam54s31-390/mr, blieben aus einem größeren Projekt eines Freundes über)
  • 2x Microwechselrichter Hoymiles HSM-2000-4T (um optimal mit der Schattenkonstellation und der für die „früheren“ HM-Serien zu hohen Eingangsstromleistung auszukommen)
  • Solarstell Connect Flachdach-Aufständerungen (1x 4 Module quer, 1x 2 Module quer, 1x 2 Module hochkant)
  • Shelly 3EM Pro (einmal für das Messen des Verbrauchs aller Verbraucher und separat einmal für das Messen der aktuellen Stromproduktion)

Zu guter Letzt musste (was auch der höchste Kostenfaktor war) meine Hausverteilung komplett neu aufgebaut werden. Da hier Einiges an Pfusch vom Hausbau 2011 und des damaligen Elektrikers beseitigt werden musste, kann man das aber auch nur bedingt nur der PV zuschreiben. Insgesamt 6.130€ und damit knapp 2000€ je kWp.

Nach dem was ich bisher weiß schaffe ich es wohl, 80% des Stroms auch zu verwenden. Insofern hat sich – abhängig vom Strompreis und der tatsächlichen Jahresproduktion – die Anlage vermutlich allerspätestens in zehn Jahren amortisiert. Rechne ich die neue Hausverteilung raus, weil die auch aus anderen Gründen sinnvoll war, geht es 1/3 schneller.

Was mache ich nun mit dem Strom?

Der Gedanke, das Auto per Sonnenstrom zu laden, hat mich schon sehr beschäftigt. Allerdings war mir unklar, ob das so richtig funktioniert. Wieviel Strom kommt wirklich vom Dach? Wie wirken sich die geringen Neigungswinkel der Aufständerung aus? Wie der Schattenwurf? Insgesamt lieferte die Anlage allerdings ab dem ersten Tag schon ganz gute Werte, so dass ich hier schon optimistisch war. Da wir das Auto tagsüber nicht oft brauchen und beruflich nicht darauf angewiesen sind, steht es eh meist in der Garage.

Kleine Herausforderung war dann noch der Umgang mit dem Ladevorgang selbst. Unser Kia e Niro lädt ab 6 Ampere Ladeleistung, was bei normalen dreiphasigen Ladevorgängen etwa 3600 Watt Leistung entspricht. Also mehr Leistung als vom Dach kommen kann. Meine Wallbox ist ein goe-Charger, leider noch eine alte HW-Version, die noch kein Umschalten auf einphasiges Laden kann. Gelöst habe ich das dann durch den Kauf eines einphasigen Ladekabels, das so die Bereiche ~1000 Watt bis ~3600 Watt abdeckt. Manuell funktionierte das Laden damit schon ganz gut. Also ging es weiter…

Überschussladen via openHAB

Folgende Anforderungen waren mir wichtig:

  • Automatisches Aktivieren des Überschussladens, wenn das einphasige Kabel eingesteckt ist. Ist das dreiphasige eingesteckt, soll mit 11kW geladen werden.
  • Laden auch dann, wenn noch nicht der volle Überschuss da ist, also wenn die Hälfte vom Dach kommt und die Hälfte vom Netz bezogen wird, ist das auch noch OK.
  • Konfigurationsmöglichkeiten über die openHAB-GUI und ein halbwegs schickes Widget, da das ganze noch auf einem Wand-Tablet landen soll (später)

Vorhanden sind grundsätzlich bestimmte Items in openhab, die ich über die GUI angelegt habe, die den Strombezog mit Wollbox, ohne, die PV-Leistung usw. beinhalten und die in den nachfolgenden Regeln vorkommen. Persistiert wird das Ganze in influxdb, so dass wir auch auf Durchschnittswerte zurückgreifen können.

Was im Probebetrieb bald auffiel, war ein Aus- und Anschalten, wenn kurzzeitig Wolken kamen oder z.B. Verbraucher im Haus dazukamen (Fön, Waschmaschine, ..). Reinem Überschussladen widersprechen das, insofern ok, dass natürlich der Ladevorgang komplett gestoppt wurde. Hier wollte ich allerdings konstantere Ladevorgänge und habe daher dann in die Regeln eingebaut, dass nur dann abgebrochen wird, wenn in Betrachtung der letzten 15 Minuten ein Laden nicht mehr gestartet würde. Das ständige An- und Ausschalten des Ladevorgangs insgesamt wollte ich dem Auto einfach ersparen.

Um das ganze auch optisch etwas schöner anzuzeigen habe ich mir dazu auch noch ein kleines Widget für die OH3-UI gebastelt, in dem ich dann auch einstellen kann, ab wann wirklich geladen werden soll (im Beispiel ab 550 Watt Überschuss). Ladestärke wird dann natürlich per Rules angepasst.

Tatsächlich schaffe ich es mit den nachfolgenden Rules dann auch auf ein gutes Ausnutzen des Sonnenstroms:

Die blaue Linie ist letztlich die entscheidende. Bewegt sich diese nahezu bei der Null-Linie, dann nutze ich den Strom bestmöglich aus. Im Beispieltag allerdings liefen teils noch weitere Haushaltsgeräte, die dann natürlich die Ausschläge nach oben – sofern die Wallbox nicht weiter runtergeregelt werden kann – verursachen. Wenn man hier mehr auf Sicherheit gehen will, nichts oder weniger aus dem Netz zu beziehen, müsste man eben noch in die Ladestärkensteuerung etwas mehr Puffer hineinprogrammieren oder eben schneller einen Ladevorgang abbrechen, was ich so aber für mich nicht wollte.

Insgesamt wurden am Beispieltag 15 kWh Strom ins Auto geladen, was etwa 80 Kilometern Fahrleistung entspricht. 64kWh hat der Akku grundsätzlich an Kapazität. Ich bin gespannt, wie die Leistung Mitte Juni dann aussehen wird, wenn der Sonnenstand am höchsten ist.

Noch zum Chart: Ist eine Fläche unter der Null-Linie nur weiß und nicht grau hinterlegt, wurde der Sonnenstrom vollständig genutzt. Graue Fläche unterhalb bedeutet Einspeisung, oberhalb Netzbezug.

Abseits davon, dass das Überschussladen noch klappt hatte das Ganze den Positiven Aspekt, dass ich nun endlich den Umstieg von openHAB 2.5 auf 3.4 geschafft habe 😉

Nun zu den rules…

openHAB-Rule: Saldierenden Verbrauch ermitteln

Um generell zu wissen, beziehen wir gerade Strom oder speisen wir ein und um die Leistung der PV-Anlage zu kennen arbeiten zwei Shellys, die per mqtt angebunden sind.

rule "Saldierender Stromverbrauch Haus und PV"
when 
    Item shellypro3emhaus_Power changed
    or Item shellypro3empv_Power changed
then     
    strom_saldierend.postUpdate((shellypro3emhaus_Power.state as Number) + (shellypro3empv_Power.state as Number))
    strom_saldierend_ohne_wallbox.postUpdate((shellypro3emhaus_Power.state as Number) + (shellypro3empv_Power.state as Number) - (GoeCharger_Power_All.state as Number))
end

openHAB-Rule: Wallbox überwachen, Überschussladen aktivieren / deaktivieren

Anhand eingesteckten Kabels (einphasig) sowie einer grundsätzlichen Konfiguration, die im Widget einstellbar ist, ob überhaupt Überschussladen stattfinden soll (bei einphasigem Kabel) wird diese Option gesteuert:

rule "Anschluss Wallbox überwachen, um Überschuss-Lademodus abhängig davon anzusteuern"
when 
    Item GoeCharger_Cable_Encoding changed
    or Item config_pv_laden_aktivieren changed
    or Item GoeCharger_Power_All changed
    or Item GoeCharger_Phases changed
then
    if (GoeCharger_Cable_Encoding.state == NULL) {
        logInfo(logPrefix, 'Wallbox aktuell nicht erreichbar, daher keine Änderung Überschusslademodus')
    } else {
        // Ist config_pv_laden_aktivieren AN sowie das richtige Kabel eingesteckt ist der Überschusslade-Modus aktiviert
        if (((GoeCharger_Cable_Encoding.state as Number).intValue == 20) && (config_pv_laden_aktivieren.state == ON)) {
            if (ueberschussladen_aktiv.state != ON) ueberschussladen_aktiv.sendCommand(ON)
        } else {
            if (ueberschussladen_aktiv.state != OFF) ueberschussladen_aktiv.sendCommand(OFF)
        }
    }
end

rule "Uberschusslade-Modus verarbeiten und Wallbox sperren oder Direktladen erlauben"
when Item ueberschussladen_aktiv changed to ON
then
	// Laden per se verbieten - das Laden wird dann separat über die Cron-getriggerte Rule gestartet
	GoeCharger_Allow_Charging.sendCommand(OFF)
	GoeCharger_Maximum_Current_Temporary.sendCommand(6)
end

rule "Uberschusslade-Modus verarbeiten und Wallbox sperren oder Direktladen erlauben"
when Item ueberschussladen_aktiv changed to OFF
then
	// Laden per se erlauben - es wird nicht oder mit mehrphasigem Kabel geladen
	GoeCharger_Allow_Charging.sendCommand(ON)
	GoeCharger_Maximum_Current_Temporary.sendCommand(16)
end

openHAB-Rule: Steuern der Ladestärke, Starten und Abbrechen Überschussladen

Alle 5 Sekunden (oder wenn der Überschusslademodus sich ändert sofort) wird geprüft, ob geladen werden soll, gestoppt werden soll oder ob die Stromstärke anzupassen ist.

var boolean log = false
val logPrefix = 'rule_ueberschussladen_ladevorgang'
var Integer ampereAlt
var Integer ampereNeu
var boolean starteLaden
var boolean stoppeLaden
var Number durchschnittsleistungPV
var Number durchschnittsverbrauchSaldierendAnOhneWallbox
var Number durchschnittsverbrauchSaldierendAusOhneWallbox

rule "Durchschnittswert PV ermitteln und Wallbox aktiv steuern"

when 
    // Alle 5 Sekunden prüfen
    Time cron "0/5 * * * * * *" 
    or Item ueberschussladen_aktiv changed
then
    if (log) logInfo(logPrefix, '+++ Prüfen auf PV-Laden')
    if (config_pv_laden_untergrenze.state == NULL) config_pv_laden_untergrenze.sendCommand(400) // Default-Wert setzen
    if ((GoeCharger_Cable_Encoding.state == NULL) || (GoeCharger_Cable_Encoding.state == UNDEF)) {
        if (log) logInfo(logPrefix, '+++ Wallbox (temporär) offline? Abbruch Prüfung, keine Veränderungen wird vorgenommen...')
    } else if (ueberschussladen_aktiv.state == ON) { // Rule nur relevant, wenn automatisches Überschussladen aktiv
        // GoeCharger_Maximum_Current_Temporary: Min 6A, Max 16A. (Da 11kw-Wallbox)
        durchschnittsleistungPV = shellypro3empv_Power.averageSince(now.minusMinutes(1))
        durchschnittsverbrauchSaldierendAnOhneWallbox = strom_saldierend_ohne_wallbox.averageSince(now.minusMinutes(1))
        durchschnittsverbrauchSaldierendAusOhneWallbox = strom_saldierend_ohne_wallbox.averageSince(now.minusMinutes(15))
        // check, ob Laden abgebrochen werden muss. Wir schauen uns hier die durchschnittsverbräuche der letzten 10 Minuten an - ist einer passend, laden wir erst einmal weiter
        stoppeLaden = true
        (1..10).forEach[i|
            if ((strom_saldierend_ohne_wallbox.averageSince(now.minusMinutes(i)) as Number).intValue <  (-1 * (config_pv_laden_untergrenze.state as Number).intValue)) {
                stoppeLaden = false
            }
        ]
        starteLaden = // Bedingungen für Starten von Laden (sofern Überschussladen aktiv)
            ((durchschnittsleistungPV).intValue < -700) // Mindestens 700 Watt per PV iM Durchscnitt
            && ((shellypro3empv_Power.state as Number).intValue < -700) // ... sowie aktuell
            && ((durchschnittsverbrauchSaldierendAnOhneWallbox).intValue < (-1 * (config_pv_laden_untergrenze.state as Number).intValue))  //

        if ((GoeCharger_Power_All.state as Number).intValue > 0) { // es wird aktuell geladen und Überschussladen ist an (zuvor geprüft) - Anpassen Ladeleistung?
            // Saldierender Strom negativ - Überschuss vorhanden? Überschuss modulo 150 Watt erhöhen, max 16 A
            // Saldierender Strom positiv - Netzbezug vorhanden? Überschuss modulo 150 Watt verringern, max auf 6A
            ampereAlt = ((GoeCharger_Maximum_Current.state as Number).intValue)
            ampereNeu = ampereAlt.intValue - ((strom_saldierend.state as Number).intValue / 150).intValue
            if (ampereNeu > 16) ampereNeu = 16
            else if (ampereNeu < 6 ) ampereNeu = 6
            if (ampereAlt != ampereNeu) {
                GoeCharger_Maximum_Current_Temporary.sendCommand(ampereNeu)
                if (log) logInfo(logPrefix, 'Anpassung Wallbox Ladestärke von : ' + ampereAlt.toString + ' zu ' + ampereNeu.toString)
            }
            // Prüfen, ob Laden gestoppt werden soll?
            if (stoppeLaden == true && GoeCharger_Allow_Charging.state == ON && starteLaden == false) {
                GoeCharger_Allow_Charging.sendCommand(OFF)
            }
        } 

        // ansonsten: Prüfen, ob Laden gestartet werden soll?
        if ((GoeCharger_Power_All.state as Number).intValue == 0) { // es wird aktuell geladen
            if (starteLaden && (GoeCharger_Allow_Charging.state == OFF)) {
                GoeCharger_Allow_Charging.sendCommand(ON)
            }
        } 
    } else if (log) logInfo(logPrefix, '+++ Überschussladen nicht aktiv - keine automatische Steuerung. ueberschussladen_aktiv.state=' + ueberschussladen_aktiv.state.toString)
end

Information / Nachtrag: inzwischen sind die Rules etwas angepasst im Einsatz, siehe hierzu auch mein Update aus 04/2024: Kia eNiro – Überschussladen schon ab 550 Watt (openHAB, go-e Charger

5 Antworten auf „„Mini-PV“ mit Überschussladen dank Shelly 3EM pro saldierend, openHAB und go-e charger“

  1. Hallo Florian,
    heute bin ich auf deinen Blog gestoßen und vor allem auf diesen Artikel hier. Einfach unglaublich toll und beeindruckend, wie du deine Arbeit hier „dokumentierst“. Ich bin gerade am Anfang mit OpenHAB und bin schon stolz meine Wallbox von goE und meine PV-Anlage von Fronius einbinden zu können. Dann kommt (nachdem ich seit 3 Tagen stolzer Besitzer eines E-Autos bin) sofort die Frage auf, wie ich die Überschussladung für meine Zwecke nutzen kann. Daher auch die Recherche im Netz und das Finden deines Artikels. ich versuche in den nächsten Tagen deine Vorgehensweise für mich zu nutzen um am Ende auch auf ein so geniales Widget zu kommen. Sieht echt toll aus und hat die Informationen und Funktionen integriert, die für diesen Use-Case nötig sind. Vielen Dank hier für die Inspiration und vor allem DANKE für die Code-Schnipsel. Wenn ich etwas vorzeigbares habe, lass ich es dich wissen. Viele Grüße aus Franken,
    Torsten

    1. Danke, freut mich, wenn das jemand brauchen kann! Es sind zwar alle Setups ein bisschen verschieden, aber oft sind es ja die Denkanstöße uns ein paar Code Schnipsel, die einem dann was bringen…

  2. Hallo Florian,

    Vielen Dank für die tolle Aufbereitung und den Kontext rund um die Anlage. Dank deiner Codes und dem Trick mit dem Kabel habe ich auch meine erste Version zum Überschussladen zum Laufen bekommen. Allerdings gab es Änderungen für die API v2 ein paar Änderungen, sodass man das Konzept in 1:1 übernehmen kann. Dein mitrechnen des Solaranteils und die Darstellung möchte ich noch machen. Das ist eine gute Idee und sehr gut gemacht bei dir.

    Vielen Dank für deine Arbeit.

    Grüße aus dem Norden

      1. Allow_charging kann in der Api v2 nicht mehr gesetzt nur noch gelesen werden. In APi v2 läuft alles über Force_state. Das hat 3 Möglichkeiten 0-auto, 1-off und 2-on. Ich nehme 0 für das erzwungene Laden, also laden mit voller Leistung ohne Rücksicht auf die PV-Leistung. Dann muss man noch ein paar Abfragen machen, dass man nach dem Ladekabel abziehen wieder auf force_state 1 landet.
        Zusätzlich habe ich noch eine Batterie für das Haus. Das braucht auch noch eine extra Abfrage.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Durch die weitere Nutzung der Seite wird der Verwendung von Cookies und den Inhalten der Datenschutzerklärung zugestimmt. Weitere Informationen

Die Cookie-Einstellungen auf dieser Website sind auf "Cookies zulassen" eingestellt, um das beste Surferlebnis zu ermöglichen. Wenn du diese Website ohne Änderung der Cookie-Einstellungen verwendest oder auf "Akzeptieren" klickst, erklärst du sich damit einverstanden.

Schließen