diff --git a/homeassistant/components/opentherm_gw/const.py b/homeassistant/components/opentherm_gw/const.py index 7dc2d206912..82d982b2fa9 100644 --- a/homeassistant/components/opentherm_gw/const.py +++ b/homeassistant/components/opentherm_gw/const.py @@ -51,6 +51,8 @@ TRANSLATE_SOURCE = { gw_vars.THERMOSTAT: "Thermostat", } +SENSOR_FLOAT_SUGGESTED_DISPLAY_PRECISION = 1 + BINARY_SENSOR_INFO: dict[str, list] = { # [device_class, friendly_name format, [status source, ...]] gw_vars.DATA_MASTER_CH_ENABLED: [ @@ -214,324 +216,453 @@ BINARY_SENSOR_INFO: dict[str, list] = { } SENSOR_INFO: dict[str, list] = { - # [device_class, unit, friendly_name, [status source, ...]] + # [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: [ None, f"{UnitOfVolume.LITERS}/{UnitOfTime.MINUTES}", "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 {}", [gw_vars.OTGW]], + 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_ABOUT: [None, None, "Gateway Firmware Version {}", [gw_vars.OTGW]], - gw_vars.OTGW_BUILD: [None, None, "Gateway Firmware Build {}", [gw_vars.OTGW]], - gw_vars.OTGW_CLOCKMHZ: [None, None, "Gateway Clock Speed {}", [gw_vars.OTGW]], - gw_vars.OTGW_LED_A: [None, None, "Gateway LED A Mode {}", [gw_vars.OTGW]], - gw_vars.OTGW_LED_B: [None, None, "Gateway LED B Mode {}", [gw_vars.OTGW]], - gw_vars.OTGW_LED_C: [None, None, "Gateway LED C Mode {}", [gw_vars.OTGW]], - gw_vars.OTGW_LED_D: [None, None, "Gateway LED D Mode {}", [gw_vars.OTGW]], - gw_vars.OTGW_LED_E: [None, None, "Gateway LED E Mode {}", [gw_vars.OTGW]], - gw_vars.OTGW_LED_F: [None, None, "Gateway LED F Mode {}", [gw_vars.OTGW]], - gw_vars.OTGW_GPIO_A: [None, None, "Gateway GPIO A Mode {}", [gw_vars.OTGW]], - gw_vars.OTGW_GPIO_B: [None, None, "Gateway GPIO B Mode {}", [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_SMART_PWR: [None, None, "Gateway Smart Power Mode {}", [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/sensor.py b/homeassistant/components/opentherm_gw/sensor.py index 09fbb0ef6ee..5848d50ad95 100644 --- a/homeassistant/components/opentherm_gw/sensor.py +++ b/homeassistant/components/opentherm_gw/sensor.py @@ -28,7 +28,8 @@ async def async_setup_entry( device_class = info[0] unit = info[1] friendly_name_format = info[2] - status_sources = info[3] + suggested_display_precision = info[3] + status_sources = info[4] for source in status_sources: sensors.append( @@ -39,6 +40,7 @@ async def async_setup_entry( device_class, unit, friendly_name_format, + suggested_display_precision, ) ) @@ -51,7 +53,16 @@ class OpenThermSensor(SensorEntity): _attr_should_poll = False _attr_entity_registry_enabled_default = False - def __init__(self, gw_dev, var, source, device_class, unit, friendly_name_format): + def __init__( + self, + gw_dev, + var, + source, + device_class, + unit, + friendly_name_format, + suggested_display_precision, + ): """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 @@ -68,6 +79,8 @@ class OpenThermSensor(SensorEntity): 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", @@ -97,7 +110,5 @@ class OpenThermSensor(SensorEntity): def receive_report(self, status): """Handle status updates from the component.""" value = status[self._source].get(self._var) - if isinstance(value, float): - value = f"{value:2.1f}" self._attr_native_value = value self.async_write_ha_state()