NEWS
Scriptoptimierung Solarprognose
-
Hallo, ich habe folgendes Script welches die PV-Vorhersage von Solarprognose für die nächsten 4 Tage abholt.
const url = 'http://www.solarprognose.de/web/solarprediction/api/v1?_format=json&access-token=xxxxxxxxxxxxxxxxxxxxxx&item=location&id=xxxx&type=hourly'; const path = '0_userdata.0.Solar.'; const idLeistung = path + 'Leistung.'; const idEnergie = path + 'Energie.'; schedule('4 8,10,12,14,16 * * *', function() { httpGet(url, function (error, response) { if(error) log(error, 'error'); else { let obj = JSON.parse(response.data); if(obj.status) log('Fehler: ' + obj.status, 'warn'); else { let data = obj.data; for(let entry in data) { let time = formatDate(parseInt(entry), 'MM-DD.hh:mm'); if(existsState(idLeistung + time)) setState(idLeistung + time, data[entry][0], true); else createState(idLeistung + time, data[entry][0], { type: 'number', role: 'value', name: 'Solarleistung ' + formatDate(parseInt(entry), 'DD.MM. hh:mm'), read: true, write: false, unit: 'kW' }); if(existsState(idEnergie + time)) setState(idEnergie + time, data[entry][1], true); else createState(idEnergie + time, data[entry][1], { type: 'number', role: 'value', name: 'Solarenergie ' + formatDate(parseInt(entry), 'DD.MM. hh:mm'), read: true, write: false, unit: 'kWh' }); } } } }); });
Das funktioniert soweit auch super, allerdings wird für jeden Tag ein neuer Ordner unter 'Energie' und 'Leistung' angelegt, und die in der Vergangenheit werden nicht automatisch gelöscht.
Dies führt dazu das ich am Ende des Monats die Ordner immer von Hand löschen muß, damit das nicht unendlich viele werden.Ordnerstruktur:
Leider weiß ich nicht mehr wer der Ersteller des Script ist, sonst hätte ich mich direkt an den gewandt. Vielleicht kann ja hier einer eine Anpassung vornehmen, das die Ordner in der Vergangenheit automatisch gelöscht werden. (Also alles was älter als heute ist.)
Weiterhin wäre es Super wenn einer eine Idee hätte wie man aus der Struktur für 'Heute' und 'Morgen' den höchsten Ertrag und die Uhrzeit ermitteln kann (gern auch als Blockly)
-
@icebear sagte in Scriptoptimierung Solarprognose:
Leider weiß ich nicht mehr wer der Ersteller des Script ist, sonst hätte ich mich direkt an den gewandt. Vielleicht kann ja hier einer eine Anpassung vornehmen, das die Ordner in der Vergangenheit automatisch gelöscht werden. (Also alles was älter als heute ist.)
na ja eigentlich ist das was da gemacht wird mumpitz... eine historie legt man über entsprechendes adapter (influx oder history oder oder)
und nicht über Datenpunkte.... -
@arteck said in Scriptoptimierung Solarprognose:
na ja eigentlich ist das was da gemacht wird mumpitz... eine historie legt man über entsprechendes adapter (influx oder history oder oder)
und nicht über Datenpunkte....Da bin ich ja ganz bei dir, nur leider fehlt mir die Kenntnis, um das anzupassen. Mich interessieren eigentlich nur die Ordner, die die Werte für 'Heute' und die nächsten drei Tage enthalten.
-
kommst du damit besser klar
const url = 'http://www.solarprognose.de/web/solarprediction/api/v1?_format=json&access-token=xxxxxxxxxxxxxxxxxxxxxx&item=location&id=xxxx&type=hourly'; const path = '0_userdata.0.Solar2'; schedule('4 8,10,12,14,16 * * *', function() { abfrage(); }); function abfrage() { httpGet(url, function (error, response) { if (error) { log(error, 'error'); } else { let obj = JSON.parse(response.data); dpCreate('', obj.data, 'string'); dpFill(obj); } }); } function dpFill(obj) { if (obj.status) { log('Fehler: ' + obj.status, 'warn'); } else { let data = obj.data; const outArray = formatAndSplitData(data); dpCreate('.heute', outArray.heute); dpCreate('.morgen', outArray.morgen); dpCreate('.uebermorgen', outArray.uebermorgen); } } function formatAndSplitData(data) { const SECONDS_IN_A_DAY = 86400; const MS_IN_A_SECOND = 1000; const now = new Date(); const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime(); const tomorrowStart = todayStart + SECONDS_IN_A_DAY * MS_IN_A_SECOND; const dayAfterTomorrowStart = tomorrowStart + SECONDS_IN_A_DAY * MS_IN_A_SECOND; const result = { heute: [], morgen: [], uebermorgen: [] }; for (const [timestamp, values] of Object.entries(data)) { const ts = Number(timestamp) * MS_IN_A_SECOND; // Convert timestamp to milliseconds const date = new Date(ts); const formattedTime = date.toLocaleTimeString("de-DE", { hour: "2-digit", minute: "2-digit" }); // Format as "hh:mm" const entry = [formattedTime, ...values]; if (ts >= todayStart && ts < tomorrowStart) { result.heute.push(entry); } else if (ts >= tomorrowStart && ts < dayAfterTomorrowStart) { result.morgen.push(entry); } else if (ts >= dayAfterTomorrowStart) { result.uebermorgen.push(entry); } } return result; } function dpCreate(text, data, typ) { createState(path + text + '.Json', [], false, { name: 'json' + text, type: typ == "string" ? typ : 'array', role: 'json', read: true, write: false }); setTimeout(function () { setState(path + text + '.Json', data, true); }, 600); }
der genereirt nur arrays für heute morgen und übermorgen
die kannst du dann im blockly weiterverarbeiten
-
@arteck said in Scriptoptimierung Solarprognose:
kommst du damit besser klar
Ersteinmal vielen Dank für deine Hilfe, soweit klappt das schonmal und er hat die JSON in die DP abgelegt.
Jetzt muß ich mal schauen wie ich die mit Blockly so verarbeite das er mir die höchsten Werte und die Uhrzeit in ein DP schreibt.
-
@icebear sagte in Scriptoptimierung Solarprognose:
er hat die JSON in die DP abgelegt.
wie sieht denn das JSON aus?
-
@homoran said in Scriptoptimierung Solarprognose:
wie sieht denn das JSON aus?
[["06:00",[0,0]],["07:00",[1.077,1.077]],["08:00",[2.167,3.244]],["09:00",[3.308,6.552]],["10:00",[4.04,10.592]],["11:00",[4.29,14.882]],["12:00",[3.934,18.816]],["13:00",[2.361,21.177]],["14:00",[1.77,22.947]],["15:00",[0,22.947]]]
Also Uhrzeit dann Leistung und Energie.
Also müsste ich ein Blockly haben was mir dann aus der JSON zwei Werte in DP schreibt, hier von heute:
DP Uhrzeit 12:00
DP Leistung 3.934 -
-
@icebear sagte: DP Uhrzeit 12:00
DP Leistung 3.934Das Leistungs-Maximum ist um 11:00 Uhr.
EDIT: Da die Datenpunkte offenbar vom Typ "array" sind, muss man die Wandlung weglassen, da es der Javascript-Adapter macht.
-
@arteck said in Scriptoptimierung Solarprognose:
kommst du damit besser klar
Soweit funktioniert das Script, allerdings ist mir aufgefallen, das anscheinend in das JSON 'Z-Zeiten' eingetragen werden.
Da, wenn man mal reinschaut die Zeiten mit den höchsten Erträgen um zwei Stunden nach vorne verschoben sind.Ich denke nicht das um 11:00L Uhr der höchste Ertrag zu erwarten ist.
[["06:00",[0,0]],["07:00",[0.435,0.435]],["08:00",[1.472,1.907]],["09:00",[2.19,4.097]],["10:00",[2.819,6.916]],["11:00",[3.486,10.402]],["12:00",[3.202,13.604]],["13:00",[2.175,15.779]],["14:00",[0.953,16.732]],["15:00",[0,16.732]]]
-
@icebear jetzt wo du es sagst... ziehmal das script nochmal
ich hab aber auch die ausgabe geändert .. so kann man es direkt im JSON Table widget nutzen
[["07:00",0,0],["08:00",0.291,0.291],["09:00",1.333,1.624],["10:00",2.62,4.244],["11:00",3.213,7.457],["12:00",3.677,11.134],["13:00",3.686,14.82],["14:00",3.247,18.067],["15:00",1.353,19.42],["16:00",0,19.42]]
-
@arteck sagte: die ausgabe geändert
Damit vereinfacht sich auch das Blockly zur Ermittlung des Leistungsmaximums.
-
-
@arteck sagte in Scriptoptimierung Solarprognose:
kommst du damit besser klar
Ich habe das Skript mal hier implementiert, bekomme aber für
uebermorgen
keine Ergebnisse, obwohl ich heute beisolarprognose.de
die Prognose von 2 auf 3 Tage erhöht habe.Hast Du eine Idee, woran das liegen könnte, und was hast Du da eingetragen?
-
@meister-mopper ich weiss nicht wann die die Daten für welchen Tag zur verfügung stellen..
-
Ich glaub du mußt auch nochmal nach dem Script schauen, weil ich bei 'übermorgen' drei Tage im JSON drin stehen hab.
[["08:00",0,0],["09:00",0.237,0.237],["10:00",2.297,2.534],["11:00",2.928,5.462],["12:00",1.611,7.073],["13:00",1.399,8.472],["14:00",2.316,10.788],["15:00",0.543,11.331],["16:00",0,11.331],["07:00",0,0],["08:00",0.004,0.004],["09:00",0.157,0.161],["10:00",0.443,0.604],["11:00",0.641,1.245],["12:00",0.731,1.976],["13:00",0.726,2.702],["14:00",0.65,3.352],["15:00",0.429,3.781],["16:00",0,3.781],["08:00",0,0],["09:00",0.144,0.144],["10:00",0.443,0.587],["11:00",0.614,1.201],["12:00",0.702,1.903],["13:00",0.699,2.602],["14:00",0.59,3.192],["15:00",0.396,3.588],["16:00",0,3.588]]
Ist mir erst gar nicht aufgefallen.
-
@icebear poste mal den JSON aus dem Hauptordner
-
@arteck said in Scriptoptimierung Solarprognose:
poste mal den JSON aus dem Hauptordner
{"1733468400":[0,0],"1733472000":[0.144,0.144],"1733475600":[0.443,0.587],"1733479200":[0.668,1.255],"1733482800":[0.702,1.957],"1733486400":[0.753,2.71],"1733490000":[0.63,3.34],"1733493600":[0.56,3.9],"1733497200":[0,3.9],"1733551200":[0,0],"1733554800":[0.144,0.144],"1733558400":[0.21,0.354],"1733562000":[0.443,0.797],"1733565600":[0.614,1.411],"1733569200":[1.962,3.373],"1733572800":[1.775,5.148],"1733576400":[0.951,6.099],"1733580000":[1.068,7.167],"1733583600":[0,7.167],"1733637600":[0,0],"1733641200":[0.048,0.048],"1733644800":[0.157,0.205],"1733648400":[0.506,0.711],"1733652000":[3.037,3.748],"1733655600":[3.281,7.029],"1733659200":[2.798,9.827],"1733662800":[2.275,12.102],"1733666400":[1.092,13.194],"1733670000":[0,13.194],"1733727600":[0,0],"1733731200":[0.144,0.144],"1733734800":[0.443,0.587],"1733738400":[0.641,1.228],"1733742000":[0.761,1.989],"1733745600":[0.78,2.769],"1733749200":[0.65,3.419],"1733752800":[0.421,3.84],"1733756400":[0,3.84],"1733814000":[0,0],"1733817600":[0.144,0.144],"1733821200":[0.443,0.587],"1733824800":[0.614,1.201],"1733828400":[0.702,1.903],"1733832000":[0.699,2.602],"1733835600":[0.59,3.192],"1733839200":[0.396,3.588],"1733842800":[0,3.588]}