NEWS

BLE MQTT JSON auswerten Anwesenheitserkenung


  • Starter

    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


  • Starter

    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 :

    1. 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.
    2. Esp32 BT mit der OpenMqttgateway flashen
    3. Manuell Datenpunkte erstellen die auf true und false schalten
    4. Node Red installieren
    5. Unter Einstellung die Paleten verwaltung search suchen und instalieren
    6. 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": []
        }
    ]
    
    1. 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 .
    2. 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


  • Starter

    So habe ich eine Anwesenheit hergestellt.
    Das funktioniert auch ganz gut soweit.
    a63ca1a0-dec2-4483-a7d6-453f3ba52e55-grafik.png
    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.



Suggested Topics

  • 4
  • 20
  • 1
  • 3
  • 9
  • 3
  • 25
  • 6

2.3k
Online

32.4k
Users

39.0k
Topics

528.5k
Posts