Co-authored-by: clydebarrow <2366188+clydebarrow@users.noreply.github.com>
75 lines
2.2 KiB
Python
75 lines
2.2 KiB
Python
import esphome.codegen as cg
|
|
from esphome.components import switch
|
|
import esphome.config_validation as cv
|
|
from esphome.const import CONF_LIGHT, DEVICE_CLASS_SWITCH, ENTITY_CATEGORY_CONFIG
|
|
import esphome.final_validate as fv
|
|
|
|
from .. import gree_ns
|
|
from ..climate import CONF_MODEL, GreeClimate
|
|
|
|
CODEOWNERS = ["@nagyrobi"]
|
|
|
|
GreeModeBitSwitch = gree_ns.class_("GreeModeBitSwitch", switch.Switch, cg.Component)
|
|
|
|
CONF_TURBO = "turbo"
|
|
CONF_HEALTH = "health"
|
|
CONF_XFAN = "xfan"
|
|
CONF_GREE_ID = "gree_id"
|
|
|
|
# Switch configurations: (config_key, display_name, bit_mask, icon)
|
|
SWITCH_CONFIGS = (
|
|
(CONF_TURBO, "Gree Turbo Switch", 0x10, "mdi:car-turbocharger"),
|
|
(CONF_LIGHT, "Gree Light Switch", 0x20, "mdi:led-outline"),
|
|
(CONF_HEALTH, "Gree Health Switch", 0x40, "mdi:pine-tree"),
|
|
(CONF_XFAN, "Gree X-FAN Switch", 0x80, "mdi:wall-sconce-flat"),
|
|
)
|
|
|
|
SUPPORTED_MODELS = {
|
|
"yan",
|
|
"yaa",
|
|
"yac",
|
|
"yac1fb9",
|
|
}
|
|
|
|
CONFIG_SCHEMA = cv.Schema(
|
|
{
|
|
cv.Required(CONF_GREE_ID): cv.use_id(GreeClimate),
|
|
**{
|
|
cv.Optional(key): switch.switch_schema(
|
|
GreeModeBitSwitch,
|
|
icon=icon,
|
|
default_restore_mode="RESTORE_DEFAULT_OFF",
|
|
device_class=DEVICE_CLASS_SWITCH,
|
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
|
)
|
|
for key, _, _, icon in SWITCH_CONFIGS
|
|
},
|
|
}
|
|
)
|
|
|
|
|
|
def _validate_model(config):
|
|
full_config = fv.full_config.get()
|
|
climate_path = full_config.get_path_for_id(config[CONF_GREE_ID])[:-1]
|
|
climate_conf = full_config.get_config_for_path(climate_path)
|
|
if climate_conf[CONF_MODEL] not in SUPPORTED_MODELS:
|
|
raise cv.Invalid(
|
|
"Gree switches are only supported for the "
|
|
+ ", ".join(SUPPORTED_MODELS)
|
|
+ " models"
|
|
)
|
|
|
|
|
|
FINAL_VALIDATE_SCHEMA = _validate_model
|
|
|
|
|
|
async def to_code(config):
|
|
parent = await cg.get_variable(config[CONF_GREE_ID])
|
|
|
|
for conf_key, name, bit_mask, _ in SWITCH_CONFIGS:
|
|
if switch_conf := config.get(conf_key):
|
|
sw = cg.new_Pvariable(switch_conf[cv.CONF_ID], name, bit_mask)
|
|
await switch.register_switch(sw, switch_conf)
|
|
await cg.register_component(sw, switch_conf)
|
|
await cg.register_parented(sw, parent)
|