So ich habe mich mal hingesetzt und anhand des PV Forecast Adapters und dem "Das Wetter" Adapter ein Javascript geschrieben, daß anhand der Bewölkung die PV Forecast optimiert. Bei 100% Bewölkung habe ich einen Korrekturfaktor von 0.2 angenommen.
Da ich bei mir viel mit Nebel zu kämpfen habe liegen die PV Vorhersage Adapter alle weit weit weg vom eigentlichen Ertrag, heute wurden 10 vorausgesagt aktuell sind wir bei 2.5, gestern waren es laut voraussage 15 das optimierte kam auf 10.4, reell waren es 10,2. Vielleicht kann es ja irgendjemand brauchen, es werden nur 2 Werte generiert, Summe today und summe tomorrow.
const minOutputFactor = 0.2; // Mindestprozentsatz an Leistung bei 100% Wolkenbedeckung
// Funktion zur Erstellung von Datenpunkten, falls sie noch nicht existieren
function createStateIfNotExists(id, initialValue, callback) {
if (!existsState(id)) {
createState(id, initialValue, { type: 'number', unit: 'kWh', read: true, write: true }, callback);
} else {
callback();
}
}
// Funktion zur Berechnung und Anpassung der PV-Forecasts basierend auf Wolkenbedeckungswerten
function calculatePvForecast() {
try {
console.log('--- Sofortige Berechnung der PV Forecasts beim Skriptstart ---');
let totalAdjustedPvToday = 0;
let totalAdjustedPvTomorrow = 0;
// Berechnung für heute (Stunden 5 bis 21)
for (let hour = 5; hour <= 21; hour++) {
const hourString = hour.toString().padStart(2, '0');
const pvForecastToday = getState(`pvforecast.0.summary.energy.hoursToday.${hourString}:00:00`).val;
const cloudsToday = getState(`daswetter.0.NextHours.Location_1.Day_1.Hour_${hour}.clouds_value`).val;
const adjustedPvToday = (pvForecastToday * Math.max(minOutputFactor, (1 - cloudsToday / 100))).toFixed(2);
totalAdjustedPvToday += parseFloat(adjustedPvToday);
console.log(`Heute, Stunde ${hour}: Wolkenbedeckung = ${cloudsToday}%, Originaler PV-Wert = ${pvForecastToday} kWh, Angepasster PV-Wert = ${adjustedPvToday} kWh`);
}
// Speicherung des Gesamtwertes für heute
createStateIfNotExists("0_userdata.0.PV-Forecast-optimiert.Heute_Gesamt", 0, () => {
setState(`0_userdata.0.PV-Forecast-optimiert.Heute_Gesamt`, parseFloat(totalAdjustedPvToday.toFixed(2)));
console.log(`Gesamter angepasster PV-Wert für heute: ${totalAdjustedPvToday.toFixed(2)} kWh`);
});
// Berechnung für morgen (Stunden 5 bis 21)
for (let hour = 5; hour <= 21; hour++) {
const hourString = hour.toString().padStart(2, '0');
const pvForecastTomorrow = getState(`pvforecast.0.summary.energy.hoursTomorrow.${hourString}:00:00`).val;
const cloudsTomorrow = getState(`daswetter.0.NextHours.Location_1.Day_2.Hour_${hour}.clouds_value`).val;
const adjustedPvTomorrow = (pvForecastTomorrow * Math.max(minOutputFactor, (1 - cloudsTomorrow / 100))).toFixed(2);
totalAdjustedPvTomorrow += parseFloat(adjustedPvTomorrow);
console.log(`Morgen, Stunde ${hour}: Wolkenbedeckung = ${cloudsTomorrow}%, Originaler PV-Wert = ${pvForecastTomorrow} kWh, Angepasster PV-Wert = ${adjustedPvTomorrow} kWh`);
}
// Speicherung des Gesamtwertes für morgen
createStateIfNotExists("0_userdata.0.PV-Forecast-optimiert.Morgen_Gesamt", 0, () => {
setState(`0_userdata.0.PV-Forecast-optimiert.Morgen_Gesamt`, parseFloat(totalAdjustedPvTomorrow.toFixed(2)));
console.log(`Gesamter angepasster PV-Wert für morgen: ${totalAdjustedPvTomorrow.toFixed(2)} kWh`);
});
} catch (error) {
console.warn(`Fehler in der calculatePvForecast-Funktion: ${error.message}`);
console.warn(error.stack);
}
}
// Sofortige Ausführung der Berechnung beim Start des Skripts
calculatePvForecast();
// Geplante Ausführungen zur Aktualisierung der PV-Forecasts
schedule("5 0 * * *", calculatePvForecast); // Tägliche Ausführung um 0:05 Uhr
schedule("5 5 * * *", calculatePvForecast); // Tägliche Ausführung um 5:05 Uhr
schedule("5 12 * * *", calculatePvForecast); // Tägliche Ausführung um 12:05 Uhr