Manchmal ist es sinnvoll, wenn man weiß, welche Nutzer sich gerade im Haus aufhalten, um Befehle abhängig von der Anwesehenheit der Nutzer auszuführen. Die Anwesenheitserkennung lässt sich relativ leicht mit eurem Smartphone realisieren. Der Status kann anschließend in eine Datenbank eingetragen werden, um ihn später in bedingten Befehlen zu verwenden (z.b. wenn eine Aktion nur ausgeführt werden soll, wenn niemand zuhause ist). Um die Anwesenheit zu prüfen, wird die IP-Adresse des jeweiligen Handys angepingt und je nach Erreichbarkeit in die Datenbank geschrieben. Dazu wird heute ein einfaches Skript angelegt. Bevor du allerdings mit der Programmierung beginnen kannst, musst du dir noch eine Tabelle für die Nutzerdaten in der Datenbank anlegen.
Vorbereitung: neue Tabelle erstellen
Um die Tabelle anzulegen und einzurichten, öffnest du phpLiteAdmin. Dazu rufst du folgende URL auf:http://[IP DES PI]/database/phpliteadmin.php
sudo apt-get update
sudo apt-get install fping
Die Anwesenheit mit Skript prüfen
Um das Skript anzulegen, erstellst du per FTP im Server-Hauptverzeichnis einen Ordner namens "python", in dem die Python-Skripte abgelegt werden. In diesem Ordner erstellst du nun die Datei "check-anwesenheit.py". In diese Datei gibst du nun folgenden Programmcode ein (der Code wird weiter unten erklärt):#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import sqlite3 as lite
import time
import os
con = lite.connect('/var/www/html/database/data.sqlite')
#Daten aus Datenbank laden
def getData():
with con:
cur = con.cursor()
cur.execute("SELECT * FROM userdata")
return cur.fetchall()
#IP anpingen und Ergebnis in Datenbank schreiben
def checkAnwesenheit(name, ip):
if os.system("fping -t 250 "+ip) == 0:
print name+": zuhause"
home = True
else:
print name+": nicht zuhause"
home = False
cur = con.cursor()
#Wert in Datenbank schreiben
cur.execute("UPDATE userdata SET AT_HOME = :home WHERE USERNAME = :name", {"home": home, "name": name})
con.commit()
#Endlosschleife
while True:
#Alle Nutzer aus Datenbank laden und für jeden die Anwesenheit prüfen und abspeichern
for data in getData():
checkAnwesenheit(data[0], data[1]) #data[0] ist Nutzername und data[1] die IP-Adresse
time.sleep(1)
Erklärung des Programmcodes
Das Programm besteht aus den folgenden 2 Funktionen:- getData() - lädt Nutzerdaten aus Datenbank
- checkAnwesenheit(name, ip) - pingt IP des Nutzers an und schreibt Ergebnis in Datenbank
Skript testen
Um zu testen, ob das Skript korrekt funktioniert, öffnest du die Kommandozeile, wechselst in das Verzeichnis der Python-Skripte und führst das Skript aus.cd /var/www/html/python
sudo python check-anwesenheit.py
Bei Systemstart automatisch ausführen
Damit du das Skript nicht nach jedem Hochfahren des Raspberry manuell starten musst, kannst du dir einen Cronjob anlegen. Ein Cronjob führt benutzerdefinierte Befehle zur gewünschten Zeit aus. Bei der Zeitauswahl gibt es viele Möglichkeiten (z.b. bei Systemstart, bestimmte Uhrzeit, Datum, Wochentag und viele mehr), in unserem Fall ist die Ausführung bei Systemstart die sinnvollste Wahl, da es dank der Endlosschleife nur einmal gestartet werden muss. Um einen Cronjob anzulegen, öffnest du zunächst die crontab-Datei.crontab -e
@reboot sudo python /var/www/html/python/check-anwesenheit.py
Das Tutorial als Video
Dieser Beitrag hat dir gefallen?
Dann abonniere doch unseren Newsletter!