core/homeassistant/components/iskra/__init__.py

101 lines
3.3 KiB
Python

"""The iskra integration."""
from __future__ import annotations
from pyiskra.adapters import Modbus, RestAPI
from pyiskra.devices import Device
from pyiskra.exceptions import DeviceConnectionError, DeviceNotSupported, NotAuthorised
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
CONF_ADDRESS,
CONF_HOST,
CONF_PASSWORD,
CONF_PORT,
CONF_PROTOCOL,
CONF_USERNAME,
Platform,
)
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.helpers import device_registry as dr
from .const import DOMAIN, MANUFACTURER
from .coordinator import IskraDataUpdateCoordinator
PLATFORMS: list[Platform] = [Platform.SENSOR]
type IskraConfigEntry = ConfigEntry[list[IskraDataUpdateCoordinator]]
async def async_setup_entry(hass: HomeAssistant, entry: IskraConfigEntry) -> bool:
"""Set up iskra device from a config entry."""
conf = entry.data
adapter = None
if conf[CONF_PROTOCOL] == "modbus_tcp":
adapter = Modbus(
ip_address=conf[CONF_HOST],
protocol="tcp",
port=conf[CONF_PORT],
modbus_address=conf[CONF_ADDRESS],
)
elif conf[CONF_PROTOCOL] == "rest_api":
authentication = None
if (username := conf.get(CONF_USERNAME)) is not None and (
password := conf.get(CONF_PASSWORD)
) is not None:
authentication = {
"username": username,
"password": password,
}
adapter = RestAPI(ip_address=conf[CONF_HOST], authentication=authentication)
# Try connecting to the device and create pyiskra device object
try:
base_device = await Device.create_device(adapter)
except DeviceConnectionError as e:
raise ConfigEntryNotReady("Cannot connect to the device") from e
except NotAuthorised as e:
raise ConfigEntryNotReady("Not authorised to connect to the device") from e
except DeviceNotSupported as e:
raise ConfigEntryNotReady("Device not supported") from e
# Initialize the device
await base_device.init()
# if the device is a gateway, add all child devices, otherwise add the device itself.
if base_device.is_gateway:
# Add the gateway device to the device registry
device_registry = dr.async_get(hass)
device_registry.async_get_or_create(
config_entry_id=entry.entry_id,
identifiers={(DOMAIN, base_device.serial)},
manufacturer=MANUFACTURER,
name=base_device.model,
model=base_device.model,
sw_version=base_device.fw_version,
)
coordinators = [
IskraDataUpdateCoordinator(hass, child_device)
for child_device in base_device.get_child_devices()
]
else:
coordinators = [IskraDataUpdateCoordinator(hass, base_device)]
for coordinator in coordinators:
await coordinator.async_config_entry_first_refresh()
entry.runtime_data = coordinators
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
return True
async def async_unload_entry(hass: HomeAssistant, entry: IskraConfigEntry) -> bool:
"""Unload a config entry."""
return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)