Guten Morgen towiat ,
ich habe die Änderung gestern Abend noch eingespielt und für 7 Uhr eine Wertänderung vorgesehen. Diese wurde heute früh auch umgesetzt. Ebenso verliefen zwei weitere Tests nun erfolgreich. Vielen Dank Dir! Das Skript funktioniert nun so wie ich es mir erhofft habe. Ist natürlich weit von richtiger Nulleinspeisung entfernt, erfüllt aber bei den bekannten Lastgängen absolut seinen Zweck und ermöglicht eine bessere Ausnutzung der Wechselrichterleistung ohne einzuspeisen.
Viele Grüße und Danke. Ich hänge unten das Skript noch einmal vollständig mit ein paar Ergänzungen für diejenigen, die es ggf. ebenfalls gebrauchen können, an.
Code
// Shelly kompaktibles Skript für Pro EM Geräte zur Anpassung von Wechselrichter Limits von in openDTU hinterlegten Mikrowechselrichtern wie Hoymiles.
// Idee ist bei bekannten Lastgängen die Leistung der Wechselrichter besser auszunutzen ohne nach Lastabfall einzuspeisen, wenn mehr Wechselrichterleistung als Verbraucherlast vorliegt.
// Wertänderung erfolgt zu fest vorgegebenen Uhrzeiten Absolut in Watt. Für Relative Limitierung in % sind Anpassungen nötig.
// Skript anhand openDTU Dokumentation, Shelly Dokumentation und Shelly-Forum User `towiat`erstellt.
// Skript läuft out of the Box wenn in Eingangskofiguration benötigte Werte korrekt eingetragen sind.
// Nutzung auf eigenes Risiko!
// Eingangskonfiguration
let url = "http://IPADRESSE/api/limit/config"; // IP Adresse der openDTU im eigenen Heimnetz ersetzen
let serial = "SERIENNUMMER"; // Seriennummer des betroffenen Wechselrichters
let username = "admin"; // Username per Default "admin". Keine Änderung nötig!
let password = "PASSWORT"; // Passwort für openDTU Login.
// Funktion zum Senden der Limitwerte per HTTP POST
function sendLimit(limit_value) {
let payload = {
serial: serial,
limit_type: 0, // 0 für Absolutwert in Watt, 1 für Relativwert in %. Bei Änderung zu Relativwert muss Valuewert weiter unten geändert werden!
limit_value: limit_value,
};
Shelly.call(
"HTTP.Request",
{
method: "POST",
url: url,
body: "data=" + JSON.stringify(payload),
headers: {
Authorization: "Basic " + btoa(username + ":" + password),
"Content-Type": "application/x-www-form-urlencoded",
},
},
function (res, errc, errm) {
if (errc !== 0) {
print("Shelly Fehler", errc, errm);
} else if (res.code !== 200) {
print("OpenDTU Fehler", res.code, res.message);
} else {
print("Limit erfolgreich geändert!");
}
},
);
}
// Liste der gewünschten Zeiten (Stunde, Minute) und Limit-Werte.
// Für Relativwerte muss Value zwischen 0% und 100% gesetzt werden!
let schedule = [
{ hour: 8, minute: 0, value: 600},
{ hour: 10, minute: 0, value: 800},
{ hour: 14, minute: 15, value: 600},
];
// Funktion zur Ermittlung der aktuellen Uhrzeit. Prüfung erfolgt jede Minute.
Timer.set(60000, true, function () {
let now = new Date();
let h = now.getHours();
let m = now.getMinutes();
for (let i = 0; i < schedule.length; i++) {
if (h === schedule[i].hour && m === schedule[i].minute) {
sendLimit(schedule[i].value);
break;
}
}
});
Alles anzeigen