Hoofdstuk 8 van 22

Wachten, vertragen en herhalen

In het vorige hoofdstuk heb je gezien hoe je met Choose verschillende routes binnen één automatisering kunt maken. Home Assistant kan daardoor niet alleen…

In het vorige hoofdstuk heb je gezien hoe je met Choose verschillende routes binnen één automatisering kunt maken. Home Assistant kan daardoor niet alleen iets doen, maar ook beslissen wat het moet doen.

Soms is dat nog niet genoeg.

Je wilt bijvoorbeeld:

  • een lamp inschakelen en na vijf minuten weer uitschakelen;
  • wachten totdat een deur wordt gesloten;
  • pas doorgaan wanneer een apparaat werkelijk uit staat;
  • een melding meerdere keren versturen zolang een situatie blijft bestaan;
  • of een actie een paar keer achter elkaar uitvoeren.

Daarvoor bestaan in Home Assistant acties waarmee je een automatisering kunt laten wachten, vertragen of herhalen.

Dat klinkt eenvoudig, maar juist bij wachten ontstaan automatiseringen die zich anders gedragen dan je verwacht. Daarom gaan we niet meteen allerlei opties combineren. We bekijken eerst afzonderlijk wat er gebeurt.

Een automatisering hoeft niet alles onmiddellijk uit te voeren

Tot nu toe zagen onze automatiseringen er meestal ongeveer zo uit:

Trigger → voorwaarden → acties

Zodra de trigger optreedt en de voorwaarden kloppen, voert Home Assistant de acties achter elkaar uit.

Bijvoorbeeld:

Als er beweging in De Werkplaats wordt gedetecteerd en het is donker, zet dan de verlichting aan.

Dat gebeurt vrijwel direct.

Maar stel dat je wilt:

Als er beweging wordt gedetecteerd, zet de verlichting aan.
Wacht daarna vijf minuten.
Zet vervolgens de verlichting weer uit.

Dan moet Home Assistant tussen twee acties even stoppen.

Die pauze noemen we een vertraging, in Home Assistant meestal aangeduid als Delay.

Delay — een vaste tijd wachten

Een Delay betekent eenvoudig:

Ga pas na deze hoeveelheid tijd verder met de volgende actie.

Je kunt bijvoorbeeld instellen:

  • 10 seconden;
  • 30 seconden;
  • 5 minuten;
  • 1 uur.

Een eenvoudige automatisering kan daardoor deze volgorde krijgen:

  • Verlichting inschakelen.
  • Vijf minuten wachten.
  • Verlichting uitschakelen.

Conceptueel ziet dat er zo uit:

Beweging gedetecteerd

Lamp aan

Wacht 5 minuten

Lamp uit

Dat lijkt een logische bewegingsautomatisering.

Maar voordat je hem bouwt, voorspel eerst wat er gebeurt.

Denk even vooruit

Stel:

  • om 20:00 uur wordt beweging gedetecteerd;
  • de lamp gaat aan;
  • Home Assistant begint vijf minuten te wachten;
  • om 20:03 uur loopt iemand opnieuw door De Werkplaats.

Wat verwacht je dan?

Wordt de wachttijd opnieuw vijf minuten?

Of gaat de lamp alsnog om 20:05 uur uit?

Het antwoord hangt af van iets dat we in het volgende hoofdstuk uitgebreid gaan bekijken: wat Home Assistant doet wanneer dezelfde automatisering opnieuw wordt gestart terwijl de eerste uitvoering nog bezig is.

Dat is belangrijk, want tijdens een Delay is de automatisering nog niet klaar.

Voorlopig hoef je alleen dit te onthouden:

Een Delay is niet hetzelfde als een losse timer die ergens op de achtergrond draait. De automatisering bevindt zich werkelijk in die wachttijd.

Dat verschil wordt later belangrijk.

Wanneer is een Delay geschikt?

Een vaste vertraging is vooral nuttig wanneer je werkelijk weet:

Na deze tijd wil ik altijd verdergaan.

Bijvoorbeeld:

Zet een waarschuwingslamp aan.
Wacht twee seconden.
Schakel daarna een relais.

Of:

Zet de ventilator aan.
Laat hem nog tien minuten draaien.
Zet hem daarna uit.

Hier is de tijd zelf belangrijk.

De automatisering hoeft niet te controleren of er onderweg iets verandert.

Dat maakt Delay eenvoudig en goed voorspelbaar.

Niet altijd wachten op tijd

Soms weet je helemaal niet hoe lang je moet wachten.

Stel dat je in De Werkplaats een deurcontact hebt.

Je wilt:

Wanneer de achterdeur wordt geopend terwijl het donker is, zet de buitenlamp aan.
Wacht totdat de deur weer dicht is.
Zet daarna de lamp uit.

Nu helpt een vaste vertraging van bijvoorbeeld vijf minuten niet goed.

Misschien is de deur na twintig seconden weer dicht.

Misschien blijft hij tien minuten openstaan.

Wat je eigenlijk wilt zeggen is:

Wacht niet een bepaalde tijd, maar wacht totdat er iets gebeurt.

Daarvoor kun je in Home Assistant een Wait gebruiken.

Wachten op een gebeurtenis of toestand

Met een wachtactie kan Home Assistant zijn uitvoering onderbreken totdat aan een bepaalde situatie wordt voldaan.

Bijvoorbeeld:

Deur geopend

Buitenlamp aan

Wacht totdat deur gesloten is

Buitenlamp uit

Het grote verschil met Delay is:

Delay

Wacht vijf minuten.

Wait

Wacht totdat deze situatie ontstaat.

Dat verschil lijkt klein, maar het maakt je automatiseringen vaak veel slimmer.

Wachten totdat een toestand waar wordt

In Home Assistant werken we veel met toestanden.

Een deurcontact kan bijvoorbeeld de toestand hebben:

open

of:

closed

Een lamp kan:

on

of:

off

zijn.

Je kunt Home Assistant daarom laten wachten totdat een entiteit een bepaalde toestand bereikt.

Bijvoorbeeld:

Wacht totdat binary_sensor.deur_werkplaats weer gesloten is.

Daarna gaat de automatisering verder met de volgende actie.

Eerst voorspellen

Stel dat je deze automatisering maakt:

Deur wordt geopend

Lamp aan

Wacht totdat deur gesloten is

Lamp uit

Voorspel nu wat er gebeurt als de deur een half uur open blijft staan.

De lamp blijft dan aan.

Dat is misschien precies wat je wilt.

Maar er zit ook een risico in.

Wat als het deurcontact defect raakt?

Wat als Home Assistant nooit meer de toestand gesloten ontvangt?

Dan blijft de automatisering wachten.

Daarom is het vaak verstandig om bij een wachtactie ook na te denken over een maximale wachttijd.

Een maximale wachttijd gebruiken

Een wachtactie kan meestal worden gecombineerd met een timeout.

Een timeout betekent:

Stop met wachten wanneer deze maximale tijd is verstreken.

Bijvoorbeeld:

Wacht totdat de deur gesloten is, maar maximaal 30 minuten.

Daarmee voorkom je dat een automatisering onbeperkt blijft wachten.

Conceptueel:

Wacht totdat deur gesloten is

OF

maximaal 30 minuten

Dit is vooral verstandig wanneer je afhankelijk bent van:

  • een draadloze sensor;
  • een batterijgevoed apparaat;
  • een netwerkverbinding;
  • een apparaat dat misschien uitvalt;
  • of een fysieke handeling van iemand.

Een goede automatisering houdt namelijk niet alleen rekening met de normale situatie, maar ook met wat er gebeurt wanneer iets niet gebeurt.

Wachten is iets anders dan opnieuw controleren

Hier zit een belangrijk verschil.

Stel dat je zegt:

Wacht totdat de temperatuur lager is dan 25 °C.

Home Assistant blijft dan op dat punt in de automatisering wachten totdat die situatie ontstaat.

Dat is iets anders dan:

Controleer nu of de temperatuur lager is dan 25 °C.

Bij een gewone voorwaarde wordt maar één keer gekeken.

Bij een wachtactie wordt gewacht totdat de gewenste toestand ontstaat.

Vergelijk het met een deur.

Een voorwaarde zegt:

Is de deur nu dicht?

Een wachtactie zegt:

Blijf hier totdat de deur dichtgaat.

Dat onderscheid helpt enorm wanneer je later complexere automatiseringen gaat maken.

Wachten op een trigger

Home Assistant kan niet alleen wachten op een toestand, maar ook op een nieuwe trigger.

Dat klinkt misschien vreemd, omdat een trigger normaal gesproken de automatisering start.

Maar binnen een automatisering kun je opnieuw zeggen:

Wacht totdat deze gebeurtenis optreedt.

Bijvoorbeeld:

Wanneer de deur wordt geopend, zet de lamp aan.
Wacht daarna totdat er vijf minuten geen beweging meer is.
Zet vervolgens de lamp uit.

Of:

Wanneer een machine wordt ingeschakeld, wacht totdat het stroomverbruik weer onder een bepaalde waarde komt. Stuur daarna een melding dat de machine klaar is.

Hier wordt wachten onderdeel van de volgorde.

Een praktisch voorbeeld: ventilatie in De Werkplaats

Stel dat je een ventilator hebt die je wilt gebruiken wanneer de luchtvochtigheid oploopt.

Een eenvoudige automatisering zou kunnen zijn:

Als de luchtvochtigheid hoger wordt dan 70%, zet de ventilator aan.

Maar daarmee blijft de ventilator aan.

Je kunt daarom verder denken:

Als de luchtvochtigheid hoger wordt dan 70%, zet de ventilator aan.
Wacht totdat de luchtvochtigheid lager wordt dan 60%.
Zet daarna de ventilator uit.

Dat ziet er logisch uit:

Luchtvochtigheid > 70%

Ventilator aan

Wacht tot luchtvochtigheid < 60%

Ventilator uit

Merk op dat we hier verschillende grenswaarden gebruiken:

  • inschakelen boven 70%;
  • uitschakelen onder 60%.

Dat voorkomt dat de ventilator voortdurend aan en uit gaat wanneer de luchtvochtigheid rond één grenswaarde schommelt.

Je ziet hier ook waarom wachten nuttig kan zijn: Home Assistant hoeft niet te gokken hoeveel minuten ventilatie nodig zijn.

Hij wacht op het resultaat dat je werkelijk wilt bereiken.

Delay en Wait combineren

Je kunt beide technieken ook combineren.

Bijvoorbeeld:

Zet de ventilator aan wanneer de luchtvochtigheid te hoog wordt.
Wacht totdat de luchtvochtigheid onder 60% komt.
Laat de ventilator daarna nog vijf minuten draaien.
Zet hem vervolgens uit.

De reeks wordt dan:

Luchtvochtigheid > 70%

Ventilator aan

Wacht tot < 60%

Wacht 5 minuten

Ventilator uit

De eerste wachttijd is afhankelijk van een toestand.

De tweede wachttijd is een vaste tijd.

Dat zijn twee verschillende soorten wachten, met ieder een eigen reden.

Herhalen — Repeat

Soms wil je niet alleen wachten, maar dezelfde actie meerdere keren uitvoeren.

Daarvoor gebruikt Home Assistant een Repeat.

Repeat betekent letterlijk:

Voer deze reeks acties opnieuw uit.

Een eenvoudig voorbeeld:

Laat een lamp drie keer knipperen.

Daarvoor zou je kunnen denken aan:

Lamp aan

Wacht 1 seconde

Lamp uit

Wacht 1 seconde

En die reeks vervolgens drie keer laten uitvoeren.

Zonder Repeat zou je alle acties drie keer handmatig moeten invoeren.

Met Repeat beschrijf je maar één keer wat er moet gebeuren.

Een vast aantal keren herhalen

De eenvoudigste vorm is:

Herhaal deze acties drie keer.

Bijvoorbeeld:

Herhaal 3 keer:

Lamp aan

Wacht 1 seconde

Lamp uit

Wacht 1 seconde

Dat kan nuttig zijn voor:

  • een visuele waarschuwing;
  • een geluidssignaal;
  • het opnieuw proberen van een actie;
  • een korte testprocedure.

Gebruik herhaling alleen wanneer er werkelijk iets herhaald moet worden.

Drie dezelfde acties onder elkaar zetten werkt technisch misschien ook, maar maakt je automatisering moeilijker te lezen en later moeilijker aan te passen.

Herhalen zolang iets waar is

Een krachtigere vorm is:

Blijf deze acties uitvoeren zolang een bepaalde situatie bestaat.

Bijvoorbeeld:

Zolang de garagedeur openstaat, laat iedere vijf minuten een waarschuwingslamp kort knipperen.

Conceptueel:

Zolang deur open is:

Lamp aan

Wacht 1 seconde

Lamp uit

Wacht 5 minuten

Nu weet je vooraf niet hoe vaak de reeks wordt uitgevoerd.

Dat hangt af van de werkelijkheid.

Misschien wordt de deur na zes minuten gesloten.

Misschien pas na een uur.

Let op oneindige herhalingen

Hier moet je voorzichtig mee zijn.

Stel dat je maakt:

Zolang deur open is:

Stuur melding

Zonder vertraging kan Home Assistant deze actie razendsnel opnieuw uitvoeren.

Dat kan betekenen dat je binnen korte tijd een enorme hoeveelheid meldingen krijgt.

Daarom moet je bij herhalingen altijd nadenken:

Hoe snel kan deze lus opnieuw beginnen?

Een veel veiliger ontwerp is bijvoorbeeld:

Zolang deur open is:

Stuur melding

Wacht 10 minuten

Nu kan de melding maximaal één keer per tien minuten worden verstuurd.

Repeat until — doorgaan totdat iets gebeurt

Je kunt de gedachte ook omdraaien.

In plaats van:

Herhaal zolang deze situatie waar is.

kun je denken:

Herhaal totdat deze situatie waar wordt.

Bijvoorbeeld:

Blijf iedere vijf minuten controleren totdat een apparaat is uitgeschakeld.

Conceptueel:

Herhaal:

Controleer situatie

Wacht 5 minuten

Totdat apparaat uit is

De precieze opbouw hangt af van wat je wilt bereiken, maar het denkmodel is belangrijker dan de knop die je in Home Assistant kiest.

Vraag jezelf steeds af:

Wat moet worden herhaald?

en:

Wanneer moet de herhaling stoppen?

Als je het antwoord daarop niet duidelijk kunt formuleren, is de automatisering waarschijnlijk nog niet goed genoeg uitgewerkt.

Kies tussen wachten en herhalen

Wachten en herhalen kunnen soms hetzelfde resultaat lijken te geven.

Stel dat je wilt wachten totdat een temperatuur onder 25 °C komt.

Je zou kunnen zeggen:

Wacht totdat de temperatuur onder 25 °C is.

Maar je zou ook iedere minuut kunnen controleren:

Controleer temperatuur

Wacht 1 minuut

Controleer opnieuw

Wacht 1 minuut

...

Technisch kun je daarmee iets vergelijkbaars bereiken.

Maar de eerste aanpak is meestal duidelijker:

Wacht totdat de toestand verandert.

Gebruik Repeat vooral wanneer er tijdens het wachten ook werkelijk iets opnieuw moet gebeuren.

Bijvoorbeeld:

Stuur iedere tien minuten een waarschuwing zolang het raam openstaat.

Daar moet wel degelijk iets worden herhaald.

Maar als je alleen wilt wachten totdat het raam wordt gesloten, is een Wait meestal eenvoudiger.

Schrijf eerst op wat je bedoelt

Bij dit soort automatiseringen helpt gewone taal opnieuw enorm.

Neem bijvoorbeeld:

Wanneer ik De Werkplaats verlaat, zet de verlichting na twee minuten uit, tenzij er opnieuw beweging wordt gedetecteerd.

Dat klinkt eenvoudig, maar bevat eigenlijk meerdere vragen:

  • Wat start de automatisering?
  • Waarop wachten we?
  • Wat gebeurt er wanneer opnieuw beweging wordt gedetecteerd?
  • Wordt de wachttijd opnieuw gestart?
  • Moet de lopende automatisering worden afgebroken?
  • Mag er tegelijkertijd een tweede uitvoering beginnen?

Je merkt dat Delay alleen dit probleem nog niet volledig oplost.

Dat brengt ons bij een belangrijk onderwerp dat vaak pas zichtbaar wordt zodra je wachttijden gaat gebruiken.

Een lopende automatisering bestaat echt

Wanneer een automatisering alleen dit doet:

Lamp aan

is hij vrijwel onmiddellijk klaar.

Maar bij:

Lamp aan

Wacht 10 minuten

Lamp uit

blijft de automatisering ongeveer tien minuten actief.

Tijdens die tien minuten kan dezelfde trigger opnieuw optreden.

Dat roept een belangrijke vraag op:

Wat moet Home Assistant doen als een automatisering opnieuw wordt gestart terwijl de vorige uitvoering nog bezig is?

Er zijn meerdere mogelijke antwoorden.

Je zou kunnen willen:

  • de nieuwe trigger negeren;
  • de oude uitvoering stoppen en opnieuw beginnen;
  • beide uitvoeringen naast elkaar laten lopen;
  • of nieuwe uitvoeringen achter elkaar in een wachtrij zetten.

Welke keuze juist is, hangt volledig af van wat de automatisering moet doen.

En juist daarom bekijken we dat onderwerp apart.

Controleer wat je hebt gebouwd

Wanneer je voor het eerst met Delay, Wait of Repeat werkt, maak de automatisering dan klein.

Gebruik bijvoorbeeld een testlamp in De Werkplaats.

Maak eerst:

Lamp aan

Wacht 10 seconden

Lamp uit

Voer de automatisering handmatig uit en kijk wat er gebeurt.

Controleer:

  • Gaat de lamp direct aan?
  • Blijft hij ongeveer tien seconden aan?
  • Gaat hij daarna uit?

Pas daarna kun je bijvoorbeeld een trigger toevoegen.

Verander steeds maar één onderdeel.

Zo weet je welke wijziging verantwoordelijk is wanneer het gedrag anders is dan je verwacht.

Bekijk ook de trace

Home Assistant kan van uitgevoerde automatiseringen een trace bewaren.

Daarin kun je zien welke stappen zijn uitgevoerd en waar de automatisering zich bevond.

Bij een automatisering met meerdere acties is dat bijzonder nuttig.

Als bijvoorbeeld de laatste actie niet wordt uitgevoerd, kun je onderzoeken:

Is de automatisering wel voorbij de wachtactie gekomen?

Misschien wacht hij nog.

Misschien is een timeout bereikt.

Misschien is de automatisering ondertussen opnieuw gestart of gestopt.

Een foutmelding of onverwachte trace is daarom geen mislukking.

Het is informatie over wat Home Assistant werkelijk heeft gedaan.

En dat is uiteindelijk belangrijker dan wat wij dachten dat hij zou doen.

Wat je uit dit hoofdstuk moet meenemen

Je hebt nu drie nieuwe hulpmiddelen gezien.

Delay gebruik je wanneer je een vaste tijd wilt wachten.

Wacht vijf minuten en ga daarna verder.

Wait gebruik je wanneer je wilt wachten totdat er iets in de werkelijkheid verandert.

Wacht totdat de deur gesloten is.

Repeat gebruik je wanneer dezelfde actie of reeks acties meerdere keren moet worden uitgevoerd.

Blijf iedere tien minuten waarschuwen zolang het raam openstaat.

Met deze drie onderdelen kun je automatiseringen maken die veel meer doen dan alleen onmiddellijk reageren.

Maar ze introduceren ook een nieuw probleem.

Zodra een automatisering wacht of herhaalt, blijft hij langer actief. Tijdens die tijd kan dezelfde trigger opnieuw optreden.

Dan moet Home Assistant weten wat hij met die nieuwe uitvoering moet doen.

En precies daar gaat het volgende hoofdstuk over:

Wat gebeurt er wanneer een automatisering opnieuw start?