Een zomerautomatisering die je per kamer precies vertelt wanneer je de ramen moet sluiten.

De korte versie, zonder techniek: In de zomer houden we het huis koel door ‘s ochtends vroeg alles open te zetten en het weer dicht te doen voordat het buiten heet wordt. Het lastige is het precieze moment om elke kamer te sluiten, want buiten wordt het warmer dan binnen voordat je het doorhebt. Dus heb ik het huis geleerd om zijn eigen temperaturen in de gaten te houden en mij een berichtje op mijn telefoon te sturen, kamer voor kamer, op het moment dat ik die kamer moet sluiten. Het doet ook het omgekeerde: het vertelt me wanneer het eindelijk koeler is buiten dan binnen, zodat ik weet wanneer ik weer open kan zetten om de koelte binnen te halen.
Geen nieuwe apparaten, alleen software die dingen aan elkaar knoopt die ik toch al draai. Dat is het hele idee. Alles hieronder is hoe ik het gebouwd heb, en dat wordt technisch, dus wilde je alleen de kern, dan kun je hier gerust stoppen.
Het probleem
In de zomer zetten we vroeg in de ochtend het hele huis open om koele lucht binnen te halen. Ons huis ligt grotendeels in de schaduw, dus normaal redden we het prima, zelfs in de hete zomers. Soms wordt het een beetje ongemakkelijk, maar ik vind nog steeds dat we geen airco nodig hebben. ’s Ochtends koelen draagt de dag meestal wel.
Maar er is een omslagpunt: zodra het buiten warmer wordt dan binnen, doet elk open raam en elke open deur precies het tegenovergestelde van wat je wilt, en laat warmte weer binnen. De kunst is om op precies het juiste moment dicht te doen, en dat is lastig in te schatten.
Dus het doel: een knop die ik ‘s ochtends omzet en die stilletjes de temperaturen in de gaten houdt en ons per kamer een seintje op Telegram geeft op het moment dat we die kamer moeten sluiten.
De bestaande setup
- Home Assistant voor sensoren en toestand, draaiend in Docker (config gekoppeld aan een host-map, geen named volumes).
- evohome verwarmingsintegratie, die de belangrijkste databron bleek: elke zone (
climate.woonkamer,climate.aeron, …) geeft een livecurrent_temperature. - Node-RED voor de automatiseringslogica, al gekoppeld aan Home Assistant en aan een Telegram-bot.
- “Nepknoppen”, een patroon dat ik al gebruik:
input_boolean-helpers in Home Assistant die er puur zijn om Node-RED-flows te triggeren. - Grafana + InfluxDB die Home Assistant-data loggen voor grafieken.
Ontwerpkeuzes
1. Waar komt de buitentemperatuur vandaan?
Ik had geen buitensensor. In plaats van hardware te kopen, voegde ik een REST-sensor toe die Open-Meteo ophaalt: gratis, geen API-key, en je voert gewoon je lat/long in. Omdat ik het als een echte Home Assistant-sensor heb gemodelleerd (met device_class: temperature), stroomt het ook in InfluxDB en verschijnt het gratis in Grafana. (Een mooi alternatief voor Nederland is Buienradar, dat een echte meting van een nabijgelegen weerstation geeft in plaats van een modelmix.)
2. Lees buiten één keer, vergelijk met veel kamers.
De flow haalt de buitentemperatuur één keer per cyclus op en waaiert dan uit om die onafhankelijk met elke kamer te vergelijken. Netter en minder API-calls dan één keten per kamer.
3. Toestand per kamer, zodat alerts onafhankelijk zijn.
Elke kamer heeft zijn eigen “al gewaarschuwd”-vlag (koeling_gemeld_<kamer>). Je krijgt één Telegram per kamer, op het eigen omslagpunt van die kamer. Slaapkamers slaan eerder om dan de zolder.
4. Eén keer waarschuwen, met hysterese.
Vuur één keer af zodra buiten ≥ kamertemp, en blijf daarna stil. Herbewapen pas als buiten weer minstens 0,5 °C onder de kamer zakt: die halve graad dode zone voorkomt dat het heen en weer flappert precies op het omslagpunt.
Implementatie
Home Assistant: configuration.yaml
De knop (een nepknop-input_boolean):
input_boolean:
koelen_huis:
name: Cooling the house
icon: mdi:snowflake
initial: offDe buitentemperatuursensor:
sensor:
- platform: rest
name: Buiten temperatuur
unique_id: buiten_temperatuur_openmeteo
resource: "https://api.open-meteo.com/v1/forecast?latitude=51.7310&longitude=5.5307¤t=temperature_2m"
method: GET
value_template: "{{ value_json.current.temperature_2m }}"
unit_of_measurement: "°C"
device_class: temperature
scan_interval: 300Dat geeft sensor.buiten_temperatuur, dat elke 5 minuten update.
Node-RED: de flow
Eén tab, “Koelen huis”, met twee ingangen en een gedeelde vergelijkingsfase:
[Button on/off] --on--> [Reset flags + "cooling on" msg] --> Telegram "started"
| \-> (immediate check) -+
\-off-> [Reset flags] --> Telegram "stopped" |
v
[Poll every 5 min, only while button on] -----------------> [Get outside temp] -+
v
+-------------- fan out to 5 rooms ----------------+
v
[woonkamer] [aeron] [elias] [steph_en_iris] [zolder]
\--------------+--------------------/
v
[Compare: outside >= room?] --> [Telegram alert]
Belangrijke node-keuzes:
- De poll-node pollt de knop (
input_boolean.koelen_huis) elke 300 s en laat alleen door wanneer dieonstaat, zodat de hele vergelijkingsketen vanzelf door de knop wordt gepoort zonder extra logica. - Elke kamer-node (
api-current-stateopclimate.<kamer>) tagt het bericht metmsg.roomkeyenmsg.roomlabel, zodat één enkele vergelijkingsfunctie en één enkele Telegram-node alle vijf kamers afhandelen. - De lijm waardoor één functie elke kamer bedient: de Get outside temp-node bewaart zijn meting in
msg.buiten, en elkeapi-current-state-kamer-node schrijft zijn state inmsg.data(in plaats van het hele bericht te overschrijven). Zo rijden zowel de buitenmeting als de eigen temperatuur van die kamer op dezelfdemsgde vergelijkingsfunctie in.
De vergelijkingsfunctie (draait één keer per kamer):
const buiten = parseFloat(msg.buiten);
let binnen = NaN;
try { binnen = parseFloat(msg.data.attributes.current_temperature); } catch (e) {}
const label = msg.roomlabel || 'een kamer';
const key = 'koeling_gemeld_' + (msg.roomkey || 'onbekend');
if (isNaN(buiten) || isNaN(binnen)) {
node.status({ fill: 'red', shape: 'ring', text: label + ': temp onbekend' });
return null;
}
node.status({ fill: 'blue', shape: 'dot', text: `${msg.roomkey}: buiten ${buiten} / binnen ${binnen}` });
const marge = 0.5; // hysteresis
let gemeld = flow.get(key) || false;
if (!gemeld && buiten >= binnen) {
flow.set(key, true);
msg.payload = `🔴 Sluit ${label}! Het is buiten nu ${buiten}°C en in ${label} ${binnen}°C. Doe ramen en deuren dicht om de koelte binnen te houden.`;
return msg;
}
if (gemeld && buiten <= binnen - marge) {
flow.set(key, false); // cooler again -> re-arm
}
return null;De vijf kamers die aangesloten zijn: climate.woonkamer (woonkamer), climate.aeron, climate.elias, climate.steph_en_iris en climate.zolder (zolder).
Twee valkuilen die het vermelden waard zijn
-
De
server-state-changed-node (v6) gebruikt geen gewoonentityId-veld. Mijn eerste deploy gooideConfigError: An entity is required. De v6-node wil de entity binnen eenentities-object:{ entity: ["input_boolean.koelen_huis"], substring: [], regex: [] }. Makkelijk te missen als jeflows.jsonmet de hand bewerkt. -
Dynamische tekst door de Telegram-node sturen. Ik wilde de live temperaturen in het bericht. Toen ik de broncode van de node (
node-red-contrib-telegrambot-home) las, werd de logica duidelijk:var message = node.staticMessage || msg.payload;Dus de truc is om het berichtveld van de node leeg te laten en
msg.payloadin de functie te zetten, waarna de node terugvalt op de payload.
Controleren of het werkt
Omdat alles bestandsgebaseerd is (geen volumes), was de workflow: bestanden bewerken → valideren → de container herstarten.
-
De Home Assistant-config gevalideerd vóór het herstarten:
docker exec homeassistant python -m homeassistant --script check_config -c /config -
Na de herstart bevestigd dat de nieuwe entities echt gevuld waren door de Home Assistant recorder-database te lezen: buiten kwam terug op 23,6 °C,
climate.woonkamerop 24,5 °C, de knopoff. -
Node-RED’s log gecheckt op een schone
Started flowszonder fouten erna.
Bonus: het staat allemaal in Grafana
Omdat de buitentemperatuur een echte Home Assistant-sensor is, belandt die in InfluxDB en kan die naast de kamertemperaturen worden gegrafiekt. Dit paneel is echte data van 1 juli 2026. De groene lijn is de woonkamer (evohome), de oranje lijn is de buitentemperatuur (Open-Meteo):

Je kunt de hele logica van de grafiek aflezen: buiten is ‘s nachts koel (~13 °C), klimt door de ochtend en steekt rond 14:20 boven de woonkamer uit: de eerste “sluit het huis”-alert. Het zakt er net weer onder, en steekt dan een tweede keer om 16:10 over (dit is precies het hysterese-herbewapengedrag, dat echt gebeurt), piekt rond 26 °C en zakt ‘s avonds uiteindelijk weer eronder. De twee rode stippellijnen zijn waar Node-RED een Telegram zou hebben afgevuurd.
Het spiegelbeeld: wanneer je open kunt zetten
Ik heb hetzelfde ook omgekeerd gebouwd. Een tweede vergelijking, dezelfde fan-out, dezelfde hysterese per kamer, alleen omgedraaid: zodra het buiten koeler wordt dan een bepaalde kamer, krijg ik een Telegram dat ik de ramen van die kamer open kan zetten om de koelte weer binnen te halen. Dezelfde “één keer waarschuwen, herbewapenen op een halve graad dode zone”-logica, alleen met de vergelijking andersom. Samen vertellen ze me precies wanneer ik moet sluiten als het opwarmt en wanneer ik weer open kan zetten als het afkoelt, kamer voor kamer.
Het resultaat
Zet ‘s ochtends “Huis koelen” aan en vergeet het. Naarmate de dag opwarmt krijg je een Telegram per kamer (woonkamer, Aeron, Elias, Steph & Iris en de zolder), die elk de kamer en beide temperaturen noemt, op het exacte omslagpunt van die kamer, één keer. En omdat de buitentemperatuur een echte Home Assistant-sensor is, staat het ook allemaal in Grafana.
Gebouwd met Home Assistant + Node-RED + een gratis Open-Meteo REST-sensor + Telegram. Geen extra hardware.