diff --git a/components/truma_inetbox/sensor/__init__.py b/components/truma_inetbox/sensor/__init__.py index 295e3d0..834a18c 100644 --- a/components/truma_inetbox/sensor/__init__.py +++ b/components/truma_inetbox/sensor/__init__.py @@ -4,6 +4,7 @@ import esphome.codegen as cg from esphome.const import ( CONF_ID, CONF_TYPE, + DEVICE_CLASS_POWER, DEVICE_CLASS_TEMPERATURE, CONF_UNIT_OF_MEASUREMENT, UNIT_CELSIUS, @@ -22,41 +23,85 @@ from .. import truma_inetbox_ns, CONF_TRUMA_INETBOX_ID, TrumaINetBoxApp DEPENDENCIES = ["truma_inetbox"] CODEOWNERS = ["@Fabian-Schmidt"] +CONF_CLASS = "class" + TrumaSensor = truma_inetbox_ns.class_( "TrumaSensor", sensor.Sensor, cg.Component) # `TRUMA_SENSOR_TYPE` is a enum class and not a namespace but it works. TRUMA_SENSOR_TYPE_dummy_ns = truma_inetbox_ns.namespace("TRUMA_SENSOR_TYPE") -# 0 - C++ enum -# 1 - CONF_UNIT_OF_MEASUREMENT -# 2 - CONF_ICON -# 3 - CONF_ACCURACY_DECIMALS -# 4 - CONF_DEVICE_CLASS CONF_SUPPORTED_TYPE = { - "CURRENT_ROOM_TEMPERATURE": (TRUMA_SENSOR_TYPE_dummy_ns.CURRENT_ROOM_TEMPERATURE, UNIT_CELSIUS, ICON_THERMOMETER, 1, DEVICE_CLASS_TEMPERATURE), - "CURRENT_WATER_TEMPERATURE": (TRUMA_SENSOR_TYPE_dummy_ns.CURRENT_WATER_TEMPERATURE, UNIT_CELSIUS, ICON_THERMOMETER, 1, DEVICE_CLASS_TEMPERATURE), - "TARGET_ROOM_TEMPERATURE": (TRUMA_SENSOR_TYPE_dummy_ns.TARGET_ROOM_TEMPERATURE, UNIT_CELSIUS, ICON_THERMOMETER, 0, DEVICE_CLASS_TEMPERATURE), - "TARGET_WATER_TEMPERATURE": (TRUMA_SENSOR_TYPE_dummy_ns.TARGET_WATER_TEMPERATURE, UNIT_CELSIUS, ICON_THERMOMETER, 0, DEVICE_CLASS_TEMPERATURE), - "HEATING_MODE": (TRUMA_SENSOR_TYPE_dummy_ns.HEATING_MODE, UNIT_EMPTY, ICON_THERMOMETER, 0, DEVICE_CLASS_TEMPERATURE), - "ELECTRIC_POWER_LEVEL": (TRUMA_SENSOR_TYPE_dummy_ns.ELECTRIC_POWER_LEVEL, UNIT_WATT, ICON_POWER, 0, DEVICE_CLASS_TEMPERATURE), - "ENERGY_MIX": (TRUMA_SENSOR_TYPE_dummy_ns.ENERGY_MIX, UNIT_EMPTY, ICON_GAS_CYLINDER, 0, DEVICE_CLASS_TEMPERATURE), - "OPERATING_STATUS": (TRUMA_SENSOR_TYPE_dummy_ns.OPERATING_STATUS, UNIT_EMPTY, ICON_POWER, 0, DEVICE_CLASS_TEMPERATURE), - "HEATER_ERROR_CODE": (TRUMA_SENSOR_TYPE_dummy_ns.HEATER_ERROR_CODE, UNIT_EMPTY, ICON_POWER, 0, DEVICE_CLASS_TEMPERATURE), + "CURRENT_ROOM_TEMPERATURE": { + CONF_CLASS: TRUMA_SENSOR_TYPE_dummy_ns.CURRENT_ROOM_TEMPERATURE, + CONF_UNIT_OF_MEASUREMENT: UNIT_CELSIUS, + CONF_ICON: ICON_THERMOMETER, + CONF_ACCURACY_DECIMALS: 1, + CONF_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE, + }, + "CURRENT_WATER_TEMPERATURE": { + CONF_CLASS: TRUMA_SENSOR_TYPE_dummy_ns.CURRENT_WATER_TEMPERATURE, + CONF_UNIT_OF_MEASUREMENT: UNIT_CELSIUS, + CONF_ICON: ICON_THERMOMETER, + CONF_ACCURACY_DECIMALS: 0, + CONF_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE, + }, + "TARGET_ROOM_TEMPERATURE": { + CONF_CLASS: TRUMA_SENSOR_TYPE_dummy_ns.TARGET_ROOM_TEMPERATURE, + CONF_UNIT_OF_MEASUREMENT: UNIT_CELSIUS, + CONF_ICON: ICON_THERMOMETER, + CONF_ACCURACY_DECIMALS: 0, + CONF_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE, + }, + "TARGET_WATER_TEMPERATURE": { + CONF_CLASS: TRUMA_SENSOR_TYPE_dummy_ns.TARGET_WATER_TEMPERATURE, + CONF_UNIT_OF_MEASUREMENT: UNIT_CELSIUS, + CONF_ICON: ICON_THERMOMETER, + CONF_ACCURACY_DECIMALS: 0, + CONF_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE, + }, + "HEATING_MODE": { + CONF_CLASS: TRUMA_SENSOR_TYPE_dummy_ns.HEATING_MODE, + CONF_UNIT_OF_MEASUREMENT: UNIT_EMPTY, + CONF_ACCURACY_DECIMALS: 0, + }, + "ELECTRIC_POWER_LEVEL": { + CONF_CLASS: TRUMA_SENSOR_TYPE_dummy_ns.ELECTRIC_POWER_LEVEL, + CONF_UNIT_OF_MEASUREMENT: UNIT_WATT, + CONF_ICON: ICON_POWER, + CONF_ACCURACY_DECIMALS: 0, + CONF_DEVICE_CLASS: DEVICE_CLASS_POWER, + }, + "ENERGY_MIX": { + CONF_CLASS: TRUMA_SENSOR_TYPE_dummy_ns.ENERGY_MIX, + CONF_UNIT_OF_MEASUREMENT: UNIT_EMPTY, + CONF_ACCURACY_DECIMALS: 0, + }, + "OPERATING_STATUS": { + CONF_CLASS: TRUMA_SENSOR_TYPE_dummy_ns.OPERATING_STATUS, + CONF_UNIT_OF_MEASUREMENT: UNIT_EMPTY, + CONF_ACCURACY_DECIMALS: 0, + }, + "HEATER_ERROR_CODE": { + CONF_CLASS: TRUMA_SENSOR_TYPE_dummy_ns.HEATER_ERROR_CODE, + CONF_UNIT_OF_MEASUREMENT: UNIT_EMPTY, + CONF_ACCURACY_DECIMALS: 0, + }, } def set_default_based_on_type(): def set_defaults_(config): + sensor_type = CONF_SUPPORTED_TYPE[config[CONF_TYPE]] # set defaults based on sensor type: - if CONF_UNIT_OF_MEASUREMENT not in config: - config[CONF_UNIT_OF_MEASUREMENT] = CONF_SUPPORTED_TYPE[config[CONF_TYPE]][1] - if CONF_ICON not in config: - config[CONF_ICON] = CONF_SUPPORTED_TYPE[config[CONF_TYPE]][2] - if CONF_ACCURACY_DECIMALS not in config: - config[CONF_ACCURACY_DECIMALS] = CONF_SUPPORTED_TYPE[config[CONF_TYPE]][3] - if CONF_DEVICE_CLASS not in config: - config[CONF_DEVICE_CLASS] = CONF_SUPPORTED_TYPE[config[CONF_TYPE]][4] + if CONF_UNIT_OF_MEASUREMENT in sensor_type and CONF_UNIT_OF_MEASUREMENT not in config: + config[CONF_UNIT_OF_MEASUREMENT] = sensor_type[CONF_UNIT_OF_MEASUREMENT] + if CONF_ICON in sensor_type and CONF_ICON not in config: + config[CONF_ICON] = sensor_type[CONF_ICON] + if CONF_ACCURACY_DECIMALS in sensor_type and CONF_ACCURACY_DECIMALS not in config: + config[CONF_ACCURACY_DECIMALS] = sensor_type[CONF_ACCURACY_DECIMALS] + if CONF_DEVICE_CLASS in sensor_type and CONF_DEVICE_CLASS not in config: + config[CONF_DEVICE_CLASS] = sensor_type[CONF_DEVICE_CLASS] return config return set_defaults_ @@ -80,4 +125,4 @@ async def to_code(config): await sensor.register_sensor(var, config) await cg.register_parented(var, config[CONF_TRUMA_INETBOX_ID]) - cg.add(var.set_type(CONF_SUPPORTED_TYPE[config[CONF_TYPE]][0])) + cg.add(var.set_type(CONF_SUPPORTED_TYPE[config[CONF_TYPE]][CONF_CLASS]))