14static const char *
const TAG =
"water_heater";
32 if (
len == 3 && ESPHOME_strncasecmp_P(
mode, ESPHOME_PSTR(
"OFF"), 3) == 0) {
34 }
else if (len == 3 && ESPHOME_strncasecmp_P(
mode, ESPHOME_PSTR(
"ECO"), 3) == 0) {
36 }
else if (len == 8 && ESPHOME_strncasecmp_P(
mode, ESPHOME_PSTR(
"ELECTRIC"), 8) == 0) {
38 }
else if (len == 11 && ESPHOME_strncasecmp_P(
mode, ESPHOME_PSTR(
"PERFORMANCE"), 11) == 0) {
40 }
else if (len == 11 && ESPHOME_strncasecmp_P(
mode, ESPHOME_PSTR(
"HIGH_DEMAND"), 11) == 0) {
42 }
else if (len == 9 && ESPHOME_strncasecmp_P(
mode, ESPHOME_PSTR(
"HEAT_PUMP"), 9) == 0) {
44 }
else if (len == 3 && ESPHOME_strncasecmp_P(
mode, ESPHOME_PSTR(
"GAS"), 3) == 0) {
71 this->
state_ &= ~WATER_HEATER_STATE_AWAY;
81 this->
state_ &= ~WATER_HEATER_STATE_ON;
90 if (this->
mode_.has_value()) {
103 ESP_LOGV(TAG,
" Away: %s", (this->
state_ & WATER_HEATER_STATE_AWAY) ?
"YES" :
"NO");
106 ESP_LOGV(TAG,
" On: %s", (this->
state_ & WATER_HEATER_STATE_ON) ?
"YES" :
"NO");
113 if (this->
mode_.has_value()) {
114 if (!traits.supports_mode(*this->mode_)) {
116 static_cast<uint32_t>(*this->mode_));
121 if (traits.get_supports_two_point_target_temperature()) {
122 ESP_LOGW(TAG,
"'%s' - Cannot set target temperature for device with two-point target temperature",
126 this->target_temperature_ > traits.get_max_temperature()) {
127 ESP_LOGW(TAG,
"'%s' - Target temperature %.1f is out of range [%.1f - %.1f]", this->
parent_->
get_name().
c_str(),
128 this->target_temperature_, traits.get_min_temperature(), traits.get_max_temperature());
130 std::max(traits.get_min_temperature(), std::min(this->target_temperature_, traits.get_max_temperature()));
134 if (!traits.get_supports_two_point_target_temperature()) {
135 ESP_LOGW(TAG,
"'%s' - Cannot set low/high target temperature", this->
parent_->
get_name().
c_str());
142 ESP_LOGW(TAG,
"'%s' - Target temperature low %.2f must be less than high %.2f", this->
parent_->
get_name().
c_str(),
143 this->target_temperature_low_, this->target_temperature_high_);
148 if (!traits.get_supports_away_mode()) {
152 this->
state_ &= ~WATER_HEATER_STATE_AWAY;
157 this->
state_ &= ~WATER_HEATER_STATE_ON;
178 ESP_LOGV(TAG,
" Away: YES");
184#if defined(USE_WATER_HEATER) && defined(USE_CONTROLLER_REGISTRY)
196 saved.state = this->
state_;
208 call.set_mode(recovered.mode);
210 call.set_target_temperature_low(recovered.target_temperature_low);
211 call.set_target_temperature_high(recovered.target_temperature_high);
213 call.set_target_temperature(recovered.target_temperature);
222#ifdef USE_WATER_HEATER_VISUAL_OVERRIDES
236#ifdef USE_WATER_HEATER_VISUAL_OVERRIDES
250PROGMEM_STRING_TABLE(WaterHeaterModeStrings,
"OFF",
"ECO",
"ELECTRIC",
"PERFORMANCE",
"HIGH_DEMAND",
"HEAT_PUMP",
"GAS",
254 return WaterHeaterModeStrings::get_log_str(
static_cast<uint8_t
>(
mode), WaterHeaterModeStrings::LAST_INDEX);
260 " Min Temperature: %.1f°C\n"
261 " Max Temperature: %.1f°C\n"
262 " Temperature Step: %.1f",
265 ESP_LOGCONFIG(
tag,
" Supports Two-Point Target Temperature: YES");
268 ESP_LOGCONFIG(
tag,
" Supports Away Mode: YES");
271 ESP_LOGCONFIG(
tag,
" Supports On/Off: YES");
274 ESP_LOGCONFIG(
tag,
" Supported Modes:");
BedjetMode mode
BedJet operating mode.
static void notify_water_heater_update(water_heater::WaterHeater *obj)
const StringRef & get_name() const
ESPPreferenceObject make_entity_preference(uint32_t version=0)
Create a preference object for storing this entity's state/settings.
constexpr bool empty() const
Check if the set is empty.
constexpr const char * c_str() const
WaterHeaterCall & set_away(bool away)
WaterHeaterCall & set_target_temperature_high(float temperature)
WaterHeaterCall & set_mode(WaterHeaterMode mode)
WaterHeaterCall & set_target_temperature_low(float temperature)
WaterHeaterCall & set_on(bool on)
float target_temperature_low_
float target_temperature_high_
float target_temperature_
optional< WaterHeaterMode > mode_
WaterHeaterCall & set_target_temperature(float temperature)
float visual_target_temperature_step_override_
ESPPreferenceObject pref_
void set_visual_min_temperature_override(float min_temperature_override)
virtual void publish_state()
virtual void control(const WaterHeaterCall &call)=0
float visual_max_temperature_override_
void set_visual_target_temperature_step_override(float visual_target_temperature_step_override)
float target_temperature_low_
float visual_min_temperature_override_
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.
virtual WaterHeaterCallInternal make_call()=0
float target_temperature_
float current_temperature_
void dump_traits_(const char *tag)
Log the traits of this water heater for dump_config().
virtual WaterHeaterTraits get_traits()
float target_temperature_high_
virtual WaterHeaterTraits traits()=0
bool get_supports_two_point_target_temperature() const
float get_target_temperature_step() const
const WaterHeaterModeMask & get_supported_modes() const
float get_min_temperature() const
void set_min_temperature(float min_temperature)
bool get_supports_away_mode() const
bool has_feature_flags(uint32_t flags) const
void set_target_temperature_step(float target_temperature_step)
float get_max_temperature() const
void set_max_temperature(float max_temperature)
PROGMEM_STRING_TABLE(WaterHeaterModeStrings, "OFF", "ECO", "ELECTRIC", "PERFORMANCE", "HIGH_DEMAND", "HEAT_PUMP", "GAS", "UNKNOWN")
void log_water_heater(const char *tag, const char *prefix, const char *type, WaterHeater *obj)
@ WATER_HEATER_MODE_ELECTRIC
@ WATER_HEATER_MODE_HIGH_DEMAND
@ WATER_HEATER_MODE_HEAT_PUMP
@ WATER_HEATER_MODE_PERFORMANCE
@ WATER_HEATER_STATE_ON
Water heater is on (not in standby)
@ WATER_HEATER_STATE_AWAY
Away/vacation mode is currently active.
@ WATER_HEATER_SUPPORTS_ON_OFF
The water heater can be turned on/off.
const LogString * water_heater_mode_to_string(WaterHeaterMode mode)
Convert the given WaterHeaterMode to a human-readable string for logging.