86 lines
3.7 KiB
Python
86 lines
3.7 KiB
Python
"""__init__.py: The PowerOcean integration."""
|
|
from __future__ import annotations
|
|
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers import device_registry as dr
|
|
|
|
from .const import DOMAIN, PLATFORMS, _LOGGER, DOMAIN, ISSUE_URL_ERROR_MESSAGE, STARTUP_MESSAGE
|
|
from .ecoflow import Ecoflow
|
|
|
|
|
|
_LOGGER.info(STARTUP_MESSAGE)
|
|
|
|
|
|
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|
"""Set up PowerOcean from a config entry."""
|
|
|
|
# Setup DOMAIN as default
|
|
hass.data.setdefault(DOMAIN, {})
|
|
|
|
# Setup device specific sensor list (used in updates) on HASS so it is available within integration (reuqired for unload)
|
|
hass.data[DOMAIN]["device_specific_sensors"] = {}
|
|
|
|
# Store an instance of the API instance in hass.data[domain]
|
|
user_input = entry.data["user_input"] # This user_input object was stored after the device
|
|
# was setup and has the user/pass/serial info
|
|
device_info = entry.data.get("device_info") # This device_info object was stored after the device
|
|
# was setup and has the name and serial needed etc.
|
|
options = entry.data["options"] # These are the options during setup, including custom device name
|
|
ecoflow = Ecoflow(user_input["serialnumber"], user_input["username"], user_input["password"])
|
|
|
|
if device_info:
|
|
ecoflow.device = device_info # Store the device information
|
|
ecoflow.options = options # Store the options
|
|
hass.data[DOMAIN][entry.entry_id] = ecoflow
|
|
|
|
# Forward to sensor platform
|
|
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
|
|
|
|
# Get the device registry
|
|
device_registry = dr.async_get(hass)
|
|
|
|
# Fetching device info from device registry
|
|
# During the config flow, the device info is saved in the entry's data under 'device_info' key.
|
|
device_info = entry.data.get("device_info")
|
|
|
|
# If the device_info was provided, register the device
|
|
if device_info:
|
|
device_registry.async_get_or_create(
|
|
config_entry_id=entry.entry_id,
|
|
identifiers={(DOMAIN, device_info["serial"])},
|
|
manufacturer=device_info.get("vendor", "ECOFLOW"),
|
|
serial_number=device_info.get("serial"),
|
|
name=options.get("custom_device_name"), # Custom device name from user step 2 (options)
|
|
model=device_info.get("product"),
|
|
sw_version=device_info.get("version"),
|
|
configuration_url="https://api-e.ecoflow.com",
|
|
suggested_area="Boiler Room",
|
|
)
|
|
|
|
return True
|
|
|
|
|
|
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|
"""Unload a config entry."""
|
|
# Unload all platforms associated with this entry
|
|
unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
|
|
|
|
if unload_ok:
|
|
# Clean up hass.data if any reference exists
|
|
hass.data[DOMAIN].pop(entry.entry_id, None)
|
|
|
|
# Additionally, clear the device-specific sensors list if it exists
|
|
device_id = entry.data.get("device_info").get("serial")
|
|
device_name = entry.data.get("options").get("custom_device_name")
|
|
if device_id in hass.data.get(DOMAIN, {}).get("device_specific_sensors", {}):
|
|
hass.data[DOMAIN]["device_specific_sensors"].pop(device_id, None)
|
|
_LOGGER.debug(
|
|
f"{device_id}: Cleared sensor update list for device with custom name '{device_name}'"
|
|
)
|
|
|
|
return unload_ok
|
|
|
|
|
|
async def update_listener(hass: HomeAssistant, entry: ConfigEntry) -> None:
|
|
await hass.config_entries.async_reload(entry.entry_id)
|