Dieser Artikel beschreibt, wie eine Anwesenheitserkennung via Bluetooth realisiert werden kann.
Es handelt sich hier um eine von vielen möglichen Varianten.
Diese kommt ohne Bastelarbeiten aus. Ist bereits ein Linux System vorhanden - z.B. ein Raspberry Pi lassen sich die Kosten auf wenige Euro für die Leseeinheit drücken.
Als Tags können die Gigaset G-Tags aber auch andere BLE (Bluetooth Low Energy) Tags verwenden. Getestet habe ich es auch mit einfacheren Tags.
Fügen Sie die erforderlichen Schritte hinzu:
Auf dem Server muss dann das Paket bluez installiert sein.
aptitude install bluez
Prompt> hciconfig hci0 up
Prompt> /usr/bin/hcitool lescan
LE Scan ...
7C:2F:81:91:A1:B2 (unknown)
7C:2F:81:91:A1:B2 Gigaset G-tag
Nun wird ein Shell Script erstellt, welches die Dongles scannt. Ich habe es scantag.sh genannt.
hciconfig hci0 down hciconfig hci0 up (/bin/sleep 8;/usr/bin/killall --signal 2 /usr/bin/hcitool) |/usr/bin/hcitool lescan |grep -v "LE Scan" |cut -c1-17|sort -u |
Ich habe dem Script als Gruppe und Eigentümer root zugewiesen und die Rechte eingeschränkt:
chmod 500 scantag.sh
chown root:root scantag.sh
Als nächstes müssen wir dem PHP-Script erlauben, das Scan-Script auszuführen.
Dies erfolgt mit Hilfe des folgenden Kommandos und Hinzufügen des Eintrags für www-data:
sudo visudo
www-data ALL = NOPASSWD:/home/www/wo-auch-immer/scantag.sh
Nun das PHP-Script, welches vom Miniserver bei einer Leseanforderung aufgerufen wird:
<?php // Bekannte G-Tags: $tags_known['1'] ="7C:2F:81:91:A1:B1"; // Tag rot $tags_known['2'] ="7C:2F:81:91:A1:B2"; // Tag grün $tags_known['4'] ="7C:2F:81:91:A1:B3"; // Tag schwarz $tags_known['8'] ="7C:2F:81:91:A1:B4"; // Tag orange $tags_known['16'] ="7C:2F:81:91:A1:B5"; // Tag weiß //31 = alle da //16 weiss //8 orange //4 schwarz //2 grün //1 rot function output($output) { echo $output." \n"; $socket = fsockopen('udp://miniserver:11111'); fputs($socket, "$output"); return; } // Ausführen des BLE-Scans exec('sudo /home/www/wo-auch-immer/scantag.sh',$tags_found); $tags_found = array_unique($tags_found,SORT_STRING); $bitmask=0; while(list($tag_user, $tag_mac) = each($tags_known)) { unset($found_tags); $found_tags = array_filter($tags_found, function($varu) use ($tag_mac) { return preg_match("/\b$tag_mac\b/i", $varu); }); if (count($found_tags) >= 1) { $bitmask=$bitmask + $tag_user; } } output($bitmask); |
Wenn man das Script im Browser aufruft, sollte eine Zahl welche in der Matrix den anwesenden Personen entspricht zurückgegeben werden.
Parallel sendet das Script die Zahl auf den Port 11111 des Miniservers (virtueller Eingang).
Zum Senden der Leseanforderung wird in der Loxone Config wird nun ein Virtueller Ausgang "G-Tag Leseanforderung" erstellt.
Dahinter wird der Befehl erstellt: (das ?read_G-Tags ist optional)
Befehl bei EIN: /bt/?read_G-Tags
HTTP Methode bei EIN: GET
Nun der Empfangs-Teil. Dafür wird in der Loxone Config ein virtueller Eingang für die IP des Linux Rechners auf z.B. Port 11111 erstellt:
Dahinter folgt wieder ein Befehl:
Befehlserkennung: \v
Als Digitaleingang verwenden nicht anhaken.
Der Ausgang des Eingang-Befehls geht nun an AI1 eines Statusbausteins welcher auf der Favoriten-Seite visualisiert wird:
Da mir das zu heftig war, das alles in die Loxone Config zu klickern, habe ich mir eine Excel Tabelle erstellt und diese
dann über einen Editor direkt als XML in die .loxone Projektdatei eingefügt.
Bei mir sieht das dann so aus:
<StateTexts Num="32"> <StateText Valid="true" ValidV="true" Text="Ulli da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="1"/> <StateText Valid="true" ValidV="true" Text="Chrissi da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="2"/> <StateText Valid="true" ValidV="true" Text="Chrissi & Ulli da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="3"/> <StateText Valid="true" ValidV="true" Text="Moritz da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="4"/> <StateText Valid="true" ValidV="true" Text="Moritz & Ulli da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="5"/> <StateText Valid="true" ValidV="true" Text="Moritz & Chrissi da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="6"/> <StateText Valid="true" ValidV="true" Text="Moritz, Chrissi & Ulli da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="7"/> <StateText Valid="true" ValidV="true" Text="Oskar da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="8"/> <StateText Valid="true" ValidV="true" Text="Oskar & Ulli da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="9"/> <StateText Valid="true" ValidV="true" Text="Oskar & Chrissi da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="10"/> <StateText Valid="true" ValidV="true" Text="Oskar, Chrissi & Ulli da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="11"/> <StateText Valid="true" ValidV="true" Text="Oskar & Moritz da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="12"/> <StateText Valid="true" ValidV="true" Text="Oskar, Moritz & Ulli da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="13"/> <StateText Valid="true" ValidV="true" Text="Oskar, Moritz & Chrissi da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="14"/> <StateText Valid="true" ValidV="true" Text="Oskar, Moritz, Chrissi & Ulli da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="15"/> <StateText Valid="true" ValidV="true" Text="Heinz da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="16"/> <StateText Valid="true" ValidV="true" Text="Heinz & Ulli da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="17"/> <StateText Valid="true" ValidV="true" Text="Heinz & Chrissi da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="18"/> <StateText Valid="true" ValidV="true" Text="Heinz, Chrissi & Ulli da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="19"/> <StateText Valid="true" ValidV="true" Text="Heinz & Moritz da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="20"/> <StateText Valid="true" ValidV="true" Text="Heinz, Moritz & Ulli da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="21"/> <StateText Valid="true" ValidV="true" Text="Heinz, Moritz & Chrissi da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="22"/> <StateText Valid="true" ValidV="true" Text="Heinz, Moritz, Chrissi & Ulli da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="23"/> <StateText Valid="true" ValidV="true" Text="Heinz & Oskar da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="24"/> <StateText Valid="true" ValidV="true" Text="Heinz, Oskar & Ulli da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="25"/> <StateText Valid="true" ValidV="true" Text="Heinz, Oskar & Chrissi da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="26"/> <StateText Valid="true" ValidV="true" Text="Heinz, Oskar, Chrissi & Ulli da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="27"/> <StateText Valid="true" ValidV="true" Text="Heinz, Oskar & Moritz da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="28"/> <StateText Valid="true" ValidV="true" Text="Heinz, Oskar, Moritz & Ulli da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="29"/> <StateText Valid="true" ValidV="true" Text="Heinz, Oskar, Moritz & Chrissi da " TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="30"/> <StateText Valid="true" ValidV="true" Text="Heinz, Oskar, Moritz, Chrissi & Ulli da" TextV="1" Icon="00000000-0000-0000-0000000000000000" Input0="1" CondV0="31" CondT0="31"/> <StateText Valid="true" ValidV="true" Text="Niemand anwesend" TextV="0" Icon="00000000-0000-0000-0000000000000000"/> </StateTexts> |
Der Ausgang TQ geht an einen visualisierten Logger-Baustein und der AQ über verzögerte Impuls-Bausteine an die Alarmanlage usw.
Dieses Script ist sicher verbesserbar - über Anregungen freue ich mich immer. Verwendung auf eigene Gefahr! Die Reichweite ist relativ gering und beträgt bei mir etwa 10 m. Der USB-Dongle sollte also schon nah am Schlüsselbrett/-körbchen oder der Garderobe positioniert sein wo sich die G-Tags befinden. |
Ich habe ab und zu Aussetzer beim Einlesen welche dann im Logger-Baustein unschön als Niemand anwesend aufgelistet werden. |
Verwandte Artikel erscheinen hier basierend auf den Stichwörtern, die Sie auswählen. Klicken Sie, um das Makro zu bearbeiten und Stichwörter hinzuzufügen oder zu ändern.
|