ESPHome  2024.7.2
haier_base.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <chrono>
4 #include <set>
8 // HaierProtocol
9 #include <protocol/haier_protocol.h>
10 
11 namespace esphome {
12 namespace haier {
13 
14 enum class ActionRequest : uint8_t {
16  TURN_POWER_ON = 1,
17  TURN_POWER_OFF = 2,
18  TOGGLE_POWER = 3,
19  START_SELF_CLEAN = 4, // only hOn
20  START_STERI_CLEAN = 5, // only hOn
21 };
22 
26  public haier_protocol::ProtocolStream {
27  public:
29  HaierClimateBase(const HaierClimateBase &) = delete;
30  HaierClimateBase &operator=(const HaierClimateBase &) = delete;
32  void setup() override;
33  void loop() override;
34  void control(const esphome::climate::ClimateCall &call) override;
35  void dump_config() override;
36  float get_setup_priority() const override { return esphome::setup_priority::HARDWARE; }
37  void set_display_state(bool state);
38  bool get_display_state() const;
39  void set_health_mode(bool state);
40  bool get_health_mode() const;
41  void send_power_on_command();
42  void send_power_off_command();
43  void toggle_power();
44  void reset_protocol() { this->reset_protocol_request_ = true; };
45  void set_supported_modes(const std::set<esphome::climate::ClimateMode> &modes);
46  void set_supported_swing_modes(const std::set<esphome::climate::ClimateSwingMode> &modes);
47  void set_supported_presets(const std::set<esphome::climate::ClimatePreset> &presets);
48  bool valid_connection() const { return this->protocol_phase_ >= ProtocolPhases::IDLE; };
49  size_t available() noexcept override { return esphome::uart::UARTDevice::available(); };
50  size_t read_array(uint8_t *data, size_t len) noexcept override {
51  return esphome::uart::UARTDevice::read_array(data, len) ? len : 0;
52  };
53  void write_array(const uint8_t *data, size_t len) noexcept override {
55  };
56  bool can_send_message() const { return haier_protocol_.get_outgoing_queue_size() == 0; };
57  void set_answer_timeout(uint32_t timeout);
58  void set_send_wifi(bool send_wifi);
59  void send_custom_command(const haier_protocol::HaierMessage &message);
60  void add_status_message_callback(std::function<void(const char *, size_t)> &&callback);
61 
62  protected:
63  enum class ProtocolPhases {
64  UNKNOWN = -1,
65  // INITIALIZATION
66  SENDING_INIT_1 = 0,
67  SENDING_INIT_2,
68  SENDING_FIRST_STATUS_REQUEST,
69  SENDING_FIRST_ALARM_STATUS_REQUEST,
70  // FUNCTIONAL STATE
71  IDLE,
72  SENDING_STATUS_REQUEST,
73  SENDING_UPDATE_SIGNAL_REQUEST,
74  SENDING_SIGNAL_LEVEL,
75  SENDING_CONTROL,
76  SENDING_ACTION_COMMAND,
77  SENDING_ALARM_STATUS_REQUEST,
78  NUM_PROTOCOL_PHASES
79  };
80  const char *phase_to_string_(ProtocolPhases phase);
81  virtual void set_handlers() = 0;
82  virtual void process_phase(std::chrono::steady_clock::time_point now) = 0;
83  virtual haier_protocol::HaierMessage get_control_message() = 0;
84  virtual haier_protocol::HaierMessage get_power_message(bool state) = 0;
85  virtual void initialization(){};
86  virtual bool prepare_pending_action();
87  virtual void process_protocol_reset();
88  esphome::climate::ClimateTraits traits() override;
89  // Answer handlers
90  haier_protocol::HandlerError answer_preprocess_(haier_protocol::FrameType request_message_type,
91  haier_protocol::FrameType expected_request_message_type,
92  haier_protocol::FrameType answer_message_type,
93  haier_protocol::FrameType expected_answer_message_type,
94  ProtocolPhases expected_phase);
95  haier_protocol::HandlerError report_network_status_answer_handler_(haier_protocol::FrameType request_type,
96  haier_protocol::FrameType message_type,
97  const uint8_t *data, size_t data_size);
98  // Timeout handler
99  haier_protocol::HandlerError timeout_default_handler_(haier_protocol::FrameType request_type);
100  // Helper functions
101  void send_message_(const haier_protocol::HaierMessage &command, bool use_crc, uint8_t num_repeats = 0,
102  std::chrono::milliseconds interval = std::chrono::milliseconds::zero());
103  virtual void set_phase(ProtocolPhases phase);
104  void reset_phase_();
105  void reset_to_idle_();
106  bool is_message_interval_exceeded_(std::chrono::steady_clock::time_point now);
107  bool is_status_request_interval_exceeded_(std::chrono::steady_clock::time_point now);
108  bool is_control_message_interval_exceeded_(std::chrono::steady_clock::time_point now);
109  bool is_protocol_initialisation_interval_exceeded_(std::chrono::steady_clock::time_point now);
110 #ifdef USE_WIFI
111  haier_protocol::HaierMessage get_wifi_signal_message_();
112 #endif
113 
114  struct HvacSettings {
120  bool valid;
121  HvacSettings() : valid(false){};
122  HvacSettings(const HvacSettings &) = default;
123  HvacSettings &operator=(const HvacSettings &) = default;
124  void reset();
125  };
126  struct PendingAction {
129  };
130  haier_protocol::ProtocolHandler haier_protocol_;
141  bool use_crc_;
145  std::unique_ptr<uint8_t[]> last_status_message_{nullptr};
146  std::chrono::steady_clock::time_point last_request_timestamp_; // For interval between messages
147  std::chrono::steady_clock::time_point last_valid_status_timestamp_; // For protocol timeout
148  std::chrono::steady_clock::time_point last_status_request_; // To request AC status
149  std::chrono::steady_clock::time_point last_signal_request_; // To send WiFI signal level
151 };
152 
153 class StatusMessageTrigger : public Trigger<const char *, size_t> {
154  public:
156  parent->add_status_message_callback([this](const char *data, size_t data_size) { this->trigger(data, data_size); });
157  }
158 };
159 
160 } // namespace haier
161 } // namespace esphome
void setup()
This class is used to encode all control actions on a climate device.
Definition: climate.h:33
void loop()
esphome::optional< float > target_temperature
Definition: haier_base.h:118
optional< std::array< uint8_t, N > > read_array()
Definition: uart.h:33
void write_array(const uint8_t *data, size_t len)
Definition: uart.h:21
esphome::optional< esphome::climate::ClimatePreset > preset
Definition: haier_base.h:119
This class contains all static data for climate devices.
std::chrono::steady_clock::time_point last_status_request_
Definition: haier_base.h:148
std::chrono::steady_clock::time_point last_signal_request_
Definition: haier_base.h:149
esphome::optional< haier_protocol::HaierMessage > message
Definition: haier_base.h:128
void write_array(const uint8_t *data, size_t len) noexcept override
Definition: haier_base.h:53
haier_protocol::ProtocolHandler haier_protocol_
Definition: haier_base.h:130
size_t available() noexcept override
Definition: haier_base.h:49
esphome::optional< PendingAction > action_request_
Definition: haier_base.h:132
esphome::optional< esphome::climate::ClimateFanMode > fan_mode
Definition: haier_base.h:116
uint16_t reset
Definition: ina226.h:39
void add_status_message_callback(std::function< void(const char *, size_t)> &&callback)
Definition: haier_base.cpp:189
StatusMessageTrigger(HaierClimateBase *parent)
Definition: haier_base.h:155
const float HARDWARE
For components that deal with hardware and are very important like GPIO switch.
Definition: component.cpp:18
std::string size_t len
Definition: helpers.h:292
Implementation of SPI Controller mode.
Definition: a01nyub.cpp:7
std::chrono::steady_clock::time_point last_request_timestamp_
Definition: haier_base.h:146
size_t read_array(uint8_t *data, size_t len) noexcept override
Definition: haier_base.h:50
float get_setup_priority() const override
Definition: haier_base.h:36
esphome::climate::ClimateTraits traits_
Definition: haier_base.h:142
esphome::optional< esphome::climate::ClimateSwingMode > swing_mode
Definition: haier_base.h:117
ClimateDevice - This is the base class for all climate integrations.
Definition: climate.h:168
bool state
Definition: fan.h:34
std::chrono::steady_clock::time_point last_valid_status_timestamp_
Definition: haier_base.h:147
esphome::optional< esphome::climate::ClimateMode > mode
Definition: haier_base.h:115