Files
homeassistant_config/config/custom_components/solar_optimizer/__init__.py
2024-08-09 06:45:02 +02:00

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)