diff --git a/homeassistant/components/opentherm_gw/const.py b/homeassistant/components/opentherm_gw/const.py index 1d007d86181..c1932c7b2bd 100644 --- a/homeassistant/components/opentherm_gw/const.py +++ b/homeassistant/components/opentherm_gw/const.py @@ -1,19 +1,5 @@ """Constants for the opentherm_gw integration.""" -from __future__ import annotations - -import pyotgw.vars as gw_vars - -from homeassistant.components.sensor import SensorDeviceClass -from homeassistant.const import ( - PERCENTAGE, - UnitOfPower, - UnitOfPressure, - UnitOfTemperature, - UnitOfTime, - UnitOfVolumeFlowRate, -) - ATTR_GW_ID = "gateway_id" ATTR_LEVEL = "level" ATTR_DHW_OVRD = "dhw_override" @@ -47,463 +33,3 @@ SERVICE_SET_MAX_MOD = "set_max_modulation" SERVICE_SET_OAT = "set_outside_temperature" SERVICE_SET_SB_TEMP = "set_setback_temperature" SERVICE_SEND_TRANSP_CMD = "send_transparent_command" - -TRANSLATE_SOURCE = { - gw_vars.BOILER: "Boiler", - gw_vars.OTGW: None, - gw_vars.THERMOSTAT: "Thermostat", -} - -SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION = 1 - -SENSOR_INFO: dict[str, list] = { - # [device_class, unit, friendly_name, suggested_display_precision, [status source, ...]] - gw_vars.DATA_CONTROL_SETPOINT: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Control Setpoint {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_MASTER_MEMBERID: [ - None, - None, - "Thermostat Member ID {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_SLAVE_MEMBERID: [ - None, - None, - "Boiler Member ID {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_SLAVE_OEM_FAULT: [ - None, - None, - "Boiler OEM Fault Code {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_COOLING_CONTROL: [ - None, - PERCENTAGE, - "Cooling Control Signal {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_CONTROL_SETPOINT_2: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Control Setpoint 2 {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_ROOM_SETPOINT_OVRD: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Room Setpoint Override {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_SLAVE_MAX_RELATIVE_MOD: [ - None, - PERCENTAGE, - "Boiler Maximum Relative Modulation {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_SLAVE_MAX_CAPACITY: [ - SensorDeviceClass.POWER, - UnitOfPower.KILO_WATT, - "Boiler Maximum Capacity {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_SLAVE_MIN_MOD_LEVEL: [ - None, - PERCENTAGE, - "Boiler Minimum Modulation Level {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_ROOM_SETPOINT: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Room Setpoint {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_REL_MOD_LEVEL: [ - None, - PERCENTAGE, - "Relative Modulation Level {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_CH_WATER_PRESS: [ - SensorDeviceClass.PRESSURE, - UnitOfPressure.BAR, - "Central Heating Water Pressure {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_DHW_FLOW_RATE: [ - SensorDeviceClass.VOLUME_FLOW_RATE, - UnitOfVolumeFlowRate.LITERS_PER_MINUTE, - "Hot Water Flow Rate {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_ROOM_SETPOINT_2: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Room Setpoint 2 {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_ROOM_TEMP: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Room Temperature {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_CH_WATER_TEMP: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Central Heating Water Temperature {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_DHW_TEMP: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Hot Water Temperature {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_OUTSIDE_TEMP: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Outside Temperature {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_RETURN_WATER_TEMP: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Return Water Temperature {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_SOLAR_STORAGE_TEMP: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Solar Storage Temperature {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_SOLAR_COLL_TEMP: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Solar Collector Temperature {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_CH_WATER_TEMP_2: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Central Heating 2 Water Temperature {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_DHW_TEMP_2: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Hot Water 2 Temperature {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_EXHAUST_TEMP: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Exhaust Temperature {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_SLAVE_DHW_MAX_SETP: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Hot Water Maximum Setpoint {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_SLAVE_DHW_MIN_SETP: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Hot Water Minimum Setpoint {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_SLAVE_CH_MAX_SETP: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Boiler Maximum Central Heating Setpoint {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_SLAVE_CH_MIN_SETP: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Boiler Minimum Central Heating Setpoint {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_DHW_SETPOINT: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Hot Water Setpoint {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_MAX_CH_SETPOINT: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Maximum Central Heating Setpoint {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_OEM_DIAG: [ - None, - None, - "OEM Diagnostic Code {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_TOTAL_BURNER_STARTS: [ - None, - "starts", - "Total Burner Starts {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_CH_PUMP_STARTS: [ - None, - "starts", - "Central Heating Pump Starts {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_DHW_PUMP_STARTS: [ - None, - "starts", - "Hot Water Pump Starts {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_DHW_BURNER_STARTS: [ - None, - "starts", - "Hot Water Burner Starts {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_TOTAL_BURNER_HOURS: [ - SensorDeviceClass.DURATION, - UnitOfTime.HOURS, - "Total Burner Hours {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_CH_PUMP_HOURS: [ - SensorDeviceClass.DURATION, - UnitOfTime.HOURS, - "Central Heating Pump Hours {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_DHW_PUMP_HOURS: [ - SensorDeviceClass.DURATION, - UnitOfTime.HOURS, - "Hot Water Pump Hours {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_DHW_BURNER_HOURS: [ - SensorDeviceClass.DURATION, - UnitOfTime.HOURS, - "Hot Water Burner Hours {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_MASTER_OT_VERSION: [ - None, - None, - "Thermostat OpenTherm Version {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_SLAVE_OT_VERSION: [ - None, - None, - "Boiler OpenTherm Version {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_MASTER_PRODUCT_TYPE: [ - None, - None, - "Thermostat Product Type {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_MASTER_PRODUCT_VERSION: [ - None, - None, - "Thermostat Product Version {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_SLAVE_PRODUCT_TYPE: [ - None, - None, - "Boiler Product Type {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.DATA_SLAVE_PRODUCT_VERSION: [ - None, - None, - "Boiler Product Version {}", - None, - [gw_vars.BOILER, gw_vars.THERMOSTAT], - ], - gw_vars.OTGW_MODE: [ - None, - None, - "Gateway/Monitor Mode {}", - None, - [gw_vars.OTGW], - ], - gw_vars.OTGW_DHW_OVRD: [ - None, - None, - "Gateway Hot Water Override Mode {}", - None, - [gw_vars.OTGW], - ], - gw_vars.OTGW_ABOUT: [ - None, - None, - "Gateway Firmware Version {}", - None, - [gw_vars.OTGW], - ], - gw_vars.OTGW_BUILD: [ - None, - None, - "Gateway Firmware Build {}", - None, - [gw_vars.OTGW], - ], - gw_vars.OTGW_CLOCKMHZ: [ - None, - None, - "Gateway Clock Speed {}", - None, - [gw_vars.OTGW], - ], - gw_vars.OTGW_LED_A: [ - None, - None, - "Gateway LED A Mode {}", - None, - [gw_vars.OTGW], - ], - gw_vars.OTGW_LED_B: [ - None, - None, - "Gateway LED B Mode {}", - None, - [gw_vars.OTGW], - ], - gw_vars.OTGW_LED_C: [ - None, - None, - "Gateway LED C Mode {}", - None, - [gw_vars.OTGW], - ], - gw_vars.OTGW_LED_D: [ - None, - None, - "Gateway LED D Mode {}", - None, - [gw_vars.OTGW], - ], - gw_vars.OTGW_LED_E: [ - None, - None, - "Gateway LED E Mode {}", - None, - [gw_vars.OTGW], - ], - gw_vars.OTGW_LED_F: [ - None, - None, - "Gateway LED F Mode {}", - None, - [gw_vars.OTGW], - ], - gw_vars.OTGW_GPIO_A: [ - None, - None, - "Gateway GPIO A Mode {}", - None, - [gw_vars.OTGW], - ], - gw_vars.OTGW_GPIO_B: [ - None, - None, - "Gateway GPIO B Mode {}", - None, - [gw_vars.OTGW], - ], - gw_vars.OTGW_SB_TEMP: [ - SensorDeviceClass.TEMPERATURE, - UnitOfTemperature.CELSIUS, - "Gateway Setback Temperature {}", - SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, - [gw_vars.OTGW], - ], - gw_vars.OTGW_SETP_OVRD_MODE: [ - None, - None, - "Gateway Room Setpoint Override Mode {}", - None, - [gw_vars.OTGW], - ], - gw_vars.OTGW_SMART_PWR: [ - None, - None, - "Gateway Smart Power Mode {}", - None, - [gw_vars.OTGW], - ], - gw_vars.OTGW_THRM_DETECT: [ - None, - None, - "Gateway Thermostat Detection {}", - None, - [gw_vars.OTGW], - ], - gw_vars.OTGW_VREF: [ - None, - None, - "Gateway Reference Voltage Setting {}", - None, - [gw_vars.OTGW], - ], -} diff --git a/homeassistant/components/opentherm_gw/entity.py b/homeassistant/components/opentherm_gw/entity.py index dd023896f70..1de4aa0a2d9 100644 --- a/homeassistant/components/opentherm_gw/entity.py +++ b/homeassistant/components/opentherm_gw/entity.py @@ -2,16 +2,24 @@ import logging +import pyotgw.vars as gw_vars + from homeassistant.core import callback from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity import Entity, EntityDescription from . import OpenThermGatewayDevice -from .const import DOMAIN, TRANSLATE_SOURCE +from .const import DOMAIN _LOGGER = logging.getLogger(__name__) +TRANSLATE_SOURCE = { + gw_vars.BOILER: "Boiler", + gw_vars.OTGW: None, + gw_vars.THERMOSTAT: "Thermostat", +} + class OpenThermEntityDescription(EntityDescription): """Describe common opentherm_gw entity properties.""" diff --git a/homeassistant/components/opentherm_gw/sensor.py b/homeassistant/components/opentherm_gw/sensor.py index 8c17aca4516..20a69def433 100644 --- a/homeassistant/components/opentherm_gw/sensor.py +++ b/homeassistant/components/opentherm_gw/sensor.py @@ -1,20 +1,621 @@ """Support for OpenTherm Gateway sensors.""" -import logging +from dataclasses import dataclass -from homeassistant.components.sensor import ENTITY_ID_FORMAT, SensorEntity +import pyotgw.vars as gw_vars + +from homeassistant.components.sensor import ( + ENTITY_ID_FORMAT, + SensorDeviceClass, + SensorEntity, + SensorEntityDescription, + SensorStateClass, +) from homeassistant.config_entries import ConfigEntry -from homeassistant.const import CONF_ID +from homeassistant.const import ( + CONF_ID, + PERCENTAGE, + UnitOfPower, + UnitOfPressure, + UnitOfTemperature, + UnitOfTime, + UnitOfVolumeFlowRate, +) from homeassistant.core import HomeAssistant, callback -from homeassistant.helpers.device_registry import DeviceInfo -from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity import async_generate_entity_id from homeassistant.helpers.entity_platform import AddEntitiesCallback -from . import DOMAIN -from .const import DATA_GATEWAYS, DATA_OPENTHERM_GW, SENSOR_INFO, TRANSLATE_SOURCE +from . import OpenThermGatewayDevice +from .const import DATA_GATEWAYS, DATA_OPENTHERM_GW +from .entity import OpenThermEntity, OpenThermEntityDescription -_LOGGER = logging.getLogger(__name__) +SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION = 1 + + +@dataclass(frozen=True, kw_only=True) +class OpenThermSensorEntityDescription( + SensorEntityDescription, OpenThermEntityDescription +): + """Describes opentherm_gw sensor entity.""" + + +SENSOR_INFO: tuple[tuple[list[str], OpenThermSensorEntityDescription], ...] = ( + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_CONTROL_SETPOINT, + friendly_name_format="Control Setpoint {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_MASTER_MEMBERID, + friendly_name_format="Thermostat Member ID {}", + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_SLAVE_MEMBERID, + friendly_name_format="Boiler Member ID {}", + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_SLAVE_OEM_FAULT, + friendly_name_format="Boiler OEM Fault Code {}", + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_COOLING_CONTROL, + friendly_name_format="Cooling Control Signal {}", + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=PERCENTAGE, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_CONTROL_SETPOINT_2, + friendly_name_format="Control Setpoint 2 {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_ROOM_SETPOINT_OVRD, + friendly_name_format="Room Setpoint Override {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_SLAVE_MAX_RELATIVE_MOD, + friendly_name_format="Boiler Maximum Relative Modulation {}", + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=PERCENTAGE, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_SLAVE_MAX_CAPACITY, + friendly_name_format="Boiler Maximum Capacity {}", + state_class=SensorStateClass.MEASUREMENT, + device_class=SensorDeviceClass.POWER, + native_unit_of_measurement=UnitOfPower.KILO_WATT, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_SLAVE_MIN_MOD_LEVEL, + friendly_name_format="Boiler Minimum Modulation Level {}", + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=PERCENTAGE, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_ROOM_SETPOINT, + friendly_name_format="Room Setpoint {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_REL_MOD_LEVEL, + friendly_name_format="Relative Modulation Level {}", + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=PERCENTAGE, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_CH_WATER_PRESS, + friendly_name_format="Central Heating Water Pressure {}", + device_class=SensorDeviceClass.PRESSURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfPressure.BAR, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_DHW_FLOW_RATE, + friendly_name_format="Hot Water Flow Rate {}", + device_class=SensorDeviceClass.VOLUME_FLOW_RATE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfVolumeFlowRate.LITERS_PER_MINUTE, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_ROOM_SETPOINT_2, + friendly_name_format="Room Setpoint 2 {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_ROOM_TEMP, + friendly_name_format="Room Temperature {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_CH_WATER_TEMP, + friendly_name_format="Central Heating Water Temperature {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_DHW_TEMP, + friendly_name_format="Hot Water Temperature {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_OUTSIDE_TEMP, + friendly_name_format="Outside Temperature {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_RETURN_WATER_TEMP, + friendly_name_format="Return Water Temperature {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_SOLAR_STORAGE_TEMP, + friendly_name_format="Solar Storage Temperature {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_SOLAR_COLL_TEMP, + friendly_name_format="Solar Collector Temperature {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_CH_WATER_TEMP_2, + friendly_name_format="Central Heating 2 Water Temperature {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_DHW_TEMP_2, + friendly_name_format="Hot Water 2 Temperature {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_EXHAUST_TEMP, + friendly_name_format="Exhaust Temperature {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_SLAVE_DHW_MAX_SETP, + friendly_name_format="Hot Water Maximum Setpoint {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_SLAVE_DHW_MIN_SETP, + friendly_name_format="Hot Water Minimum Setpoint {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_SLAVE_CH_MAX_SETP, + friendly_name_format="Boiler Maximum Central Heating Setpoint {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_SLAVE_CH_MIN_SETP, + friendly_name_format="Boiler Minimum Central Heating Setpoint {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_DHW_SETPOINT, + friendly_name_format="Hot Water Setpoint {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_MAX_CH_SETPOINT, + friendly_name_format="Maximum Central Heating Setpoint {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_OEM_DIAG, + friendly_name_format="OEM Diagnostic Code {}", + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_TOTAL_BURNER_STARTS, + friendly_name_format="Total Burner Starts {}", + state_class=SensorStateClass.TOTAL, + native_unit_of_measurement="starts", + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_CH_PUMP_STARTS, + friendly_name_format="Central Heating Pump Starts {}", + state_class=SensorStateClass.TOTAL, + native_unit_of_measurement="starts", + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_DHW_PUMP_STARTS, + friendly_name_format="Hot Water Pump Starts {}", + state_class=SensorStateClass.TOTAL, + native_unit_of_measurement="starts", + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_DHW_BURNER_STARTS, + friendly_name_format="Hot Water Burner Starts {}", + state_class=SensorStateClass.TOTAL, + native_unit_of_measurement="starts", + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_TOTAL_BURNER_HOURS, + friendly_name_format="Total Burner Hours {}", + device_class=SensorDeviceClass.DURATION, + state_class=SensorStateClass.TOTAL, + native_unit_of_measurement=UnitOfTime.HOURS, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_CH_PUMP_HOURS, + friendly_name_format="Central Heating Pump Hours {}", + device_class=SensorDeviceClass.DURATION, + state_class=SensorStateClass.TOTAL, + native_unit_of_measurement=UnitOfTime.HOURS, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_DHW_PUMP_HOURS, + friendly_name_format="Hot Water Pump Hours {}", + device_class=SensorDeviceClass.DURATION, + state_class=SensorStateClass.TOTAL, + native_unit_of_measurement=UnitOfTime.HOURS, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_DHW_BURNER_HOURS, + friendly_name_format="Hot Water Burner Hours {}", + device_class=SensorDeviceClass.DURATION, + state_class=SensorStateClass.TOTAL, + native_unit_of_measurement=UnitOfTime.HOURS, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_MASTER_OT_VERSION, + friendly_name_format="Thermostat OpenTherm Version {}", + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_SLAVE_OT_VERSION, + friendly_name_format="Boiler OpenTherm Version {}", + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_MASTER_PRODUCT_TYPE, + friendly_name_format="Thermostat Product Type {}", + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_MASTER_PRODUCT_VERSION, + friendly_name_format="Thermostat Product Version {}", + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_SLAVE_PRODUCT_TYPE, + friendly_name_format="Boiler Product Type {}", + ), + ), + ( + [gw_vars.BOILER, gw_vars.THERMOSTAT], + OpenThermSensorEntityDescription( + key=gw_vars.DATA_SLAVE_PRODUCT_VERSION, + friendly_name_format="Boiler Product Version {}", + ), + ), + ( + [gw_vars.OTGW], + OpenThermSensorEntityDescription( + key=gw_vars.OTGW_MODE, + friendly_name_format="Gateway/Monitor Mode {}", + ), + ), + ( + [gw_vars.OTGW], + OpenThermSensorEntityDescription( + key=gw_vars.OTGW_DHW_OVRD, + friendly_name_format="Gateway Hot Water Override Mode {}", + ), + ), + ( + [gw_vars.OTGW], + OpenThermSensorEntityDescription( + key=gw_vars.OTGW_ABOUT, + friendly_name_format="Gateway Firmware Version {}", + ), + ), + ( + [gw_vars.OTGW], + OpenThermSensorEntityDescription( + key=gw_vars.OTGW_BUILD, + friendly_name_format="Gateway Firmware Build {}", + ), + ), + ( + [gw_vars.OTGW], + OpenThermSensorEntityDescription( + key=gw_vars.OTGW_CLOCKMHZ, + friendly_name_format="Gateway Clock Speed {}", + ), + ), + ( + [gw_vars.OTGW], + OpenThermSensorEntityDescription( + key=gw_vars.OTGW_LED_A, + friendly_name_format="Gateway LED A Mode {}", + ), + ), + ( + [gw_vars.OTGW], + OpenThermSensorEntityDescription( + key=gw_vars.OTGW_LED_B, + friendly_name_format="Gateway LED B Mode {}", + ), + ), + ( + [gw_vars.OTGW], + OpenThermSensorEntityDescription( + key=gw_vars.OTGW_LED_C, + friendly_name_format="Gateway LED C Mode {}", + ), + ), + ( + [gw_vars.OTGW], + OpenThermSensorEntityDescription( + key=gw_vars.OTGW_LED_D, + friendly_name_format="Gateway LED D Mode {}", + ), + ), + ( + [gw_vars.OTGW], + OpenThermSensorEntityDescription( + key=gw_vars.OTGW_LED_E, + friendly_name_format="Gateway LED E Mode {}", + ), + ), + ( + [gw_vars.OTGW], + OpenThermSensorEntityDescription( + key=gw_vars.OTGW_LED_F, + friendly_name_format="Gateway LED F Mode {}", + ), + ), + ( + [gw_vars.OTGW], + OpenThermSensorEntityDescription( + key=gw_vars.OTGW_GPIO_A, + friendly_name_format="Gateway GPIO A Mode {}", + ), + ), + ( + [gw_vars.OTGW], + OpenThermSensorEntityDescription( + key=gw_vars.OTGW_GPIO_B, + friendly_name_format="Gateway GPIO B Mode {}", + ), + ), + ( + [gw_vars.OTGW], + OpenThermSensorEntityDescription( + key=gw_vars.OTGW_SB_TEMP, + friendly_name_format="Gateway Setback Temperature {}", + device_class=SensorDeviceClass.TEMPERATURE, + state_class=SensorStateClass.MEASUREMENT, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + suggested_display_precision=SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION, + ), + ), + ( + [gw_vars.OTGW], + OpenThermSensorEntityDescription( + key=gw_vars.OTGW_SETP_OVRD_MODE, + friendly_name_format="Gateway Room Setpoint Override Mode {}", + ), + ), + ( + [gw_vars.OTGW], + OpenThermSensorEntityDescription( + key=gw_vars.OTGW_SMART_PWR, + friendly_name_format="Gateway Smart Power Mode {}", + ), + ), + ( + [gw_vars.OTGW], + OpenThermSensorEntityDescription( + key=gw_vars.OTGW_THRM_DETECT, + friendly_name_format="Gateway Thermostat Detection {}", + ), + ), + ( + [gw_vars.OTGW], + OpenThermSensorEntityDescription( + key=gw_vars.OTGW_VREF, + friendly_name_format="Gateway Reference Voltage Setting {}", + ), + ), +) async def async_setup_entry( @@ -28,77 +629,37 @@ async def async_setup_entry( async_add_entities( OpenThermSensor( gw_dev, - var, source, - info[0], - info[1], - info[2], - info[3], + description, ) - for var, info in SENSOR_INFO.items() - for source in info[4] + for sources, description in SENSOR_INFO + for source in sources ) -class OpenThermSensor(SensorEntity): +class OpenThermSensor(OpenThermEntity, SensorEntity): """Representation of an OpenTherm Gateway sensor.""" - _attr_should_poll = False - _attr_entity_registry_enabled_default = False - _attr_available = False + entity_description: OpenThermSensorEntityDescription def __init__( self, - gw_dev, - var, - source, - device_class, - unit, - friendly_name_format, - suggested_display_precision, - ): + gw_dev: OpenThermGatewayDevice, + source: str, + description: OpenThermSensorEntityDescription, + ) -> None: """Initialize the OpenTherm Gateway sensor.""" self.entity_id = async_generate_entity_id( - ENTITY_ID_FORMAT, f"{var}_{source}_{gw_dev.gw_id}", hass=gw_dev.hass + ENTITY_ID_FORMAT, + f"{description.key}_{source}_{gw_dev.gw_id}", + hass=gw_dev.hass, ) - self._gateway = gw_dev - self._var = var - self._source = source - self._attr_device_class = device_class - self._attr_native_unit_of_measurement = unit - if TRANSLATE_SOURCE[source] is not None: - friendly_name_format = ( - f"{friendly_name_format} ({TRANSLATE_SOURCE[source]})" - ) - self._attr_name = friendly_name_format.format(gw_dev.name) - self._unsub_updates = None - self._attr_unique_id = f"{gw_dev.gw_id}-{source}-{var}" - if suggested_display_precision: - self._attr_suggested_display_precision = suggested_display_precision - self._attr_device_info = DeviceInfo( - identifiers={(DOMAIN, gw_dev.gw_id)}, - manufacturer="Schelte Bron", - model="OpenTherm Gateway", - name=gw_dev.name, - sw_version=gw_dev.gw_version, - ) - - async def async_added_to_hass(self) -> None: - """Subscribe to updates from the component.""" - _LOGGER.debug("Added OpenTherm Gateway sensor %s", self._attr_name) - self._unsub_updates = async_dispatcher_connect( - self.hass, self._gateway.update_signal, self.receive_report - ) - - async def async_will_remove_from_hass(self) -> None: - """Unsubscribe from updates from the component.""" - _LOGGER.debug("Removing OpenTherm Gateway sensor %s", self._attr_name) - self._unsub_updates() + super().__init__(gw_dev, source, description) @callback - def receive_report(self, status): + def receive_report(self, status: dict[str, dict]) -> None: """Handle status updates from the component.""" self._attr_available = self._gateway.connected - value = status[self._source].get(self._var) + value = status[self._source].get(self.entity_description.key) self._attr_native_value = value self.async_write_ha_state()