Ansonsten gibt es auch noch ein Script, welches die Wolkenbedeckung mit berücksichtigt. Leider finde ich gerade den passenden Beitrag dazu nicht. Dazu ist der Adapter "daswetter" nötig.
Das Script gibt zwei Werte aus:

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: 'Wh', 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} Wh, Angepasster PV-Wert = ${adjustedPvToday} Wh`);
}
// 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)} Wh`);
});
// 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} Wh`);
}
// 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)} Wh`);
});
} 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