This commit is contained in:
Maxim Slipenko 2023-12-10 12:57:27 +03:00
parent 7d897ae764
commit fbb0c27ce6
3 changed files with 62 additions and 24 deletions

View File

@ -1,3 +1,5 @@
#define BLE_SCAN_INTERVAL 0x80
#define BLE_SCAN_WINDOW 0x80
#define SCAN_TASK_STACK_SIZE 2562
#define CHANNEL "espresense"

View File

@ -1,5 +1,4 @@
#include "esp32_presense.h"
#include "defaults.h"
namespace esphome
{
@ -22,6 +21,9 @@ namespace esphome
bool sentDiscovery = false; // Have we successfully sent discovery
UBaseType_t bleStack = 0;
DynamicJsonDocument doc(1024);
std::string _id, roomsTopic;
bool discovery, publishTele, publishRooms, publishDevices;
class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks {
@ -63,20 +65,26 @@ namespace esphome
}
}
void ESP32Presense::set_room(std::string room) {
_id = slugify(room);
roomsTopic = std::string(CHANNEL) + std::string("/rooms/") + _id;
}
void ESP32Presense::setup()
{
ESP_LOGD(TAG, "SETUP1");
BleFingerprintCollection::Setup();
ESP_LOGD(TAG, "SETUP2");
xTaskCreatePinnedToCore(scanTask, "scanTask", SCAN_TASK_STACK_SIZE, nullptr, 1, &scanTaskHandle, CONFIG_BT_NIMBLE_PINNED_TO_CORE);
ESP_LOGD(TAG, "SETUP3");
}
void ESP32Presense::loop()
{
ESP_LOGD(TAG, "LOOP1");
reportLoop();
ESP_LOGD(TAG, "LOOP2");
}
bool ESP32Presense::reportBuffer(BleFingerprint *f) {
auto report = f->getReport();
std::string topic = Sprintf(CHANNEL "/devices/%s/%s/%s", f->getId().c_str(), _id.c_str(), report.getId().c_str());
return this->publish(topic, report.getPayload());
}
void ESP32Presense::reportLoop()
@ -100,20 +108,46 @@ namespace esphome
totalFpSeen++;
}
/*
if (f->hasReport()) {
if (reportBuffer(f))
f->clearReport();
}
if (reportDevice(f)) {
if (this->reportDevice(f)) {
totalFpReported++;
reported++;
}
*/
}
}
bool ESP32Presense::reportDevice(BleFingerprint *f) {
doc.clear();
JsonObject obj = doc.to<JsonObject>();
if (!f->report(&obj))
return false;
std::string buffer;
serializeJson(doc, buffer);
std::string devicesTopic = Sprintf(CHANNEL "/devices/%s/%s", f->getId().c_str(), _id.c_str());
bool p1 = false, p2 = false;
for (int i = 0; i < 10; i++) {
if (!p1 && (!publishRooms || this->publish(roomsTopic.c_str(), buffer.c_str())))
p1 = true;
if (!p2 && (!publishDevices || this->publish(devicesTopic.c_str(), buffer.c_str())))
p2 = true;
if (p1 && p2)
return true;
delay(20);
}
reportFailed++;
return false;
}
bool ESP32Presense::sendTelemetry(
unsigned int totalSeen,
unsigned int totalFpSeen,
@ -121,17 +155,17 @@ namespace esphome
unsigned int totalFpReported,
unsigned int count
) {
this->publish(this->room_ + "/status", "online");
this->publish(this->room_ + "/max_distance", BleFingerprintCollection::maxDistance);
this->publish(this->room_ + "/absorption", BleFingerprintCollection::absorption);
this->publish(this->room_ + "/tx_ref_rssi", BleFingerprintCollection::txRefRssi);
this->publish(this->room_ + "/rx_adj_rssi", BleFingerprintCollection::rxAdjRssi);
this->publish(this->room_ + "/query", BleFingerprintCollection::query);
this->publish(this->room_ + "/include", BleFingerprintCollection::include);
this->publish(this->room_ + "/exclude", BleFingerprintCollection::exclude);
this->publish(this->room_ + "/known_macs", BleFingerprintCollection::knownMacs);
this->publish(this->room_ + "/known_irks", BleFingerprintCollection::knownIrks);
this->publish(this->room_ + "/count_ids", BleFingerprintCollection::countIds);
this->publish(roomsTopic + "/status", "online");
this->publish(roomsTopic + "/max_distance", BleFingerprintCollection::maxDistance);
this->publish(roomsTopic + "/absorption", BleFingerprintCollection::absorption);
this->publish(roomsTopic + "/tx_ref_rssi", BleFingerprintCollection::txRefRssi);
this->publish(roomsTopic + "/rx_adj_rssi", BleFingerprintCollection::rxAdjRssi);
this->publish(roomsTopic + "/query", BleFingerprintCollection::query);
this->publish(roomsTopic + "/include", BleFingerprintCollection::include);
this->publish(roomsTopic + "/exclude", BleFingerprintCollection::exclude);
this->publish(roomsTopic + "/known_macs", BleFingerprintCollection::knownMacs);
this->publish(roomsTopic + "/known_irks", BleFingerprintCollection::knownIrks);
this->publish(roomsTopic + "/count_ids", BleFingerprintCollection::countIds);
return true;
}

View File

@ -1,8 +1,10 @@
#pragma once
#include <ArduinoJson.h>
#include "esphome/core/component.h"
#include "esphome/components/mqtt/custom_mqtt_device.h"
#include "BleFingerprintCollection.h"
#include "defaults.h"
// #include "esphome/components/nimble_distance_custom/nimble_distance_custom.h"
namespace esphome
@ -15,8 +17,6 @@ namespace esphome
// public nimble_distance_custom::NimbleDistanceCustomComponent
{
protected:
std::string room_;
BleFingerprint *ble_fingerprint = NULL;
bool sendTelemetry(
@ -31,7 +31,9 @@ namespace esphome
void loop() override;
void reportLoop();
// void on_result(nimble_distance_custom::NimbleDistanceCustomResult&) override;
void set_room(std::string room) { room_ = room; }
void set_room(std::string room);
bool reportBuffer(BleFingerprint *f);
bool reportDevice(BleFingerprint *f);
//void set_base_topic(std::string base_topic) { base_topic_ = base_topic; }
};
} // namespace esp32_nimble_tracker