ESPHome 2026.3.0-dev
Loading...
Searching...
No Matches
water_heater.h
Go to the documentation of this file.
1#pragma once
7#include "esphome/core/log.h"
9
10namespace esphome::water_heater {
11
12class WaterHeater;
13struct WaterHeaterCallInternal;
14
15void log_water_heater(const char *tag, const char *prefix, const char *type, WaterHeater *obj);
16#define LOG_WATER_HEATER(prefix, type, obj) log_water_heater(TAG, prefix, LOG_STR_LITERAL(type), obj)
17
27
28// Type alias for water heater mode bitmask
29// Replaces std::set<WaterHeaterMode> to eliminate red-black tree overhead
32
48
56
66 uint32_t state;
67} __attribute__((packed));
68
71
72 public:
73 WaterHeaterCall() : parent_(nullptr) {}
74
76
78 WaterHeaterCall &set_mode(const char *mode);
79 WaterHeaterCall &set_mode(const std::string &mode) { return this->set_mode(mode.c_str()); }
83 WaterHeaterCall &set_away(bool away);
84 WaterHeaterCall &set_on(bool on);
85
86 void perform();
87
88 const optional<WaterHeaterMode> &get_mode() const { return this->mode_; }
89 float get_target_temperature() const { return this->target_temperature_; }
93 ESPDEPRECATED("get_state() is deprecated, use get_away() and get_on() instead. (Removed in 2026.8.0)", "2026.2.0")
94 uint32_t get_state() const { return this->state_; }
95
98 return (this->state_ & WATER_HEATER_STATE_AWAY) != 0;
99 }
100 return {};
101 }
102
105 return (this->state_ & WATER_HEATER_STATE_ON) != 0;
106 }
107 return {};
108 }
109
110 protected:
111 void validate_();
117 uint32_t state_{0};
118 uint32_t state_mask_{0};
120
123
125 this->mode_ = restore.mode_;
129 this->state_ = restore.state_;
130 this->state_mask_ = restore.state_mask_;
131 return *this;
132 }
133};
134
136 public:
138 void add_feature_flags(uint32_t flags) { this->feature_flags_ |= flags; }
139 void clear_feature_flags(uint32_t flags) { this->feature_flags_ &= ~flags; }
140 bool has_feature_flags(uint32_t flags) const { return (this->feature_flags_ & flags) == flags; }
141 uint32_t get_feature_flags() const { return this->feature_flags_; }
142
153
155 void set_supports_away_mode(bool supports) {
156 if (supports) {
158 } else {
160 }
161 }
162
173
174 void set_min_temperature(float min_temperature) { this->min_temperature_ = min_temperature; }
175 float get_min_temperature() const { return this->min_temperature_; }
176
177 void set_max_temperature(float max_temperature) { this->max_temperature_ = max_temperature; }
178 float get_max_temperature() const { return this->max_temperature_; }
179
180 void set_target_temperature_step(float target_temperature_step) {
181 this->target_temperature_step_ = target_temperature_step;
182 }
184
187 bool supports_mode(WaterHeaterMode mode) const { return this->supported_modes_.count(mode); }
188
189 protected:
190 // Ordered to minimize padding: 4-byte members first
191 uint32_t feature_flags_{0};
192 float min_temperature_{0.0f};
193 float max_temperature_{0.0f};
196};
197
198class WaterHeater : public EntityBase {
199 public:
200 WaterHeaterMode get_mode() const { return this->mode_; }
201 float get_current_temperature() const { return this->current_temperature_; }
202 float get_target_temperature() const { return this->target_temperature_; }
206 uint32_t get_state() const { return this->state_; }
208 bool is_away() const { return (this->state_ & WATER_HEATER_STATE_AWAY) != 0; }
210 bool is_on() const { return (this->state_ & WATER_HEATER_STATE_ON) != 0; }
211
212 void set_current_temperature(float current_temperature) { this->current_temperature_ = current_temperature; }
213
214 virtual void publish_state();
217
218#ifdef USE_WATER_HEATER_VISUAL_OVERRIDES
219 void set_visual_min_temperature_override(float min_temperature_override);
220 void set_visual_max_temperature_override(float max_temperature_override);
221 void set_visual_target_temperature_step_override(float visual_target_temperature_step_override);
222#endif
223 virtual void control(const WaterHeaterCall &call) = 0;
224
225 protected:
227
229 void dump_traits_(const char *tag);
230
233
247 void set_state_(uint32_t state) { this->state_ = state; }
249 void set_state_flag_(uint32_t flag, bool value) {
250 if (value) {
251 this->state_ |= flag;
252 } else {
253 this->state_ &= ~flag;
254 }
255 }
256
262 uint32_t state_{0}; // Bitmask of WaterHeaterStateFlag
263
264#ifdef USE_WATER_HEATER_VISUAL_OVERRIDES
268#endif
269
271};
272
275
276} // namespace esphome::water_heater
BedjetMode mode
BedJet operating mode.
constexpr size_t count(ValueType value) const
Check if the set contains a specific value (std::set compatibility) Returns 1 if present,...
WaterHeaterCall & set_away(bool away)
WaterHeaterCall & set_target_temperature_high(float temperature)
WaterHeaterCall & set_mode(WaterHeaterMode mode)
ESPDEPRECATED("get_state() is deprecated, use get_away() and get_on() instead. (Removed in 2026.8.0)", "2026.2.0") uint32_t get_state() const
Get state flags value.
WaterHeaterCall & set_target_temperature_low(float temperature)
WaterHeaterCall & set_on(bool on)
optional< bool > get_away() const
WaterHeaterCall & set_mode(const std::string &mode)
optional< WaterHeaterMode > mode_
const optional< WaterHeaterMode > & get_mode() const
WaterHeaterCall & set_target_temperature(float temperature)
uint32_t get_state() const
Get the current state flags bitmask.
void set_target_temperature_low_(float target_temperature_low)
Set the low target temperature (for two-point control). Should only be called from control().
void set_mode_(WaterHeaterMode mode)
Set the mode of the water heater. Should only be called from control().
void set_visual_min_temperature_override(float min_temperature_override)
virtual void control(const WaterHeaterCall &call)=0
void set_visual_target_temperature_step_override(float visual_target_temperature_step_override)
void set_state_flag_(uint32_t flag, bool value)
Set or clear a state flag. Should only be called from control().
void set_visual_max_temperature_override(float max_temperature_override)
optional< WaterHeaterCall > restore_state_()
Restore the state of the water heater, call this from your setup() method.
void set_state_(uint32_t state)
Set the state flags. Should only be called from control().
void set_target_temperature_high_(float target_temperature_high)
Set the high target temperature (for two-point control). Should only be called from control().
bool is_on() const
Check if the water heater is on.
bool is_away() const
Check if away mode is currently active.
void set_target_temperature_(float target_temperature)
Set the target temperature of the water heater. Should only be called from control().
virtual WaterHeaterCallInternal make_call()=0
WaterHeaterMode get_mode() const
void dump_traits_(const char *tag)
Log the traits of this water heater for dump_config().
virtual WaterHeaterTraits get_traits()
virtual WaterHeaterTraits traits()=0
void set_current_temperature(float current_temperature)
void set_supported_modes(WaterHeaterModeMask modes)
const WaterHeaterModeMask & get_supported_modes() const
void add_feature_flags(uint32_t flags)
Get/set feature flags (see WaterHeaterFeature enum)
bool supports_mode(WaterHeaterMode mode) const
void set_supports_current_temperature(bool supports)
void set_min_temperature(float min_temperature)
void set_supports_two_point_target_temperature(bool supports)
bool has_feature_flags(uint32_t flags) const
void set_target_temperature_step(float target_temperature_step)
void set_max_temperature(float max_temperature)
float target_temperature_high
Definition climate.h:3
float target_temperature
Definition climate.h:0
float target_temperature_low
Definition climate.h:2
uint16_t type
uint16_t flags
bool state
Definition fan.h:0
void log_water_heater(const char *tag, const char *prefix, const char *type, WaterHeater *obj)
WaterHeaterStateFlag
State flags for water heater current state (bitmask)
@ WATER_HEATER_STATE_ON
Water heater is on (not in standby)
@ WATER_HEATER_STATE_AWAY
Away/vacation mode is currently active.
WaterHeaterFeature
Feature flags for water heater capabilities (matches Home Assistant WaterHeaterEntityFeature)
@ WATER_HEATER_SUPPORTS_TARGET_TEMPERATURE
The water heater supports a target temperature.
@ WATER_HEATER_SUPPORTS_OPERATION_MODE
The water heater supports operation mode selection.
@ WATER_HEATER_SUPPORTS_ON_OFF
The water heater can be turned on/off.
@ WATER_HEATER_SUPPORTS_AWAY_MODE
The water heater supports an away/vacation mode.
@ WATER_HEATER_SUPPORTS_CURRENT_TEMPERATURE
The water heater supports reporting the current temperature.
@ WATER_HEATER_SUPPORTS_TWO_POINT_TARGET_TEMPERATURE
The water heater supports two-point target temperature (low/high range).
const LogString * water_heater_mode_to_string(WaterHeaterMode mode)
Convert the given WaterHeaterMode to a human-readable string for logging.
class esphome::water_heater::WaterHeaterCall __attribute__
struct esphome::water_heater::SavedWaterHeaterState::@167::@168 __attribute__
WaterHeaterCallInternal & set_from_restore(const WaterHeaterCall &restore)
uint16_t temperature
Definition sun_gtil2.cpp:12