DoorPI Türöffner per Bluetooth Anwesenheitserkennung über IP-Symcon aktivieren

09. Aug
2018
geschrieben von Roland Meier

Ein Leser brachte mich beim letzten Gespräch auf die Idee, an der Haustüre einen Mechanismus einzubauen, welcher uns die Türe automatisch öffnet.

Sein Szenario, wir stehen mit vollem Gepäck vor der Türe und müssten erst den Schlüssel heraussuchen.
Prima, würde die Türe nun automatisch erkennen dass wir es sind und aufgehen.

 

Aber wie genau sollten wir das umsetzen? Weder ein Zahlenfeld für die Eingabe eines Codes noch andere Sensoren wie Fingerabdruck sind an unserer DoorPI Türstation vorhanden.

 

Gegebenheiten und Möglichkeiten der Anwesenheitserkennung

In unserem Fall sind in der Außenstation lediglich 3 Taster sowie eine Kamera.

Mit einer RFID Antenne und entsprechenden Schlüsseln könnte ich die Außenstation erweitern, wollte ich aber nicht, denn dann müssten wir ja wieder ein Teil heraussuchen und an die Antenne halten:

Anzeige
RFID Transponder
Anzeige
RFID Reader

 

In unmittelbarer Nähe ist jedoch der Raspberry PI 3 mit der DoorPI Software. Hier habe ich bereits Bluetooth sowie WLAN.

 

Die Erkennung über WLAN läuft zwar bereits bei uns, diese erkennt aber lediglich ob ein Gerät vorhanden ist oder nicht.
Es wird nicht erkannt, wo sich das Gerät befindet.

Realisiert wurde dies mit dem FritzBox-Project des Benutzers Nall-chan aus dem Symcon Forum.
Dabei setze ich eine Variable z.B. "Roland anwesend" bei Aktualisierung des entsprechenden Hosts vom FritzBox-Project. In meinem Fall mein Samsung S8 Handy.

 

Deshalb spielte ich etwas mit dem Bluetooth Modul was der Raspberry bereits eingebaut hat.
Mit Bluetooth kann der RSSI Wert die Feldstärke bzw. grob die Distanz erkennen. Scheint perfekt.

 

Bluetooth Gerätescan & Signalauswertung am Raspberry PI

Als erstes müssen natürlich die Bluetooth Treiber und notwendigen Pakete installiert werden. Einige davon sind normal bereits vorhanden:

sudo apt-get install bluez python-bluez

 

Python & PIP waren bei mir auch bereits vom DoorPI installiert:

sudo apt-get install python-dev python-requests terminaltables

PythonRequests wurden nachinstalliert, sie werden benötigt um die Symcon-JSONRPC über CURL anzusprechen, mit TerminalTables können schönere Ausgaben auf der Konsole erzeugt werden.

 

Nun gehts an die ersten Bluetooth Schritte:

hcitool dev     # zeigt die GeräteID der vorhandenen Bluetooth Empfänger
hcitool scan # zeigt die GeräteIDs in Reichweite inkl. deren Namen

 

Vor allem letztere sind für die weitere Arbeit am Python Skript notwendig.

 

Python Skript auf dem Raspberry für die Anwesenheitserkennung per Bluetooth

Das neue Python Skript habe ich in meinen Skripte Ordner erstellt, wo auch bereits mein Skript zur WLAN Netzwerkerkennung liegt.

Ich nenn es einfach mal bluecheck.py welches Ihr hier auch herunterladen könnt.

Vor der Nutzung, müsst Ihr die Datei noch für euch anpassen, vor allem die GROSSGESCHRIEBENEN Parameter:

  • umbenennen der Dateierweiterung von txt nach py
  • setzen des Symcon-Benutzernamens in Zeile 27
    ACHTUNG! @ darf hier nicht geschrieben werden da es ein Sonderzeichen ist, es muss der Code %40 anstelle von @ verwendet werden!
  • setzen des Symcon-Passworts und der IP in gleicher Zeile 27
  • füllen des Arrays ab Zeile 31 mit Gerätename, Geräte-ID und die Symcon Variablen IDs

Das Array könnt ihr natürlich auch beliebig erweitern, denkt aber daran, dass sich mit längerer Liste auch die Laufzeit der nachfolgenden While Schleife verlängert.
Sie ist mit 2 Geräten bereits bei ca. 2-3 Sekunden pro Durchlauf, mit meiner Erkennung welche ich nachfolgend etwas beschreibe, braucht der Raspberry gute 5-8 Sekunden um mein Handy zu erkennen und das Flag zu setzen.

In meinem Fall ausreichend bis ich die Treppe hochkomme und den Taster betätige.

 

Beschreibung des bluecheck.py Skripts

In den ersten Zeilen importiere ich lediglich die Klassen, welche ich für die nachfolgende Funktion benötige.

Ab Zeile 19 beginnen die Einstellungen, mit dem Debug Flag kann ich während der Einrichtung eine Ausgabe der Arrays und Aktionen erzeugen.
Es folgt die IP-Symcon Anbindung, das Array der Geräte auf die geprüft werden soll und eine anschließende "Initialisierung". Diese stellt vor allem sicher, dass die Symcon Variablen die korrekten Startwerte haben.
Die Geräte-ID bekommt ihr mit obigen hcitool scan Befehl.

Ab Zeile 50 habe ich die Funktion, welche die Feldstärke des Gerätes ausliest.

Ab Zeile 85 kommt dann die eigentliche Funktion, schön in einem Ctrl-C Sigint verpackt, um das Skript auch wieder sauber zu beenden.
Vor allem im "finally:" Teil werden die Variablen im Symcon wieder auf den Ausgangswert gesetzt.
Das muss aber so nicht sein, wenn das Skript z.B. sich aufhängt oder der Raspberry neu startet, deshalb beim Beenden sowie beim Initialisieren.

So und was geschieht während das Skript läuft?
Die While Schleife läuft endlos, direkt darin lese ich sequentiell die verfügbaren Geräte vom Array.
Die erste Aktion ist natürlich den RSSI Wert zu bekommen. Dieser befindet sich je nach Nähe bzw. Feldstärke zw. 0 und -255 bzw. None wenn gar nicht in Nähe.
Ab Zeile 93 wird es interessant, wenn das Gerät näher als -10 ist, was in meinem Fall ca. das Treppenareal umfasst, dann zähle die Zählervariable hoch. Ist Debug aktiv, wird dies auch an Symcon geschickt.
In jeden Fall wird das "Anwesend" Flag erst bei >1 (Zeile 101) geschickt, heißt also beim 2. Durchlauf in Reichweite wird das Gerät auf "Nahe / Near" gesetzt und das Symcon Update geschickt.
Ab Zeile 106 folgt dann die Aktion, wenn es wieder außer Reichweite ist + das Flag auf Nahe steht. Dann wird alles wieder zurückgesetzt.

Mit den zusätzlichen Abfragen nach der Near-Variable stelle ich sicher, dass nicht ständig irgendwelche Werte im Netzwerk herumgeschickt werden, sondern nur dann und nur einmal, wenn sich auch wirklich was ändert.

Am Ende sicherheitshalber noch 1s Wartezeit, was natürlich auch die Laufzeit vorgbit.

 

Skript starten bzw. in den Raspberry Autostart legen

Das Python Skript kann mit folgendem Befehl gestartet werden. Sofern das Debug-Flag auf 1 steht seht ihr auch die Ausgabe:

python bluecheck.py

Mit Strg-C könnt ihr das Skript sauber beenden.

 

Sofern das Skript automatisch beim Start des Raspbierry gestartet werden soll, kann dies in die rc.local geschrieben werden:

mcedit /etc/rc.local

python /scipts/bluecheck.py &

 

Das & am Ende sorgt dafür, dass der Raspberry nicht in der Endlosschleife hängen bleibt und vollständig bootet

Die Zeile müsst ihr VOR  der exit 0 Zeile einfügen!

 

WLAN Probleme bei laufendem Skript

Nun hatte ich das Problem, dass ich extreme Verbindungsprobleme zum Raspberry bekam, wenn das Skript läuft:

ping schreibtisch

 

Oftmals riss diese komplett ab bzw. erzeugte eine Zeitüberschreitung.

Bei genauerem hinsehen merkt man, dass die Verbindungsprobleme immer dann kommen, wenn von einem Gerät die RSSI per Bluetooth gesucht wird. Nach einiger Recherche im Netz, fand ich dann auch ähnliche Probleme, dass sich WLAN & Bluetooth am Raspberry gerne gegenseitig stören.

Meine erste Lösung war ein USB Bluetooth Dongle.

Meine finale Lösung war jedoch ein USB WLAN Dongle, da irgendwie mein alter Bluetooth Dongle die RSSI Werte nicht so schön lieferte wie der eingebaute Chip auf dem Raspberry.

Sobald ich den WLAN Stick angesteckt hatte, hat der Raspberry wohl automatisch sein Netz darüber bezogen. Dennoch habe ich sicherheitshalber das WLAN Modul am Raspberry deaktiviert:

sudo mcedit /etc/modprobe.d/raspi-blacklist.conf

# WLAN abschalten
blacklist brcmfmac
blacklist brcmutil
#blacklist cfg80211
#blacklist rfkill

 

Danach lief das Skript reibungslos, ohne die Ping-Zeiten zu beeinflussen.

 

Unbemerkte Python Programmabstürze überprüfen

Nach einigen Tagen konnte ich ab und an feststellen, dass an der Türe keine Reaktion der Variablen stattfand. Ein Blick auf die Raspberry Konsole zeigte, dass das Python Skript nicht mehr lief.

pgrep python

 

Ähnlich wie beim Skript zur WLAN-Erkennung habe ich ein bluechek.sh Skript geschrieben, welches ich alle 10 Minuten aufrufe.
Das Skript überprüft mir, ob es eine ProzessID mit dem Python Skript gibt und wenn nicht, startet es das Skript neu. Zusätzlich werde ich darüber per Mail benachrichtigt:

#!/bin/bash
# Check if bluechek.py script is running and restart if not.
# @author Roland Meier
today=`date +"%Y%m%d_%H%M"`
pgrep python > /dev/null
if [ $? != 0 ]
then
python /root/scripts/bluecheck.py &
echo $today: "BlueCheck.py not available... restart..."
echo "BlueCheck.py restarted..." | mailx -s "BlueCheck.py restart"
fi

 

IP-Symcon Variablen zur Anwesenheitserkennung

Auf Seiten IP-Symcon habe ich in meiner Status-Kategorie für jedes Handy 3 neue Variablen angelegt:

  • "In Reichweite" = Boolean mit Profil ~Presence
  • "Counter" = String
  • "RSSI" = String

 

Die IDs der neuen Variablen habe ich im Python Skript eingetragen, damit sie auch entsprechend aktualisiert werden.

 

Im WebFront sieht es bei mir so in der Status-Seite aus:

status anwesenheit

 

Und so siehts auf der Haustür-Seite im IP Symcon WebFront aus:

haustuere anwesenheit

 

Programme & Aktionen bei Anwesenheit an der Tür

Meine erste "einfache" Version ist die Abfrage nach einem der Reichweite-Flags + Lichttaster:
Neues Ereignis auf die Klingeltaster-Variable und bestimmten Wert True, dann führe folgenden Code aus:

if (GetValue(NICOLE-REICHWEITE-ID) == true OR GetValue(ROLAND-REICHWEITE-ID) == true)
{
IPS_RunScript(TÜRÖFFNEN-SKRIPT-ID);
}
else
{
IPS_RunScript(GONG-SIPRUF-SKRIPT-ID);
}

 

Eine weitere Idee wäre, wenn eines der Geräte in Reichweite, dann aktiviere das Mikrofon und wenn ein "Öffnen" gesprochen wird, öffne...

Was ich auch noch versuchen möchte, dass IP-Symcon über den DoorPI Lautsprecher einen Begrüßungstext, je nachdem wer von uns draußen steht, sagt.

Vermutlich werden mir noch einige andere Dinge dazu einfallen, die Grundlagen sind soweit mal gelegt.

 

Gelesen 10194 mal Letzte Änderung am Freitag, 07 Juni 2019
Artikel bewerten
(6 Stimmen)

2 Kommentare

  • Thomas 30. Dez 2020
    gepostet von Thomas

    Hallo,
    irgendwie erkennt mein Raspberry Pi Zero nicht alle Bluetooth Geräte in der Nähe. Woran kann das liegen? Ich dachte immer, dass alle Geräte angezeigt werden, egal ob diese eine Einstellung sichtbar oder nicht sichtbar haben. Hauptsächlich geht es mir um unsere Mobiltelefone.

  • Michael 28. Jan 2019
    gepostet von Michael

    Hallo,
    Ich habe Hardwarelösung für Anwesenheitserkennung mit iBeacon und Relais als Elektronik Bastelprojekt auf meiner Webseite bereitgestellt.
    ESP32 Modul mit Arduino Sketch.
    iBeacon / iTag Präsenz Schalter
    http://esp32-server.de/ibeacon-itag-praesenz-schalter/

    Und an einem MQTT WiFi Bluetooth Melder arbeite ich gerade. Mit mehreren Modulen in verschiedenen Zimmern können Personen lokalisiert werden. Als iBeacon schlage ich vor einfitness tracker Xiaomi Mi Band 2 / 3 zu benutzen im App Mi-Fit kann Sichtbarmodus aktiviert werden damit Mi Band advertising BLE Signale sendet.
    Hausautomatisierung Software z.B FHEM, Node-RED, iobroker, openHAB, Domoticz kann MQTT Nachrichten auswerten.

Bitte anmelden, um einen Kommentar zu posten
Anzeige

Anzeige

123RF.com - For all your creative needs!

Kalender

« April 2024 »
Mo Di Mi Do Fr Sa So
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

Newsletter

Euch interessieren meine Themen hier? Dann tragt euch einfach in den Newsletter ein und ihr werden bei neuen Beiträgen informiert.

Anzeige