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.