Betrouwbare aanwezigheidsdetectie in Home Assistant met iPhone en Node-RED

Elk slim huis moet één fundamenteel ding weten: is er iemand thuis? Deursloten, lampen, verwarming, alarmsystemen – ze hangen allemaal af van het antwoord op die ene vraag. Klinkt simpel, maar het betrouwbaar detecteren van aanwezigheid blijkt in de praktijk behoorlijk lastig.
Waarom is aanwezigheidsdetectie zo lastig?
Er zijn grofweg drie manieren om te bepalen of iemand thuis is:
- Wi-Fi/netwerk-tracking: Kijken of iemands telefoon verbonden is met het thuisnetwerk. Voordeel: geen extra hardware nodig. Nadeel: telefoons gaan regelmatig in slaapstand en “verdwijnen” dan van het netwerk, terwijl de eigenaar gewoon op de bank zit.
- GPS-tracking: Via de Home Assistant Companion App op je telefoon. Voordeel: werkt ook buitenshuis en kan geofences gebruiken. Nadeel: vreet batterij, en binnenshuis is GPS onnauwkeurig.
- Bluetooth-tracking: Met ESP32-bordjes (zoals ESPresense) die Bluetooth-signalen van je telefoon oppikken. Voordeel: zeer betrouwbaar, werkt per kamer. Nadeel: extra hardware nodig in elke ruimte.
Elke methode heeft zijn eigen valkuilen. In de praktijk blijkt een combinatie vaak het beste te werken. Maar de grootste boosdoener — en de reden dat veel mensen hun aanwezigheidsdetectie als onbetrouwbaar ervaren — is het gedrag van iPhones op Wi-Fi.
Het iPhone-probleem
Home Assistant volgt apparaten via een device_tracker-entiteit. Voor telefoons betekent dit meestal: is het apparaat verbonden met je Wi-Fi? Zo ja, dan is het home. Zo nee, dan not_home. Simpel genoeg.
Behalve dat iPhones hier niet aan meewerken.
Zodra het scherm van een iPhone uitgaat, gaat iOS agressief de Wi-Fi-radio beheren om batterij te besparen. De telefoon gaat in een slaapstand waarin hij niet meer reageert op netwerkpings en broadcasts. Technisch gezien is hij nog steeds verbonden met je access point, maar je router (of welke ping-gebaseerde tracker dan ook) kan hem niet meer bereiken. Dit is onderdeel van het 802.11 power save-mechanisme, en Apple zet hier flink op in om de batterijduur te verlengen.
Het gevolg: je telefoon lijkt je netwerk te “verlaten” terwijl je gewoon op de bank zit. Zonder een wachttijd zou je slimme huis denken dat je weg bent, alle lampen uitdoen en de deur op slot draaien. Niet ideaal.
De Home Assistant-community heeft hier uitgebreid over gediscussieerd. De consensus: een wachttijd van 15 minuten voordat je iemand als “afwezig” markeert. Lang genoeg om de slechtste iPhone-slaapcyclus op te vangen, maar kort genoeg dat het systeem niet traag aanvoelt. Home Assistant heeft hier zelfs de consider_home-instelling voor in de device_tracker-documentatie.
Mijn setup
Ik gebruik UniFi-netwerkApparatuur, en de UniFi-integratie in Home Assistant levert device tracker-entiteiten voor elk verbonden apparaat. Elke iPhone in het huishouden krijgt zo een device_tracker-entiteit die aangeeft of hij verbonden is met het Wi-Fi-netwerk.
De UniFi-integratie is een stap beter dan ping-gebaseerde tracking, omdat hij de associatiestatus op controllerniveau controleert. Hij weet wanneer een apparaat verbonden is, zelfs als het niet reageert op pings. Maar het iPhone-slaapprobleem geldt nog steeds — de telefoon kan zich volledig loskoppelen van het access point tijdens diepe slaap, dus die 15 minuten wachttijd blijft nodig.
Heb je geen UniFi-apparatuur? Geen probleem. Je kunt hetzelfde bereiken met een simpele ping-gebaseerde device tracker of de nmap tracker. Het enige verschil is dat ping en nmap afhankelijk zijn van de respons van de telefoon, wat ze iets minder betrouwbaar maakt tijdens iPhone-slaapcycli. De 15 minuten wachttijd vangt dat prima op.
Hoe het systeem werkt
De aanpak is vrij overzichtelijk. Voor elke persoon in het huishouden doet het systeem het volgende:
- Het bewaakt de device tracker-entiteit van hun iPhone via de UniFi-integratie
- Het wacht 15 minuten na een
not_home-status voordat het actie onderneemt - Het zet een
input_booleanom hun aanwezigheid bij te houden - Het werkt een teller bij die het aantal aanwezige personen bijhoudt
Die teller is het kernstuk. Hiermee kan ik verschillende automations triggeren op basis van vier situaties: iemand komt thuis, iemand vertrekt, de laatste persoon vertrekt, of de eerste persoon komt thuis.
Dit is de architectuur:
┌──────────────────────────────┐
│ Per-persoon flow │
│ │
│ device_tracker.iphone │
│ (van UniFi-integratie) │
│ │ │
│ ┌────┴────┐ │
│ │ │ │
│ not_home home │
│ (15 min) │ │
│ │ ▼ │
│ │ Was persoon weg? │
│ │ │ │ │
│ │ Ja Nee │
│ │ │ (negeer) │
│ ▼ ▼ │
│ Zet Zet │
│ UIT AAN │
│ bool bool │
│ │ │ │
│ ▼ ▼ │
│ Teller Teller │
│ -1 +1 │
└──────────────────────────────┘
│
▼
┌──────────────────────────────┐
│ Teller-gebaseerde events │
│ │
│ counter.personen_thuis │
│ │ │
│ ┌────┼────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ Eerste Iemand Laatste │
│ persoon vertrok persoon │
│ thuis vertrok │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ (link) (link) Lampen uit │
│ Deur op slot │
└──────────────────────────────┘
De vertrek-flow
Elke persoon heeft een server-state-changed-node die hun device tracker bewaakt. Deze node heeft twee uitgangen:
- Uitgang 1: De telefoon is al 15 minuten
not_home. Dit is een bevestigd vertrek. Het systeem zet deinput_booleanuit (bijv.input_boolean.presence_florian) en verlaagt de personen-teller. - Uitgang 2: De status is gewijzigd, maar de 15-minutenvoorwaarde is niet bereikt. Dit kan betekenen dat de telefoon zich binnen de wachttijd weer met Wi-Fi heeft verbonden.
Die tweede uitgang is waar de aankomstdetectie zit.
De aankomst-flow
Wanneer de device tracker van status verandert maar niet voldoet aan de “15 minuten not_home”-voorwaarde, betekent het dat de telefoon weer online is gekomen. Maar ik wil dit alleen als aankomst tellen als de persoon daadwerkelijk als afwezig was gemarkeerd.
Dus de flow checkt eerst de input_boolean. Als die off is (persoon was als afwezig gemarkeerd), zet hij hem weer on en verhoogt de teller. Als hij al on is, was de persoon nooit echt vertrokken — het was gewoon de iPhone die even in slaapstand ging. Geen actie nodig.
Dit is belangrijk. Zonder deze check zou je fantoom-aankomsten krijgen elke keer dat een iPhone na een Wi-Fi-dutje weer verbinding maakt.
Personen tellen
De counter.personen_thuis-entiteit houdt bij hoeveel mensen thuis zijn. Elk vertrek verlaagt hem. Elke aankomst verhoogt hem. Een aparte flow bewaakt deze teller en categoriseert de verandering in vier events:
| Event | Conditie | Voorbeeldgebruik |
|---|---|---|
| Iemand kwam thuis | Teller verhoogd | Welkom-thuis-notificatie |
| Iemand vertrok | Teller verlaagd | (Beschikbaar voor toekomstig gebruik) |
| Laatste persoon vertrok | Teller op 0 | Alle lampen uit, deur op slot |
| Eerste persoon thuis | Teller ging van 0 naar 1+ | Ganglicht aan |
Het “laatste persoon vertrok”-event is het meest nuttige. Wanneer de teller nul bereikt, doet het systeem alle lampen in huis uit via een light.alle_lampen-groepsentiteit en vergrendelt de voordeur. Dit zijn de twee dingen die ik altijd wil laten gebeuren als er niemand thuis is.
De “eerste persoon thuis”- en “iemand kwam thuis”-events zijn beschikbaar als link-nodes in Node-RED, zodat ik er later makkelijk nieuwe automations aan kan koppelen zonder de presence-flow zelf aan te raken.
Waarom input booleans in plaats van de device tracker?
Je vraagt je misschien af waarom ik input_boolean-entiteiten als tussenstap gebruik in plaats van direct met de device tracker-statussen te werken. Een paar redenen:
De wachttijd creëert ambiguïteit. Tijdens die 15 minuten kan de device tracker meerdere keren heen en weer flippen tussen home en not_home. De input boolean geeft me een schone, gedebouncede status. Hij is aan of uit, niets ertussenin.
Het ontkoppelt aanwezigheid van de detectiemethode. Als ik ooit overstap van UniFi naar iets anders (zoals de Home Assistant Companion App of Bluetooth-gebaseerde tracking), hoef ik alleen te veranderen wat de input boolean aanstuurt. Alles downstream dat de aanwezigheidsstatus leest, blijft gewoon werken.
Handmatige override. Soms heeft het systeem het mis. Met een input boolean kan ik iemands aanwezigheid handmatig togglen vanuit het Home Assistant-dashboard. Dat kan niet met een device tracker.
Mogelijke verbeteringen
Dit systeem draait al een tijdje betrouwbaar, maar er zijn een paar dingen die het nog beter zouden maken:
Snellere aankomstdetectie. Op dit moment wordt aankomst gedetecteerd wanneer de device tracker terug naar home flipt. De Home Assistant Companion App op iOS kan aankomsten sneller detecteren via GPS en significante locatieveranderingen. Beide bronnen combineren zou de vertraging verkleinen.
Bluetooth-gebaseerde tracking. Projecten zoals ESPresense gebruiken ESP32-bordjes om Bluetooth-advertenties van telefoons te detecteren. iPhones zenden BLE-beacons consistenter uit dan ze op Wi-Fi-pings reageren, dus dit zou betrouwbaarder kunnen zijn voor aanwezigheidsdetectie — zonder de 15 minuten wachttijd.
Gastmodus. Het huidige systeem volgt alleen bekende huisgenoten. Een simpele toevoeging zou een gastmodus-toggle zijn die voorkomt dat de “laatste persoon vertrok”-automations afgaan als er bezoek is.
Zelf aan de slag
Wil je iets vergelijkbaars bouwen? Dit heb je nodig:
- Home Assistant met device tracker-entiteiten voor elke telefoon (ik gebruik de UniFi-integratie, maar ping of nmap werken ook)
- Node-RED als Home Assistant add-on, of gewoon native Home Assistant-automations. Ik vind Node-RED fijn vanwege de visuele flows, maar alles in dit artikel kan ook met gewone HA-automations.
- Een
input_boolean-entiteit per persoon (maak deze aan in Home Assistant onder Instellingen > Apparaten & Services > Helpers) - Een
counter-helper-entiteit om het aantal aanwezigen bij te houden
Begin met één persoon. Zorg dat de vertrek- en aankomst-flow goed werken, en dupliceer het dan voor andere huisgenoten. De teller en event-gebaseerde automations kun je toevoegen zodra de basale tracking stabiel is.
Dit artikel is oorspronkelijk gepubliceerd op florianschaal.com.








