63 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
"""Provides data updates from the Control4 controller for platforms."""
 | 
						|
import logging
 | 
						|
 | 
						|
from pyControl4.account import C4Account
 | 
						|
from pyControl4.director import C4Director
 | 
						|
from pyControl4.error_handling import BadToken
 | 
						|
 | 
						|
from homeassistant.config_entries import ConfigEntry
 | 
						|
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_TOKEN, CONF_USERNAME
 | 
						|
from homeassistant.core import HomeAssistant
 | 
						|
from homeassistant.helpers import aiohttp_client
 | 
						|
 | 
						|
from .const import (
 | 
						|
    CONF_ACCOUNT,
 | 
						|
    CONF_CONTROLLER_UNIQUE_ID,
 | 
						|
    CONF_DIRECTOR,
 | 
						|
    CONF_DIRECTOR_TOKEN_EXPIRATION,
 | 
						|
    DOMAIN,
 | 
						|
)
 | 
						|
 | 
						|
_LOGGER = logging.getLogger(__name__)
 | 
						|
 | 
						|
 | 
						|
async def director_update_data(
 | 
						|
    hass: HomeAssistant, entry: ConfigEntry, var: str
 | 
						|
) -> dict:
 | 
						|
    """Retrieve data from the Control4 director for update_coordinator."""
 | 
						|
    # possibly implement usage of director_token_expiration to start
 | 
						|
    # token refresh without waiting for error to occur
 | 
						|
    try:
 | 
						|
        director = hass.data[DOMAIN][entry.entry_id][CONF_DIRECTOR]
 | 
						|
        data = await director.getAllItemVariableValue(var)
 | 
						|
    except BadToken:
 | 
						|
        _LOGGER.info("Updating Control4 director token")
 | 
						|
        await refresh_tokens(hass, entry)
 | 
						|
        director = hass.data[DOMAIN][entry.entry_id][CONF_DIRECTOR]
 | 
						|
        data = await director.getAllItemVariableValue(var)
 | 
						|
    return {key["id"]: key for key in data}
 | 
						|
 | 
						|
 | 
						|
async def refresh_tokens(hass: HomeAssistant, entry: ConfigEntry):
 | 
						|
    """Store updated authentication and director tokens in hass.data."""
 | 
						|
    config = entry.data
 | 
						|
    account_session = aiohttp_client.async_get_clientsession(hass)
 | 
						|
 | 
						|
    account = C4Account(config[CONF_USERNAME], config[CONF_PASSWORD], account_session)
 | 
						|
    await account.getAccountBearerToken()
 | 
						|
 | 
						|
    controller_unique_id = config[CONF_CONTROLLER_UNIQUE_ID]
 | 
						|
    director_token_dict = await account.getDirectorBearerToken(controller_unique_id)
 | 
						|
    director_session = aiohttp_client.async_get_clientsession(hass, verify_ssl=False)
 | 
						|
 | 
						|
    director = C4Director(
 | 
						|
        config[CONF_HOST], director_token_dict[CONF_TOKEN], director_session
 | 
						|
    )
 | 
						|
    director_token_expiry = director_token_dict["token_expiration"]
 | 
						|
 | 
						|
    _LOGGER.debug("Saving new tokens in hass data")
 | 
						|
    entry_data = hass.data[DOMAIN][entry.entry_id]
 | 
						|
    entry_data[CONF_ACCOUNT] = account
 | 
						|
    entry_data[CONF_DIRECTOR] = director
 | 
						|
    entry_data[CONF_DIRECTOR_TOKEN_EXPIRATION] = director_token_expiry
 |