ESPHome 2026.5.0-dev
Loading...
Searching...
No Matches
haier_base.h
Go to the documentation of this file.
1#pragma once
2
3#include <chrono>
7// HaierProtocol
8#include <protocol/haier_protocol.h>
9
10#ifdef USE_SWITCH
12#endif
13
14namespace esphome {
15namespace haier {
16
17enum class ActionRequest : uint8_t {
19 TURN_POWER_ON = 1,
21 TOGGLE_POWER = 3,
22 START_SELF_CLEAN = 4, // only hOn
23 START_STERI_CLEAN = 5, // only hOn
24};
25
30
34 public haier_protocol::ProtocolStream {
35#ifdef USE_SWITCH
36 public:
39
40 protected:
43#endif
44 public:
49 void setup() override;
50 void loop() override;
51 void control(const esphome::climate::ClimateCall &call) override;
52 void dump_config() override;
53 float get_setup_priority() const override { return esphome::setup_priority::HARDWARE; }
54 void set_display_state(bool state);
55 bool get_display_state() const;
56 void set_health_mode(bool state);
57 bool get_health_mode() const;
60 void toggle_power();
61 void reset_protocol() { this->reset_protocol_request_ = true; };
65 bool valid_connection() const { return this->protocol_phase_ >= ProtocolPhases::IDLE; };
66 size_t available() noexcept override { return esphome::uart::UARTDevice::available(); };
67 size_t read_array(uint8_t *data, size_t len) noexcept override {
69 };
70 void write_array(const uint8_t *data, size_t len) noexcept override {
72 };
73 bool can_send_message() const { return haier_protocol_.get_outgoing_queue_size() == 0; };
74 void set_answer_timeout(uint32_t timeout);
75 void set_send_wifi(bool send_wifi);
76 void send_custom_command(const haier_protocol::HaierMessage &message);
77 template<typename F> void add_status_message_callback(F &&callback) {
78 this->status_message_callback_.add(std::forward<F>(callback));
79 }
80
81 protected:
99 const char *phase_to_string_(ProtocolPhases phase);
100 virtual void set_handlers() = 0;
101 virtual void process_phase(std::chrono::steady_clock::time_point now) = 0;
102 virtual haier_protocol::HaierMessage get_control_message() = 0; // NOLINT(readability-identifier-naming)
103 virtual haier_protocol::HaierMessage get_power_message(bool state) = 0; // NOLINT(readability-identifier-naming)
104 virtual void save_settings();
105 virtual void initialization();
106 virtual bool prepare_pending_action();
107 virtual void process_protocol_reset();
109 // Answer handlers
110 haier_protocol::HandlerError answer_preprocess_(haier_protocol::FrameType request_message_type,
111 haier_protocol::FrameType expected_request_message_type,
112 haier_protocol::FrameType answer_message_type,
113 haier_protocol::FrameType expected_answer_message_type,
114 ProtocolPhases expected_phase);
115 haier_protocol::HandlerError report_network_status_answer_handler_(haier_protocol::FrameType request_type,
116 haier_protocol::FrameType message_type,
117 const uint8_t *data, size_t data_size);
118 // Timeout handler
119 haier_protocol::HandlerError timeout_default_handler_(haier_protocol::FrameType request_type);
120 // Helper functions
121 void send_message_(const haier_protocol::HaierMessage &command, bool use_crc, uint8_t num_repeats = 0,
122 std::chrono::milliseconds interval = std::chrono::milliseconds::zero());
123 virtual void set_phase(ProtocolPhases phase);
124 void reset_phase_();
125 void reset_to_idle_();
126 bool is_message_interval_exceeded_(std::chrono::steady_clock::time_point now);
127 bool is_status_request_interval_exceeded_(std::chrono::steady_clock::time_point now);
128 bool is_control_message_interval_exceeded_(std::chrono::steady_clock::time_point now);
129 bool is_protocol_initialisation_interval_exceeded_(std::chrono::steady_clock::time_point now);
130#ifdef USE_WIFI
131 haier_protocol::HaierMessage get_wifi_signal_message_();
132#endif
133
135 esphome::optional<esphome::climate::ClimateMode> mode;
136 esphome::optional<esphome::climate::ClimateFanMode> fan_mode;
137 esphome::optional<esphome::climate::ClimateSwingMode> swing_mode;
138 esphome::optional<float> target_temperature;
139 esphome::optional<esphome::climate::ClimatePreset> preset;
140 bool valid;
141 HvacSettings() : valid(false){};
142 HvacSettings(const HvacSettings &) = default;
144 void reset();
145 };
148 esphome::optional<haier_protocol::HaierMessage> message;
149 };
150 enum class SwitchState {
151 OFF = 0b00,
152 ON = 0b01,
153 PENDING_OFF = 0b10,
154 PENDING_ON = 0b11,
155 };
156 haier_protocol::ProtocolHandler haier_protocol_;
158 esphome::optional<PendingAction> action_request_;
171 std::unique_ptr<uint8_t[]> last_status_message_{nullptr};
172 std::chrono::steady_clock::time_point last_request_timestamp_; // For interval between messages
173 std::chrono::steady_clock::time_point last_valid_status_timestamp_; // For protocol timeout
174 std::chrono::steady_clock::time_point last_status_request_; // To request AC status
175 std::chrono::steady_clock::time_point last_signal_request_; // To send WiFI signal level
176 CallbackManager<void(const char *, size_t)> status_message_callback_{};
178};
179
180} // namespace haier
181} // namespace esphome
This class is used to encode all control actions on a climate device.
Definition climate.h:34
ClimateDevice - This is the base class for all climate integrations.
Definition climate.h:187
virtual haier_protocol::HaierMessage get_power_message(bool state)=0
void set_supported_modes(esphome::climate::ClimateModeMask modes)
esphome::climate::ClimateTraits traits_
Definition haier_base.h:168
void add_status_message_callback(F &&callback)
Definition haier_base.h:77
ESPPreferenceObject base_rtc_
Definition haier_base.h:177
void set_supported_presets(esphome::climate::ClimatePresetMask presets)
bool is_message_interval_exceeded_(std::chrono::steady_clock::time_point now)
void write_array(const uint8_t *data, size_t len) noexcept override
Definition haier_base.h:70
CallbackManager< void(const char *, size_t)> status_message_callback_
Definition haier_base.h:176
bool is_protocol_initialisation_interval_exceeded_(std::chrono::steady_clock::time_point now)
bool is_status_request_interval_exceeded_(std::chrono::steady_clock::time_point now)
esphome::climate::ClimateTraits traits() override
haier_protocol::HandlerError answer_preprocess_(haier_protocol::FrameType request_message_type, haier_protocol::FrameType expected_request_message_type, haier_protocol::FrameType answer_message_type, haier_protocol::FrameType expected_answer_message_type, ProtocolPhases expected_phase)
haier_protocol::ProtocolHandler haier_protocol_
Definition haier_base.h:156
size_t available() noexcept override
Definition haier_base.h:66
std::chrono::steady_clock::time_point last_request_timestamp_
Definition haier_base.h:172
const char * phase_to_string_(ProtocolPhases phase)
std::unique_ptr< uint8_t[]> last_status_message_
Definition haier_base.h:171
void send_message_(const haier_protocol::HaierMessage &command, bool use_crc, uint8_t num_repeats=0, std::chrono::milliseconds interval=std::chrono::milliseconds::zero())
haier_protocol::HandlerError report_network_status_answer_handler_(haier_protocol::FrameType request_type, haier_protocol::FrameType message_type, const uint8_t *data, size_t data_size)
void control(const esphome::climate::ClimateCall &call) override
virtual void process_phase(std::chrono::steady_clock::time_point now)=0
void set_supported_swing_modes(esphome::climate::ClimateSwingModeMask modes)
void set_health_mode_switch(switch_::Switch *sw)
HaierClimateBase(const HaierClimateBase &)=delete
std::chrono::steady_clock::time_point last_valid_status_timestamp_
Definition haier_base.h:173
size_t read_array(uint8_t *data, size_t len) noexcept override
Definition haier_base.h:67
HaierClimateBase & operator=(const HaierClimateBase &)=delete
haier_protocol::HaierMessage get_wifi_signal_message_()
haier_protocol::HandlerError timeout_default_handler_(haier_protocol::FrameType request_type)
bool is_control_message_interval_exceeded_(std::chrono::steady_clock::time_point now)
virtual haier_protocol::HaierMessage get_control_message()=0
switch_::Switch * health_mode_switch_
Definition haier_base.h:42
esphome::optional< PendingAction > action_request_
Definition haier_base.h:158
void set_answer_timeout(uint32_t timeout)
std::chrono::steady_clock::time_point last_status_request_
Definition haier_base.h:174
float get_setup_priority() const override
Definition haier_base.h:53
void set_display_switch(switch_::Switch *sw)
void set_send_wifi(bool send_wifi)
virtual void set_phase(ProtocolPhases phase)
void send_custom_command(const haier_protocol::HaierMessage &message)
std::chrono::steady_clock::time_point last_signal_request_
Definition haier_base.h:175
switch_::Switch * display_switch_
Definition haier_base.h:41
Base class for all switches.
Definition switch.h:38
optional< std::array< uint8_t, N > > read_array()
Definition uart.h:38
void write_array(const uint8_t *data, size_t len)
Definition uart.h:26
const char * message
Definition component.cpp:35
bool state
Definition fan.h:2
constexpr float HARDWARE
For components that deal with hardware and are very important like GPIO switch.
Definition component.h:40
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
std::string size_t len
Definition helpers.h:1045
static void uint32_t
esphome::optional< esphome::climate::ClimateFanMode > fan_mode
Definition haier_base.h:136
esphome::optional< esphome::climate::ClimateSwingMode > swing_mode
Definition haier_base.h:137
esphome::optional< esphome::climate::ClimateMode > mode
Definition haier_base.h:135
esphome::optional< esphome::climate::ClimatePreset > preset
Definition haier_base.h:139
HvacSettings & operator=(const HvacSettings &)=default
HvacSettings(const HvacSettings &)=default
esphome::optional< float > target_temperature
Definition haier_base.h:138
esphome::optional< haier_protocol::HaierMessage > message
Definition haier_base.h:148