Tuneable min_rssi for ble_presence component

This commit is contained in:
Avishay Orpaz 2024-08-15 08:20:24 +03:00
parent 5c31ab4060
commit 89fcaa3b40
4 changed files with 37 additions and 1 deletions

View file

@ -1,12 +1,14 @@
import esphome.codegen as cg import esphome.codegen as cg
from esphome.components import binary_sensor, esp32_ble_tracker from esphome.components import binary_sensor, esp32_ble_tracker
import esphome.config_validation as cv import esphome.config_validation as cv
from esphome.components.number import Number
from esphome.const import ( from esphome.const import (
CONF_IBEACON_MAJOR, CONF_IBEACON_MAJOR,
CONF_IBEACON_MINOR, CONF_IBEACON_MINOR,
CONF_IBEACON_UUID, CONF_IBEACON_UUID,
CONF_MAC_ADDRESS, CONF_MAC_ADDRESS,
CONF_MIN_RSSI, CONF_MIN_RSSI,
CONF_MIN_RSSI_NUMBER_ID,
CONF_SERVICE_UUID, CONF_SERVICE_UUID,
CONF_TIMEOUT, CONF_TIMEOUT,
) )
@ -46,6 +48,7 @@ CONFIG_SCHEMA = cv.All(
cv.Optional(CONF_MIN_RSSI): cv.All( cv.Optional(CONF_MIN_RSSI): cv.All(
cv.decibel, cv.int_range(min=-100, max=-30) cv.decibel, cv.int_range(min=-100, max=-30)
), ),
cv.Optional(CONF_MIN_RSSI_NUMBER_ID): cv.use_id(Number)
} }
) )
.extend(esp32_ble_tracker.ESP_BLE_DEVICE_SCHEMA) .extend(esp32_ble_tracker.ESP_BLE_DEVICE_SCHEMA)
@ -53,6 +56,9 @@ CONFIG_SCHEMA = cv.All(
cv.has_exactly_one_key( cv.has_exactly_one_key(
CONF_MAC_ADDRESS, CONF_IRK, CONF_SERVICE_UUID, CONF_IBEACON_UUID CONF_MAC_ADDRESS, CONF_IRK, CONF_SERVICE_UUID, CONF_IBEACON_UUID
), ),
cv.has_at_most_one_key(
CONF_MIN_RSSI, CONF_MIN_RSSI_NUMBER_ID
),
_validate, _validate,
) )
@ -63,8 +69,12 @@ async def to_code(config):
await esp32_ble_tracker.register_ble_device(var, config) await esp32_ble_tracker.register_ble_device(var, config)
cg.add(var.set_timeout(config[CONF_TIMEOUT].total_milliseconds)) cg.add(var.set_timeout(config[CONF_TIMEOUT].total_milliseconds))
if min_rssi := config.get(CONF_MIN_RSSI): if min_rssi := config.get(CONF_MIN_RSSI):
cg.add(var.set_minimum_rssi(min_rssi)) cg.add(var.set_minimum_rssi(min_rssi))
elif min_rssi_number_id := config.get(CONF_MIN_RSSI_NUMBER_ID):
min_rssi_number = await cg.get_variable(min_rssi_number_id)
cg.add(var.set_minimum_rssi_input(min_rssi_number))
if mac_address := config.get(CONF_MAC_ADDRESS): if mac_address := config.get(CONF_MAC_ADDRESS):
cg.add(var.set_address(mac_address.as_hex)) cg.add(var.set_address(mac_address.as_hex))

View file

@ -10,6 +10,21 @@ static const char *const TAG = "ble_presence";
void BLEPresenceDevice::dump_config() { LOG_BINARY_SENSOR("", "BLE Presence", this); } void BLEPresenceDevice::dump_config() { LOG_BINARY_SENSOR("", "BLE Presence", this); }
void BLEPresenceDevice::set_minimum_rssi_input(number::Number *min_rssi_number) {
min_rssi_number->add_on_state_callback([this](float state) {
int rssi = int(state);
if (rssi < -100 || rssi > -30) {
ESP_LOGW(TAG, "Valid RSSI range is -30dB to -100dB");
return;
}
ESP_LOGI(TAG, "Setting minimum rssi to %d", rssi);
this->set_minimum_rssi_(int(state));
});
this->check_minimum_rssi_ = true;
}
} // namespace ble_presence } // namespace ble_presence
} // namespace esphome } // namespace esphome

View file

@ -3,6 +3,8 @@
#include "esphome/core/component.h" #include "esphome/core/component.h"
#include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h" #include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h"
#include "esphome/components/binary_sensor/binary_sensor.h" #include "esphome/components/binary_sensor/binary_sensor.h"
#include "esphome/components/number/number.h"
#ifdef USE_ESP32 #ifdef USE_ESP32
@ -46,9 +48,12 @@ class BLEPresenceDevice : public binary_sensor::BinarySensorInitiallyOff,
this->ibeacon_minor_ = minor; this->ibeacon_minor_ = minor;
} }
void set_minimum_rssi(int rssi) { void set_minimum_rssi(int rssi) {
set_minimum_rssi_(rssi);
this->check_minimum_rssi_ = true; this->check_minimum_rssi_ = true;
this->minimum_rssi_ = rssi;
} }
void set_minimum_rssi_input(number::Number *min_rssi_number);
void set_timeout(uint32_t timeout) { this->timeout_ = timeout; } void set_timeout(uint32_t timeout) { this->timeout_ = timeout; }
bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override { bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override {
if (this->check_minimum_rssi_ && this->minimum_rssi_ > device.get_rssi()) { if (this->check_minimum_rssi_ && this->minimum_rssi_ > device.get_rssi()) {
@ -108,6 +113,10 @@ class BLEPresenceDevice : public binary_sensor::BinarySensorInitiallyOff,
float get_setup_priority() const override { return setup_priority::DATA; } float get_setup_priority() const override { return setup_priority::DATA; }
protected: protected:
void set_minimum_rssi_(int rssi) {
this->minimum_rssi_ = rssi;
}
void set_found_(bool state) { void set_found_(bool state) {
this->found_ = state; this->found_ = state;
if (state) if (state)
@ -135,6 +144,7 @@ class BLEPresenceDevice : public binary_sensor::BinarySensorInitiallyOff,
bool found_{false}; bool found_{false};
uint32_t last_seen_{}; uint32_t last_seen_{};
uint32_t timeout_{}; uint32_t timeout_{};
}; };
} // namespace ble_presence } // namespace ble_presence

View file

@ -489,6 +489,7 @@ CONF_MIN_LEVEL = "min_level"
CONF_MIN_POWER = "min_power" CONF_MIN_POWER = "min_power"
CONF_MIN_RANGE = "min_range" CONF_MIN_RANGE = "min_range"
CONF_MIN_RSSI = "min_rssi" CONF_MIN_RSSI = "min_rssi"
CONF_MIN_RSSI_NUMBER_ID = "min_rssi_number_id"
CONF_MIN_TEMPERATURE = "min_temperature" CONF_MIN_TEMPERATURE = "min_temperature"
CONF_MIN_VALUE = "min_value" CONF_MIN_VALUE = "min_value"
CONF_MIN_VERSION = "min_version" CONF_MIN_VERSION = "min_version"