mirror of
https://github.com/esphome/esphome.git
synced 2026-02-08 00:31:58 +00:00
Add target_temperature to the template water heater (#13661)
Co-authored-by: J. Nick Koston <nick@koston.org>
This commit is contained in:
@@ -46,6 +46,7 @@ CONFIG_SCHEMA = (
|
|||||||
RESTORE_MODES, upper=True
|
RESTORE_MODES, upper=True
|
||||||
),
|
),
|
||||||
cv.Optional(CONF_CURRENT_TEMPERATURE): cv.returning_lambda,
|
cv.Optional(CONF_CURRENT_TEMPERATURE): cv.returning_lambda,
|
||||||
|
cv.Optional(CONF_TARGET_TEMPERATURE): cv.returning_lambda,
|
||||||
cv.Optional(CONF_MODE): cv.returning_lambda,
|
cv.Optional(CONF_MODE): cv.returning_lambda,
|
||||||
cv.Optional(CONF_SUPPORTED_MODES): cv.ensure_list(
|
cv.Optional(CONF_SUPPORTED_MODES): cv.ensure_list(
|
||||||
water_heater.validate_water_heater_mode
|
water_heater.validate_water_heater_mode
|
||||||
@@ -78,6 +79,14 @@ async def to_code(config: ConfigType) -> None:
|
|||||||
)
|
)
|
||||||
cg.add(var.set_current_temperature_lambda(template_))
|
cg.add(var.set_current_temperature_lambda(template_))
|
||||||
|
|
||||||
|
if CONF_TARGET_TEMPERATURE in config:
|
||||||
|
template_ = await cg.process_lambda(
|
||||||
|
config[CONF_TARGET_TEMPERATURE],
|
||||||
|
[],
|
||||||
|
return_type=cg.optional.template(cg.float_),
|
||||||
|
)
|
||||||
|
cg.add(var.set_target_temperature_lambda(template_))
|
||||||
|
|
||||||
if CONF_MODE in config:
|
if CONF_MODE in config:
|
||||||
template_ = await cg.process_lambda(
|
template_ = await cg.process_lambda(
|
||||||
config[CONF_MODE],
|
config[CONF_MODE],
|
||||||
|
|||||||
@@ -16,7 +16,8 @@ void TemplateWaterHeater::setup() {
|
|||||||
restore->perform();
|
restore->perform();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!this->current_temperature_f_.has_value() && !this->mode_f_.has_value())
|
if (!this->current_temperature_f_.has_value() && !this->target_temperature_f_.has_value() &&
|
||||||
|
!this->mode_f_.has_value())
|
||||||
this->disable_loop();
|
this->disable_loop();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -28,6 +29,9 @@ water_heater::WaterHeaterTraits TemplateWaterHeater::traits() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
traits.set_supports_current_temperature(true);
|
traits.set_supports_current_temperature(true);
|
||||||
|
if (this->target_temperature_f_.has_value()) {
|
||||||
|
traits.add_feature_flags(water_heater::WATER_HEATER_SUPPORTS_TARGET_TEMPERATURE);
|
||||||
|
}
|
||||||
return traits;
|
return traits;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,6 +46,14 @@ void TemplateWaterHeater::loop() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto target_temp = this->target_temperature_f_.call();
|
||||||
|
if (target_temp.has_value()) {
|
||||||
|
if (*target_temp != this->target_temperature_) {
|
||||||
|
this->target_temperature_ = *target_temp;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto new_mode = this->mode_f_.call();
|
auto new_mode = this->mode_f_.call();
|
||||||
if (new_mode.has_value()) {
|
if (new_mode.has_value()) {
|
||||||
if (*new_mode != this->mode_) {
|
if (*new_mode != this->mode_) {
|
||||||
|
|||||||
@@ -20,6 +20,9 @@ class TemplateWaterHeater : public Component, public water_heater::WaterHeater {
|
|||||||
template<typename F> void set_current_temperature_lambda(F &&f) {
|
template<typename F> void set_current_temperature_lambda(F &&f) {
|
||||||
this->current_temperature_f_.set(std::forward<F>(f));
|
this->current_temperature_f_.set(std::forward<F>(f));
|
||||||
}
|
}
|
||||||
|
template<typename F> void set_target_temperature_lambda(F &&f) {
|
||||||
|
this->target_temperature_f_.set(std::forward<F>(f));
|
||||||
|
}
|
||||||
template<typename F> void set_mode_lambda(F &&f) { this->mode_f_.set(std::forward<F>(f)); }
|
template<typename F> void set_mode_lambda(F &&f) { this->mode_f_.set(std::forward<F>(f)); }
|
||||||
|
|
||||||
void set_optimistic(bool optimistic) { this->optimistic_ = optimistic; }
|
void set_optimistic(bool optimistic) { this->optimistic_ = optimistic; }
|
||||||
@@ -44,6 +47,7 @@ class TemplateWaterHeater : public Component, public water_heater::WaterHeater {
|
|||||||
// Ordered to minimize padding on 32-bit: 4-byte members first, then smaller
|
// Ordered to minimize padding on 32-bit: 4-byte members first, then smaller
|
||||||
Trigger<> set_trigger_;
|
Trigger<> set_trigger_;
|
||||||
TemplateLambda<float> current_temperature_f_;
|
TemplateLambda<float> current_temperature_f_;
|
||||||
|
TemplateLambda<float> target_temperature_f_;
|
||||||
TemplateLambda<water_heater::WaterHeaterMode> mode_f_;
|
TemplateLambda<water_heater::WaterHeaterMode> mode_f_;
|
||||||
TemplateWaterHeaterRestoreMode restore_mode_{WATER_HEATER_NO_RESTORE};
|
TemplateWaterHeaterRestoreMode restore_mode_{WATER_HEATER_NO_RESTORE};
|
||||||
water_heater::WaterHeaterModeMask supported_modes_;
|
water_heater::WaterHeaterModeMask supported_modes_;
|
||||||
|
|||||||
@@ -412,6 +412,7 @@ water_heater:
|
|||||||
name: "Template Water Heater"
|
name: "Template Water Heater"
|
||||||
optimistic: true
|
optimistic: true
|
||||||
current_temperature: !lambda "return 42.0f;"
|
current_temperature: !lambda "return 42.0f;"
|
||||||
|
target_temperature: !lambda "return 60.0f;"
|
||||||
mode: !lambda "return water_heater::WATER_HEATER_MODE_ECO;"
|
mode: !lambda "return water_heater::WATER_HEATER_MODE_ECO;"
|
||||||
supported_modes:
|
supported_modes:
|
||||||
- "OFF"
|
- "OFF"
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ water_heater:
|
|||||||
name: Test Boiler
|
name: Test Boiler
|
||||||
optimistic: true
|
optimistic: true
|
||||||
current_temperature: !lambda "return 45.0f;"
|
current_temperature: !lambda "return 45.0f;"
|
||||||
|
target_temperature: !lambda "return 60.0f;"
|
||||||
# Note: No mode lambda - we want optimistic mode changes to stick
|
# Note: No mode lambda - we want optimistic mode changes to stick
|
||||||
# A mode lambda would override mode changes in loop()
|
# A mode lambda would override mode changes in loop()
|
||||||
supported_modes:
|
supported_modes:
|
||||||
|
|||||||
@@ -85,6 +85,9 @@ async def test_water_heater_template(
|
|||||||
assert initial_state.current_temperature == 45.0, (
|
assert initial_state.current_temperature == 45.0, (
|
||||||
f"Expected current temp 45.0, got {initial_state.current_temperature}"
|
f"Expected current temp 45.0, got {initial_state.current_temperature}"
|
||||||
)
|
)
|
||||||
|
assert initial_state.target_temperature == 60.0, (
|
||||||
|
f"Expected target temp 60.0, got {initial_state.target_temperature}"
|
||||||
|
)
|
||||||
|
|
||||||
# Test changing to GAS mode
|
# Test changing to GAS mode
|
||||||
client.water_heater_command(test_water_heater.key, mode=WaterHeaterMode.GAS)
|
client.water_heater_command(test_water_heater.key, mode=WaterHeaterMode.GAS)
|
||||||
|
|||||||
Reference in New Issue
Block a user