ESP32 als Beacon Scanner für Gigaset G-Tags

Hi,

hier eine kurze Anleitung zur Nutzung von ESP32 Modulen als BLE Scanner. Das ganze gibts schon ziemlich lange mit Raspis. Mit den ESPs gehts deutlich leichter.

Danke an @ralf für die Anleitung im anderen Thread.

Als Hardware benötigt ihr einen ESP32, am besten den D1 mini, denn dieser hat eine micro usb Buchse fürs flashen der Firmware und zur Stromversorgung. Gibts zum Beispiel beim großen Fluß von AZ Delivery für gute €6,- pro Stück.

Als Firmware verwenden wir tasmota in der bluetooth Version: tasmota32-bluetooth.bin
http://ota.tasmota.com/tasmota32/

Das flashen ist sehr einfach mit dem Tool ESP-Flasher.
ESP per usb an den Computer, Flasher erkennt automatisch den Port. Firmware Datei von oben auswählen und flashen.
Anleitung: ESP32 (beta) - Tasmota
Tool: Releases · Jason2866/ESP_Flasher · GitHub

Nach dem ersten Booten strahlt der ESP ein WLAN aus. Verbinden und die Zugangsdaten des eigenen WLANs eingeben (Nach Netzwerk suchen, ganz oben verwenden!). Danach startet der ESP automatisch neu und man kann in der Konsole des ESP Flashers das erfolgreiche Verbinden des ESP mit dem eigenen WLAN verfolgen und dort auch gleiche die erhaltene IP Adresse sehen (alternativ im Router nachsehen).

Jetzt gehts es im Browser weiter. IP Adresse des ESP eingeben.
Auf der Oberfläche Configuration → Bluetooth auswählen und bluetooth aktivieren.
Dann MQTT auswählen und den Symcon Server eintragen.
Ich habe sowohl den Namen als auch den Topic geändert, damit ich mich in Symcon leichter tue.

Im jetzigen Zustand sendet der ESP nur sehr selten Informationen nach Symcon. Deswegen passen wir das noch weiter an. Wir legen Regeln fest. Ich habe 3 Stück erstellt, die für mich gut funktionieren. Das kann man bestimmt noch straffen und an die persönlichen Bedürfnisse anpassen.

Main Menu → Console
Nach jeder Eingabe enter drücken

Rule1 ON System#Boot DO iBeacon 1 endon

Ich will nicht so viele Nachrichten, deshalb scanne ich nur nach bestimmten beacons. Das ist optional.
Die mac-Adressen werden ohne Punkte eingeben.

Rule2 ON System#Boot DO BLEAlias MACadresse1=Name1 MACAdresse2=Name2 endon

Und jetzt sagen wir noch, dass wir nur bestimmte wollen und spielen noch mit der Abwesenheitszeit.

Rule3 ON System#Boot DO Backlog iBeaconPeriod 60; iBeaconOnlyAliased 1; BLEMaxAge 60 endon

Möglicherweise bootet der ESP nach Eingabe einer neuen Regel. Da müsst Ihr aufpassen ob die Console auch den Eingang der Regel bestätigt.

Noch sind die Regeln nicht aktiviert und wieder nach jeder Eingabe enter:
Rule1 1
Rule2 1
Rule3 1

Ausschalten der Regeln dann mit Rule1 0 wieder möglich. Überschreiben der Regel auch jederzeit möglich.

Jetzt über Main Menu → Restart

Die Einbindung und Auswertung des Topics in Symcon nur als Beispiel (nicht geprüft, möglicherweise mit Fehler):
Das Skript sollte unterhalb der Kategorie des Scanners sein. Der Topic den ihr braucht ist /SENSOR.
Auslösendes Ereignis ist dann Änderung der Variablen Value unterhalb von SENSOR.

<?php
$sensor_id = IPS_GetInstanceIDByName('SENSOR',IPS_GetParent($_IPS['SELF']));
$value_id = IPS_GetVariableIDByName('Value',$sensor_id);

$J = GetValue($value_id);
$o = json_decode($J,true);
$name = $o["IBEACON"]["NAME"];
$state = $o["IBEACON"]["STATE"];

$InsID =  @IPS_GetInstanceIDByName("Status",IPS_GetParent($_IPS['SELF']));
if ($InsID === false)
	    {
            $InsID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
            IPS_SetName($InsID, "Status");
            IPS_SetParent($InsID, IPS_GetParent($_IPS['SELF']));
        }

CreateVar($name,0,$state);

function CreateVar($Name,$Typ,$Value) {
    global $InsID;
    $Id = @IPS_GetVariableIDByName($Name,$InsID);
      if ($Id === false)
	    {
	       $Id=IPS_CreateVariable($Typ); 
	       IPS_SetParent($Id,$InsID);
	       IPS_SetName($Id,$Name);
        }
        
       if ($Value == 'ON')   SetValue($Id,true);
        if ($Value == 'OFF') ISetValue($Id,false); 
      }
?>

Viel Spaß, Sebastian

3 „Gefällt mir“

Hallo Sebastian,

vielen Dank für die Anleitung. Den ersten Teil konnte ich nachvollziehen und für mich entsprechend anpassen und umsetzen. Das Flashen geht auch unter Windows mit dem neuen Flasher ganz easy.
Könntest du den IPS-Teil noch etwas ausführen?

Ich tue mir mit der Aussage

schwer - bin einfach noch zu grün hinter den Ohren hinsichtlich IPS :wink:

Bei mir ist der Topic in Tasmota: ESP32_iBeacon_1

Topic

was bedeutet das? Ich habe aktuell eine Kategorie „Anwesenheitserkennung ESP32“ angelegt um das ganze Testen zu können. Welcher Scanner ist hier gemeint - gibt es hierfür eine spezielle Instanz die ich noch anlegen muss?

Ändere ich in deinem Script /Sensor auf meinen Topic „ESP32_iBeacon_1/Sensor“ ab?

Ankommen in MQTT tut bei mir:

06.03.2021, 19:13:38 | RECEIVED [192.168.178.53:57061] | 0<DEL><NUL><ESC>tele/ESP32_iBeacon_1/SENSOR{"Time":"2021-03-06T19:13:38","IBEACON":{"MAC":"589EC62043B2","RSSI":-70,"STATE":"ON","PERSEC":0}}

lege ich hierzu dann ein ganz normales Ereignis-Skript an?

Sorry für die vielen Fragen :upside_down_face:

Grüße
Simon

Der Topic kommt bei Dir schon richtig an.
Die Kategorie in die das Script soll wäre bei Dir ESP32_iBeacon. tele wird im Hauptbaum vom MQTT Server Configurator angelegt und darunter findest Du die Kategorie Deines Scanners. Darin ist dann Sensor und darunter Value. Du packst das Script unter ESP32_iBeacon. Das Ereignis ist von Symcon, ausgelöst auf Aktualisierung von Value.
Wenn Du es da hin packst dann musst Du nichts ändern. Es sei denn es sind Fehler drin :slight_smile:

Sebastian

P.S.: Fehler im Script beseitigt

1 „Gefällt mir“

okay jetzt habe ich es geschafft! Mein „Problem“ war, dass ich den MQTT Server Configurator bisher gar nicht eingerichtet/„installiert“ hatte.
Nachdem das erledigt war wurde dann auch die Ordner-Struktur entsprechend angelegt und der Status von „Testgerät“ ist ersichtlich:

Hallo ESP32 User,

ich habe mich entschlossen das Thema, sagen wir mal nachzubauen mit etwas mehr Funktion oder zusätzlich zu dem Bluetooth noch einen MP3Player zu benutzen.
Zur Zeit betreibe ich eine Türsprechanlage -Doorbird- an dem ein ESP8266 und ein MP3Player (DFPlayer) angeschlossen ist. Was passiert da, wenn es an der Tür Klingelt ruft Doorbird einen Weblink auf und der DingDong des ESP8266&DFPlayer startet den Gong. Das läuft schon eine weile sehr unproblematisch und alle freuen sich wenn es „Normal“ klingelt.

Der Beitrag hier hat mich überzeugt die alten Tags hervorzuholen und das ganze mit einen ESP32 auszuprobieren. Klappte recht gut, habe auch nicht lange getestet, Funktion war da auf zum nächsten Schritt. Da bin ich jetzt - neu Kompilieren der Tasmota 9.3.1, ESP32&Buetooth&Mp3Player und dann schauen wie es Funktioniert.
Danke an alle mit den tollen Beiträgen und Inhalten

Glück Auf - D.Voss

Guten Morgen Sebastian,

ich habe das Problem, dass nur 2 von 3 Tags erkannt und im IPS angelegt werden.

Im ESP32 werden alle 3 Tags korrekt erkannt:

In der ESP32-Console sehe ich ebenfalls alle 3:

Im ISP werden aber nur 2 Tags angelegt:

Ich verstehe leider nicht warum.

Im MQTT-Konfigurator-Debug sind keine Einträge vorhanden.
Das Script habe ich nochmals gelöscht und den obigen aktuellen Code ergänzt und schon mehrfach ausgeführt.

Wo liegt mein Problem?

Grüße
Simon

Schwer zu sagen.
Schau Dir mal die Variable Value an, ob da Simon ankommt.
Falls ja würde ich das Script mit echo Befehlen durchgehen und sehen wo der Fehler liegt. Alternativ kann du die Variable Simon auch selbst anlegen und sehen ob sie aktualisiert wird.

Sebastian

Was habt Ihr als Symcon Server angegeben? Bei mir kommt immer „Connect failed to 192.xxx.xxx.xxx:1883“.

Bei mir läuft IPS auf einer Synology (Docker)…

Danke und viele Grüße!

1 „Gefällt mir“

Liegt am Port Mapping des Docker Containers.
Hast diesen Port 1883 gemappt?

Gruß S.

Vielen Dank, Sebastian. 1883 auf 1883 tcp und 1883 auf 1024 tcp haben nicht geklappt. Hst Du noch einen Hinweis für mich?

Vielen Dank!!!

Ich nutze aktuell kein docker.
Du musst halt dafür Sorgen dass der Weg zum symcon mqtt Server frei ist.
Du kennst deine Ports und musst das mappen.
Symcon braucht bzgl mqtt auch mal einen Neustart.

Mehr Tipps hab ich leider nicht

S.

Vielen Dank, ich versuche mein Glück noch einmal… Kannst Du mir noch sagen, in welchem Verhältnis die voreingestellten Ports (1883 Tasmota und 1024 IPS) stehen? :face_with_monocle:

Habe es jetzt: In IPS von 1024 auf 1883 “umstellen” und dann in Docker von 1883 auf 1883 mappen…

Danke noch mal, Sebastian!

In Symcon legst du einen Server Port fest. Das ist der Empfänger. Am besten 1883. Das ist mqtt Standard.
Dann sagst du dem Shelly 1883 und alles ist gut. Das ist der Sender.
Du kannst natürlich auch 1024 nehmen, aber das musst du dann dem Shelly auch mitteilen.

Bei Dir kommt dann noch das Mapping zum Docker Container dazu.
Da kannst du auch zB 1883 auf 1024 Mappen aber das macht nur Sinn wenn du Konflikte mit den Ports unterschiedlicher Services hast.

Sebastian

Da hatten wir uns überschnitten - lieben Dank für Deine Hilfe!!!

Leider benötige ich noch einmal Hilfe:

Im MQTT-Konfigurator habe ich das Thema tele/iBeacon1/SENSOR erstellt. Bei mir wird im Objektbaum unter Sensor aber keine Variable Value erstellt:

Woran liegt das? Dadurch erzeugt das Skript natürlich einen Fehler…

Danke und viele Grüße

Guten Morgen,

das ist ein Problem des MQTT Konfigurators. Möglicherweise kannst du das nochmal löschen und neu anlegen?
Ansonsten geht das natürlich auch von Hand ohne den Konfigurator.
Du kannst selber über das Topic die Variable erstellen. Siehe Doku Symcon.

Gruß Sebastian

Guten Morgen,

danke, Sebastian. Löschen und neu anlegen hat leider nichts gebracht. Ich versuche es mal von Hand…

Viele Grüße!

Hallo zusammen,

ich habe zufällig noch einen ESP32-CAM ungenützt zu Hause rum liegen. Was meint ihr … könnte die Beschreibung mit dem auch funktionieren?`

Viele Grüße
dump.txt (53,9 KB)

EDIT:
Ich habe den ESP32-CAM jetzt geflasht. Wie komme ich jetzt auf die MAC-Adresse die ich in den Rules eintragen soll. Der ESP32 sollte im Hintergrund eigentlich schon nach dem G-Tag scannen - richtig?
Aktuell bekomme ich in der Console das hier:

00:04:12.797 QPC: Reset
00:04:16.023 MQT: tele/tasmota_ble_1/STATE = {"Time":"2022-01-02T00:04:16","Uptime":"0T00:00:12","UptimeSec":12,"Heap":99,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":1,"Berry":{"HeapUsed":3,"Objects":35},"Wifi":{"AP":1,"SSId":"GONDUniFi","BSSId":"E0:63:DA:B4:73:E0","Channel":1,"Mode":"11n","RSSI":46,"Signal":-77,"LinkCount":1,"Downtime":"0T00:00:05"}}
00:04:16.067 MQT: tele/tasmota_ble_1/SENSOR = {"Time":"2022-01-02T00:04:16","ESP32":{"Temperature":51.7},"TempUnit":"C"}
00:04:17.957 MQT: tele/tasmota_ble_1/BLE = {"Time":"2022-01-02T00:04:17","BLEDevices":{"total":0}}
00:04:17.965 MQT: tele/tasmota_ble_1/BLE = {"Time":"2022-01-02T00:04:17","BLE":{"scans":0,"adverts":60,"devices":0,"resets":0}}
00:04:25.818 EQ3 poll cycle starting
00:09:06.784 M32: Kick off readOneSensor
00:09:06.786 M32: Kick off tele sending
00:09:16.810 MQT: tele/tasmota_ble_1/STATE = {"Time":"2022-01-02T00:09:16","Uptime":"0T00:05:12","UptimeSec":312,"Heap":99,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":1,"Berry":{"HeapUsed":3,"Objects":35},"Wifi":{"AP":1,"SSId":"GONDUniFi","BSSId":"E0:63:DA:B4:73:E0","Channel":1,"Mode":"11n","RSSI":42,"Signal":-79,"LinkCount":1,"Downtime":"0T00:00:05"}}
00:09:16.853 MQT: tele/tasmota_ble_1/SENSOR = {"Time":"2022-01-02T00:09:16","ESP32":{"Temperature":51.7},"TempUnit":"C"}
00:09:16.866 MQT: tele/tasmota_ble_1/BLE = {"Time":"2022-01-02T00:09:16","BLEDevices":{"total":0}}
00:09:16.875 MQT: tele/tasmota_ble_1/BLE = {"Time":"2022-01-02T00:09:16","BLE":{"scans":15,"adverts":3064,"devices":0,"resets":0}}
00:09:25.782 EQ3 poll cycle starting

Wie komme ich jetzt auf die MAC-Adressen die ich in den Rules eingeben soll?

Ich lese sie aus der Tasmota Konsole:

Hat es jemand vielleicht schon geschafft, via Tasmota von den Gigset G-Tags den Batteriezustand auszulesen? Auf dem Raspi ist das sehr einfach mit „gatttool -b macid --char-read --handle=0x001b“ möglich, wie kann ich das mit Tasmota BLE umsetzen?