Skip to content

Commit

Permalink
refactor: Add SolarmanConfigEntry
Browse files Browse the repository at this point in the history
  • Loading branch information
davidrapan committed Jan 16, 2025
1 parent a7f56a0 commit cd3da50
Show file tree
Hide file tree
Showing 11 changed files with 57 additions and 55 deletions.
26 changes: 10 additions & 16 deletions custom_components/solarman/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,13 @@

from homeassistant.const import Platform
from homeassistant.core import HomeAssistant
from homeassistant.config_entries import ConfigEntry
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.typing import ConfigType
from homeassistant.helpers.entity_registry import async_migrate_entries

from .const import *
from .common import *
from .provider import ConfigurationProvider
from .provider import SolarmanConfigEntry, ConfigurationProvider
from .coordinator import Inverter, InverterCoordinator
from .config_flow import ConfigFlowHandler
from .entity import migrate_unique_ids
Expand All @@ -32,25 +31,23 @@ async def async_setup(hass: HomeAssistant, _: ConfigType) -> bool:

return True

async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
async def async_setup_entry(hass: HomeAssistant, config_entry: SolarmanConfigEntry) -> bool:
_LOGGER.debug(f"async_setup_entry({config_entry.as_dict()})")

config = ConfigurationProvider(hass, config_entry)
coordinator = InverterCoordinator(hass, Inverter(config))

hass.data.setdefault(DOMAIN, {})[config_entry.entry_id] = coordinator
config_entry.runtime_data = InverterCoordinator(hass, Inverter(config))

# Fetch initial data so we have data when entities subscribe.
#
# If the refresh fails, async_config_entry_first_refresh will
# raise ConfigEntryNotReady and setup will try again later.
#
# If you do not want to retry setup on failure, use
# coordinator.async_refresh() instead.
# config_entry.runtime_data.async_refresh() instead.
#
_LOGGER.debug(f"async_setup: coordinator.async_config_entry_first_refresh")
_LOGGER.debug(f"async_setup: config_entry.runtime_data.async_config_entry_first_refresh")

await coordinator.async_config_entry_first_refresh()
await config_entry.runtime_data.async_config_entry_first_refresh()

# Migrations
#
Expand All @@ -68,27 +65,24 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> b
#
_LOGGER.debug(f"async_setup: config_entry.add_update_listener(async_update_listener)")

async def async_update_listener(hass: HomeAssistant, config_entry: ConfigEntry) -> None:
async def async_update_listener(hass: HomeAssistant, config_entry: SolarmanConfigEntry) -> None:
_LOGGER.debug(f"async_update_listener({config_entry.as_dict()})")
await hass.config_entries.async_reload(config_entry.entry_id)

config_entry.async_on_unload(config_entry.add_update_listener(async_update_listener))

return True

async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
async def async_unload_entry(hass: HomeAssistant, config_entry: SolarmanConfigEntry) -> bool:
_LOGGER.debug(f"async_unload_entry({config_entry.as_dict()})")

# Forward unload
#
_LOGGER.debug(f"async_setup: hass.config_entries.async_unload_platforms: {PLATFORMS}")

if unload_ok := await hass.config_entries.async_unload_platforms(config_entry, PLATFORMS):
_ = hass.data[DOMAIN].pop(config_entry.entry_id)

return unload_ok
return await hass.config_entries.async_unload_platforms(config_entry, PLATFORMS)

async def async_migrate_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
async def async_migrate_entry(hass: HomeAssistant, config_entry: SolarmanConfigEntry) -> bool:
_LOGGER.debug("Migrating configuration from version %s.%s", config_entry.version, config_entry.minor_version)

#if config_entry.minor_version > 1:
Expand Down
9 changes: 5 additions & 4 deletions custom_components/solarman/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,25 @@
from typing import Any

from homeassistant.core import HomeAssistant
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.components.binary_sensor import BinarySensorEntity, BinarySensorDeviceClass

from .const import *
from .common import *
from .services import *
from .provider import SolarmanConfigEntry
from .entity import create_entity, SolarmanEntity

_LOGGER = logging.getLogger(__name__)

_PLATFORM = get_current_file_name(__name__)

async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, async_add_entities: AddEntitiesCallback) -> bool:
async def async_setup_entry(hass: HomeAssistant, config_entry: SolarmanConfigEntry, async_add_entities: AddEntitiesCallback) -> bool:
_LOGGER.debug(f"async_setup_entry: {config_entry.options}")

coordinator, descriptions = get_coordinator_descriptions(hass, config_entry.entry_id, _PLATFORM)
coordinator = config_entry.runtime_data
descriptions = coordinator.inverter.profile.parser.get_entity_descriptions(_PLATFORM)

_LOGGER.debug(f"async_setup_entry: async_add_entities: {descriptions}")

Expand All @@ -32,7 +33,7 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, asyn

return True

async def async_unload_entry(_: HomeAssistant, config_entry: ConfigEntry) -> bool:
async def async_unload_entry(_: HomeAssistant, config_entry: SolarmanConfigEntry) -> bool:
_LOGGER.debug(f"async_unload_entry: {config_entry.options}")

return True
Expand Down
9 changes: 5 additions & 4 deletions custom_components/solarman/button.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

from typing import Any

from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.const import STATE_OFF, STATE_ON
from homeassistant.components.button import ButtonEntity, ButtonDeviceClass, ButtonEntityDescription
Expand All @@ -13,24 +12,26 @@
from .const import *
from .common import *
from .services import *
from .provider import SolarmanConfigEntry
from .entity import create_entity, SolarmanWritableEntity

_LOGGER = logging.getLogger(__name__)

_PLATFORM = get_current_file_name(__name__)

async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, async_add_entities: AddEntitiesCallback) -> bool:
async def async_setup_entry(hass: HomeAssistant, config_entry: SolarmanConfigEntry, async_add_entities: AddEntitiesCallback) -> bool:
_LOGGER.debug(f"async_setup_entry: {config_entry.options}")

coordinator, descriptions = get_coordinator_descriptions(hass, config_entry.entry_id, _PLATFORM)
coordinator = config_entry.runtime_data
descriptions = coordinator.inverter.profile.parser.get_entity_descriptions(_PLATFORM)

_LOGGER.debug(f"async_setup_entry: async_add_entities: {descriptions}")

async_add_entities(create_entity(lambda x: SolarmanButtonEntity(coordinator, x), d) for d in descriptions)

return True

async def async_unload_entry(_: HomeAssistant, config_entry: ConfigEntry) -> bool:
async def async_unload_entry(_: HomeAssistant, config_entry: SolarmanConfigEntry) -> bool:
_LOGGER.debug(f"async_unload_entry: {config_entry.options}")

return True
Expand Down
4 changes: 0 additions & 4 deletions custom_components/solarman/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,6 @@ async def async_execute(x):
async def async_listdir(path, prefix = ""):
return sorted([prefix + f for f in await async_execute(lambda: os.listdir(path)) if os.path.isfile(path + f)]) if os.path.exists(path) else []

def get_coordinator_descriptions(hass: HomeAssistant, entry_id: str, platform: str):
coordinator = hass.data[DOMAIN][entry_id]
return coordinator, coordinator.inverter.profile.parser.get_entity_descriptions(platform)

def to_dict(*keys: list):
return {k: k for k in keys}

Expand Down
11 changes: 6 additions & 5 deletions custom_components/solarman/datetime.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,33 @@
from zoneinfo import ZoneInfo
from datetime import datetime, timezone

from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.core import HomeAssistant, callback
from homeassistant.components.datetime import DateTimeEntity, DateTimeEntityDescription
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import *
from .common import *
from .services import *
from .provider import SolarmanConfigEntry
from .entity import create_entity, SolarmanWritableEntity

_LOGGER = logging.getLogger(__name__)

_PLATFORM = get_current_file_name(__name__)

async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, async_add_entities: AddEntitiesCallback) -> bool:
async def async_setup_entry(hass: HomeAssistant, config_entry: SolarmanConfigEntry, async_add_entities: AddEntitiesCallback) -> bool:
_LOGGER.debug(f"async_setup_entry: {config_entry.options}")

coordinator, descriptions = get_coordinator_descriptions(hass, config_entry.entry_id, _PLATFORM)
coordinator = config_entry.runtime_data
descriptions = coordinator.inverter.profile.parser.get_entity_descriptions(_PLATFORM)

_LOGGER.debug(f"async_setup_entry: async_add_entities: {descriptions}")

async_add_entities(create_entity(lambda x: SolarmanDateTimeEntity(coordinator, x), d) for d in descriptions)

return True

async def async_unload_entry(_: HomeAssistant, config_entry: ConfigEntry) -> bool:
async def async_unload_entry(_: HomeAssistant, config_entry: SolarmanConfigEntry) -> bool:
_LOGGER.debug(f"async_unload_entry: {config_entry.options}")

return True
Expand Down
9 changes: 5 additions & 4 deletions custom_components/solarman/number.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,33 @@

from typing import Any

from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.components.number import NumberEntity, NumberDeviceClass, NumberEntityDescription
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import *
from .common import *
from .services import *
from .provider import SolarmanConfigEntry
from .entity import create_entity, SolarmanWritableEntity

_LOGGER = logging.getLogger(__name__)

_PLATFORM = get_current_file_name(__name__)

async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, async_add_entities: AddEntitiesCallback) -> bool:
async def async_setup_entry(hass: HomeAssistant, config_entry: SolarmanConfigEntry, async_add_entities: AddEntitiesCallback) -> bool:
_LOGGER.debug(f"async_setup_entry: {config_entry.options}")

coordinator, descriptions = get_coordinator_descriptions(hass, config_entry.entry_id, _PLATFORM)
coordinator = config_entry.runtime_data
descriptions = coordinator.inverter.profile.parser.get_entity_descriptions(_PLATFORM)

_LOGGER.debug(f"async_setup_entry: async_add_entities: {descriptions}")

async_add_entities(create_entity(lambda x: SolarmanNumberEntity(coordinator, x), d) for d in descriptions)

return True

async def async_unload_entry(_: HomeAssistant, config_entry: ConfigEntry) -> bool:
async def async_unload_entry(_: HomeAssistant, config_entry: SolarmanConfigEntry) -> bool:
_LOGGER.debug(f"async_unload_entry: {config_entry.options}")

return True
Expand Down
5 changes: 4 additions & 1 deletion custom_components/solarman/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,17 @@
from .const import *
from .common import *
from .discovery import InverterDiscovery
from .coordinator import InverterCoordinator
from .parser import ParameterParser

_LOGGER = logging.getLogger(__name__)

type SolarmanConfigEntry = ConfigEntry[InverterCoordinator]

@dataclass
class ConfigurationProvider:
hass: HomeAssistant
config_entry: ConfigEntry
config_entry: SolarmanConfigEntry

@cached_property
def _data(self):
Expand Down
11 changes: 6 additions & 5 deletions custom_components/solarman/select.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,33 @@

from typing import Any

from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.components.select import SelectEntity, SelectEntityDescription
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import *
from .common import *
from .services import *
from .provider import SolarmanConfigEntry
from .entity import create_entity, SolarmanWritableEntity

_LOGGER = logging.getLogger(__name__)

_PLATFORM = get_current_file_name(__name__)

async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, async_add_entities: AddEntitiesCallback) -> bool:
async def async_setup_entry(hass: HomeAssistant, config_entry: SolarmanConfigEntry, async_add_entities: AddEntitiesCallback) -> bool:
_LOGGER.debug(f"async_setup_entry: {config_entry.options}")

coordinator, descriptions = get_coordinator_descriptions(hass, config_entry.entry_id, _PLATFORM)

coordinator = config_entry.runtime_data
descriptions = coordinator.inverter.profile.parser.get_entity_descriptions(_PLATFORM)

_LOGGER.debug(f"async_setup_entry: async_add_entities: {descriptions}")

async_add_entities(create_entity(lambda x: SolarmanSelectEntity(coordinator, x), d) for d in descriptions)

return True

async def async_unload_entry(_: HomeAssistant, config_entry: ConfigEntry) -> bool:
async def async_unload_entry(_: HomeAssistant, config_entry: SolarmanConfigEntry) -> bool:
_LOGGER.debug(f"async_unload_entry: {config_entry.options}")

return True
Expand Down
10 changes: 6 additions & 4 deletions custom_components/solarman/sensor.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from __future__ import annotations

import numpy
import logging

from typing import Any
Expand All @@ -9,14 +10,14 @@
from homeassistant.helpers.template import Template

from homeassistant.core import HomeAssistant
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory
from homeassistant.components.sensor import RestoreSensor, SensorEntity, SensorDeviceClass
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import *
from .common import *
from .services import *
from .provider import SolarmanConfigEntry
from .entity import create_entity, SolarmanEntity

_LOGGER = logging.getLogger(__name__)
Expand Down Expand Up @@ -46,10 +47,11 @@ def _create_entity(coordinator, description, options):

return SolarmanSensor(coordinator, description)

async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, async_add_entities: AddEntitiesCallback) -> bool:
async def async_setup_entry(hass: HomeAssistant, config_entry: SolarmanConfigEntry, async_add_entities: AddEntitiesCallback) -> bool:
_LOGGER.debug(f"async_setup_entry: {config_entry.options}")

coordinator, descriptions = get_coordinator_descriptions(hass, config_entry.entry_id, _PLATFORM)
coordinator = config_entry.runtime_data
descriptions = coordinator.inverter.profile.parser.get_entity_descriptions(_PLATFORM)

_LOGGER.debug(f"async_setup_entry: async_add_entities: {descriptions}")

Expand All @@ -59,7 +61,7 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, asyn

return True

async def async_unload_entry(_: HomeAssistant, config_entry: ConfigEntry) -> bool:
async def async_unload_entry(_: HomeAssistant, config_entry: SolarmanConfigEntry) -> bool:
_LOGGER.debug(f"async_unload_entry: {config_entry.options}")

return True
Expand Down
9 changes: 5 additions & 4 deletions custom_components/solarman/switch.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

from typing import Any

from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.const import STATE_OFF, STATE_ON
from homeassistant.components.switch import SwitchEntity, SwitchDeviceClass, SwitchEntityDescription
Expand All @@ -13,24 +12,26 @@
from .const import *
from .common import *
from .services import *
from .provider import SolarmanConfigEntry
from .entity import create_entity, SolarmanWritableEntity

_LOGGER = logging.getLogger(__name__)

_PLATFORM = get_current_file_name(__name__)

async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, async_add_entities: AddEntitiesCallback) -> bool:
async def async_setup_entry(hass: HomeAssistant, config_entry: SolarmanConfigEntry, async_add_entities: AddEntitiesCallback) -> bool:
_LOGGER.debug(f"async_setup_entry: {config_entry.options}")

coordinator, descriptions = get_coordinator_descriptions(hass, config_entry.entry_id, _PLATFORM)
coordinator = config_entry.runtime_data
descriptions = coordinator.inverter.profile.parser.get_entity_descriptions(_PLATFORM)

_LOGGER.debug(f"async_setup_entry: async_add_entities: {descriptions}")

async_add_entities(create_entity(lambda x: SolarmanSwitchEntity(coordinator, x), d) for d in descriptions)

return True

async def async_unload_entry(_: HomeAssistant, config_entry: ConfigEntry) -> bool:
async def async_unload_entry(_: HomeAssistant, config_entry: SolarmanConfigEntry) -> bool:
_LOGGER.debug(f"async_unload_entry: {config_entry.options}")

return True
Expand Down
Loading

0 comments on commit cd3da50

Please sign in to comment.