Skip to content

Commit 9add55f

Browse files
authored
Merge pull request #68 from Lyr3x/make-distance-sensor-optional
Improve sensor creation, initialization and measurement reads
2 parents 63a76c8 + 860647b commit 9add55f

File tree

9 files changed

+388
-326
lines changed

9 files changed

+388
-326
lines changed

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@
1616
"ostream": "cpp",
1717
"istream": "cpp"
1818
},
19-
"python.formatting.provider": "yapf"
19+
"python.formatting.provider": "black"
2020
}

components/roode/__init__.py

Lines changed: 68 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from esphome.components import sensor
55
from esphome.const import CONF_ID, STATE_CLASS_MEASUREMENT, UNIT_EMPTY, UNIT_METER
66

7+
78
# DEPENDENCIES = ["i2c"]
89
AUTO_LOAD = ["sensor", "binary_sensor", "text_sensor"]
910
MULTI_CONF = True
@@ -13,9 +14,9 @@
1314
roode_ns = cg.esphome_ns.namespace("roode")
1415
Roode = roode_ns.class_("Roode", cg.PollingComponent)
1516

16-
CONF_ROI_HEIGHT = 'roi_height'
17-
CONF_ROI_WIDTH = 'roi_width'
18-
CONF_ADVISED_SENSOR_ORIENTATION = 'advised_sensor_orientation'
17+
CONF_ROI_HEIGHT = "roi_height"
18+
CONF_ROI_WIDTH = "roi_width"
19+
CONF_ADVISED_SENSOR_ORIENTATION = "advised_sensor_orientation"
1920
CONF_CALIBRATION = "calibration"
2021
CONF_ROI_CALIBRATION = "roi_calibration"
2122
CONF_INVERT_DIRECTION = "invert_direction"
@@ -30,66 +31,72 @@
3031
CONF_MANUAL_ACTIVE = "manual_active"
3132
CONF_CALIBRATION_ACTIVE = "calibration_active"
3233
CONF_TIMING_BUDGET = "timing_budget"
34+
CONF_USE_SAMPLING = "use_sampling"
3335
TYPES = [
34-
CONF_RESTORE_VALUES, CONF_INVERT_DIRECTION,
35-
CONF_ADVISED_SENSOR_ORIENTATION, CONF_I2C_ADDRESS
36+
CONF_RESTORE_VALUES,
37+
CONF_INVERT_DIRECTION,
38+
CONF_ADVISED_SENSOR_ORIENTATION,
39+
CONF_I2C_ADDRESS,
40+
CONF_USE_SAMPLING,
3641
]
37-
CONFIG_SCHEMA = (cv.Schema({
38-
cv.GenerateID():
39-
cv.declare_id(Roode),
40-
cv.Optional(CONF_INVERT_DIRECTION, default='false'):
41-
cv.boolean,
42-
cv.Optional(CONF_RESTORE_VALUES, default='false'):
43-
cv.boolean,
44-
cv.Optional(CONF_ADVISED_SENSOR_ORIENTATION, default='true'):
45-
cv.boolean,
46-
cv.Optional(CONF_I2C_ADDRESS, default=0x29):
47-
cv.uint8_t,
48-
cv.Exclusive(
49-
CONF_CALIBRATION, "mode", f"Only one mode, {CONF_MANUAL} or {CONF_CALIBRATION} is usable"):
50-
cv.Schema({
51-
cv.Optional(CONF_CALIBRATION_ACTIVE, default='true'):
52-
cv.boolean,
53-
cv.Optional(CONF_MAX_THRESHOLD_PERCENTAGE, default=85):
54-
cv.int_range(min=50, max=100),
55-
cv.Optional(CONF_MIN_THRESHOLD_PERCENTAGE, default=0):
56-
cv.int_range(min=0, max=100),
57-
cv.Optional(CONF_ROI_CALIBRATION, default='false'):
58-
cv.boolean,
59-
}),
60-
cv.Exclusive(
61-
CONF_MANUAL, "mode", f"Only one mode, {CONF_MANUAL} or {CONF_CALIBRATION} is usable"):
62-
cv.Schema({
63-
cv.Optional(CONF_MANUAL_ACTIVE, default='true'):
64-
cv.boolean,
65-
cv.Optional(CONF_TIMING_BUDGET, default=10):
66-
cv.int_range(min=10, max=1000),
67-
cv.Inclusive(
68-
CONF_SENSOR_MODE,
69-
"manual_mode",
70-
f"{CONF_SENSOR_MODE}, {CONF_ROI_HEIGHT}, {CONF_ROI_WIDTH} and {CONF_MANUAL_THRESHOLD} must be used together",
71-
):
72-
cv.int_range(min=-1, max=2),
73-
cv.Inclusive(
74-
CONF_ROI_HEIGHT,
75-
"manual_mode",
76-
f"{CONF_SENSOR_MODE}, {CONF_ROI_HEIGHT}, {CONF_ROI_WIDTH} and {CONF_MANUAL_THRESHOLD} must be used together",
77-
):
78-
cv.int_range(min=4, max=16),
79-
cv.Inclusive(
80-
CONF_ROI_WIDTH,
81-
"manual_mode",
82-
f"{CONF_SENSOR_MODE}, {CONF_ROI_HEIGHT}, {CONF_ROI_WIDTH} and {CONF_MANUAL_THRESHOLD} must be used together",
83-
):
84-
cv.int_range(min=4, max=16),
85-
cv.Inclusive(
86-
CONF_MANUAL_THRESHOLD,
87-
"manual_mode",
88-
f"{CONF_SENSOR_MODE}, {CONF_ROI_HEIGHT}, {CONF_ROI_WIDTH} and {CONF_MANUAL_THRESHOLD} must be used together",
89-
):
90-
cv.int_range(min=40, max=4000),
91-
}),
92-
}).extend(cv.polling_component_schema("100ms")))
42+
CONFIG_SCHEMA = cv.Schema(
43+
{
44+
cv.GenerateID(): cv.declare_id(Roode),
45+
cv.Optional(CONF_INVERT_DIRECTION, default="false"): cv.boolean,
46+
cv.Optional(CONF_RESTORE_VALUES, default="false"): cv.boolean,
47+
cv.Optional(CONF_ADVISED_SENSOR_ORIENTATION, default="true"): cv.boolean,
48+
cv.Optional(CONF_USE_SAMPLING, default="false"): cv.boolean,
49+
cv.Optional(CONF_I2C_ADDRESS, default=0x29): cv.uint8_t,
50+
cv.Exclusive(
51+
CONF_CALIBRATION,
52+
"mode",
53+
f"Only one mode, {CONF_MANUAL} or {CONF_CALIBRATION} is usable",
54+
): cv.Schema(
55+
{
56+
cv.Optional(CONF_CALIBRATION_ACTIVE, default="true"): cv.boolean,
57+
cv.Optional(CONF_MAX_THRESHOLD_PERCENTAGE, default=85): cv.int_range(
58+
min=50, max=100
59+
),
60+
cv.Optional(CONF_MIN_THRESHOLD_PERCENTAGE, default=0): cv.int_range(
61+
min=0, max=100
62+
),
63+
cv.Optional(CONF_ROI_CALIBRATION, default="false"): cv.boolean,
64+
}
65+
),
66+
cv.Exclusive(
67+
CONF_MANUAL,
68+
"mode",
69+
f"Only one mode, {CONF_MANUAL} or {CONF_CALIBRATION} is usable",
70+
): cv.Schema(
71+
{
72+
cv.Optional(CONF_MANUAL_ACTIVE, default="true"): cv.boolean,
73+
cv.Optional(CONF_TIMING_BUDGET, default=10): cv.int_range(
74+
min=10, max=1000
75+
),
76+
cv.Inclusive(
77+
CONF_SENSOR_MODE,
78+
"manual_mode",
79+
f"{CONF_SENSOR_MODE}, {CONF_ROI_HEIGHT}, {CONF_ROI_WIDTH} and {CONF_MANUAL_THRESHOLD} must be used together",
80+
): cv.int_range(min=-1, max=2),
81+
cv.Inclusive(
82+
CONF_ROI_HEIGHT,
83+
"manual_mode",
84+
f"{CONF_SENSOR_MODE}, {CONF_ROI_HEIGHT}, {CONF_ROI_WIDTH} and {CONF_MANUAL_THRESHOLD} must be used together",
85+
): cv.int_range(min=4, max=16),
86+
cv.Inclusive(
87+
CONF_ROI_WIDTH,
88+
"manual_mode",
89+
f"{CONF_SENSOR_MODE}, {CONF_ROI_HEIGHT}, {CONF_ROI_WIDTH} and {CONF_MANUAL_THRESHOLD} must be used together",
90+
): cv.int_range(min=4, max=16),
91+
cv.Inclusive(
92+
CONF_MANUAL_THRESHOLD,
93+
"manual_mode",
94+
f"{CONF_SENSOR_MODE}, {CONF_ROI_HEIGHT}, {CONF_ROI_WIDTH} and {CONF_MANUAL_THRESHOLD} must be used together",
95+
): cv.int_range(min=40, max=4000),
96+
}
97+
),
98+
}
99+
).extend(cv.polling_component_schema("100ms"))
93100

94101

95102
async def setup_conf(config, key, hub):

components/roode/binary_sensor.py

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import esphome.codegen as cg
22
import esphome.config_validation as cv
33
from esphome.components import binary_sensor
4+
import esphome.final_validate as fv
45
from esphome.const import (
56
CONF_ID,
67
CONF_DEVICE_CLASS,
@@ -10,18 +11,34 @@
1011

1112
DEPENDENCIES = ["roode"]
1213

13-
CONF_PRESENCE = 'presence_sensor'
14+
CONF_PRESENCE = "presence_sensor"
1415
TYPES = [CONF_PRESENCE]
1516

16-
CONFIG_SCHEMA = cv.Schema({
17-
cv.GenerateID(CONF_ROODE_ID):
18-
cv.use_id(Roode),
19-
cv.Optional(CONF_PRESENCE):
20-
binary_sensor.BINARY_SENSOR_SCHEMA.extend({
21-
cv.GenerateID():
22-
cv.declare_id(binary_sensor.BinarySensor),
23-
}),
24-
})
17+
CONFIG_SCHEMA = cv.Schema(
18+
{
19+
cv.GenerateID(CONF_ROODE_ID): cv.use_id(Roode),
20+
cv.Optional(CONF_PRESENCE): binary_sensor.BINARY_SENSOR_SCHEMA.extend(
21+
{
22+
cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor),
23+
}
24+
),
25+
}
26+
)
27+
28+
29+
# def validate_can_use_presence(value):
30+
# main = fv.full_config.get()["roode"][0]
31+
# presence_sensor = main.get(CONF_USE_PRESENCE)
32+
# print(presence_sensor)
33+
# if presence_sensor == False:
34+
# raise cv.Invalid("Presence sensor is not enabled")
35+
# else:
36+
# return presence_sensor
37+
38+
39+
# FINAL_VALIDATE_SCHEMA = cv.Schema(
40+
# {cv.Optional(CONF_PRESENCE): validate_can_use_presence}, extra=cv.ALLOW_EXTRA
41+
# )
2542

2643

2744
async def setup_conf(config, key, hub):
@@ -35,4 +52,4 @@ async def setup_conf(config, key, hub):
3552
async def to_code(config):
3653
hub = await cg.get_variable(config[CONF_ROODE_ID])
3754
for key in TYPES:
38-
await setup_conf(config, key, hub)
55+
await setup_conf(config, key, hub)

0 commit comments

Comments
 (0)