97 lines
2.9 KiB
Python
97 lines
2.9 KiB
Python
"""The myStrom integration."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
import pymystrom
|
|
from pymystrom.bulb import MyStromBulb
|
|
from pymystrom.exceptions import MyStromConnectionError
|
|
from pymystrom.switch import MyStromSwitch
|
|
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.const import CONF_HOST, Platform
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.exceptions import ConfigEntryNotReady
|
|
|
|
from .const import DOMAIN
|
|
from .models import MyStromData
|
|
|
|
PLATFORMS_PLUGS = [Platform.SENSOR, Platform.SWITCH]
|
|
PLATFORMS_BULB = [Platform.LIGHT]
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
async def _async_get_device_state(
|
|
device: MyStromSwitch | MyStromBulb, ip_address: str
|
|
) -> None:
|
|
try:
|
|
await device.get_state()
|
|
except MyStromConnectionError as err:
|
|
_LOGGER.error("No route to myStrom plug: %s", ip_address)
|
|
raise ConfigEntryNotReady from err
|
|
|
|
|
|
def _get_mystrom_bulb(host: str, mac: str) -> MyStromBulb:
|
|
return MyStromBulb(host, mac)
|
|
|
|
|
|
def _get_mystrom_switch(host: str) -> MyStromSwitch:
|
|
return MyStromSwitch(host)
|
|
|
|
|
|
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|
"""Set up myStrom from a config entry."""
|
|
host = entry.data[CONF_HOST]
|
|
try:
|
|
info = await pymystrom.get_device_info(host)
|
|
except MyStromConnectionError as err:
|
|
_LOGGER.error("No route to myStrom plug: %s", host)
|
|
raise ConfigEntryNotReady from err
|
|
|
|
info.setdefault("type", 101)
|
|
|
|
device_type = info["type"]
|
|
if device_type in [101, 106, 107, 120]:
|
|
device = _get_mystrom_switch(host)
|
|
platforms = PLATFORMS_PLUGS
|
|
await _async_get_device_state(device, info["ip"])
|
|
elif device_type in [102, 105]:
|
|
mac = info["mac"]
|
|
device = _get_mystrom_bulb(host, mac)
|
|
platforms = PLATFORMS_BULB
|
|
await _async_get_device_state(device, info["ip"])
|
|
if device.bulb_type not in ["rgblamp", "strip"]:
|
|
_LOGGER.error(
|
|
"Device %s (%s) is not a myStrom bulb nor myStrom LED Strip",
|
|
host,
|
|
mac,
|
|
)
|
|
return False
|
|
else:
|
|
_LOGGER.error("Unsupported myStrom device type: %s", device_type)
|
|
return False
|
|
|
|
hass.data.setdefault(DOMAIN, {})[entry.entry_id] = MyStromData(
|
|
device=device,
|
|
info=info,
|
|
)
|
|
await hass.config_entries.async_forward_entry_setups(entry, platforms)
|
|
|
|
return True
|
|
|
|
|
|
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|
"""Unload a config entry."""
|
|
device_type = hass.data[DOMAIN][entry.entry_id].info["type"]
|
|
platforms = []
|
|
if device_type in [101, 106, 107, 120]:
|
|
platforms.extend(PLATFORMS_PLUGS)
|
|
elif device_type in [102, 105]:
|
|
platforms.extend(PLATFORMS_BULB)
|
|
if unload_ok := await hass.config_entries.async_unload_platforms(entry, platforms):
|
|
hass.data[DOMAIN].pop(entry.entry_id)
|
|
|
|
return unload_ok
|