Raspberry Pi + Python + MQTT + Bluetooth = Bluetooth Scanner

Ich habe mich mal wieder mit Bluetooth und BLE beschäftigt.

Ich habe ein super simples Python Script für den Pi geschrieben:

#!/usr/bin/python

import bluetooth
import time
import paho.mqtt.client as paho
import json


#Config 

mqtt_username="lol"
mqtt_password="lol"
mqtt_server="192.168.4.5"
mqtt_port="1883"
mqtt_subscribe="/device/bl/remote"
mqtt_publish="/device/bl/status"


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="pwm", 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)

print "In/Out Board"

while True:
	print "Scanning " + time.strftime("%a, %d %b %Y %H:%M:%S")
    #print "Scanning " + time.strftime("%a, %d %b %Y %H:%M:%S", time.gmtime())
    client.loop_start()
    result = bluetooth.lookup_name('40:9C:28:01:F3:82', timeout=5)
    if (result != None and anw1 =="false"):
        print "Danny: in"
        message="{\"devicename\":\"Danny\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present\",\"value\":\"true\"}"
        client.publish(mqtt_publish, message, qos=1)
        anw1="true"
    if (result == None and anw1 =="true"):
        print "Danny: out"
        message="{\"devicename\":\"Danny\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present\",\"value\":\"false\"}"
        if anw1 =="true": client.publish(mqtt_publish, message, qos=1)
        anw1="false"

    result = bluetooth.lookup_name('98:CA:33:BF:0F:5D', timeout=5)
    if (result != None and anw2 =="false"):
		print "Mom: in"
		message="{\"devicename\":\"Mom-PPI\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present\",\"value\":\"true\"}"
		client.publish(mqtt_publish, message, qos=1)
		anw2="true"
    if (result == None and anw2 =="true"):
        print "Mom: out"
        message="{\"devicename\":\"Mom-PPI\",\"model\":\"presenter\", \"room\":\"labor\", \"infoart\":\"present\",\"value\":\"false\"}"
        client.publish(mqtt_publish, message, qos=1)
        anw2="false"

    time.sleep(1)
    

Das Script scannt jede 5 Sekunden welche Bluetoothgeräte in Reichweite sind und wenn die Mac Adresse übereinstimmt dann sendet Sie per MQTT, und wenn es das Gerät wieder weg ist, wird diese Info auch via MQTT gesendet…

Hallo drapple,

kann mann die Ausgaben vom Pi an Windows Symcon weiterleiten? Oder muss das Zielsystem auch auf dem Pi sein?
Gruß Jens

Das Ziel kann alles sein, wenn es mit MQTT sprechen kann…

Wenn gewünscht kann ich auch eine Version machen, die die Info per HTTP Get (Webhook) an IPS sendet…

Schreib mir mal was Ihr gerne haben möchtet…

Hallo drapple,

gern würde ich auf dein Angebot zurückkommen und mich sehr über eine Webhook-Version freuen.

Ich habe mir diverse BLE-Knöpfe (RDL51822) zugelegt, um iBeacon auszuprobieren, komme aber über das einfache erkennen als BT-Informationslieferant via iPhone nicht hinaus. Das allerdings funktioniert gut, meine verlegten Schlüssel finde ich inzwischen so wieder.

Wenn es dein Service jetzt als Webhook geben würde, dann muss ich mich nicht in MQTT einarbeiten. Webhook funktioniert gut bei mir (Geofency). Und ich könnte dann eine Anwesenheitskontrolle auf einfachem Weg realisieren.

Gruß Robert

So habe mal auf die schnelle dir was zum testen geschrieben:

Python auf Pi:

#!/usr/bin/python

import bluetooth
import time
import requests

#Config 

server="http://192.168.0.83:3777/hook/bt"

global  anw1
global  anw2

anw1="false"
anw2="false"
  
	
message={'bt1': 'false'}
r = requests.get(server, params=message)

print "In/Out Board"

while True:
    print "Scanning " + time.strftime("%a, %d %b %Y %H:%M:%S")
    #print "Scanning " + time.strftime("%a, %d %b %Y %H:%M:%S", time.gmtime())
    
    result = bluetooth.lookup_name('40:9C:28:01:F3:82', timeout=5)
    if (result != None and anw1 =="false"):
        print "Danny: in"
        message={'bt1': 'true'}
        r = requests.get(server, params=message)
        anw1="true"
    if (result == None and anw1 =="true"):
        print "Danny: out"
        message={'bt1': 'false'}
        r = requests.get(server, params=message)
        anw1="false"

    time.sleep(0.1)   

IPS Hook Script:

<?

if (@$_GET  !="") $getorpost=$_GET; // Prüfen ob es per Get gesendet wird....

IPS_LogMessage("Pi Bluetooth", print_r($getorpost, true)); // Debugging !
?>

Du musst natürlich auch den Hook in IPS noch anlegen !

Herzlichen Dank für diese superschnelle Reaktion.

Probiere ich heute Abend Zuhause einmal aus.

Das interessiert mich… welche Reichweite hat denn der Pi über Bluetooth? Wie weit entfernt darf man mit dem Handy sein?
Gruss Michael

1,2 Räume kommt man schon weit

Gesendet von iPhone mit Tapatalk

Hallo drapple,

die Programme funktionieren bei mir, meine Bluetooth-Buttons leider nicht. Die werden vom Python nicht erkannt. China-Trödel.

Nochmals vielen Dank!

Hi die werden wahrscheinlich über BTL angebunden / gefunden und das ist ein anderes BT Protokoll…

Poste mal einen Link von den Dinger…

… seit ihr hier weiter gekommen?

Ich bin weitergekommen, ich kann mein Mi Band und eine BLE Schlüsselanhänger somit erkennen…

Kannst du mir sagen welche genau du bestellt hast?

Hallo drapple,

das Stichwort „Bluetooth Erkennung“ elektrisiert mich im Moment.
Ich bin so ein Elektroauto-Fahrer und fahre einen Renault ZOE. Dieses, wie fast alle anderen E-autos sind regelrechte Datengräber. Die wissen viel, telefonieren es auch ganz gerne nach Hause, aber geben an den Eigentümer/Fahrer nix oder nur sehr ungern heraus. Aber es gibt haufenweise Daten, die auf dem CAN-Bus spazieren fahren:
Kilometerstand, Ladezustand, Gesundheitszustand, mögliche Ladeleistung, Temperatur des Akkus und noch unzähliges mehr.
Wenn man den Akku eines E-Autos nun als variable Netzlast begreift und entweder bevorzugt mit der eigen PV-Anlage oder zu netzdienlichen Zeiten mit definierter Ladeleistung lädt, dann ist man ganz nah dran am Energiemangement.

Nun haben sich schon einige Leute darum verdient gemacht, diese Daten für Smartphones zugänglich zu machen, für die ZOE ist das wichtigste Projekt diesbezüglich CanZE. Allerdings landen die Daten dabei nur auf dem nächsten Datengrab, dem Smartphone und sie landen da auch nur, wenn man während der Fahrt das Smartphone und das CanZE angeschaltet hatte. Alles höchst unzuverlässig. Die Daten werden über einen Can-Bus-Bluetooth-Dongle zugänglich gemacht (der nen Knicker und nen Knop kostet).

CAN-Bus und BT-Dongle haben nach dem Abstellen des Fahrzeugs noch einen Nachlauf von 3-4 Minuten. Das wäre ein Zeitfenster, in dem man die aktuellen Daten auslesen und in das IP-Symcon einspeisen und dort zunächst einmal archivieren könnte.

Hast Du Ideen, wie man sowas umsetzen könnte?

Hi ja hätte eine Idee aber das wäre hier falsch, dafür würde ich ein neues Thema aufmachen

Gesendet von iPhone mit Tapatalk

Ich versuche auch gerade ein gigaset g-tag zu finden.
Muss ich im hintergrund ein lescan starten oder NUR das python script? Ich verwende einen raspi 3 mit aktuellem raspbian.
Laufen tut das skript 10x pro sekunde, aber gefunden wird leider nichts :frowning:

Hi du musst nur das Script laufen lassen, und zuvor natürlich die Mac Adresse anpassen

Hi drapple,

das habe ich gemacht. Sogar als root.
Leider wird die MAC nicht gefunden.
habe es auch schon mit print ausgaben probiert um der Sache auf dem Grund zu gehen.
Es wird mit python2 ausgeführt und die python-bluez libs sind auch installiert.
Weder eine BLE MAC klappt (g-tag) noch die von einem android tablet…
Hast Du noch nen Tipp?

Hm ist der G-Tag nicht Bluetooth Low Energie ?

Doch, sollte er sein.
Beim ersten Aufruf braucht das skript etwas länger, ansonsten rauscht das skript schnell durch.
Daher hatte ich die Vermutung der BT Call im Python macht Probleme.
Habe auch mal testweise das timeout von 5ms auf sekunden gesetzt…

edit: ein hcitool lescan wirft es aus…
rufe ich in der shell ein python auf und gebe dann in python ein:

import bluetooth
print bluetooth.lookup_name('7C:2F:XX:XX:XX:XX', timeout=5)

so sagt er stets NONE :frowning: