Hallo
Mein Geofencing Lite für’s WLAN ist nun bei mir daheim am Start. Auf einen Raspberry läuft ein durch die Crontab getriggertes Script was versucht die im WLAN befindlichen Smartphones zu finden. Ändert sich der Erreichbarkeitsstatus wird je ein Webhook aufgerufen für Ankommen und Verlassen.
Ich habe es in /root/homee_hostwatchdog/ installiert. Es besteht im wesentlichen aus dem Script selbst (homee_hostwatchdog.sh), der Konfigurationsdatei (homee_hostwatchdog.conf) und einem leeren Verzeichnis (statfiles) in dem Statusdateien abgelegt werden.
./statfiles/
./statfiles/statfile.petra (wird generiert)
./statfiles/statfile.marcus (wird generiert)
./homee_hostwatchdog.conf (Configdatei)
./homee_hostwatchdog.sh (Skript)
In der Konfigdatei für jeden Homee User der “überwacht” werden soll einen Eintrag bestehend aus dem Homee-User-Namen und dem Namen oder IP des jeweiligen Smartphones durch Komma getrennt.
USERNAME,GERÄT
z.B.
marcus,iphone-marcus
alicia,iphone-alicia
petra,android-petra
Dann muss es korrespondierend auf dem Homee für jeden User zwei Webhooks geben einen wenn er kommt und einen wenn er geht. USERNAME muss durch den jeweiligen Usernamen ersetzt werden.
anwesenheit_USERNAME_on
anwesenheit_USERNAME_off
z.B.
anwesenheit_marcus_on
anwesenheit_marcus_off
anwesenheit_petra_on
anwesenheit_petra_off
Hier das Script ansich. Die Parameter bei ‘Anzupassende Werte’ müssen angepasst werden gemäß der eigenen Webhook URL.
#!/bin/bash
# Name: homee_hostwatchdog.sh
# Nutzen: Ermittelt die Erreichbarkeit von IP Adressen im Netz
# Ändert sich der Status der Erreichbarkeit wird ein Webhook angetriggert.
# Version: 0.3 23.10.2016
# Autor: Marcus Jüttner
# Dokumaentation:
# base: Wo liegt das Skript im Dateisystem (Verzeichnis)
# webhook_url: der reine URL Anteil im Webhook
# webhook_key: Der reine Key Anteil im Webhook
#
# Webhook: Für jeden User muss ein Anwesenheits- und Abwesenheits-Webhook eingerichtet werden mit folgendem Namen
# anwesenheit_USERNAME_on
# anwesenheit_USERNAME_off
# Voraussetzungen:
# nmap muss installiert sein (apt install nmap)
# -----------------------------------------------------------------------------------
# Anzupassende Werte
base=/root/homee_hostwatchdog
webhook_url='https://xxxxxxxxxxxxx.hom.ee/api/v2/webhook_trigger'
webhook_key='XXXXXXXXXXXXXXXXXXGTEMHKLIREKHUTXXXXXXXXXXXXXDQWEQQEXXXXXXXXXXXXX'
# -----------------------------------------------------------------------------------
# Interne Werte
statefile=${base}/statfiles/statfile
conffile=${base}/homee_hostwatchdog.conf
counter=0
if [ -e /var/run/homee_hostwatchdog ]; then
echo "Es läuft noch ein Prozess"
exit
else
touch /var/run/homee_hostwatchdog
fi
# Check ob Statfiles Verzeichnis vorhanden
if [ -d "${base}/statfiles/" ]; then
echo "OK:Verzeichnis existiert"
else
mkdir "${base}/statfiles/"
if [ $? -ne 0 ]; then
echo "Fehler: Anlegen Verzeichnis ${base}/statfiles/"
exit 1
rm /var/run/homee_hostwatchdog
fi
fi
# Check ob Config File vorhanden
if [ ! -e "$conffile" ]; then
echo "Fehler: Konfigfile nicht vorhanden"
exit 1
rm /var/run/homee_hostwatchdog
fi
cat $conffile | egrep -v '^#' | while read users_entry; do
username=`echo $users_entry | cut -d ',' -f 1`
address=`echo $users_entry | cut -d ',' -f 2`
echo "user: $username"
echo "address: $address"
# Statusfiles anlegen falls nicht vorhanden
if [ ! -e ${statefile}.${username} ]; then
touch ${statefile}.${username}
fi
# Letzten Status ermitteln
content=`cat ${statefile}.${username}`
if [ "$content" == "on" ]; then
last_state=on
else
last_state=off
fi
echo "last state: $last_state"
# Aktuellen Status ermitteln nmap
echo -n "suche: "
while [ $counter -lt 60 ]; do
nmap -Pn $address -p 62078 | grep '1 host up' > /dev/null 2>&1
if [ $? -eq 0 ]; then
current_state=on
break
else
current_state=off
fi
let counter=counter+1
echo -n "."
sleep 2
done
if [ $current_state == "on" ]; then
echo " :-)"
elif [ $current_state == "off" ]; then
echo " :-("
fi
echo "current state: $current_state"
counter=0
# Homee triggern und Status speichern
if [ "$last_state" == "off" ] && [ "$current_state" == "off" ]; then
echo "result: stayed off"
echo 'off' > ${statefile}.${username}
elif [ "$last_state" == "on" ] && [ "$current_state" == "on" ]; then
echo "result: stayed on"
echo 'on' > ${statefile}.${username}
elif [ "$last_state" == "off" ] && [ "$current_state" == "on" ]; then
echo "result: swtched to on"
echo 'on' > ${statefile}.${username}
curl "${webhook_url}?webhooks_key={$webhook_key}&event=anwesenheit_${username}_on"
elif [ "$last_state" == "on" ] && [ "$current_state" == "off" ]; then
echo "result: swtched to off"
echo 'off' > ${statefile}.${username}
curl "${webhook_url}?webhooks_key={$webhook_key}&event=anwesenheit_${username}_off"
fi
echo "----------"
done
rm /var/run/homee_hostwatchdog
Das Skript kann dann über diesen Crontab Eintrag minütlich laufen
* * * * * /root/homee_hostwatchdog/homee_hostwatchdog.sh > /dev/null 2>&1
Die Erkennung läuft über einen Port der auch bei schlafenden IPhones zumindest nach mehreren Versuchen antwortet. Ich habe es getestet mit IOS 10 und einem älteren Android 4.x. Das hier ist natürlich nur was für Leute mit etwas Linux und Netzwerk Erfahrung. Wenn man im Heimischen DHCP keine festen IP’s zuweist sollte man unbedingt mit dem Namen und nicht der IP arbeiten.
Bye
Marcus