Raspberry Pi als iBeacon Scanner für Schlüsselbunddongle

Mit

sudo hcitool lescan

Ergebnis: grübel

sudo hcitool lescan
LE Scan ...
88:C6:26:B3:45:66 
88:C6:26:B3:45:66 (unknown)
88:C6:26:B3:45:66 
88:C6:26:B3:45:66 (unknown)
88:C6:26:B3:45:66 
88:C6:26:B3:45:66 (unknown)
C0:97:27:54:08:D3 (unknown)
88:C6:26:B3:45:66 
88:C6:26:B3:45:66 (unknown)
C0:97:27:54:08:D3 (unknown)
88:C6:26:B3:45:66 
88:C6:26:B3:45:66 (unknown)
88:C6:26:B3:45:66 
88:C6:26:B3:45:66 
88:C6:26:B3:45:66 (unknown)
88:C6:26:B3:45:66 
88:C6:26:B3:45:66 (unknown)
C0:97:27:54:08:D3 (unknown)
60:03:08:98:C6:F9 (unknown)
60:03:08:98:C6:F9 (unknown)
46:4D:46:72:AE:BD (unknown)
88:C6:26:B3:45:66 
88:C6:26:B3:45:66 (unknown)
88:C6:26:B3:45:66 
88:C6:26:B3:45:66 (unknown)
C0:97:27:54:08:D3 (unknown)
60:03:08:98:C6:F9 (unknown)
60:03:08:98:C6:F9 (unknown)
88:C6:26:B3:45:66 
88:C6:26:B3:45:66 (unknown)
C0:97:27:54:08:D3 (unknown

OK, es kommen halt ‚nur‘ die MAC-Adressen :banghead:

Aber was willst Du mit der UUID ?

Ich möchte die UUID des G-Tag in die Geofency App eintragen, damit ich diesen dort nutzen kann.
Die MAC Adresse hilft mir hier leider nicht weiter.
Außerdem frage ich mich, warum bei mir überall „unknown“ steht. Bei Euch ist der G-Tag namentlich angezeigt gewesen.

Der G-Tag wird auch nicht immer namentlich angezeigt:

18:02:32[pi@RaspiB5:~] $ sudo hcitool lescan
LE Scan ...
7C:2F:80:91:68:9C (unknown)
7C:2F:80:91:68:9C (unknown)
7C:2F:80:91:68:9C Gigaset G-tag
7C:2F:80:99:C9:00 (unknown)
7C:2F:80:99:C9:00 (unknown)
7C:2F:80:99:C9:00 Gigaset G-tag
7C:2F:80:91:68:9C (unknown)
7C:2F:80:91:68:9C Gigaset G-tag
7C:2F:80:99:C9:00 (unknown)
^C1

Und der Connect mit gatttool funktioniert auch nicht immer:

18:02:50[pi@RaspiB5:~] $ sudo gatttool -i hci0 -b 7C:2F:80:99:C9:00 -I
[7C:2F:80:99:C9:00][LE]> connect
Attempting to connect to 7C:2F:80:99:C9:00
Error: connect error: Function not implemented (38)
[7C:2F:80:99:C9:00][LE]> primary
Command Failed: Disconnected
[7C:2F:80:99:C9:00][LE]>
[7C:2F:80:99:C9:00][LE]> exit
18:07:10[pi@RaspiB5:~] $

Aber manchmal doch (und bringt dann die UUID):

18:33:57[pi@RaspiB5:~] $ sudo gatttool -i hci0 -b 7C:2F:80:99:C9:00 -I
[7C:2F:80:99:C9:00][LE]> connect
Attempting to connect to 7C:2F:80:99:C9:00
Connection successful
[7C:2F:80:99:C9:00][LE]> primary
attr handle: 0x0001, end grp handle: 0x0009 uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x000c, end grp handle: 0x000f uuid: 00001801-0000-1000-8000-00805f9b34fb
attr handle: 0x0010, end grp handle: 0x0018 uuid: 0000180a-0000-1000-8000-00805f9b34fb
attr handle: 0x0019, end grp handle: 0x001c uuid: 0000180f-0000-1000-8000-00805f9b34fb
[7C:2F:80:99:C9:00][LE]> exit
18:37:05[pi@RaspiB5:~] $

Ich habe jetzt vom „Stottermodus“ (wie ich nachträglich das oben beschriebene Verfahren getauft habe :)) auf einen „Parallelmodus“ umgestellt.

Zuerst habe ich versucht, die Datei zu lesen (und bin gescheitert, der Inhalt steht erst irgendwann zur Vfg.)
Auch an die Bildschirmausgabe, die angeblich im proc filesystem (/proc/<pid>/fd/1) erreichbar sein soll, bin ich nicht rangekommen.

Dann die Überlegung, dass eine „Named Pipe (fifo)“ eigentlich das richtige für diesen Zweck ist:

A very useful Linux feature is named pipes which enable different processes to communicate.
The output of the command run on the first console shows up on the second console. Note that the order in which you run the commands doesn’t matter.

Bei der Verwendung von Named Pipes müssen allerdings Probleme umgangen werden mit
Buffering: der Empfänger bekommt keine Daten obwohl die der Sender welche abgeschickt hat; erst wenn der Sender abgeschaltet wird oder es zu einem Buffer-Überlauf kommt, erhält der Empfänger die Daten in einem Rutsch, d.h. sie sind zwischengespeichert und damit teilweise nicht mehr aktuell.
und
Blocking: wenn der Sender nichts mehr liefert, bleibt der Empfänger an der Pipe hängen und kommt nicht mehr los, bis nachgeschoben wird.

Wie üblich, wenn ich so eine Anwendung auf meinem Wirksystem einrichte, wird es sehr kompliziert:loveips:: da gibt es Heartbeats per JSON an den zentralen Server, Updates von Datensätzen an die Raspis bezüglich der auszuwertenden Abwesenheitszeiten usw. die ich keinem zumuten möchte. Deshalb hier nur das Grundgerüst:

  1. Wir brauchen erst mal zusätzlich zum IPS-Aktions-Skript einen Fork, der von unserem Aktions-Skript (siehe #4) aufgerufen wird und dessen einzige Aufgabe es ist, ein Bash-Skript zu starten:
<?

/*
 * @file          BLEscan_Act2.ips.php
 * @author        Harald Hertlein
 * läuft auf den Raspi's 
 * Identpfad:     BLEscan/ACT2
 *
 * @version       16.02.17 15:21
  */

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

// --------------------------------------
if (IPS_SemaphoreEnter ("BLEscan2", 100)) {
    exec ('sh ' . $SkriptDir . 'BLEscan2.sh');    // sudo stdbuf -oL hcitool lescan 2>&1 | sudo tee /tmp/LePipe; unlimited
    IPS_SemaphoreLeave ("BLEscan2");
}
// --------------------------------------
?>

Übrigens: an der verwendeten Variablen „$SkriptDir = IPS_GetKernelDir () . ‚scripts/‘“ ist zu erkennen, dass ich auch die Linux-Bash-Skripte mit dem IPS-Editor anlege. Das hat den Vorteil, dass sie an einem definierten Ort auffindbar und änderbar sind und gleich die richtigen Properties haben.

  1. Das ist das Bash-Skript (mit dem IPS-Editor erstellt):
#!/bin/bash
# BLEscan2.sh
cd /tmp;
sudo mkfifo /tmp/LePipe;
sudo stdbuf -oL hcitool lescan --duplicates 2>&1 | sudo tee /tmp/LePipe;

Dieses Skript erstellt eine „Named Pipe (fifo)“ und verhindert über das Konstrukt mit dem Linux-Befehl "stdbuf " in der letzten Zeile, dass das Problem des Buffering für den Ausgabe-Text des hcitool’s auftritt.
Bei Raspis mit eigenem BLE-Chip onBoard ist es erforderlich die Option „duplicates“ (=don’t filter duplicates) definiert zu setzen, da sonst das Verschwinden der Tags nicht festgestellt werden kann (bei Verwendung eines BLE-Dongels ist diese Option anscheinend schon gesetzt).

  1. Wenn BLEscan_Act2.ips.php läuft, bleibt es solange hängen, bis ein anderes Bash-Skript ausgeführt wird:
#!/bin/bash
# BLEstop2.sh
sudo pkill --signal SIGINT hcitool;
sleep 1;
sudo rm /tmp/LePipe;

Das Stoppen des PHP-Skriptes ist erforderlich, weil Skripte unter IPS nur eine begrenzte Laufzeit haben dürfen (sie werden auch schon nach etwa einer Minute in der Expertenansicht „PHP-Informationen“ rot markiert). Macht aber nichts, wir machen ein Revolving, indem sich das Aktions-Skript kurz vor seinem Ende selbst aufruft.

Das brauchen wir auch noch als HCIconfig.sh:

#!/bin/bash
# HCIconfig.sh 1=$Dev, 2=$Cmd, 3=$Par, 4=$SubPar, 5=Dateiausgabe
sudo hciconfig $1 $2 $3 $4 $5;
  1. Jetzt zu unserem Aktions-Skript, nur das Skelett um nicht die Sicht auf das wesenentlich zu versperren:
<?php
/*
 * @file          BLEscan_Act.ips.php
 * @author        Harald Hertlein
 * läuft auf den Raspi's und die schicken die Ereignisse auf den Server
 * Identpfad:     BLEscan/ACT
 *
 * @version       16.02.17 15:21   Neue Version mit stream_set_blocking = 0
 * Version <br/>

 */

$Laufzeit = (4 * 60);       // in sec. des Skriptes (anschließend Selbstaufruf bei Revolving)
set_time_limit (5 * 60);    // maximale PHP-Ausführungszeit in Sekunden

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

$StartTime = time ();

$handle = HciConfig ('hci0', 'up');     // Interface öffnen
IPS_RunScript (xxxx);     // Starte schon mal mit 'mkfifo /tmp/LePipe' (xxxx = ObjID von BLEscan_Act2.ips.php)

IPS_RunScript (GetObjectIDByIdentPath ('BLEscan/ACT2'));     // Starte schon mal BLEscan2.sh
IPS_Sleep (1000);   //  Wartezeit in Millisekunden ohne Abfrage als Vorsprung

$handle = @fopen ($DatenDir . 'LePipe', 'r');   // Pipe zum Lesen geöffnet, unbuffered durch BLEscan2.sh, aber noch blocked
IPS_Sleep (1000);   //  Wartezeit in Millisekunden ohne Abfrage als Vorsprung
stream_set_blocking ($handle, 0);   // Dadurch blockiert fgets nicht mehr, liefert Inhalt oder leeren String, kein EOF

do {
   $Line = trim (fgets ($handle, 128));
   if ($Line) {           // wenn noch was im Buffer ist
      // entweder verarbeiten (oder s.u. Maintenance)

      //  .... Verarbeitungsroutine

   } else {      // Nix im Buffer
      // oder Nichts zu verarbeiten daher Maintenance   

      // z.B. nachprüfen  ob für die einzelnen Tags die Zeit abgelaufen ist: dann auf abwesend setzen

   }
// Ende von Verarbeitung oder Maintenance
IPS_Sleep (250);   //  Wartezeit in Millisekunden ohne Abfrage zur Verhinderung des Speicherüberlaufs
} while ((time () - $StartTime ) < $Laufzeit);   //  Wartezeit in Sekunden

// alles beenden
fclose ($handle);
exec ('sh ' . $SkriptDir . 'BLEstop2.sh');    // abbrechen Rest ohne Resultat

IPS_RunScript ($_IPS['SELF']);     // und jetzt rufen wir uns selber auf (Revolving)

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

function HciConfig ($Dev, $Cmd = '', $Par = '', $SubPar = '') {     // hciconfig [-a] hciX [command [command parameters]]
    global $SkriptDir, $DatenDir, $lSem;
    exec ('sh ' . $SkriptDir . 'HCIconfig.sh' . " $Dev" . " $Cmd" . " $Par" . " $SubPar " . '> ' . $DatenDir . $Dev . '.txt');
    $handle = @fopen ($DatenDir . $Dev . '.txt', "r");
    return $handle;
}

?>

Wichtig ist nach dem Öffnen der Pipe der PHP-Befehl „stream_set_blocking“ mit den entsprechenden Parametern. Dadurch wird das Problem des Blockings verhindert.
Dadurch wird aber das Verhalten von fgets verändert, liefert Inhalt oder leeren String, EOF-Abfrage funktioniert nicht.

In meinem Komplex-Skript hab ich noch Bremsen eingebaut, um z.B. das Ausführen des Revolvings zu unterbrechen, aber das kann jeder machen wie er es mag.

Viel Erfolg mit meinen Vorschlägen
Harald

Hey,

habe das Projekt nachgestellt auch mit Erfolg.

Was ich aber nicht verstehe: Wenn ich den Befehl aus der Crontab manuell in der Shell eintippe aktualisiert sich die Variable auf „Anwesend“. Macht es aber der Cron-Job gibt sie immer „Abwesend“ ab.

In der Crontab wird doch auch das gleiche abgehandelt wie ich es manuell in der Shell mache, daher sind bei mir ganz viele Fragezeichen.

Wäre sehr froh wenn mir jemand helfen könnte.

Vielen Dank.

Mfg
Paul

Bin auch sehr daran interessiert, hab leider auch viele Fragezeichen…

Erstmal prima Lösung, das ist genau mein Problem: Wenn ich stumpf einen „hcitool lescan“ umleite und auswerte, kommt alles zu spät.

Mit Haralds Lösung habe ich es so verstanden, dass die Ausgabe von hcitool quasi in Echtzeit in IPS reinkommt, da das irgendwie gepiped wird :confused:

Aber bei mir ist es so, dass das Aktualisieren erst NACH dem Revolving kommt. Irgendwo ist bei mir ein Denkfehler, oder ?

Das mit der Pipe habe ich nicht in der Griff gekriegt - als Alternative zum Parallelmodus vom Harald hier nun der „Quasselmodus“. Die Idee ist dabei, die Ausgabe vom lescan genau wie beim Parallelmodus mit stdbuf umzuleiten - allerdings geht das dann bei mir per UDP direkt raus. Dazu verwende ich:

stdbuf -i0 -o0 -e0 hcitool -i hci0 lescan --duplicates | grep --line-buffered "Giga" | sed -u 's/^/hci0 /' > /dev/udp/127.0.0.1/8173

das fischt nur die Gigaset Meldungen raus und sendet diese dann direkt aus dem stdbuf an den localhost, natürlich könnte man das auch im Netz an eine Zentrale senden, damit spart man sich auch den RPC Aufruf.

Zum Empfangen benötigt es dann z.B. einen Multicast Socket mit einer Registervariablen, die die Daten dann auswertet. Ich setze einfach anhand der macid und des hosts logische Variabeln auf true, die nach einer Zeit von 30s auf false gehen, wenn sie nicht neu gesetzt werden.

Schön wäre ein daemonprozess, der direkt diese shell-Zeile oben permanent ausführt (so wie bei Harald kille ich die alle 5 min und starte sie per Revolving neu) - aber so etwas habe ich noch nicht hinbekommen.

Schaut euch mal lieber Python an :

from proximity import *
import time

import paho.mqtt.publish as publish
import json


#Config 

mqtt_username="lol"
mqtt_password="lol"
mqtt_server="192.168.100.21"
mqtt_port="1883"
mqtt_subscribe="/device/ble/remote/"
mqtt_publish="/device/ble/wohnzimmer/status/"
mqtt_debug="/device/debug/"
mqtt_clientid="Bluetooth-Modul-Wohnzimmer"
debug = "true"

global  anw1
global  anw2

anw1="false"
anw2="false"
"""
def on_subscribe(client, userdata, mid, granted_qos):
    print("Subscribed: "+str(mid)+" "+str(granted_qos))
 
def on_message(client, userdata, msg):
	print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))   
	
#client = paho.Client(client_id="btwz", clean_session=True, userdata=None, protocol=paho.MQTTv31)
#client.on_subscribe = on_subscribe
#client.on_message = on_message
#client.username_pw_set(mqtt_username, mqtt_password)
#client.connect(mqtt_server, mqtt_port,60)
#client.subscribe(mqtt_subscribe, qos=1)
"""

b1="e2c56db5dffb48d2b060d0f5a71096e1"
b2="069e7943160f02011b0bff4c00090603" 
b3="4152554ef99b4a3b86d0947070693a78"
b4="ce2a63cd69c80e02011a0aff4c001005"
b5="fe024f5843424d5f6d762d4a49000001"
b6="0100018a1819930b770b02010607ff4c"
b7="ff5701007ec1ea54ed9d0679d1526c7b"
b8="4152554ef99b4a3b86d0947070693a78"
#Unbekannte Becans:
b9="5732e0c2230f02011b0bff4c00090603"
b10="ce2a63cd69c80e02011a0aff4c001005"
b11="a5,15ddcb73700f02011a0bff4c00090602"
b12="95,95364a34c8420e02011a0aff4c001005"
b13="b6cf230077630e02011a0aff4c001005"
b14="ebd89aaf5a7c0e02011a0aff4c001005"
b15="004887f02e1b0c67271250659da01005"
b16="001298ba6451b5a69b1e9301cbf71005"
scanner = Scanner(loops=1)

m1="fd:1a:53:c4:b7:e1" # Danny
m2="88:0f:10:9f:0d:d2" # Mom
m3="ce:18:eb:67:e1:21" # Mark
m4="e7:8d:74:7e:9b:c1" #Mia

m5="fc:58:fa:0a:1c:41" # Dongel Test
m6="fc:58:fa:0a:1d:01" # Dongel Kristina




u1="2f:48:8d:ce:53:d0";
u2="6a:d5:fe:15:c1:a6";
u3="7b:45:3a:c5:3b:b5";
u4= "c8:fd:19:6f:39:1d";
u5="18:93:d7:30:45:5b";
u6="ec:35:86:33:09:9d";
u7="c8:69:cd:63:2a:ce";
u8="44:a4:f4:18:e9:b2"; #Mia =?
u9="50:f1:4a:ee:52:34"; 
u10="52:49:e4:1c:b6:34";
u11="75:5a:4d:2b:ee:db";
u12="73:4f:91:e3:83:50";
u13="6c:22:25:80:73:3e";
pi="false"
piweg=0

pi2="false"
piweg2=0


pi3="false"
piweg3=0

pi4="false"
piweg4=0

pi5="false"
piweg5=0

pi6="false"
piweg6=0

hearbeattime=0


message="{\"devicename\":\"Danny_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present3\",\"value\":\"false\"}"
publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")

message="{\"devicename\":\"Mom_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present3\",\"value\":\"false\"}"
publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")

message="{\"devicename\":\"Mark_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present3\",\"value\":\"false\"}"
publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")
			

message="{\"devicename\":\"Mia_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present3\",\"value\":\"false\"}"
publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")

message="{\"devicename\":\"Papa_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present\",\"value\":\"false\"}"
publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")

message="{\"devicename\":\"Kristina_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present\",\"value\":\"false\"}"
publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")
							

while True:
	#************************ Heartbeat ***********************************
	millis=int(round(time.time() * 1000))
	sekunden=(time.strftime("%S"))
	#print "Sekunden:",sekunden,"Push-Sekunden:",push_millis_channel1, "pushtime_channel1:",pushtime_channel1
	
	if sekunden == "00" and hearbeattime ==0:
		zeit=(time.strftime("%H:%M:%S Uhr am %d.%m.%Y"))
		message="{\"devicename\":\""+mqtt_clientid +"\",\"model\":\"presenter\", \"room\":\"Systemueberwachung\", \"infoart\":\"heartbeat\",\"value\":\""+zeit +"\"}"
		publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")
		hearbeattime=1
	if sekunden == "01" and hearbeattime == 1: hearbeattime=0
	for beacon in scanner.scan():  
		mac=beacon.split(',')[0]
		uuid=beacon.split(',')[1]
		major=beacon.split(',')[2]
		minor=beacon.split(',')[3]
		db1=beacon.split(',')[4]
		db21=beacon.split(',')[5]  #RFFI !
		db2=int(db21.split('-')[1])
		#if db2 >76: print beacon    
		#if uuid !=b8 and uuid !=b1 and uuid !=b9 and uuid !=b10 and uuid !=b11 and uuid !=b12 and uuid !=b13 and uuid !=b14 and uuid !=b15 and uuid !=b16 and mac !=u1 and mac !=u2 and mac !=u3 and mac !=u4 and mac !=u5 and mac !=u6 and mac !=u7 and mac !=u8 and mac !=u9 and mac !=u10 and mac !=u11 and mac !=u12 and mac !=u13 and mac !=m1 and mac !=m2 and mac !=m3: print beacon
		#if mac ==m1: print ("mac: ",mac,"uuid: ",uuid,"RFFI: ",db2 ,"db1 : ",db1)
		if mac ==m1:
			#print "UUID: "+uuid +" Major: "+major +" Minor: "+minor +" Mac: "+mac +" RFFI:",db1,db2      
			message="{\"devicename\":\"Danny_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"rffi\",\"value\":\""+db21 +"\"}"
			#publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp") 
		if mac ==m3:
			#print "UUID: "+uuid +" Major: "+major +" Minor: "+minor +" Mac: "+mac +" RFFI:",db1,db2      
			message="{\"devicename\":\"Mark_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"rffi\",\"value\":\""+db21 +"\"}"
			#publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp") 
		if mac ==m2:
			#print "UUID: "+uuid +" Major: "+major +" Minor: "+minor +" Mac: "+mac +" RFFI:",db1,db2      
			message="{\"devicename\":\"Mom_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"rffi\",\"value\":\""+db21 +"\"}"
			#publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp") 
		if mac ==m4:
			#print "UUID: "+uuid +" Major: "+major +" Minor: "+minor +" Mac: "+mac +" RFFI:",db1,db2      
			message="{\"devicename\":\"Mia_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"rffi\",\"value\":\""+db21 +"\"}"
			#publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp") 

		
		
		if mac ==m1:
			print "Danny Wohnzimmer Empfang: ",db2
		if mac ==m2:
			print "Mom Wohnzimmer Empfang: ",db2
		if mac ==m3:
			print "Mark Wohnzimmer Empfang: ",db2
		if mac ==m4:
			print "Mia Wohnzimmer Empfang: ",db2


		if mac ==m1 and pi=="false" and db2 < 89: 
			print "Mi-Band  da"
			pi="true"
			piweg=0;
			message="{\"devicename\":\"Danny_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present3\",\"value\":\"true\"}"
			publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")
		
		if mac ==m1 and pi=="true":
			piweg=0
		if mac !=m1 and pi=="true":
			piweg=piweg +1
			#print "Danny: ",piweg
		if mac !=m1 and pi=="true" and piweg >=1000: 
			print "Mi-Band  nicht da"
			pi="false"
			message="{\"devicename\":\"Danny_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present3\",\"value\":\"false\"}"
			publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")

		
		#if mac ==m2:
		#	print "UUID: "+uuid +" Major: "+major +" Minor: "+minor +" Mac: "+mac +" RFFI:",db1,db2       
		if mac ==m2 and pi2=="false" and db2 < 89: 
			print "Mi-Band Mom  da"
			pi2="true"
			piweg2=0;
			message="{\"devicename\":\"Mom_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present3\",\"value\":\"true\"}"
			publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")

		if mac ==m2 and pi2=="true":
			piweg2=0
		if mac !=m2 and pi2=="true":
			piweg2=piweg2 +1
			print "Mom: ",piweg2
		if mac !=m2 and pi2=="true" and piweg2 >=1000: 
			print "Mi-Band Mom  nicht da"
			pi2="false"
			message="{\"devicename\":\"Mom_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present3\",\"value\":\"false\"}"
			publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")

	
		#if mac ==m3:
			#print "UUID: "+uuid +" Major: "+major +" Minor: "+minor +" Mac: "+mac +" RFFI:",db1,db2       
		if mac ==m3 and pi3=="false": 
			print "Mark  da"
			pi3="true"
			piweg3=0;
			message="{\"devicename\":\"Mark_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present3\",\"value\":\"true\"}"
			publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")

		if mac ==m3 and pi3=="true" and db2 < 89: 
			piweg3=0
		if mac !=m3 and pi3=="true":
			piweg3=piweg3 +1
			print "Mark: ",piweg3
		if mac !=m3 and pi3=="true" and piweg3 >=1000: 
			print "Mark  nicht da"
			pi3="false"
			message="{\"devicename\":\"Mark_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present3\",\"value\":\"false\"}"
			publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")

		if mac ==m4 and pi4=="false" and db2 < 89:
			print "Mia  da"
			pi4="true"
			piweg4=0;
			message="{\"devicename\":\"Mia_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present\",\"value\":\"true\"}"
			publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")
		if mac ==m4 and pi4=="true":
			piweg4=0
		if mac !=m4 and pi4=="true": 
			piweg4=piweg4 +1
			print "Mia: ",piweg4
		if mac !=m4 and pi4=="true" and piweg4 >=3000: 
			print "Mia  nicht da"
			pi4="false"
			message="{\"devicename\":\"Mia_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present\",\"value\":\"false\"}"
			publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")
		
		if mac ==m5 and pi5=="false" and db2 < 89:
			print "Papa  da"
			pi5="true"
			piweg5=0;
			message="{\"devicename\":\"Papa_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present\",\"value\":\"true\"}"
			publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")
		if mac ==m5 and pi5=="true":
			piweg5=0
		if mac !=m5 and pi5=="true": 
			piweg5=piweg5 +1
			print "Papa: ",piweg5
		if mac !=m5 and pi5=="true" and piweg5 >=3000: 
			print "Papa  nicht da"
			pi5="false"
			message="{\"devicename\":\"Papa_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present\",\"value\":\"false\"}"
			publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")
		
		if mac ==m6 and pi6=="false" and db2 < 89:
			print "Kristina  da"
			pi6="true"
			piweg6=0;
			message="{\"devicename\":\"Kristina_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present\",\"value\":\"true\"}"
			publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")
		if mac ==m6 and pi6=="true":
			piweg6=0
		if mac !=m6 and pi6=="true": 
			piweg6=piweg6 +1
			print "Kristina: ",piweg6
		if mac !=m6 and pi6=="true" and piweg6 >=3000: 
			print "Kristina  nicht da"
			pi6="false"
			message="{\"devicename\":\"Kristina_Wohnzimmer\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present\",\"value\":\"false\"}"
			publish.single(mqtt_publish, message, qos=1, retain=False, hostname=mqtt_server,port=mqtt_port, client_id=mqtt_clientid, keepalive=60, will=None, auth={'username': mqtt_username, 'password':mqtt_password}, tls=None, transport="tcp")
		
		
	#client.loop_start()
	#time.sleep(0.1)



würde ich gerne, aber auch ich komme wie Jürgen nicht an dem

Traceback (most recent call last):
  File "test.py", line 1, in <module>
    from proximity import *
ImportError: No module named proximity

vorbei.

Hi,
gibt es da irgendein aktuelles Workaround? Ich bekomme es mit einem Raspberry Pi 3 leider weder unter Jessie noch unter aktuellem Stretch zum Laufen. Lescan findet den G-Tag wohl, aber an der Stelle wo die UUID ausgegeben werden soll passiert bei mir leider nichts…

Gruß

Gesendet von iPhone mit Tapatalk

Hallo auch,
ich schleich mich mal hier von den homees ein. :slight_smile:
Wir sind auch gerade bei dem Thema Presence - es klemmt aber noch.
Ich werde mal Euer Script ausprobieren. Statt des linkes auf euren symcon-server, mach ich den webhook auf meinen homee - sollte eigentlich klappen.
Ich denke das ist erlaubt :wink:

Ich nutze G-Tags wie auch iBeacons von Minew (C6).
Mit einer Android-App kann ich beide Chips scannen - mit der homeean-presence erstmal nur iBeacons.
Wobei man die C6 schön selber beschreiben kann. Leider ist der BT-Empfang und Standort meines Dashboards nicht so optimal, darum möchte ich meinen Raspi-z-w irgenwo im Flur verstecken.

Momentan stockt aber die Entwicklung an dem Projekt aus Zeitmangel des Programmierers.
https://community.hom.ee/t/anwesenheitserkennung-mit-homeean-presence/12744
Ich selber habe keine Ahnung und bin mehr der copy/paste-Typ. :wink:

Grüße, Ich melde mich

für @luca
mit dieser App kann man schön die Beacons auslesen:
https://itunes.apple.com/us/app/beaconset/id1264548636?mt=8
https://play.google.com/store/apps/details?id=com.minew.beaconplus&hl=de

Hallo auch,
habe mit meinem gefährlichem Halbwissen soweit alles nachgespielt.
Irgendwas funktioniert noch nicht - ich denke da gint es ein „Rechteproblem“ …
Ich bekomme beim ausführen der scripte ein „Permission denied“.

Was mache ich falsch?
Vielleicht kann mir jemand helfen? :confused:

Vielen Dank

Irgendwas mit den File oder Ordnerberechtigungen deiner Bash Routine passen noch nicht.

Mach einfach mal ein Screenshot von:

ls -l ibeacon_scan.sh ( in dem jew. Verzeichnis)

ls - presence.sh ( in dem jew. Verzeichnis)

Quick&Dirty würde natürlich auch funktionieren:

im jew. Verzeichnis:

chmod -v 777 ibeacon_scan.sh
chmod -v 777 presence.sh

Eine kurze Beschreibung zu den chmod varianten:

chmod - Zugriffsrechte für Dateien und Ordner ändern

Hallo,
Danke für die Antwort. - Muß ich morgen mal testen.
Andere Frage, sonst brauch ich garnicht weitermachen.
Habe nichts über die Mehrfacherkennung gelesen.
Also ich will jedem User einen Beacon/G-Tag zuweisen und ein Webhook Userbezogen an den homee schicken.
Momentan macht das eine Android-App:
https://play.google.com/store/apps/details?id=com.samebits.beacon.locator

Leider hat mein Tablet keinen so dollen Empfang wie der Raspi, ausserdem kann ich hier nur als keinsten Trigger 30sec einstellen.
Darum mein Weg zum Raspi

Hi,

ich habe das mal versucht, aber leider nicht geschafft.
RPI4, Raspbian Buster
Bluez ist installiert ab Werk, hcidump per apt.

Beim Lescan sehe ich meine G-Tags
hcidump gibt mir keine Ausgabe.

Allerdings ist der Thread etwas unübersichtlich geworden. Ist der ursprüngliche Teil überhaupt noch notwendig. Wie kommt der Wer in Symcon an? Webhook?

Mich hätte der Parallelmodus intressiert. Könnte das jemand bitte zusammen fassen?

Danke, Sebastian

Da es inzwischen deutlich einfacher geht, hier eine Zusammenfassung:

Raspberry Pi als Beacon Scanner für Gigaset G-Tags - Reloaded