94 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
"""The Discovergy integration."""
 | 
						|
from __future__ import annotations
 | 
						|
 | 
						|
from dataclasses import dataclass
 | 
						|
 | 
						|
import pydiscovergy
 | 
						|
from pydiscovergy.authentication import BasicAuth
 | 
						|
import pydiscovergy.error as discovergyError
 | 
						|
from pydiscovergy.models import Meter
 | 
						|
 | 
						|
from homeassistant.config_entries import ConfigEntry
 | 
						|
from homeassistant.const import CONF_EMAIL, CONF_PASSWORD, Platform
 | 
						|
from homeassistant.core import HomeAssistant
 | 
						|
from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady
 | 
						|
from homeassistant.helpers.httpx_client import get_async_client
 | 
						|
 | 
						|
from .const import APP_NAME, DOMAIN
 | 
						|
from .coordinator import DiscovergyUpdateCoordinator
 | 
						|
 | 
						|
PLATFORMS = [Platform.SENSOR]
 | 
						|
 | 
						|
 | 
						|
@dataclass
 | 
						|
class DiscovergyData:
 | 
						|
    """Discovergy data class to share meters and api client."""
 | 
						|
 | 
						|
    api_client: pydiscovergy.Discovergy
 | 
						|
    meters: list[Meter]
 | 
						|
    coordinators: dict[str, DiscovergyUpdateCoordinator]
 | 
						|
 | 
						|
 | 
						|
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
 | 
						|
    """Set up Discovergy from a config entry."""
 | 
						|
    hass.data.setdefault(DOMAIN, {})
 | 
						|
 | 
						|
    # init discovergy data class
 | 
						|
    discovergy_data = DiscovergyData(
 | 
						|
        api_client=pydiscovergy.Discovergy(
 | 
						|
            email=entry.data[CONF_EMAIL],
 | 
						|
            password=entry.data[CONF_PASSWORD],
 | 
						|
            app_name=APP_NAME,
 | 
						|
            httpx_client=get_async_client(hass),
 | 
						|
            authentication=BasicAuth(),
 | 
						|
        ),
 | 
						|
        meters=[],
 | 
						|
        coordinators={},
 | 
						|
    )
 | 
						|
 | 
						|
    try:
 | 
						|
        # try to get meters from api to check if credentials are still valid and for later use
 | 
						|
        # if no exception is raised everything is fine to go
 | 
						|
        discovergy_data.meters = await discovergy_data.api_client.get_meters()
 | 
						|
    except discovergyError.InvalidLogin as err:
 | 
						|
        raise ConfigEntryAuthFailed("Invalid email or password") from err
 | 
						|
    except Exception as err:  # pylint: disable=broad-except
 | 
						|
        raise ConfigEntryNotReady(
 | 
						|
            "Unexpected error while while getting meters"
 | 
						|
        ) from err
 | 
						|
 | 
						|
    # Init coordinators for meters
 | 
						|
    for meter in discovergy_data.meters:
 | 
						|
        # Create coordinator for meter, set config entry and fetch initial data,
 | 
						|
        # so we have data when entities are added
 | 
						|
        coordinator = DiscovergyUpdateCoordinator(
 | 
						|
            hass=hass,
 | 
						|
            config_entry=entry,
 | 
						|
            meter=meter,
 | 
						|
            discovergy_client=discovergy_data.api_client,
 | 
						|
        )
 | 
						|
        await coordinator.async_config_entry_first_refresh()
 | 
						|
 | 
						|
        discovergy_data.coordinators[meter.get_meter_id()] = coordinator
 | 
						|
 | 
						|
    hass.data[DOMAIN][entry.entry_id] = discovergy_data
 | 
						|
    await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
 | 
						|
 | 
						|
    entry.async_on_unload(entry.add_update_listener(async_reload_entry))
 | 
						|
 | 
						|
    return True
 | 
						|
 | 
						|
 | 
						|
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
 | 
						|
    """Unload a config entry."""
 | 
						|
    unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
 | 
						|
    if unload_ok:
 | 
						|
        hass.data[DOMAIN].pop(entry.entry_id)
 | 
						|
 | 
						|
    return unload_ok
 | 
						|
 | 
						|
 | 
						|
async def async_reload_entry(hass: HomeAssistant, entry: ConfigEntry) -> None:
 | 
						|
    """Handle an options update."""
 | 
						|
    await hass.config_entries.async_reload(entry.entry_id)
 |