mirror of
https://github.com/esphome/esphome.git
synced 2024-12-02 11:44:13 +01:00
230 lines
8.4 KiB
Python
230 lines
8.4 KiB
Python
import esphome.codegen as cg
|
|
import esphome.config_validation as cv
|
|
from esphome.components import sensor
|
|
from esphome.const import (
|
|
CONF_VOLTAGE,
|
|
CONF_CURRENT,
|
|
CONF_BATTERY_LEVEL,
|
|
CONF_MAX_TEMPERATURE,
|
|
CONF_MIN_TEMPERATURE,
|
|
DEVICE_CLASS_VOLTAGE,
|
|
DEVICE_CLASS_CURRENT,
|
|
DEVICE_CLASS_BATTERY,
|
|
DEVICE_CLASS_TEMPERATURE,
|
|
STATE_CLASS_MEASUREMENT,
|
|
UNIT_VOLT,
|
|
UNIT_AMPERE,
|
|
UNIT_PERCENT,
|
|
UNIT_CELSIUS,
|
|
ICON_FLASH,
|
|
ICON_PERCENT,
|
|
ICON_COUNTER,
|
|
ICON_THERMOMETER,
|
|
ICON_GAUGE,
|
|
)
|
|
from . import DalyBmsComponent, CONF_BMS_DALY_ID
|
|
|
|
CONF_MAX_CELL_VOLTAGE = "max_cell_voltage"
|
|
CONF_MAX_CELL_VOLTAGE_NUMBER = "max_cell_voltage_number"
|
|
CONF_MIN_CELL_VOLTAGE = "min_cell_voltage"
|
|
CONF_MIN_CELL_VOLTAGE_NUMBER = "min_cell_voltage_number"
|
|
CONF_MAX_TEMPERATURE_PROBE_NUMBER = "max_temperature_probe_number"
|
|
CONF_MIN_TEMPERATURE_PROBE_NUMBER = "min_temperature_probe_number"
|
|
CONF_CELLS_NUMBER = "cells_number"
|
|
|
|
CONF_REMAINING_CAPACITY = "remaining_capacity"
|
|
CONF_TEMPERATURE_1 = "temperature_1"
|
|
CONF_TEMPERATURE_2 = "temperature_2"
|
|
|
|
CONF_CELL_1_VOLTAGE = "cell_1_voltage"
|
|
CONF_CELL_2_VOLTAGE = "cell_2_voltage"
|
|
CONF_CELL_3_VOLTAGE = "cell_3_voltage"
|
|
CONF_CELL_4_VOLTAGE = "cell_4_voltage"
|
|
CONF_CELL_5_VOLTAGE = "cell_5_voltage"
|
|
CONF_CELL_6_VOLTAGE = "cell_6_voltage"
|
|
CONF_CELL_7_VOLTAGE = "cell_7_voltage"
|
|
CONF_CELL_8_VOLTAGE = "cell_8_voltage"
|
|
CONF_CELL_9_VOLTAGE = "cell_9_voltage"
|
|
CONF_CELL_10_VOLTAGE = "cell_10_voltage"
|
|
CONF_CELL_11_VOLTAGE = "cell_11_voltage"
|
|
CONF_CELL_12_VOLTAGE = "cell_12_voltage"
|
|
CONF_CELL_13_VOLTAGE = "cell_13_voltage"
|
|
CONF_CELL_14_VOLTAGE = "cell_14_voltage"
|
|
CONF_CELL_15_VOLTAGE = "cell_15_voltage"
|
|
CONF_CELL_16_VOLTAGE = "cell_16_voltage"
|
|
ICON_CURRENT_DC = "mdi:current-dc"
|
|
ICON_BATTERY_OUTLINE = "mdi:battery-outline"
|
|
ICON_THERMOMETER_CHEVRON_UP = "mdi:thermometer-chevron-up"
|
|
ICON_THERMOMETER_CHEVRON_DOWN = "mdi:thermometer-chevron-down"
|
|
ICON_CAR_BATTERY = "mdi:car-battery"
|
|
|
|
UNIT_AMPERE_HOUR = "Ah"
|
|
|
|
TYPES = [
|
|
CONF_VOLTAGE,
|
|
CONF_CURRENT,
|
|
CONF_BATTERY_LEVEL,
|
|
CONF_MAX_CELL_VOLTAGE,
|
|
CONF_MAX_CELL_VOLTAGE_NUMBER,
|
|
CONF_MIN_CELL_VOLTAGE,
|
|
CONF_MIN_CELL_VOLTAGE_NUMBER,
|
|
CONF_MAX_TEMPERATURE,
|
|
CONF_MAX_TEMPERATURE_PROBE_NUMBER,
|
|
CONF_MIN_TEMPERATURE,
|
|
CONF_MIN_TEMPERATURE_PROBE_NUMBER,
|
|
CONF_CELLS_NUMBER,
|
|
CONF_REMAINING_CAPACITY,
|
|
CONF_TEMPERATURE_1,
|
|
CONF_TEMPERATURE_2,
|
|
CONF_CELL_1_VOLTAGE,
|
|
CONF_CELL_2_VOLTAGE,
|
|
CONF_CELL_3_VOLTAGE,
|
|
CONF_CELL_4_VOLTAGE,
|
|
CONF_CELL_5_VOLTAGE,
|
|
CONF_CELL_6_VOLTAGE,
|
|
CONF_CELL_7_VOLTAGE,
|
|
CONF_CELL_8_VOLTAGE,
|
|
CONF_CELL_9_VOLTAGE,
|
|
CONF_CELL_10_VOLTAGE,
|
|
CONF_CELL_11_VOLTAGE,
|
|
CONF_CELL_12_VOLTAGE,
|
|
CONF_CELL_13_VOLTAGE,
|
|
CONF_CELL_14_VOLTAGE,
|
|
CONF_CELL_15_VOLTAGE,
|
|
CONF_CELL_16_VOLTAGE,
|
|
]
|
|
|
|
CELL_VOLTAGE_SCHEMA = sensor.sensor_schema(
|
|
unit_of_measurement=UNIT_VOLT,
|
|
device_class=DEVICE_CLASS_VOLTAGE,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
icon=ICON_FLASH,
|
|
accuracy_decimals=3,
|
|
)
|
|
|
|
CONFIG_SCHEMA = cv.All(
|
|
cv.Schema(
|
|
{
|
|
cv.GenerateID(CONF_BMS_DALY_ID): cv.use_id(DalyBmsComponent),
|
|
cv.Optional(CONF_VOLTAGE): sensor.sensor_schema(
|
|
unit_of_measurement=UNIT_VOLT,
|
|
icon=ICON_FLASH,
|
|
accuracy_decimals=1,
|
|
device_class=DEVICE_CLASS_VOLTAGE,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
),
|
|
cv.Optional(CONF_CURRENT): sensor.sensor_schema(
|
|
unit_of_measurement=UNIT_AMPERE,
|
|
icon=ICON_CURRENT_DC,
|
|
accuracy_decimals=1,
|
|
device_class=DEVICE_CLASS_CURRENT,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
),
|
|
cv.Optional(CONF_BATTERY_LEVEL): sensor.sensor_schema(
|
|
unit_of_measurement=UNIT_PERCENT,
|
|
icon=ICON_PERCENT,
|
|
accuracy_decimals=1,
|
|
device_class=DEVICE_CLASS_BATTERY,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
),
|
|
cv.Optional(CONF_MAX_CELL_VOLTAGE): sensor.sensor_schema(
|
|
unit_of_measurement=UNIT_VOLT,
|
|
icon=ICON_FLASH,
|
|
accuracy_decimals=2,
|
|
device_class=DEVICE_CLASS_VOLTAGE,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
),
|
|
cv.Optional(CONF_MAX_CELL_VOLTAGE_NUMBER): sensor.sensor_schema(
|
|
icon=ICON_COUNTER,
|
|
accuracy_decimals=0,
|
|
),
|
|
cv.Optional(CONF_MIN_CELL_VOLTAGE): sensor.sensor_schema(
|
|
unit_of_measurement=UNIT_VOLT,
|
|
icon=ICON_FLASH,
|
|
accuracy_decimals=2,
|
|
device_class=DEVICE_CLASS_VOLTAGE,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
),
|
|
cv.Optional(CONF_MIN_CELL_VOLTAGE_NUMBER): sensor.sensor_schema(
|
|
icon=ICON_COUNTER,
|
|
accuracy_decimals=0,
|
|
),
|
|
cv.Optional(CONF_MAX_TEMPERATURE): sensor.sensor_schema(
|
|
unit_of_measurement=UNIT_CELSIUS,
|
|
icon=ICON_THERMOMETER_CHEVRON_UP,
|
|
accuracy_decimals=0,
|
|
device_class=DEVICE_CLASS_TEMPERATURE,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
),
|
|
cv.Optional(CONF_MAX_TEMPERATURE_PROBE_NUMBER): sensor.sensor_schema(
|
|
icon=ICON_COUNTER,
|
|
accuracy_decimals=0,
|
|
),
|
|
cv.Optional(CONF_MIN_TEMPERATURE): sensor.sensor_schema(
|
|
unit_of_measurement=UNIT_CELSIUS,
|
|
icon=ICON_THERMOMETER_CHEVRON_DOWN,
|
|
accuracy_decimals=0,
|
|
device_class=DEVICE_CLASS_TEMPERATURE,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
),
|
|
cv.Optional(CONF_MIN_TEMPERATURE_PROBE_NUMBER): sensor.sensor_schema(
|
|
icon=ICON_COUNTER,
|
|
accuracy_decimals=0,
|
|
),
|
|
cv.Optional(CONF_REMAINING_CAPACITY): sensor.sensor_schema(
|
|
unit_of_measurement=UNIT_AMPERE_HOUR,
|
|
icon=ICON_GAUGE,
|
|
accuracy_decimals=2,
|
|
device_class=DEVICE_CLASS_VOLTAGE,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
),
|
|
cv.Optional(CONF_CELLS_NUMBER): sensor.sensor_schema(
|
|
icon=ICON_COUNTER,
|
|
accuracy_decimals=0,
|
|
),
|
|
cv.Optional(CONF_TEMPERATURE_1): sensor.sensor_schema(
|
|
unit_of_measurement=UNIT_CELSIUS,
|
|
icon=ICON_THERMOMETER,
|
|
accuracy_decimals=0,
|
|
device_class=DEVICE_CLASS_TEMPERATURE,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
),
|
|
cv.Optional(CONF_TEMPERATURE_2): sensor.sensor_schema(
|
|
unit_of_measurement=UNIT_CELSIUS,
|
|
icon=ICON_THERMOMETER,
|
|
accuracy_decimals=0,
|
|
device_class=DEVICE_CLASS_TEMPERATURE,
|
|
state_class=STATE_CLASS_MEASUREMENT,
|
|
),
|
|
cv.Optional(CONF_CELL_1_VOLTAGE): CELL_VOLTAGE_SCHEMA,
|
|
cv.Optional(CONF_CELL_2_VOLTAGE): CELL_VOLTAGE_SCHEMA,
|
|
cv.Optional(CONF_CELL_3_VOLTAGE): CELL_VOLTAGE_SCHEMA,
|
|
cv.Optional(CONF_CELL_4_VOLTAGE): CELL_VOLTAGE_SCHEMA,
|
|
cv.Optional(CONF_CELL_5_VOLTAGE): CELL_VOLTAGE_SCHEMA,
|
|
cv.Optional(CONF_CELL_6_VOLTAGE): CELL_VOLTAGE_SCHEMA,
|
|
cv.Optional(CONF_CELL_7_VOLTAGE): CELL_VOLTAGE_SCHEMA,
|
|
cv.Optional(CONF_CELL_8_VOLTAGE): CELL_VOLTAGE_SCHEMA,
|
|
cv.Optional(CONF_CELL_9_VOLTAGE): CELL_VOLTAGE_SCHEMA,
|
|
cv.Optional(CONF_CELL_10_VOLTAGE): CELL_VOLTAGE_SCHEMA,
|
|
cv.Optional(CONF_CELL_11_VOLTAGE): CELL_VOLTAGE_SCHEMA,
|
|
cv.Optional(CONF_CELL_12_VOLTAGE): CELL_VOLTAGE_SCHEMA,
|
|
cv.Optional(CONF_CELL_13_VOLTAGE): CELL_VOLTAGE_SCHEMA,
|
|
cv.Optional(CONF_CELL_14_VOLTAGE): CELL_VOLTAGE_SCHEMA,
|
|
cv.Optional(CONF_CELL_15_VOLTAGE): CELL_VOLTAGE_SCHEMA,
|
|
cv.Optional(CONF_CELL_16_VOLTAGE): CELL_VOLTAGE_SCHEMA,
|
|
}
|
|
).extend(cv.COMPONENT_SCHEMA)
|
|
)
|
|
|
|
|
|
async def setup_conf(config, key, hub):
|
|
if key in config:
|
|
conf = config[key]
|
|
sens = await sensor.new_sensor(conf)
|
|
cg.add(getattr(hub, f"set_{key}_sensor")(sens))
|
|
|
|
|
|
async def to_code(config):
|
|
hub = await cg.get_variable(config[CONF_BMS_DALY_ID])
|
|
for key in TYPES:
|
|
await setup_conf(config, key, hub)
|