Dit vind ik wel een leuk script. Misschien kunnen jullie dit ook gebruiken.
Het bepaalt het voorspelde zonnige minuten op basis van de actuele weersverwachting op jouw locatie. Vul bij lat en lon de coordinaten in van je huis bij AAA en BBB.
// Controleer of er zonneschijninformatie beschikbaar is
if (!data.hourly || !data.hourly.sunshine_duration) {
throw new Error("Geen zonneschijninformatie beschikbaar.");
}
const sunshineDuration = data.hourly.sunshine_duration;
const timeStamps = data.hourly.time;
// Controleer of de waarden in seconden zijn (meer dan 60)
const isInSeconds = sunshineDuration.some(duration => duration > 60);
const conversionFactor = isInSeconds ? 60 : 1;
// Bepaal de huidige tijd en de index voor de komende 3 uur
const now = new Date();
const currentHourIndex = timeStamps.findIndex(time => new Date(time).getHours() === now.getHours());
if (currentHourIndex === -1 || currentHourIndex + 3 >= sunshineDuration.length) {
throw new Error("Onvoldoende gegevens voor de komende 3 uur.");
}
// Bereken de verwachte zonneschijnduur voor de komende 3 uur
let expectedSunshineMinutes = 0;
for (let i = currentHourIndex; i < currentHourIndex + 3; i++) {
expectedSunshineMinutes += sunshineDuration[i] / conversionFactor;
}
expectedSunshineMinutes = Math.ceil(expectedSunshineMinutes)
console.log("Verwachte zonneschijnduur voor de komende 3 uur:", expectedSunshineMinutes, "minuten.");
return expectedSunshineMinutes;
}
async function updateExpectedSunshineVariable() {
const expectedSunshineMinutes = await calculateExpectedSunshineForNextThreeHours();
// Haal alle logica variabelen op
const variables = await Homey.logic.getVariables();
// Zoek naar de variabele met de naam "ExpectedSunshineMinutes"
const expectedSunshineVariable = Object.values(variables).find(variable => variable.name === 'ExpectedSunshineMinutes');
// Update de variabele als deze gevonden is
if (expectedSunshineVariable) {
await Homey.logic.updateVariable({
id: expectedSunshineVariable.id,
variable: {
value: expectedSunshineMinutes
}
});
console.log("Variabele 'ExpectedSunshineMinutes' bijgewerkt.");
} else {
console.error("Variabele 'ExpectedSunshineMinutes' niet gevonden.");
}
}
// Roep de functie aan om de variabele bij te werken
updateExpectedSunshineVariable().catch(console.error);
Oh jaa… het aantal calls dat je per dag gratis kunt doen is 300. Ik denk dat je boven 300 calls geen antwoord meer krijgt tenzij je betaald… Heb er zelf een tellertje bij gezet en vraag elke 15 minuten een voorspelling.
SyntaxError: missing ) after argument list
at new Script (node:vm:99:7)
at HomeyScriptApp.runScript (/app/app.js:352:23)
at Object.runScript (/app/api.js:30:38)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Gebruik dit als Lat Lon:
52.02458313329773
5.189171786330936
He dit is leuk, snap er allemaal niets van maar krijg na knippen en plakken het onderstaande resultaat,
Wat gaat er nog mis?
Script Success Returned: undefined
TypeError: Only absolute URLs are supported
at getNodeRequestOptions (/app/node_modules/node-fetch/lib/index.js:1327:9)
at /app/node_modules/node-fetch/lib/index.js:1450:19
at new Promise ()
at fetch (/app/node_modules/node-fetch/lib/index.js:1447:9)
at calculateExpectedSunshineForNextThreeHours (mijn-script.js:5:24)
at updateExpectedSunshineVariable (mijn-script.js:44:39)
at mijn-script.js:70:1
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Verder krijg ik in de return enkel maar undefined terug, ook als ik de constante vervang door true. Iemand een idee?
(Als je het script te snel na elkaar test, krijg je soms een 500 error van open-meteo. Paar minuten wachten en dan werkt het weer )
code:
async function calculateExpectedSunshineForNextThreeHours() {
const latitude = 53.1234567;
const longitude = 4.1234567;
// MAX 300 calls per dag
const response = await fetch(`https://api.open-meteo.com/v1/forecast?latitude=${latitude}&longitude=${longitude}&hourly=sunshine_duration`);
//
const data = await response.json();
// Controleer of er zonneschijninformatie beschikbaar is
if (!data.hourly || !data.hourly.sunshine_duration) {
throw new Error("Geen zonneschijninformatie beschikbaar \nconst latitude = " + latitude
+ "\nconst longitude = " + longitude
+ "\nconst response = " + response + "\nconst data = " + data);
}
const sunshineDuration = data.hourly.sunshine_duration;
const timeStamps = data.hourly.time;
// Controleer of de waarden in seconden zijn (meer dan 60)
const isInSeconds = sunshineDuration.some(duration => duration > 60);
const conversionFactor = isInSeconds ? 60 : 1;
// Bepaal de huidige tijd en de index voor de komende 3 uur
const now = new Date();
const currentHourIndex = timeStamps.findIndex(time => new Date(time).getHours() === now.getHours());
if (currentHourIndex === -1 || currentHourIndex + 3 >= sunshineDuration.length) {
throw new Error("Onvoldoende gegevens voor de komende 3 uur.");
}
// Bereken de verwachte zonneschijnduur voor de komende 3 uur
let expectedSunshineMinutes = 0;
for (let i = currentHourIndex; i < currentHourIndex + 3; i++) {
expectedSunshineMinutes += sunshineDuration[i] / conversionFactor;
}
expectedSunshineMinutes = Math.ceil(expectedSunshineMinutes)
console.log("Verwachte zonneschijnduur voor de komende 3 uur:", expectedSunshineMinutes + " minuten."); // er moest nog een + tussen
return expectedSunshineMinutes;
}
async function updateExpectedSunshineVariable() {
const expectedSunshineMinutes = await calculateExpectedSunshineForNextThreeHours();
// Haal alle logica variabelen op
const variables = await Homey.logic.getVariables();
// Zoek naar de variabele met de naam "ExpectedSunshineMinutes"
const expectedSunshineVariable = Object.values(variables).find(variable => variable.name === 'ExpectedSunshineMinutes');
// Update de variabele als deze gevonden is
if (expectedSunshineVariable) {
await Homey.logic.updateVariable({
id: expectedSunshineVariable.id,
variable: {
value: expectedSunshineMinutes
}
});
console.log("Variabele 'ExpectedSunshineMinutes' = bijgewerkt.");
} else {
console.error("Variabele 'ExpectedSunshineMinutes' niet gevonden.");
}
}
// Roep de functie aan om de variabele bij te werken
updateExpectedSunshineVariable().catch(console.error);
Ben benieuwd wat er overdag uit rolt aan zon uren voorspelling!
Hoi, ik had mijn lat long even weg gehaald omdat ik nogal op mijn privacy ben gesteld…
Maar de volgende url doet het gewoon en heeft meer dan 4 decimalen. Dus wel een vreemd…