Raspberry Pi als iBeacon Scanner für Schlüsselbunddongle

Moin zusammen,

nach einer ganzen Weile habe ich es nun geschafft meinen RaspPi meinen Schlüsselbunddongle zu scannen und demnach einen Status an IP-Symcon via Webhook zu senden.

##Meine Hardware##

[ul]
[li]USB BT Dongle (LogiLink BT0015 USB bluetooth V4.0 EDR Class1 Micro: Amazon.de: Computer & Zubehör)
[/li][li]Dongle für den Schlusselbund (Gigaset G-tag Bluetooth Schlüsselfinder: Amazon.de: Elektronik)
[/li][li]RaspPi mit Raspian Jessie Lite
[/li][/ul]

Hier meine Anleitung dazu

  1. Zur Installation des iBeacon bin ich der Anleitung unter https://learn.adafruit.com/downloads/pdf/pibeacon-ibeacon-with-a-raspberry-pi.pdf gefolgt. WICHTIG: Nur einschließlich Schritt 1 im zweiten Absatz abarbeiten (1. Check for your USB Module)

Danach müsst ihr das Modul noch starten. Dazu folgenden Befehl eingeben

/tools/hciconfig hci0 up
  1. via SSH auf dem RaspPi
sudo apt-get install screen

nach der Installation

screen
tools/hcitool lescan

Screen verlassen mit STRG + A + D

  1. nötigen Scripte erstellen (z.B. im Homeverzeichnis)

ibeacon_scan.sh

#!/bin/bash
# iBeacon Scan by lahlor based on Radius Networks RAW data convert

while read -t 10 line
  do
    count=$[count + 1]
    if [ "$capturing" ]; then
      if [[ $line =~ ^[0-9a-fA-F]{2}\ [0-9a-fA-F] ]]; then
        packet="$packet $line"
      else
        if [[ $packet =~ ^04\ 3E\ 2A\ 02\ 01\ .{26}\ 02\ 01\ .{14}\ 02\ 15 ]]; then
          UUID=`echo $packet | sed 's/^.\{69\}\(.\{47\}\).*$/\1/'`
          UUID=`echo $UUID | sed -e 's/\ //g' -e 's/^\(.\{8\}\)\(.\{4\}\)\(.\{4\}\)\(.\{4\}\)\(.\{12\}\)$/\1-\2-\3-\4-\5/'`
		echo $UUID
        fi
        capturing=""
        packet=""
      fi
    fi
		if [ ! "$capturing" ]; then
			if [[ $line =~ ^\> ]]; then
				packet=`echo $line | sed 's/^>.\(.*$\)/\1/'`
				capturing=1
			fi
		fi
if [[ $count == "20" ]]; then
exit
fi
  done

Führt das Script einmal aus, während der Dongle erreichbar ist. Gebt dazu folgendes ein

sudo /home/pi/ibeacon/bluez-5.35/tools/hcidump --raw | /home/pi/ibeacon_scan.sh

Ihr solltet die UUID des Dongles angezeigt bekommen. Kopiert diesen irgendwohin, da er im nächsten Script eingetragen werden muss.

presence.sh

#!/bin/bash
# iBeacon Presence Check by lahlor

is_beacon_in_range () {

while read -t 10 line
do
   if [[ `echo $line | grep "XXXXXXXXXXXXXXXXXXXXXXXXXXX"` ]]; then
 echo 1
exit
fi
 done 
echo 0
}

result=$(is_beacon_in_range)
#echo $result
if [ $result -eq 1 ];then
#echo "is 1"
 sudo wget -O - -q http://127.0.0.1:3777/hook/ibeacon?Status=1 1>/dev/null &
else
#echo "is not 1"
sudo wget -O - -q http://127.0.0.1:3777/hook/ibeacon?Status=0 1>/dev/null &
fi


unter XXXXXXXX tragt ihr eure UUID des Dongles ein. Die IP für der IP-Symcon kann ebenfalls geändert werden, wenn 127.0.0.1 nicht richtig sein sollte.

  1. IP-Symcon Anpassung

Erstellt ein Dummy Modul (iBeacon). Darunter eine Boolean Variable (Profil ~Presence) und ein Script „Hook“.
In dem Script kommt folgendes rein

<?
error_reporting(0);
//IPS_LogMessage("WebHook GET", print_r($_GET, false));
//IPS_LogMessage("WebHook POST", print_r($_POST, false));
//IPS_LogMessage("WebHook IPS", print_r($_IPS, false));
if ($_GET['Status'] == 1)
{
SetValue(17794 /*[iBeacon\Lars]*/, true);
}
if ($_GET['Status'] == 0)
{
SetValue(17794 /*[iBeacon\Lars]*/, false);
}

?>

Denkt dran, die Objekt ID im Script mit der Booelan Variable abzugleichen.

Als letztes müsst ihr noch unter den Kern Instanzen > WebHook das Script verknüpfen.

  1. Script automatisch laufen lassen
sudo crontab -e

folgendes einfügen (bitte auf die Pfade zu den Scripten achten und ggf. anpassen)

* * * * * sudo timeout 15 /home/pi/ibeacon/bluez-5.35/tools/hcidump --raw | /home/pi/ibeacon_scan.sh | /home/pi/presence.sh >/dev/null 2>&1

Nun sollte sich der Status in IPS automatisch alle ~ 1 Minute aktualisieren. Wird der Dongle nicht mehr vom RaspPi erreicht, wird der Status auf Abwesend gestellt. Ist der Dongle erreichbar, ist der Status Anwesend. Darauf aufbauend, kann man weitere Scripte erstellen, die das Licht ein und ausschalten.

Viel Spaß!
Sollte es Probleme geben, einfach melden.:cool:

Danke Dir Lars,

mein Bluetooth USB-Stick, V4.0, Klasse 1 ist bereit sunterwegs. Das wollte ich auch nocht testen was du hier gezeigt hast. Hätte ich so niemals allein hinbekommen. DANKE ! Welchen Dongle nutzt du ?

Frage: Könnte man hier 2…3 Raspis im Haus verteilen oder mal ganz dumm gesagt in jedem Raum einen installieren und die Bewegung damit erfassen anhand der Empfangsstärke des „Schlüsselbundes“ / AppleWatch am Arm ?! Laut der Beschreibung die du hier als PDF verlinkt hast, sieht man am ende beim iPhone Screenshot ja eine Entfernungsanzeige. Kann sich dein Dongle am Schlüsselbund an mehreren Raspis anmelden / bekannt machen, womit man auswerden kann in welchem Raum er sich befindet ?! So hätte man auch eine bessere Art von einem Präsenzmelder und könnte sicher coole Scenarien bauen.

Oder sollte man wenn man ein Handy oder AppleWatch nutzt lieber SymconBTP nutzen ?

Gruß
Christian

Abend Christian!

Ja, man kann das machen was du vor hast :slight_smile: Wurde auch schon an anderer Stelle mal beschrieben :wink:
>> Oben rechts im Forum in die Suche mal „hcitool“ eingeben und du siehst die anderen Thread :wink:

Aber schön zusammengefasst von Lars :slight_smile:

Ob man jetzt diesen Weg nimmt oder über Geofency…Geschmackssache :slight_smile: Eigentlich ist die Variante hier von Lars schon gut. Wollte das auch immer mal testen.

Grüße,
Chris

Danke ! Ich schau mir das mal an. Es gitb einfach zu viele geile Projekte die man alle am besten gleich umsetzen will :D:banghead:

Danke für deine Anleitung…

Wollte es mal schnell testen, aber der Befehl screen führt ins leere ?

Ok habe rausgefunden, das screen ein Zusatz ist, welches mit :

sudo apt-get install screen

installiert werden muss :wink:

Aber was ich nicht verstehe :

WICHTIG: Nur einschließlich Schritt 2 abarbeiten

Aber dann hat man ja nur das gepackte bluez da liegen ? Wie soll man damit den was anfangen ?

Was scannt die ibeacon_scan.sh den ? Steht da schon eine BT ID drin, wo man anpassen muss ?

Hört sich interessant an.

Was für ein Schlüsselanhänger ist das? Hast du ein Bild oder Link?

Danke

Hi Drapple. Danke für den Hinweis. Habe es oben angepasst. Schritt 2 lässt du am Besten auch aus und machst nur bis Schritt 1 ABER IM ZWEITEN ABSCHNITT :slight_smile: Hab mich gerade selbst gewundert.

  1. Zur Installation des iBeacon bin ich der Anleitung unter https://learn.adafruit.com/downloads...spberry-pi.pdf gefolgt. WICHTIG: Nur einschließlich Schritt 1 im zweiten Absatz abarbeiten (1. Check for your USB Module)

Danach müsst ihr das Modul noch starten. Dazu folgenden Befehl eingeben

/tools/hciconfig hci0 up

Das Script ibeacon_scan.sh wertet den Output des Programms hcidump aus. Wenn du deinen Dongle in der Nähe hast, kannst du mal /tools/hcidump --raw eingeben. Alles was du da siehst, wandelt das Script um und gibt dir nur noch die UUID der Dongle zurück. Du musst dir dann die UUID merken, die du angezeigt bekommst und nur im zweiten Script eintragen. Sonst nirgendwo.

Ich habe gerade diesen im Einsatz http://www.idealo.de/preisvergleich/OffersOfProduct/4723509_-g-tag-gigaset.html Habe den aber nur genommen, da ich sehr sicher war, dass er erkannt wird. Werde mir vielleicht auch mal einen günstigen von Amazon zulegen (~4€) und dann mal testen, ob die auch gut erkannt werden.

Moin Lars!

Warum willst du extra Anhänger verwenden und nicht einfach das Handy? Unter uns gibt es vmtl. wenig bis keine Personen, die ihr Handy nicht immer dabei haben, wenn sie das Haus verlassen?! :smiley:

Grüße,
Chris

Moin Chris,

das kann ich dir einfach erklären. Wenn ich aus dem Haus gehe bzw. nach Hause komme habe ich zu 100% einen Schlüssel dabei. Mein Handy kann durchaus mal im Auto oder auch zu Hause liegen bleiben (kommt zwar sehr selten vor aber kann mir mal passieren :D).
Zusätzlich will ich den Dongle ggf. für den Hund/Katze zur Anwesendheitskontrolle nutzen (noch unklar wegen der Größe, Strahlung und Wasserdichtigkeit).
Ebenfalls soll er als Scherheit dienen, wenn ich im Sommer im Garten sitze und ab Uhrzeit X die Automatisierung startet (Rolladen runter, Alarmanlage an etc…) und mein Handy im Haus liegt. Klar ich kann auch mal den Dongle vergessen, aber da kommt meine Sicherheitsdenke wieder in Spiel, dass ich meinen Schlüsselbund immer dabei habe, wenn ich das Haus verlasse :cool:
Einer der wichtigsten Punkte ist aber der Akku meines Handys. Der ist gerne mal leer und die Batterie des Dongles soll laut Hersteller bis zu einem Jahr halten.

Klingt logisch :slight_smile: Da sieht man mal wieder, dass es keine allgemeine Lösung gibt und man immer individuell das eigene Heim und das eigene Verhalten in seine Planung einbeziehen muss (und besonders das seiner Mitbewohner) :slight_smile:

Meine Freundin macht z.B. gerne mal am Handy das Bluetooth aus. Deswegen prüfe ich zusätzlich noch die Anwesenheit über das WLAN. Vielleicht sollte ich als 3. Punkt noch die Schlüsselanhänger-Methode wählen :smiley:

Grüße,
Chris

Tja, geht aber auch nur, wenn du einen Schlüsselbund dabei hast. Wir haben nen Fingerprint und wenn ich kein Auto nehme hab ich nie nen Schlüsselbund dabei :wink:

1 „Gefällt mir“

Moin Lars,

danke erst mal für das super Projekt … witzig war, ich hatte die Teile alle zu Hause liegen und konnte daher gleich loslegen :0)

Jetzt kommt nur mein Problem … ich kriegs nicht zum laufen :0((( ahhhh …
Hab alles nach deiner Anleitung gemacht … sehe im hcitool lescan auch den GTag …
wenn ich aber das Script ausführe mit "./ibeacon_scan.sh passiert nixt , bzw. er tut was im Hintergrund und dann kommt wieder die Terminaleingabe. Hast du ne Idee was das sein kann ?! Ich muss sagen ich hab wheezy installiert und nicht jessi light. Kann doch aber eigentlich nicht das Problem sein.

VG

Andreas

Gleiches Problem hier:
Hab mir vor Jahren extra ein Codeschloß montiert um KEINEN Schlüssel mitnehmen zu müssen.

  • wenn ich im Sommers schwimmen geh (wir wohnen an einem kleinen See) hab ich nix außer Badehose und Handtuch dabei. Handy bleibt auch ganz gerne mal im Schrank.
  • Tochter darf in die Schule sowiso kein Handy mitnehmen.
  • Frau will ihr uralt Nokia (hat weder WLAN noch BT) nicht upgraden.

So, wat nu ?

bb

Naja…Codeschloss + Türöffnung = Anwesenheit?! :slight_smile: Abwesenheit vlt. über Bewegungsmelder vor der Tür + Türöffnung + keine weitere Bewegung an der Tür?!

Oder doch einen Chip unter die Haut setzen lassen :smiley:

Wer SmartHome-Features will, der muss halt auch mal Kompromisse eingehen. Entweder Handy mitnehmen oder Chip unter die Haut :smiley:

Grüße,
Chris

Ich hab seit längerere Zeit sehr zuverlässig in einer (fast) Endlosschleife laufen:

// Dirs in Linux
$SkriptDir = IPS_GetKernelDir () . 'scripts/';
$DatenDir = '/tmp/';

...
                        $handle = HciConfig ('hci0', 'reset');  // Reset HCI device
                        $handle = HciConfig ('hci0', 'up');     // Interface öffnen
...
                    exec ('sh ' . $SkriptDir . 'BLEscan.sh');    // sudo hcitool lescan > /tmp/Lescan.txt & sleep 3;pkill --signal SIGINT hcitool;sleep 1;

                    $handle = fopen ($DatenDir . 'Lescan.txt', "r");
                    if ($handle) {

// Test auf Ausfall-Erkennung von 'BLEscan.sh'
                        $buffer = fgets ($handle, 4096);        // schöpfe Header ab
                        if (strlen ($buffer) > 0)
                            exec ('touch /tmp/BLEscan.tic');    // für WatchDog.sh um Total-Ausfall zu prüfen
                        if (trim ($buffer) != 'LE Scan ...') {
...
                        } else {
...
                            while (($buffer = fgets($handle, 4096)) !== false) {
                                $buffer = trim($buffer);
                                $Teil = explode(' ', $buffer);
                                $MAC = ($Teil[0]);           // MAC
...

                        }
                        if ( ! feof ($handle)) {
                            echo "
Fehler: unerwarteter fgets() Fehlschlag
";
                        }
                        fclose ($handle);
....

//----------------------------
//---- Funktionen

function HciConfig ($Dev, $Cmd = '', $Par = '', $SubPar = '') {     // hciconfig [-a] hciX [command [command parameters]]
    global $SkriptDir, $DatenDir;
    exec ('sh ' . $SkriptDir . 'HCIconfig.sh' . " $Dev" . " $Cmd" . " $Par" . " $SubPar " . '> ' . $DatenDir . $Dev . '.txt');
 
 //       echo ("
sh " . $SkriptDir . 'HCIconfig.sh -> sudo hciconfig' . " $Dev" . " $Cmd" . " $Par" . " $SubPar " . '> ' . $DatenDir . $Dev . '.txt');
//        echo ("
/*
" );
//        echo (file_get_contents (($DatenDir . $Dev . '.txt')));
//        echo ("
*/
" );


    $handle = @fopen ($DatenDir . $Dev . '.txt', "r");
    return $handle;
}



An den Stellen mit ‚…‘ im Source-Listing hab ich was gelöscht, weil mein privates System betrifft.

Dazu braucht man noch BLEscan.sh

#!/bin/bash
# BLEscan.sh
sudo hcitool lescan > /tmp/Lescan.txt & sleep 3;
pkill --signal SIGINT hcitool;
sleep 1;

HCIconfig.sh

#!/bin/bash
# HCIconfig.sh 1=$Dev, 2=$Cmd, 3=$Par, 4=$SubPar, 5=Dateiausgabe
sudo hciconfig $1 $2 $3 $4 $5;

Die Batchfiles habe ich in IPS auf einem WIN-PC erstellt und dann auf die Raspis mit dieser Methode übertragen.
Weil WIN versus Linux im Spiel ist unbedingt den Abschnitt „Achtung Falle !!“ am Ende des Beitrags lesen!

Viele Grüsse
Harald

Bei der beschriebenen Methode (die ich auch praktiziere) müßte das Handy als Beacon arbeiten, also periodisch Bluetooth-Telegramme versenden (Leuchtturm-Funktion).

Für mein iPhone hab ich keine App gefunden, die sowas zuverlässig (d.h. nicht nur für kurze Zeit) macht.

Hat da jemand eine Empfehlung ? (Evtl. auch für Android).

Viele Grüsse
Harald

Moin Harald,

danke für dein Script … .du hast IPS auf dem Raspberry oder ?!
Ich hab Windows. Müsste das Scritp dann ja vermutlich immer per SSH ausführen.
Werde das mal testen.

Die Daten für anwesend und abwesend ziehst du dann aus dem Text File oder ?!

VG

Andreas

Im Prinzip ja, aber ganz so einfach hab ich es mir nicht gemacht:cool:

Nach ‚sudo hcitool lescan‘ gibt es in etwa folgende Ausgabe:

LE Scan ...
7C:2F:80:91:79:E4 (unknown)
08:7C:BE:01:03:36 Quintic PROXR
7C:2F:80:91:79:E4 (unknown)
7C:2F:80:91:79:E4 Gigaset G-tag
08:7C:BE:01:03:36 (unknown)
08:7C:BE:01:03:36 Quintic PROXR

Auf jedem Raspi (z.Z 4 Stück) läuft das obige Skript (ca. 4 Sekunden BLESCAN, dann Auswertung und Wiederholung), das sich nach ca. 4 Minuten selbst wieder aufruft und beendet; damit vermeide ich endlose Laufzeiten, die unter PHP zu Problemen führen.

Die obige Ausgabe wird Zeile für Zeile auf die MAC-Adresse untersucht.
Jeder Raspi hat eine kleine „Datenbank“ in Form eines PHP-arrays, das serialized in einer IPS-Variable zwischengespeichert wird. Darin steht u.a. die Zeit der letzten Detektierung.

Wenn jetzt eine MAC-Adresse neu auftaucht oder für einige Zeit nicht erscheint (hab willkürlich 40 Sekunden eingestellt), wird das per JSON an das Wirksystem gemeldet.

Dort werden die zusammenlaufenden Meldungen für die einzelnen Dongels visualisiert in ‚WEG‘ oder ‚DA‘ und ggf. auch protokolliert bzw. Aktionen ausgelöst.

Leider fehlt mir eine Methode, den genauen Standort aus verschiedenen Meldungen zu ermitteln, weil ich an die Daten über die Feldstärke nicht rangekommen bin; bleiben also nur so vage Angaben wie EG, OG, KG je nach Standort des meldenten Raspis.

Viele Grüsse
Harald

Moin,

gibt es jemanden, der mit meinem Script noch Probleme hat? Dann bitte kurz melden.