Már régebben is kísérleteztem WiFi jelenlét-érzékeléssel, ami mellesleg több fórumon is vissza-visszatérő téma. Azt előre kell bocsájtanom, hogy ha valaki az alapján akarja 100% biztonsággal megmondani, hogy ki van otthon, nagyot fog csalódni. Ugyanis a fogyasztás optimalizálása miatt a telefonok bizony gyakran lekapcsolják a wifi csatlakozásukat, és ilyenkor a rendszerünk azt fogja gondolni, hogy az eszköz távozott. Bizonyos esetekben mégis hasznos lehet ez a plusz információ, akár annak előjelzésére, hogy megérkeztünk a házunk közelébe (telefonunk általában még az előtt becsatlakozik a routerünkre, mielőtt mi magunk hazaérnénk) vagy arra is, hogy megmondjuk, ha valamely okoseszközünk nem elérhető, akár azért, mert elemes és ledöglött az eleme, akár kihúzta valaki a konnektorból a tápellátását, akár szándékos szabotázs miatt.
A problémát többféleképpen is megközelíthetjük, leggyakrabban úgy szokták, hogy IP cím szerint végigkérdezgetik (ping) a hálózaton levő eszközöket időnként (polling), hogy ott van-e, él-e még? Ez szerintem nem túl hatásos, vagy fogalmazzunk úgy: nem erőforrásbarát megoldás. A SOHO környezetben szokásos 255.255.255.0 alhálózaton maximum 254 eszköz is lehet, és nem feltétlenül sorban, így végigkérdezni minden lehetőséget egy darabig eltart, és feleslegesen terheli a (hálózati címkiosztást és kapcsolattartást intéző) Routert. Ha fix IP-re állítottunk mindent és tudjuk az IP címeiket, és csak azokat ping-eljük, az már egy fokkal gyorsabb megoldás, de még ezt sem tartom a legjobbnak.
Sokkal praktikusabb megoldásnak tartom azt, ha maga a Router közli egy erre kijelölt, pl MQTT szerverrel, amikor egy új eszköz jelent meg a hálózaton, vagy tűnt el onnan. Hiszen ő adja az IP címet! Az OpenWRT-re találtam is egy egyszerű szkriptet, a beállítása viszont igényel némi konzollal történő barátkozást.
(és bár nem lehetetlen a Raspberry Pi-re telepíteni az OpenWRT-t, de nem feltétlenül ez a legcélszerűbb megoldás, nem véletlenül vannak erre a célra optimalizált router-hardverek, én is így használom egy TP-Link routerrel)
Az OpenWRT-ről korábban írtam már, azóta a LEDE vonala újra egyesült az OpenWRT fő vonallal, ezen a néven fejlesztik tovább. Sokféle (de azért nem mindegyik) routerre feltehető, mint alternatív, gyártófüggetlen firmware. Miért jó egy független firmware? Nem szorítkozunk a gyártó által elérhetővé tett opciókra, szabadabban konfigurálható, és általában frissebb, védettebb rendszerhez is juthatunk, ha lecseréljük. (általában 2011-2013 között kiadott gyártói firmware-eket látok azokon a routereken, amikkel van szerencsém találkozni, 2020-ban) A gyártók 1-2 év után már nem igazán adnak ki frissítéseket a már eladott eszközeikre, abból ugyanis nem jön bevétel. A bevételt nyilván az új eszközök eladása hozza.
A szóban forgó szkript a beszédes "owrtwifi2mqtt" névre hallgat és itt érhető el:
https://github.com/dersimn/owrtwifi2mqtt
A presence_report fájlt letöltjük első körben a gépünkre, majd feltöltjük SCP protokoll segítségével az OpenWRT routerünkre a /usr/bin mappába.
Linux alatt, feltételezve, hogy a saját routerünk IP címe 192.168.1.1 így:
scp presence_report root@192.168.1.1:/usr/bin/
Windows alatt az ingyenes WinSCP segédprogrammal tehetjük ugyanezt.
Fontos lépés, hogy a felmásolt szkriptet tegyük futtathatóvá, SSH segítségével be kell lépnünk a routerre, Linux alatt ezzel a paranccsal:
ssh -l root 192.168.1.1
Windows alatt pedig pl a PuTTY segítségével.
Ha sikerült belépni a router konzolos felületére, az alábbi paranccsal tehetjük a szkriptet futtathatóvá:
chmod u+x /usr/bin/presence_report
Következő lépésben belépünk a routerünk adminisztrációs felületére (pl webböngésző segítségével, de egyébként a konzolon maradva opkg -val is telepíthetnénk ezeket...), és a Rendszer->Szoftver menüpont alatt megkeressük és telepítjük az alábbi két csomagot:
- mosquitto-client
- coreutils-nohup
Ha ezzel megvagyunk a Rendszer->Automatikus indítás (System->Startup) menüpont alatt szúrjunk be egy sort az 'exit' fölé, ami egy korábban már általunk telepített MQTT szerver IP címére küldi az értesítéseket. Legyen például ez most 192.168.1.100. (Emlékeztetőül: pl a mosquitto kínál MQTT szerver szolgáltatásokat, ez nem varázslatos módon magától keletkezik, nekünk kell telepíteni)
nohup /usr/bin/presence_report event 192.168.1.100 >/dev/null 2>&1 &
Ha ezzel megvagyunk és újraindítjuk a routerünket, hamarosan érkeznie kell az MQTT szerverünkre hasonló útvonalra az adatoknak:
owrtwifi/status/mac-00-00-00-00-00-00/event
A MAC cím a hálózati eszközök azonosítója, ami az IP címmel ellentétben nem változik, így alkalmas egyedi azonosításra. Hogy melyik eszköz micsoda, azt pl az OpenWRT webes felületén történt bejelentkezést követően a kezdőképernyőn alul ki tudjuk nézni egy táblázatból.
Az adat "new" ha új WiFi eszköz jelentkezett be a routerre, illetve "del", ha jelezte, hogy lecsatlakozik. (vagy letelt az időkorlát, amíg nem adott életjelet a routernek)
Domoticz esetében ezek feldolgozása nem annyira triviális, de összeütöttem gyorsan egy python plugint. (Ugyan NodeRed-el is meg lehetne ezt oldani, de feleslegesnek tartom még egy program telepítését, amikor a Domoticz-al mindent meg tudok oldani)
Mielőtt használatba tudnánk venni egy - bármilyen - python plugint, érdemes az alábbi paranccsal feltelepíteni a függőségeket a Domoticz szervergépre:
sudo apt-get install python3 libpython3.6 python3-dev git
Ha ez megvan, lépjünk be a Domoticz alatti plugins könyvtárba és töltsük le az owrtwifi2domo plugint:
cd domoticz/plugins
git clone https://github.com/enesbcs/owrtwifi2domo.git
Majd a Domoticz újraindítása után a hardverek között immár megtalálható a "OpenWRT Presence MQTT" eszköz. (Beállítás->Hardver) A fenti példánál maradva állítsuk be a 192.168.1.100 IP címet az MQTT szervernek (vagy 127.0.0.1 ha ugyanarra a gépre van telepítve):
Ha sikeresen belőttünk mindent, és az eszközök fel-le csatlakoznak, elkezdenek megjelenni a Beállítás->Eszközök alatt, "Nem használt"-ra állítva. Állítsuk ezeket használtra a zöld körben levő nyílra kattintva, majd elnevezve őket. Alapértelmezetten az eszköz MAC címe lesz a neve, amit a routerünk DHCP leases - IP cím - MAC összerendelés alapján tudunk visszafejteni. Az ikonjukat pedig a Kapcsolók menüben a kiválasztott eszköz melletti Szerkesztés lehetőségnél tudjuk változtatni.
A későbbiekben az automatizálásban a név alapján tudunk hivatkozni ezekre az eszközökre.
Meglepően gyorsan átjön a változás, készítettem egy szabályt, hogy mikor kikapcsolom a gépemet, kapcsolódjon fel a szobában a világítás, ha sötét van... és valóban a shutdown-ra kattintás után rögtön kapcsol is a világítás. Természetesen ezt más módon is meg tudtam volna oldani, azonban ennek a megoldásnak kliensoldalon semmi feltétele nincs, akármilyen operációs rendszer futhat a gépen...
A bejegyzés trackback címe:
Kommentek:
A hozzászólások a vonatkozó jogszabályok értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a Felhasználási feltételekben és az adatvédelmi tájékoztatóban.