From fef4b3cfb448daf779ebb2e9d2113e0629f53223 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Wed, 15 Dec 2021 20:24:35 +0100 Subject: [PATCH 01/31] Add use_presence_sensor option --- components/roode/__init__.py | 3 +++ components/roode/roode.cpp | 15 +++++++++++---- components/roode/roode.h | 4 +++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/components/roode/__init__.py b/components/roode/__init__.py index 7bb571ec..6389e43b 100644 --- a/components/roode/__init__.py +++ b/components/roode/__init__.py @@ -30,6 +30,7 @@ CONF_MANUAL_ACTIVE = "manual_active" CONF_CALIBRATION_ACTIVE = "calibration_active" CONF_TIMING_BUDGET = "timing_budget" +CONF_USE_PRESENCE = 'use_presence_sensor' TYPES = [ CONF_RESTORE_VALUES, CONF_INVERT_DIRECTION, CONF_ADVISED_SENSOR_ORIENTATION, CONF_I2C_ADDRESS @@ -88,6 +89,8 @@ f"{CONF_SENSOR_MODE}, {CONF_ROI_HEIGHT}, {CONF_ROI_WIDTH} and {CONF_MANUAL_THRESHOLD} must be used together", ): cv.int_range(min=40, max=4000), + cv.Optional(CONF_USE_PRESENCE, default='false'): + cv.boolean, }), }).extend(cv.polling_component_schema("100ms"))) diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index 2e5a3348..1e317396 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -124,7 +124,10 @@ namespace esphome { // Someone is in the sensing area CurrentZoneStatus = SOMEONE; - presence_sensor->publish_state(true); + if (set_use_presence_sensor_) + { + presence_sensor->publish_state(true); + } } // left zone @@ -237,10 +240,14 @@ namespace esphome PathTrack[PathTrackFillingSize - 1] = AllZonesCurrentStatus; } } - if (CurrentZoneStatus == NOBODY && LeftPreviousStatus == NOBODY && RightPreviousStatus == NOBODY) + if (set_use_presence_sensor_) { - // nobody is in the sensing area - presence_sensor->publish_state(false); + if (CurrentZoneStatus == NOBODY && LeftPreviousStatus == NOBODY && RightPreviousStatus == NOBODY) + { + // nobody is in the sensing area + + presence_sensor->publish_state(false); + } } } diff --git a/components/roode/roode.h b/components/roode/roode.h index e0572b0d..0510a40b 100644 --- a/components/roode/roode.h +++ b/components/roode/roode.h @@ -67,6 +67,7 @@ namespace esphome void set_invert_direction(bool dir) { invert_direction_ = dir; } void set_restore_values(bool val) { restore_values_ = val; } void set_advised_sensor_orientation(bool val) { advised_sensor_orientation_ = val; } + void set_use_presence_sensor(bool val) { set_use_presence_sensor_ = val; } void set_distance_sensor(sensor::Sensor *distance_sensor_) { distance_sensor = distance_sensor_; } void set_people_counter_sensor(sensor::Sensor *people_counter_sensor_) { people_counter_sensor = people_counter_sensor_; } void set_max_threshold_zone0_sensor(sensor::Sensor *max_threshold_zone0_sensor_) { max_threshold_zone0_sensor = max_threshold_zone0_sensor_; } @@ -116,6 +117,7 @@ namespace esphome bool roi_calibration_{false}; int sensor_mode{-1}; bool advised_sensor_orientation_{true}; + bool set_use_presence_sensor_{false}; uint8_t address_ = 0x29; bool invert_direction_{false}; bool restore_values_{false}; @@ -125,7 +127,7 @@ namespace esphome int number_attempts = 20; int timing_budget_{-1}; int left = 0, right = 0, oldcnt; - boolean lastTrippedState = 0; + bool lastTrippedState = 0; double people, distance_avg; int short_distance_threshold = 1300; int long_distance_threshold = 3100; From fc944d6a69bbe683854307c49f100bc3211f88f8 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Wed, 15 Dec 2021 20:26:26 +0100 Subject: [PATCH 02/31] Ensure CONF_USE_PRESENCE generation --- components/roode/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/roode/__init__.py b/components/roode/__init__.py index 6389e43b..7d38a7a7 100644 --- a/components/roode/__init__.py +++ b/components/roode/__init__.py @@ -33,7 +33,7 @@ CONF_USE_PRESENCE = 'use_presence_sensor' TYPES = [ CONF_RESTORE_VALUES, CONF_INVERT_DIRECTION, - CONF_ADVISED_SENSOR_ORIENTATION, CONF_I2C_ADDRESS + CONF_ADVISED_SENSOR_ORIENTATION, CONF_I2C_ADDRESS, CONF_USE_PRESENCE ] CONFIG_SCHEMA = (cv.Schema({ cv.GenerateID(): From 66e22596378dce839c2795c126625f37b27dee4a Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Wed, 15 Dec 2021 20:28:07 +0100 Subject: [PATCH 03/31] Move option to correct scope --- components/roode/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/roode/__init__.py b/components/roode/__init__.py index 7d38a7a7..092cc481 100644 --- a/components/roode/__init__.py +++ b/components/roode/__init__.py @@ -44,6 +44,8 @@ cv.boolean, cv.Optional(CONF_ADVISED_SENSOR_ORIENTATION, default='true'): cv.boolean, + cv.Optional(CONF_USE_PRESENCE, default='false'): + cv.boolean, cv.Optional(CONF_I2C_ADDRESS, default=0x29): cv.uint8_t, cv.Exclusive( @@ -89,8 +91,6 @@ f"{CONF_SENSOR_MODE}, {CONF_ROI_HEIGHT}, {CONF_ROI_WIDTH} and {CONF_MANUAL_THRESHOLD} must be used together", ): cv.int_range(min=40, max=4000), - cv.Optional(CONF_USE_PRESENCE, default='false'): - cv.boolean, }), }).extend(cv.polling_component_schema("100ms"))) From 88997646b371bd9252eea1d8f1b1cb5812dd25a5 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Wed, 15 Dec 2021 21:01:13 +0100 Subject: [PATCH 04/31] Add use_distance_sensor(false) option --- components/roode/__init__.py | 5 ++++- components/roode/roode.cpp | 5 ++++- components/roode/roode.h | 2 ++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/components/roode/__init__.py b/components/roode/__init__.py index 092cc481..607daf4b 100644 --- a/components/roode/__init__.py +++ b/components/roode/__init__.py @@ -31,9 +31,10 @@ CONF_CALIBRATION_ACTIVE = "calibration_active" CONF_TIMING_BUDGET = "timing_budget" CONF_USE_PRESENCE = 'use_presence_sensor' +CONF_USE_DISTANCE = 'use_distance_sensor' TYPES = [ CONF_RESTORE_VALUES, CONF_INVERT_DIRECTION, - CONF_ADVISED_SENSOR_ORIENTATION, CONF_I2C_ADDRESS, CONF_USE_PRESENCE + CONF_ADVISED_SENSOR_ORIENTATION, CONF_I2C_ADDRESS, CONF_USE_PRESENCE, CONF_USE_DISTANCE ] CONFIG_SCHEMA = (cv.Schema({ cv.GenerateID(): @@ -46,6 +47,8 @@ cv.boolean, cv.Optional(CONF_USE_PRESENCE, default='false'): cv.boolean, + cv.Optional(CONF_USE_DISTANCE, default='false'): + cv.boolean, cv.Optional(CONF_I2C_ADDRESS, default=0x29): cv.uint8_t, cv.Exclusive( diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index 1e317396..096bbe1e 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -67,7 +67,10 @@ namespace esphome void Roode::update() { - distance_sensor->publish_state(distance); + if (set_use_distance_sensor_) + { + distance_sensor->publish_state(distance); + } } void Roode::loop() diff --git a/components/roode/roode.h b/components/roode/roode.h index 0510a40b..3ca7cd39 100644 --- a/components/roode/roode.h +++ b/components/roode/roode.h @@ -68,6 +68,7 @@ namespace esphome void set_restore_values(bool val) { restore_values_ = val; } void set_advised_sensor_orientation(bool val) { advised_sensor_orientation_ = val; } void set_use_presence_sensor(bool val) { set_use_presence_sensor_ = val; } + void set_use_distance_sensor(bool val) { set_use_distance_sensor_ = val; } void set_distance_sensor(sensor::Sensor *distance_sensor_) { distance_sensor = distance_sensor_; } void set_people_counter_sensor(sensor::Sensor *people_counter_sensor_) { people_counter_sensor = people_counter_sensor_; } void set_max_threshold_zone0_sensor(sensor::Sensor *max_threshold_zone0_sensor_) { max_threshold_zone0_sensor = max_threshold_zone0_sensor_; } @@ -118,6 +119,7 @@ namespace esphome int sensor_mode{-1}; bool advised_sensor_orientation_{true}; bool set_use_presence_sensor_{false}; + bool set_use_distance_sensor_{false}; uint8_t address_ = 0x29; bool invert_direction_{false}; bool restore_values_{false}; From a0dc1137eb43df0d1ef43be3977a05bcb67729b9 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Wed, 15 Dec 2021 21:04:25 +0100 Subject: [PATCH 05/31] Make distance sensor diagnostic --- components/roode/sensor.py | 1 + 1 file changed, 1 insertion(+) diff --git a/components/roode/sensor.py b/components/roode/sensor.py index 49a248aa..dd27fa26 100644 --- a/components/roode/sensor.py +++ b/components/roode/sensor.py @@ -23,6 +23,7 @@ unit_of_measurement=UNIT_EMPTY, accuracy_decimals=2, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_PEOPLE_COUNTER): sensor.sensor_schema( From b112287aa8b511ea22c2fbc98dfed28f3992429d Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Wed, 15 Dec 2021 21:06:09 +0100 Subject: [PATCH 06/31] Set ref tag to master --- peopleCounter.yaml | 2 +- peopleCounter32.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/peopleCounter.yaml b/peopleCounter.yaml index 3dcd76f5..d387f7fc 100644 --- a/peopleCounter.yaml +++ b/peopleCounter.yaml @@ -7,7 +7,7 @@ external_components: source: type: git url: https://github.com/Lyr3x/Roode - ref: v.1.3.4 + ref: master esphome: name: $devicename diff --git a/peopleCounter32.yaml b/peopleCounter32.yaml index 6520598b..ee94e4b9 100644 --- a/peopleCounter32.yaml +++ b/peopleCounter32.yaml @@ -7,7 +7,7 @@ external_components: source: type: git url: https://github.com/Lyr3x/Roode - ref: v.1.3.4 + ref: master esphome: name: $devicename From 4207a173c52349dd057fa94f70de7bd807a6a51f Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Wed, 15 Dec 2021 21:19:30 +0100 Subject: [PATCH 07/31] Reduce sample size to 2 --- components/roode/roode.cpp | 1 - components/roode/roode.h | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index 096bbe1e..6a09fbd1 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -78,7 +78,6 @@ namespace esphome getZoneDistance(); zone++; zone = zone % 2; - yield(); } void Roode::getZoneDistance() diff --git a/components/roode/roode.h b/components/roode/roode.h index 3ca7cd39..b40a07e8 100644 --- a/components/roode/roode.h +++ b/components/roode/roode.h @@ -19,7 +19,7 @@ namespace esphome #define EEPROM_SIZE 512 static int LEFT = 0; static int RIGHT = 1; - static const uint16_t DISTANCES_ARRAY_SIZE = 10; + static const uint16_t DISTANCES_ARRAY_SIZE = 2; /* ##### CALIBRATION ##### From bfdd4ec762a17c7df7be018f04f8182cfc7b83f5 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Wed, 15 Dec 2021 22:15:27 +0100 Subject: [PATCH 08/31] Switch formatter to black --- .vscode/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 869d6a53..c7e4bd93 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -16,5 +16,5 @@ "ostream": "cpp", "istream": "cpp" }, - "python.formatting.provider": "yapf" + "python.formatting.provider": "black" } \ No newline at end of file From f048426fe28dcfe7d1470a3db1d23de1cab856a7 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Wed, 15 Dec 2021 22:17:36 +0100 Subject: [PATCH 09/31] Format sensor.py and text_sensor.py --- components/roode/sensor.py | 157 ++++++++++++++++---------------- components/roode/text_sensor.py | 54 ++++++----- 2 files changed, 108 insertions(+), 103 deletions(-) diff --git a/components/roode/sensor.py b/components/roode/sensor.py index dd27fa26..9536c6fb 100644 --- a/components/roode/sensor.py +++ b/components/roode/sensor.py @@ -1,88 +1,87 @@ import esphome.codegen as cg import esphome.config_validation as cv from esphome.components import sensor -from esphome.const import (ICON_ARROW_EXPAND_VERTICAL, ICON_COUNTER, - ICON_NEW_BOX, ICON_RULER, STATE_CLASS_MEASUREMENT, - UNIT_EMPTY, ENTITY_CATEGORY_DIAGNOSTIC) +from esphome.const import ( + ICON_ARROW_EXPAND_VERTICAL, + ICON_COUNTER, + ICON_NEW_BOX, + ICON_RULER, + STATE_CLASS_MEASUREMENT, + UNIT_EMPTY, + ENTITY_CATEGORY_DIAGNOSTIC, +) from . import Roode, CONF_ROODE_ID DEPENDENCIES = ["roode"] -CONF_DISTANCE = 'distance_sensor' -CONF_PEOPLE_COUNTER = 'people_counter_sensor' -CONF_MAX_THRESHOLD_ZONE0 = 'max_threshold_zone0' -CONF_MAX_THRESHOLD_ZONE1 = 'max_threshold_zone1' -CONF_MIN_THRESHOLD_ZONE0 = 'min_threshold_zone0' -CONF_MIN_THRESHOLD_ZONE1 = 'min_threshold_zone1' -CONF_ROI_HEIGHT = 'roi_height' -CONF_ROI_WIDTH = 'roi_width' -CONFIG_SCHEMA = sensor.sensor_schema().extend({ - cv.Optional(CONF_DISTANCE): - sensor.sensor_schema( - icon=ICON_RULER, - unit_of_measurement=UNIT_EMPTY, - accuracy_decimals=2, - state_class=STATE_CLASS_MEASUREMENT, - entity_category=ENTITY_CATEGORY_DIAGNOSTIC, - ), - cv.Optional(CONF_PEOPLE_COUNTER): - sensor.sensor_schema( - icon=ICON_COUNTER, - unit_of_measurement=UNIT_EMPTY, - accuracy_decimals=0, - state_class=STATE_CLASS_MEASUREMENT, - ), - cv.Optional(CONF_MAX_THRESHOLD_ZONE0): - sensor.sensor_schema( - icon="mdi:map-marker-distance", - unit_of_measurement="mm", - accuracy_decimals=0, - state_class=STATE_CLASS_MEASUREMENT, - entity_category=ENTITY_CATEGORY_DIAGNOSTIC, - ), - cv.Optional(CONF_MAX_THRESHOLD_ZONE1): - sensor.sensor_schema( - icon="mdi:map-marker-distance", - unit_of_measurement="mm", - accuracy_decimals=0, - state_class=STATE_CLASS_MEASUREMENT, - entity_category=ENTITY_CATEGORY_DIAGNOSTIC, - ), - cv.Optional(CONF_MIN_THRESHOLD_ZONE0): - sensor.sensor_schema( - icon="mdi:map-marker-distance", - unit_of_measurement="mm", - accuracy_decimals=0, - state_class=STATE_CLASS_MEASUREMENT, - entity_category=ENTITY_CATEGORY_DIAGNOSTIC, - ), - cv.Optional(CONF_MIN_THRESHOLD_ZONE1): - sensor.sensor_schema( - icon="mdi:map-marker-distance", - unit_of_measurement="mm", - accuracy_decimals=0, - state_class=STATE_CLASS_MEASUREMENT, - entity_category=ENTITY_CATEGORY_DIAGNOSTIC, - ), - cv.Optional(CONF_ROI_HEIGHT): - sensor.sensor_schema( - icon="mdi:table-row-height", - unit_of_measurement="px", - accuracy_decimals=0, - state_class=STATE_CLASS_MEASUREMENT, - entity_category=ENTITY_CATEGORY_DIAGNOSTIC, - ), - cv.Optional(CONF_ROI_WIDTH): - sensor.sensor_schema( - icon="mdi:table-column-width", - unit_of_measurement="px", - accuracy_decimals=0, - state_class=STATE_CLASS_MEASUREMENT, - entity_category=ENTITY_CATEGORY_DIAGNOSTIC, - ), - cv.GenerateID(CONF_ROODE_ID): - cv.use_id(Roode), -}) +CONF_DISTANCE = "distance_sensor" +CONF_PEOPLE_COUNTER = "people_counter_sensor" +CONF_MAX_THRESHOLD_ZONE0 = "max_threshold_zone0" +CONF_MAX_THRESHOLD_ZONE1 = "max_threshold_zone1" +CONF_MIN_THRESHOLD_ZONE0 = "min_threshold_zone0" +CONF_MIN_THRESHOLD_ZONE1 = "min_threshold_zone1" +CONF_ROI_HEIGHT = "roi_height" +CONF_ROI_WIDTH = "roi_width" +CONFIG_SCHEMA = sensor.sensor_schema().extend( + { + cv.Optional(CONF_DISTANCE): sensor.sensor_schema( + icon=ICON_RULER, + unit_of_measurement=UNIT_EMPTY, + accuracy_decimals=2, + state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ), + cv.Optional(CONF_PEOPLE_COUNTER): sensor.sensor_schema( + icon=ICON_COUNTER, + unit_of_measurement=UNIT_EMPTY, + accuracy_decimals=0, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional(CONF_MAX_THRESHOLD_ZONE0): sensor.sensor_schema( + icon="mdi:map-marker-distance", + unit_of_measurement="mm", + accuracy_decimals=0, + state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ), + cv.Optional(CONF_MAX_THRESHOLD_ZONE1): sensor.sensor_schema( + icon="mdi:map-marker-distance", + unit_of_measurement="mm", + accuracy_decimals=0, + state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ), + cv.Optional(CONF_MIN_THRESHOLD_ZONE0): sensor.sensor_schema( + icon="mdi:map-marker-distance", + unit_of_measurement="mm", + accuracy_decimals=0, + state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ), + cv.Optional(CONF_MIN_THRESHOLD_ZONE1): sensor.sensor_schema( + icon="mdi:map-marker-distance", + unit_of_measurement="mm", + accuracy_decimals=0, + state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ), + cv.Optional(CONF_ROI_HEIGHT): sensor.sensor_schema( + icon="mdi:table-row-height", + unit_of_measurement="px", + accuracy_decimals=0, + state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ), + cv.Optional(CONF_ROI_WIDTH): sensor.sensor_schema( + icon="mdi:table-column-width", + unit_of_measurement="px", + accuracy_decimals=0, + state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ), + cv.GenerateID(CONF_ROODE_ID): cv.use_id(Roode), + } +) async def to_code(config): @@ -110,4 +109,4 @@ async def to_code(config): cg.add(var.set_roi_height_sensor(count)) if CONF_ROI_WIDTH in config: count = await sensor.new_sensor(config[CONF_ROI_WIDTH]) - cg.add(var.set_roi_width_sensor(count)) \ No newline at end of file + cg.add(var.set_roi_width_sensor(count)) diff --git a/components/roode/text_sensor.py b/components/roode/text_sensor.py index 0e1b2f38..ebc750a2 100644 --- a/components/roode/text_sensor.py +++ b/components/roode/text_sensor.py @@ -1,7 +1,12 @@ import esphome.codegen as cg import esphome.config_validation as cv from esphome.components import text_sensor -from esphome.const import CONF_ID, CONF_ICON, CONF_ENTITY_CATEGORY, ENTITY_CATEGORY_DIAGNOSTIC +from esphome.const import ( + CONF_ID, + CONF_ICON, + CONF_ENTITY_CATEGORY, + ENTITY_CATEGORY_DIAGNOSTIC, +) from . import Roode, CONF_ROODE_ID DEPENDENCIES = ["roode"] @@ -11,28 +16,29 @@ TYPES = [VERSION, ENTRY_EXIT_EVENT] -CONFIG_SCHEMA = cv.Schema({ - cv.GenerateID(CONF_ROODE_ID): - cv.use_id(Roode), - cv.Optional(VERSION): - text_sensor.TEXT_SENSOR_SCHEMA.extend({ - cv.Optional(CONF_ICON, default="mdi:git"): - text_sensor.icon, - cv.GenerateID(): - cv.declare_id(text_sensor.TextSensor), - cv.Optional(CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_DIAGNOSTIC): - cv.entity_category, - }), - cv.Optional(ENTRY_EXIT_EVENT): - text_sensor.TEXT_SENSOR_SCHEMA.extend({ - cv.Optional(CONF_ICON, default="mdi:sign-direction"): - text_sensor.icon, - cv.GenerateID(): - cv.declare_id(text_sensor.TextSensor), - cv.Optional(CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_DIAGNOSTIC): - cv.entity_category, - }), -}) +CONFIG_SCHEMA = cv.Schema( + { + cv.GenerateID(CONF_ROODE_ID): cv.use_id(Roode), + cv.Optional(VERSION): text_sensor.TEXT_SENSOR_SCHEMA.extend( + { + cv.Optional(CONF_ICON, default="mdi:git"): text_sensor.icon, + cv.GenerateID(): cv.declare_id(text_sensor.TextSensor), + cv.Optional( + CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_DIAGNOSTIC + ): cv.entity_category, + } + ), + cv.Optional(ENTRY_EXIT_EVENT): text_sensor.TEXT_SENSOR_SCHEMA.extend( + { + cv.Optional(CONF_ICON, default="mdi:sign-direction"): text_sensor.icon, + cv.GenerateID(): cv.declare_id(text_sensor.TextSensor), + cv.Optional( + CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_DIAGNOSTIC + ): cv.entity_category, + } + ), + } +) async def setup_conf(config, key, hub): @@ -46,4 +52,4 @@ async def setup_conf(config, key, hub): async def to_code(config): hub = await cg.get_variable(config[CONF_ROODE_ID]) for key in TYPES: - await setup_conf(config, key, hub) \ No newline at end of file + await setup_conf(config, key, hub) From 4b5cfc67c0b57021911945933e2a4e4dd872fcfd Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Thu, 16 Dec 2021 15:33:53 +0100 Subject: [PATCH 10/31] Format with black --- components/roode/__init__.py | 132 +++++++++++++++++------------------ 1 file changed, 65 insertions(+), 67 deletions(-) diff --git a/components/roode/__init__.py b/components/roode/__init__.py index 607daf4b..572cf937 100644 --- a/components/roode/__init__.py +++ b/components/roode/__init__.py @@ -4,6 +4,7 @@ from esphome.components import sensor from esphome.const import CONF_ID, STATE_CLASS_MEASUREMENT, UNIT_EMPTY, UNIT_METER + # DEPENDENCIES = ["i2c"] AUTO_LOAD = ["sensor", "binary_sensor", "text_sensor"] MULTI_CONF = True @@ -13,9 +14,9 @@ roode_ns = cg.esphome_ns.namespace("roode") Roode = roode_ns.class_("Roode", cg.PollingComponent) -CONF_ROI_HEIGHT = 'roi_height' -CONF_ROI_WIDTH = 'roi_width' -CONF_ADVISED_SENSOR_ORIENTATION = 'advised_sensor_orientation' +CONF_ROI_HEIGHT = "roi_height" +CONF_ROI_WIDTH = "roi_width" +CONF_ADVISED_SENSOR_ORIENTATION = "advised_sensor_orientation" CONF_CALIBRATION = "calibration" CONF_ROI_CALIBRATION = "roi_calibration" CONF_INVERT_DIRECTION = "invert_direction" @@ -30,72 +31,69 @@ CONF_MANUAL_ACTIVE = "manual_active" CONF_CALIBRATION_ACTIVE = "calibration_active" CONF_TIMING_BUDGET = "timing_budget" -CONF_USE_PRESENCE = 'use_presence_sensor' -CONF_USE_DISTANCE = 'use_distance_sensor' TYPES = [ - CONF_RESTORE_VALUES, CONF_INVERT_DIRECTION, - CONF_ADVISED_SENSOR_ORIENTATION, CONF_I2C_ADDRESS, CONF_USE_PRESENCE, CONF_USE_DISTANCE + CONF_RESTORE_VALUES, + CONF_INVERT_DIRECTION, + CONF_ADVISED_SENSOR_ORIENTATION, + CONF_I2C_ADDRESS, ] -CONFIG_SCHEMA = (cv.Schema({ - cv.GenerateID(): - cv.declare_id(Roode), - cv.Optional(CONF_INVERT_DIRECTION, default='false'): - cv.boolean, - cv.Optional(CONF_RESTORE_VALUES, default='false'): - cv.boolean, - cv.Optional(CONF_ADVISED_SENSOR_ORIENTATION, default='true'): - cv.boolean, - cv.Optional(CONF_USE_PRESENCE, default='false'): - cv.boolean, - cv.Optional(CONF_USE_DISTANCE, default='false'): - cv.boolean, - cv.Optional(CONF_I2C_ADDRESS, default=0x29): - cv.uint8_t, - cv.Exclusive( - CONF_CALIBRATION, "mode", f"Only one mode, {CONF_MANUAL} or {CONF_CALIBRATION} is usable"): - cv.Schema({ - cv.Optional(CONF_CALIBRATION_ACTIVE, default='true'): - cv.boolean, - cv.Optional(CONF_MAX_THRESHOLD_PERCENTAGE, default=85): - cv.int_range(min=50, max=100), - cv.Optional(CONF_MIN_THRESHOLD_PERCENTAGE, default=0): - cv.int_range(min=0, max=100), - cv.Optional(CONF_ROI_CALIBRATION, default='false'): - cv.boolean, - }), - cv.Exclusive( - CONF_MANUAL, "mode", f"Only one mode, {CONF_MANUAL} or {CONF_CALIBRATION} is usable"): - cv.Schema({ - cv.Optional(CONF_MANUAL_ACTIVE, default='true'): - cv.boolean, - cv.Optional(CONF_TIMING_BUDGET, default=10): - cv.int_range(min=10, max=1000), - cv.Inclusive( - CONF_SENSOR_MODE, - "manual_mode", - f"{CONF_SENSOR_MODE}, {CONF_ROI_HEIGHT}, {CONF_ROI_WIDTH} and {CONF_MANUAL_THRESHOLD} must be used together", - ): - cv.int_range(min=-1, max=2), - cv.Inclusive( - CONF_ROI_HEIGHT, - "manual_mode", - f"{CONF_SENSOR_MODE}, {CONF_ROI_HEIGHT}, {CONF_ROI_WIDTH} and {CONF_MANUAL_THRESHOLD} must be used together", - ): - cv.int_range(min=4, max=16), - cv.Inclusive( - CONF_ROI_WIDTH, - "manual_mode", - f"{CONF_SENSOR_MODE}, {CONF_ROI_HEIGHT}, {CONF_ROI_WIDTH} and {CONF_MANUAL_THRESHOLD} must be used together", - ): - cv.int_range(min=4, max=16), - cv.Inclusive( - CONF_MANUAL_THRESHOLD, - "manual_mode", - f"{CONF_SENSOR_MODE}, {CONF_ROI_HEIGHT}, {CONF_ROI_WIDTH} and {CONF_MANUAL_THRESHOLD} must be used together", - ): - cv.int_range(min=40, max=4000), - }), -}).extend(cv.polling_component_schema("100ms"))) +CONFIG_SCHEMA = cv.Schema( + { + cv.GenerateID(): cv.declare_id(Roode), + cv.Optional(CONF_INVERT_DIRECTION, default="false"): cv.boolean, + cv.Optional(CONF_RESTORE_VALUES, default="false"): cv.boolean, + cv.Optional(CONF_ADVISED_SENSOR_ORIENTATION, default="true"): cv.boolean, + cv.Optional(CONF_I2C_ADDRESS, default=0x29): cv.uint8_t, + cv.Exclusive( + CONF_CALIBRATION, + "mode", + f"Only one mode, {CONF_MANUAL} or {CONF_CALIBRATION} is usable", + ): cv.Schema( + { + cv.Optional(CONF_CALIBRATION_ACTIVE, default="true"): cv.boolean, + cv.Optional(CONF_MAX_THRESHOLD_PERCENTAGE, default=85): cv.int_range( + min=50, max=100 + ), + cv.Optional(CONF_MIN_THRESHOLD_PERCENTAGE, default=0): cv.int_range( + min=0, max=100 + ), + cv.Optional(CONF_ROI_CALIBRATION, default="false"): cv.boolean, + } + ), + cv.Exclusive( + CONF_MANUAL, + "mode", + f"Only one mode, {CONF_MANUAL} or {CONF_CALIBRATION} is usable", + ): cv.Schema( + { + cv.Optional(CONF_MANUAL_ACTIVE, default="true"): cv.boolean, + cv.Optional(CONF_TIMING_BUDGET, default=10): cv.int_range( + min=10, max=1000 + ), + cv.Inclusive( + CONF_SENSOR_MODE, + "manual_mode", + f"{CONF_SENSOR_MODE}, {CONF_ROI_HEIGHT}, {CONF_ROI_WIDTH} and {CONF_MANUAL_THRESHOLD} must be used together", + ): cv.int_range(min=-1, max=2), + cv.Inclusive( + CONF_ROI_HEIGHT, + "manual_mode", + f"{CONF_SENSOR_MODE}, {CONF_ROI_HEIGHT}, {CONF_ROI_WIDTH} and {CONF_MANUAL_THRESHOLD} must be used together", + ): cv.int_range(min=4, max=16), + cv.Inclusive( + CONF_ROI_WIDTH, + "manual_mode", + f"{CONF_SENSOR_MODE}, {CONF_ROI_HEIGHT}, {CONF_ROI_WIDTH} and {CONF_MANUAL_THRESHOLD} must be used together", + ): cv.int_range(min=4, max=16), + cv.Inclusive( + CONF_MANUAL_THRESHOLD, + "manual_mode", + f"{CONF_SENSOR_MODE}, {CONF_ROI_HEIGHT}, {CONF_ROI_WIDTH} and {CONF_MANUAL_THRESHOLD} must be used together", + ): cv.int_range(min=40, max=4000), + } + ), + } +).extend(cv.polling_component_schema("100ms")) async def setup_conf(config, key, hub): From 5c5fb56eba5e15125dc7b376108a3b638242dde1 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Thu, 16 Dec 2021 15:34:04 +0100 Subject: [PATCH 11/31] Fix validation for binary sensor --- components/roode/binary_sensor.py | 39 ++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/components/roode/binary_sensor.py b/components/roode/binary_sensor.py index e67b26bc..9b5e6bd6 100644 --- a/components/roode/binary_sensor.py +++ b/components/roode/binary_sensor.py @@ -1,6 +1,7 @@ import esphome.codegen as cg import esphome.config_validation as cv from esphome.components import binary_sensor +import esphome.final_validate as fv from esphome.const import ( CONF_ID, CONF_DEVICE_CLASS, @@ -10,18 +11,34 @@ DEPENDENCIES = ["roode"] -CONF_PRESENCE = 'presence_sensor' +CONF_PRESENCE = "presence_sensor" TYPES = [CONF_PRESENCE] -CONFIG_SCHEMA = cv.Schema({ - cv.GenerateID(CONF_ROODE_ID): - cv.use_id(Roode), - cv.Optional(CONF_PRESENCE): - binary_sensor.BINARY_SENSOR_SCHEMA.extend({ - cv.GenerateID(): - cv.declare_id(binary_sensor.BinarySensor), - }), -}) +CONFIG_SCHEMA = cv.Schema( + { + cv.GenerateID(CONF_ROODE_ID): cv.use_id(Roode), + cv.Optional(CONF_PRESENCE): binary_sensor.BINARY_SENSOR_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor), + } + ), + } +) + + +# def validate_can_use_presence(value): +# main = fv.full_config.get()["roode"][0] +# presence_sensor = main.get(CONF_USE_PRESENCE) +# print(presence_sensor) +# if presence_sensor == False: +# raise cv.Invalid("Presence sensor is not enabled") +# else: +# return presence_sensor + + +# FINAL_VALIDATE_SCHEMA = cv.Schema( +# {cv.Optional(CONF_PRESENCE): validate_can_use_presence}, extra=cv.ALLOW_EXTRA +# ) async def setup_conf(config, key, hub): @@ -35,4 +52,4 @@ async def setup_conf(config, key, hub): async def to_code(config): hub = await cg.get_variable(config[CONF_ROODE_ID]) for key in TYPES: - await setup_conf(config, key, hub) \ No newline at end of file + await setup_conf(config, key, hub) From e318dcd8e413c1caca72d54fa0a31ecc59ee368d Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Thu, 16 Dec 2021 15:34:23 +0100 Subject: [PATCH 12/31] Fix false init of sensors and let ESPHome manage sensor creation --- components/roode/roode.cpp | 88 ++++++++++++++++++++++---------------- components/roode/roode.h | 28 ++++++------ 2 files changed, 63 insertions(+), 53 deletions(-) diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index 6a09fbd1..c10987f7 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -15,7 +15,10 @@ namespace esphome void Roode::setup() { ESP_LOGI("Roode setup", "Booting Roode %s", VERSION); - version_sensor->publish_state(VERSION); + if (version_sensor != nullptr) + { + version_sensor->publish_state(VERSION); + } EEPROM.begin(EEPROM_SIZE); Wire.begin(); Wire.setClock(400000); @@ -60,14 +63,14 @@ namespace esphome peopleCounter = EEPROM.read(100); if (peopleCounter == 255) // 255 is the default value if no value was stored peopleCounter = 0; - ESP_LOGD("Roode setup", "last value: %d", peopleCounter); + ESP_LOGD("Roode setup", "last value: %u", peopleCounter); } sendCounter(peopleCounter); } void Roode::update() { - if (set_use_distance_sensor_) + if (distance_sensor != nullptr) { distance_sensor->publish_state(distance); } @@ -94,10 +97,7 @@ namespace esphome uint16_t MinDistance; uint8_t i; distanceSensor.setROICenter(center[zone]); - distanceSensor.startContinuous(delay_between_measurements); - distance = distanceSensor.read(); - yield(); - distanceSensor.stopContinuous(); + distance = distanceSensor.readSingle(); if (DistancesTableSize[zone] < DISTANCES_ARRAY_SIZE) { @@ -126,7 +126,7 @@ namespace esphome { // Someone is in the sensing area CurrentZoneStatus = SOMEONE; - if (set_use_presence_sensor_) + if (presence_sensor != nullptr) { presence_sensor->publish_state(true); } @@ -204,7 +204,10 @@ namespace esphome peopleCounter--; sendCounter(peopleCounter); ESP_LOGD("Roode pathTracking", "Exit detected."); - entry_exit_event_sensor->publish_state("Exit"); + if (entry_exit_event_sensor != nullptr) + { + entry_exit_event_sensor->publish_state("Exit"); + } DistancesTableSize[0] = 0; DistancesTableSize[1] = 0; } @@ -215,7 +218,10 @@ namespace esphome peopleCounter++; sendCounter(peopleCounter); ESP_LOGD("Roode pathTracking", "Entry detected."); - entry_exit_event_sensor->publish_state("Entry"); + if (entry_exit_event_sensor != nullptr) + { + entry_exit_event_sensor->publish_state("Entry"); + } DistancesTableSize[0] = 0; DistancesTableSize[1] = 0; } @@ -242,12 +248,11 @@ namespace esphome PathTrack[PathTrackFillingSize - 1] = AllZonesCurrentStatus; } } - if (set_use_presence_sensor_) + if (presence_sensor != nullptr) { if (CurrentZoneStatus == NOBODY && LeftPreviousStatus == NOBODY && RightPreviousStatus == NOBODY) { // nobody is in the sensing area - presence_sensor->publish_state(false); } } @@ -257,7 +262,10 @@ namespace esphome { ESP_LOGI("Roode", "Sending people count: %d", counter); peopleCounter = counter; - people_counter_sensor->publish_state(peopleCounter); + if (people_counter_sensor != nullptr) + { + people_counter_sensor->publish_state(peopleCounter); + } if (restore_values_) { @@ -339,10 +347,8 @@ namespace esphome // increase sum of values in Zone 0 distanceSensor.setROISize(Roode::roi_width_, Roode::roi_height_); distanceSensor.setROICenter(center[zone]); - distanceSensor.startContinuous(delay_between_measurements); distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); - distance = distanceSensor.read(); - distanceSensor.stopContinuous(); + distance = distanceSensor.readSingle(); values_zone_0[i] = distance; zone++; zone = zone % 2; @@ -350,10 +356,8 @@ namespace esphome // increase sum of values in Zone 1 distanceSensor.setROISize(Roode::roi_width_, Roode::roi_height_); distanceSensor.setROICenter(center[zone]); - distanceSensor.startContinuous(delay_between_measurements); distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); - distance = distanceSensor.read(); - distanceSensor.stopContinuous(); + distance = distanceSensor.readSingle(); values_zone_1[i] = distance; zone++; zone = zone % 2; @@ -482,7 +486,6 @@ namespace esphome // the sensor does 100 measurements for each zone (zones are predefined) time_budget_in_ms = time_budget_in_ms_max_range; delay_between_measurements = delay_between_measurements_max; - distanceSensor.startContinuous(delay_between_measurements); distanceSensor.setDistanceMode(VL53L1X::Long); status = distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); if (!status) @@ -515,22 +518,16 @@ namespace esphome distanceSensor.setROISize(Roode::roi_width_, Roode::roi_height_); distanceSensor.setROICenter(center[zone]); - distanceSensor.startContinuous(delay_between_measurements); distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); - distance = distanceSensor.read(); - yield(); - distanceSensor.stopContinuous(); + distance = distanceSensor.readSingle(); values_zone_0[i] = distance; zone++; zone = zone % 2; // increase sum of values in Zone 1 distanceSensor.setROISize(roi_width_, roi_height_); distanceSensor.setROICenter(center[zone]); - distanceSensor.startContinuous(delay_between_measurements); distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); - distance = distanceSensor.read(); - yield(); - distanceSensor.stopContinuous(); + distance = distanceSensor.readSingle(); values_zone_1[i] = distance; zone++; zone = zone % 2; @@ -567,21 +564,38 @@ namespace esphome { ESP_LOGI("Roode", "Max threshold zone0: %dmm", DIST_THRESHOLD_ARR[0]); ESP_LOGI("Roode", "Max threshold zone1: %dmm", DIST_THRESHOLD_ARR[1]); - max_threshold_zone0_sensor->publish_state(DIST_THRESHOLD_ARR[0]); - max_threshold_zone1_sensor->publish_state(DIST_THRESHOLD_ARR[1]); - yield(); + if (max_threshold_zone0_sensor != nullptr) + { + max_threshold_zone0_sensor->publish_state(DIST_THRESHOLD_ARR[0]); + } + + if (max_threshold_zone1_sensor != nullptr) + { + max_threshold_zone1_sensor->publish_state(DIST_THRESHOLD_ARR[1]); + } } else { ESP_LOGI("Roode", "Min threshold zone0: %dmm", DIST_THRESHOLD_ARR[0]); ESP_LOGI("Roode", "Min threshold zone1: %dmm", DIST_THRESHOLD_ARR[1]); - min_threshold_zone0_sensor->publish_state(DIST_THRESHOLD_ARR[0]); - min_threshold_zone1_sensor->publish_state(DIST_THRESHOLD_ARR[1]); - yield(); + if (min_threshold_zone0_sensor != nullptr) + { + min_threshold_zone0_sensor->publish_state(DIST_THRESHOLD_ARR[0]); + } + if (min_threshold_zone1_sensor != nullptr) + { + min_threshold_zone1_sensor->publish_state(DIST_THRESHOLD_ARR[1]); + } + } + + if (roi_height_sensor != nullptr) + { + roi_height_sensor->publish_state(roi_height_); + } + if (roi_width_sensor != nullptr) + { + roi_width_sensor->publish_state(roi_width_); } - roi_height_sensor->publish_state(roi_height_); - roi_width_sensor->publish_state(roi_width_); - yield(); } } } \ No newline at end of file diff --git a/components/roode/roode.h b/components/roode/roode.h index b40a07e8..ca1125ff 100644 --- a/components/roode/roode.h +++ b/components/roode/roode.h @@ -67,8 +67,6 @@ namespace esphome void set_invert_direction(bool dir) { invert_direction_ = dir; } void set_restore_values(bool val) { restore_values_ = val; } void set_advised_sensor_orientation(bool val) { advised_sensor_orientation_ = val; } - void set_use_presence_sensor(bool val) { set_use_presence_sensor_ = val; } - void set_use_distance_sensor(bool val) { set_use_distance_sensor_ = val; } void set_distance_sensor(sensor::Sensor *distance_sensor_) { distance_sensor = distance_sensor_; } void set_people_counter_sensor(sensor::Sensor *people_counter_sensor_) { people_counter_sensor = people_counter_sensor_; } void set_max_threshold_zone0_sensor(sensor::Sensor *max_threshold_zone0_sensor_) { max_threshold_zone0_sensor = max_threshold_zone0_sensor_; } @@ -90,21 +88,21 @@ namespace esphome int DIST_THRESHOLD_MIN[2] = {0, 0}; // min treshold of the two zones int roi_width_{6}; // width of the ROI int roi_height_{16}; // height of the ROI - uint64_t peopleCounter{0}; + uint16_t peopleCounter{0}; protected: VL53L1X distanceSensor; - sensor::Sensor *distance_sensor = new sensor::Sensor(); - sensor::Sensor *people_counter_sensor = new sensor::Sensor(); - sensor::Sensor *max_threshold_zone0_sensor = new sensor::Sensor(); - sensor::Sensor *max_threshold_zone1_sensor = new sensor::Sensor(); - sensor::Sensor *min_threshold_zone0_sensor = new sensor::Sensor(); - sensor::Sensor *min_threshold_zone1_sensor = new sensor::Sensor(); - sensor::Sensor *roi_height_sensor = new sensor::Sensor(); - sensor::Sensor *roi_width_sensor = new sensor::Sensor(); - binary_sensor::BinarySensor *presence_sensor = new binary_sensor::BinarySensor(); - text_sensor::TextSensor *version_sensor = new text_sensor::TextSensor(); - text_sensor::TextSensor *entry_exit_event_sensor = new text_sensor::TextSensor(); + sensor::Sensor *distance_sensor; + sensor::Sensor *people_counter_sensor; + sensor::Sensor *max_threshold_zone0_sensor; + sensor::Sensor *max_threshold_zone1_sensor; + sensor::Sensor *min_threshold_zone0_sensor; + sensor::Sensor *min_threshold_zone1_sensor; + sensor::Sensor *roi_height_sensor; + sensor::Sensor *roi_width_sensor; + binary_sensor::BinarySensor *presence_sensor; + text_sensor::TextSensor *version_sensor; + text_sensor::TextSensor *entry_exit_event_sensor; void roi_calibration(VL53L1X distanceSensor, int optimized_zone_0, int optimized_zone_1); void calibration(VL53L1X distanceSensor); @@ -118,8 +116,6 @@ namespace esphome bool roi_calibration_{false}; int sensor_mode{-1}; bool advised_sensor_orientation_{true}; - bool set_use_presence_sensor_{false}; - bool set_use_distance_sensor_{false}; uint8_t address_ = 0x29; bool invert_direction_{false}; bool restore_values_{false}; From c6b534c2867b311008ad70f3c64c26908acf6760 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Thu, 16 Dec 2021 17:46:44 +0100 Subject: [PATCH 13/31] Bum sample size to 10 again --- components/roode/roode.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/roode/roode.h b/components/roode/roode.h index ca1125ff..5350e615 100644 --- a/components/roode/roode.h +++ b/components/roode/roode.h @@ -19,7 +19,7 @@ namespace esphome #define EEPROM_SIZE 512 static int LEFT = 0; static int RIGHT = 1; - static const uint16_t DISTANCES_ARRAY_SIZE = 2; + static const uint16_t DISTANCES_ARRAY_SIZE = 10; /* ##### CALIBRATION ##### From 58ed9e7d1289f01955391860b89da19cfbc45628 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Thu, 16 Dec 2021 17:54:24 +0100 Subject: [PATCH 14/31] Reduce to 5 --- components/roode/roode.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/roode/roode.h b/components/roode/roode.h index 5350e615..b3295eab 100644 --- a/components/roode/roode.h +++ b/components/roode/roode.h @@ -19,7 +19,7 @@ namespace esphome #define EEPROM_SIZE 512 static int LEFT = 0; static int RIGHT = 1; - static const uint16_t DISTANCES_ARRAY_SIZE = 10; + static const uint16_t DISTANCES_ARRAY_SIZE = 5; /* ##### CALIBRATION ##### From 0372781293542e082357354383b4de1ffca07bce Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Thu, 16 Dec 2021 18:35:04 +0100 Subject: [PATCH 15/31] Set array size to 2 again --- components/roode/roode.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/roode/roode.h b/components/roode/roode.h index b3295eab..ca1125ff 100644 --- a/components/roode/roode.h +++ b/components/roode/roode.h @@ -19,7 +19,7 @@ namespace esphome #define EEPROM_SIZE 512 static int LEFT = 0; static int RIGHT = 1; - static const uint16_t DISTANCES_ARRAY_SIZE = 5; + static const uint16_t DISTANCES_ARRAY_SIZE = 2; /* ##### CALIBRATION ##### From a7664d309f7c6c8f82a903a87151a6cb8c81483c Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Thu, 16 Dec 2021 20:48:33 +0100 Subject: [PATCH 16/31] Disable sampling --- components/roode/roode.cpp | 55 +++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index c10987f7..a0a68566 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -78,9 +78,13 @@ namespace esphome void Roode::loop() { + // unsigned long start = micros(); getZoneDistance(); zone++; zone = zone % 2; + // unsigned long end = micros(); + // unsigned long delta = end - start; + // ESP_LOGI("Roode loop", "loop took %lu microseconds", delta); } void Roode::getZoneDistance() @@ -99,30 +103,33 @@ namespace esphome distanceSensor.setROICenter(center[zone]); distance = distanceSensor.readSingle(); - if (DistancesTableSize[zone] < DISTANCES_ARRAY_SIZE) - { - Distances[zone][DistancesTableSize[zone]] = distance; - DistancesTableSize[zone]++; - } - else - { - for (i = 1; i < DISTANCES_ARRAY_SIZE; i++) - Distances[zone][i - 1] = Distances[zone][i]; - Distances[zone][DISTANCES_ARRAY_SIZE - 1] = distance; - } - - // pick up the min distance - MinDistance = Distances[zone][0]; - if (DistancesTableSize[zone] >= 2) - { - for (i = 1; i < DistancesTableSize[zone]; i++) - { - if (Distances[zone][i] < MinDistance) - MinDistance = Distances[zone][i]; - } - } - - if (MinDistance < DIST_THRESHOLD_MAX[zone] && MinDistance > DIST_THRESHOLD_MIN[zone]) + // if (DistancesTableSize[zone] < DISTANCES_ARRAY_SIZE) + // { + // Distances[zone][DistancesTableSize[zone]] = distance; + // DistancesTableSize[zone]++; + // // ESP_LOGD("Roode", "Distances[%d][DistancesTableSize[zone]] = %d", zone, Distances[zone][DistancesTableSize[zone]]); + // } + // else + // { + // for (i = 1; i < DISTANCES_ARRAY_SIZE; i++) + // Distances[zone][i - 1] = Distances[zone][i]; + // Distances[zone][DISTANCES_ARRAY_SIZE - 1] = distance; + // // ESP_LOGD("Roode", "Distances[%d][DISTANCES_ARRAY_SIZE - 1] = %d", zone, Distances[zone][DISTANCES_ARRAY_SIZE - 1]); + // } + // // ESP_LOGD("Roode", "Distances[%d][0]] = %d", zone, Distances[zone][0]); + // // ESP_LOGD("Roode", "Distances[%d][1]] = %d", zone, Distances[zone][1]); + // // pick up the min distance + // MinDistance = Distances[zone][0]; + // if (DistancesTableSize[zone] >= 2) + // { + // for (i = 1; i < DistancesTableSize[zone]; i++) + // { + // if (Distances[zone][i] < MinDistance) + // MinDistance = Distances[zone][i]; + // } + // } + + if (distance < DIST_THRESHOLD_MAX[zone] && distance > DIST_THRESHOLD_MIN[zone]) { // Someone is in the sensing area CurrentZoneStatus = SOMEONE; From 8f26340f546408ff100db51e0404ba996936b23e Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Fri, 17 Dec 2021 18:03:09 +0100 Subject: [PATCH 17/31] Add feed_wdt calls --- components/roode/roode.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index a0a68566..f1205b8e 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -82,6 +82,7 @@ namespace esphome getZoneDistance(); zone++; zone = zone % 2; + App.feed_wdt(); // unsigned long end = micros(); // unsigned long delta = end - start; // ESP_LOGI("Roode loop", "loop took %lu microseconds", delta); @@ -513,7 +514,6 @@ namespace esphome roi_width_ = roi_height_; roi_height_ = roi_width_; } - yield(); zone = 0; @@ -530,6 +530,7 @@ namespace esphome values_zone_0[i] = distance; zone++; zone = zone % 2; + App.feed_wdt(); // increase sum of values in Zone 1 distanceSensor.setROISize(roi_width_, roi_height_); distanceSensor.setROICenter(center[zone]); @@ -557,6 +558,7 @@ namespace esphome int unit_threshold_zone_0 = DIST_THRESHOLD_MAX[0] - 100 * hundred_threshold_zone_0; int unit_threshold_zone_1 = DIST_THRESHOLD_MAX[1] - 100 * hundred_threshold_zone_1; publishSensorConfiguration(DIST_THRESHOLD_MAX, true); + App.feed_wdt(); if (min_threshold_percentage_ != 0) { DIST_THRESHOLD_MIN[0] = optimized_zone_0 * min_threshold_percentage_ / 100; // they can be int values, as we are not interested in the decimal part when defining the threshold From 996be2b60f68350a40c527990c75ed4826288971 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Fri, 17 Dec 2021 18:43:00 +0100 Subject: [PATCH 18/31] Add additional wdt --- components/roode/roode.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index f1205b8e..cfce0ada 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -46,6 +46,7 @@ namespace esphome if (calibration_active_) { calibration(distanceSensor); + App.feed_wdt(); } if (manual_active_) { From 4139b3e4ab7217ee7d42241aa3b3465e55d7844e Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Fri, 17 Dec 2021 18:55:53 +0100 Subject: [PATCH 19/31] Fix duplicated timing setting and add missing delay --- components/roode/roode.cpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index cfce0ada..43f2bdc5 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -84,6 +84,7 @@ namespace esphome zone++; zone = zone % 2; App.feed_wdt(); + delay(delay_between_measurements); // unsigned long end = micros(); // unsigned long delta = end - start; // ESP_LOGI("Roode loop", "loop took %lu microseconds", delta); @@ -104,7 +105,6 @@ namespace esphome uint8_t i; distanceSensor.setROICenter(center[zone]); distance = distanceSensor.readSingle(); - // if (DistancesTableSize[zone] < DISTANCES_ARRAY_SIZE) // { // Distances[zone][DistancesTableSize[zone]] = distance; @@ -351,21 +351,19 @@ namespace esphome zone = 0; int *values_zone_0 = new int[number_attempts]; int *values_zone_1 = new int[number_attempts]; + distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); + distanceSensor.setROISize(Roode::roi_width_, Roode::roi_height_); for (int i = 0; i < number_attempts; i++) { // increase sum of values in Zone 0 - distanceSensor.setROISize(Roode::roi_width_, Roode::roi_height_); distanceSensor.setROICenter(center[zone]); - distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); distance = distanceSensor.readSingle(); values_zone_0[i] = distance; zone++; zone = zone % 2; // increase sum of values in Zone 1 - distanceSensor.setROISize(Roode::roi_width_, Roode::roi_height_); distanceSensor.setROICenter(center[zone]); - distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); distance = distanceSensor.readSingle(); values_zone_1[i] = distance; zone++; @@ -520,22 +518,21 @@ namespace esphome int *values_zone_0 = new int[number_attempts]; int *values_zone_1 = new int[number_attempts]; + distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); + distanceSensor.setROISize(Roode::roi_width_, Roode::roi_height_); for (int i = 0; i < number_attempts; i++) { // increase sum of values in Zone 0 - distanceSensor.setROISize(Roode::roi_width_, Roode::roi_height_); distanceSensor.setROICenter(center[zone]); - distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); + distance = distanceSensor.readSingle(); values_zone_0[i] = distance; zone++; zone = zone % 2; App.feed_wdt(); // increase sum of values in Zone 1 - distanceSensor.setROISize(roi_width_, roi_height_); distanceSensor.setROICenter(center[zone]); - distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); distance = distanceSensor.readSingle(); values_zone_1[i] = distance; zone++; From 69c8bd5aad547fc49c268a16158e64c9bf83a031 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Sat, 18 Dec 2021 11:34:40 +0100 Subject: [PATCH 20/31] Add use_sampling config --- components/roode/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/roode/__init__.py b/components/roode/__init__.py index 572cf937..0f7ab63a 100644 --- a/components/roode/__init__.py +++ b/components/roode/__init__.py @@ -31,11 +31,13 @@ CONF_MANUAL_ACTIVE = "manual_active" CONF_CALIBRATION_ACTIVE = "calibration_active" CONF_TIMING_BUDGET = "timing_budget" +CONF_USE_SAMPLING = "use_sampling" TYPES = [ CONF_RESTORE_VALUES, CONF_INVERT_DIRECTION, CONF_ADVISED_SENSOR_ORIENTATION, CONF_I2C_ADDRESS, + CONF_USE_SAMPLING, ] CONFIG_SCHEMA = cv.Schema( { @@ -43,6 +45,7 @@ cv.Optional(CONF_INVERT_DIRECTION, default="false"): cv.boolean, cv.Optional(CONF_RESTORE_VALUES, default="false"): cv.boolean, cv.Optional(CONF_ADVISED_SENSOR_ORIENTATION, default="true"): cv.boolean, + cv.Optional(CONF_USE_SAMPLING, default="false"): cv.boolean, cv.Optional(CONF_I2C_ADDRESS, default=0x29): cv.uint8_t, cv.Exclusive( CONF_CALIBRATION, From ea897c26fceb8e0c2cab31db32ebc7aa2917ebfc Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Sat, 18 Dec 2021 11:36:22 +0100 Subject: [PATCH 21/31] Fix sensor readings --- components/roode/roode.cpp | 151 +++++++++++++++++++------------------ components/roode/roode.h | 16 ++-- components/roode/sensor.py | 4 +- 3 files changed, 89 insertions(+), 82 deletions(-) diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index 43f2bdc5..da01c6e5 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -83,6 +83,7 @@ namespace esphome getZoneDistance(); zone++; zone = zone % 2; + distanceSensor.setROICenter(center[zone]); App.feed_wdt(); delay(delay_between_measurements); // unsigned long end = micros(); @@ -96,41 +97,47 @@ namespace esphome static int PathTrackFillingSize = 1; // init this to 1 as we start from state where nobody is any of the zones static int LeftPreviousStatus = NOBODY; static int RightPreviousStatus = NOBODY; - static uint16_t Distances[2][DISTANCES_ARRAY_SIZE]; static uint8_t DistancesTableSize[2] = {0, 0}; int CurrentZoneStatus = NOBODY; int AllZonesCurrentStatus = 0; int AnEventHasOccured = 0; - uint16_t MinDistance; - uint8_t i; - distanceSensor.setROICenter(center[zone]); - distance = distanceSensor.readSingle(); - // if (DistancesTableSize[zone] < DISTANCES_ARRAY_SIZE) - // { - // Distances[zone][DistancesTableSize[zone]] = distance; - // DistancesTableSize[zone]++; - // // ESP_LOGD("Roode", "Distances[%d][DistancesTableSize[zone]] = %d", zone, Distances[zone][DistancesTableSize[zone]]); - // } - // else - // { - // for (i = 1; i < DISTANCES_ARRAY_SIZE; i++) - // Distances[zone][i - 1] = Distances[zone][i]; - // Distances[zone][DISTANCES_ARRAY_SIZE - 1] = distance; - // // ESP_LOGD("Roode", "Distances[%d][DISTANCES_ARRAY_SIZE - 1] = %d", zone, Distances[zone][DISTANCES_ARRAY_SIZE - 1]); - // } - // // ESP_LOGD("Roode", "Distances[%d][0]] = %d", zone, Distances[zone][0]); - // // ESP_LOGD("Roode", "Distances[%d][1]] = %d", zone, Distances[zone][1]); - // // pick up the min distance - // MinDistance = Distances[zone][0]; - // if (DistancesTableSize[zone] >= 2) - // { - // for (i = 1; i < DistancesTableSize[zone]; i++) - // { - // if (Distances[zone][i] < MinDistance) - // MinDistance = Distances[zone][i]; - // } - // } + distance = distanceSensor.read(); + + if (use_sampling_) + { + static uint16_t Distances[2][DISTANCES_ARRAY_SIZE]; + uint16_t MinDistance; + uint8_t i; + if (DistancesTableSize[zone] < DISTANCES_ARRAY_SIZE) + { + Distances[zone][DistancesTableSize[zone]] = distance; + DistancesTableSize[zone]++; + ESP_LOGD("Roode", "Distances[%d][DistancesTableSize[zone]] = %d", zone, Distances[zone][DistancesTableSize[zone]]); + } + else + { + for (i = 1; i < DISTANCES_ARRAY_SIZE; i++) + Distances[zone][i - 1] = Distances[zone][i]; + Distances[zone][DISTANCES_ARRAY_SIZE - 1] = distance; + ESP_LOGD("Roode", "Distances[%d][DISTANCES_ARRAY_SIZE - 1] = %d", zone, Distances[zone][DISTANCES_ARRAY_SIZE - 1]); + } + ESP_LOGD("Roode", "Distances[%d][0]] = %d", zone, Distances[zone][0]); + ESP_LOGD("Roode", "Distances[%d][1]] = %d", zone, Distances[zone][1]); + // pick up the min distance + MinDistance = Distances[zone][0]; + if (DistancesTableSize[zone] >= 2) + { + for (i = 1; i < DistancesTableSize[zone]; i++) + { + if (Distances[zone][i] < MinDistance) + MinDistance = Distances[zone][i]; + } + } + distance = MinDistance; + } + + // PathTrack algorithm if (distance < DIST_THRESHOLD_MAX[zone] && distance > DIST_THRESHOLD_MIN[zone]) { // Someone is in the sensing area @@ -351,31 +358,34 @@ namespace esphome zone = 0; int *values_zone_0 = new int[number_attempts]; int *values_zone_1 = new int[number_attempts]; - distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); distanceSensor.setROISize(Roode::roi_width_, Roode::roi_height_); + delay(100); for (int i = 0; i < number_attempts; i++) { // increase sum of values in Zone 0 distanceSensor.setROICenter(center[zone]); - distance = distanceSensor.readSingle(); + delay(1); + distance = distanceSensor.read(); values_zone_0[i] = distance; zone++; zone = zone % 2; - + delay(delay_between_measurements); + App.feed_wdt(); // increase sum of values in Zone 1 distanceSensor.setROICenter(center[zone]); - distance = distanceSensor.readSingle(); + delay(1); + distance = distanceSensor.read(); values_zone_1[i] = distance; zone++; zone = zone % 2; - App.feed_wdt(); + delay(delay_between_measurements); } optimized_zone_0 = getOptimizedValues(values_zone_0, getSum(values_zone_0, number_attempts), number_attempts); optimized_zone_1 = getOptimizedValues(values_zone_1, getSum(values_zone_1, number_attempts), number_attempts); - EEPROM.write(13, ROI_size); } void Roode::setSensorMode(int sensor_mode, int timing_budget) { + distanceSensor.stopContinuous(); switch (sensor_mode) { case 0: // short mode @@ -386,31 +396,31 @@ namespace esphome { ESP_LOGE("Setup", "Could not set distance mode. mode: %d", VL53L1X::Short); } - ESP_LOGI("Setup", "Manually set short mode. timing_budget: %d", time_budget_in_ms); + ESP_LOGI("Setup", "Set short mode. timing_budget: %d", time_budget_in_ms); break; - case 1: // long mode - time_budget_in_ms = time_budget_in_ms_long; - delay_between_measurements = delay_between_measurements_long; - status = distanceSensor.setDistanceMode(VL53L1X::Long); + case 1: // medium mode + time_budget_in_ms = time_budget_in_ms_medium; + delay_between_measurements = delay_between_measurements_medium; + status = distanceSensor.setDistanceMode(VL53L1X::Medium); if (!status) { - ESP_LOGE("Setup", "Could not set distance mode. mode: %d", VL53L1X::Long); + ESP_LOGE("Setup", "Could not set distance mode. mode: %d", VL53L1X::Medium); } - ESP_LOGI("Setup", "Manually set long mode. timing_budget: %d", time_budget_in_ms); + ESP_LOGI("Setup", "Set long mode. timing_budget: %d", time_budget_in_ms); break; - case 2: // max mode - time_budget_in_ms = time_budget_in_ms_max_range; - delay_between_measurements = delay_between_measurements_max; + case 2: // long mode + time_budget_in_ms = time_budget_in_ms_long; + delay_between_measurements = delay_between_measurements_long; status = distanceSensor.setDistanceMode(VL53L1X::Long); if (!status) { ESP_LOGE("Setup", "Could not set distance mode. mode: %d", VL53L1X::Long); } - ESP_LOGI("Setup", "Manually set max range mode. timing_budget: %d", time_budget_in_ms); + ESP_LOGI("Setup", "Set max range mode. timing_budget: %d", time_budget_in_ms); break; case 3: // custom mode time_budget_in_ms = timing_budget; - delay_between_measurements = delay_between_measurements_max; + delay_between_measurements = delay_between_measurements_long; status = distanceSensor.setDistanceMode(VL53L1X::Long); if (!status) { @@ -426,32 +436,24 @@ namespace esphome { ESP_LOGE("Setup", "Could not set timing budget. timing_budget: %d ms", time_budget_in_ms); } + distanceSensor.startContinuous(delay_between_measurements); } void Roode::setCorrectDistanceSettings(float average_zone_0, float average_zone_1) { - if (average_zone_0 <= short_distance_threshold || average_zone_1 <= short_distance_threshold) + if (average_zone_0 <= short_distance_threshold && average_zone_1 <= short_distance_threshold) { - // we can use the short mode, which allows more precise measurements up to 1.3 meters - time_budget_in_ms = time_budget_in_ms_short; - delay_between_measurements = delay_between_measurements_short; - distanceSensor.setDistanceMode(VL53L1X::Short); + setSensorMode(0, time_budget_in_ms_short); } - if ((average_zone_0 > short_distance_threshold && average_zone_0 <= long_distance_threshold) || (average_zone_1 > short_distance_threshold && average_zone_1 <= long_distance_threshold)) + if ((average_zone_0 > short_distance_threshold && average_zone_0 <= medium_distance_threshold) || (average_zone_1 > short_distance_threshold && average_zone_1 <= medium_distance_threshold)) { - // we can use the short mode, which allows more precise measurements up to 1.3 meters - time_budget_in_ms = time_budget_in_ms_long; - delay_between_measurements = delay_between_measurements_long; - distanceSensor.setDistanceMode(VL53L1X::Long); + setSensorMode(1, time_budget_in_ms_medium); } - if (average_zone_0 > long_distance_threshold || average_zone_1 > long_distance_threshold) + if (average_zone_0 > medium_distance_threshold || average_zone_1 > medium_distance_threshold) { - // we can use the short mode, which allows more precise measurements up to 1.3 meters - time_budget_in_ms = time_budget_in_ms_max_range; - delay_between_measurements = delay_between_measurements_max; - distanceSensor.setDistanceMode(VL53L1X::Long); + setSensorMode(1, time_budget_in_ms_long); } status = distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); if (!status) @@ -465,7 +467,7 @@ namespace esphome for (int i = 0; i < size; i++) { sum = sum + array[i]; - yield(); + App.feed_wdt(); } return sum; } @@ -479,7 +481,7 @@ namespace esphome for (int i = 0; i < size; i++) { sum_squared = sum_squared + (values[i] * values[i]); - yield(); + App.feed_wdt(); } variance = sum_squared / size - (avg * avg); sd = sqrt(variance); @@ -491,10 +493,12 @@ namespace esphome void Roode::calibration(VL53L1X distanceSensor) { // the sensor does 100 measurements for each zone (zones are predefined) - time_budget_in_ms = time_budget_in_ms_max_range; - delay_between_measurements = delay_between_measurements_max; + time_budget_in_ms = time_budget_in_ms_long; + delay_between_measurements = delay_between_measurements_long; distanceSensor.setDistanceMode(VL53L1X::Long); status = distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); + distanceSensor.setROISize(Roode::roi_width_, Roode::roi_height_); + distanceSensor.startContinuous(delay_between_measurements); if (!status) { ESP_LOGE("Calibration", "Could not set timing budget. timing_budget: %d ms", time_budget_in_ms); @@ -518,25 +522,26 @@ namespace esphome int *values_zone_0 = new int[number_attempts]; int *values_zone_1 = new int[number_attempts]; - distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); - distanceSensor.setROISize(Roode::roi_width_, Roode::roi_height_); + for (int i = 0; i < number_attempts; i++) { // increase sum of values in Zone 0 - distanceSensor.setROICenter(center[zone]); - - distance = distanceSensor.readSingle(); + delay(1); + distance = distanceSensor.read(); values_zone_0[i] = distance; zone++; zone = zone % 2; + delay(delay_between_measurements); App.feed_wdt(); // increase sum of values in Zone 1 distanceSensor.setROICenter(center[zone]); - distance = distanceSensor.readSingle(); + delay(1); + distance = distanceSensor.read(); values_zone_1[i] = distance; zone++; zone = zone % 2; + delay(delay_between_measurements); } // after we have computed the sum for each zone, we can compute the average distance of each zone diff --git a/components/roode/roode.h b/components/roode/roode.h index ca1125ff..1e11626b 100644 --- a/components/roode/roode.h +++ b/components/roode/roode.h @@ -39,12 +39,12 @@ namespace esphome static int time_budget_in_ms = 0; // parameters which define the time between two different measurements in various modes (https://www.st.com/resource/en/datasheet/vl53l1x.pdf) - static int time_budget_in_ms_short = 15; // 20ms with the full API but 15ms with the ULD API (https://www.st.com/resource/en/user_manual/um2510-a-guide-to-using-the-vl53l1x-ultra-lite-driver-stmicroelectronics.pdf) - static int time_budget_in_ms_long = 33; // Works up to 3.1m increase to minimum of 140ms for 4m - static int time_budget_in_ms_max_range = 100; // Works up to 4m in the dark on a white chart - static int delay_between_measurements_short = 25; - static int delay_between_measurements_long = 50; - static int delay_between_measurements_max = 220; + static int time_budget_in_ms_short = 15; // 20ms with the full API but 15ms with the ULD API (https://www.st.com/resource/en/user_manual/um2510-a-guide-to-using-the-vl53l1x-ultra-lite-driver-stmicroelectronics.pdf) + static int time_budget_in_ms_medium = 33; // Works up to 3.1m increase to minimum of 140ms for 4m + static int time_budget_in_ms_long = 100; // Works up to 4m in the dark on a white chart + static int delay_between_measurements_short = 20; + static int delay_between_measurements_medium = 50; + static int delay_between_measurements_long = 220; class Roode : public PollingComponent { @@ -67,6 +67,7 @@ namespace esphome void set_invert_direction(bool dir) { invert_direction_ = dir; } void set_restore_values(bool val) { restore_values_ = val; } void set_advised_sensor_orientation(bool val) { advised_sensor_orientation_ = val; } + void set_use_sampling(bool val) { use_sampling_ = val; } void set_distance_sensor(sensor::Sensor *distance_sensor_) { distance_sensor = distance_sensor_; } void set_people_counter_sensor(sensor::Sensor *people_counter_sensor_) { people_counter_sensor = people_counter_sensor_; } void set_max_threshold_zone0_sensor(sensor::Sensor *max_threshold_zone0_sensor_) { max_threshold_zone0_sensor = max_threshold_zone0_sensor_; } @@ -116,6 +117,7 @@ namespace esphome bool roi_calibration_{false}; int sensor_mode{-1}; bool advised_sensor_orientation_{true}; + bool use_sampling_{false}; uint8_t address_ = 0x29; bool invert_direction_{false}; bool restore_values_{false}; @@ -128,7 +130,7 @@ namespace esphome bool lastTrippedState = 0; double people, distance_avg; int short_distance_threshold = 1300; - int long_distance_threshold = 3100; + int medium_distance_threshold = 3100; bool status = false; int optimized_zone_0; int optimized_zone_1; diff --git a/components/roode/sensor.py b/components/roode/sensor.py index 9536c6fb..c93bcfa8 100644 --- a/components/roode/sensor.py +++ b/components/roode/sensor.py @@ -26,8 +26,8 @@ { cv.Optional(CONF_DISTANCE): sensor.sensor_schema( icon=ICON_RULER, - unit_of_measurement=UNIT_EMPTY, - accuracy_decimals=2, + unit_of_measurement="mm", + accuracy_decimals=0, state_class=STATE_CLASS_MEASUREMENT, entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), From 738ab75ad3ef665e3a12eddfa0a9a414d446b4a2 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Sat, 18 Dec 2021 11:50:50 +0100 Subject: [PATCH 22/31] Set ROI correct --- components/roode/roode.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index da01c6e5..f0fa586e 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -83,7 +83,6 @@ namespace esphome getZoneDistance(); zone++; zone = zone % 2; - distanceSensor.setROICenter(center[zone]); App.feed_wdt(); delay(delay_between_measurements); // unsigned long end = micros(); @@ -101,7 +100,7 @@ namespace esphome int CurrentZoneStatus = NOBODY; int AllZonesCurrentStatus = 0; int AnEventHasOccured = 0; - + distanceSensor.setROICenter(center[zone]); distance = distanceSensor.read(); if (use_sampling_) From f842faaf4af9225dc26743eaeb72b13d73d351be Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Sat, 18 Dec 2021 11:55:42 +0100 Subject: [PATCH 23/31] Remove double delay --- components/roode/roode.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index f0fa586e..1222372b 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -84,7 +84,6 @@ namespace esphome zone++; zone = zone % 2; App.feed_wdt(); - delay(delay_between_measurements); // unsigned long end = micros(); // unsigned long delta = end - start; // ESP_LOGI("Roode loop", "loop took %lu microseconds", delta); @@ -368,7 +367,6 @@ namespace esphome values_zone_0[i] = distance; zone++; zone = zone % 2; - delay(delay_between_measurements); App.feed_wdt(); // increase sum of values in Zone 1 distanceSensor.setROICenter(center[zone]); @@ -377,7 +375,6 @@ namespace esphome values_zone_1[i] = distance; zone++; zone = zone % 2; - delay(delay_between_measurements); } optimized_zone_0 = getOptimizedValues(values_zone_0, getSum(values_zone_0, number_attempts), number_attempts); optimized_zone_1 = getOptimizedValues(values_zone_1, getSum(values_zone_1, number_attempts), number_attempts); @@ -531,7 +528,6 @@ namespace esphome values_zone_0[i] = distance; zone++; zone = zone % 2; - delay(delay_between_measurements); App.feed_wdt(); // increase sum of values in Zone 1 distanceSensor.setROICenter(center[zone]); @@ -540,7 +536,6 @@ namespace esphome values_zone_1[i] = distance; zone++; zone = zone % 2; - delay(delay_between_measurements); } // after we have computed the sum for each zone, we can compute the average distance of each zone From 7a0bdd7888df50969e81c1a990f25e374f0f1121 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Sat, 18 Dec 2021 12:06:41 +0100 Subject: [PATCH 24/31] Set correct delay --- components/roode/roode.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index 1222372b..a8ab32f5 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -83,7 +83,7 @@ namespace esphome getZoneDistance(); zone++; zone = zone % 2; - App.feed_wdt(); + // App.feed_wdt(); // unsigned long end = micros(); // unsigned long delta = end - start; // ESP_LOGI("Roode loop", "loop took %lu microseconds", delta); @@ -99,6 +99,7 @@ namespace esphome int CurrentZoneStatus = NOBODY; int AllZonesCurrentStatus = 0; int AnEventHasOccured = 0; + delay(10); distanceSensor.setROICenter(center[zone]); distance = distanceSensor.read(); @@ -357,7 +358,6 @@ namespace esphome int *values_zone_0 = new int[number_attempts]; int *values_zone_1 = new int[number_attempts]; distanceSensor.setROISize(Roode::roi_width_, Roode::roi_height_); - delay(100); for (int i = 0; i < number_attempts; i++) { // increase sum of values in Zone 0 @@ -523,7 +523,7 @@ namespace esphome { // increase sum of values in Zone 0 distanceSensor.setROICenter(center[zone]); - delay(1); + delay(10); distance = distanceSensor.read(); values_zone_0[i] = distance; zone++; @@ -531,7 +531,7 @@ namespace esphome App.feed_wdt(); // increase sum of values in Zone 1 distanceSensor.setROICenter(center[zone]); - delay(1); + delay(10); distance = distanceSensor.read(); values_zone_1[i] = distance; zone++; From 8132a057812f33a93c7b9e55118e57bacebc142e Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Sat, 18 Dec 2021 12:24:39 +0100 Subject: [PATCH 25/31] Fix sensor mode setting --- components/roode/roode.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index a8ab32f5..a42ee0d9 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -102,6 +102,7 @@ namespace esphome delay(10); distanceSensor.setROICenter(center[zone]); distance = distanceSensor.read(); + ESP_LOGD("Roode", "center: %d", distanceSensor.getROICenter()); if (use_sampling_) { @@ -379,7 +380,7 @@ namespace esphome optimized_zone_0 = getOptimizedValues(values_zone_0, getSum(values_zone_0, number_attempts), number_attempts); optimized_zone_1 = getOptimizedValues(values_zone_1, getSum(values_zone_1, number_attempts), number_attempts); } - void Roode::setSensorMode(int sensor_mode, int timing_budget) + void Roode::setSensorMode(int sensor_mode, int new_timing_budget) { distanceSensor.stopContinuous(); switch (sensor_mode) @@ -402,7 +403,7 @@ namespace esphome { ESP_LOGE("Setup", "Could not set distance mode. mode: %d", VL53L1X::Medium); } - ESP_LOGI("Setup", "Set long mode. timing_budget: %d", time_budget_in_ms); + ESP_LOGI("Setup", "Set medium mode. timing_budget: %d", time_budget_in_ms); break; case 2: // long mode time_budget_in_ms = time_budget_in_ms_long; @@ -412,10 +413,10 @@ namespace esphome { ESP_LOGE("Setup", "Could not set distance mode. mode: %d", VL53L1X::Long); } - ESP_LOGI("Setup", "Set max range mode. timing_budget: %d", time_budget_in_ms); + ESP_LOGI("Setup", "Set long range mode. timing_budget: %d", time_budget_in_ms); break; case 3: // custom mode - time_budget_in_ms = timing_budget; + time_budget_in_ms = new_timing_budget; delay_between_measurements = delay_between_measurements_long; status = distanceSensor.setDistanceMode(VL53L1X::Long); if (!status) @@ -449,7 +450,7 @@ namespace esphome if (average_zone_0 > medium_distance_threshold || average_zone_1 > medium_distance_threshold) { - setSensorMode(1, time_budget_in_ms_long); + setSensorMode(2, time_budget_in_ms_long); } status = distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); if (!status) From d95173bfc577b048a26ac6f62c6d532e0b7e77f9 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Sat, 18 Dec 2021 12:39:27 +0100 Subject: [PATCH 26/31] Try to fix measurement --- components/roode/roode.cpp | 77 +++++++++++++++++++------------------- components/roode/roode.h | 15 +++++--- 2 files changed, 49 insertions(+), 43 deletions(-) diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index a42ee0d9..dff9de6b 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -99,43 +99,43 @@ namespace esphome int CurrentZoneStatus = NOBODY; int AllZonesCurrentStatus = 0; int AnEventHasOccured = 0; - delay(10); + delay(6); distanceSensor.setROICenter(center[zone]); distance = distanceSensor.read(); ESP_LOGD("Roode", "center: %d", distanceSensor.getROICenter()); - if (use_sampling_) - { - static uint16_t Distances[2][DISTANCES_ARRAY_SIZE]; - uint16_t MinDistance; - uint8_t i; - if (DistancesTableSize[zone] < DISTANCES_ARRAY_SIZE) - { - Distances[zone][DistancesTableSize[zone]] = distance; - DistancesTableSize[zone]++; - ESP_LOGD("Roode", "Distances[%d][DistancesTableSize[zone]] = %d", zone, Distances[zone][DistancesTableSize[zone]]); - } - else - { - for (i = 1; i < DISTANCES_ARRAY_SIZE; i++) - Distances[zone][i - 1] = Distances[zone][i]; - Distances[zone][DISTANCES_ARRAY_SIZE - 1] = distance; - ESP_LOGD("Roode", "Distances[%d][DISTANCES_ARRAY_SIZE - 1] = %d", zone, Distances[zone][DISTANCES_ARRAY_SIZE - 1]); - } - ESP_LOGD("Roode", "Distances[%d][0]] = %d", zone, Distances[zone][0]); - ESP_LOGD("Roode", "Distances[%d][1]] = %d", zone, Distances[zone][1]); - // pick up the min distance - MinDistance = Distances[zone][0]; - if (DistancesTableSize[zone] >= 2) - { - for (i = 1; i < DistancesTableSize[zone]; i++) - { - if (Distances[zone][i] < MinDistance) - MinDistance = Distances[zone][i]; - } - } - distance = MinDistance; - } + // if (use_sampling_) + // { + // static uint16_t Distances[2][DISTANCES_ARRAY_SIZE]; + // uint16_t MinDistance; + // uint8_t i; + // if (DistancesTableSize[zone] < DISTANCES_ARRAY_SIZE) + // { + // Distances[zone][DistancesTableSize[zone]] = distance; + // DistancesTableSize[zone]++; + // ESP_LOGD("Roode", "Distances[%d][DistancesTableSize[zone]] = %d", zone, Distances[zone][DistancesTableSize[zone]]); + // } + // else + // { + // for (i = 1; i < DISTANCES_ARRAY_SIZE; i++) + // Distances[zone][i - 1] = Distances[zone][i]; + // Distances[zone][DISTANCES_ARRAY_SIZE - 1] = distance; + // ESP_LOGD("Roode", "Distances[%d][DISTANCES_ARRAY_SIZE - 1] = %d", zone, Distances[zone][DISTANCES_ARRAY_SIZE - 1]); + // } + // ESP_LOGD("Roode", "Distances[%d][0]] = %d", zone, Distances[zone][0]); + // ESP_LOGD("Roode", "Distances[%d][1]] = %d", zone, Distances[zone][1]); + // // pick up the min distance + // MinDistance = Distances[zone][0]; + // if (DistancesTableSize[zone] >= 2) + // { + // for (i = 1; i < DistancesTableSize[zone]; i++) + // { + // if (Distances[zone][i] < MinDistance) + // MinDistance = Distances[zone][i]; + // } + // } + // distance = MinDistance; + // } // PathTrack algorithm if (distance < DIST_THRESHOLD_MAX[zone] && distance > DIST_THRESHOLD_MIN[zone]) @@ -489,10 +489,11 @@ namespace esphome void Roode::calibration(VL53L1X distanceSensor) { + distanceSensor.stopContinuous(); // the sensor does 100 measurements for each zone (zones are predefined) - time_budget_in_ms = time_budget_in_ms_long; - delay_between_measurements = delay_between_measurements_long; - distanceSensor.setDistanceMode(VL53L1X::Long); + time_budget_in_ms = time_budget_in_ms_medium; + delay_between_measurements = delay_between_measurements_medium; + distanceSensor.setDistanceMode(VL53L1X::Medium); status = distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); distanceSensor.setROISize(Roode::roi_width_, Roode::roi_height_); distanceSensor.startContinuous(delay_between_measurements); @@ -524,7 +525,7 @@ namespace esphome { // increase sum of values in Zone 0 distanceSensor.setROICenter(center[zone]); - delay(10); + delay(6); distance = distanceSensor.read(); values_zone_0[i] = distance; zone++; @@ -532,7 +533,7 @@ namespace esphome App.feed_wdt(); // increase sum of values in Zone 1 distanceSensor.setROICenter(center[zone]); - delay(10); + delay(6); distance = distanceSensor.read(); values_zone_1[i] = distance; zone++; diff --git a/components/roode/roode.h b/components/roode/roode.h index 1e11626b..0dd77ef5 100644 --- a/components/roode/roode.h +++ b/components/roode/roode.h @@ -38,13 +38,18 @@ namespace esphome static int delay_between_measurements = 0; static int time_budget_in_ms = 0; - // parameters which define the time between two different measurements in various modes (https://www.st.com/resource/en/datasheet/vl53l1x.pdf) + /* + Parameters which define the time between two different measurements in various modes (https://www.st.com/resource/en/datasheet/vl53l1x.pdf) + The timing budget and inter-measurement period should not be called when the sensor is + ranging. The user has to stop the ranging, change these parameters, and restart ranging + The minimum inter-measurement period must be longer than the timing budget + 4 ms. + */ static int time_budget_in_ms_short = 15; // 20ms with the full API but 15ms with the ULD API (https://www.st.com/resource/en/user_manual/um2510-a-guide-to-using-the-vl53l1x-ultra-lite-driver-stmicroelectronics.pdf) static int time_budget_in_ms_medium = 33; // Works up to 3.1m increase to minimum of 140ms for 4m - static int time_budget_in_ms_long = 100; // Works up to 4m in the dark on a white chart - static int delay_between_measurements_short = 20; - static int delay_between_measurements_medium = 50; - static int delay_between_measurements_long = 220; + static int time_budget_in_ms_long = 140; // Works up to 4m in the dark on a white chart + static int delay_between_measurements_short = 25; + static int delay_between_measurements_medium = 40; + static int delay_between_measurements_long = 150; class Roode : public PollingComponent { From 6a8ef803091067ec629ac3210b10d9ff732fcc48 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Sat, 18 Dec 2021 12:53:02 +0100 Subject: [PATCH 27/31] Comment in sampling again --- components/roode/roode.cpp | 67 +++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index dff9de6b..cc3b63ac 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -102,40 +102,39 @@ namespace esphome delay(6); distanceSensor.setROICenter(center[zone]); distance = distanceSensor.read(); - ESP_LOGD("Roode", "center: %d", distanceSensor.getROICenter()); - - // if (use_sampling_) - // { - // static uint16_t Distances[2][DISTANCES_ARRAY_SIZE]; - // uint16_t MinDistance; - // uint8_t i; - // if (DistancesTableSize[zone] < DISTANCES_ARRAY_SIZE) - // { - // Distances[zone][DistancesTableSize[zone]] = distance; - // DistancesTableSize[zone]++; - // ESP_LOGD("Roode", "Distances[%d][DistancesTableSize[zone]] = %d", zone, Distances[zone][DistancesTableSize[zone]]); - // } - // else - // { - // for (i = 1; i < DISTANCES_ARRAY_SIZE; i++) - // Distances[zone][i - 1] = Distances[zone][i]; - // Distances[zone][DISTANCES_ARRAY_SIZE - 1] = distance; - // ESP_LOGD("Roode", "Distances[%d][DISTANCES_ARRAY_SIZE - 1] = %d", zone, Distances[zone][DISTANCES_ARRAY_SIZE - 1]); - // } - // ESP_LOGD("Roode", "Distances[%d][0]] = %d", zone, Distances[zone][0]); - // ESP_LOGD("Roode", "Distances[%d][1]] = %d", zone, Distances[zone][1]); - // // pick up the min distance - // MinDistance = Distances[zone][0]; - // if (DistancesTableSize[zone] >= 2) - // { - // for (i = 1; i < DistancesTableSize[zone]; i++) - // { - // if (Distances[zone][i] < MinDistance) - // MinDistance = Distances[zone][i]; - // } - // } - // distance = MinDistance; - // } + if (use_sampling_) + { + ESP_LOGD("Roode", "Using sampling"); + static uint16_t Distances[2][DISTANCES_ARRAY_SIZE]; + uint16_t MinDistance; + uint8_t i; + if (DistancesTableSize[zone] < DISTANCES_ARRAY_SIZE) + { + Distances[zone][DistancesTableSize[zone]] = distance; + DistancesTableSize[zone]++; + ESP_LOGD("Roode", "Distances[%d][DistancesTableSize[zone]] = %d", zone, Distances[zone][DistancesTableSize[zone]]); + } + else + { + for (i = 1; i < DISTANCES_ARRAY_SIZE; i++) + Distances[zone][i - 1] = Distances[zone][i]; + Distances[zone][DISTANCES_ARRAY_SIZE - 1] = distance; + ESP_LOGD("Roode", "Distances[%d][DISTANCES_ARRAY_SIZE - 1] = %d", zone, Distances[zone][DISTANCES_ARRAY_SIZE - 1]); + } + ESP_LOGD("Roode", "Distances[%d][0]] = %d", zone, Distances[zone][0]); + ESP_LOGD("Roode", "Distances[%d][1]] = %d", zone, Distances[zone][1]); + // pick up the min distance + MinDistance = Distances[zone][0]; + if (DistancesTableSize[zone] >= 2) + { + for (i = 1; i < DistancesTableSize[zone]; i++) + { + if (Distances[zone][i] < MinDistance) + MinDistance = Distances[zone][i]; + } + } + distance = MinDistance; + } // PathTrack algorithm if (distance < DIST_THRESHOLD_MAX[zone] && distance > DIST_THRESHOLD_MIN[zone]) From 59088cc28b180e7d6382f89173a697fc178347da Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Sat, 18 Dec 2021 18:21:11 +0100 Subject: [PATCH 28/31] Cleanup --- components/roode/roode.cpp | 60 ++++++++++++++++++-------------------- components/roode/roode.h | 3 -- 2 files changed, 29 insertions(+), 34 deletions(-) diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index cc3b63ac..720f4db7 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -5,6 +5,8 @@ namespace esphome namespace roode { static const char *const TAG = "Roode"; + static const char *const SETUP = "Setup"; + static const char *const CALIBRATION = "Calibration"; void Roode::dump_config() { ESP_LOGCONFIG(TAG, "dump config:"); @@ -14,7 +16,7 @@ namespace esphome } void Roode::setup() { - ESP_LOGI("Roode setup", "Booting Roode %s", VERSION); + ESP_LOGI(SETUP, "Booting Roode %s", VERSION); if (version_sensor != nullptr) { version_sensor->publish_state(VERSION); @@ -27,21 +29,17 @@ namespace esphome { distanceSensor.setAddress(address_); } - if (Roode::invert_direction_ == true) + if (invert_direction_) { + ESP_LOGD(TAG, "Inverting direction"); LEFT = 1; RIGHT = 0; } - else - { - LEFT = 0; - RIGHT = 1; - } distanceSensor.setTimeout(500); if (!distanceSensor.init()) { - ESP_LOGE("Setup", "Failed to detect and initialize sensor!"); + ESP_LOGE(SETUP, "Failed to detect and initialize sensor!"); } if (calibration_active_) { @@ -104,7 +102,7 @@ namespace esphome distance = distanceSensor.read(); if (use_sampling_) { - ESP_LOGD("Roode", "Using sampling"); + ESP_LOGD(SETUP, "Using sampling"); static uint16_t Distances[2][DISTANCES_ARRAY_SIZE]; uint16_t MinDistance; uint8_t i; @@ -112,17 +110,17 @@ namespace esphome { Distances[zone][DistancesTableSize[zone]] = distance; DistancesTableSize[zone]++; - ESP_LOGD("Roode", "Distances[%d][DistancesTableSize[zone]] = %d", zone, Distances[zone][DistancesTableSize[zone]]); + ESP_LOGD(SETUP, "Distances[%d][DistancesTableSize[zone]] = %d", zone, Distances[zone][DistancesTableSize[zone]]); } else { for (i = 1; i < DISTANCES_ARRAY_SIZE; i++) Distances[zone][i - 1] = Distances[zone][i]; Distances[zone][DISTANCES_ARRAY_SIZE - 1] = distance; - ESP_LOGD("Roode", "Distances[%d][DISTANCES_ARRAY_SIZE - 1] = %d", zone, Distances[zone][DISTANCES_ARRAY_SIZE - 1]); + ESP_LOGD(SETUP, "Distances[%d][DISTANCES_ARRAY_SIZE - 1] = %d", zone, Distances[zone][DISTANCES_ARRAY_SIZE - 1]); } - ESP_LOGD("Roode", "Distances[%d][0]] = %d", zone, Distances[zone][0]); - ESP_LOGD("Roode", "Distances[%d][1]] = %d", zone, Distances[zone][1]); + ESP_LOGD(SETUP, "Distances[%d][0]] = %d", zone, Distances[zone][0]); + ESP_LOGD(SETUP, "Distances[%d][1]] = %d", zone, Distances[zone][1]); // pick up the min distance MinDistance = Distances[zone][0]; if (DistancesTableSize[zone] >= 2) @@ -275,7 +273,7 @@ namespace esphome void Roode::sendCounter(uint16_t counter) { - ESP_LOGI("Roode", "Sending people count: %d", counter); + ESP_LOGI(SETUP, "Sending people count: %d", counter); peopleCounter = counter; if (people_counter_sensor != nullptr) { @@ -390,9 +388,9 @@ namespace esphome status = distanceSensor.setDistanceMode(VL53L1X::Short); if (!status) { - ESP_LOGE("Setup", "Could not set distance mode. mode: %d", VL53L1X::Short); + ESP_LOGE(SETUP, "Could not set distance mode. mode: %d", VL53L1X::Short); } - ESP_LOGI("Setup", "Set short mode. timing_budget: %d", time_budget_in_ms); + ESP_LOGI(SETUP, "Set short mode. timing_budget: %d", time_budget_in_ms); break; case 1: // medium mode time_budget_in_ms = time_budget_in_ms_medium; @@ -400,9 +398,9 @@ namespace esphome status = distanceSensor.setDistanceMode(VL53L1X::Medium); if (!status) { - ESP_LOGE("Setup", "Could not set distance mode. mode: %d", VL53L1X::Medium); + ESP_LOGE(SETUP, "Could not set distance mode. mode: %d", VL53L1X::Medium); } - ESP_LOGI("Setup", "Set medium mode. timing_budget: %d", time_budget_in_ms); + ESP_LOGI(SETUP, "Set medium mode. timing_budget: %d", time_budget_in_ms); break; case 2: // long mode time_budget_in_ms = time_budget_in_ms_long; @@ -410,9 +408,9 @@ namespace esphome status = distanceSensor.setDistanceMode(VL53L1X::Long); if (!status) { - ESP_LOGE("Setup", "Could not set distance mode. mode: %d", VL53L1X::Long); + ESP_LOGE(SETUP, "Could not set distance mode. mode: %d", VL53L1X::Long); } - ESP_LOGI("Setup", "Set long range mode. timing_budget: %d", time_budget_in_ms); + ESP_LOGI(SETUP, "Set long range mode. timing_budget: %d", time_budget_in_ms); break; case 3: // custom mode time_budget_in_ms = new_timing_budget; @@ -420,9 +418,9 @@ namespace esphome status = distanceSensor.setDistanceMode(VL53L1X::Long); if (!status) { - ESP_LOGE("Setup", "Could not set distance mode. mode: %d", VL53L1X::Long); + ESP_LOGE(SETUP, "Could not set distance mode. mode: %d", VL53L1X::Long); } - ESP_LOGI("Setup", "Manually set custom range mode. timing_budget: %d", time_budget_in_ms); + ESP_LOGI(SETUP, "Manually set custom range mode. timing_budget: %d", time_budget_in_ms); break; default: break; @@ -430,7 +428,7 @@ namespace esphome status = distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); if (!status) { - ESP_LOGE("Setup", "Could not set timing budget. timing_budget: %d ms", time_budget_in_ms); + ESP_LOGE(SETUP, "Could not set timing budget. timing_budget: %d ms", time_budget_in_ms); } distanceSensor.startContinuous(delay_between_measurements); } @@ -454,7 +452,7 @@ namespace esphome status = distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); if (!status) { - ESP_LOGE("Calibration", "Could not set timing budget. timing_budget: %d ms", time_budget_in_ms); + ESP_LOGE(CALIBRATION, "Could not set timing budget. timing_budget: %d ms", time_budget_in_ms); } } int Roode::getSum(int *array, int size) @@ -481,8 +479,8 @@ namespace esphome } variance = sum_squared / size - (avg * avg); sd = sqrt(variance); - ESP_LOGD("Calibration", "Zone AVG: %d", avg); - ESP_LOGD("Calibration", "Zone 0 SD: %d", sd); + ESP_LOGD(CALIBRATION, "Zone AVG: %d", avg); + ESP_LOGD(CALIBRATION, "Zone 0 SD: %d", sd); return avg - sd; } @@ -498,7 +496,7 @@ namespace esphome distanceSensor.startContinuous(delay_between_measurements); if (!status) { - ESP_LOGE("Calibration", "Could not set timing budget. timing_budget: %d ms", time_budget_in_ms); + ESP_LOGE(CALIBRATION, "Could not set timing budget. timing_budget: %d ms", time_budget_in_ms); } if (advised_sensor_orientation_) { @@ -569,8 +567,8 @@ namespace esphome { if (isMax) { - ESP_LOGI("Roode", "Max threshold zone0: %dmm", DIST_THRESHOLD_ARR[0]); - ESP_LOGI("Roode", "Max threshold zone1: %dmm", DIST_THRESHOLD_ARR[1]); + ESP_LOGI(SETUP, "Max threshold zone0: %dmm", DIST_THRESHOLD_ARR[0]); + ESP_LOGI(SETUP, "Max threshold zone1: %dmm", DIST_THRESHOLD_ARR[1]); if (max_threshold_zone0_sensor != nullptr) { max_threshold_zone0_sensor->publish_state(DIST_THRESHOLD_ARR[0]); @@ -583,8 +581,8 @@ namespace esphome } else { - ESP_LOGI("Roode", "Min threshold zone0: %dmm", DIST_THRESHOLD_ARR[0]); - ESP_LOGI("Roode", "Min threshold zone1: %dmm", DIST_THRESHOLD_ARR[1]); + ESP_LOGI(SETUP, "Min threshold zone0: %dmm", DIST_THRESHOLD_ARR[0]); + ESP_LOGI(SETUP, "Min threshold zone1: %dmm", DIST_THRESHOLD_ARR[1]); if (min_threshold_zone0_sensor != nullptr) { min_threshold_zone0_sensor->publish_state(DIST_THRESHOLD_ARR[0]); diff --git a/components/roode/roode.h b/components/roode/roode.h index 0dd77ef5..833571fa 100644 --- a/components/roode/roode.h +++ b/components/roode/roode.h @@ -131,9 +131,6 @@ namespace esphome uint64_t manual_threshold_{2000}; int number_attempts = 20; int timing_budget_{-1}; - int left = 0, right = 0, oldcnt; - bool lastTrippedState = 0; - double people, distance_avg; int short_distance_threshold = 1300; int medium_distance_threshold = 3100; bool status = false; From 70d184daf30a1f3caa1bf7149247453212212b81 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Sat, 18 Dec 2021 19:05:17 +0100 Subject: [PATCH 29/31] Set start stop commands --- components/roode/roode.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index 720f4db7..255c00f8 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -65,6 +65,7 @@ namespace esphome ESP_LOGD("Roode setup", "last value: %u", peopleCounter); } sendCounter(peopleCounter); + distanceSensor.startContinuous(delay_between_measurements); } void Roode::update() @@ -97,7 +98,6 @@ namespace esphome int CurrentZoneStatus = NOBODY; int AllZonesCurrentStatus = 0; int AnEventHasOccured = 0; - delay(6); distanceSensor.setROICenter(center[zone]); distance = distanceSensor.read(); if (use_sampling_) @@ -355,12 +355,13 @@ namespace esphome zone = 0; int *values_zone_0 = new int[number_attempts]; int *values_zone_1 = new int[number_attempts]; + distanceSensor.stopContinuous(); distanceSensor.setROISize(Roode::roi_width_, Roode::roi_height_); + distanceSensor.startContinuous(delay_between_measurements); for (int i = 0; i < number_attempts; i++) { // increase sum of values in Zone 0 distanceSensor.setROICenter(center[zone]); - delay(1); distance = distanceSensor.read(); values_zone_0[i] = distance; zone++; @@ -368,7 +369,6 @@ namespace esphome App.feed_wdt(); // increase sum of values in Zone 1 distanceSensor.setROICenter(center[zone]); - delay(1); distance = distanceSensor.read(); values_zone_1[i] = distance; zone++; @@ -430,12 +430,11 @@ namespace esphome { ESP_LOGE(SETUP, "Could not set timing budget. timing_budget: %d ms", time_budget_in_ms); } - distanceSensor.startContinuous(delay_between_measurements); } void Roode::setCorrectDistanceSettings(float average_zone_0, float average_zone_1) { - if (average_zone_0 <= short_distance_threshold && average_zone_1 <= short_distance_threshold) + if (average_zone_0 <= short_distance_threshold || average_zone_1 <= short_distance_threshold) { setSensorMode(0, time_budget_in_ms_short); } @@ -492,8 +491,7 @@ namespace esphome delay_between_measurements = delay_between_measurements_medium; distanceSensor.setDistanceMode(VL53L1X::Medium); status = distanceSensor.setMeasurementTimingBudget(time_budget_in_ms * 1000); - distanceSensor.setROISize(Roode::roi_width_, Roode::roi_height_); - distanceSensor.startContinuous(delay_between_measurements); + if (!status) { ESP_LOGE(CALIBRATION, "Could not set timing budget. timing_budget: %d ms", time_budget_in_ms); @@ -517,12 +515,12 @@ namespace esphome int *values_zone_0 = new int[number_attempts]; int *values_zone_1 = new int[number_attempts]; - + distanceSensor.setROISize(Roode::roi_width_, Roode::roi_height_); + distanceSensor.startContinuous(delay_between_measurements); for (int i = 0; i < number_attempts; i++) { // increase sum of values in Zone 0 distanceSensor.setROICenter(center[zone]); - delay(6); distance = distanceSensor.read(); values_zone_0[i] = distance; zone++; @@ -530,7 +528,6 @@ namespace esphome App.feed_wdt(); // increase sum of values in Zone 1 distanceSensor.setROICenter(center[zone]); - delay(6); distance = distanceSensor.read(); values_zone_1[i] = distance; zone++; @@ -561,6 +558,7 @@ namespace esphome DIST_THRESHOLD_MIN[1] = optimized_zone_1 * min_threshold_percentage_ / 100; publishSensorConfiguration(DIST_THRESHOLD_MIN, false); } + distanceSensor.stopContinuous(); } void Roode::publishSensorConfiguration(int DIST_THRESHOLD_ARR[2], bool isMax) From 49d11648748bd3619952a7f996ad1be797d251a4 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Sat, 18 Dec 2021 19:37:25 +0100 Subject: [PATCH 30/31] Fix the stopContinuous bug --- components/roode/roode.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/components/roode/roode.cpp b/components/roode/roode.cpp index 255c00f8..0d006172 100644 --- a/components/roode/roode.cpp +++ b/components/roode/roode.cpp @@ -99,7 +99,9 @@ namespace esphome int AllZonesCurrentStatus = 0; int AnEventHasOccured = 0; distanceSensor.setROICenter(center[zone]); + distanceSensor.startContinuous(delay_between_measurements); distance = distanceSensor.read(); + distanceSensor.writeReg(distanceSensor.SYSTEM__MODE_START, 0x80); if (use_sampling_) { ESP_LOGD(SETUP, "Using sampling"); @@ -355,7 +357,7 @@ namespace esphome zone = 0; int *values_zone_0 = new int[number_attempts]; int *values_zone_1 = new int[number_attempts]; - distanceSensor.stopContinuous(); + distanceSensor.writeReg(distanceSensor.SYSTEM__MODE_START, 0x80); distanceSensor.setROISize(Roode::roi_width_, Roode::roi_height_); distanceSensor.startContinuous(delay_between_measurements); for (int i = 0; i < number_attempts; i++) @@ -379,7 +381,7 @@ namespace esphome } void Roode::setSensorMode(int sensor_mode, int new_timing_budget) { - distanceSensor.stopContinuous(); + distanceSensor.writeReg(distanceSensor.SYSTEM__MODE_START, 0x80); switch (sensor_mode) { case 0: // short mode @@ -485,7 +487,7 @@ namespace esphome void Roode::calibration(VL53L1X distanceSensor) { - distanceSensor.stopContinuous(); + distanceSensor.writeReg(distanceSensor.SYSTEM__MODE_START, 0x80); // the sensor does 100 measurements for each zone (zones are predefined) time_budget_in_ms = time_budget_in_ms_medium; delay_between_measurements = delay_between_measurements_medium; @@ -558,7 +560,7 @@ namespace esphome DIST_THRESHOLD_MIN[1] = optimized_zone_1 * min_threshold_percentage_ / 100; publishSensorConfiguration(DIST_THRESHOLD_MIN, false); } - distanceSensor.stopContinuous(); + distanceSensor.writeReg(distanceSensor.SYSTEM__MODE_START, 0x80); } void Roode::publishSensorConfiguration(int DIST_THRESHOLD_ARR[2], bool isMax) From 860647b90dcaae59e381a26dbea77ae4d6aa0059 Mon Sep 17 00:00:00 2001 From: Kai Bepperling Date: Sat, 18 Dec 2021 19:44:07 +0100 Subject: [PATCH 31/31] Set new VERSION --- components/roode/roode.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/roode/roode.h b/components/roode/roode.h index 833571fa..d8def410 100644 --- a/components/roode/roode.h +++ b/components/roode/roode.h @@ -15,7 +15,7 @@ namespace esphome { #define NOBODY 0 #define SOMEONE 1 -#define VERSION "v1.4.0-alpha-2" +#define VERSION "v1.4.0-beta" #define EEPROM_SIZE 512 static int LEFT = 0; static int RIGHT = 1;