NEWS
MQTT Bluetooth BLE Anwesenheitserkennung mit ESP32
-
@utze86
Hast du die korrekte esp32 Version von tasmota aufgespielt? Die Shelly haben SingleCore, nicht DualCore, was üblicherweise bei esp32 der Fall ist.Habe selbst erfolgreich ein Shelly Plus 2pm geflashed und verwende es für das Licht. Rollläden mit Tasmota muss ich mich bzgl Kalibrierung einlesen, scheint komplex zu sein.
Habe von hier das binary zum flashen:
(ganz unten solo1 bluetooth)
https://github.com/Jason2866/Tasmota-specials/tree/firmware/firmware/tasmota32/otherBLE muss dann über Einstellungen eingeschaltet werden. Außerdem muss das Scannen per Rule eingerichtet werden, damit es nach reboot weiter funktioniert. Nutze folgende Regeln:
- Rule1 ON System#Boot DO iBeacon 1 endon
- Rule2 ON System#Boot DO BLEAlias E861515FF02E=Giuseppe endon
- Rule3 ON System#Boot DO Backlog iBeaconPeriod 10; iBeaconOnlyAliased 1; BLEMaxAge 20 endon
- Rule1 1
- Rule2 1
- Rule3 1
Mit diesen Regeln wird alle 10 Sekunden ein Scanvorgang gestartet und nur mit Alias versehene MAC Adressen per mqtt übermittelt.
Für den Shelly Plus 2pm gilt folgende Tasmota config:
{"NAME":"Shelly Plus 2PM","GPIO":[320,0,192,0,0,0,1,1,225,224,0,0,0,0,193,0,0,0,0,0,0,608,3840,32,0,0,0,0,0,640,0,0,3456,4736,0,0],"FLAG":0,"BASE":1}
Edit:
Bekomme über den Sonoff Adapter alle ca. 12/13 Sekunden den rssi Wert vom Shelly. Funktioniert also ganz gut. Gefiltert wird leider nicht wie bei espresense. -
@giuseppes ich habe tatsächlich nicht gesehen, dass es auch eine 1-Kern Version von Tasmota Bluetooth gibt. Das könnte mir wirklich weiter helfen. "Leider" bin ich aktuell im Urlaub und kann deinen Vorschlag erst am Wochenende testen.
Kann ich die Scanfrequenz über Ibeacon period noch weiter runter setzten, weißt du ob es eine Untergrenze gibt? Ich denke grundsätzlich wäre ein Wert je Sekunde für eine Raumerkennung praktisch.
Lässt sich dein Shelly weiterhin schalten, oder kannst du mit dem Shelly "nurnoch" Ble scannen?
-
@utze86
Bei meinem ersten Versuch hatte ich auch meinen Shelly in bootloop und war nach Recherche über das Thema SingleCore gestolpert. Glücklicherweise bin ich im Netz auf das verlinkte Repo mit entsprechenden Versionen gestoßen.Bzgl des Scan Intervalls: ich habe keine Grenzen in tasmota gefunden. Hatte die Zeit zu Testzwecken auf 5s und 8s gesetzt, allerdings wurde meine Uhr dennoch alle >10s übermittelt. Von einem esp32 mit espresense weiß ich, dass meine Uhr alle 7-8 Sekunden sendet. Keine Ahnung woran die Erkennung >10s nun liegt. Optimal ist es nicht, aber in Kombi mit Bewegungsmelder gut nutzbar. Anwesenheit würde dann per BWM in einem Bereich erkannt werden und die Abwesenheit über "rssi > x" detektiert werden. Somit wäre Präsenz über BWM sofort erkannt und die Abwesenheit nach ca. 15s oder 30s (wenn zwei Messungen gewartet wird).
-
@utze86
Da sind ja noch weitere unbeantwortete Fragen in deinem Beitrag:Ein Wert pro Sekunde wäre klasse, aber sendet dein "Beacon" auch wirklich jede Sekunde? Espresense scannt wohl kontinuierlich, damit kannst du deinen Sende Intervall prüfen. Leider kam ich mit Tasmota auf eine höhere Intervall Zeit als mit ESPresense.
Der Shelly funktioniert natürlich ohne Probleme mit Tasmota. Shelly nur für ble Scan zu verwenden hätte ich nicht gemacht. Dafür wäre mir der Mehrwert zu gering.
-
KORREKTUR:
Habe nochmal mit Tasmota getestet, den Intervall zu reduzieren. Es funktioniert doch! Rules werden immer nur übernommen wenn einmalig aus/an oder nach einem esp Neustart. Bei einer Sekunde war mir etwas zu viel traffic, außerdem unnötig. Habe es nun auf 3 Sekunden eingestellt, somit sollte ich jeden zweiten Intervall meine Uhr "erwischen". Klappt super. Meine Motivation das Thema weiter zu verfolgen, nimmt weiter zu. -
@giuseppes
Danke für die vielen Hinweise. Ich habe die Hardware für die Varianten Shelly mit Tasmota und esp32 mit Espresene Zuhause und werde am Wochenende mal beide Varianten testen. Bewegungsmelder habe ich ebenfalls noch ein paar zuhause.
Ich werde den Ansatz verfolgen die Shelly Variante mit so wenig Bewegungsmeldern wie möglich umzusetzen. Zwischendurch sind ja auch Gäste im Haus, mal sehen wie ich dass dann umsetze ohne, dass der BWM ständig Licht AN/ Licht AUS macht.Aktuell ist der Plan, dass ich meine Anwesenheit über ein Mi Band 4 tracke. Ich habe ehrlich gesagt, keine Ahnung wie oft das funkt. Ich hatte eigentliche erwartet, dass der Esp das Mi Band innerhalb eines gewünschten Intervalls anpingt. Wenn das ganze vielversprechend läuft denke ich aber über eine neueres Modell oder eine neue Smart Watch nach. Welches Gerät nutzt du bei dir zum tracken?
Der Erfolg mit der Reduzierung des Intervalls klingt viel versprechend. Genau wie, dass du das Thema wieder intensiver verfolgen willst. Am Wochenende klemme ich mich dann auch mal dran.
-
@utze86
Benutze selbst die Mi Band 5. BLE Advertisements werden einfach im Intervall gesendet, da ist nichts mit ping. Klasse wäre es wenn beim Sender das Intervall eingestellt werden könnte, ist aber bei der Mi nicht der Fall. -
Welche Shellys haben denn alle einen ESP32 verbaut?
Ich muss selbst mal eben schauen was ich verbaut habe
Ich habe bei uns im EG1
- Küche 2x Dimmer 2 (ESP32)
- Wohnzimmer 3x Dimmer 2 (ESP32)
- Wohnzimmer 1x Shelly 2.5 (??)
- Flur 1x Dimmer (??)
- WC 1x Shelly 1
EG2
- Büro 2x 2.5 (??)
- Flur 2 2x 2.5 (??)
- Bad 2 Shelly RBBW 2 (??)
Und im OG leider,...
- Treppenhaus 1x Dimmer (??)
- Kind 1 Dimmer (??)
- Kind 2 Dimmer (??)
- Chill Dimmer (??)
- Netzwerk Raum Shelly 2.5 (??)
- Schlafzimmer 1 1x Dimmer (??)
- Gästezimmer 1x DImmer (??)
- Wandschrank 2.5 (??)
- Schlafzimmer 2 1x Dimmer 2 (ESP32)
- Schlafzimmer 2 1x RGBW 2 (??)
- Bad 1x Shelly 1 (??)
- Bad 1x Dimmer (??)
OG2
- Mitte 1x Shelly 2.5 (??)
- Büro2 1x Shelly 1 (??)
Aussenbereich
- 4x Shelly 2.5 (??)
Ich hoffe, dass hier ein paar von geeinigt sind, so dass ich nicht überall externe ESP32 positionieren muss,...
-
@stolly82
Die neuen Plus Modelle verwenden esp32 (SingleCore). Wenn deine Shelly älter sind, werden es wohl noch keine esp32 Modelle sein -
@giuseppes so hab am Wochende den ersten Shelly wie von dir beschrieben geflashed. Hat soweit auch alles gut geklappt. Ich habe die Scanfrequenz mal probeweise auf eine Sekunde gestellt und der Iobroker wirft mir mit von meinem Mi Band 4 ca alle 3 bis 12 Sekunden eine Rssi Wert aus. Das Intervall streut also doch schon sehr, im. Zweifel sollte man das mit den Bewegungsmeldern aber gut in den Griff bekommen.
Im nächsten Schritt werde ich dann mal ein paar mehr shellys flashen und dann auch verbauen.
Verfolgt du noch den Ansatz mit der über die Triangulation? Um zu bestimmen in welchem Raum ich mich befinde würde ich einen Ansatz mit Schnittflächen verfolgen. Indem sich die Rssi Werte von verschiedenen Shellys in einem Raum überschneiden.
Ich bin mir allerdings noch nicht sicher ob ich mit durchschnittlichen Werten arbeiten soll oder ob ich die direkten Rssi Werte nehme. Die Durchschnittlichen Werte mache das ganze doch bestimmt etwas träger, wie wären deine Erfahrungen?
-
@utze86
Zum Intervall inkl ioBroker:
Check am besten in der Tasmota Console vom Shelly, wie häufig da tatsächlich deine Uhr erkannt wird. Innerhalb ioBroker läuft das mit dem sonoff Adapter nicht optimal. Wenn zu viele Aktualisierungen kommen, schafft es der Adapter nicht, die rssi Werte und mac bzw. uid synchron in die States zu schreiben. Evtl müsste man mqtt Adapter verwenden und selbst verarbeiten. Dann wäre alles innerhalb eines json. Leider müsste dann auch die Steuerung über mqtt laufen... Hier bin ich allgemein noch am testenPositionsbestimmung:
Triangulation bringt mit ble rssi nichts. Schwankungen sind zu extrem. Daher habe ich das Thema Fingerprint ins Auge gefasst. Jede interessante Position wird angelernt. D.h. zu jeder Position werden rssi Werte aufgezeichnet und später zum Gegenprüfen wieder verwendet.
Nachteil: sich frei im Raum bewegen führt nicht dazu dass es in einer 2D oder gar 3D Karte nachvollziehbar ist. Es ist mit ble nur ein scheinbarer Nachteil, da es aktuell wegen der rssi Streuung immens viele Sprünge gäbe.
Vorteil: Abweichungen der rssi Werte aufgrund der Scanner Positionen (verdeckt, hinterm Schrank o.ä.) wird beim Anlernen direkt mit berücksichtigt. Die Frage hierbei ist, wie sich die rssi Schwankungen bei diesem Verfahren bemerkbar machen.Fingerprint ist im Vergleich zur Triangulation etwas komplexer in der ioBroker Umsetzung, da Interaktionen nötig sind (start anlernen, welche Position?). Daher müsste ich mit etwas html die VIS einbinden. Werde vsl. im Dezember damit starten.
Zu deinem Ansatz mit den Schnittflächen: Du meinst quasi triangulation innerhalb des Raumes. Das würde sehr viele Shelly / Scanner benötigen, oder versteh ich dich falsch?
Original rssi ist zwar schneller aber schwankt deutlich. Ich hatte mal mit Mittelwerten experimentiert, das war ok aber träger. Im Code von ESPresense habe ich gesehen, dass sie den median von den letzten 3 Werten nehmen. Das finde ich sehr geschickt, da einzelne Ausreißer quasi 0 berücksichtigt werden und die Trägheit noch ok ist. -
Bevor hier alle Shelly plus Modelle auf Tasmota geflashed werden:
Die original Firmware bietet anscheinend auch die Möglichkeit nach ble zu scannen. Bin zufällig drüber gestolpert weil ich gerade alle Shelly zwecks Update durchgegangen bin und ein Skript Beispiel gestoßen bin. Wenn bei den neuen Shellies auf scripts/library geklickt wird, existiert ein Scan Beispiel. Shelly Doku gibt's auch zu dem Punkt:https://shelly-api-docs.shelly.cloud/gen2/Scripts/ShellyScriptLanguageFeatures/#blescanner
Habe selbst weder die Doku gelesen noch das Skript Beispiel getestet. Wenn man aber ein Freund der original Firmware ist (wie ich es bin), wäre das ein möglicher Weg um Tasmota herumzukommen.
-
@giuseppes ja im Prinzip ist es so wie du sagst. Bildlich will ich mehrere Kreisringflächen mit mehreren shellys aufspannen. Dazu müsste ich für jeden Shelly den ich in die Ortung mit einbeziehen will die min rssi Werte und max rssi Werte mit dem Mi Band innerhalb des Raumes ermitteln. Also prinzipiell mit dem Mi Band an der Zimmerwand lang und dir Werte für für shelly 1, 2 und 3 notieren. Der Raum in dem sich alle Kreisringe schneiden müsste dann ziemlich eindeutig definiert sein. Ich könnte dann also sagen wenn mein Mi Band sich in Ring 1 und Ring 2 und Ring 3 befindet bin ich bspw. In der Küche. Wenn das signal gut genug ist könnte ich für das erzeugen dieser Fläche auch auch die shellys aus den Nebenräumen mit einbeziehen. Dann müsste ich nicht jeweils 3 shellys in jedem Raum platzieren. So wäre zumindest mein erster plan.
Das ganze über den Median zu realisieren klingt interessant. Man müsste mal gucken wie träge das ganze dadurch wird.Den Tipp mit der Tasmota Konsole werde ich mal testen um die optimale frequenz für die scans anzupassen. Hast du für die Fingerprintvariante einen link wo man sich ei lesen kann? Klingt auf jeden fall interessant.
-
@giuseppes da bin ich gestern auch drüber gestolpert. Scheint eine Funktion der neuen Beta zu sein. Werde ich mir auch mal ansehen und würde mir auch entgegenkommen. Dazu muss ich dann aber auch gucken wie ich die beiden Tasmota shellys zurück geflasht bekomme. Bisher habe ich noch keine original shelly Firmware für den Shelly plus 1 gefunden um wieder zurück zu flashen. Bin leider auch im shelly forum bisher noch nicht fündig geworden.
-
@utze86
Ich müsste nur einen Shelly zurück flashen. Habe mich damit aber noch nicht beschäftigt, weil ich erstmal die Machbarkeit analysieren wollte. Eine Sache ist nämlich, die Signale über den Shelly zu empfangen, aber die Daten dann in ioBroker zu bekommen steht woanders geschrieben. Mqtt ist über den Shelly Adapter quasi blockiert. Der Adapter ist jedenfalls nicht für beliebige mqtt topics ausgelegt. D.h. rssi Werte + Standard Steuerung über mqtt ist nicht möglich.
Was möglich wäre, über Javascript in ioBroker einen outbound websocket laufen zu lassen. Da gibt's auch was von shelly / alterco, habe ich gestern gefunden (auch noch nicht getestet):
https://github.com/ALLTERCO/shelly-outbound-websocketsZum Thema Fingerprint:
https://synyx.de/blog/fingerprinting-indoor-positionsbestimmung-mit-bluetooth-low-energy-2-2/Deine Umsetzungsidee klingt gut. Muss definitiv funktionieren wenn günstig gelegene Shelly für beide Seiten der Wand genutzt werden. Mit den Min UND Max Werte zu arbeiten, statt mit median o.ä. würde definitiv die Trägheit mindern. Die Umsetzung des Algorithmus bei der späteren Standortbestimmung würde mich interessieren.
Zum Fingerprint habe ich folgende Umsetzung im Kopf:
- zunächst werden alle Scanner dem System bekannt gemacht.
- "Neue Position anlegen" wird ausgelöst worauf die gewünschten Scanner ausgewählt werden müssen
- Anlernvorgang läuft eine gewisse Zeit X, wobei definitiv mehrere Werte je Scanner ermittelt werden müssten. Ermittelte Werte würden gefiltert werden bzw median o.ä. (evtl mit Min und Max Werten aus deinem Vorschlag?).
- Bei der späteren Auswertung werden alle gespeicherten Positionen durchlaufen und mit den aktuellsten Scannerwerten verglichen. Es werden immer nur die relevanten Scannerwerte der gespeicherten Position betrachtet.
Hatte es öfters durchgespielt, so umzusetzen wie im obigen link und immer alle Scanner einbeziehen. Aber es könnten mehrere Probleme auftreten. Z.B. was passiert wenn man in der Nähe eines Scanners ist und sich "schnell" wegbewegt, sodass man nicht mehr in Reichweite ist? Der Scanner würde immernoch einen nahen Wert anzeigen und der Timestamp wäre trotzdem nicht älter als 10s.
Ich würde nur statisch relevante Positionen anlernen. Das wären z.B. Vorzugsplätze am Esstisch, auf der Couch, am Schreibtisch etc.
Das System schätze ich träge im Bereich von bestimmt 10s ein. Bereiche, wo ich eher durchlaufe sind somit weniger relevant, könnten aber bei Ungenauigkeiten als vermeintlicher Standort ausgewertet werden.Mit den Shelly ist es jedenfalls sehr interessant geworden, da somit automatisch viele Scanner zur Verfügung stehen und man nichts mit "nackten" esp32 basteln muss. Steckdosen würden unnötig belegt werden etc.
Ich teste im nächsten Schritt, wie das mit dem Shelly + WebSocket funktioniert. Es gibt bei den Shelly sogar infinite Scanintervalle. Könnte so sein wie bei espresense, sofort ein Wert wenn der Beacon / die Uhr sendet.Zum Thema Beacon: habe neuerdings die Pixel Watch und habe eine apk installiert, die einen Beacon simuliert. Funktioniert auch ganz gut. MAC ist aber dynamisch, daher muss ich auf die UID achten. Mit ESPresense kein Problem, mit Shelly... mal schauen
-
@giuseppes Thema Fingerprint muss ich mir mal am Wochenende angucken. Was das Thema WebSocket angeht blicke ich tatsächlich überhaupt nicht durch. Ich bin gespannt was du dir überlegst.
Inzwischen habe ich allerdings ein Eintrag in der englischen Shelly Support Gruppe auf Facebook gefunden der von "Shelly selbst" stammt. Wenn ich das richtig lese gibt es dort ein Script als Beispiel wo ein Sensor per Shelly über BLE ausgelesen wird und das ganze per MQTT übermittelt wird. Lässt sich das für unsere Zwecke anpassen? Der Eintrag ist noch recht frisch:
https://www.facebook.com/groups/ShellyIoTCommunitySupport/permalink/5383581891741131
-
@utze86
Habe mir das eben in den Werbepausen auf dem Handy angeschaut und bisschen mit dem Skript getestet. Du kannst das original Skript direkt im Shelly laden, über Scripts/Library kannst du es wählen.
Mit fixer MAC hatte es einwandfrei geklappt, ausschließlich MAC + RSSI auszugeben. Damit mein ich die Ausgabe innerhalb der Konsole der Shelly Web Oberfläche. Ich teste(te) gerade noch wie ich die UUID eines Beacon auslesen kann. Habe hierzu noch keine Lösung, aber es sollte funktionieren.
Auf jeden Fall konnte ich sehen, dass das kontinuierliche Scannen anscheinend super klappt. Verschiedene Geräte wurden mehrfach innerhalb weniger Sekunden erfasst.
Bzgl Shelly wäre also noch offen, wie ich auf die UUID vom BLE Gerät zugreifen kann und die Übertragung zu ioBroker (websocket oder outbound websocket).Da das Auslesen der UUID noch etwas dauern kann, werde ich versuchen zeitnah die Übertragung zu ioBroker umzusetzen. Könnte dann die paar Zeilen hier teilen. Dann könntest du mit der Mi Band schon etwas weiter testen. Werde hoffentlich dieses Wochenende Zeit dafür finden. Bin selbst auch neugierig, wie gut alles klappt.
-
@giuseppes klingt sehr vielversprechend, ich werde die Tage auch mal etwas mit Script spielen und bin gespannt was du noch so raus bekommst. Leider kann ich nicht immer so viel dazu beitragen, da ich mich mit dem programmieren etwas schwer tuhe. Meist bin ich mit Blockly unterwegs. Aber mit viel fummelei bekomme ich die meisten Sachen für mich adaptiert. Und werde natürlich auch die Lösung bezüglich meiner Schnittflächen hier teilen. Ich bin gespannt wie es funktioniert.
Was versprichst du dir von dem auslesen der UUID, bzw. Wofür ist das wichtig? Für die Zuordnung der unterschiedlichen Geräte oder wobei kann das helfen?
-
@utze86
Android Smartphones und auch meine Pixel Watch können mit Hilfe von Apps iBeacon simulieren und somit BLE advertisements senden. Aber die MAC ist leider nicht konstant, das lässt das Betriebssystem nicht zu. Ähnlich ist es ja auch bei Apple Geräten. Was aber zumindest bei den Android Apps konstant bleibt, das ist die UUID, die mitgesendet wird. Espresense bildet seine Gerätenamen auch entweder mit MAC oder den UUID. Mi Band sendet immer mit selber MAC, somit brauchst du das das mit der UUID nicht. -
Aus dem ganzen BLE code vom Beispielskript ist eigentlich nur das notwendig:
function scanCB(ev, res) { if (ev === BLE.Scanner.SCAN_RESULT) { let StaticMAC = { "addr": res.addr.slice(0,-2), "rssi": res.rssi }; //print( JSON.stringify(StaticMAC)); Shelly.emitEvent( "ShellyScanresult", StaticMAC); } } BLE.Scanner.Start({ duration_ms: -1}, scanCB);
Über die Websocket Verbindung wird dann MAC und RSSI ausgegeben. Ich wollte eben den Outbound server von Shelly in iobroker einbinden. Dabei ist mir aber aufgefallen, dass das letzte ALexa Update einige meiner Skripte zerschossen hat. Bedeutet, die Websocket Seite von iobroker aus steht noch nicht.
Habe übrigens die Scan-Aktivitäten vom Shelly mit meinem Mi Band 6 getestet (habe ich ja noch daheim). Das Band wurde kontinuierlich alle 9 Sekunden empfangen. ESPresense empfängt alle 5 Sekunden. Evtl müsste man an den Scaneinstellungen vom Shelly optimieren. Aktuell steht es auf Infinite Scan, hätte eigentlich das Optimum sein sollen...