Anwesenheit prüfen und abspeichern


05.04.2016  |  Smarthome Server, Tutorial

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
Dort wählst du links an der Seite die Datenbank "data.sqlite" aus und gibst anschließend unter dem Punkt "Create new table on database 'data.sqlite'" als Namen "userdata" und als Anzahl der Felder "3" ein, wie im Bild zu sehen.
Um die Anwesenheit zu speichern, musst du eine neue Tabelle erstellen.
Dann klickst du auf "Go", um zum nächsten Bildschirm zu gelangen. Nun definierst du die 3 Felder folgendermaßen: das erste Feld bekommt den Namen "USERNAME" und als Datentyp TEXT. Das zweite Feld nennst du "IP" und stellst als Datentyp ebenfalls TEXT ein. Dem letzten Feld wird als Name "AT_HOME" und als Datentyp INTEGER zugewiesen. Mit einem Klick auf "Create" wird die neue Tabelle dann erstellt.
Mit diesen Werten definierst du die Felder der Tabelle
Da in der neu erstellten Tabelle noch keine Reihen vorhanden sind, klickst du auf "Click here to insert rows" und gibst im nächsten Bildschirm einen Nutzernamen, die zugehörige IP-Adresse und als Anwesenheit 0 ein, um einen neuen Nutzer anzulegen. Die IP-Adresse befindet sich bei meinem Handy mit Android 4.4 unter Einstellungen -> WLAN -> Erweitert (die 3 Punkte unten Rechts) -> ganz unten unter dem Punkt "IP-Adresse". Als letztes muss noch die Bibliothek "fping" installiert werden, um Geräte anpingen zu können. Sie wird mit folgenden Befehlen installiert:
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
Im unteren Teil des Programmcodes werden die Nutzerdaten geladen, für jeden Nutzer die Anwesenheit geprüft und anschließend in die Datenbank geschrieben. Dann wird kurz gewartet und von vorn begonnen. Dies gescheht in einer Endlosschleife.

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
Im Terminal erhältst du jetzt in einer Endlosschleife für jeden Nutzer in der Datenbank die Ausgabe "[Nutzername] zuhause" beziehungsweise "[Nutzername] nicht zuhause". Um die Endlosschleife zu beenden, kannst du [STRG] + [C] drücken.

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
Falls sich die Datei nicht sofort öffnet und du stattdessen eine Meldung erhälst, das kein Texteditor ausgewählt wurde, drückst du die Eingabetaste. Anschließend öffnet sich die crontab-Datei und du fügst am Ende die folgende Zeile ein:
@reboot sudo python /var/www/html/python/check-anwesenheit.py
Anschließend speicherst du die Datei noch mit [STRG] + [X], bestätigst mit [J] und danach mit der Eingabetaste. Jetzt wird das Skript zur Anwesenheitserkennung bei jedem Start automatisch ausgeführt.

Das Tutorial als Video

Über den Autor


Sascha Huber

Hallo, ich bin Sascha, der Gründer von Smarthome Blogger.

Mit einer Leidenschaft für Technologie und einem Hintergrund als Software Engineer habe ich 2016 Smarthome Blogger gegründet. Mein Ziel war es schon immer, innovative Lösungen zu entdecken, die unser Leben einfacher und intelligenter gestalten können. In meinem beruflichen Leben arbeite ich täglich mit Software und Technik, aber auch in meiner Freizeit bin ich stets auf der Suche nach neuen technischen Spielereien und Möglichkeiten, mein Zuhause zu automatisieren und zu verbessern.

Auf Smarthome Blogger teile ich mein Wissen, meine Erfahrungen und meine Begeisterung für alles rund um das Thema Smarthome.



Dieser Beitrag hat dir gefallen?

Dann abonniere doch unseren Newsletter!