144 lines
5.6 KiB
Python
144 lines
5.6 KiB
Python
"""Initialisation du package de l'intégration HACS Tuto"""
|
|
import logging
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.const import EVENT_HOMEASSISTANT_START
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.helpers.typing import ConfigType
|
|
import homeassistant.helpers.config_validation as cv
|
|
from homeassistant.helpers import selector
|
|
from homeassistant.components.input_boolean import DOMAIN as INPUT_BOOLEAN_DOMAIN
|
|
from homeassistant.components.input_number import DOMAIN as INPUT_NUMBER_DOMAIN
|
|
from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN
|
|
from homeassistant.components.humidifier import DOMAIN as HUMIDIFIER_DOMAIN
|
|
from homeassistant.components.climate import DOMAIN as CLIMATE_DOMAIN
|
|
from homeassistant.components.number import DOMAIN as NUMBER_DOMAIN
|
|
from homeassistant.components.button import DOMAIN as BUTTON_DOMAIN
|
|
|
|
# from homeassistant.helpers.entity_component import EntityComponent
|
|
|
|
|
|
from .const import DOMAIN, PLATFORMS
|
|
from .coordinator import SolarOptimizerCoordinator
|
|
|
|
# from .input_boolean import async_setup_entry as async_setup_entry_input_boolean
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
CONFIG_SCHEMA = vol.Schema(
|
|
{
|
|
DOMAIN: vol.Schema(
|
|
{
|
|
"algorithm": vol.Schema(
|
|
{
|
|
vol.Required("initial_temp", default=1000): vol.Coerce(float),
|
|
vol.Required("min_temp", default=0.1): vol.Coerce(float),
|
|
vol.Required("cooling_factor", default=0.95): vol.Coerce(float),
|
|
vol.Required(
|
|
"max_iteration_number", default=1000
|
|
): cv.positive_int,
|
|
}
|
|
),
|
|
"devices": vol.All(
|
|
[
|
|
{
|
|
vol.Required("name"): str,
|
|
vol.Required("entity_id"): selector.EntitySelector(
|
|
selector.EntitySelectorConfig(
|
|
domain=[INPUT_BOOLEAN_DOMAIN, SWITCH_DOMAIN, HUMIDIFIER_DOMAIN, CLIMATE_DOMAIN, BUTTON_DOMAIN]
|
|
)
|
|
),
|
|
vol.Optional("power_entity_id"): selector.EntitySelector(
|
|
selector.EntitySelectorConfig(
|
|
domain=[INPUT_NUMBER_DOMAIN, NUMBER_DOMAIN]
|
|
)
|
|
),
|
|
vol.Required("power_max"): vol.Coerce(float),
|
|
vol.Optional("power_min"): vol.Coerce(float),
|
|
vol.Optional("power_step"): vol.Coerce(float),
|
|
vol.Optional("check_usable_template"): str,
|
|
vol.Optional("check_active_template"): str,
|
|
vol.Optional("duration_min"): vol.Coerce(float),
|
|
vol.Optional("duration_stop_min"): vol.Coerce(float),
|
|
vol.Optional("duration_power_min"): vol.Coerce(float),
|
|
vol.Optional("action_mode"): str,
|
|
vol.Required("activation_service"): str,
|
|
vol.Required("deactivation_service"): str,
|
|
vol.Optional("change_power_service"): str,
|
|
vol.Optional("convert_power_divide_factor"): vol.Coerce(
|
|
float
|
|
),
|
|
vol.Optional("battery_soc_threshold", default=0): vol.Coerce(float),
|
|
}
|
|
]
|
|
),
|
|
}
|
|
),
|
|
},
|
|
extra=vol.ALLOW_EXTRA,
|
|
)
|
|
|
|
|
|
async def async_setup(
|
|
hass: HomeAssistant, config: ConfigType
|
|
): # pylint: disable=unused-argument
|
|
"""Initialisation de l'intégration"""
|
|
_LOGGER.info(
|
|
"Initializing %s integration with plaforms: %s with config: %s",
|
|
DOMAIN,
|
|
PLATFORMS,
|
|
config.get(DOMAIN),
|
|
)
|
|
|
|
hass.data.setdefault(DOMAIN, {})
|
|
|
|
# L'argument config contient votre fichier configuration.yaml
|
|
solar_optimizer_config = config.get(DOMAIN)
|
|
|
|
hass.data[DOMAIN]["coordinator"] = coordinator = SolarOptimizerCoordinator(
|
|
hass, solar_optimizer_config
|
|
)
|
|
|
|
hass.bus.async_listen_once("homeassistant_started", coordinator.on_ha_started)
|
|
|
|
return True
|
|
|
|
|
|
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|
"""Creation des entités à partir d'une configEntry"""
|
|
|
|
_LOGGER.debug(
|
|
"Appel de async_setup_entry entry: entry_id='%s', data='%s'",
|
|
entry.entry_id,
|
|
entry.data,
|
|
)
|
|
|
|
hass.data.setdefault(DOMAIN, {})
|
|
|
|
# Enregistrement de l'écouteur de changement 'update_listener'
|
|
entry.async_on_unload(entry.add_update_listener(update_listener))
|
|
|
|
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
|
|
|
|
return True
|
|
|
|
|
|
async def update_listener(hass: HomeAssistant, entry: ConfigEntry) -> None:
|
|
"""Fonction qui force le rechargement des entités associées à une configEntry"""
|
|
await hass.config_entries.async_reload(entry.entry_id)
|
|
|
|
|
|
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|
"""Handle removal of an entry."""
|
|
if unloaded := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
|
|
pass
|
|
# hass.data[DOMAIN].pop(entry.entry_id)
|
|
return unloaded
|
|
|
|
|
|
async def async_reload_entry(hass: HomeAssistant, entry: ConfigEntry) -> None:
|
|
"""Reload config entry."""
|
|
await async_unload_entry(hass, entry)
|
|
# await async_setup_entry(hass, entry)
|