Skip to content

Commit d9d780e

Browse files
authored
Add files via upload
Release 2.5.1
1 parent 7761339 commit d9d780e

File tree

5 files changed

+69
-26
lines changed

5 files changed

+69
-26
lines changed

custom_components/apsystems_ecu_reader/__init__.py

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,14 @@
1818
DataUpdateCoordinator,
1919
UpdateFailed,
2020
)
21-
from homeassistant.helpers.event import async_track_state_change_event
2221

2322
from .const import DOMAIN
2423
from .ecu_api import APsystemsSocket, APsystemsInvalidData
25-
from .gui_helpers import set_inverter_state, set_zero_export, reboot_ecu, inverter_max_power
24+
from .gui_helpers import set_inverter_state, set_zero_export, reboot_ecu, set_inverter_max_power
2625

2726
_LOGGER = logging.getLogger(__name__)
2827

29-
PLATFORMS = ["sensor", "binary_sensor", "switch"]
28+
PLATFORMS = ["sensor", "binary_sensor", "switch", "number"]
3029

3130
class ECUREADER:
3231
"""ECU Reader"""
@@ -40,6 +39,11 @@ def __init__(self, ipaddr, wifi_ssid, wifi_password, show_graphs):
4039
self.data_from_cache_count = 0
4140
self.cached_data = {}
4241

42+
# called from number.py
43+
async def set_inverter_max_power(self, inverter_uid, max_panel_power):
44+
"""Set the max power for an inverter."""
45+
return await set_inverter_max_power(self.ipaddr, inverter_uid, max_panel_power)
46+
4347
# called from switch.py
4448
async def set_inverter_state(self, inverter_id, state):
4549
"""Set the on/off state of an inverter. 1=on, 2=off"""
@@ -97,7 +101,7 @@ async def update_listener(hass, config):
97101

98102

99103
async def async_setup_entry(hass, config):
100-
"""Setup APsystems platform."""
104+
""" Setup APsystems platform """
101105
hass.data.setdefault(DOMAIN, {})
102106
interval = timedelta(seconds=config.data.get("scan_interval", 300))
103107
ecu = ECUREADER(
@@ -108,13 +112,14 @@ async def async_setup_entry(hass, config):
108112
)
109113

110114
async def do_ecu_update():
111-
"""Pass current port_retries value dynamically."""
115+
""" Pass current port_retries value dynamically. """
112116
return await ecu.update(
113117
config.data.get("port_retries", 2),
114118
config.data.get("cache_reboot", 3),
115119
config.data.get("show_graphs", True)
116120
)
117121

122+
118123
coordinator = DataUpdateCoordinator(
119124
hass,
120125
_LOGGER,
@@ -138,7 +143,7 @@ async def do_ecu_update():
138143
# If not, the user should be notified and devices should not be created.
139144
if not ecu.ecu.ecu_id:
140145
_LOGGER.error(
141-
"Unable to connect with ECU @ %s. Check IP-Address or wait "
146+
"Unable to connect with ECU @ %s. Check IP-Address or wait "
142147
"10 minutes because the ECU might be recovering from reboot.",
143148
config.data["ecu_host"]
144149
)
@@ -171,25 +176,9 @@ async def do_ecu_update():
171176
# Forward platform setup requests.
172177
await hass.config_entries.async_forward_entry_setups(config, PLATFORMS)
173178
config.async_on_unload(config.add_update_listener(update_listener))
174-
175-
# Add listeners for state changes of the input_number entities
176-
async def max_panel_power_listener(event):
177-
"""Handle state changes of the input_number entity."""
178-
new_state = event.data.get("new_state")
179-
if new_state is None:
180-
return
181-
new_value = new_state.state
182-
await inverter_max_power(ecu.ipaddr, event.data["entity_id"].split('.')[-1], new_value)
183-
184-
# Create listeners for each inverter UID
185-
max_panel_power_entity_ids = [
186-
f"max_panel_power.{uid}" for uid in inverters.keys()
187-
]
188-
_LOGGER.debug("Adding listeners for input_number entities: %s",max_panel_power_entity_ids)
189-
for entity_id in max_panel_power_entity_ids:
190-
async_track_state_change_event(hass, entity_id, max_panel_power_listener)
191179
return True
192180

181+
193182
async def async_remove_config_entry_device(hass, _, device_entry) -> bool:
194183
""" Handle device removal """
195184
if device_entry:

custom_components/apsystems_ecu_reader/ecu_api.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,10 @@ def finalize_data(self, show_graphs):
173173
# apply filters for ECU firmware bug where sometimes values are zero
174174
if self.qty_of_inverters:
175175
self.data["qty_of_inverters"] = self.qty_of_inverters
176-
if self.today_energy and self.qty_of_online_inverters:
176+
if (
177+
self.today_energy != 0 or
178+
(self.today_energy == 0 and self.qty_of_online_inverters == 0)
179+
):
177180
self.data["today_energy"] = self.today_energy
178181
if self.lifetime_energy:
179182
self.data["lifetime_energy"] = self.lifetime_energy

custom_components/apsystems_ecu_reader/gui_helpers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ async def set_zero_export(ipaddr, state):
5656
"This switch is only compatible with ECU-C models", err
5757
)
5858

59-
async def inverter_max_power(ipaddr, inverter_uid, max_panel_power):
59+
async def set_inverter_max_power(ipaddr, inverter_uid, max_panel_power):
6060
"""Set the max power for an inverter."""
6161
action = {
6262
"id": inverter_uid,
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
"""Number platform for APsystems ECU Reader."""
2+
3+
from homeassistant.components.number import RestoreNumber
4+
from homeassistant.helpers.update_coordinator import CoordinatorEntity
5+
6+
from .const import DOMAIN
7+
8+
async def async_setup_entry(hass, _, async_add_entities):
9+
"""Set up the number platform."""
10+
coordinator = hass.data[DOMAIN]["coordinator"]
11+
ecu = hass.data[DOMAIN]["ecu"]
12+
13+
entities = []
14+
for inverter_id, inverter_data in coordinator.data.get("inverters", {}).items():
15+
entities.append(InverterMaxPwrNumber(coordinator, ecu, inverter_id, inverter_data))
16+
17+
async_add_entities(entities, True)
18+
19+
class InverterMaxPwrNumber(CoordinatorEntity, RestoreNumber):
20+
"""Representation of an Inverter_MaxPwr Number entity."""
21+
22+
#def set_native_value(self, value: float) -> None:
23+
# """Set new value."""
24+
# self._attr_native_value = value
25+
# self.async_write_ha_state()
26+
27+
def __init__(self, coordinator, ecu, inverter_id, inverter_data):
28+
"""Initialize the number entity."""
29+
super().__init__(coordinator)
30+
self.ecu = ecu
31+
self.inverter_id = inverter_id
32+
self.inverter_data = inverter_data
33+
self._attr_name = f"Inverter {inverter_id} Maxpwr"
34+
self._attr_unique_id = f"{DOMAIN}_inverter_{inverter_id}_maxpwr"
35+
self._attr_native_min_value = 20
36+
self._attr_native_max_value = 500
37+
self._attr_native_step = 1
38+
self._attr_native_value = inverter_data.get("number_value", 0)
39+
self._attr_device_class = "power" # Set device class
40+
self._attr_mode = "slider" # Set mode to slider
41+
42+
async def async_set_native_value(self, value: float):
43+
"""Update the current value."""
44+
await self.ecu.set_inverter_max_power(self.inverter_id, value)
45+
self._attr_native_value = value
46+
self.async_write_ha_state()
47+
48+
async def async_added_to_hass(self):
49+
"""Handle entity which value will be restored."""
50+
await super().async_added_to_hass()
51+
if (last_state := await self.async_get_last_state()) is not None:
52+
self._attr_native_value = last_state.state

custom_components/apsystems_ecu_reader/sensor.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
CACHE_COUNTER_ICON
3737
)
3838

39-
4039
_LOGGER = logging.getLogger(__name__)
4140

4241
async def async_setup_entry(hass, _, add_entities):

0 commit comments

Comments
 (0)