102 lines
2.8 KiB
Python
102 lines
2.8 KiB
Python
|
#
|
||
|
# Copyright (c) 2022, Diogo Silva "Soloam"
|
||
|
# Creative Commons BY-NC-SA 4.0 International Public License
|
||
|
# (see LICENSE.md or https://creativecommons.org/licenses/by-nc-sa/4.0/)
|
||
|
#
|
||
|
"""
|
||
|
PID Controller.
|
||
|
For more details about this sensor, please refer to the documentation at
|
||
|
https://github.com/soloam/ha-pid-controller/
|
||
|
"""
|
||
|
import logging
|
||
|
from distutils import util
|
||
|
|
||
|
import homeassistant.helpers.config_validation as cv
|
||
|
from homeassistant.core import HomeAssistant
|
||
|
from homeassistant.helpers.service import verify_domain_control
|
||
|
from homeassistant.const import ATTR_ENTITY_ID
|
||
|
from homeassistant.exceptions import HomeAssistantError
|
||
|
|
||
|
import voluptuous as vol
|
||
|
|
||
|
# pylint: disable=wildcard-import, unused-wildcard-import
|
||
|
from .const import *
|
||
|
|
||
|
__version__ = VERSION
|
||
|
|
||
|
_LOGGER = logging.getLogger(__name__)
|
||
|
|
||
|
SERVICE_SCHEMA = vol.Schema(
|
||
|
{
|
||
|
vol.Required(ATTR_ENTITY_ID): cv.entity_id,
|
||
|
}
|
||
|
)
|
||
|
|
||
|
# pylint: disable=unused-argument
|
||
|
async def async_setup(hass: HomeAssistant, config):
|
||
|
"""Set up a pid."""
|
||
|
|
||
|
_LOGGER.debug("setup")
|
||
|
|
||
|
async def async_pid_service_reset(call) -> None:
|
||
|
"""Call pid service handler."""
|
||
|
_LOGGER.info("%s service called", call.service)
|
||
|
await pid_reset_service(hass, call)
|
||
|
|
||
|
hass.services.async_register(
|
||
|
COMPONENT_DOMAIN,
|
||
|
SERVICE_RESET_PID,
|
||
|
async_pid_service_reset,
|
||
|
schema=SERVICE_SCHEMA,
|
||
|
)
|
||
|
|
||
|
async def async_pid_service_autotune(call) -> None:
|
||
|
"""Call pid service handler."""
|
||
|
_LOGGER.info("%s service called", call.service)
|
||
|
await pid_autotune_service(hass, call)
|
||
|
|
||
|
hass.services.async_register(
|
||
|
COMPONENT_DOMAIN,
|
||
|
SERVICE_AUTOTUNE,
|
||
|
async_pid_service_autotune,
|
||
|
schema=SERVICE_SCHEMA,
|
||
|
)
|
||
|
|
||
|
return True
|
||
|
|
||
|
|
||
|
def get_entity_from_domain(hass: HomeAssistant, domain, entity_id):
|
||
|
component = hass.data.get(domain)
|
||
|
if component is None:
|
||
|
raise HomeAssistantError(f"{domain} component not set up")
|
||
|
|
||
|
entity = component.get_entity(entity_id)
|
||
|
if entity is None:
|
||
|
raise HomeAssistantError(f"{entity_id} not found")
|
||
|
|
||
|
return entity
|
||
|
|
||
|
|
||
|
async def pid_reset_service(hass: HomeAssistant, call):
|
||
|
entity_id = call.data["entity_id"]
|
||
|
domain = entity_id.split(".")[0]
|
||
|
|
||
|
_LOGGER.info("%s reset pid", entity_id)
|
||
|
|
||
|
try:
|
||
|
get_entity_from_domain(hass, domain, entity_id).reset_pid()
|
||
|
except AttributeError:
|
||
|
raise HomeAssistantError(f"{entity_id} can't reset PID") from AttributeError
|
||
|
|
||
|
|
||
|
async def pid_autotune_service(hass: HomeAssistant, call):
|
||
|
entity_id = call.data["entity_id"]
|
||
|
domain = entity_id.split(".")[0]
|
||
|
|
||
|
_LOGGER.info("%s autotune pid", entity_id)
|
||
|
|
||
|
try:
|
||
|
get_entity_from_domain(hass, domain, entity_id).start_autotune()
|
||
|
except AttributeError:
|
||
|
raise HomeAssistantError(f"{entity_id} can't reset PID") from AttributeError
|