184 lines
7.8 KiB
Python
184 lines
7.8 KiB
Python
import esphome.codegen as cg
|
|
from esphome.components import number
|
|
import esphome.config_validation as cv
|
|
from esphome.const import (
|
|
CONF_ID,
|
|
DEVICE_CLASS_DISTANCE,
|
|
ENTITY_CATEGORY_CONFIG,
|
|
ICON_MOTION_SENSOR,
|
|
ICON_SCALE,
|
|
ICON_TIMELAPSE,
|
|
UNIT_SECOND,
|
|
)
|
|
|
|
from .. import CONF_LD2420_ID, LD2420Component, ld2420_ns
|
|
|
|
LD2420TimeoutNumber = ld2420_ns.class_("LD2420TimeoutNumber", number.Number)
|
|
LD2420MoveSensFactorNumber = ld2420_ns.class_(
|
|
"LD2420MoveSensFactorNumber", number.Number
|
|
)
|
|
LD2420StillSensFactorNumber = ld2420_ns.class_(
|
|
"LD2420StillSensFactorNumber", number.Number
|
|
)
|
|
LD2420MinDistanceNumber = ld2420_ns.class_("LD2420MinDistanceNumber", number.Number)
|
|
LD2420MaxDistanceNumber = ld2420_ns.class_("LD2420MaxDistanceNumber", number.Number)
|
|
LD2420GateSelectNumber = ld2420_ns.class_("LD2420GateSelectNumber", number.Number)
|
|
LD2420MoveThresholdNumbers = ld2420_ns.class_(
|
|
"LD2420MoveThresholdNumbers", number.Number
|
|
)
|
|
LD2420StillThresholdNumbers = ld2420_ns.class_(
|
|
"LD2420StillThresholdNumbers", number.Number
|
|
)
|
|
CONF_MIN_GATE_DISTANCE = "min_gate_distance"
|
|
CONF_MAX_GATE_DISTANCE = "max_gate_distance"
|
|
CONF_STILL_THRESHOLD = "still_threshold"
|
|
CONF_MOVE_THRESHOLD = "move_threshold"
|
|
CONF_GATE_MOVE_SENSITIVITY = "gate_move_sensitivity"
|
|
CONF_GATE_STILL_SENSITIVITY = "gate_still_sensitivity"
|
|
CONF_GATE_SELECT = "gate_select"
|
|
CONF_PRESENCE_TIMEOUT = "presence_timeout"
|
|
GATE_GROUP = "gate_group"
|
|
TIMEOUT_GROUP = "timeout_group"
|
|
|
|
|
|
CONFIG_SCHEMA = cv.Schema(
|
|
{
|
|
cv.GenerateID(CONF_LD2420_ID): cv.use_id(LD2420Component),
|
|
cv.Inclusive(CONF_PRESENCE_TIMEOUT, TIMEOUT_GROUP): number.number_schema(
|
|
LD2420TimeoutNumber,
|
|
unit_of_measurement=UNIT_SECOND,
|
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
|
icon=ICON_TIMELAPSE,
|
|
),
|
|
cv.Inclusive(CONF_MIN_GATE_DISTANCE, TIMEOUT_GROUP): number.number_schema(
|
|
LD2420MinDistanceNumber,
|
|
device_class=DEVICE_CLASS_DISTANCE,
|
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
|
icon=ICON_MOTION_SENSOR,
|
|
),
|
|
cv.Inclusive(CONF_MAX_GATE_DISTANCE, TIMEOUT_GROUP): number.number_schema(
|
|
LD2420MaxDistanceNumber,
|
|
device_class=DEVICE_CLASS_DISTANCE,
|
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
|
icon=ICON_MOTION_SENSOR,
|
|
),
|
|
cv.Inclusive(CONF_GATE_SELECT, GATE_GROUP): number.number_schema(
|
|
LD2420GateSelectNumber,
|
|
device_class=DEVICE_CLASS_DISTANCE,
|
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
|
icon=ICON_MOTION_SENSOR,
|
|
),
|
|
cv.Inclusive(CONF_STILL_THRESHOLD, GATE_GROUP): number.number_schema(
|
|
LD2420StillThresholdNumbers,
|
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
|
icon=ICON_MOTION_SENSOR,
|
|
),
|
|
cv.Inclusive(CONF_MOVE_THRESHOLD, GATE_GROUP): number.number_schema(
|
|
LD2420MoveThresholdNumbers,
|
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
|
icon=ICON_MOTION_SENSOR,
|
|
),
|
|
cv.Optional(CONF_GATE_MOVE_SENSITIVITY): number.number_schema(
|
|
LD2420MoveSensFactorNumber,
|
|
device_class=DEVICE_CLASS_DISTANCE,
|
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
|
icon=ICON_SCALE,
|
|
),
|
|
cv.Optional(CONF_GATE_STILL_SENSITIVITY): number.number_schema(
|
|
LD2420StillSensFactorNumber,
|
|
device_class=DEVICE_CLASS_DISTANCE,
|
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
|
icon=ICON_SCALE,
|
|
),
|
|
}
|
|
)
|
|
CONFIG_SCHEMA = CONFIG_SCHEMA.extend(
|
|
{
|
|
cv.Optional(f"gate_{x}"): (
|
|
{
|
|
cv.Required(CONF_MOVE_THRESHOLD): number.number_schema(
|
|
LD2420MoveThresholdNumbers,
|
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
|
icon=ICON_MOTION_SENSOR,
|
|
),
|
|
cv.Required(CONF_STILL_THRESHOLD): number.number_schema(
|
|
LD2420StillThresholdNumbers,
|
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
|
icon=ICON_MOTION_SENSOR,
|
|
),
|
|
}
|
|
)
|
|
for x in range(16)
|
|
}
|
|
)
|
|
|
|
|
|
async def to_code(config):
|
|
LD2420_component = await cg.get_variable(config[CONF_LD2420_ID])
|
|
if gate_timeout_config := config.get(CONF_PRESENCE_TIMEOUT):
|
|
n = await number.new_number(
|
|
gate_timeout_config, min_value=0, max_value=255, step=5
|
|
)
|
|
await cg.register_parented(n, config[CONF_LD2420_ID])
|
|
cg.add(LD2420_component.set_gate_timeout_number(n))
|
|
if min_distance_gate_config := config.get(CONF_MIN_GATE_DISTANCE):
|
|
n = await number.new_number(
|
|
min_distance_gate_config, min_value=0, max_value=15, step=1
|
|
)
|
|
await cg.register_parented(n, config[CONF_LD2420_ID])
|
|
cg.add(LD2420_component.set_min_gate_distance_number(n))
|
|
if max_distance_gate_config := config.get(CONF_MAX_GATE_DISTANCE):
|
|
n = await number.new_number(
|
|
max_distance_gate_config, min_value=1, max_value=15, step=1
|
|
)
|
|
await cg.register_parented(n, config[CONF_LD2420_ID])
|
|
cg.add(LD2420_component.set_max_gate_distance_number(n))
|
|
if gate_move_sensitivity_config := config.get(CONF_GATE_MOVE_SENSITIVITY):
|
|
n = await number.new_number(
|
|
gate_move_sensitivity_config, min_value=0.05, max_value=1, step=0.025
|
|
)
|
|
await cg.register_parented(n, config[CONF_LD2420_ID])
|
|
cg.add(LD2420_component.set_gate_move_sensitivity_factor_number(n))
|
|
if gate_still_sensitivity_config := config.get(CONF_GATE_STILL_SENSITIVITY):
|
|
n = await number.new_number(
|
|
gate_still_sensitivity_config, min_value=0.05, max_value=1, step=0.025
|
|
)
|
|
await cg.register_parented(n, config[CONF_LD2420_ID])
|
|
cg.add(LD2420_component.set_gate_still_sensitivity_factor_number(n))
|
|
if config.get(CONF_GATE_SELECT):
|
|
if gate_number := config.get(CONF_GATE_SELECT):
|
|
n = await number.new_number(gate_number, min_value=0, max_value=15, step=1)
|
|
await cg.register_parented(n, config[CONF_LD2420_ID])
|
|
cg.add(LD2420_component.set_gate_select_number(n))
|
|
if gate_still_threshold := config.get(CONF_STILL_THRESHOLD):
|
|
n = cg.new_Pvariable(gate_still_threshold[CONF_ID])
|
|
await number.register_number(
|
|
n, gate_still_threshold, min_value=0, max_value=65535, step=25
|
|
)
|
|
await cg.register_parented(n, config[CONF_LD2420_ID])
|
|
cg.add(LD2420_component.set_gate_still_threshold_numbers(0, n))
|
|
if gate_move_threshold := config.get(CONF_MOVE_THRESHOLD):
|
|
n = cg.new_Pvariable(gate_move_threshold[CONF_ID])
|
|
await number.register_number(
|
|
n, gate_move_threshold, min_value=0, max_value=65535, step=25
|
|
)
|
|
await cg.register_parented(n, config[CONF_LD2420_ID])
|
|
cg.add(LD2420_component.set_gate_move_threshold_numbers(0, n))
|
|
else:
|
|
for x in range(16):
|
|
if gate_conf := config.get(f"gate_{x}"):
|
|
move_config = gate_conf[CONF_MOVE_THRESHOLD]
|
|
n = cg.new_Pvariable(move_config[CONF_ID], x)
|
|
await number.register_number(
|
|
n, move_config, min_value=0, max_value=65535, step=25
|
|
)
|
|
await cg.register_parented(n, config[CONF_LD2420_ID])
|
|
cg.add(LD2420_component.set_gate_move_threshold_numbers(x, n))
|
|
|
|
still_config = gate_conf[CONF_STILL_THRESHOLD]
|
|
n = cg.new_Pvariable(still_config[CONF_ID], x)
|
|
await number.register_number(
|
|
n, still_config, min_value=0, max_value=65535, step=25
|
|
)
|
|
await cg.register_parented(n, config[CONF_LD2420_ID])
|
|
cg.add(LD2420_component.set_gate_still_threshold_numbers(x, n))
|