mirror of
https://github.com/esphome/esphome.git
synced 2026-01-08 19:20:51 -07:00
Co-authored-by: jas <jas@asspa.in> Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com>
106 lines
3.7 KiB
Python
106 lines
3.7 KiB
Python
import esphome.codegen as cg
|
|
from esphome.components import sensor
|
|
import esphome.config_validation as cv
|
|
from esphome.const import (
|
|
CONF_ANGLE,
|
|
CONF_DISTANCE,
|
|
CONF_RESOLUTION,
|
|
CONF_SPEED,
|
|
CONF_X,
|
|
CONF_Y,
|
|
DEVICE_CLASS_DISTANCE,
|
|
DEVICE_CLASS_SPEED,
|
|
STATE_CLASS_MEASUREMENT,
|
|
UNIT_DEGREES,
|
|
UNIT_MILLIMETER,
|
|
)
|
|
|
|
from . import CONF_RD03D_ID, RD03DComponent
|
|
|
|
DEPENDENCIES = ["rd03d"]
|
|
|
|
CONF_TARGET_COUNT = "target_count"
|
|
|
|
MAX_TARGETS = 3
|
|
|
|
UNIT_MILLIMETER_PER_SECOND = "mm/s"
|
|
|
|
TARGET_SCHEMA = cv.Schema(
|
|
{
|
|
cv.Optional(CONF_X): sensor.sensor_schema(
|
|
unit_of_measurement=UNIT_MILLIMETER,
|
|
accuracy_decimals=0,
|
|
device_class=DEVICE_CLASS_DISTANCE,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
),
|
|
cv.Optional(CONF_Y): sensor.sensor_schema(
|
|
unit_of_measurement=UNIT_MILLIMETER,
|
|
accuracy_decimals=0,
|
|
device_class=DEVICE_CLASS_DISTANCE,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
),
|
|
cv.Optional(CONF_SPEED): sensor.sensor_schema(
|
|
unit_of_measurement=UNIT_MILLIMETER_PER_SECOND,
|
|
accuracy_decimals=0,
|
|
device_class=DEVICE_CLASS_SPEED,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
),
|
|
cv.Optional(CONF_DISTANCE): sensor.sensor_schema(
|
|
unit_of_measurement=UNIT_MILLIMETER,
|
|
accuracy_decimals=0,
|
|
device_class=DEVICE_CLASS_DISTANCE,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
),
|
|
cv.Optional(CONF_RESOLUTION): sensor.sensor_schema(
|
|
unit_of_measurement=UNIT_MILLIMETER,
|
|
accuracy_decimals=0,
|
|
device_class=DEVICE_CLASS_DISTANCE,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
),
|
|
cv.Optional(CONF_ANGLE): sensor.sensor_schema(
|
|
unit_of_measurement=UNIT_DEGREES,
|
|
accuracy_decimals=1,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
),
|
|
}
|
|
)
|
|
|
|
CONFIG_SCHEMA = cv.Schema(
|
|
{
|
|
cv.GenerateID(CONF_RD03D_ID): cv.use_id(RD03DComponent),
|
|
cv.Optional(CONF_TARGET_COUNT): sensor.sensor_schema(
|
|
accuracy_decimals=0,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
),
|
|
}
|
|
).extend({cv.Optional(f"target_{i + 1}"): TARGET_SCHEMA for i in range(MAX_TARGETS)})
|
|
|
|
|
|
async def to_code(config):
|
|
hub = await cg.get_variable(config[CONF_RD03D_ID])
|
|
|
|
if target_count_config := config.get(CONF_TARGET_COUNT):
|
|
sens = await sensor.new_sensor(target_count_config)
|
|
cg.add(hub.set_target_count_sensor(sens))
|
|
|
|
for i in range(MAX_TARGETS):
|
|
if target_config := config.get(f"target_{i + 1}"):
|
|
if x_config := target_config.get(CONF_X):
|
|
sens = await sensor.new_sensor(x_config)
|
|
cg.add(hub.set_x_sensor(i, sens))
|
|
if y_config := target_config.get(CONF_Y):
|
|
sens = await sensor.new_sensor(y_config)
|
|
cg.add(hub.set_y_sensor(i, sens))
|
|
if speed_config := target_config.get(CONF_SPEED):
|
|
sens = await sensor.new_sensor(speed_config)
|
|
cg.add(hub.set_speed_sensor(i, sens))
|
|
if distance_config := target_config.get(CONF_DISTANCE):
|
|
sens = await sensor.new_sensor(distance_config)
|
|
cg.add(hub.set_distance_sensor(i, sens))
|
|
if resolution_config := target_config.get(CONF_RESOLUTION):
|
|
sens = await sensor.new_sensor(resolution_config)
|
|
cg.add(hub.set_resolution_sensor(i, sens))
|
|
if angle_config := target_config.get(CONF_ANGLE):
|
|
sens = await sensor.new_sensor(angle_config)
|
|
cg.add(hub.set_angle_sensor(i, sens))
|