mirror of
https://github.com/esphome/esphome.git
synced 2025-04-09 12:20:30 +01:00
120 lines
3.9 KiB
Python
120 lines
3.9 KiB
Python
import esphome.codegen as cg
|
|
import esphome.config_validation as cv
|
|
from esphome.components import sensor
|
|
from esphome.const import (
|
|
CONF_ID,
|
|
STATE_CLASS_MEASUREMENT,
|
|
ICON_MAGNET,
|
|
ICON_ROTATE_RIGHT,
|
|
CONF_GAIN,
|
|
ENTITY_CATEGORY_DIAGNOSTIC,
|
|
CONF_MAGNITUDE,
|
|
CONF_STATUS,
|
|
CONF_POSITION,
|
|
)
|
|
from .. import as5600_ns, AS5600Component
|
|
|
|
CODEOWNERS = ["@ammmze"]
|
|
DEPENDENCIES = ["as5600"]
|
|
|
|
AS5600Sensor = as5600_ns.class_("AS5600Sensor", sensor.Sensor, cg.PollingComponent)
|
|
|
|
CONF_ANGLE = "angle"
|
|
CONF_RAW_ANGLE = "raw_angle"
|
|
CONF_RAW_POSITION = "raw_position"
|
|
CONF_WATCHDOG = "watchdog"
|
|
CONF_POWER_MODE = "power_mode"
|
|
CONF_SLOW_FILTER = "slow_filter"
|
|
CONF_FAST_FILTER = "fast_filter"
|
|
CONF_PWM_FREQUENCY = "pwm_frequency"
|
|
CONF_BURN_COUNT = "burn_count"
|
|
CONF_START_POSITION = "start_position"
|
|
CONF_END_POSITION = "end_position"
|
|
CONF_OUT_OF_RANGE_MODE = "out_of_range_mode"
|
|
|
|
OutOfRangeMode = as5600_ns.enum("OutRangeMode")
|
|
OUT_OF_RANGE_MODES = {
|
|
"MIN_MAX": OutOfRangeMode.OUT_RANGE_MODE_MIN_MAX,
|
|
"NAN": OutOfRangeMode.OUT_RANGE_MODE_NAN,
|
|
}
|
|
|
|
|
|
CONF_AS5600_ID = "as5600_id"
|
|
CONFIG_SCHEMA = (
|
|
sensor.sensor_schema(
|
|
AS5600Sensor,
|
|
accuracy_decimals=0,
|
|
icon=ICON_ROTATE_RIGHT,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
)
|
|
.extend(
|
|
{
|
|
cv.GenerateID(CONF_AS5600_ID): cv.use_id(AS5600Component),
|
|
cv.Optional(CONF_OUT_OF_RANGE_MODE): cv.enum(
|
|
OUT_OF_RANGE_MODES, upper=True, space="_"
|
|
),
|
|
cv.Optional(CONF_RAW_POSITION): sensor.sensor_schema(
|
|
accuracy_decimals=0,
|
|
icon=ICON_ROTATE_RIGHT,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
),
|
|
cv.Optional(CONF_GAIN): sensor.sensor_schema(
|
|
accuracy_decimals=0,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
|
),
|
|
cv.Optional(CONF_MAGNITUDE): sensor.sensor_schema(
|
|
accuracy_decimals=0,
|
|
icon=ICON_MAGNET,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
|
),
|
|
cv.Optional(CONF_STATUS): sensor.sensor_schema(
|
|
accuracy_decimals=0,
|
|
icon=ICON_MAGNET,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
|
),
|
|
}
|
|
)
|
|
.extend(cv.polling_component_schema("60s"))
|
|
)
|
|
|
|
|
|
async def to_code(config):
|
|
var = cg.new_Pvariable(config[CONF_ID])
|
|
await cg.register_parented(var, config[CONF_AS5600_ID])
|
|
await cg.register_component(var, config)
|
|
await sensor.register_sensor(var, config)
|
|
|
|
if out_of_range_mode_config := config.get(CONF_OUT_OF_RANGE_MODE):
|
|
cg.add(var.set_out_of_range_mode(out_of_range_mode_config))
|
|
|
|
if angle_config := config.get(CONF_ANGLE):
|
|
sens = await sensor.new_sensor(angle_config)
|
|
cg.add(var.set_angle_sensor(sens))
|
|
|
|
if raw_angle_config := config.get(CONF_RAW_ANGLE):
|
|
sens = await sensor.new_sensor(raw_angle_config)
|
|
cg.add(var.set_raw_angle_sensor(sens))
|
|
|
|
if position_config := config.get(CONF_POSITION):
|
|
sens = await sensor.new_sensor(position_config)
|
|
cg.add(var.set_position_sensor(sens))
|
|
|
|
if raw_position_config := config.get(CONF_RAW_POSITION):
|
|
sens = await sensor.new_sensor(raw_position_config)
|
|
cg.add(var.set_raw_position_sensor(sens))
|
|
|
|
if gain_config := config.get(CONF_GAIN):
|
|
sens = await sensor.new_sensor(gain_config)
|
|
cg.add(var.set_gain_sensor(sens))
|
|
|
|
if magnitude_config := config.get(CONF_MAGNITUDE):
|
|
sens = await sensor.new_sensor(magnitude_config)
|
|
cg.add(var.set_magnitude_sensor(sens))
|
|
|
|
if status_config := config.get(CONF_STATUS):
|
|
sens = await sensor.new_sensor(status_config)
|
|
cg.add(var.set_status_sensor(sens))
|