Verwachtte zonnige minuten obv weersvoorspelling op jouw locatie

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.

async function calculateExpectedSunshineForNextThreeHours() {
const latitude = AAA;
const longitude = BBB;
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.");
}

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);

3 Likes

Ga ik zéker eens proberen!

Kun je i.p.v. gedeeltes, even het hele script tussen
```

```

zetten?
Dat leest wat makkelijker, en het is makkelijker te kopiëren.
Thx!

Done! Veel plezier ermee. Ik moet zelf nog wat ervaring opbouwen met hoe goed voorspellingen zijn en hoeveel zonminuten je echt krijgt.

In combinatie met een gunstige voorspelling kan ik nu mijn vaatwasser aan laten als ik EN stroom heb EN de voorspellingen gunstig zijn…

2 Likes

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.

1 Like

Ik ben heel benieuwd, krijg nu nog even deze error:

———————————————————
:x: Script Error
:warning: Verwachte zonuren.js:4
const response = await fetch(https://api.open-meteo.com/v1/forecast?latitude=${latitude}&longitude=${longitude}&hourly=sunshine_duration);
^^^^^

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

const response = await fetch(‘https://api.open-meteo.com/v1/forecast?latitude=${latitude}&longitude=${longitude}&hourly=sunshine_duration’ );

Er missen ‘ begin en einde url

1 Like

Ach. Die zijn er bij. het posten ‘vanaf gevallen’. Zal ze in mijn post toevoegen!

1 Like

Verder lijkt het er op dat niet alle long / lat gebieden een rsultaat geven.


✅ Script Success
↩️ Returned: undefined
Error: Geen zonneschijninformatie beschikbaar.
    at calculateExpectedSunshineForNextThreeHours (verwachting zon.js:9:11)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async updateExpectedSunshineVariable (verwachting zon.js:40:33)

Correctie, hardcoded in de url werkt wel, wellicht niet meer dan 2 decimalen

He dit is leuk, snap er allemaal niets van maar krijg na knippen en plakken het onderstaande resultaat,

Wat gaat er nog mis?

:white_check_mark: Script Success
:leftwards_arrow_with_hook: 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)

Variabele gemaakt in Homey?

ExpectedSunshineMinutes

Script hieronder werkt nu, en wel op een Pro 2019 mocht dat van invloed zijn.

Bij de fetch dienen backticks `` gebruikt te worden, ontdekte ik ‘al klooiend’ :stuck_out_tongue:

fetch(`https://api.open-meteo.com/v1/forecast?latitude=${latitude}&longitude=${longitude}&hourly=sunshine_duration`);


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 :wink: )

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);

Screenshot from 2024-06-09 23-29-43

Ben benieuwd wat er overdag uit rolt aan zon uren voorspelling!

bedankt voor de hulp.
het werkt nu,
Maar nog steeds geen zon :roll_eyes:

:white_check_mark: Script Success

:leftwards_arrow_with_hook: Returned: undefined

Verwachte zonneschijnduur voor de komende 3 uur: 0 minuten.

Variabele ‘ExpectedSunshineMinutes’ = bijgewerkt.

En er is ook zon :slight_smile:

——————————————————— :white_check_mark: Script Success

:leftwards_arrow_with_hook: Returned: undefined

Verwachte zonneschijnduur voor de komende 3 uur: 83 minuten.

Variabele ‘ExpectedSunshineMinutes’ = bijgewerkt.

Heeft Meteo API ook toevallig de historische neerslag in MM per uur of per dag? Dan kan ik mijn beregeningsflow vast klaar maken als de zomer komt…

1 Like

Hehe eindelijk zon en niet zo weinig ook :blush:

——————————————————— :white_check_mark: Script Success

:leftwards_arrow_with_hook: Returned: undefined

Verwachte zonneschijnduur voor de komende 3 uur: 89 minuten.

Variabele ‘ExpectedSunshineMinutes’ = bijgewerkt.

Ha! Wat goed! (Sorry voor de ‘verkeerde’ quotes en het weglaten van een stukje uitleg… )
Hopelijk brengt het je wat :slight_smile:

Hoi, ik had mijn lat long even weg gehaald omdat ik nogal op mijn privacy ben gesteld… :grin:
Maar de volgende url doet het gewoon en heeft meer dan 4 decimalen. Dus wel een vreemd…

https://api.open-meteo.com/v1/forecast?latitude=52.850410&longitude=6.611040&hourly=sunshine_duration

Yep… die is er ook : https://open-meteo.com/en/docs/historical-weather-api

Ok ik ga wel even kijken als ik er meer tijd voor heb. :+1:

Dankjewel voor die API link naar Meteo. Ik heb die API geprobeerd om regen neerslag te meten, vond de volumes erg laag qua MM regen:

Bijvoorbeeld de 21e was een erg natte dag, 23 MM bij KNMI en 1 MM bij Metro

De lichtblauwe balkjes zijn METEO en de andere is KNMI De Bilt, ligt naast Houten

Suggesties hoe ik dit van KNMI kan aanroepen, gaarne :slight_smile:

KNMI
//“https://weerlive.nl/api/json-data-10min.php?key=caxxxxxbbc&locatie=51.9125,4.6177