Anwesenheitserkennung per SSH
Für unsere Homematic nutzten wir bisher das hm_pdetect Addon in Verbindung mit unserer Fritz!Box. Dieses prüft über eine API, ob bestimmte Hosts mit der Fritz!Box verbunden sind und speichert das Ergebnis in Variablen auf der Homematic. Da dieses Addon mit dem DrayTek Router nicht mehr nutzbar war, haben wir auf dem Raspberry eine simple Variante entwickelt, die wir an dieser Stelle veröffentlichen möchten. Das Script besteht grundlegend aus zwei Scripten - einmal einem normalen Bash-Script und zum automatisierten SSH-Login auf dem Router über ein expect-Script. Folglich muss expect auch installiert und nutzbar sein.
Das bash-Script benötigt eine kurze Konfiguration: Zum einen werden die MAC-Adressen der W-Lan Geräte, die abgefragt werden sollen, benötigt. Zum anderen müssen die zugehörigen ID-Werte aus der Homematic XML-API eingetragen. Hinter der Variable base_ip verbirgt sich die IP, unter der die Homematic inklusive der XML-API erreichbar ist.
wrapper.sh
#!/bin/bash
mac=(xx:xx:xx:xx:xx:xx xx:xx:xx:xx:xx:xx xx:xx:xx:xx:xx:xx)
ise_id=(4782 5445 5444)
ise_id_global=4785
global=false
base_ip="192.168.178.4"
${BASH_SOURCE%/*}/expect.sh > ${BASH_SOURCE%/*}/temp.raw
total=${#mac[*]}
for (( i=0; i<=$(( $total -1 )); i++ ))
do
if grep -q -c1 "${mac[$i],,}" ${BASH_SOURCE%/*}/temp.raw; then
echo "${mac[$i],,} is online"
wget "https://$base_ip/config/xmlapi/statechange.cgi?ise_id=${ise_id[$i]}&new_value=1" --no-check-certificate -q -O /dev/null -o /dev/null
global=true
else
echo "${mac[$i],,} is offline"
wget "https://$base_ip/config/xmlapi/statechange.cgi?ise_id=${ise_id[$i]}&new_value=0" --no-check-certificate -q -O /dev/null -o /dev/null
fi
done
if ${global}; then
wget "https://$base_ip/config/xmlapi/statechange.cgi?ise_id=${ise_id_global}&new_value=1" --no-check-certificate -q -O /dev/null -o /dev/null
else
wget "https://$base_ip/config/xmlapi/statechange.cgi?ise_id=${ise_id_global}&new_value=0" --no-check-certificate -q -O /dev/null -o /dev/null
fi
Das Bash-Script ruft wiederrum die expect.sh auf. Diese übernimmt die automatisierte Anmeldung am Router per SSH und die nötige Abfrage von W-LAN Geräten. Hier muss das Passwort und die IP des Routers angepasst werden. Im Falle der SSH-Verbindung ist der Parameter -c 3des-cbc nötig, da sonst kein Verbindungsaufbau möglich war.
expect.sh
#!/usr/bin/expect -f
spawn ssh Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein. .1 -c 3des-cbc
expect "password:"
send "pass\r"
expect "DrayTek>"
send "wl stalist show\r"
expect "DrayTek>"
send "wl_dual stalist show\r"
expect "DrayTek>"
send "exit\r"
close
Letzten Endes wird der Aufruf der wrapper.sh als cron eingetragen, welcher alle 30 Sekunden ausgeführt wird. Hierbei muss man sich eines kleinen Kniffs bedienen, da crontabs auf Linux eigentlich nur jede Minute ausgeführt werden können.
* * * * * /home/pi/wifi-scan/wrapper.sh >/dev/null 2>&1
* * * * * (sleep 30; /home/pi/wifi-scan/wrapper.sh >/dev/null 2>&1)