Add custom services for renson fans ()

Co-authored-by: Robert Resch <robert@resch.dev>
pull/105232/head
jimmyd-be 2023-12-07 09:57:01 +01:00 committed by GitHub
parent 0728106c98
commit d61814a1ed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 287 additions and 0 deletions
homeassistant/components/renson

View File

@ -1,3 +1,4 @@
"""Constants for the Renson integration."""
DOMAIN = "renson"

View File

@ -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,
)

View File

@ -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

View File

@ -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"
}
}
}
}
}