Refine laundry heat stabilization

This commit is contained in:
ltadeu6 2026-05-17 15:28:39 -03:00
parent dfe891345d
commit 8e03bf57ee
2 changed files with 23 additions and 5 deletions

View file

@ -615,8 +615,8 @@ Estado atual:
- As dashboards `ui-lovelace.yaml` e `ui-overview.yaml` exibem um botao para alternar `input_boolean.secar_roupas`.
- A temperatura vem de `state_attr('climate.ar', 'current_temperature')`; nao ha sensor de umidade dedicado.
- A estrategia alterna aquecimento moderado para evaporar agua das roupas e `cool`/`dry` para condensar e drenar a umidade.
- No inicio, se a sala estiver abaixo de 24 C, o script usa `heat` com setpoint 25 C por ate 15 minutos.
- Durante o loop, abaixo de 21 C o script usa `heat` com setpoint 24 C por ate 20 minutos para recuperar temperatura.
- No inicio, se a sala estiver abaixo de 24 C, o script usa `heat` com setpoint 25 C ate chegar em 25 C, segura ate 5 minutos se ainda estiver abaixo de 27 C, e tem timeout maximo de 15 minutos.
- Durante o loop, abaixo de 21 C o script usa `heat` com setpoint 24 C ate chegar em 24 C, segura ate 5 minutos se ainda estiver abaixo de 26 C, e tem timeout maximo de 20 minutos.
- Entre 23 C e 28 C, o script usa pulsos planejados de `cool` com setpoint 22 C por ate 15 minutos, depois volta para `dry` por ate 40 minutos.
- Acima de 28 C, o script nunca aquece; usa `cool` com setpoint 23 C por ate 20 minutos e depois `dry`.
- O tempo maximo de execucao e 6 horas; ao expirar, o script desliga `climate.ar` e desliga `input_boolean.secar_roupas`.

View file

@ -41,6 +41,22 @@ let
inherit timeout;
continue_on_timeout = true;
};
haWaitForTemperatureOrToggleOff = temperature: timeout: {
wait_template =
"{{ is_state('${haLaundryDryingToggle}', 'off') or (state_attr('${haAirConditioner}', 'current_temperature') | float(0)) >= ${toString temperature} }}";
inherit timeout;
continue_on_timeout = true;
};
haHoldHeatIfStillUseful = cutoffTemperature: holdTimeout: {
choose = [{
conditions = [{
condition = "template";
value_template =
"{{ is_state('${haLaundryDryingToggle}', 'on') and (state_attr('${haAirConditioner}', 'current_temperature') | float(0)) < ${toString cutoffTemperature} }}";
}];
sequence = [ (haWaitForDryingToggleOff holdTimeout) ];
}];
};
haSetFanModeIfAvailable = preferred: fallback: {
choose = [
{
@ -71,12 +87,16 @@ let
haWaitForClimateReady
(haSetTemperature 25)
(haSetFanModeIfAvailable "5" "4")
(haWaitForTemperatureOrToggleOff 25 "00:15:00")
(haHoldHeatIfStillUseful 27 "00:05:00")
];
haHeatRecoveryCycle = [
(haSetHvacMode "heat")
haWaitForClimateReady
(haSetTemperature 24)
(haSetFanModeIfAvailable "5" "4")
(haWaitForTemperatureOrToggleOff 24 "00:20:00")
(haHoldHeatIfStillUseful 26 "00:05:00")
];
haCoolPulse = [
(haSetHvacMode "cool")
@ -357,8 +377,7 @@ in {
condition = "template";
value_template = "{{ current_temp < 24 }}";
}];
sequence = haHeatEvaporationCycle
++ [ (haWaitForDryingToggleOff "00:15:00") ];
sequence = haHeatEvaporationCycle;
}];
}
{
@ -398,7 +417,6 @@ in {
"{{ current_temp < 21 }}";
}];
sequence = haHeatRecoveryCycle ++ [
(haWaitForDryingToggleOff "00:20:00")
{
choose = [{
conditions = [{