From cac53894f14db1934511389377cc83c974f43e9f Mon Sep 17 00:00:00 2001 From: Mawoka Date: Tue, 4 Jun 2024 19:04:53 +0200 Subject: [PATCH 1/5] Add number input for apsystems --- .../components/apsystems/__init__.py | 5 +- homeassistant/components/apsystems/number.py | 56 +++++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 homeassistant/components/apsystems/number.py diff --git a/homeassistant/components/apsystems/__init__.py b/homeassistant/components/apsystems/__init__.py index 0231d2975d801a..3bc0dcae87df72 100644 --- a/homeassistant/components/apsystems/__init__.py +++ b/homeassistant/components/apsystems/__init__.py @@ -12,7 +12,7 @@ from .coordinator import ApSystemsDataCoordinator -PLATFORMS: list[Platform] = [Platform.SENSOR] +PLATFORMS: list[Platform] = [Platform.NUMBER, Platform.SENSOR] @dataclass @@ -20,6 +20,7 @@ class ApSystemsData: """Store runtime data.""" coordinator: ApSystemsDataCoordinator + api: APsystemsEZ1M device_id: str @@ -33,7 +34,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ApSystemsConfigEntry) -> await coordinator.async_config_entry_first_refresh() assert entry.unique_id entry.runtime_data = ApSystemsData( - coordinator=coordinator, device_id=entry.unique_id + coordinator=coordinator, api=api, device_id=entry.unique_id ) await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) diff --git a/homeassistant/components/apsystems/number.py b/homeassistant/components/apsystems/number.py new file mode 100644 index 00000000000000..e7e84afe7cc81c --- /dev/null +++ b/homeassistant/components/apsystems/number.py @@ -0,0 +1,56 @@ +"""The output limit which can be set in the APsystems local API integration.""" + +from __future__ import annotations + +from homeassistant.components.number import NumberDeviceClass, NumberEntity, NumberMode +from homeassistant.const import UnitOfPower +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddEntitiesCallback +from homeassistant.helpers.typing import DiscoveryInfoType + +from . import ApSystemsConfigEntry, ApSystemsData +from .entity import ApSystemsEntity + + +async def async_setup_entry( + hass: HomeAssistant, + config_entry: ApSystemsConfigEntry, + add_entities: AddEntitiesCallback, + discovery_info: DiscoveryInfoType | None = None, +) -> None: + """Set up the sensor platform.""" + config = config_entry.runtime_data + + add_entities([ApSystemsMaxOutputNumber(config)]) + + +class ApSystemsMaxOutputNumber(ApSystemsEntity, NumberEntity): + """Base sensor to be used with description.""" + + _attr_native_max_value = 800 + _attr_native_min_value = 30 + _attr_native_step = 1 + _attr_device_class = NumberDeviceClass.POWER + _attr_mode = NumberMode.BOX + _attr_native_unit_of_measurement = UnitOfPower.WATT + + def __init__( + self, + data: ApSystemsData, + ) -> None: + """Initialize the sensor.""" + super().__init__(data) + self._api = data.api + self._attr_unique_id = f"{data.device_id}_output_limit" + + async def async_update(self) -> None: + """Set the state with the value fetched from the inverter.""" + self._attr_native_value = float(await self._api.get_max_power()) + + async def async_set_native_value(self, value: float) -> None: + """Set the desired output power.""" + value_as_int = int(value) + await self._api.set_max_power(value_as_int) + self._attr_native_value = float( + value_as_int + ) # Doing that to eliminate the chance of rounding disparaties in contrast to using the input directly From 2df323438874ec6edf2fd0c8fdf930507b144588 Mon Sep 17 00:00:00 2001 From: Mawoka Date: Tue, 4 Jun 2024 19:07:20 +0200 Subject: [PATCH 2/5] Exclude number from apsystems from coverage --- .coveragerc | 1 + 1 file changed, 1 insertion(+) diff --git a/.coveragerc b/.coveragerc index 034598d2044597..6ffac106dfe941 100644 --- a/.coveragerc +++ b/.coveragerc @@ -90,6 +90,7 @@ omit = homeassistant/components/apsystems/__init__.py homeassistant/components/apsystems/coordinator.py homeassistant/components/apsystems/entity.py + homeassistant/components/apsystems/number.py homeassistant/components/apsystems/sensor.py homeassistant/components/aqualogic/* homeassistant/components/aquostv/media_player.py From 759b8d528ad0c47b4980506cd2f8bcfcec981b37 Mon Sep 17 00:00:00 2001 From: Mawoka Date: Tue, 4 Jun 2024 19:40:59 +0200 Subject: [PATCH 3/5] Remove unnecessary int-float conversion in apsystems number --- homeassistant/components/apsystems/number.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/homeassistant/components/apsystems/number.py b/homeassistant/components/apsystems/number.py index e7e84afe7cc81c..5c58cb93f99393 100644 --- a/homeassistant/components/apsystems/number.py +++ b/homeassistant/components/apsystems/number.py @@ -51,6 +51,4 @@ async def async_set_native_value(self, value: float) -> None: """Set the desired output power.""" value_as_int = int(value) await self._api.set_max_power(value_as_int) - self._attr_native_value = float( - value_as_int - ) # Doing that to eliminate the chance of rounding disparaties in contrast to using the input directly + self._attr_native_value = value From 26c0ca683bdd3daacec4d920ddd24a42b1dddaf4 Mon Sep 17 00:00:00 2001 From: Mawoka Date: Wed, 5 Jun 2024 14:50:03 +0200 Subject: [PATCH 4/5] Remove unnecessary int-float conversion in apsystems number and redundant and single use variables --- homeassistant/components/apsystems/__init__.py | 3 +-- homeassistant/components/apsystems/number.py | 11 ++++------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/apsystems/__init__.py b/homeassistant/components/apsystems/__init__.py index 3bc0dcae87df72..2df267dda0baaa 100644 --- a/homeassistant/components/apsystems/__init__.py +++ b/homeassistant/components/apsystems/__init__.py @@ -20,7 +20,6 @@ class ApSystemsData: """Store runtime data.""" coordinator: ApSystemsDataCoordinator - api: APsystemsEZ1M device_id: str @@ -34,7 +33,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ApSystemsConfigEntry) -> await coordinator.async_config_entry_first_refresh() assert entry.unique_id entry.runtime_data = ApSystemsData( - coordinator=coordinator, api=api, device_id=entry.unique_id + coordinator=coordinator, device_id=entry.unique_id ) await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) diff --git a/homeassistant/components/apsystems/number.py b/homeassistant/components/apsystems/number.py index 5c58cb93f99393..6b58c097522444 100644 --- a/homeassistant/components/apsystems/number.py +++ b/homeassistant/components/apsystems/number.py @@ -19,9 +19,8 @@ async def async_setup_entry( discovery_info: DiscoveryInfoType | None = None, ) -> None: """Set up the sensor platform.""" - config = config_entry.runtime_data - add_entities([ApSystemsMaxOutputNumber(config)]) + add_entities([ApSystemsMaxOutputNumber(config_entry.runtime_data)]) class ApSystemsMaxOutputNumber(ApSystemsEntity, NumberEntity): @@ -40,15 +39,13 @@ def __init__( ) -> None: """Initialize the sensor.""" super().__init__(data) - self._api = data.api + self._api = data.coordinator.api self._attr_unique_id = f"{data.device_id}_output_limit" async def async_update(self) -> None: """Set the state with the value fetched from the inverter.""" - self._attr_native_value = float(await self._api.get_max_power()) + self._attr_native_value = await self._api.get_max_power() async def async_set_native_value(self, value: float) -> None: """Set the desired output power.""" - value_as_int = int(value) - await self._api.set_max_power(value_as_int) - self._attr_native_value = value + self._attr_native_value = await self._api.set_max_power(int(value)) From b4386bd504e08055a0c3a93bbf7a4bdd891bf0e0 Mon Sep 17 00:00:00 2001 From: Mawoka Date: Wed, 5 Jun 2024 14:54:30 +0200 Subject: [PATCH 5/5] Add translation for apsystems number --- homeassistant/components/apsystems/number.py | 1 + homeassistant/components/apsystems/strings.json | 3 +++ 2 files changed, 4 insertions(+) diff --git a/homeassistant/components/apsystems/number.py b/homeassistant/components/apsystems/number.py index 6b58c097522444..f9b535d7d6a27f 100644 --- a/homeassistant/components/apsystems/number.py +++ b/homeassistant/components/apsystems/number.py @@ -32,6 +32,7 @@ class ApSystemsMaxOutputNumber(ApSystemsEntity, NumberEntity): _attr_device_class = NumberDeviceClass.POWER _attr_mode = NumberMode.BOX _attr_native_unit_of_measurement = UnitOfPower.WATT + _attr_translation_key = "max_output" def __init__( self, diff --git a/homeassistant/components/apsystems/strings.json b/homeassistant/components/apsystems/strings.json index aa919cd65b1c2b..cfd24675311513 100644 --- a/homeassistant/components/apsystems/strings.json +++ b/homeassistant/components/apsystems/strings.json @@ -25,6 +25,9 @@ "today_production": { "name": "Production of today" }, "today_production_p1": { "name": "Production of today from P1" }, "today_production_p2": { "name": "Production of today from P2" } + }, + "number": { + "max_output": { "name": "Max output" } } } }