From 613abcb69f8abd2617cf7aa5e4fa6aad36409e2c Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Tue, 18 Jan 2022 21:41:57 +0100 Subject: [PATCH 1/4] Template cleanup --- peopleCounter32.yaml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/peopleCounter32.yaml b/peopleCounter32.yaml index e7e7faa0..25c6b69c 100644 --- a/peopleCounter32.yaml +++ b/peopleCounter32.yaml @@ -35,16 +35,6 @@ api: - service: recalibrate then: - lambda: "id(roode_platform)->recalibration();" - - service: set_max_threshold - variables: - newThreshold: int - then: - - lambda: "id(roode_platform)->set_max_threshold_percentage(newThreshold);id(roode_platform)->recalibration();" - - service: set_min_threshold - variables: - newThreshold: int - then: - - lambda: "id(roode_platform)->set_min_threshold_percentage(newThreshold);id(roode_platform)->recalibration();" ota: password: !secret ota_password From 9bbd3360e93c2fd5116d6a3cd2a0deb87a816f3d Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Mon, 24 Jan 2022 19:13:40 +0100 Subject: [PATCH 2/4] Add adaptive threshold draft --- components/roode/zone.cpp | 24 +++++++++++++++++++++++- components/roode/zone.h | 3 +++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/components/roode/zone.cpp b/components/roode/zone.cpp index 12524097..20ac49b8 100644 --- a/components/roode/zone.cpp +++ b/components/roode/zone.cpp @@ -25,10 +25,26 @@ VL53L1_Error Zone::readDistance(TofSensor *distanceSensor) { samples.pop_back(); }; min_distance = *std::min_element(samples.begin(), samples.end()); - + this->update_threshold(min_distance); return sensor_status; } +void Zone::update_threshold(uint16_t distance) { + if (distance > threshold->max) { + idle_distances.insert(idle_distances.begin(), distance); + } + if (idle_distances.size() == 100) { + this->threshold->idle = this->get_avg(idle_distances); + if (this->threshold->max_percentage.has_value()) { + this->threshold->max = (this->threshold->idle * this->threshold->max_percentage.value()) / 100; + } + if (this->threshold->min_percentage.has_value()) { + this->threshold->min = (this->threshold->idle * this->threshold->min_percentage.value()) / 100; + } + idle_distances.clear(); + } +} + /** * This sets the ROI for the zone to the given overrides or the standard default. * This is needed to do initial calibration of thresholds & ROI. @@ -126,6 +142,12 @@ int Zone::getOptimizedValues(int *values, int sum, int size) { return avg - sd; } +int Zone::get_avg(std::vector values) { + auto sum = std::accumulate(values.begin(), values.end(), 0); + int avg = sum / values.size(); + return avg; +} + uint16_t Zone::getDistance() const { return this->last_distance; } uint16_t Zone::getMinDistance() const { return this->min_distance; } } // namespace roode diff --git a/components/roode/zone.h b/components/roode/zone.h index bcb20bb1..74020df6 100644 --- a/components/roode/zone.h +++ b/components/roode/zone.h @@ -45,12 +45,15 @@ class Zone { protected: int getOptimizedValues(int *values, int sum, int size); + int get_avg(std::vector values); + void update_threshold(uint16_t distance); VL53L1_Error last_sensor_status = VL53L1_ERROR_NONE; VL53L1_Error sensor_status = VL53L1_ERROR_NONE; uint16_t last_distance; uint16_t min_distance; std::vector samples; uint8_t max_samples; + std::vector idle_distances; }; } // namespace roode } // namespace esphome From 73ffd9d24dae6f96d7db7131462604f70b9a6543 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Tue, 25 Jan 2022 19:36:42 +0100 Subject: [PATCH 3/4] Fix dev template for oled usage --- peopleCounter32Dev.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/peopleCounter32Dev.yaml b/peopleCounter32Dev.yaml index 5a929d90..f61c2058 100644 --- a/peopleCounter32Dev.yaml +++ b/peopleCounter32Dev.yaml @@ -75,7 +75,7 @@ roode: zones: invert: true entry: - roi: auto + roi: auto exit: # roi: # height: 4 @@ -112,11 +112,13 @@ sensor: zones: entry: distance: + id: entryDist name: $friendly_name Entry Distance filters: - delta: 100 exit: distance: + id: exitDist name: $friendly_name Exit Distance filters: - delta: 100 From cb121122d20ccc2388278966e701b8416f7e0ba0 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Tue, 25 Jan 2022 19:42:08 +0100 Subject: [PATCH 4/4] Merge branch 'dev' of github.com:Lyr3x/Roode into adaptive-threshold # Conflicts: # components/roode/zone.cpp # components/roode/zone.h --- components/roode/roode.cpp | 8 ++++---- components/roode/zone.cpp | 6 +++--- components/roode/zone.h | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index 1e1f3983..091430b5 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -180,9 +180,9 @@ void Roode::calibrate_zones() { calibrateDistance(); entry->roi_calibration(entry->threshold->idle, exit->threshold->idle, orientation_); - entry->calibrateThreshold(distanceSensor, number_attempts); + entry->calibrate_threshold(distanceSensor, number_attempts); exit->roi_calibration(entry->threshold->idle, exit->threshold->idle, orientation_); - exit->calibrateThreshold(distanceSensor, number_attempts); + exit->calibrate_threshold(distanceSensor, number_attempts); publish_sensor_configuration(entry, exit, true); App.feed_wdt(); @@ -194,8 +194,8 @@ void Roode::calibrateDistance() { auto *const initial = distanceSensor->get_ranging_mode_override().value_or(Ranging::Longest); distanceSensor->set_ranging_mode(initial); - entry->calibrateThreshold(distanceSensor, number_attempts); - exit->calibrateThreshold(distanceSensor, number_attempts); + entry->calibrate_threshold(distanceSensor, number_attempts); + exit->calibrate_threshold(distanceSensor, number_attempts); if (distanceSensor->get_ranging_mode_override().has_value()) { return; diff --git a/components/roode/zone.cpp b/components/roode/zone.cpp index 2b64359d..90ccdbac 100644 --- a/components/roode/zone.cpp +++ b/components/roode/zone.cpp @@ -61,7 +61,7 @@ void Zone::reset_roi(uint8_t default_center) { roi->height, roi->center); } -void Zone::calibrateThreshold(TofSensor *distanceSensor, int number_attempts) { +void Zone::calibrate_threshold(TofSensor *distanceSensor, int number_attempts) { ESP_LOGD(CALIBRATION, "Beginning. zoneId: %d", id); int *zone_distances = new int[number_attempts]; int sum = 0; @@ -70,7 +70,7 @@ void Zone::calibrateThreshold(TofSensor *distanceSensor, int number_attempts) { zone_distances[i] = last_distance; sum += zone_distances[i]; }; - threshold->idle = this->getOptimizedValues(zone_distances, sum, number_attempts); + threshold->idle = this->get_optimized_values(zone_distances, sum, number_attempts); if (threshold->max_percentage.has_value()) { threshold->max = (threshold->idle * threshold->max_percentage.value()) / 100; @@ -129,7 +129,7 @@ void Zone::roi_calibration(uint16_t entry_threshold, uint16_t exit_threshold, Or roi->height, roi->center); } -int Zone::getOptimizedValues(int *values, int sum, int size) { +int Zone::get_optimized_values(int *values, int sum, int size) { int sum_squared = 0; int variance = 0; int sd = 0; diff --git a/components/roode/zone.h b/components/roode/zone.h index 1e1f4846..a0920f74 100644 --- a/components/roode/zone.h +++ b/components/roode/zone.h @@ -34,7 +34,7 @@ class Zone : public PollingComponent { void update() override; VL53L1_Error readDistance(TofSensor *distanceSensor); void reset_roi(uint8_t default_center); - void calibrateThreshold(TofSensor *distanceSensor, int number_attempts); + void calibrate_threshold(TofSensor *distanceSensor, int number_attempts); void roi_calibration(uint16_t entry_threshold, uint16_t exit_threshold, Orientation orientation); const uint8_t id; bool is_occupied() const { return occupancy->state; }; @@ -47,7 +47,7 @@ class Zone : public PollingComponent { void set_distance_sensor(sensor::Sensor *sensor) { distance_sensor = sensor; } protected: - int getOptimizedValues(int *values, int sum, int size); + int get_optimized_values(int *values, int sum, int size); int get_avg(std::vector values); void update_threshold(uint16_t distance); VL53L1_Error last_sensor_status = VL53L1_ERROR_NONE;