11static const char *
const TAG =
"water_heater";
27 if (ESPHOME_strcasecmp_P(
mode, ESPHOME_PSTR(
"OFF")) == 0) {
29 }
else if (ESPHOME_strcasecmp_P(
mode, ESPHOME_PSTR(
"ECO")) == 0) {
31 }
else if (ESPHOME_strcasecmp_P(
mode, ESPHOME_PSTR(
"ELECTRIC")) == 0) {
33 }
else if (ESPHOME_strcasecmp_P(
mode, ESPHOME_PSTR(
"PERFORMANCE")) == 0) {
35 }
else if (ESPHOME_strcasecmp_P(
mode, ESPHOME_PSTR(
"HIGH_DEMAND")) == 0) {
37 }
else if (ESPHOME_strcasecmp_P(
mode, ESPHOME_PSTR(
"HEAT_PUMP")) == 0) {
39 }
else if (ESPHOME_strcasecmp_P(
mode, ESPHOME_PSTR(
"GAS")) == 0) {
66 this->
state_ &= ~WATER_HEATER_STATE_AWAY;
76 this->
state_ &= ~WATER_HEATER_STATE_ON;
98 ESP_LOGD(TAG,
" Away: %s", (this->
state_ & WATER_HEATER_STATE_AWAY) ?
"YES" :
"NO");
101 ESP_LOGD(TAG,
" On: %s", (this->
state_ & WATER_HEATER_STATE_ON) ?
"YES" :
"NO");
109 if (!traits.supports_mode(*this->mode_)) {
115 if (traits.get_supports_two_point_target_temperature()) {
116 ESP_LOGW(TAG,
"'%s' - Cannot set target temperature for device with two-point target temperature",
120 this->target_temperature_ > traits.get_max_temperature()) {
121 ESP_LOGW(TAG,
"'%s' - Target temperature %.1f is out of range [%.1f - %.1f]", this->
parent_->
get_name().
c_str(),
122 this->target_temperature_, traits.get_min_temperature(), traits.get_max_temperature());
124 std::max(traits.get_min_temperature(), std::min(this->target_temperature_, traits.get_max_temperature()));
128 if (!traits.get_supports_two_point_target_temperature()) {
129 ESP_LOGW(TAG,
"'%s' - Cannot set low/high target temperature", this->
parent_->
get_name().
c_str());
136 ESP_LOGW(TAG,
"'%s' - Target temperature low %.2f must be less than high %.2f", this->
parent_->
get_name().
c_str(),
137 this->target_temperature_low_, this->target_temperature_high_);
142 if (!traits.get_supports_away_mode()) {
146 this->
state_ &= ~WATER_HEATER_STATE_AWAY;
151 this->
state_ &= ~WATER_HEATER_STATE_ON;
172 ESP_LOGD(TAG,
" Away: YES");
178#if defined(USE_WATER_HEATER) && defined(USE_CONTROLLER_REGISTRY)
190 saved.state = this->
state_;
202 call.set_mode(recovered.mode);
204 call.set_target_temperature_low(recovered.target_temperature_low);
205 call.set_target_temperature_high(recovered.target_temperature_high);
207 call.set_target_temperature(recovered.target_temperature);
216#ifdef USE_WATER_HEATER_VISUAL_OVERRIDES
230#ifdef USE_WATER_HEATER_VISUAL_OVERRIDES
244PROGMEM_STRING_TABLE(WaterHeaterModeStrings,
"OFF",
"ECO",
"ELECTRIC",
"PERFORMANCE",
"HIGH_DEMAND",
"HEAT_PUMP",
"GAS",
248 return WaterHeaterModeStrings::get_log_str(
static_cast<uint8_t
>(
mode), WaterHeaterModeStrings::LAST_INDEX);
254 " Min Temperature: %.1f°C\n"
255 " Max Temperature: %.1f°C\n"
256 " Temperature Step: %.1f",
259 ESP_LOGCONFIG(tag,
" Supports Two-Point Target Temperature: YES");
262 ESP_LOGCONFIG(tag,
" Supports Away Mode: YES");
265 ESP_LOGCONFIG(tag,
" Supports On/Off: YES");
268 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.