NEWS
Pi 3 als Bluetooth LE Scanner (Beispielscript)
-
falls mal jemand spielen möchte…
<size size="150">Bluetooth LE Scanner für den Raspberry Pi 3</size>
(oder andere Rechner mit Bluetooth 4.0- Linux, Windows oder Mac OS X)
Installation:
1.) Für Linux: Linux Bluetooth Protokoll Stack - BlueZ installieren (für Windows und Mac OS X, s.u.)
sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev
2.) "noble" in der Javascript Instanz (Config) eintragen (ohne Anführungszeichen)
3.) globales Skript: logs() (Post Nr. 2) in die globalen Skripte kopieren und starten
4.) Bluetooth Scanner Skript (Post Nr. 3) in Skripte kopieren und starten
Fertig. Skript läuft mit den Default-Einstellungen und legt alle Datenpunkte unter javascript.x.Bluetooth an.
Voraussetzungen
- raspberry Pi 3 oder einen Linux-Rechner, der BlueZ unterstützt mit Bluetooth 4.0
Für Windows und Mac OS X Rechner siehe: https://github.com/sandeepmistry/noble#prerequisites
- ioBroker Javascript-Adapter ab Version 2.x
Rückstandslos aus ioBroker löschen:
-
beide Skripte löschen
-
Pfad javascript.x.Bluetooth in den Objekten löschen (ein Mausklick unter Admin/Objekte)
-
.
Globales Skript logs()
Version: 0.1.1
logs() ermöglicht ein abgestuftes Logging innerhalb eines Skripts.
Falls jemand das globale Script nicht einsetzen möchte kann man am Anfang des Bluetooth Skripts einfach folgendes einfügen:
function logs(text,level,color) { //log(text,"debug"); // Kommentar entfernen, wenn Logging erwünscht }
globales Skript logs():
! ````
// globale Funktion: logs(logtext,level,color)
// Version: 0.1.1
! // Beschreibung: Ermöglicht innerhalb eines Javascript-Scripts unterschiedliche Loglevel
// Benutzung, wie log() mit der zusätzlichen Option die Ausgabefarbe zu überschreiben
! // Übergabeparameter: logtext der Text, der als Log ausgegeben werden soll
// level [optional] der Loglevel der Meldung als String
// der level (mögliche Werte definiert in JSON loglevels), in dem der Text ausgegeben werden soll
// color [optional] die html-Farbe der Meldung als String, siehe z.B.: http://tomheller.de/theholycymbal/html-farben.html
// "none" -> es wird die Standardfarbe von log() im Level Info ausgegebn.
// nichts angegeben -> es werden die Farben ais dem JSON loglevels je nach level ausgegeben
// html-Farbe übergeben -> es wird die übergebenen Farbe ausgegeben
! // Rückgabe: Gibt den aktuellen Loglevel für diesen Aufruf zurück.
// Gültiger level beim Aufruf -> der im Script definierte Loglevel wird zurückgegeben
// kein Level angegeben -> es wird der Level "info" verwendet und zurückgegeben
// ungültiger Level -> es wird der Level "info" verwendet und zurückgegeben
! // Infos: Benötigt im Javascript, welches die Funktion logs() verwendet
// die Variabele loglevel, z.B. var loglevel = "info";
//
// 0.1.1 Default Loglevel ergänzt
! // -----------------------------------------------------------------------------
! // globale Scripte werden vor dem eigentlichen Script als Text reinkopiert
// daher kann im globalen Script eine Variable einen Defaultwert enthalten
! var loglevel = 'info'; // Default Loglevel, wenn der Loglevel im aufrufenden Script nicht definiert ist! // -----------------------------------------------------------------------------
// Script Log - logs() - ANFANG
// -----------------------------------------------------------------------------
var loglevels = {
"debug2": {"level": -2, "leveltext":"debug2: ", "color": "blue"},
"debug1": {"level": -1, "leveltext":"debug1: ", "color": "mediumblue"},
"debug": {"level": 0, "leveltext":"debug0: ", "color": "darkblue"},
"debug0": {"level": 0, "leveltext":"debug0: ", "color": "mediumblue"},
"info": {"level": 10, "leveltext":"", "color": "none"},
"warn": {"level": 20, "leveltext":"warn: ", "color": "darkorange"},
"error": {"level": 30, "leveltext":"error:", "color": "darkred"}
};
! function logs (logtext,level,color) {
! // in der Funktion den gesetzten Level überprüfen
if (typeof level == 'undefined') {level = 'info'}
if (level in loglevels) {} else {
log("ungültiger loglevel " + level + " in Funktion logs() im Script","warn");
log("loglevel für das Script auf Stufe: " + loglevel + " gesetzt.","warn");
level = 'info';
loglevel = level;
}// den im Script konfigurierten Loglevel prüfen // zum Scriptstart muss die Variable loglevel deklariert werden // z.B.: // var loglevel = "warn"; if (typeof loglevel == 'undefined') {loglevel = 'info'} if (loglevel in loglevels) {} else { var loglevelError = loglevel; loglevel = 'info'; // Loglevel auf Info stellen, wenn kein gültiger Loglevel im Script deklariert ist log("ungültiger loglevel für logs() in der Konfiguration im Script","error"); log("variable loglevel am Anfang des Scripts einem gültigen Wert zuweisen","error"); log('im Script konfigurierter loglevel: ' + loglevelError + ' -> geändert in: ' + loglevel) + '',"warn"; }
! // Farbe ernitteln
if (typeof color == 'undefined') {color = loglevels[level].color}
! // Log je nach eingestelltem Loglevel ausgeben
var levelConf = loglevels[loglevel].level;
var levelLogs = loglevels[level].level;
if (levelLogs >= levelConf) {
if (color == "none") {
log(loglevels[level].leveltext + logtext);
} else {
log('' + loglevels[level].leveltext + logtext + '');
}
}
! return loglevel;
}
// -----------------------------------------------------------------------------
// Script Log - logs() - ENDE
// -----------------------------------------------------------------------------
! ```` -
.
Script: "Bluetooth Scanner für Raspberry Pi 3 (oder andere kompatible Geräte mit BT)"
Version: 0.4.1
ACHTUNG: 0.2.16 Ein Datenpunkt wurde geändert. Objektzweig Bluetooth vor Neuinstallation löschen.
0.4.1 (14.06.2016) - fix: manuelles löschen über Control.Delete_Device
0.4.0 (17.04.2016) - diverse Erweiterungen
0.2.16 (30.03.2016) - Fehler beseitigt, wenn im ersten Durchlauf 0 Geräte gefunden wurden
0.2.15 (29.03.2016) - Fehlerkorrekturen, Channelnamen umbenannt
0.2.13 (28.03.2016) - Kalibrierung hinzugefügt, Distanzberechnung optimiert, Optimierungen
0.2.10 (27.03.2016) - Blacklistbehandlung hinzugefügt, Script aufgeräumt
0.2.8 (26.03.2016) - Channelname möglichst lesbar soweit bekannt, Optimierungen
0.2.7 (25.03.2016) - Optimierungen, Hersteller anhand der Mac-Adresse, neue Datenpunkte, neue Funktionen
Skript Bluetooth Scanner:
zum Download:
-
Ziele des Skripts
1.) Nutzung zur Anwesenheitserkennung über Bluetooth "Tags" oder anderen Geräte, die dauerhaft Bluetooth Funkfeuer aussenden..
2.) Geräteüberwachung per Bluetooth als Alternative zum Ping.
3.) Einfach als Bluetooth Scanner
4.) Für Indoor Ortung
Wenn das Skript Sinn macht und auch ein gewisser Bedarf besteht wird das vielleicht mein zweites Projekt für einen Adapter
Bei mir wird es nicht auf meiner ioBroker Hauptinstallation eingesetzt, sondern auf einen eigenen Raspberry Pi 3, der einige Spezialaufgaben mit einer zweiten ioBorker Installation übernehmen wird.
Ein Bluetooth Sender am Schlüsselbund wäre die zuverläslichste Anwesenheitserkennung.
Anspruch an das endgültige Skript
-
möglichst wenig oder kein Eingriff für den User (ist jetzt schon der Fall)
-
Verhalten komplett über Datenpunkte konfigurierbar (als wäre es eine Konfigurationsseite eines Adapters). Expertenmodus: Einstellungen im Skript.
Bisherige Erfahrung
-
ein Fitbit One sendet dauerhaft und kann zum Tracking verwendet werden
-
Mi Band von simpixo kann ebenfalls für das dauerhafte Tracking verwendet werden
-
Ti SensorTag CC2650STK sendet dauerhaft
-
Ein Gigaset G-Tag funktioniert ebenfalls, solange er nicht an der G-Tag App angemeldet ist. http://www.amazon.de/Gigaset-Bluetooth- … aset+g-tag
-
Garmin vívosmart HR
-
Garmin Forerunner 920 / 008706e5
-
ein Apple Pencil sendet nur selten. Allerdings taucht der selbe Pencil schon mit zwei Mac-Adressen auf. (kann nicht zur Anwesenheitserkennung genutzt werden, würde aber auch kein Sinn machen)
-
Mein Lichtwecker Withings Aura sendet dauerhaft Bluetooth. Das Skript könnte zur Überwachung des Lichtweckers genutzt werden und dann mich alternativ anders wecken, sollte der Wecker "ausgefallen sein" (Gong, Licht einschalten, Sonos, …).
Langzeittest
Momentan läuft das Skript ein paar Tage vor sich hin, ums zu sehen, was passiert (Lastverhalten bei vielen Devices). Danach geht es in der Programmierung weiter.
Im Skript lädt sich einstellen, welche Mindestsignalstärke (rssi) ein Gerät haben muss, damit es mit Datenpunkten angelegt werden soll. Derzeit sind es -100 dB. Stellt mal eine größere Zahl ein, z.B. -80 dB, werden weiter entfernte Geräte nicht gescannt und damit auch keine Datenpunkte erzeugt.
todos
-
Test mit anderer Hardware als den Pi 3 (ein Pi 1 und 2 mit externen USB-Bluetooth Dongle wird auch getestet. Davon habe ich noch ein paar rumstehen)
-
Dokumentation in diesem Thread. Screenshots. Skript Beschreibung (im Skript selbst steht schon einiges)
-
ERLEDIGT:Herstellernamen im Skript lesbar hinbekommen (Javascript Pufferbehandlung…)
-
ERLEDIGT: Whitelist. Nur bekannte Geräte scannen (ist sehr schnell eingebaut)
-
Interne Optimierungen und mehr Features
geplante Erweiterungen
-
Datenpunkt: Liste als JSON aller gefundenen neuen Devices mit Datum und Uhrzeit
-
Per Datenpunkt Switch: Scan neuer Geräte für einen einstellbaren Zeitpunkt,z.B eine Stunde. Neue Geräte werden dann in einen eigen Zweig zusätzlich erfasst. Zweck: neue Geräte schnell identifizieren; "Besuch" auf BLE scannen.
Über ein kurzes Feedback würde ich mich freuen, falls jemand das auch testet. Hat es sofort geklappt, gab es Stolpersteine, ging es gar nicht, Probleme, Nutzen, Wünsche, Verbesserungsvorschläge, Ideen…?
-
-
Interessant! Muss ich wohl mal selbst ausprobieren! Werden auch BLUETHOOTH LE Geräte gefunden!?
Gesendet von meinem iPhone mit Tapatalk
-
… Werden auch BLUETHOOTH LE Geräte gefunden!? `
Genau um die geht es
Das node.js Modul noble:
A Node.js BLE (Bluetooth Low Energy) central module
https://github.com/sandeepmistry/noble#prerequisites
[EDIT] Ich habe dann auch mal die Überschrift geändert. Danke!
-
Also ich habe beim ersten installieren des noble Paket, haufenweise Fehler kassiert, erst nachdem ich folgende Pakete installiert habe wurde es korrekt installiert
sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev
Vielleicht solltest du das in deinem ersten Beitrag erwähnen [emoji6]
Ich teste dann mal weiter
Gesendet von iPad mit Tapatalk
-
oh
Schande über mein Haupt
Du hast natürlich recht. Bluez ist Voraussetzung. Ergänze ich noch
Gesendet von iPhone mit Tapatalk
[EDIT] @simpixo: ich habe das in der Beschreibung ergänzt. Danke!
-
Hatte ich auf meinen Raspi 3 noch nicht drauf aber jetzt läuft es und hat mein Mi Band gefunden [emoji6][emoji1360]
Gesendet von meinem iPhone mit Tapatalk
-
ich sehe das hier in Tapatalk nicht…
wenn Du nur Dein Mi Band scannen willst... oben im Script ist eine Variable, in der jetzt nur ein leeres Array deklariert wird [], d.h. scanne alles.
Wenn Du da die mac Deines Mi Bands einträgst scannt das Skript nur noch das Mi Band.
["badefee12345"]
Gesendet von iPhone mit Tapatalk
-
Geilomat [emoji1360][emoji1360][emoji1360]
Gesendet von meinem iPhone mit Tapatalk
-
Gesendet von meinem iPhone mit Tapatalk `
Hat das eigentlich geklappt?
Es ging um die Variable serviceUUIDs. Mir viel dann noch ein, dass ich noch gar nicht getestet hatte, ob dort die Mac-Adresse rein muss oder die UUID. Ich gehe mal von der Mac-Adresse aus.
-
habe nun mein RPi3 neu aufgesetzt
nach anleitung installiert
und es läuft :!:
Nun mal schauen was alles so gesehen wird
Gruß
Jürgen
-
es wird nun ein Gerät gefunden (Welches auch immer ? )
Tab4 nicht
SmatePhone nicht
BlackBarry nicht
(mal eine Nacht drüber schlafen)
Gruß
Jürgen
-
Hi Jürgen,
danke für das Feedback!
Tab4, SmartPhone und BlackBerry sind keine BLE Geräte.
Mein iPhone, iPads und Macs werden auch nicht angezeigt.
Gefunden werden Geräte, die dauerhaft Bluetooth aussenden, wie Fitnessarmbänder, Bluetooth Tags und Geräte, die sich über Bluetooth zur Konfiguration bemerkbar machen, wie der Aura Lichtwecker.
Warum der Samsung Fernseher der Nachbarn ständig funkt, wenn er an ist… so kann ich denen einen monatlichen Report über deren Fernsehkonsum erstellen
ich hoffe, dass der Gigaset G-tag dazugehört. Am Wochenende werde ich es wissen.
wenn ja kommt der G-tag ans Schlüsselbund und ergänzt meine Anwesenheitserkennung um die dann zuverlässigste Methode.
Bisher mache ich das per:
- Ping auf die iPhones
(in der jetzigen ioBroker Installation gestoppt, da der Ping Adapter auf dem iMac Probleme macht). Funktioniert auch nur, wenn man bei Ankunft den Bildschirm vom iPhone aktiviert oder es am Ladegerät hängt
- ein Raspberry Pi 2 mit Bluetooth Stick als iBeacon und Geofency. Funktioniert besser als die Erkennung über WLAN und Ping. Ist aber auch nicht ganz perfekt. Wenn der Akku vom iPhone leer ist z.B. nicht und manchmal schwankt die Erkennung. Und es zerrt am Akku.
Den Schlüssel hat man immer bei sich und die Batterie soll über ein Jahr halten.
Fitnissarmbänder oder Sticks, wie den Fitbit One sind auch schon oft vorhanden und werden auch oft dauerhaft getragen.
Danke schon einmal für Dein Feedback!
Würde mich interessieren, was da bei dir funkt. Dürfte aber nicht so einfach rauszufinden sein
Gesendet von iPhone mit Tapatalk
-
Hallo Jürgen,
eine kleine Ergänzung. Wenn Du aus Deinen Androids ein Bacon machst, dann dürften die auch funktionieren.
ich habe mal nach einer passenden App gegoogelt:
https://play.google.com/store/apps/deta … uickbeacon
Gruß,
Michael
-
nun sind es bereis 6 Geräte geworden
Gruß
Jürgen
-
nun sind es bereis 6 Geräte geworden `
Hi Jürgen,
Danke für die Info! Laut Screenshot sind es bei Dir nur zwei Geräte (CountAll = 2), ein Gigaset G-tag und ein Samsung TV.
Freue mich gerade. D.h. das G-Tag wird funktionieren
Sind das Deine Geräte (Samsung Fernseher und das/der G-tag)?
VG,
Michael
-
Laut Screenshot sind es bei Dir nur zwei Geräte `
stimmt. Da hatte ich das Bild gemacht.
inzwischen hat er bereits 11 devices gesehen.
und Ja
Es ist ein Samsung TV und
ein Gigaset ?
Gruß
Jürgen
-
ein Gigaset ? `
Ein Gigaset G-tag:
http://www.amazon.de/Gigaset-Bluetooth- … aset+g-tag
Wenn es nicht Deins ist, dann war vielleicht jemand in der Nähe mit so einem Ding.
Auf jeden Fall geht es mir u.a. darum. Ich hab eins zum Test bestellt und mich schon gefreut, dass es bei Dir erkannt wird