diff --git a/README.md b/README.md index ece7b84..722fd49 100644 --- a/README.md +++ b/README.md @@ -97,18 +97,18 @@ Humidifier components allows the following: - Control on/off - Control fan speed +- Control target humidity +- Monitor current humidity +- Monitor current temperature - Control presets -- Control internal presets - Control warm mist - Control UV - Control ionizer - Control lock - Control mute -- Control target humidity -- Monitor humidity -- Monitor temperature - Monitor empty water tank -- Control clock +- Control LED mode, presets and brightness +- Adjust clock ## Thermostat diff --git a/components/ehu/__init__.py b/components/ehu/__init__.py index 0ec6aa1..89ffb07 100644 --- a/components/ehu/__init__.py +++ b/components/ehu/__init__.py @@ -46,7 +46,10 @@ CONF_WATER = "water" CONF_FAN = "fan" CONF_TARGET_HUMIDITY = "target_humidity" - +CONF_LED_BRIGHTNESS = "led_brightness" +CONF_LED_PRESET = "led_preset" +CONF_LED_TOP = "led_top" +CONF_LED_BOTTOM = "led_bottom" rka_ns = rka_api.rka_ns ehu_ns = cg.esphome_ns.namespace("ehu") @@ -56,14 +59,14 @@ EHUState = ehu_ns.struct("ehu_state_t") EHUSwitch = ehu_ns.class_("EHUSwitch", eh_switch.Switch, cg.Component) -EHUWarmMistSwitch = ehu_ns.class_("EHUWarmMistSwitch", eh_switch.Switch, cg.Component) -EHUUVSwitch = ehu_ns.class_("EHUUVSwitch", eh_switch.Switch, cg.Component) +EHUDependedSwitch = ehu_ns.class_("EHUDependedSwitch", eh_switch.Switch, cg.Component) EHUFan = ehu_ns.class_("EHUFan", fan.Fan, cg.Component) -EHUTargetHumidity = ehu_ns.class_("EHUTargetHumidity", number.Number, cg.Component) -EHUSpeed = ehu_ns.class_("EHUSpeed", number.Number, cg.Component) -EHUPreset = ehu_ns.class_("EHUPreset", select.Select, cg.Component) +EHUFanPreset = ehu_ns.class_("EHUFanPreset", select.Select, cg.Component) +EHUNumber = ehu_ns.class_("EHUNumber", number.Number, cg.Component) +EHULedPreset = ehu_ns.class_("EHULedPreset", select.Select, cg.Component) EHUPacketType = ehu_ns.enum("ehu_packet_type_t", is_class=True) +EHUStateType = ehu_ns.enum("ehu_state_t", is_class=True) CONFIG_SCHEMA = rka_api.api_schema( EHUApi, trigger_class=rka_api.update_trigger(EHUApi, EHUState) @@ -93,7 +96,11 @@ ), cv.Optional(CONF_WARM_MIST): cv.maybe_simple_value( eh_switch.switch_schema( - EHUWarmMistSwitch, + EHUDependedSwitch.template( + EHUPacketType.PACKET_REQ_SET_WARM_MIST_UV, + EHUStateType.WATER_WARM_MIST, + EHUStateType.WATER_UV, + ), entity_category=ENTITY_CATEGORY_CONFIG, block_inverted=True, ), @@ -101,7 +108,11 @@ ), cv.Optional(CONF_UV): cv.maybe_simple_value( eh_switch.switch_schema( - EHUUVSwitch, + EHUDependedSwitch.template( + EHUPacketType.PACKET_REQ_SET_WARM_MIST_UV, + EHUStateType.WATER_UV, + EHUStateType.WATER_WARM_MIST, + ), entity_category=ENTITY_CATEGORY_CONFIG, block_inverted=True, ), @@ -141,7 +152,7 @@ ), cv.Optional(CONF_TARGET_HUMIDITY): cv.maybe_simple_value( number.number_schema( - EHUTargetHumidity, + EHUNumber.template(EHUPacketType.PACKET_REQ_SET_HUMIDITY), device_class=DEVICE_CLASS_HUMIDITY, unit_of_measurement=UNIT_PERCENT, ), @@ -149,18 +160,54 @@ ), cv.Optional(CONF_SPEED): cv.maybe_simple_value( number.number_schema( - EHUSpeed, + EHUNumber.template(EHUPacketType.PACKET_REQ_SET_SPEED), icon="mdi:fan", ), key=CONF_NAME, ), cv.Optional(CONF_PRESET): cv.maybe_simple_value( select.select_schema( - EHUPreset, + EHUFanPreset, icon="mdi:tune", ), key=CONF_NAME, ), + cv.Optional(CONF_LED_BRIGHTNESS): cv.maybe_simple_value( + number.number_schema( + EHUNumber.template(EHUPacketType.PACKET_REQ_SET_LED_BRIGHTNESS), + ), + key=CONF_NAME, + ), + cv.Optional(CONF_LED_TOP): cv.maybe_simple_value( + eh_switch.switch_schema( + EHUDependedSwitch.template( + EHUPacketType.PACKET_REQ_SET_LED_MODE, + EHUStateType.LED_MODE_TOP, + EHUStateType.LED_MODE_BOTTOM, + ), + entity_category=ENTITY_CATEGORY_CONFIG, + block_inverted=True, + ), + key=CONF_NAME, + ), + cv.Optional(CONF_LED_BOTTOM): cv.maybe_simple_value( + eh_switch.switch_schema( + EHUDependedSwitch.template( + EHUPacketType.PACKET_REQ_SET_LED_MODE, + EHUStateType.LED_MODE_BOTTOM, + EHUStateType.LED_MODE_TOP, + ), + entity_category=ENTITY_CATEGORY_CONFIG, + block_inverted=True, + ), + key=CONF_NAME, + ), + cv.Optional(CONF_LED_PRESET): cv.maybe_simple_value( + select.select_schema( + EHULedPreset, + ), + key=CONF_NAME, + ), } ).extend(cv.polling_component_schema("15s")) @@ -169,6 +216,7 @@ async def setup_sensor(config: dict, key: str, fn): if conf := config.get(key, None): sens = await sensor.new_sensor(conf) cg.add(fn(sens)) + return sens async def setup_switch(config: dict, key: str, fn): @@ -177,12 +225,14 @@ async def setup_switch(config: dict, key: str, fn): var = await eh_switch.new_switch(config[key], parent) await cg.register_component(var, config[key]) cg.add(fn(var)) + return var async def setup_binary_sensor(config: dict, key: str, fn): if key in config: var = await binary_sensor.new_binary_sensor(config[key]) cg.add(fn(var)) + return var async def fan_new_fan(config: dict, *args): @@ -197,16 +247,18 @@ async def setup_fan(config: dict, key: str, fn): var = await fan_new_fan(conf, parent) await cg.register_component(var, conf) cg.add(fn(var)) + return var async def setup_number(config: dict, key: str, fn, min_value, max_value, step=1): if conf := config.get(key, None): - api = await cg.get_variable(config[CONF_EHU_ID]) + parent = await cg.get_variable(config[CONF_ID]) var = await number.new_number( - conf, api, min_value=min_value, max_value=max_value, step=step + conf, parent, min_value=min_value, max_value=max_value, step=step ) await cg.register_component(var, conf) cg.add(fn(var)) + return var async def select_new_select(config: dict, *args, options: list[str]): @@ -222,6 +274,7 @@ async def setup_select(config: dict, key: str, fn, options: list[str]): var = await select_new_select(conf, parent, options=options) await cg.register_component(var, conf) cg.add(fn(var)) + return var async def new_ehu(config): @@ -231,18 +284,30 @@ async def new_ehu(config): await setup_sensor(config, CONF_TEMPERATURE, var.set_temperature_sensor) await setup_sensor(config, CONF_HUMIDITY, var.set_humidity_sensor) - - await setup_switch(config, CONF_WARM_MIST, var.set_warm_mist_switch) - await setup_switch(config, CONF_UV, var.set_uv_switch) + water_wm = await setup_switch(config, CONF_WARM_MIST, var.set_warm_mist_switch) + water_uv = await setup_switch(config, CONF_UV, var.set_uv_switch) + if water_wm and water_uv: + cg.add(water_wm.set_second(water_uv)) + cg.add(water_uv.set_second(water_wm)) await setup_switch(config, CONF_IONIZER, var.set_ionizer_switch) await setup_switch(config, CONF_LOCK, var.set_lock_switch) await setup_switch(config, CONF_MUTE, var.set_mute_switch) - await setup_binary_sensor(config, CONF_WATER, var.set_water_binary_sensor) await setup_fan(config, CONF_FAN, var.set_fan) - await setup_number(config, CONF_TARGET_HUMIDITY, var.set_target_humidity, 30, 85) - await setup_number(config, CONF_SPEED, var.set_speed, 0, 3) - await setup_select(config, CONF_PRESET, var.set_preset, []) + await setup_number( + config, CONF_TARGET_HUMIDITY, var.set_target_humidity_number, 30, 85 + ) + await setup_number(config, CONF_SPEED, var.set_fan_speed_number, 0, 3) + await setup_select(config, CONF_PRESET, var.set_fan_preset_select, []) + await setup_number( + config, CONF_LED_BRIGHTNESS, var.set_led_brightness_number, 33, 99 + ) + led_top = await setup_switch(config, CONF_LED_TOP, var.set_led_top_switch) + led_bot = await setup_switch(config, CONF_LED_BOTTOM, var.set_led_bottom_switch) + if led_top and led_bot: + cg.add(led_top.set_second(led_bot)) + cg.add(led_bot.set_second(led_top)) + await setup_select(config, CONF_LED_PRESET, var.set_led_preset_select, []) if CONF_TIME_ID in config: time_ = await cg.get_variable(config[CONF_TIME_ID]) diff --git a/components/ehu/ehu_api.cpp b/components/ehu/ehu_api.cpp index 66b1c8a..86298b0 100644 --- a/components/ehu/ehu_api.cpp +++ b/components/ehu/ehu_api.cpp @@ -56,5 +56,10 @@ void EHUApi::set_clock(uint8_t hours, uint8_t minutes) { this->write(ehu_packet_type_t::PACKET_REQ_SET_CLOCK, data); } +void EHUApi::set_led_preset(uint8_t led_preset) { + ESP_LOGD(TAG, "Set led preset to %u", led_preset); + this->write_byte(ehu_packet_type_t::PACKET_REQ_SET_LED_PRESET, led_preset); +} + } // namespace ehu } // namespace esphome diff --git a/components/ehu/ehu_api.h b/components/ehu/ehu_api.h index 7f09096..3db2f40 100644 --- a/components/ehu/ehu_api.h +++ b/components/ehu/ehu_api.h @@ -34,6 +34,7 @@ class EHUApi : public EHUApiBase { void set_mute(bool mute); void set_clock(uint8_t hours, uint8_t minutes); + void set_led_preset(uint8_t led_preset); }; } // namespace ehu diff --git a/components/ehu/ehu_component.cpp b/components/ehu/ehu_component.cpp index a0a15a5..93a641c 100644 --- a/components/ehu/ehu_component.cpp +++ b/components/ehu/ehu_component.cpp @@ -21,12 +21,20 @@ static const std::string PRESET_MEDITATION = "Meditation"; // 08 - Медита static const std::string PRESET_PRANA = "Prana"; // 0C - Prana static const std::string PRESET_MANUAL = "Manual"; // 0F - ручной -#define ALL_PRESETS \ +static const std::string LED_PRESET_RANDOM = "Random"; // 01 - случайный цвет +static const std::string LED_PRESET_BLUE = "Blue"; // 02 - синий +static const std::string LED_PRESET_GREEN = "Green"; // 03 - зеленый +static const std::string LED_PRESET_WHITE = "White"; // 04 - белый. + +#define ALL_FAN_PRESETS \ { \ PRESET_AUTO, PRESET_HEALTH, PRESET_NIGHT, PRESET_BABY, PRESET_FITNESS, PRESET_YOGA, PRESET_MEDITATION, \ PRESET_PRANA, PRESET_MANUAL, \ } +#define ALL_LED_PRESETS \ + { LED_PRESET_RANDOM, LED_PRESET_BLUE, LED_PRESET_GREEN, LED_PRESET_WHITE } + void EHUComponent::dump_config_(const char *TAG) const { LOG_SENSOR(" ", "Temperature", this->temperature_); LOG_SENSOR(" ", "Humidity", this->humidity_); @@ -37,6 +45,13 @@ void EHUComponent::dump_config_(const char *TAG) const { LOG_SWITCH(" ", "Mute", this->mute_); LOG_BINARY_SENSOR(" ", "Water", this->water_); // LOG_FAN(" ", "Fan", this->fan_); + LOG_NUMBER(" ", "Target Humidity", this->target_humidity_); + LOG_NUMBER(" ", "Speed", this->fan_speed_); + LOG_SELECT(" ", "Preset", this->fan_preset_); + LOG_NUMBER(" ", "LED Brightness", this->led_brightness_); + LOG_SWITCH(" ", "LED Top", this->led_top_); + LOG_SWITCH(" ", "LED Bottom", this->led_bottom_); + LOG_SELECT(" ", "LED Preset", this->led_preset_); } void EHUComponent::on_state(const ehu_state_t &state) { @@ -60,9 +75,21 @@ void EHUComponent::on_state(const ehu_state_t &state) { this->publish_state_(this->water_, !state.water_tank_empty); this->publish_fan_state_(state); this->publish_state_(this->target_humidity_, state.target_humidity); - this->publish_state_(this->speed_, state.fan_speed); - if (this->preset_) { - this->preset_->publish_state(this->get_preset_(state)); + this->publish_state_(this->fan_speed_, state.fan_speed); + if (this->fan_preset_) { + auto &preset = this->get_fan_preset_(state); + if (!preset.empty()) { + this->fan_preset_->publish_state(preset); + } + } + this->publish_state_(this->led_brightness_, state.led_brightness); + this->publish_state_(this->led_top_, state.led_mode & ehu_state_t::LED_MODE_TOP); + this->publish_state_(this->led_bottom_, state.led_mode & ehu_state_t::LED_MODE_BOTTOM); + if (this->led_preset_) { + auto &preset = this->get_led_preset_(state); + if (!preset.empty()) { + this->led_preset_->publish_state(preset); + } } } @@ -83,7 +110,7 @@ void EHUComponent::publish_fan_state_(const ehu_state_t &state) { has_changes = true; } - auto &preset = this->get_preset_(state); + auto &preset = this->get_fan_preset_(state); if (preset != this->fan_->preset_mode) { this->fan_->preset_mode = preset; has_changes = true; @@ -94,7 +121,7 @@ void EHUComponent::publish_fan_state_(const ehu_state_t &state) { } } -const std::string &EHUComponent::get_preset_(const ehu_state_t &state) const { +const std::string &EHUComponent::get_fan_preset_(const ehu_state_t &state) const { switch (state.preset) { case ehu_state_t::PRESET_AUTO: return PRESET_AUTO; @@ -115,11 +142,12 @@ const std::string &EHUComponent::get_preset_(const ehu_state_t &state) const { case ehu_state_t::PRESET_YOGA: return PRESET_YOGA; default: + ESP_LOGW(TAG, "Unknown fan preset %u", state.led_preset); return PRESET__EMPTY; } } -void EHUComponent::write_preset_(const std::string &preset) const { +void EHUComponent::write_fan_preset_(const std::string &preset) const { if (preset.empty()) { return; } @@ -144,6 +172,22 @@ void EHUComponent::write_preset_(const std::string &preset) const { } } +const std::string &EHUComponent::get_led_preset_(const ehu_state_t &state) const { + switch (state.led_preset) { + case ehu_state_t::LED_PRESET_RANDOM: + return LED_PRESET_RANDOM; + case ehu_state_t::LED_PRESET_BLUE: + return LED_PRESET_BLUE; + case ehu_state_t::LED_PRESET_GREEN: + return LED_PRESET_GREEN; + case ehu_state_t::LED_PRESET_WHITE: + return LED_PRESET_WHITE; + default: + ESP_LOGW(TAG, "Unknown LED preset %u", state.led_preset); + return PRESET__EMPTY; + } +} + void EHUFan::control(const fan::FanCall &call) { if (call.get_state().has_value() && !*call.get_state()) { this->parent_->api_->set_speed(0); @@ -153,18 +197,37 @@ void EHUFan::control(const fan::FanCall &call) { this->parent_->api_->set_speed(*call.get_speed()); } - this->parent_->write_preset_(call.get_preset_mode()); + this->parent_->write_fan_preset_(call.get_preset_mode()); } fan::FanTraits EHUFan::get_traits() { auto traits = fan::FanTraits(); traits.set_speed(true); traits.set_supported_speed_count(3); - traits.set_supported_preset_modes(ALL_PRESETS); + traits.set_supported_preset_modes(ALL_FAN_PRESETS); return traits; } -void EHUPreset::setup() { this->traits.set_options(ALL_PRESETS); } +void EHUFanPreset::setup() { this->traits.set_options(ALL_FAN_PRESETS); } + +void EHULedPreset::setup() { this->traits.set_options(ALL_LED_PRESETS); } + +void EHULedPreset::control(const std::string &value) { + if (value.empty()) { + return; + } + if (value == LED_PRESET_RANDOM) { + this->parent_->api_->set_led_preset(ehu_state_t::LED_PRESET_RANDOM); + } else if (value == LED_PRESET_BLUE) { + this->parent_->api_->set_led_preset(ehu_state_t::LED_PRESET_BLUE); + } else if (value == LED_PRESET_GREEN) { + this->parent_->api_->set_led_preset(ehu_state_t::LED_PRESET_GREEN); + } else if (value == LED_PRESET_WHITE) { + this->parent_->api_->set_led_preset(ehu_state_t::LED_PRESET_WHITE); + } else { + ESP_LOGW(TAG, "Unknown led preset %s", value.c_str()); + } +} } // namespace ehu } // namespace esphome diff --git a/components/ehu/ehu_component.h b/components/ehu/ehu_component.h index 95fd6e5..5eecf03 100644 --- a/components/ehu/ehu_component.h +++ b/components/ehu/ehu_component.h @@ -22,11 +22,10 @@ namespace ehu { using EHUComponentBase = rka_api::RKAComponent; class EHUComponent : public EHUComponentBase { - template friend class EHUSwitch; - friend class EHUWarmMistSwitch; - friend class EHUUVSwitch; + template friend class EHUCommandComponent; friend class EHUFan; - friend class EHUPreset; + friend class EHUFanPreset; + friend class EHULedPreset; public: explicit EHUComponent(EHUApi *api) : EHUComponentBase(api) {} @@ -40,20 +39,20 @@ class EHUComponent : public EHUComponentBase { void set_temperature_sensor(sensor::Sensor *temperature) { this->temperature_ = temperature; } void set_humidity_sensor(sensor::Sensor *humidity) { this->humidity_ = humidity; } - void set_warm_mist_switch(switch_::Switch *warm_mist) { this->warm_mist_ = warm_mist; } void set_uv_switch(switch_::Switch *uv) { this->uv_ = uv; } void set_ionizer_switch(switch_::Switch *ionizer) { this->ionizer_ = ionizer; } void set_lock_switch(switch_::Switch *lock) { this->lock_ = lock; } void set_mute_switch(switch_::Switch *mute) { this->mute_ = mute; } - void set_water_binary_sensor(binary_sensor::BinarySensor *water) { this->water_ = water; } - void set_fan(fan::Fan *fan) { this->fan_ = fan; } - - void set_target_humidity(number::Number *target_humidity) { this->target_humidity_ = target_humidity; } - void set_speed(number::Number *speed) { this->speed_ = speed; } - void set_preset(select::Select *preset) { this->preset_ = preset; } + void set_target_humidity_number(number::Number *target_humidity) { this->target_humidity_ = target_humidity; } + void set_fan_speed_number(number::Number *fan_speed) { this->fan_speed_ = fan_speed; } + void set_fan_preset_select(select::Select *fan_preset) { this->fan_preset_ = fan_preset; } + void set_led_brightness_number(number::Number *led_brightness) { this->led_brightness_ = led_brightness; } + void set_led_top_switch(switch_::Switch *led_top) { this->led_top_ = led_top_; } + void set_led_bottom_switch(switch_::Switch *led_bottom) { this->led_bottom_ = led_bottom; } + void set_led_preset_select(select::Select *led_preset) { this->led_preset_ = led_preset; } protected: #ifdef USE_TIME @@ -74,8 +73,12 @@ class EHUComponent : public EHUComponentBase { fan::Fan *fan_{}; number::Number *target_humidity_{}; - number::Number *speed_{}; - select::Select *preset_{}; + number::Number *fan_speed_{}; + select::Select *fan_preset_{}; + number::Number *led_brightness_{}; + switch_::Switch *led_top_{}; + switch_::Switch *led_bottom_{}; + select::Select *led_preset_{}; void dump_config_(const char *TAG) const; @@ -86,27 +89,34 @@ class EHUComponent : public EHUComponentBase { } void publish_fan_state_(const ehu_state_t &state); - void write_preset_(const std::string &preset) const; - const std::string &get_preset_(const ehu_state_t &state) const; + void write_fan_preset_(const std::string &preset) const; + const std::string &get_fan_preset_(const ehu_state_t &state) const; + const std::string &get_led_preset_(const ehu_state_t &state) const; }; -template class EHUSwitch : public switch_::Switch, public Component, public Parented { +template class EHUCommandComponent : public Component, public Parented { public: - EHUSwitch(EHUComponent *c) : Parented(c) {} - void write_state(bool state) override { this->write_byte_(state); } + EHUCommandComponent(EHUComponent *c) : Parented(c) {} protected: void write_byte_(uint8_t data) { - if (cmd_v != 0) { + if constexpr (cmd_v != 0) { this->parent_->api_->write_byte(cmd_v, data); } } }; -template -class EHUWaterSwitchBase : public EHUSwitch { - protected: - EHUWaterSwitchBase(EHUComponent *c, switch_::Switch *second) : EHUSwitch(c) {} +template class EHUSwitch : public switch_::Switch, public EHUCommandComponent { + public: + EHUSwitch(EHUComponent *c) : EHUCommandComponent(c) {} + void write_state(bool state) override { this->write_byte_(state); } +}; + +template +class EHUDependedSwitch : public EHUSwitch { + public: + EHUDependedSwitch(EHUComponent *c) : EHUSwitch(c) {} + void set_second(switch_::Switch *second) { this->second_ = second; } public: void write_state(bool state) override { @@ -124,16 +134,6 @@ class EHUWaterSwitchBase : public EHUSwitch { - public: - EHUWarmMistSwitch(EHUComponent *c) : EHUWaterSwitchBase(c, c->uv_) {} -}; - -class EHUUVSwitch : public EHUWaterSwitchBase { - public: - EHUUVSwitch(EHUComponent *c) : EHUWaterSwitchBase(c, c->warm_mist_) {} -}; - class EHUFan : public Component, public fan::Fan, Parented { public: explicit EHUFan(EHUComponent *c) : Parented(c) {} @@ -141,23 +141,24 @@ class EHUFan : public Component, public fan::Fan, Parented { void control(const fan::FanCall &call) override; }; -class EHUTargetHumidity : public number::Number, public Component, Parented { +template class EHUNumber : public number::Number, public EHUCommandComponent { public: - EHUTargetHumidity(EHUApi *api) : Parented(api) {} - void control(float value) override { this->parent_->set_humidity(value); } + EHUNumber(EHUComponent *c) : EHUCommandComponent(c) {} + void control(float value) override { this->write_byte_(value); } }; -class EHUSpeed : public number::Number, public Component, Parented { +class EHUFanPreset : public select::Select, public Component, Parented { public: - EHUSpeed(EHUApi *api) : Parented(api) {} - void control(float value) override { this->parent_->set_speed(value); } + EHUFanPreset(EHUComponent *c) : Parented(c) {} + void setup() override; + void control(const std::string &value) override { this->parent_->write_fan_preset_(value); } }; -class EHUPreset : public select::Select, public Component, Parented { +class EHULedPreset : public select::Select, public Component, Parented { public: - EHUPreset(EHUComponent *c) : Parented(c) {} + EHULedPreset(EHUComponent *c) : Parented(c) {} void setup() override; - void control(const std::string &value) override { this->parent_->write_preset_(value); } + void control(const std::string &value) override; }; } // namespace ehu diff --git a/components/ehu/ehu_data.h b/components/ehu/ehu_data.h index f2b3223..6c1ac5d 100644 --- a/components/ehu/ehu_data.h +++ b/components/ehu/ehu_data.h @@ -38,10 +38,23 @@ enum ehu_packet_type_t : uint8_t { // aa021100bd выключить ионизацию PACKET_REQ_SET_IONIZER = 0x11, + // Установка часов: + // aa031b0000c8 - 00 часов 00 минут + // aa031b0c00d4 - 12 часов 00 минут + // aa031b0c0fe3 - 12 часов 15 минут + PACKET_REQ_SET_CLOCK = 0x1B, + + // aa02 19 55 1a установить влажность CO - 85% + // aa02 19 50 15 установить влажность 80 + // aa02 19 4b 10 установить влажность 75 + // aa02 19 46 0b установить влажность 70 + // aa02 19 41 06 установить влажность 65 + PACKET_REQ_SET_HUMIDITY = 0x19, + // aa02176326 яркость подсветки максимальная // aa02174205 яркость подсветки средняя // aa021721e4 яркость подсветки минимальная - PACKET_REQ_SET_BRIGHTNESS = 0x17, + PACKET_REQ_SET_LED_BRIGHTNESS = 0x17, // aa021601c3 режим подсветки случайные цвета // aa021602c4 режим подсветки синий @@ -56,7 +69,6 @@ enum ehu_packet_type_t : uint8_t { // aa03181e00e3 длительность горения цветов 30 // aa03181f00e4 длительность гореция цветов 31 - // ---промежуточные значения--- // aa03185a001f длительность гореция цветов 90 @@ -65,18 +77,7 @@ enum ehu_packet_type_t : uint8_t { // ---промежуточные значения--- // aa031800b479 время переключения цветов 180 - // Установка часов: - // aa031b0000c8 - 00 часов 00 минут - // aa031b0c00d4 - 12 часов 00 минут - // aa031b0c0fe3 - 12 часов 15 минут - PACKET_REQ_SET_CLOCK = 0x1B, - - // aa02 19 55 1a установить влажность CO - 85% - // aa02 19 50 15 установить влажность 80 - // aa02 19 4b 10 установить влажность 75 - // aa02 19 46 0b установить влажность 70 - // aa02 19 41 06 установить влажность 65 - PACKET_REQ_SET_HUMIDITY = 0x19, + // aa03081004c9 - будильник 12 часов 18 минут интервал 5 минут }; // Response for PACKET_REQ_STATE. @@ -107,9 +108,18 @@ struct ehu_state_t { uint8_t _unknown16; // 16 unknown bool lock : 8; // 17 LOCK физ кнопок On-Off uint8_t _display_mode; // 18 Отображение температуры или времени при выкл состояние - uint8_t _led1; // 19 Подсветка цвет от 0 до 4 (бак или нижняя ???) - uint8_t _led2; // 20 Тоже подсветка (бак или нижняя ???) - uint8_t _demo_mode; // 21 Режим демонстрации (bool???) + enum : uint8_t { + LED_PRESET_RANDOM = 1, + LED_PRESET_BLUE = 2, + LED_PRESET_GREEN = 3, + LED_PRESET_WHITE = 4, + } led_preset; // 19 Подсветка цвет от 0 до 4 + uint8_t led_brightness; // 20 Тоже подсветка + enum : uint8_t { + LED_MODE_BOTTOM = 1 << 0, // 01 - нижняя + LED_MODE_TOP = 1 << 1, // 02 - верхня + }; + uint8_t led_mode; // 21 "Режим демонстрации" это режим подсветки uint8_t _led3; // 22 Подсветка 0A uint8_t target_humidity; // 23 Целевая влажность uint8_t fan_speed; // 24 Скорость вентилятора diff --git a/ehu.yaml b/ehu.yaml index 24fa3e7..1c5d1c4 100644 --- a/ehu.yaml +++ b/ehu.yaml @@ -89,6 +89,10 @@ switch: speed: Speed preset: Preset fan: Fan + led_brightness: Led Brightness + led_top: Led Top + led_bottom: Led Bottom + led_preset: Led Preset ## Uncomment to enable cloud support # rka_cloud: