Mit
sudo hcitool lescan
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
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:
<?
/*
* @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.
#!/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).
#!/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;
<?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
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.
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
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.
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?
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:
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