Cilj
Avtomatizacija vključevanja in izključevanja luči je vsaj zame eden najtežjih izzivov, ki ga po nekaj letih še vedno nisem popolnoma rešil. Cilj je enostaven, eliminacija potrebe po pritiskanju stikal za luči. Zakaj? Ne vem, ker je kul.
Ob gradnji hiše sem električarju predal vrečo Shelly Wifi stikal, dovolj za vse luči. Vgrajeni so po dozah in za stikali. Sigurno to ni optimalen način, a ob gradnji nisem imel pojma o teh stvareh in sem hotel obdržati klasično vezavo z možnostjo enostavne odstranitve v primeru, če se ne bo obneslo. Boljša rešitev bi bila centralizirana varijanta, recimo s KNX sistemom. Shelly stikala drugače delujejo dobro, mogoče se kakšen kdaj pokvari in ga je treba zamenjati.
Vsaj na začetku je bil namen projekta predvsem centralizirano ugašanje. Na primer, ko grem spat, je na hodniku nalimana NFC nalepka, ki ob dotiku telefona ugasne vse luči v hiši, zraven pa še TV in radio. Enako se vse luči ugasnejo, ko vsi zapustimo hišo. Že zaradi teh dveh avtomatik, mi je bilo vredno investicije 500€ za Shellyje in 500€ za vgradnjo.
Ampak luči sem še vedno moral vključevati na roke in potem še izključiti, ko sem odhajal s prostora. Preveč dela in preveč za razmišljat. Za samodejni vklop luči je potrebno hiši dati zanesljivo informacijo o prisotnosti človeka. Načeloma lahko ločimo prostore v dve kategoriji:
- “aktivni” prostori, kamor prideš, vzameš nekaj in oddideš oziroma se aktivno gibaš. Na primer hodniki, garderoba, pralnica, stopnišče
- “pasivni” prostori, kjer smo ljudje mirnejši in ne premikamo veliko. Na primer, dnevna soba, jedilnica, kopalnica
Aktivni prostori načeloma niso problematični, saj lahko prisotnost zaznamo z enostavnim in poceni infrardečim PIR senzorjem. Tovrstni senzorji so hitri in načeloma zaznajo samo premikajoča živa bitja. Ne zmorejo pa brezprekinjeno zaznavati mirujočega človeka. Večino aktivnih prostorov sem pokril s PIR senzorji, ki komunicirajo preko 433 MHz radiofrekvenčne povezave. Pred kratkim pa sem začel migrirati na Zigbee senzorje, zato je ta del trenutno v razsulu.
Pasivni prostori so zahtevnejši. Klasični PIR senzorji ne zaznajo mirujočega človeka in po nekaj minutah ležanja na kavču nehajo zaznavati in te pahnejo v temo. Na začetku sem mirovanje poskušal nasloviti z dvema poceni notranjima kamerama, ki pokrijeta celotni problematični prostor (skupni prostor kuhinja, jedilnica, dnevna - okoli 50 kvadratov). Kameri pošiljata video v zunanji program Frigate, ki omogoča prepoznavo oseb, informacijo o prisotnosti pa pošlje v Home Assistant. Ko Frigate prepozna osebo v določenem delu prostora, Home Assistant tam vključi luč. Pričakoval sem, da bom s tem rešil tudi težavo človeka v mirovanju, ampak v praksi se je izkazalo, da na primer sedenje na stolu, kjer je viden samo del telesa, kamera izgubi sled in posledično se luč izključi. Enako je težava z ležanjem na kavču kjer je oseba pokrita z deko ali pa, če oseba leži v nenavadnem položaju.
Spodnji video prikazuje samodejen prižig luči s prepoznavo oseb. Statični rumeni okvirji prikazujejo različne cone - kuhinjo, jedilnico in dnevno. Tako Home Assistant ve, v katerem delu prostora se nahaja oseba.
Da naslovim zgornjo težavo sem se odločil za izdelavo dveh mmWave senzorjev, ki sta izredno občutljiva, ker zaznavata na podlagi odbojev mikrovalovnih signalov. Tako zaznata tudi mikro premike in celo dihanje. So dražji (PIR=10€, mmWave=50€), zato sem začel sestavljati svoje s poceni mmWave moduli LD2420 in mikrokontrolerjem. S tem cena pade na okoli 10€. Ta dva senzorja delujeta v tandemu s kamero. Tako se luč ugasne samo, ko se tako kamera kot mmWave senzor strinjata, da ni nikogar v prostoru.
Seveda pa se luči ne rabijo vključevati, ko je zunaj še dovolj svetlo, zato z merjenjem zunanje osevetlitve omejujem samodejni vklop luči samo, ko je zunaj dovolj temno. Samodejni izklop luči deluje neodvisno od nivoja zunanje svetlobe in tako sproti ugaša luči, ki jih otroci z neznanega razloga vključijo podnevi. Enako velja za TV, ki se ugasne vedno, ko ni nikogar v dnevni sobi. Sicer ta avtomatika ni najbolj priljubljena med člani družine, ampak nekdo mora skrbeti za energetsko učinkovitost hiše.
Strojna oprema
Kot zapisano zgoraj, vse luči upravljajo Shelly WiFi releji.
Notranje kamere so od proizvajalca Yi. Ko sem jih kupil, je bilo težko dobiti poceni kamere brez posiljevanja z oblakom. Tudi moje niso izjema, zato sem namestil operacijski sistem Yi-hack, ki priročno prekine povezavo s Kitajskim oblakom in omogoči pomembne protokole kot je na primer RTSP. Preko tega protokola lahko sliko kamere pošiljamo v poljuben NVR sistem, v mojem primeru v odprtokodni NVR projekt Frigate.
Frigate omogoča prepoznavo oseb, ampak to dela najučinkovitejše z uporabo namenskega pospeševalnika za računalniški vid Google Coral. V mojem primeru sem Mini PCIe vezijo pospeševalnika Coral vključil preko namenske PCI-E kartice v strežnik in sistemu Frigate omogočil dostop.
Mikrovalovni senzor prisotnosti se lahko naredi doma z uporabo mikrokontrolerja z ESP32 in senzorja LD2420 ali LD2410. Obstaja pa tudi kar nekaj ponudbe za končne uporabnike, na primer Aqara FP2. Z njim nimam izkušenj, ampak strici z interneta pravijo, da dela v redu.
Integracija v Home Assistant
Frigate, ki na podlagi realnočasovnega videa prepozna osebo, to informacijo pošlje preko v sistem Home Assistant preko uradne integracije.
S tem Home Assistant dobi podatke o prisotnosti na posamezno cono, če smo jih definirali. Primer za našo jedilnico:
ESP32 z LD2420 uporablja program ESPHome, ki se integrira z Home Assistant. Spodaj so entitete, ki jih pošilja v Home Assitant:
Implementacija logike
Avtomatika je sestavljena iz dveh delov:
- Sledenje prisotnosti s pomočjo obeh virov - kamera in mmWave senzor LD2410, implementirano v Appdaemon.
- Vklop in izklop luči glede na prisotnost iz točke 1.
Sledenje prisotnosti deluje tako:
- Za vsak prostor v bivalnem prostoru definiramo:
- ime izhodne entitete, ki predstavlja prisotnost osebe (
composite_entity
) - ime entitete mmWave senzorja (
mmwave_sensor
) - ime entitete prisotnosti glede na video (
cv_sensor
)
- ime izhodne entitete, ki predstavlja prisotnost osebe (
- Ko
cv_sensor
prepozna osebo iz videa, pokliče funkcijoon
, ki izhodni entiteticomposite_entity
nastavi vrednoston
. Ta vrednost predstavlja prisotnost osebe. Poleg tega, bo funkcija čez 10 sekund poklicala funkcijocheck()
. - Funkcija
check()
preveri, če je oseba še vedno prisotna s preverjanjem stausa obeh načinov prepoznave prisotnosti.- Če oba načina pravita, da osebe ni več, potem nastavi
composite_entity
naoff
. - Če vsaj eden od načinov trdi, da je oseba še vedno prisotna, nastavi ponovno preverjanje s ponovnim klicem funkcije
check()
čez 5 sekund.
- Če oba načina pravita, da osebe ni več, potem nastavi
Tako bo funkcija check()
klicala sama sebe dokler se oba načina zaznave ne strinjata, da osebe ni več v tem prostoru.
Koda, ki implementira zgornjo logiko:
|
|
Drugi del pa je vklop in izklop luči glede na kompozitno entiteto, ki je določena z zgornjo kodo. Za to uporabljam privzeti način avtomatizacije v Home Assistant.
Primer za izklop luči v jedilnici. Zelo podobno izgleda tudi za vklop in ostale prostore: