Uživatelské nástroje

Nástroje pro tento web


hlidani_pohovky_pred_psem_pomoci_wifi

Ochrana pohovky před domácím mazlíčkem pomocí wifi

Pokud chcete svého domácího mazlíčka odnaučit, aby chodil na pohovku, křeslo nebo podobně, můžete zkusit využít následující věc. Jedná se o neinvazivní opatření, při kterém svému pejskovi, nebo kočce nezkřivíte ani chlup a přitom je tato metoda účinná - navíc nemusíte přestavovat nábytek.

Princip je následující - na jednu stranu pohovky, nebo křesla umístíte wifi AP a na druhou stranu anténu wifi klienta (nebo celý notebook). Pokud mazlíček vstoupí na pohovku, mezi AP a klienta, tak se sníží zisk wifi klienta, který na základě toho přehraje předem zaznamenaný (trýznivý) zvuk. Ten mazlíčka z pohovky vyžene. Po několika pokusech to zvíře vzdá.

Měření zisku klienta je jednoduchým způsobem matematicky zpracováno, aby byl eliminován šum. Měření probíhá ve dvou fázích: Uspořádání hlídání pohovky před psem.

  1. Nejprve je po delší dobu (cca 15 sec) zaznamenáván zisk prázdné pohovky. Z těchto 300 naměřených hodnot se spočítá medián - máme tedy jednu střední hodnotu zisku, ke které přičteme 5 dB. Jedná se o hodnotu, která je získaná zkušeností. Při této hodnotě se nikdy nespustí alarm samovolně a přitom je celý systém dostatečně citlivý. Tím je stanovena hranice pro následující měření.
  2. V druhé fázi již měříme krátké cca 1 sec úseky síly signálu, což je 17 hodnot, které opět učešeme mediánem. Pokud je aktuálně naměřený medián vyšší než hodnota stanovená v 1. fázi, tak se spustí nějaká akce, v našem případě se přehraje zvuk. Snížením počtu měřených hodnot v tomto kroku zrychlíme odezvu, ale snížíme spolehlivost.

K realizaci budete potřebovat následující:

  • Wifi access point - může se jednat o starý wifirouter, který už nepoužíváte, mobilní telefon se zapnutým hotspotem atp.
  • Notebook, nebo PC s externí wifianténou, která se dá umístit na kraj pohovky. Vhodné by bylo například Raspberry Pi s wifi modulem.
  • OS Linux, mírná znalost skriptovacího jazyka BASH a čas k realizaci.

Postup realizace

Nahrání trýznivého zvuku

Několik různých zvuků budete potřebovat k odehnání mazlíčka z pohovky - proto by se mělo jednat o zvuky, na které výrazně reaguje. Osobně jsem zvolil kombinaci několika zvuků: cinkání klíčů, zvuk otevírání vstupních dveří, zvonění domovního zvonku, osobní domlouvání. To se setkalo s úspěchem a psa z pohovky vyžene. Zvuky nahrajte například pomocí mobilního telefonu a uložte do jednoho adresáře na klientském PC.

Nastavení wifi routeru

Wifi router restartujte a vytvořte na něm nový přístupový bod s WEP zabezpečením (tento druh šifrování jsem použil proto, že se ze shellu neumím připojit na WPA - pokud umíte vytvořte bezpečnější variantu). Zapište si heslo a umístěte router na jednu stranu pohovky. Anténu umístěte tak, aby pokud možno vyzařovala směrově ke klientovi. Mě postačilo pouze 5dB anténu položit do horizontální polohy.

Nastavení wifi klienta

Na PC klienta si vytvořte nový BASH skript, který je uveden níže a změňte hodnoty v části nastavení, na jeho začátku. Jedná se o základní podobu skriptu, která zajišťuje hlavní funkčnost. Rozšířené funkce jsou uvedeny v další kapitole. Konkrétní funkce jednotlivých částí jsou popsány v poznámkách. Kvůli zastavení služby Network Managera a dalším částem, je potřeba skript spouštět jako ROOT. Skript je otestován na Linuxové distribuci Fedora 20.

#!/bin/bash
 
# NASTAVENÍ - změňte na vlastní hodnoty
WIFI_ZARIZENI="wlp0s29f7u3"		# Ozančení použitého wifi zařízení.
SSID="wifi-scan"			# SSID wifi AP.
HESLO_WIFI="heslo"			# Heslo na wifi.
UZIVATEL="franta"			# Jméno neprivilegovaného uživatele (kvůli pulse audio).
ZVUKY_ADR="/home/franta/zvuky/"		# Absolutní cesta do adresáře s trýznivými zvuky.
 
# Definice dalších proměnných
M_START=300	# Počet jednotlivých měření, ze kterých se počítá medián hranice.
M=17		# počet jednotlivých měření při kontrole.
ROZDIL=5	# Hodnota, která se přidává k naměřené hranici mediánu, a která musí být překročena.
 
M_NASTAVENE=$M_START
 
clear
 
systemctl stop NetworkManager.service && echo "NM stop OK"	# Vypne Network Managera
sleep 1
 
rfkill unblock all && echo "rfkill OK"				# Zapne wifi
sleep 1
 
ip link set $WIFI_ZARIZENI up && echo "Link UP"			# Zapne wifi
sleep 1
 
iw $WIFI_ZARIZENI connect $SSID keys 0:$HESLO_WIFI && echo "Připojení k wifi OK"	# Připojí k wifi AP
sleep 1
 
echo "Zesiluju na max."
su $UZIVATEL -c "pactl set-sink-volume 0 -- 90000"					# Zesílí na max zvuk
 
echo "Začínám počítat hranici - "$M_START" cyklů."
 
while true; do						# Hlavní cyklus, kde jeden průběh se rovná jedné hodnotě mediánu
 
	DB_P=""
 
	for c in $(seq $M_NASTAVENE); do		# Cyklus, který se stará o nasbírání jednotlivých měření, ze kterých se později počítá medián.
 
		DATA_POLE=( $(cat /proc/net/wireless | grep "$WIFI_ZARIZENI") )
		DB=${DATA_POLE[3]}
		DB=${DB:1:2}
		DB_P="$DB_P$DB\n"
		sleep 0.05				# Hodnota je nastavena na nejnižší možnou, kdy se ještě síla naměřeného zisku mění.
 
	done
 
	# Výpočet mediánu z naměřených a sebraných hodnot z předešlého for cyklu.
	# K výpočtu se využívá program awk, do kterého se pošlou hodnoty z proměnné BD_P, oddělené enterem.
	# V prvním průchodu se vypočte medián hranice (dlouhé měření prázdné pohovky) a v dalších medián kontroly vstupu.
	DP="$(echo -e -n $DB_P | sort -n | awk ' { a[g++]=$1; } END { print a[int(g/2)]; }')"
 
	if [ "$M_NASTAVENE" == "$M_START" ]; then	# Pokud se jedná o první průchod..
 
		echo "Změřený medián je: "$DP
		HRANICE=$((DP+ROZDIL))			# K naměřenému mediánu z dlouhého měření se přičte další hodnota. Součet musí být překročen, aby..
		echo "Medián + rozdíl je: "$HRANICE
		M_NASTAVENE=$M
		echo $(date +"%d.%m.%y %H:%M:%S")"  Začínám skenovat."
 
	elif [ $DP -ge $HRANICE ]; then			# Pokud je naměřená HRANICE překročena, tak se provede následující.
 
		echo $(date +"%d.%m.%y %H:%M:%S")"  Překročeno! "$DP
		# Přehrání zvuku s právy neprivilegovaného uživatele z adresáře (náhodně jeden zvuk z adresáře).
		su $UZIVATEL -c "mplayer $ZVUKY_ADR'$(ls -1 $ZVUKY_ADR | shuf -n1)' &> /dev/null"
	fi
done
 
exit 0

Nyní máme vše připravené - umístíme tedy anténu klienta na druhou stranu pohovky a zatížíme proti posunutí (v takovém případě hrozí neplánované spuštění). Spusťte skript a po vypsání aktuálního času a hlášky „Začínám skenovat“ můžete vyzkoušet, zda vše funguje. Položte ruku na pohovku, mezi antény - měl by se ozvat vámi nahraný zvuk. Na obrazovce se také vypíše hláška o překročení limitu.

Pokud vše funguje správně, tak by to mělo vypadat jako na následujícím videu: Automaticky pořízená fotografie.

Z vlastní zkušenosti vím, že stačí pomocí toho nástroje přistihnout psa na pohovce 2x a už si na pohovku netroufne. Na stejném principu se při správném vyladění dá postavit univerzální závora. Jde o to, že signál je dobře pohlcován živou tkání.

Rozšířené funkce wifiklienta

Když je zajištěna hlavní funkce „odchytu“, můžeme si skript rozšířit o další zajímavé věci. Pro své potřeby jsem zařadil následující funkce:

  • Web server, na kterém je vidět log ze skriptu a tedy záznam z případných překročení.
  • Pořizování fotografií pomocí webové kamery na notebooku a umisťování do složky dostupné vzdáleně přes web server.
    • Průběžné fotografování - 1 fotka za půl hodiny. Slouží k ověření funkčnosti.
    • Fotografie při překročení, tedy v době, kdy by měl být mazlíček na pohovce - touto funkcí je pořízena fotografie vpravo.
  • Pojistka proti neustálému přehrávání nelibých zvuků, kdyby nedopatřením došlo k posunu routeru, nebo antény klienta.

Rozšířený okomentovaný skript ke stažení naleznete níže. Předpokládá, že máte zprovozněný web server na klientském PC a zajištěnou konektivitu přes veřejnou IP (nastavený forwarding na routeru atp.). Opět platí, že si musíte přepsat proměnné v části nastavení. Log si přesměrujte pomocí tee do souboru přístupného web serverem.

#!/bin/bash
 
# Nastavení - změňte na vlastní hodnoty
WIFI_ZARIZENI="wlp0s29f7u3"		# Ozančení použitého wifi zařízení.
SSID="wifi-scan"			# SSID wifi AP.
HESLO_WIFI="heslo"			# Heslo na wifi.
UZIVATEL="franta"			# Jméno neprivilegovaného uživatele (kvůli pulse audio).
ZVUKY_ADR="/home/franta/zvuky/"		# Absolutní cesta do adresáře s trýznivými zvuky.
FOTKY_ADR="/var/www/html/fotky/"	# Absolutní cesta k adresáři, kam se budou ukládat fotky. Adresář musí existovat. POZOR - všechny jpg soubory budou zde smazány.
 
# Definice dalších proměnných
M_START=300				# Počet jednotlivých měření, ze kterých se počítá medián hranice.
M=17					# počet jednotlivých měření při kontrole.
ROZDIL=5				# Hodnota, která se přidává k naměřené hranici mediánu, a která musí být překročena.
POJISTKA=30				# Pojistka proti šílenství. Maximální počet poplachů - pojistka proti posunu. Pokud je překročeno, vypne se zvuk.
 
POPLACHU=0
M_NASTAVENE=$M_START
 
# Definice funkcí
function funkce_nahravani () {					# Každou půlhodinu udělá fotku nezávisle na následujícím.
	while true; do
		fswebcam -d V4L2:/dev/video0 -r 640x480 -i 0 -p YUYV --jpeg 95 -S 3 -q "$FOTKY_ADR"$(date +"%y%m%d_%H%M%S").jpg &> /dev/null
		sleep 30m
	done
}
 
clear
 
cd "$FOTKY_ADR"
 
systemctl start httpd && echo "Start HTTP serveru OK"		# Zapne appache server
sleep 1
 
systemctl stop NetworkManager.service && echo "NM stop OK"	# Vypne Network Managera
sleep 1
 
rfkill unblock all && echo "rfkill OK"				# Zapne wifi
sleep 1
 
ip link set $WIFI_ZARIZENI up && echo "Link UP"			# Zapne wifi
sleep 1
 
iw $WIFI_ZARIZENI connect $SSID keys 0:$HESLO_WIFI && echo "Připojení k wifi OK"	# Připojí k wifi AP
sleep 1
 
echo "Zesiluju na max."
su $UZIVATEL -c "pactl set-sink-volume 0 -- 90000"		# Zesílí na max zvuk
 
rm -rf "$FOTKY_ADR"*.jpg && echo "Mažu staré fotky."		# Smaže všechny staré fotky.
 
echo "Začínám počítat hranici - "$M_START" cyklů."
while true; do							# Hlavní cyklus, kde jeden průběh se rovná jedné hodnotě mediánu.
 
DB_P=""
 
	for c in $(seq $M_NASTAVENE); do			# Cyklus, který se stará o nasbírání jednotlivých měření, ze kterých se později počítá medián.
 
		DATA_POLE=( $(cat /proc/net/wireless | grep "$WIFI_ZARIZENI") )
		DB=${DATA_POLE[3]}
		DB=${DB:1:2}
		DB_P="$DB_P$DB\n"
 
		#DC=$((DB-50))					# Odstraňte poznámky a skript bude vykreslovat změřené hodnoty.
		#for i in $(seq $DC); do
		#	echo -n '▬';
		#done
		#echo " -"$DB" "$(date +%S)
 
		sleep 0.05					# Hodnota je nastavena na nejnižší možnou, kdy se ještě síla naměřeného zisku mění.
	done
 
	# Výpočet mediánu z naměřených a sebraných hodnot z předešlého for cyklu.
	# K výpočtu se využívá program awk, do kterého se pošlou hodnoty z proměnné BD_P, oddělené enterem.
	# V prvním průchodu se vypočte medián hranice (dlouhé měření prázdné pohovky) a v dalších medián kontroly vstupu.
	DP="$(echo -e -n $DB_P | sort -n | awk ' { a[g++]=$1; } END { print a[int(g/2)]; }')"
 
	if [ "$M_NASTAVENE" == "$M_START" ]; then		# Pokud se jedná o první průchod..
 
		echo "Změřený medián je: "$DP
		HRANICE=$((DP+ROZDIL))
		echo "Medián + rozdíl je: "$HRANICE
		M_NASTAVENE=$M
		echo $(date +"%d.%m.%y %H:%M:%S")"  Začínám skenovat a nahrávat."
		funkce_nahravani &				# Průběžně se dělají znímky pomocí připravené funkce.
 
	elif [ $DP -ge $HRANICE ]; then				# Pokud je naměřená HRANICE překročena, tak se provede následující.
 
		POPLACHU=$((POPLACHU+1))
		wait %2 &> /dev/null
		fswebcam -d V4L2:/dev/video0 -r 640x480 -i 0 -p YUYV --jpeg 95 -S 2 -q $FOTKY_ADR$POPLACHU.jpg &
		echo $(date +"%d.%m.%y %H:%M:%S")"  Překročeno! "$DP" po: "$POPLACHU
		# Přehrání zvuku s právy neprivilegovaného uživatele z adresáře (náhodně jeden zvuk z adresáře). Ale pouze pokud počet poplachu nepřekročil pojistku.
		[ $POPLACHU -lt $POJISTKA ] && su $UZIVATEL -c "mplayer $ZVUKY_ADR'$(ls -1 $ZVUKY_ADR | shuf -n1)' &> /dev/null"
	fi
done
 
exit 0
hlidani_pohovky_pred_psem_pomoci_wifi.txt · Poslední úprava: 28. 01. 2015 autor: honya

Nástroje pro stránku