From c82c295eedf9c6745e8465ea4e69ea55c625a952 Mon Sep 17 00:00:00 2001 From: Dave T <17680170+davet2001@users.noreply.github.com> Date: Sat, 23 Mar 2024 21:52:22 +0000 Subject: [PATCH] Add more sensors to aurora_abb_powerone (#114074) --- .../aurora_abb_powerone/coordinator.py | 8 +++- .../components/aurora_abb_powerone/sensor.py | 29 +++++++++++++++ .../aurora_abb_powerone/strings.json | 6 +++ .../aurora_abb_powerone/test_sensor.py | 37 ++++++++++++++++++- 4 files changed, 78 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/aurora_abb_powerone/coordinator.py b/homeassistant/components/aurora_abb_powerone/coordinator.py index 68888a96603..0b4cea0f8b4 100644 --- a/homeassistant/components/aurora_abb_powerone/coordinator.py +++ b/homeassistant/components/aurora_abb_powerone/coordinator.py @@ -36,8 +36,11 @@ class AuroraAbbDataUpdateCoordinator(DataUpdateCoordinator[dict[str, float]]): try: self.client.connect() - # read ADC channel 3 (grid power output) + # See command 59 in the protocol manual linked in __init__.py + grid_voltage = self.client.measure(1, True) + grid_current = self.client.measure(2, True) power_watts = self.client.measure(3, True) + frequency = self.client.measure(4) temperature_c = self.client.measure(21) energy_wh = self.client.cumulated_energy(5) [alarm, *_] = self.client.alarms() @@ -57,7 +60,10 @@ class AuroraAbbDataUpdateCoordinator(DataUpdateCoordinator[dict[str, float]]): ) sleep(1) else: + data["grid_voltage"] = round(grid_voltage, 1) + data["grid_current"] = round(grid_current, 1) data["instantaneouspower"] = round(power_watts, 1) + data["grid_frequency"] = round(frequency, 1) data["temp"] = round(temperature_c, 1) data["totalenergy"] = round(energy_wh / 1000, 2) data["alarm"] = alarm diff --git a/homeassistant/components/aurora_abb_powerone/sensor.py b/homeassistant/components/aurora_abb_powerone/sensor.py index 63e822db44f..49d56eb6b24 100644 --- a/homeassistant/components/aurora_abb_powerone/sensor.py +++ b/homeassistant/components/aurora_abb_powerone/sensor.py @@ -18,7 +18,10 @@ from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( ATTR_SERIAL_NUMBER, EntityCategory, + UnitOfElectricCurrent, + UnitOfElectricPotential, UnitOfEnergy, + UnitOfFrequency, UnitOfPower, UnitOfTemperature, ) @@ -42,6 +45,32 @@ _LOGGER = logging.getLogger(__name__) ALARM_STATES = list(AuroraMapping.ALARM_STATES.values()) SENSOR_TYPES = [ + SensorEntityDescription( + key="grid_voltage", + device_class=SensorDeviceClass.VOLTAGE, + entity_category=EntityCategory.DIAGNOSTIC, + native_unit_of_measurement=UnitOfElectricPotential.VOLT, + state_class=SensorStateClass.MEASUREMENT, + translation_key="grid_voltage", + entity_registry_enabled_default=False, + ), + SensorEntityDescription( + key="grid_current", + device_class=SensorDeviceClass.CURRENT, + entity_category=EntityCategory.DIAGNOSTIC, + native_unit_of_measurement=UnitOfElectricCurrent.AMPERE, + state_class=SensorStateClass.MEASUREMENT, + translation_key="grid_current", + entity_registry_enabled_default=False, + ), + SensorEntityDescription( + key="grid_frequency", + device_class=SensorDeviceClass.FREQUENCY, + entity_category=EntityCategory.DIAGNOSTIC, + native_unit_of_measurement=UnitOfFrequency.HERTZ, + state_class=SensorStateClass.MEASUREMENT, + entity_registry_enabled_default=False, + ), SensorEntityDescription( key="alarm", device_class=SensorDeviceClass.ENUM, diff --git a/homeassistant/components/aurora_abb_powerone/strings.json b/homeassistant/components/aurora_abb_powerone/strings.json index 63ea1cfefd4..551c6dea3ec 100644 --- a/homeassistant/components/aurora_abb_powerone/strings.json +++ b/homeassistant/components/aurora_abb_powerone/strings.json @@ -21,6 +21,12 @@ }, "entity": { "sensor": { + "grid_voltage": { + "name": "Grid voltage" + }, + "grid_current": { + "name": "Grid current" + }, "alarm": { "name": "Alarm status" }, diff --git a/tests/components/aurora_abb_powerone/test_sensor.py b/tests/components/aurora_abb_powerone/test_sensor.py index 32e96df7fac..d40f11ef076 100644 --- a/tests/components/aurora_abb_powerone/test_sensor.py +++ b/tests/components/aurora_abb_powerone/test_sensor.py @@ -14,8 +14,10 @@ from homeassistant.components.aurora_abb_powerone.const import ( DOMAIN, SCAN_INTERVAL, ) +from homeassistant.config_entries import ConfigEntryState from homeassistant.const import ATTR_SERIAL_NUMBER, CONF_ADDRESS, CONF_PORT from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_registry import EntityRegistry, RegistryEntryDisabler from tests.common import MockConfigEntry, async_fire_time_changed @@ -30,7 +32,10 @@ TEST_CONFIG = { def _simulated_returns(index, global_measure=None): returns = { + 1: 235.9476, # voltage + 2: 2.7894, # current 3: 45.678, # power + 4: 50.789, # frequency 21: 9.876, # temperature 5: 12345, # energy } @@ -56,7 +61,7 @@ def _mock_config_entry(): ) -async def test_sensors(hass: HomeAssistant) -> None: +async def test_sensors(hass: HomeAssistant, entity_registry: EntityRegistry) -> None: """Test data coming back from inverter.""" mock_entry = _mock_config_entry() @@ -97,6 +102,36 @@ async def test_sensors(hass: HomeAssistant) -> None: assert energy assert energy.state == "12.35" + # Test the 'disabled by default' sensors. + sensors = [ + ("sensor.mydevicename_grid_voltage", "235.9"), + ("sensor.mydevicename_grid_current", "2.8"), + ("sensor.mydevicename_frequency", "50.8"), + ] + for entity_id, _ in sensors: + assert not hass.states.get(entity_id) + assert ( + entry := entity_registry.async_get(entity_id) + ), f"Entity registry entry for {entity_id} is missing" + assert entry.disabled + assert entry.disabled_by is RegistryEntryDisabler.INTEGRATION + + # re-enable it + entity_registry.async_update_entity(entity_id=entity_id, disabled_by=None) + + # must reload the integration when enabling an entity + await hass.config_entries.async_unload(mock_entry.entry_id) + await hass.async_block_till_done() + assert mock_entry.state is ConfigEntryState.NOT_LOADED + mock_entry.add_to_hass(hass) + await hass.config_entries.async_setup(mock_entry.entry_id) + await hass.async_block_till_done() + + for entity_id, value in sensors: + item = hass.states.get(entity_id) + assert item + assert item.state == value + async def test_sensor_dark(hass: HomeAssistant, freezer: FrozenDateTimeFactory) -> None: """Test that darkness (no comms) is handled correctly."""