1
0
mirror of https://github.com/esphome/esphome.git synced 2025-03-14 06:38:17 +00:00

Refactor diesel heater BLE component: streamline configuration schemas and improve code readability

This commit is contained in:
Mateusz Wójcik 2025-01-07 15:24:13 +01:00
parent a7bddffad6
commit 50999e6492
5 changed files with 208 additions and 229 deletions

View File

@ -1,8 +1,6 @@
import esphome.codegen as cg
from esphome.components import ble_client, sensor
import esphome.config_validation as cv
from esphome.components import ble_client
from esphome.components import sensor
from esphome.const import CONF_ID
CODEOWNERS = ["@warehog"]
@ -11,18 +9,17 @@ DEPENDENCIES = ["ble_client"]
CONF_HEATER_ID = "diesel_heater_ble"
diesel_heater_ble_ns = cg.esphome_ns.namespace("diesel_heater_ble")
DieselHeaterBLE = diesel_heater_ble_ns.class_("DieselHeaterBLE", sensor.Sensor, cg.Component, ble_client.BLEClientNode)
DieselHeaterBLE = diesel_heater_ble_ns.class_(
"DieselHeaterBLE", sensor.Sensor, cg.Component, ble_client.BLEClientNode
)
CONFIG_SCHEMA = (
cv.Schema(
{
cv.GenerateID(): cv.declare_id(DieselHeaterBLE)
}
)
cv.Schema({cv.GenerateID(): cv.declare_id(DieselHeaterBLE)})
.extend(cv.COMPONENT_SCHEMA)
.extend(ble_client.BLE_CLIENT_SCHEMA)
.extend(ble_client.BLE_CLIENT_SCHEMA)
)
async def to_code(config):
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)

View File

@ -1,8 +1,8 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.components import button
import esphome.config_validation as cv
from . import DieselHeaterBLE, CONF_HEATER_ID, diesel_heater_ble_ns
from . import CONF_HEATER_ID, DieselHeaterBLE, diesel_heater_ble_ns
CONF_LEVEL_UP_ID = "level_up"
CONF_LEVEL_DOWN_ID = "level_down"
@ -10,37 +10,39 @@ CONF_TEMP_UP_ID = "temp_up"
CONF_TEMP_DOWN_ID = "temp_down"
CONFIG_SCHEMA = (
cv.Schema(
{
cv.GenerateID(CONF_HEATER_ID): cv.use_id(DieselHeaterBLE),
cv.Optional(CONF_LEVEL_UP_ID): button.button_schema(
diesel_heater_ble_ns.class_("LevelUpButton", button.Button),
icon="mdi:arrow-up",
),
cv.Optional(CONF_LEVEL_DOWN_ID): button.button_schema(
diesel_heater_ble_ns.class_("LevelDownButton", button.Button),
icon="mdi:arrow-down",
),
cv.Optional(CONF_TEMP_UP_ID): button.button_schema(
diesel_heater_ble_ns.class_("TempUpButton", button.Button),
icon="mdi:arrow-up",
),
cv.Optional(CONF_TEMP_DOWN_ID): button.button_schema(
diesel_heater_ble_ns.class_("TempDownButton", button.Button),
icon="mdi:arrow-down",
),
}
)
.extend(cv.COMPONENT_SCHEMA)
)
CONFIG_SCHEMA = cv.Schema(
{
cv.GenerateID(CONF_HEATER_ID): cv.use_id(DieselHeaterBLE),
cv.Optional(CONF_LEVEL_UP_ID): button.button_schema(
diesel_heater_ble_ns.class_("LevelUpButton", button.Button),
icon="mdi:arrow-up",
),
cv.Optional(CONF_LEVEL_DOWN_ID): button.button_schema(
diesel_heater_ble_ns.class_("LevelDownButton", button.Button),
icon="mdi:arrow-down",
),
cv.Optional(CONF_TEMP_UP_ID): button.button_schema(
diesel_heater_ble_ns.class_("TempUpButton", button.Button),
icon="mdi:arrow-up",
),
cv.Optional(CONF_TEMP_DOWN_ID): button.button_schema(
diesel_heater_ble_ns.class_("TempDownButton", button.Button),
icon="mdi:arrow-down",
),
}
).extend(cv.COMPONENT_SCHEMA)
async def to_code(config):
parent = await cg.get_variable(config[CONF_HEATER_ID])
for var in [CONF_LEVEL_UP_ID, CONF_LEVEL_DOWN_ID, CONF_TEMP_UP_ID, CONF_TEMP_DOWN_ID]:
for var in [
CONF_LEVEL_UP_ID,
CONF_LEVEL_DOWN_ID,
CONF_TEMP_UP_ID,
CONF_TEMP_DOWN_ID,
]:
if conf := config.get(var):
sw_var = await button.new_button(conf)
await cg.register_parented(sw_var, parent)
cg.add(getattr(parent, f"set_{var}_button")(sw_var))
cg.add(getattr(parent, f"set_{var}_button")(sw_var))

View File

@ -1,11 +1,8 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.components import number
from esphome.const import (
CONF_TEMPERATURE
)
import esphome.config_validation as cv
from . import DieselHeaterBLE, CONF_HEATER_ID, diesel_heater_ble_ns
from . import CONF_HEATER_ID, DieselHeaterBLE, diesel_heater_ble_ns
CODEOWNERS = ["@warehog"]
DEPENDENCIES = ["diesel_heater_ble"]
@ -17,16 +14,14 @@ PowerLevelNumber = diesel_heater_ble_ns.class_("PowerLevelNumber", number.Number
CONF_SET_TEMP = "set_temp"
SetTempNumber = diesel_heater_ble_ns.class_("SetTempNumber", number.Number)
CONFIG_SCHEMA = (
cv.Schema(
{
cv.GenerateID(CONF_HEATER_ID): cv.use_id(DieselHeaterBLE),
cv.Optional(CONF_POWER_LEVEL): number.number_schema(PowerLevelNumber),
cv.Optional(CONF_SET_TEMP): number.number_schema(SetTempNumber),
}
)
.extend(cv.COMPONENT_SCHEMA)
)
CONFIG_SCHEMA = cv.Schema(
{
cv.GenerateID(CONF_HEATER_ID): cv.use_id(DieselHeaterBLE),
cv.Optional(CONF_POWER_LEVEL): number.number_schema(PowerLevelNumber),
cv.Optional(CONF_SET_TEMP): number.number_schema(SetTempNumber),
}
).extend(cv.COMPONENT_SCHEMA)
async def to_code(config):
parent = await cg.get_variable(config[CONF_HEATER_ID])

View File

@ -1,21 +1,18 @@
import esphome.codegen as cg
from esphome.components import ble_client, sensor
import esphome.config_validation as cv
from esphome.components import ble_client
from esphome.components import sensor
from esphome.const import (
CONF_ID,
UNIT_VOLT,
UNIT_CELSIUS,
UNIT_PERCENT,
UNIT_SECOND,
UNIT_METER,
UNIT_EMPTY,
DEVICE_CLASS_EMPTY,
DEVICE_CLASS_TEMPERATURE,
STATE_CLASS_MEASUREMENT,
DEVICE_CLASS_EMPTY
UNIT_CELSIUS,
UNIT_EMPTY,
UNIT_METER,
UNIT_SECOND,
UNIT_VOLT,
)
from . import DieselHeaterBLE, CONF_HEATER_ID
from . import CONF_HEATER_ID, DieselHeaterBLE
CODEOWNERS = ["@warehog"]
DEPENDENCIES = ["diesel_heater_ble"]
@ -45,146 +42,144 @@ CONF_TEMP_UNIT = "temp_unit"
CONF_ALTITUDE_UNIT = "altitude_unit"
CONF_AUTOMATIC_HEATING = "automatic_heating"
CONFIG_SCHEMA = (
cv.Schema(
{
cv.GenerateID(CONF_HEATER_ID): cv.use_id(DieselHeaterBLE),
cv.Optional(CONF_RUNNING_STATE): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=1,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_ERROR_CODE): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_RUNNING_STEP): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_ALTITUDE): sensor.sensor_schema(
unit_of_measurement=UNIT_METER,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_RUNNING_MODE): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_SET_LEVEL): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_SET_TEMP): sensor.sensor_schema(
unit_of_measurement=UNIT_CELSIUS,
accuracy_decimals=1,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT
),
cv.Optional(CONF_SUPPLY_VOLTAGE): sensor.sensor_schema(
unit_of_measurement=UNIT_VOLT,
accuracy_decimals=1,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_CASE_TEMP): sensor.sensor_schema(
unit_of_measurement=UNIT_CELSIUS,
accuracy_decimals=1,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT
),
cv.Optional(CONF_CAB_TEMP): sensor.sensor_schema(
unit_of_measurement=UNIT_CELSIUS,
accuracy_decimals=1,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_START_TIME): sensor.sensor_schema(
unit_of_measurement=UNIT_SECOND,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_AUTO_TIME): sensor.sensor_schema(
unit_of_measurement=UNIT_SECOND,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_RUN_TIME): sensor.sensor_schema(
unit_of_measurement=UNIT_SECOND,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_IS_AUTO): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_LANGUAGE): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_TEMP_OFFSET): sensor.sensor_schema(
unit_of_measurement=UNIT_CELSIUS,
accuracy_decimals=1,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT
),
cv.Optional(CONF_TANK_VOLUME): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_OIL_PUMP_TYPE): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_RF433_ON_OFF): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_TEMP_UNIT): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_ALTITUDE_UNIT): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_AUTOMATIC_HEATING): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
)
}
)
.extend(ble_client.BLE_CLIENT_SCHEMA)
)
CONFIG_SCHEMA = cv.Schema(
{
cv.GenerateID(CONF_HEATER_ID): cv.use_id(DieselHeaterBLE),
cv.Optional(CONF_RUNNING_STATE): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=1,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_ERROR_CODE): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_RUNNING_STEP): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_ALTITUDE): sensor.sensor_schema(
unit_of_measurement=UNIT_METER,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_RUNNING_MODE): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_SET_LEVEL): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_SET_TEMP): sensor.sensor_schema(
unit_of_measurement=UNIT_CELSIUS,
accuracy_decimals=1,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_SUPPLY_VOLTAGE): sensor.sensor_schema(
unit_of_measurement=UNIT_VOLT,
accuracy_decimals=1,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_CASE_TEMP): sensor.sensor_schema(
unit_of_measurement=UNIT_CELSIUS,
accuracy_decimals=1,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_CAB_TEMP): sensor.sensor_schema(
unit_of_measurement=UNIT_CELSIUS,
accuracy_decimals=1,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_START_TIME): sensor.sensor_schema(
unit_of_measurement=UNIT_SECOND,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_AUTO_TIME): sensor.sensor_schema(
unit_of_measurement=UNIT_SECOND,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_RUN_TIME): sensor.sensor_schema(
unit_of_measurement=UNIT_SECOND,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_IS_AUTO): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_LANGUAGE): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_TEMP_OFFSET): sensor.sensor_schema(
unit_of_measurement=UNIT_CELSIUS,
accuracy_decimals=1,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_TANK_VOLUME): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_OIL_PUMP_TYPE): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_RF433_ON_OFF): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_TEMP_UNIT): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_ALTITUDE_UNIT): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional(CONF_AUTOMATIC_HEATING): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
state_class=STATE_CLASS_MEASUREMENT,
),
}
).extend(ble_client.BLE_CLIENT_SCHEMA)
async def to_code(config):
var = await cg.get_variable(config[CONF_HEATER_ID])
@ -198,7 +193,7 @@ async def to_code(config):
CONF_SET_LEVEL,
CONF_SET_TEMP,
CONF_SUPPLY_VOLTAGE,
CONF_CASE_TEMP,
CONF_CASE_TEMP,
CONF_CAB_TEMP,
CONF_START_TIME,
CONF_AUTO_TIME,
@ -211,7 +206,8 @@ async def to_code(config):
CONF_RF433_ON_OFF,
CONF_TEMP_UNIT,
CONF_ALTITUDE_UNIT,
CONF_AUTOMATIC_HEATING]:
CONF_AUTOMATIC_HEATING,
]:
if sensor_config := config.get(sensor_name):
sens = await sensor.new_sensor(sensor_config)
cg.add(getattr(var, f"set_{sensor_name}")(sens))

View File

@ -1,29 +1,18 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.components import switch
import esphome.config_validation as cv
from . import DieselHeaterBLE, CONF_HEATER_ID, diesel_heater_ble_ns
from . import CONF_HEATER_ID, DieselHeaterBLE, diesel_heater_ble_ns
CONFIG_SCHEMA = (
cv.Schema(
{
cv.GenerateID(CONF_HEATER_ID): cv.use_id(DieselHeaterBLE),
cv.Optional("power"): switch.switch_schema(
diesel_heater_ble_ns.class_("PowerSwitch", switch.Switch),
icon="mdi:power",
),
# cv.Optional("mode"): switch.switch_schema(
# heater_ns.class_("ModeSwitch", switch.Switch),
# icon="mdi:power",
# ),
# cv.Optional("alpine"): switch.switch_schema(
# heater_ns.class_("AlpineSwitch", switch.Switch),
# icon="mdi:power",
# ),
}
)
.extend(cv.COMPONENT_SCHEMA)
)
CONFIG_SCHEMA = cv.Schema(
{
cv.GenerateID(CONF_HEATER_ID): cv.use_id(DieselHeaterBLE),
cv.Optional("power"): switch.switch_schema(
diesel_heater_ble_ns.class_("PowerSwitch", switch.Switch),
icon="mdi:power",
),
}
).extend(cv.COMPONENT_SCHEMA)
async def to_code(config):
@ -33,4 +22,4 @@ async def to_code(config):
if conf := config.get(switch_type):
sw_var = await switch.new_switch(conf)
await cg.register_parented(sw_var, parent)
cg.add(getattr(parent, f"set_{switch_type}_switch")(sw_var))
cg.add(getattr(parent, f"set_{switch_type}_switch")(sw_var))