Add custom services for renson fans (#94497)
Co-authored-by: Robert Resch <robert@resch.dev>pull/105232/head
parent
0728106c98
commit
d61814a1ed
homeassistant/components/renson
|
@ -1,3 +1,4 @@
|
|||
"""Constants for the Renson integration."""
|
||||
|
||||
|
||||
DOMAIN = "renson"
|
||||
|
|
|
@ -7,10 +7,13 @@ from typing import Any
|
|||
|
||||
from renson_endura_delta.field_enum import CURRENT_LEVEL_FIELD, DataType
|
||||
from renson_endura_delta.renson import Level, RensonVentilation
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components.fan import FanEntity, FanEntityFeature
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.helpers import entity_platform
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||
from homeassistant.util.percentage import (
|
||||
percentage_to_ranged_value,
|
||||
|
@ -41,6 +44,33 @@ SPEED_MAPPING = {
|
|||
Level.LEVEL4.value: 4,
|
||||
}
|
||||
|
||||
SET_TIMER_LEVEL_SCHEMA = {
|
||||
vol.Required("timer_level"): vol.In(
|
||||
["level1", "level2", "level3", "level4", "holiday", "breeze"]
|
||||
),
|
||||
vol.Required("minutes"): cv.positive_int,
|
||||
}
|
||||
|
||||
SET_BREEZE_SCHEMA = {
|
||||
vol.Required("breeze_level"): vol.In(["level1", "level2", "level3", "level4"]),
|
||||
vol.Required("temperature"): cv.positive_int,
|
||||
vol.Required("activate"): bool,
|
||||
}
|
||||
|
||||
SET_POLLUTION_SETTINGS_SCHEMA = {
|
||||
vol.Required("day_pollution_level"): vol.In(
|
||||
["level1", "level2", "level3", "level4"]
|
||||
),
|
||||
vol.Required("night_pollution_level"): vol.In(
|
||||
["level1", "level2", "level3", "level4"]
|
||||
),
|
||||
vol.Optional("humidity_control", default=True): bool,
|
||||
vol.Optional("airquality_control", default=True): bool,
|
||||
vol.Optional("co2_control", default=True): bool,
|
||||
vol.Optional("co2_threshold", default=600): cv.positive_int,
|
||||
vol.Optional("co2_hysteresis", default=100): cv.positive_int,
|
||||
}
|
||||
|
||||
|
||||
SPEED_RANGE: tuple[float, float] = (1, 4)
|
||||
|
||||
|
@ -59,6 +89,24 @@ async def async_setup_entry(
|
|||
|
||||
async_add_entities([RensonFan(api, coordinator)])
|
||||
|
||||
platform = entity_platform.async_get_current_platform()
|
||||
|
||||
platform.async_register_entity_service(
|
||||
"set_timer_level",
|
||||
SET_TIMER_LEVEL_SCHEMA,
|
||||
"set_timer_level",
|
||||
)
|
||||
|
||||
platform.async_register_entity_service(
|
||||
"set_breeze", SET_BREEZE_SCHEMA, "set_breeze"
|
||||
)
|
||||
|
||||
platform.async_register_entity_service(
|
||||
"set_pollution_settings",
|
||||
SET_POLLUTION_SETTINGS_SCHEMA,
|
||||
"set_pollution_settings",
|
||||
)
|
||||
|
||||
|
||||
class RensonFan(RensonEntity, FanEntity):
|
||||
"""Representation of the Renson fan platform."""
|
||||
|
@ -116,3 +164,43 @@ class RensonFan(RensonEntity, FanEntity):
|
|||
await self.hass.async_add_executor_job(self.api.set_manual_level, cmd)
|
||||
|
||||
await self.coordinator.async_request_refresh()
|
||||
|
||||
async def set_timer_level(self, timer_level: str, minutes: int) -> None:
|
||||
"""Set timer level."""
|
||||
level = Level[str(timer_level).upper()]
|
||||
|
||||
await self.hass.async_add_executor_job(self.api.set_timer_level, level, minutes)
|
||||
|
||||
async def set_breeze(
|
||||
self, breeze_level: str, temperature: int, activate: bool
|
||||
) -> None:
|
||||
"""Configure breeze feature."""
|
||||
level = Level[str(breeze_level).upper()]
|
||||
|
||||
await self.hass.async_add_executor_job(
|
||||
self.api.set_breeze, level, temperature, activate
|
||||
)
|
||||
|
||||
async def set_pollution_settings(
|
||||
self,
|
||||
day_pollution_level: str,
|
||||
night_pollution_level: str,
|
||||
humidity_control: bool,
|
||||
airquality_control: bool,
|
||||
co2_control: str,
|
||||
co2_threshold: int,
|
||||
co2_hysteresis: int,
|
||||
) -> None:
|
||||
"""Configure pollutions settings."""
|
||||
day = Level[str(day_pollution_level).upper()]
|
||||
night = Level[str(night_pollution_level).upper()]
|
||||
|
||||
await self.api.set_pollution(
|
||||
day,
|
||||
night,
|
||||
humidity_control,
|
||||
airquality_control,
|
||||
co2_control,
|
||||
co2_threshold,
|
||||
co2_hysteresis,
|
||||
)
|
||||
|
|
|
@ -0,0 +1,117 @@
|
|||
set_timer_level:
|
||||
target:
|
||||
entity:
|
||||
integration: renson
|
||||
domain: fan
|
||||
fields:
|
||||
timer_level:
|
||||
required: true
|
||||
default: "level1"
|
||||
selector:
|
||||
select:
|
||||
translation_key: "level_setting"
|
||||
options:
|
||||
- "level1"
|
||||
- "level2"
|
||||
- "level3"
|
||||
- "level4"
|
||||
- "holiday"
|
||||
- "breeze"
|
||||
minutes:
|
||||
required: true
|
||||
default: 0
|
||||
selector:
|
||||
number:
|
||||
min: 0
|
||||
max: 1440
|
||||
step: 10
|
||||
unit_of_measurement: "min"
|
||||
mode: slider
|
||||
|
||||
set_breeze:
|
||||
target:
|
||||
entity:
|
||||
integration: renson
|
||||
domain: fan
|
||||
fields:
|
||||
breeze_level:
|
||||
default: "level3"
|
||||
selector:
|
||||
select:
|
||||
translation_key: "level_setting"
|
||||
options:
|
||||
- "level1"
|
||||
- "level2"
|
||||
- "level3"
|
||||
- "level4"
|
||||
temperature:
|
||||
default: 18
|
||||
selector:
|
||||
number:
|
||||
min: 15
|
||||
max: 35
|
||||
step: 1
|
||||
unit_of_measurement: "°C"
|
||||
mode: slider
|
||||
activate:
|
||||
required: true
|
||||
default: false
|
||||
selector:
|
||||
boolean:
|
||||
|
||||
set_pollution_settings:
|
||||
target:
|
||||
entity:
|
||||
integration: renson
|
||||
domain: fan
|
||||
fields:
|
||||
day_pollution_level:
|
||||
default: "level3"
|
||||
selector:
|
||||
select:
|
||||
translation_key: "level_setting"
|
||||
options:
|
||||
- "level1"
|
||||
- "level2"
|
||||
- "level3"
|
||||
- "level4"
|
||||
night_pollution_level:
|
||||
default: "level2"
|
||||
selector:
|
||||
select:
|
||||
translation_key: "level_setting"
|
||||
options:
|
||||
- "level1"
|
||||
- "level2"
|
||||
- "level3"
|
||||
- "level4"
|
||||
humidity_control:
|
||||
default: true
|
||||
selector:
|
||||
boolean:
|
||||
airquality_control:
|
||||
default: true
|
||||
selector:
|
||||
boolean:
|
||||
co2_control:
|
||||
default: true
|
||||
selector:
|
||||
boolean:
|
||||
co2_threshold:
|
||||
default: 600
|
||||
selector:
|
||||
number:
|
||||
min: 400
|
||||
max: 2000
|
||||
step: 50
|
||||
unit_of_measurement: "ppm"
|
||||
mode: slider
|
||||
co2_hysteresis:
|
||||
default: 100
|
||||
selector:
|
||||
number:
|
||||
min: 50
|
||||
max: 400
|
||||
step: 50
|
||||
unit_of_measurement: "ppm"
|
||||
mode: slider
|
|
@ -162,5 +162,86 @@
|
|||
"name": "Bypass level"
|
||||
}
|
||||
}
|
||||
},
|
||||
"selector": {
|
||||
"level_setting": {
|
||||
"options": {
|
||||
"off": "[%key:common::state::off%]",
|
||||
"level1": "[%key:component::renson::entity::sensor::ventilation_level::state::level1%]",
|
||||
"level2": "[%key:component::renson::entity::sensor::ventilation_level::state::level2%]",
|
||||
"level3": "[%key:component::renson::entity::sensor::ventilation_level::state::level3%]",
|
||||
"level4": "[%key:component::renson::entity::sensor::ventilation_level::state::level4%]",
|
||||
"breeze": "[%key:component::renson::entity::sensor::ventilation_level::state::breeze%]",
|
||||
"holiday": "[%key:component::renson::entity::sensor::ventilation_level::state::holiday%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
"set_timer_level": {
|
||||
"name": "Set timer",
|
||||
"description": "Set the ventilation timer",
|
||||
"fields": {
|
||||
"timer_level": {
|
||||
"name": "Level",
|
||||
"description": "Level setting"
|
||||
},
|
||||
"minutes": {
|
||||
"name": "Time",
|
||||
"description": "Time of the timer (0 will disable the timer)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"set_breeze": {
|
||||
"name": "Set breeze",
|
||||
"description": "Set the breeze function of the ventilation system",
|
||||
"fields": {
|
||||
"breeze_level": {
|
||||
"name": "[%key:component::renson::services::set_timer_level::fields::timer_level::name%]",
|
||||
"description": "Ventilation level when breeze function is activated"
|
||||
},
|
||||
"temperature": {
|
||||
"name": "Temperature",
|
||||
"description": "Temperature when the breeze function should be activated"
|
||||
},
|
||||
"activate": {
|
||||
"name": "Activate",
|
||||
"description": "Activate or disable the breeze feature"
|
||||
}
|
||||
}
|
||||
},
|
||||
"set_pollution_settings": {
|
||||
"name": "Set pollution settings",
|
||||
"description": "Set all the pollution settings of the ventilation system",
|
||||
"fields": {
|
||||
"day_pollution_level": {
|
||||
"name": "Day pollution Level",
|
||||
"description": "Ventilation level when pollution is detected in the day"
|
||||
},
|
||||
"night_pollution_level": {
|
||||
"name": "Night pollution Level",
|
||||
"description": "Ventilation level when pollution is detected in the night"
|
||||
},
|
||||
"humidity_control": {
|
||||
"name": "Enable humidity control",
|
||||
"description": "Activate or disable the humidity control"
|
||||
},
|
||||
"airquality_control": {
|
||||
"name": "Enable air quality control",
|
||||
"description": "Activate or disable the air quality control"
|
||||
},
|
||||
"co2_control": {
|
||||
"name": "Enable CO2 control",
|
||||
"description": "Activate or disable the CO2 control"
|
||||
},
|
||||
"co2_threshold": {
|
||||
"name": "CO2 threshold",
|
||||
"description": "Sets the CO2 pollution threshold level in ppm"
|
||||
},
|
||||
"co2_hysteresis": {
|
||||
"name": "CO2 hysteresis",
|
||||
"description": "Sets the CO2 pollution threshold hysteresis level in ppm"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue