NEWS
BLE MQTT JSON auswerten Anwesenheitserkenung
-
Hallo,
es geht mir darum zu Protokollieren wann wer da ist. Dazu habe ich 2 GTags.
Mit Radar wäre es am Einfachsten. Aber leider reicht die Reichweite nicht.Da aber im Zimmer neben dran ein ESP für Temperatur und Heizungssteuerung war habe ich diesen jetzt durch einen ESP32 ersetzt.
Dieser sendet per Mqtt die Anwesenden BLEs als JSon an den IoBroker
Das sieht dann so aus:mqtt.0.ESP32.BLE
{"00:1a:22:0d:d5:2a":-87,"00:1a:22:0d:d9:e6":-83,"7c:2f:80:c4:6e:e8":-67}
Wie schaffe ich es jetzt daraus so etwas wie bei Radar2 mit Anwesend Ja/Nein zu machen?
Er soll im Prinzip genau das wie im Radar machen. Wenn der GTAG 5 Minuten nicht erkannt wird Anwesenheit auf Nein stellen.
Danke -
Hallo Lordcyber
Hast du es schon hinbekommen ? Wenn nein dann melde dich bitte . Ich habe eine Lösung mit vier Esp32 gefunden. Hab ein einfaches script gebastelt . Seit gut eine Woche ohne Probleme.
LG Roland1000
-
Hallo Roland stell doch mal deine Lösung allen zur Verfügung interresiert mich auch.
-
Hallo Felsdrache
Meine Lösung die bis jetzt gut funktioniert hat :
- OpenMqttgateway herunter laden und entsprechend konfigurieren . Wichtig nur Topic & Wlan und Mqtt ändern da sämtliche Esp32 in die Datenpunkte schreiben . Nicht wundern wenn im Mqtt nur ein daten punkt mit den BT-Adressen erscheint. Nur die IP Adressen im Router werden unterschiedlich sein.
- Esp32 BT mit der OpenMqttgateway flashen
- Manuell Datenpunkte erstellen die auf true und false schalten
- Node Red installieren
- Unter Einstellung die Paleten verwaltung search suchen und instalieren
- Den Flow schreiben (leider kann ich noch kein Javascript bin dabei zu lernen
[ { "id": "4196bf2b.d2cca", "type": "tab", "label": "Anwesend", "disabled": false, "info": "" }, { "id": "6026bae4.94b5f4", "type": "ioBroker in", "z": "4196bf2b.d2cca", "name": "home/OpenMQTTGateway_ESP32_BLE/BTtoMQTT/00BBC143B32C", "topic": "mqtt.0.home.OpenMQTTGateway_ESP32_BLE.BTtoMQTT.00BBC143B32C", "payloadType": "value", "onlyack": false, "func": "rbe", "gap": "", "x": 270, "y": 240, "wires": [ [ "1a48be59.f49182" ] ] }, { "id": "1a48be59.f49182", "type": "json", "z": "4196bf2b.d2cca", "name": "Name1", "property": "payload", "action": "", "pretty": false, "x": 640, "y": 240, "wires": [ [ "3f55c36b.4b96fc" ] ] }, { "id": "3f55c36b.4b96fc", "type": "object-search", "z": "4196bf2b.d2cca", "name": "Name1_BT", "process": "values", "search": "00:BB:C1:43:B3:2C", "searchType": "msg", "deep": true, "location": "payload", "locationType": "msg", "output": "true", "outputType": "msg", "x": 890, "y": 240, "wires": [ [ "6fd2c207.ff0f9c" ] ] }, { "id": "7546ba23.73e194", "type": "ioBroker out", "z": "4196bf2b.d2cca", "name": "Datenpunkt", "topic": "Datenpunkt", "ack": "true", "autoCreate": "true", "x": 1350, "y": 240, "wires": [] }, { "id": "6fd2c207.ff0f9c", "type": "trigger", "z": "4196bf2b.d2cca", "op1": "true", "op2": "false", "op1type": "bool", "op2type": "bool", "duration": "210", "extend": true, "units": "s", "reset": "00:BB:C1:43:B3:2C", "bytopic": "topic", "name": "", "x": 1080, "y": 240, "wires": [ [ "7546ba23.73e194" ] ] }, { "id": "3ca86dca.30a802", "type": "ioBroker in", "z": "4196bf2b.d2cca", "name": "home/OpenMQTTGateway_ESP32_BLE/BTtoMQTT/0209082CD0C3", "topic": "mqtt.0.home.OpenMQTTGateway_ESP32_BLE.BTtoMQTT.0209082CD0C3", "payloadType": "value", "onlyack": true, "func": "all", "gap": "", "x": 280, "y": 400, "wires": [ [ "695962f2.92a32c" ] ] }, { "id": "695962f2.92a32c", "type": "json", "z": "4196bf2b.d2cca", "name": "Name2", "property": "payload", "action": "", "pretty": false, "x": 650, "y": 400, "wires": [ [ "9d5cd1a1.13853" ] ] }, { "id": "9d5cd1a1.13853", "type": "object-search", "z": "4196bf2b.d2cca", "name": "Name2_BT", "process": "values", "search": "02:09:08:2C:D0:C3", "searchType": "msg", "deep": false, "location": "payload", "locationType": "msg", "output": "true", "outputType": "msg", "x": 880, "y": 400, "wires": [ [ "5884e1e5.a2dfa" ] ] }, { "id": "5884e1e5.a2dfa", "type": "trigger", "z": "4196bf2b.d2cca", "op1": "true", "op2": "false", "op1type": "bool", "op2type": "bool", "duration": "210", "extend": true, "units": "s", "reset": "02:09:08:2C:D0:C3", "bytopic": "topic", "name": "", "x": 1100, "y": 400, "wires": [ [ "d95af90e.fdf548" ] ] }, { "id": "d95af90e.fdf548", "type": "ioBroker out", "z": "4196bf2b.d2cca", "name": "Datenpunkt", "topic": "", "ack": "true", "autoCreate": "false", "x": 1370, "y": 400, "wires": [] } ]
- Den Trigger Baustein muss angepasst werden das man nicht davon ausgehen kann das die Bt-Tracker nicht alle gleich sind mit der ansprechzeit.
Ich hatte anfangszeit noch viele false schaltungen . - Bestellt euch ruhig noch ein bis zwei Esp32 mehr. Da die reichweite begrenzt ist .So das ist meine Lösung bis jetzt. Ich höffe ich konnte euch damit helfen
Lg Roland1000
-
So habe ich eine Anwesenheit hergestellt.
Das funktioniert auch ganz gut soweit.
Gruss Achim -
Hallo Felsdrache
Wie sagt man alle wege führen nach Rom Sieht gut aus .Ich habe daran 3 Monate gebastelt (nach Feierabend) bis es funtkioniert hat. Jetzt möchte ich versuchen über ein Oled Display (2.4zoll) so eine art mini Konsole zu bauen .Diese werde ich dann zum steuern des iobrokers verwenden . Gucken wir mal was passiert.
LG Roland1000
-
Hey @Lordcyber & roland1000,
ich bin auch gerade dabei, mit dem ESP32 eine Anwesenheitskontrolle zu erstellen.
Zur Grundlage habe ich dieses Tutorial benutzt:
http://esp32-server.de/mqtt-ble/Was bei mir aber massig Fehler rausgehauen hat.
Dann habe ich versucht es umzuschreiben(meine Skills sind noch recht gering)
/* MQTT Bluetooth (BLE) Anwesenheitserkennung. Raum präsenzmelder für Hausautomatisierung. Personen präsenz im Zimmer durch: iBeacon, Mi Band fitness tracker, smartwatch aufspüren. Publish ist MQTT_Name, Daten MAC und RSSI in JSON Format alle 10s { "28:A1:83:E1:58:8E":-60, "ea:5f:8d:69:be:56":-80 } FHEM, Node-RED, iobroker, openHAB, Domoticz */ #include <WiFi.h> #include <WiFiClient.h> #include <PubSubClient.h> #include <MQTT.h> #include <ArduinoJson.h> #include <PubSubClient_JSON.h> #include <BLEDevice.h> #include <BLEScan.h> #include <BLEAddress.h> // MQTT Zugangsdaten #define MQTT_server "192.168.xxx.xx" #define MQTT_port 1xxx #define MQTT_User "xxx" #define MQTT_Pass "xxxxxx" #define MQTT_Name "Schlafzimmer_anwesenheit" // gleichzeitig publish Name #define QoS 0 const char* ssid = "Nixfüreuch"; // WLAN Zugangsdaten Eintragen const char* password = "xxxxxx"; int scanTime = 10; //sek. iBeacon Suchzeit und MQTT Berichtinterval BLEScan* pBLEScan ; // --------------- MQTT Variablen --------------------------------------- WiFiClient espClient; PubSubClient client(espClient); void setup() { int i; Serial.begin(115200); Serial.println(""); Serial.println("Start"); // --------------------- WiFi --------------------------------------------- Serial.println("Warte auf Verbindung"); WiFi.mode(WIFI_STA); ; WiFi.begin(ssid, password); Serial.println(""); int timout = 0; while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("O"); timout++; if (timout > 20) // Wenn Anmeldung nicht möglich { Serial.println(""); Serial.println("Wlan verbindung fehlt"); ESP.restart(); // ESP32 neu starten } } Serial.println(""); Serial.print("IP Addresse: "); Serial.println(WiFi.localIP()); // ---------------------- MQTT --------------------------------------------------- client.setServer(MQTT_server, MQTT_port); // MQTT Port einstellen if (client.connect("192.168.xxx.xx", "xxxxxx", "xxxxxx")) { Serial.println("Mit MQTT verbunden"); client.subscribe(MQTT_Name); // im Topic hallo Präsenzmelder Name schreiben } Serial.println("Starte BLE Scanner"); BLEDevice::init(""); pBLEScan = BLEDevice::getScan(); pBLEScan->setActiveScan(true); // Aktives Bluetooth Scannen pBLEScan->setInterval(100); pBLEScan->setWindow(99); } void loop() { int j; String NachrichtJSON; BLEScanResults foundDevices = pBLEScan->start(scanTime); // BLE Scanen NachrichtJSON = "{\r\n"; // JSON Format vorbereiten for (j = 0; j < foundDevices.getCount(); j++) // Alle Gefundene Bluetooth Device durchgehen { NachrichtJSON = NachrichtJSON + "\"" + foundDevices.getDevice(j).getAddress().toString().c_str() + "\":"; if (j != foundDevices.getCount() - 1) NachrichtJSON = NachrichtJSON + String(foundDevices.getDevice(j).getRSSI()) + ",\r\n"; else NachrichtJSON = NachrichtJSON + String(foundDevices.getDevice(j).getRSSI()) + "\r\n}"; } // Alle gefundene MACs durchgehen // diese "if" spührt das letzte Eintragung und beendet den json Datensatz. pBLEScan->clearResults(); // Speicher freigeben //client.publish(MQTT_Name, NachrichtJSON).set_qos(QoS)); // JSON per MQTT senden Serial.println(NachrichtJSON); //Serial.println(NachrichtJSON); delay(100); if (WiFi.status() != WL_CONNECTED) ESP.restart(); // Wenn Wlan fehlt neustarten if (client.connected()) { client.loop(); } else { Serial.println("MQTT Verbindung fehlt"); // Wenn MQTT Verbindung fehlt dann neu verbinden reconnect(); } // ende MQTT Verbindung ja/nein } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Create a random client ID String clientId = "ESPClient-"; clientId += String(random(0xffff), HEX); // Attempt to connect //if you MQTT broker has clientID,username and password //please change following line to if (client.connect(clientId,userName,passWord)) if (client.connect("192.168.xxx.xx", "xxxxxx", "xxxxxx")) { Serial.println("connected"); //once connected to MQTT broker, subscribe command if any client.subscribe("OsoyooCommand"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 6 seconds before retrying delay(6000); } } }
Als Fehlermeldung bekomme ich folgende Ausgabe:
no matching function for call to 'PubSubClient::publish(const char [25], String&)'
Meine Recherche hat ergeben, dass die Funktion client.publish() einen string, bzw. eine Zeichenkette erfordert. Ich aber einen falschen Datentype übermittel.
Ich weiß aber leider nicht, wo in dem Script der Fehler hängt.
Vielleicht wisst ihr ja, was ich da falsch mache?
Danke und bleibt gesund.
EDIT:
Ich habe es inzwischen geschafft, dass das Programm läuft.
Aber nun habe ich das Problem, dass meine Android Wear Smartwatch nicht gefunden wird. -
@felsdrache ich versuche es gerade bei mir. Leider verstehe ich das nicht so richtig.
Kannst du mir das vielleicht etwas besser erklären ?LG
Lexi