Ebene 1 - Flexibilität und Speicher

In dieser Ebene werden alle Komponenten eingebunden, die für das Energiesystem eine Flexibilität darstellen. Dies können entweder verschiebbare Lasten oder ein vorhandener Stromspeicher sein.

Erzeugung und Verbrauch

ebene1_erzeugung_verbrauch.png

Erzeugung

Bei der Referenzimplementierung von Casa Corrently existiert kein flexibler Erzeuger. Die Erzeugung ist ausschließlich Photovoltaik und somit vom Sonnenschein abhängig.  An dieser Stelle können jedoch flexible Erzeuger wie ein BHK aufgenommen werden, dazu ist analog zur Einbindung der Erzeugung in Ebene 0 vorzugehen.

Die Entladung des Speichers wird, wegen des gewählten Betriebsmodus des Speichers, erst im Saldo / Bilanzierung berücksichtigt. 

Funktion Wirkleistung

msg.payload = Math.round(msg.payload.power_mw / 1000);
node.status({text:"P: "+msg.payload+" W"});
const subSUM='Consumption';

let sum = flow.get(subSUM) * 1;
if(isNaN(sum)) sum = 0;

let previous = context.get("previous") * 1;
if(isNaN(previous)) previous = 0;

if(flow.get("SaldoID") != context.get("SaldoID")) {
    context.set("SaldoID",flow.get("SaldoID"));
} else {
    sum -= previous;
}
sum += msg.payload;

context.set("previous",msg.payload);
flow.set(subSUM,sum);

return msg;
Verbrauch

Flexible Verbräuche sind Geräte, bei denen entweder der Betriebszustand geschaltet werden kann (An/Aus) oder die Wirkleistung (Watt) begrenzt wird. 

Innerhalb der Referenzimpelementierung wird hier ein TP-Link HS110 Smart-Plug als Beispiel für ein schaltbares Gerät verwendet. An der so geschalteten Steckdose hängt ein E-Scooter, der lediglich mit überschüssigem Strom geladen werden soll.  Mit Flexon wird ein Inbound-Webhook definiert, der den SmartPlug schalten kann. Ausgelöst (gesendet) wird der Webhook hier von einem Alert im Grafana Dashboard. Selbstverständlich hätte man dieses Ziel auch direkt aus den Werten der Ebene 2 erreichen können oder zusätzliche Bedingungen/Priorisierungen mit einer anderen Flexibilität vornehmen können.

Die Wallbox ,zur Steuerung der KFZ-Ladung, hat ein eingebautes Management für die Ladung mit Überschussstrom. Zur Saldenbildung wird von der Ladeeinrichtung daher lediglich die momentane Leistung via MQTT abgerufen.

 

Bilanzierung / Saldo

ebene1_saldo.png

Bei der Referenzimplementierung kommt ein Speicher zum Einsatz, welcher im Betriebsmodus "Null-Auspegelung am Netzanschlusspunkt"  betrieben wird. Dieser Modus hat den Vorteil, dass die Eigenoptimierung des Speichers vollständig erhalten bleibt und als abgeschlossenes System betrachtet werden kann.

Eine Saldierung muss damit nicht durch die Ebene vorgenommen werden, sondern kann aus den Speicherdaten ausgelesen werden.

Funktion SoC kWh Umrechnen 

msg.payload = Math.round(5500 * (msg.payload/100));
flow.set('Saldo',msg.payload);
node.status({text:"P: "+msg.payload+" W"});
return msg;

Die Flexibilitäten werden als Kapazität (regelbares/steuerbare Stromnutzung) als e1flex gespeichert. Hierbei ist zu beachten, dass der Speicher maximal mit 2.000 Watt beladen oder entladen werden kann.

Funktion Kapazität

if(msg.payload > 2000) msg.payload = 2000;
msg.payload += flow.get('Consumption') + global.get('FlexConsumption');
node.status({text:"P: "+msg.payload+" W"});
return msg;

 

Vorhersage / Prognose

ebene1_vorhersage.png

Die Vorhersage in Ebene 1 erfolgt durch Fortschreibung der Prognose in Ebene 0. Basierend auf den Ebene 0 Werten, wird der Speicherfüllstand vorhergesagt und die flexiblen Lasten ergänzt. 

Funktion Vorhersage SoC und Flex Integration

let saldo = flow.get("Saldo") - flow.get("Consumption");
let options = global.get("FlexOptions");

for(let i=0; i<msg.payload.length;i++) {
    msg.payload[i].measurement = "e1forecastSaldo";
    let w = (-1) * msg.payload[i].fields.w;
    let flex = 0;
    
    if(i<24) {
        for(let j=0;j<options.length;j++) {
             w -= options[j][i];
             flex += options[j][i];
        }        
    }
    
    
    if(w > 2000) w = 2000;
    if(w < -2000) w = -2000;
    
    if(saldo + w > 5500) w = 5500-saldo;
    if(saldo + w < 0) w = saldo;
    
    saldo += w;
    
    msg.payload[i].fields.w -= w;
    msg.payload[i].fields.flex = flex;
    msg.payload[i].fields.wh = saldo;

}

flow.set("forecastSaldo",msg.payload);
node.status({text:""+new Date().toLocaleString()});
return msg;

Optionen für Flexibilitäten werden im globalen Array FlexOptions gehalten (Zeile 2). Dort gespeichert werden sie durch das individuelle Fahrplanmanagement zum Gerät. Diese einzelnen Vorhersagen werden vor der Berücksichtigung des Speichers integriert (Zeile 9-14).

Eine Besonderheit hier ist, dass der Speicher der Referenzimplementierung maximal mit 2.000 beladen und entladen werden kann. Entsprechend kann der Speicherfüllstand innerhalb von einer Stunde maximal um +/- 2 kWh verändert werden (Zeile 17-18).

GrünstromIndex

ebene1_gsi.png

Basierend auf dem prognostizierten Saldo der Ebene wird ein GrünstromIndex gebildet und zur Visualisierung mittels Grafana in die InfluxDB gespeichert.

Vergleiche: GrünstromIndex je Ebene

Funktion Ebenen GSI

let saldo = flow.get("forecastSaldo");
let min = 9999999999;
let max = -999999999999;

for(let i=0; i<saldo.length;i++) {
    saldo[i].measurement = "e1gsi";
    if(saldo[i].fields.w > max) max = saldo[i].fields.w ;
    if(saldo[i].fields.w < min) min = saldo[i].fields.w ;
}

let delta = max - min;

for(let i=0; i<saldo.length;i++) {
    saldo[i].fields.gsi = 100-Math.round(((saldo[i].fields.w  - min) / delta)*100); 
}


flow.set("gsi",saldo);
msg.payload = saldo;
global.set("e1gsi",saldo);
return msg;

ebene1_gsi_grafana.png

Je nach tatsächlichen Vorhandenen Flexibililtäten unterscheidet sich der GrünstromIndex der Ebene 0 und der Ebene 1 nur minimal. Wird, wie bei der Referenzimplementierung, kommt bei der Erzeugung lediglich Photovoltaik zum Einsatz, dann existieren gerade in den Wintermonaten nur wenige Abweichungen.