From a3f3c87b39b7e7da8a9b99af1b295361f537ea40 Mon Sep 17 00:00:00 2001 From: johanzander Date: Wed, 18 Mar 2026 08:24:49 +0100 Subject: [PATCH] growatt_server: add EntityCategory.DIAGNOSTIC to diagnostic sensors (#165880) Co-authored-by: Claude Sonnet 4.6 --- .../growatt_server/quality_scale.yaml | 6 +- .../growatt_server/sensor/inverter.py | 13 ++++ .../components/growatt_server/sensor/sph.py | 13 ++++ .../growatt_server/sensor/storage.py | 5 ++ .../components/growatt_server/sensor/tlx.py | 15 ++++ .../growatt_server/snapshots/test_sensor.ambr | 70 +++++++++---------- tests/components/growatt_server/test_init.py | 2 +- 7 files changed, 84 insertions(+), 40 deletions(-) diff --git a/homeassistant/components/growatt_server/quality_scale.yaml b/homeassistant/components/growatt_server/quality_scale.yaml index 4857e738403..915079b4d69 100644 --- a/homeassistant/components/growatt_server/quality_scale.yaml +++ b/homeassistant/components/growatt_server/quality_scale.yaml @@ -46,13 +46,11 @@ rules: docs-troubleshooting: todo docs-use-cases: todo dynamic-devices: todo - entity-category: - status: todo - comment: Add EntityCategory.DIAGNOSTIC to temperature and other diagnostic sensors. Merge GrowattRequiredKeysMixin into GrowattSensorEntityDescription using kw_only=True. + entity-category: done entity-device-class: status: todo comment: Replace custom precision field with suggested_display_precision to preserve full data granularity. - entity-disabled-by-default: todo + entity-disabled-by-default: done entity-translations: done exception-translations: todo icon-translations: todo diff --git a/homeassistant/components/growatt_server/sensor/inverter.py b/homeassistant/components/growatt_server/sensor/inverter.py index 99c0256a6cd..2c36d846018 100644 --- a/homeassistant/components/growatt_server/sensor/inverter.py +++ b/homeassistant/components/growatt_server/sensor/inverter.py @@ -4,6 +4,7 @@ from __future__ import annotations from homeassistant.components.sensor import SensorDeviceClass, SensorStateClass from homeassistant.const import ( + EntityCategory, UnitOfElectricCurrent, UnitOfElectricPotential, UnitOfEnergy, @@ -131,6 +132,8 @@ INVERTER_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( device_class=SensorDeviceClass.VOLTAGE, state_class=SensorStateClass.MEASUREMENT, precision=1, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="inverter_inverter_reactive_amperage", @@ -140,6 +143,8 @@ INVERTER_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( device_class=SensorDeviceClass.CURRENT, state_class=SensorStateClass.MEASUREMENT, precision=1, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="inverter_frequency", @@ -149,6 +154,8 @@ INVERTER_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( device_class=SensorDeviceClass.FREQUENCY, state_class=SensorStateClass.MEASUREMENT, precision=1, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="inverter_current_wattage", @@ -167,6 +174,8 @@ INVERTER_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( device_class=SensorDeviceClass.POWER, state_class=SensorStateClass.MEASUREMENT, precision=1, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="inverter_ipm_temperature", @@ -176,6 +185,8 @@ INVERTER_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( device_class=SensorDeviceClass.TEMPERATURE, state_class=SensorStateClass.MEASUREMENT, precision=1, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="inverter_temperature", @@ -185,5 +196,7 @@ INVERTER_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( device_class=SensorDeviceClass.TEMPERATURE, state_class=SensorStateClass.MEASUREMENT, precision=1, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), ) diff --git a/homeassistant/components/growatt_server/sensor/sph.py b/homeassistant/components/growatt_server/sensor/sph.py index 57c38fd1f23..af3e05da57a 100644 --- a/homeassistant/components/growatt_server/sensor/sph.py +++ b/homeassistant/components/growatt_server/sensor/sph.py @@ -5,6 +5,7 @@ from __future__ import annotations from homeassistant.components.sensor import SensorDeviceClass, SensorStateClass from homeassistant.const import ( PERCENTAGE, + EntityCategory, UnitOfElectricPotential, UnitOfEnergy, UnitOfFrequency, @@ -90,6 +91,8 @@ SPH_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( native_unit_of_measurement=UnitOfFrequency.HERTZ, device_class=SensorDeviceClass.FREQUENCY, state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="sph_temperature_1", @@ -98,6 +101,8 @@ SPH_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( native_unit_of_measurement=UnitOfTemperature.CELSIUS, device_class=SensorDeviceClass.TEMPERATURE, state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="sph_temperature_2", @@ -106,6 +111,8 @@ SPH_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( native_unit_of_measurement=UnitOfTemperature.CELSIUS, device_class=SensorDeviceClass.TEMPERATURE, state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="sph_temperature_3", @@ -114,6 +121,8 @@ SPH_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( native_unit_of_measurement=UnitOfTemperature.CELSIUS, device_class=SensorDeviceClass.TEMPERATURE, state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="sph_temperature_4", @@ -122,6 +131,8 @@ SPH_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( native_unit_of_measurement=UnitOfTemperature.CELSIUS, device_class=SensorDeviceClass.TEMPERATURE, state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="sph_temperature_5", @@ -130,6 +141,8 @@ SPH_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( native_unit_of_measurement=UnitOfTemperature.CELSIUS, device_class=SensorDeviceClass.TEMPERATURE, state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), # Values from 'sph_energy' API call GrowattSensorEntityDescription( diff --git a/homeassistant/components/growatt_server/sensor/storage.py b/homeassistant/components/growatt_server/sensor/storage.py index 66f67c82e84..81d0c1b2088 100644 --- a/homeassistant/components/growatt_server/sensor/storage.py +++ b/homeassistant/components/growatt_server/sensor/storage.py @@ -5,6 +5,7 @@ from __future__ import annotations from homeassistant.components.sensor import SensorDeviceClass, SensorStateClass from homeassistant.const import ( PERCENTAGE, + EntityCategory, UnitOfElectricCurrent, UnitOfElectricPotential, UnitOfEnergy, @@ -217,6 +218,8 @@ STORAGE_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( device_class=SensorDeviceClass.FREQUENCY, state_class=SensorStateClass.MEASUREMENT, precision=2, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="storage_output_voltage", @@ -235,6 +238,8 @@ STORAGE_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( device_class=SensorDeviceClass.FREQUENCY, state_class=SensorStateClass.MEASUREMENT, precision=2, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="storage_current_PV", diff --git a/homeassistant/components/growatt_server/sensor/tlx.py b/homeassistant/components/growatt_server/sensor/tlx.py index e3689fbf7d1..bece130e32f 100644 --- a/homeassistant/components/growatt_server/sensor/tlx.py +++ b/homeassistant/components/growatt_server/sensor/tlx.py @@ -8,6 +8,7 @@ from __future__ import annotations from homeassistant.components.sensor import SensorDeviceClass, SensorStateClass from homeassistant.const import ( PERCENTAGE, + EntityCategory, UnitOfElectricCurrent, UnitOfElectricPotential, UnitOfEnergy, @@ -248,6 +249,8 @@ TLX_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( native_unit_of_measurement=UnitOfElectricPotential.VOLT, device_class=SensorDeviceClass.VOLTAGE, precision=1, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="tlx_frequency", @@ -256,6 +259,8 @@ TLX_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( native_unit_of_measurement=UnitOfFrequency.HERTZ, device_class=SensorDeviceClass.FREQUENCY, precision=1, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="tlx_current_wattage", @@ -273,6 +278,8 @@ TLX_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( native_unit_of_measurement=UnitOfTemperature.CELSIUS, device_class=SensorDeviceClass.TEMPERATURE, precision=1, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="tlx_temperature_2", @@ -281,6 +288,8 @@ TLX_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( native_unit_of_measurement=UnitOfTemperature.CELSIUS, device_class=SensorDeviceClass.TEMPERATURE, precision=1, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="tlx_temperature_3", @@ -289,6 +298,8 @@ TLX_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( native_unit_of_measurement=UnitOfTemperature.CELSIUS, device_class=SensorDeviceClass.TEMPERATURE, precision=1, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="tlx_temperature_4", @@ -297,6 +308,8 @@ TLX_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( native_unit_of_measurement=UnitOfTemperature.CELSIUS, device_class=SensorDeviceClass.TEMPERATURE, precision=1, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="tlx_temperature_5", @@ -305,6 +318,8 @@ TLX_SENSOR_TYPES: tuple[GrowattSensorEntityDescription, ...] = ( native_unit_of_measurement=UnitOfTemperature.CELSIUS, device_class=SensorDeviceClass.TEMPERATURE, precision=1, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, ), GrowattSensorEntityDescription( key="tlx_all_batteries_discharge_today", diff --git a/tests/components/growatt_server/snapshots/test_sensor.ambr b/tests/components/growatt_server/snapshots/test_sensor.ambr index 51cd95fb40a..e7ae64d8892 100644 --- a/tests/components/growatt_server/snapshots/test_sensor.ambr +++ b/tests/components/growatt_server/snapshots/test_sensor.ambr @@ -12,7 +12,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.min123456_ac_frequency', 'has_entity_name': True, 'hidden_by': None, @@ -2994,7 +2994,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.min123456_reactive_voltage', 'has_entity_name': True, 'hidden_by': None, @@ -3398,7 +3398,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.min123456_temperature_1', 'has_entity_name': True, 'hidden_by': None, @@ -3454,7 +3454,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.min123456_temperature_2', 'has_entity_name': True, 'hidden_by': None, @@ -3510,7 +3510,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.min123456_temperature_3', 'has_entity_name': True, 'hidden_by': None, @@ -3566,7 +3566,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.min123456_temperature_4', 'has_entity_name': True, 'hidden_by': None, @@ -3622,7 +3622,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.min123456_temperature_5', 'has_entity_name': True, 'hidden_by': None, @@ -4018,7 +4018,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.inv123456_ac_frequency', 'has_entity_name': True, 'hidden_by': None, @@ -4667,7 +4667,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.inv123456_intelligent_power_management_temperature', 'has_entity_name': True, 'hidden_by': None, @@ -4785,7 +4785,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.inv123456_inverter_temperature', 'has_entity_name': True, 'hidden_by': None, @@ -4962,7 +4962,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.inv123456_reactive_amperage', 'has_entity_name': True, 'hidden_by': None, @@ -5021,7 +5021,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.inv123456_reactive_voltage', 'has_entity_name': True, 'hidden_by': None, @@ -5080,7 +5080,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.inv123456_reactive_wattage', 'has_entity_name': True, 'hidden_by': None, @@ -7623,7 +7623,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.sto123456_ac_input_frequency', 'has_entity_name': True, 'hidden_by': None, @@ -7741,7 +7741,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.sto123456_ac_output_frequency', 'has_entity_name': True, 'hidden_by': None, @@ -10297,7 +10297,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.tlx123456_ac_frequency', 'has_entity_name': True, 'hidden_by': None, @@ -13279,7 +13279,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.tlx123456_reactive_voltage', 'has_entity_name': True, 'hidden_by': None, @@ -13683,7 +13683,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.tlx123456_temperature_1', 'has_entity_name': True, 'hidden_by': None, @@ -13739,7 +13739,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.tlx123456_temperature_2', 'has_entity_name': True, 'hidden_by': None, @@ -13795,7 +13795,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.tlx123456_temperature_3', 'has_entity_name': True, 'hidden_by': None, @@ -13851,7 +13851,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.tlx123456_temperature_4', 'has_entity_name': True, 'hidden_by': None, @@ -13907,7 +13907,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.tlx123456_temperature_5', 'has_entity_name': True, 'hidden_by': None, @@ -13965,7 +13965,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.sph123456_ac_frequency', 'has_entity_name': True, 'hidden_by': None, @@ -15651,7 +15651,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.sph123456_temperature_1', 'has_entity_name': True, 'hidden_by': None, @@ -15710,7 +15710,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.sph123456_temperature_2', 'has_entity_name': True, 'hidden_by': None, @@ -15769,7 +15769,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.sph123456_temperature_3', 'has_entity_name': True, 'hidden_by': None, @@ -15828,7 +15828,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.sph123456_temperature_4', 'has_entity_name': True, 'hidden_by': None, @@ -15887,7 +15887,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.sph123456_temperature_5', 'has_entity_name': True, 'hidden_by': None, @@ -16622,7 +16622,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.tlx123456_ac_frequency', 'has_entity_name': True, 'hidden_by': None, @@ -19604,7 +19604,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.tlx123456_reactive_voltage', 'has_entity_name': True, 'hidden_by': None, @@ -20008,7 +20008,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.tlx123456_temperature_1', 'has_entity_name': True, 'hidden_by': None, @@ -20064,7 +20064,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.tlx123456_temperature_2', 'has_entity_name': True, 'hidden_by': None, @@ -20120,7 +20120,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.tlx123456_temperature_3', 'has_entity_name': True, 'hidden_by': None, @@ -20176,7 +20176,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.tlx123456_temperature_4', 'has_entity_name': True, 'hidden_by': None, @@ -20232,7 +20232,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'sensor', - 'entity_category': None, + 'entity_category': , 'entity_id': 'sensor.tlx123456_temperature_5', 'has_entity_name': True, 'hidden_by': None, diff --git a/tests/components/growatt_server/test_init.py b/tests/components/growatt_server/test_init.py index 9b15b522c19..25b38f6389d 100644 --- a/tests/components/growatt_server/test_init.py +++ b/tests/components/growatt_server/test_init.py @@ -254,7 +254,7 @@ async def test_classic_api_coordinator_auth_failed_triggers_reauth( and flow["context"]["entry_id"] == mock_config_entry_classic.entry_id for flow in flows ) - assert hass.states.get("sensor.tlx123456_ac_frequency").state == STATE_UNAVAILABLE + assert hass.states.get("sensor.tlx123456_output_power").state == STATE_UNAVAILABLE async def test_classic_api_setup(