88 lines
3 KiB
Python
88 lines
3 KiB
Python
import esphome.codegen as cg
|
|
from esphome.components import switch
|
|
import esphome.config_validation as cv
|
|
from esphome.const import CONF_BEEPER, CONF_DISPLAY, ENTITY_CATEGORY_CONFIG
|
|
import esphome.final_validate as fv
|
|
|
|
from ..climate import (
|
|
CONF_HAIER_ID,
|
|
CONF_PROTOCOL,
|
|
PROTOCOL_HON,
|
|
HaierClimateBase,
|
|
haier_ns,
|
|
)
|
|
|
|
CODEOWNERS = ["@paveldn"]
|
|
BeeperSwitch = haier_ns.class_("BeeperSwitch", switch.Switch)
|
|
HealthModeSwitch = haier_ns.class_("HealthModeSwitch", switch.Switch)
|
|
DisplaySwitch = haier_ns.class_("DisplaySwitch", switch.Switch)
|
|
QuietModeSwitch = haier_ns.class_("QuietModeSwitch", switch.Switch)
|
|
|
|
# Haier switches
|
|
CONF_HEALTH_MODE = "health_mode"
|
|
CONF_QUIET_MODE = "quiet_mode"
|
|
|
|
# Additional icons
|
|
ICON_LEAF = "mdi:leaf"
|
|
ICON_LED_ON = "mdi:led-on"
|
|
ICON_VOLUME_HIGH = "mdi:volume-high"
|
|
ICON_VOLUME_OFF = "mdi:volume-off"
|
|
|
|
CONFIG_SCHEMA = cv.Schema(
|
|
{
|
|
cv.GenerateID(CONF_HAIER_ID): cv.use_id(HaierClimateBase),
|
|
cv.Optional(CONF_DISPLAY): switch.switch_schema(
|
|
DisplaySwitch,
|
|
icon=ICON_LED_ON,
|
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
|
default_restore_mode="DISABLED",
|
|
),
|
|
cv.Optional(CONF_HEALTH_MODE): switch.switch_schema(
|
|
HealthModeSwitch,
|
|
icon=ICON_LEAF,
|
|
default_restore_mode="DISABLED",
|
|
),
|
|
# Beeper switch is only supported for HonClimate
|
|
cv.Optional(CONF_BEEPER): switch.switch_schema(
|
|
BeeperSwitch,
|
|
icon=ICON_VOLUME_HIGH,
|
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
|
default_restore_mode="DISABLED",
|
|
),
|
|
# Quiet mode is only supported for HonClimate
|
|
cv.Optional(CONF_QUIET_MODE): switch.switch_schema(
|
|
QuietModeSwitch,
|
|
icon=ICON_VOLUME_OFF,
|
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
|
default_restore_mode="DISABLED",
|
|
),
|
|
}
|
|
)
|
|
|
|
|
|
def _final_validate(config):
|
|
full_config = fv.full_config.get()
|
|
for switch_type in [CONF_BEEPER, CONF_QUIET_MODE]:
|
|
# Check switches that are only supported for HonClimate
|
|
if config.get(switch_type):
|
|
climate_path = full_config.get_path_for_id(config[CONF_HAIER_ID])[:-1]
|
|
climate_conf = full_config.get_config_for_path(climate_path)
|
|
protocol_type = climate_conf.get(CONF_PROTOCOL)
|
|
if protocol_type.casefold() != PROTOCOL_HON.casefold():
|
|
raise cv.Invalid(
|
|
f"{switch_type} switch is only supported for hon climate"
|
|
)
|
|
return config
|
|
|
|
|
|
FINAL_VALIDATE_SCHEMA = _final_validate
|
|
|
|
|
|
async def to_code(config):
|
|
parent = await cg.get_variable(config[CONF_HAIER_ID])
|
|
|
|
for switch_type in [CONF_DISPLAY, CONF_HEALTH_MODE, CONF_BEEPER, CONF_QUIET_MODE]:
|
|
if conf := config.get(switch_type):
|
|
sw_var = await switch.new_switch(conf)
|
|
await cg.register_parented(sw_var, parent)
|
|
cg.add(getattr(parent, f"set_{switch_type}_switch")(sw_var))
|