diff --git a/components/esp32_presense/defaults.h b/components/esp32_presense/defaults.h index 4174b29..6a0cba5 100644 --- a/components/esp32_presense/defaults.h +++ b/components/esp32_presense/defaults.h @@ -1,3 +1,5 @@ #define BLE_SCAN_INTERVAL 0x80 #define BLE_SCAN_WINDOW 0x80 -#define SCAN_TASK_STACK_SIZE 2562 \ No newline at end of file +#define SCAN_TASK_STACK_SIZE 2562 + +#define CHANNEL "espresense" \ No newline at end of file diff --git a/components/esp32_presense/esp32_presense.cpp b/components/esp32_presense/esp32_presense.cpp index 438ed6e..a075378 100644 --- a/components/esp32_presense/esp32_presense.cpp +++ b/components/esp32_presense/esp32_presense.cpp @@ -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(); + 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; } diff --git a/components/esp32_presense/esp32_presense.h b/components/esp32_presense/esp32_presense.h index f22e343..59facf6 100644 --- a/components/esp32_presense/esp32_presense.h +++ b/components/esp32_presense/esp32_presense.h @@ -1,8 +1,10 @@ #pragma once +#include #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