Skip to content

Commit a76943f

Browse files
authored
Merge pull request #77 from RustyDust/serial_hotfix
Hotfix for missing serial number, closes #76
2 parents b82a963 + 5c1536d commit a76943f

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

custom_components/sonnenbatterie/__init__.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
import homeassistant.helpers.config_validation as cv
55
import voluptuous as vol
66
from homeassistant.config_entries import ConfigEntry
7+
from homeassistant.const import CONF_USERNAME, CONF_PASSWORD, CONF_IP_ADDRESS
78
from homeassistant.core import (
89
HomeAssistant, SupportsResponse,
910
)
1011
from homeassistant.exceptions import ConfigEntryNotReady
12+
from sonnenbatterie import AsyncSonnenBatterie
1113

1214
from .const import *
1315
from .coordinator import SonnenbatterieCoordinator
@@ -46,6 +48,15 @@
4648
)
4749

4850

51+
async def _get_serial_number(config_entry: ConfigEntry) -> str:
52+
sb_conn = AsyncSonnenBatterie(config_entry.data.get(CONF_USERNAME),
53+
config_entry.data.get(CONF_PASSWORD),
54+
config_entry.data.get(CONF_IP_ADDRESS))
55+
await sb_conn.logout()
56+
sysdata = await sb_conn.get_systemdata()
57+
await sb_conn.logout()
58+
return sysdata.get("DE_Ticket_Number", "sru-unknown")
59+
4960
# noinspection PyUnusedLocal
5061
async def async_setup(hass, config):
5162
"""Set up using YAML is not supported by this integration."""
@@ -58,9 +69,19 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> b
5869
if DOMAIN not in hass.data:
5970
hass.data.setdefault(DOMAIN, {})
6071

72+
# Fix missing serial number
73+
serial_number = config_entry.data.get(CONF_SERIAL_NUMBER)
74+
if serial_number is None:
75+
LOGGER.debug("No serial number provided, trying to determine from Sonnenbatterie")
76+
serial_number = await _get_serial_number(config_entry)
77+
_config_data = config_entry.data.copy()
78+
_config_data[CONF_SERIAL_NUMBER] = serial_number
79+
hass.config_entries.async_update_entry(config_entry, data=_config_data)
80+
LOGGER.debug(f"serial_number: {serial_number}")
81+
6182
# init the master coordinator
83+
sb_coordinator = SonnenbatterieCoordinator(hass, config_entry, serial_number)
6284

63-
sb_coordinator = SonnenbatterieCoordinator(hass, config_entry)
6485
# calls SonnenbatterieCoordinator._async_update_data()
6586
await sb_coordinator.async_refresh()
6687
if not sb_coordinator.last_update_success:

custom_components/sonnenbatterie/coordinator.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
class SonnenbatterieCoordinator(DataUpdateCoordinator):
1616
"""Class to manage fetching Sonnenbatteries data."""
1717

18-
def __init__(self, hass: HomeAssistant, config_entry: ConfigEntry):
19-
LOGGER.debug(f"Initializing SonnenbatterieCoordinator: {config_entry.data}")
18+
def __init__(self, hass: HomeAssistant, config_entry: ConfigEntry, serial: str) -> None:
19+
LOGGER.info(f"Initializing SonnenbatterieCoordinator: {config_entry.data}")
2020

2121
""" private attributes """
2222
self._batt_reserved_factor = 7.0 # fixed value, reseved percentage of total installed power for internal use
@@ -28,10 +28,11 @@ def __init__(self, hass: HomeAssistant, config_entry: ConfigEntry):
2828
""" public attributes """
2929
self.latestData = {}
3030
self.name = config_entry.title
31-
self.serial = config_entry.data.get(CONF_SERIAL_NUMBER, "unknown")
31+
self.serial = serial
3232
self.sbconn = AsyncSonnenBatterie(username=self._config_entry.data[CONF_USERNAME],
3333
password=self._config_entry.data[CONF_PASSWORD],
3434
ipaddress=self._config_entry.data[CONF_IP_ADDRESS])
35+
3536
super().__init__(hass,
3637
LOGGER,
3738
name=DOMAIN,
@@ -41,14 +42,15 @@ def __init__(self, hass: HomeAssistant, config_entry: ConfigEntry):
4142
def device_info(self) -> DeviceInfo:
4243
system_data = self.latestData["battery_system"]["battery_system"]
4344
system_info = self.latestData["system_data"]
45+
4446
# noinspection HttpUrlsUsage
4547
return DeviceInfo(
4648
identifiers={(DOMAIN, self._config_entry.entry_id)},
4749
configuration_url=f"http://{self._config_entry.data[CONF_IP_ADDRESS]}/",
4850
manufacturer="Sonnen",
4951
model=system_info.get("ERP_ArticleName", "unknown"),
50-
name=f"{DOMAIN} {self._config_entry.data.get(CONF_SERIAL_NUMBER, 'unknown')}",
51-
serial_number=f"{self._config_entry.data[CONF_SERIAL_NUMBER]}",
52+
name=f"{DOMAIN} {self.serial}",
53+
serial_number=f"{self.serial}",
5254
sw_version=f"{system_data['software'].get('software_version', 'unknown')} ({system_data['software'].get('firmware_version', 'unknown')})",
5355
hw_version=f"{system_data['system'].get('hardware_version', 'unknown'):.1f}",
5456
)

0 commit comments

Comments
 (0)