From b4d1d96d00ecdec2e240de8ce0fc0a9759da4474 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Mon, 24 Apr 2023 13:37:35 +0100 Subject: [PATCH 01/50] Generate the required files using Jinja --- .gitignore | 2 ++ config.yaml.sample | 15 +++++++++ generate.py | 46 ++++++++++++++++++++++++++++ requirements.txt | 2 ++ templates/dashboard_cards.yaml.jinja | 28 +++++++++++++++++ templates/input_datetimes.yaml.jinja | 17 ++++++++++ templates/input_numbers.yaml.jinja | 19 ++++++++++++ templates/input_texts.yaml.jinja | 17 ++++++++++ templates/templates.yaml.jinja | 19 ++++++++++++ templates/timers.yaml.jinja | 35 +++++++++++++++++++++ 10 files changed, 200 insertions(+) create mode 100644 .gitignore create mode 100644 config.yaml.sample create mode 100644 generate.py create mode 100644 requirements.txt create mode 100644 templates/dashboard_cards.yaml.jinja create mode 100644 templates/input_datetimes.yaml.jinja create mode 100644 templates/input_numbers.yaml.jinja create mode 100644 templates/input_texts.yaml.jinja create mode 100644 templates/templates.yaml.jinja create mode 100644 templates/timers.yaml.jinja diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..53cb4bb --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +config.yaml +output/ \ No newline at end of file diff --git a/config.yaml.sample b/config.yaml.sample new file mode 100644 index 0000000..630c342 --- /dev/null +++ b/config.yaml.sample @@ -0,0 +1,15 @@ +dashboard: + eco_temperature: 5 + disable_window: true + disable_summer: true + disable_eco: true + disable_heat: true + disable_off: true +temperature: + max: 40 + min: 0 + step: 1 +zones: + - heating_zone_entity_name: bathroom + heating_zone_friendly_name: Bathroom + thermostat_entity_name: climate.bathroom diff --git a/generate.py b/generate.py new file mode 100644 index 0000000..b42a62e --- /dev/null +++ b/generate.py @@ -0,0 +1,46 @@ +import pathlib +import uuid +from typing import Any + +import jinja2 +import yaml + +TEMPLATE_DIR = pathlib.Path('templates') +OUTPUT_DIR = pathlib.Path('output') + + +def read_config() -> dict[str, Any]: + """Read the configuration file.""" + with open('config.yaml') as f: + return yaml.safe_load(f) + + +def read_templates() -> jinja2.Environment: + """Read the templates.""" + return jinja2.Environment( + loader=jinja2.FileSystemLoader('templates'), + trim_blocks=True, + lstrip_blocks=True, + ) + + +def generate_uuid() -> uuid.UUID: + """Generate a UUID.""" + return uuid.uuid4() + + +def generate() -> None: + """Generate the files.""" + config = read_config() + templates = read_templates() + templates.globals.update(generate_uuid=generate_uuid) + + for template in templates.list_templates(): + template = templates.get_template(template) + output = (OUTPUT_DIR / template.name).with_suffix('') + output.parent.mkdir(parents=True, exist_ok=True) + output.write_text(template.render(config=config)) + + +if __name__ == '__main__': + generate() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..4e859bb --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +jinja2 +pyyaml diff --git a/templates/dashboard_cards.yaml.jinja b/templates/dashboard_cards.yaml.jinja new file mode 100644 index 0000000..74ad0fe --- /dev/null +++ b/templates/dashboard_cards.yaml.jinja @@ -0,0 +1,28 @@ +type: vertical-stack +cards: + {% for zone in config.zones %} + ### {{ zone.heating_zone_friendly_name }} + - type: custom:mushroom-title-card + title: {{ zone.heating_zone_entity_name }} + - square: false + columns: 2 + type: grid + cards: + - type: custom:better-thermostat-ui-card + entity: climate.{{ zone.heating_zone_entity_name }} + eco_temperature: {{ config.dashboard.eco_temperature or 5}} + disable_window: {{ (config.dashboard.disable_window or True) | lower }} + disable_summer: {{ (config.dashboard.disable_summer or True) | lower }} + disable_eco: {{ (config.dashboard.disable_eco or True) | lower }} + disable_heat: {{ (config.dashboard.disable_heat or True) | lower }} + disable_off: {{ (config.dashboard.disable_off or True) | lower }} + set_current_as_main: false + - type: markdown + content: |- + **Schedule**: {% raw %}{{{% endraw %} states('input_text.{{ zone.heating_zone_entity_name }}_event_name') {% raw %}}}{% endraw %} + + **Status**: *{% raw %}{{{% endraw %} states('input_text.{{ zone.heating_zone_entity_name }}_setting_reason') {% raw %}}}{% endraw %}* + {% if not loop.last %} + + {% endif %} + {% endfor %} diff --git a/templates/input_datetimes.yaml.jinja b/templates/input_datetimes.yaml.jinja new file mode 100644 index 0000000..7594f1f --- /dev/null +++ b/templates/input_datetimes.yaml.jinja @@ -0,0 +1,17 @@ +{% for zone in config.zones %} +### {{ zone.heating_zone_friendly_name }} +{{ zone.heating_zone_entity_name }}_event_start: + name: {{ zone.heating_zone_friendly_name }} event start + has_date: true + has_time: true + icon: mdi:clock-outline + +{{ zone.heating_zone_entity_name }}_event_end: + name: {{ zone.heating_zone_friendly_name }} event end + has_date: true + has_time: true + icon: mdi:clock-outline +{% if not loop.last %} + +{% endif %} +{% endfor -%} diff --git a/templates/input_numbers.yaml.jinja b/templates/input_numbers.yaml.jinja new file mode 100644 index 0000000..b402c0f --- /dev/null +++ b/templates/input_numbers.yaml.jinja @@ -0,0 +1,19 @@ +{% for zone in config.zones %} +### {{ zone.heating_zone_friendly_name }} +{{ zone.heating_zone_entity_name }}_manual_temperature: + name: {{ zone.heating_zone_friendly_name }} manual temperature + min: {{ config.temperature.min }} + max: {{ config.temperature.max }} + step: {{ config.temperature.step }} + icon: mdi:temperature-celsius + +{{ zone.heating_zone_entity_name }}_event_temperature: + name: {{ zone.heating_zone_friendly_name }} event temperature + min: {{ config.temperature.min }} + max: {{ config.temperature.max }} + step: {{ config.temperature.step }} + icon: mdi:temperature-celsius +{% if not loop.last %} + +{% endif %} +{% endfor -%} diff --git a/templates/input_texts.yaml.jinja b/templates/input_texts.yaml.jinja new file mode 100644 index 0000000..ee26f60 --- /dev/null +++ b/templates/input_texts.yaml.jinja @@ -0,0 +1,17 @@ +{% for zone in config.zones %} +### {{ zone.heating_zone_friendly_name }} +{{ zone.heating_zone_entity_name }}_event_name: + name: {{ zone.heating_zone_friendly_name }} event name + icon: mdi:card-text-outline + +{{ zone.heating_zone_entity_name }}_event_description: + name: {{ zone.heating_zone_friendly_name }} event description + icon: mdi:card-text-outline + +{{ zone.heating_zone_entity_name }}_setting_reason: + name: {{ zone.heating_zone_friendly_name }} setting reason + icon: mdi:card-text-outline +{% if not loop.last %} + +{% endif %} +{% endfor -%} diff --git a/templates/templates.yaml.jinja b/templates/templates.yaml.jinja new file mode 100644 index 0000000..ae87e68 --- /dev/null +++ b/templates/templates.yaml.jinja @@ -0,0 +1,19 @@ +{% for zone in config.zones %} +### {{ zone.heating_zone_friendly_name }} +- sensor: + - name: {{ zone.heating_zone_entity_name }}_target_temperature + unique_id: "{{ zone.target_temperature_unique_id or generate_uuid() }}" + unit_of_measurement: 'C' + icon: mdi:thermometer + state: "{% raw %}{{{% endraw %} state_attr('climate.{{ zone.thermostat_entity_name }}', 'temperature') {% raw %}}}{% endraw %}" + +- sensor: + - name: {{ zone.heating_zone_entity_name }}_current_temperature + unique_id: "{{ zone.current_temperature_unique_id or generate_uuid() }}" + unit_of_measurement: 'C' + icon: mdi:thermometer + state: "{% raw %}{{{% endraw %} state_attr('climate.{{ zone.thermostat_entity_name }}', 'current_temperature') {% raw %}}}{% endraw %}" +{% if not loop.last %} + +{% endif %} +{% endfor -%} diff --git a/templates/timers.yaml.jinja b/templates/timers.yaml.jinja new file mode 100644 index 0000000..d3da1d2 --- /dev/null +++ b/templates/timers.yaml.jinja @@ -0,0 +1,35 @@ +{% for zone in config.zones %} +### {{ zone.heating_zone_friendly_name }} +{{ zone.heating_zone_entity_name }}_manual_override_timer: + name: {{ zone.heating_zone_friendly_name }} manual override timer + duration: "00:00:00" + restore: true + icon: mdi:av-timer + +{{ zone.heating_zone_entity_name }}_warmup_timer: + name: {{ zone.heating_zone_friendly_name }} warmup timer + duration: "00:00:00" + restore: true + icon: mdi:av-timer + +{{ zone.heating_zone_entity_name }}_door_or_window_open_timer: + name: {{ zone.heating_zone_friendly_name }} door or window open timer + duration: "00:00:00" + restore: true + icon: mdi:av-timer + +{{ zone.heating_zone_entity_name }}_room_unoccupancy_timer: + name: {{ zone.heating_zone_friendly_name }} room unoccupancy timer + duration: "00:00:00" + restore: true + icon: mdi:av-timer + +{{ zone.heating_zone_entity_name }}_echoblock_timer: + name: {{ zone.heating_zone_friendly_name }} echoblock timer + duration: "00:00:00" + restore: true + icon: mdi:av-timer +{% if not loop.last %} + +{% endif %} +{% endfor -%} From fd7c2705e6fdb33ee6756468370ad3764e37e150 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Mon, 24 Apr 2023 13:38:53 +0100 Subject: [PATCH 02/50] Remove old `.zip` file --- ...X code generator - use on a local drive.zip | Bin 237257 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Heating X code generator - use on a local drive.zip diff --git a/Heating X code generator - use on a local drive.zip b/Heating X code generator - use on a local drive.zip deleted file mode 100644 index 5b75828dd6dcd7adf28db956bea6ffbdd9291823..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237257 zcmb@tV{mU>*Y5d`ZQHhO+qP}nw(Vrcwy|UE*vXD<@hHGYaRAfTv#f5SarOZ`8C|MS5JAOuL78M#{7TM%jznmCx65n7npn>ib~ zIye*35xTjU5jxlt8WGw$m>Ag-nmSv#n=z=V!T})W%->D6|H*&fZk{jzAkZfu0N_6= zivLlA1VH{zYV7}f=Ke>`z(7t&L_tN9f!^SMQ}}<?90I82O;O#myxg8A4W%3VxkWKg3ZH(a27VpcL)MJEJs@bAM<-QMBg;9S+- zt>Hu5NPc|6qLG2ZVA2fj3G8(Je7nL%^kx7hCmQYPqB(n;;do007V%H zNM%^s*~)*4@UJcZWtdr`o2!ATk*k@j zm7SRjy_b=lExoCOiRXXZ{lPml`8RX^ySrE2X0Et03+!vg=H@Z9<_(!y|HQg6c}&)z zvDWlI0gKL}vvB^Wr}-uRq_5i|z)!$EpI@z(GP%~-NASTRN2O&pF!X!^|f zETo`{52&aTxp;M=Bdj42q^E?TUf-$itCT(=2N`ND=z!4NL>O2ULqVxm0Fh8|EtefT zLw(vStzbP8{o&T0D=p1Dkre%k@5(mp4LLN16rq|d8|3~%@LaNbths3<>!vo_YW<{$ z*8H!sUxE6ja1JlJ+#xl4ZsGYEmo&%LBz(2X{AMg?DRVL|(bA$q5sW2!)P?QA>uk|O zTaEr`A+Tydsz;vmr7M0uCP5oqqZ0~T$ynO^9M+ociBXts0K>n&I-|?78nJmM3Hxu4 zBzH_*?|U|VlSIvV4wF|&=ldre-A6dz&zwufiDt9vC5V3$@cjcIfX2UaeD=qTIrM#X zCwx5#rXzgLxiNLP7UsX5zUy_qF#-yC>pp(d8NJa1>x2B-Jksc5dN4bMEmvpCAR=TN zDN|I>phe%&?@Uh*Y)yC+ldv#9DCfmx5zTE!ZeeIlN!=UTEJDwB^=32J*aAce*@3~@ z!?^P_oI$*h*OLtIqmlq2om=jutnD@?6j2@MQGTQfzkG->9*d%;xP+6ozG*#A#voAr zmF230eSkqX&Nd*D?hNAzzSAae=qZx(tWL?YG%ogGw{H1JjX%i2?AKDi6R3QAjO%mvOK}ZeD?l@PRCm< z&4AU!KroCI&P{6o(&LUpNLgZ*PHO4{2$B!&6<LecR13j06al)*_)Cf}bdH zvCcWVlt5}S>>)=fKnmUrgs7lVi#!k(d0GsiQ>n#a0-B1}l@}-!+mgp@7x}O^QcoC~ z5~oDKdF~3o+jZ(Rr?M#_PU2uzewI0*cK?amn{M77^c<=6=rEk-%Br3_xs*-j)W390 zGuh0ViaJ9PbT1IejWXf|H1T2ExLUmNom9#u_T6Fc(WP(2qzj})X|80Q*u~{^(I;|p zzNTQRWQi>iY!E{T@_8W`?;_!#vkXRv-xG@p1Jd z=!QfHZECLQKh;SWJZ@r5W)zndhCwjrrg>;6?W+m$nJ7Z3t1^+tgJrc_ymLHrQuR^| zYjSi326uP#mocx@Bh13`e|i>KSJ6!K{iu>F~pQFU%Fju{s^TpC?@cB0uB^HlD|@HGREUBJ^ z6_x`O>`7z?D79;ERIprUsggpbSZr#lOv<_rbepZ19#XQh^s|J$p=1x{dt6S(;|QNP z*s9DGtXTeOmST!t^Y1!hcI`pTlv@kR`;yM1>wK*%D?14HEgHTLQJj4V)erZqpr{X% zb#_ry^KdNraZeU{M(0p_X^gT&=+dWdl?44g6F%0AUQnrP4S9!D2Q!4C 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

Q#Jnvoef_}@JqRj7?yseA8ydp4Vc8rS0Z_*+3 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 Date: Mon, 24 Apr 2023 13:45:08 +0100 Subject: [PATCH 03/50] Correct `dashboard_cards.yaml` template --- templates/dashboard_cards.yaml.jinja | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/templates/dashboard_cards.yaml.jinja b/templates/dashboard_cards.yaml.jinja index 74ad0fe..5f176cb 100644 --- a/templates/dashboard_cards.yaml.jinja +++ b/templates/dashboard_cards.yaml.jinja @@ -1,7 +1,7 @@ +{% for zone in config.zones %} +### {{ zone.heating_zone_friendly_name }} type: vertical-stack cards: - {% for zone in config.zones %} - ### {{ zone.heating_zone_friendly_name }} - type: custom:mushroom-title-card title: {{ zone.heating_zone_entity_name }} - square: false @@ -22,7 +22,8 @@ cards: **Schedule**: {% raw %}{{{% endraw %} states('input_text.{{ zone.heating_zone_entity_name }}_event_name') {% raw %}}}{% endraw %} **Status**: *{% raw %}{{{% endraw %} states('input_text.{{ zone.heating_zone_entity_name }}_setting_reason') {% raw %}}}{% endraw %}* - {% if not loop.last %} +{% if not loop.last %} - {% endif %} - {% endfor %} +--- +{% endif %} +{% endfor %} From cd255652f49ed71e6baeffbb497cb3e652d14344 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Mon, 24 Apr 2023 13:45:20 +0100 Subject: [PATCH 04/50] Update `README.md` --- README.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 6db32b4..33af738 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,13 @@ # Heating-X-code-generator -Use Microsoft Mail Merge to create YAML files for all the template sensors and helpers required for a complete home installation of Heating X zones. -Microsoft Office (WORD and EXCEL) is a prerequisite (sorry I could not find a free package to do this) +Use Jinja to create YAML files for all the template sensors and helpers required for a complete home installation of Heating X zones. -To get started: -1. Download the ZIP file to a temporary location on a local disk drive. Problems can occur if it is used on a drive that is synchronised to a cloud service, such as iCloud or OneDrive (but you can keep a copy of the ZIP file if you wish). -2. Unzip it. -3. In the resulting folder there are detailed instructions in $README on how to use the Code Generator to generate and install all the YAML code you need for even the most conplex installation. - -Basically you enter the details of your installation (zones and thermostats) in the EXCEL file, then use each of the five WORD files to generate the contents of a YAML file. They each generate a whole file except the dashboard card generator, which has to be installed one card at a time. +To get started: +1. Make sure you have Python 3 installed. +2. Create a virtual environment with `python3 -m venv .venv`. +3. Activate your virtual environment with `source .venv/bin/activate`. +4. Install the required dependencies with `python3 -m pip install requirements.txt`. +5. Make your own `config.yaml` with `cp config.yaml.sample config.yaml`. +6. Edit the contents of the resulting `config.yaml` to match your own installation (zones and thermostats). +7. Create the required files with `python generate.py` which will output the files into +the `output/` directory. From da73cdf87cfecec54d97d63c08c200e8f53570f7 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Mon, 24 Apr 2023 13:54:00 +0100 Subject: [PATCH 05/50] Make `set_current_as_main` configurable --- templates/dashboard_cards.yaml.jinja | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/dashboard_cards.yaml.jinja b/templates/dashboard_cards.yaml.jinja index 5f176cb..d01812e 100644 --- a/templates/dashboard_cards.yaml.jinja +++ b/templates/dashboard_cards.yaml.jinja @@ -16,7 +16,7 @@ cards: disable_eco: {{ (config.dashboard.disable_eco or True) | lower }} disable_heat: {{ (config.dashboard.disable_heat or True) | lower }} disable_off: {{ (config.dashboard.disable_off or True) | lower }} - set_current_as_main: false + set_current_as_main: {{ (config.dashboard.set_current_as_main or False) | lower }} - type: markdown content: |- **Schedule**: {% raw %}{{{% endraw %} states('input_text.{{ zone.heating_zone_entity_name }}_event_name') {% raw %}}}{% endraw %} From cc7a428ae6da88c8c404362b7121fdd124f49daf Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Mon, 24 Apr 2023 13:54:55 +0100 Subject: [PATCH 06/50] Set defaults for `temperature` attributes --- templates/input_numbers.yaml.jinja | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/templates/input_numbers.yaml.jinja b/templates/input_numbers.yaml.jinja index b402c0f..dad3a1e 100644 --- a/templates/input_numbers.yaml.jinja +++ b/templates/input_numbers.yaml.jinja @@ -2,16 +2,16 @@ ### {{ zone.heating_zone_friendly_name }} {{ zone.heating_zone_entity_name }}_manual_temperature: name: {{ zone.heating_zone_friendly_name }} manual temperature - min: {{ config.temperature.min }} - max: {{ config.temperature.max }} - step: {{ config.temperature.step }} + min: {{ config.temperature.min or 0}} + max: {{ config.temperature.max or 40 }} + step: {{ config.temperature.step or 1 }} icon: mdi:temperature-celsius {{ zone.heating_zone_entity_name }}_event_temperature: name: {{ zone.heating_zone_friendly_name }} event temperature - min: {{ config.temperature.min }} - max: {{ config.temperature.max }} - step: {{ config.temperature.step }} + min: {{ config.temperature.min or 0}} + max: {{ config.temperature.max or 40 }} + step: {{ config.temperature.step or 1 }} icon: mdi:temperature-celsius {% if not loop.last %} From 4e5f8b9e7cdc539b2d5ba6178c6cfb8156a83e4d Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Mon, 24 Apr 2023 13:56:45 +0100 Subject: [PATCH 07/50] Simplify sample config --- config.yaml.sample | 9 --------- 1 file changed, 9 deletions(-) diff --git a/config.yaml.sample b/config.yaml.sample index 630c342..a1f1799 100644 --- a/config.yaml.sample +++ b/config.yaml.sample @@ -1,14 +1,5 @@ dashboard: - eco_temperature: 5 - disable_window: true - disable_summer: true - disable_eco: true - disable_heat: true - disable_off: true temperature: - max: 40 - min: 0 - step: 1 zones: - heating_zone_entity_name: bathroom heating_zone_friendly_name: Bathroom From be5b0fb4a8bcba4d32d69ac559f8d47c3362aeef Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Mon, 24 Apr 2023 14:04:13 +0100 Subject: [PATCH 08/50] Rearrange fields in sample config --- config.yaml.sample | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.yaml.sample b/config.yaml.sample index a1f1799..1dbb82b 100644 --- a/config.yaml.sample +++ b/config.yaml.sample @@ -1,6 +1,6 @@ dashboard: temperature: zones: - - heating_zone_entity_name: bathroom - heating_zone_friendly_name: Bathroom + - heating_zone_friendly_name: Bathroom + heating_zone_entity_name: bathroom thermostat_entity_name: climate.bathroom From 5410225ffd61cca46a6f15bda3a9ad68e4b81ddc Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Mon, 24 Apr 2023 16:34:08 +0100 Subject: [PATCH 09/50] Increase message limits for `input_texts.yaml` --- templates/input_texts.yaml.jinja | 3 +++ 1 file changed, 3 insertions(+) diff --git a/templates/input_texts.yaml.jinja b/templates/input_texts.yaml.jinja index ee26f60..0cfc4cc 100644 --- a/templates/input_texts.yaml.jinja +++ b/templates/input_texts.yaml.jinja @@ -3,14 +3,17 @@ {{ zone.heating_zone_entity_name }}_event_name: name: {{ zone.heating_zone_friendly_name }} event name icon: mdi:card-text-outline + max: 255 {{ zone.heating_zone_entity_name }}_event_description: name: {{ zone.heating_zone_friendly_name }} event description icon: mdi:card-text-outline + max: 255 {{ zone.heating_zone_entity_name }}_setting_reason: name: {{ zone.heating_zone_friendly_name }} setting reason icon: mdi:card-text-outline + max: 255 {% if not loop.last %} {% endif %} From 60892ad211f2216a64bb6ade44b07afbe7c31826 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Mon, 24 Apr 2023 18:16:48 +0100 Subject: [PATCH 10/50] Add blueprint --- bllueprints/heating_x.yaml | 748 +++++++++++++++++++++++++++++++++++++ 1 file changed, 748 insertions(+) create mode 100644 bllueprints/heating_x.yaml diff --git a/bllueprints/heating_x.yaml b/bllueprints/heating_x.yaml new file mode 100644 index 0000000..7e3136e --- /dev/null +++ b/bllueprints/heating_x.yaml @@ -0,0 +1,748 @@ +### ------------------------------------------------------------------------------------ +### +### HEATING X +### --------- +### +### Controls one or more thermostats from a calendar, +### allows temporary manual override, +### and optionally turns off thermostat if a door or window is opened, +### or if the zone is unoccupied for a while. +### Provides detailed status ('reason' text) for the dashboard. +### +### 06-Feb-23 | Andy Symons | First posted on the community forum +### 08-Feb-23 | Andy Symons | Improved robustness when sensors become unavailable. Posted on GitHub. +### 12-Feb-23 | Andy Symons | Improved logic when first starting with idle timers +### 15-Feb-23 | Andy Symons | Mode changed to queued so all triggers used but without conficting states. +### 19-Feb-23 | Andy Symons | Continual refresh; robust through restart, all day events, and overlappng events +### 20-Feb-23 | Andy Symons | More verbose 'reason' text with event details where applicable (needs 255 character helper) +### 25-Feb-23 | Andy Symons | Robust against absent or invalid tempterature specification in an event. Reports errors in the reason text. +### +### ------------------------------------------------------------------------------------ + +blueprint: + name: "Heating X" + description: Controls one or more thermostats from a calendar, allows temporary manual override, and optionally turns off thermostat if a door or window is opened, or if the zone is unoccupied for a while. + domain: automation + + ### ---------------------------------------------------------------------------- + ### INPUTS + ### ---------------------------------------------------------------------------- + + input: + thermostat_controls: + name: DEVICE ENTITY - Thermostat control + description: One or more thermostat entities that are to be controlled by this automation + selector: + entity: + domain: climate + multiple: true + + thermostat_set_temperature_sensors: + name: DEVICE ENTITY - Thermostat set temperature + description: The (template) sensors that read the set temperature from the specified thermostats + selector: + entity: + domain: sensor + multiple: true + + door_or_window_open_sensors: + name: DEVICE ENTITY - Door or window open sensors + description: Zero or more sensors that detect whether a door or window is open + selector: + entity: + domain: binary_sensor + device_class: opening + multiple: true + default: [] + + zone_occupancy_sensors: + name: DEVICE ENTITY - Zone occupancy sensors + description: Zero or more sensors that detect whether there is anyone in the zone + selector: + entity: + domain: binary_sensor + device_class: occupancy + multiple: true + default: [] + + zone_calendar: + name: CALENDAR ENTITY - Zone calendar + description: The calendar dedicated to scheduling events for this zone + selector: + entity: + domain: calendar + + event_name: + name: HELPER - Event name + description: The global variable (helper) to hold the name (aka Summary) of the current event (if any) + selector: + entity: + domain: input_text + + event_start: + name: HELPER - Event start + description: The global variable (helper) to hold the start date and time of the current event (if any) + selector: + entity: + domain: input_datetime + + event_end: + name: HELPER - Event end + description: The global variable (helper) to hold the end date and time of the current event (if any) + selector: + entity: + domain: input_datetime + + event_description: + name: HELPER - Event description + description: The global variable (helper) to hold the description of the current event (if any) + selector: + entity: + domain: input_text + + event_temperature: + name: HELPER - Event temperature + description: The global variable (helper) to hold the temperature specified in the current event (if any) + selector: + entity: + domain: input_number + + manual_temperature: + name: HELPER - Manual temperature + description: The global variable (helper) to hold the temperature specified by manual control of the device or the dashboard + selector: + entity: + domain: input_number + + setting_reason: + name: HELPER - Setting reason + description: The global variable (helper) into which the automation writes the reason for the current setting (for use on a dashboard) + selector: + entity: + domain: input_text + + door_or_window_open_timer: + name: HELPER - Door or window open timer + description: The global variable (helper) to hold the timer for the period since a door or window was opened + selector: + entity: + domain: timer + + unoccupancy_timer: + name: HELPER - Unoccupancy timer + description: The global variable (helper) to hold the timer for the period since the zone was last unoccupied + selector: + entity: + domain: timer + + warmup_timer: + name: HELPER - Warmup timer + description: The global variable (helper) to hold the timer for the event warmup period + selector: + entity: + domain: timer + + manual_override_timer: + name: HELPER - Manual override timer + description: The global variable (helper) to hold the timer for a manual intervention + selector: + entity: + domain: timer + + echoblock_timer: + name: HELPER - Echoblock timer + description: The timer for use inside the automation to disinguish genuine manual changes of the set temperature from those set by the automation + selector: + entity: + domain: timer + + minimum_thermostat_temperature: + name: PARAMETER - Minimum thermostat temperature + description: The minimum temperature that can be set on the thermostat + selector: + number: + min: 0 + max: 100 + default: 5 + + maximum_thermostat_temperature: + name: PARAMETER - Maximum thermostat temperature + description: The maximum temperature that can be set on the thermostat + selector: + number: + min: 0 + max: 100 + default: 95 + + frost_setting: + name: PARAMETER - Frost setting + description: The temperature to be used when the heating is turned off + selector: + number: + min: 0 + max: 100 + default: 5 + + warmup_period: + name: PARAMETER - Warmup period + description: The period of time from the start of a new event for which zone unoccupancy will be ignored + selector: + time: + default: "02:00:00" + + manual_override_period: + name: PARAMETER - Manual override period + description: The time period for which a manual intervention will override the schedule + selector: + time: + default: "02:00:00" + + door_or_window_open_period: + name: PARAMETER - Door or window open period + description: The time period for which a door or window may be open before the heating is turned off + selector: + time: + default: "0:03:00" + + unoccupancy_period: + name: PARAMETER - Unoccupancy period + description: The time period for which the zone may be unoccupied before the heating is turned off + selector: + time: + default: "01:00:00" + +mode: queued # use all triggers but avoid conflicting states + +## ---------------------------------------------------------------------------- +## LOCAL VARİABLES +## needed to capture global variable values for use in templates +## ---------------------------------------------------------------------------- + +variables: + local_door_or_window_open_sensors: !input door_or_window_open_sensors + local_event_description: !input event_description + local_event_name: !input event_name + local_event_temperature: !input event_temperature + local_frost_setting: !input frost_setting + local_manual_temperature: !input manual_temperature + local_manual_override_timer: !input manual_override_timer + local_maximum_thermostat_temperature: !input maximum_thermostat_temperature + local_minimum_thermostat_temperature: !input minimum_thermostat_temperature + local_thermostat_set_temperature: !input thermostat_set_temperature_sensors + local_zone_calendar: !input zone_calendar + local_zone_occupancy_sensors: !input zone_occupancy_sensors + +## ---------------------------------------------------------------------------- +## TRIGGERS +## ---------------------------------------------------------------------------- + +trigger: + # 1. Calendar state to on (active event) + # (Similar to event start but can be around 30 seconds later) + - platform: state + entity_id: !input zone_calendar + to: "on" + id: calendar_state_to_on + + # 2. Calendar state to off, unknown, or unavailable (no active event) + # (Similar to event end but can be around 30 seconds later) + - platform: state + entity_id: !input zone_calendar + from: "on" + id: calendar_state_to_off + + # 3. Change in any one of the thermostat set temperatures + - platform: state + entity_id: !input thermostat_set_temperature_sensors + for: + seconds: 10 + id: set_temperature_change + + # 4. End of manual override (timer idle, paused, unknown, or unavailable) + - platform: state + entity_id: !input manual_override_timer + from: active + id: manual_override_end + + # 5. Zone becomes unoccupied: sensor available and off (clear) + - platform: state + entity_id: !input zone_occupancy_sensors + to: "off" + for: + seconds: 10 + id: zone_unoccupied + + # 6. Zone becomes occupied: sensor 'detected' (on), 'unknown', or 'unavailable' + - platform: state + entity_id: !input zone_occupancy_sensors + from: "off" + for: + seconds: 10 + id: zone_occupied + + # 7. A door or window is opened + - platform: state + entity_id: !input door_or_window_open_sensors + to: "on" + for: + seconds: 10 + id: door_or_window_opened + + # 8. A doors or windows is closed, or becomes 'unknown' or 'unavailable' + - platform: state + entity_id: !input door_or_window_open_sensors + from: "on" + for: + seconds: 10 + id: doors_and_windows_closed + + # 9. Door or window open timer finished (time to turn off the heating) + - platform: state + entity_id: !input door_or_window_open_timer + from: active + id: door_or_window_open_timer_end + + # 10. Unoccupancy timer finished (time to turn off the heating) + - platform: state + entity_id: !input unoccupancy_timer + from: active + id: unoccupancy_timer_end + + # 13. Refresh every minute + - platform: time_pattern + seconds: "02" # after the now() time is set at seconds 00 + +## ---------------------------------------------------------------------------- +## ACTIONS STEP 1 -- SET THE STATE VARİABLES +## ---------------------------------------------------------------------------- + +action: + - choose: + # + # a. Manual override start + # + - conditions: + - condition: trigger + id: set_temperature_change + #ignore if it is just an echo from a setting from this automation + - condition: state + entity_id: !input echoblock_timer + state: idle + #ignore if same value as before (e.g. triggered by template reload) + - condition: template + value_template: "{{ not states(local_thermostat_set_temperature) == states(local_manual_temperature) }}" + sequence: + - service: timer.start + data: + duration: !input manual_override_period + target: + entity_id: !input manual_override_timer + + # Save the manual setting most recently received (this trigger) + - service: input_number.set_value + data: + value: "{{ states(local_thermostat_set_temperature) }}" + target: + entity_id: !input manual_temperature + # + # b. Manual override end + # + - conditions: + - condition: trigger + id: manual_override_end + sequence: + - service: input_number.set_value + data: + value: 0 + target: + entity_id: !input manual_temperature + # + # c. Door or window opened - start timer + # + - conditions: + - condition: trigger + id: door_or_window_opened + # Do not restart timer if already running + - condition: not + conditions: + - condition: state + entity_id: !input door_or_window_open_timer + state: active + sequence: + - service: timer.start + data: + duration: !input door_or_window_open_period + target: + entity_id: !input door_or_window_open_timer + # + # d. Doors and windows closed - restart and pause timer + # + - conditions: + - condition: trigger + id: doors_and_windows_closed + sequence: + - service: timer.start + data: + duration: !input door_or_window_open_period + target: + entity_id: !input door_or_window_open_timer + - service: timer.pause # Keeps it in the active state + target: + entity_id: !input door_or_window_open_timer + # + # e. Unoccupancy - start timer + # + - conditions: + - condition: trigger + id: zone_unoccupied + # Do not restart timer if already running + - condition: not + conditions: + - condition: state + entity_id: !input unoccupancy_timer + state: active + sequence: + - service: timer.start + data: + duration: !input unoccupancy_period + target: + entity_id: !input unoccupancy_timer + # + # f. Zone occupied - restart and pause timer + # + - conditions: + - condition: trigger + id: zone_occupied + sequence: + - service: timer.start + data: + duration: !input unoccupancy_period + target: + entity_id: !input unoccupancy_timer + - service: timer.pause # Keeps it in the active state + target: + entity_id: !input unoccupancy_timer + + ## ---------------------------------------------------------------------------- + ## ACTIONS STEP 2 -- REFRESH THE CALENDAR EVENT HELPERS + ## ---------------------------------------------------------------------------- + + - if: + - condition: template + value_template: | + {{ states(local_zone_calendar) == 'on' }} + then: + - service: input_text.set_value + data: + value: "{{ state_attr(local_zone_calendar, 'message' ) }}" + target: + entity_id: !input event_name + - service: input_datetime.set_datetime + data: + datetime: "{{ state_attr(local_zone_calendar, 'start_time' ) }}" + target: + entity_id: !input event_start + - service: input_datetime.set_datetime + data: + datetime: "{{ state_attr(local_zone_calendar, 'end_time' ) }}" + target: + entity_id: !input event_end + - service: input_text.set_value + data: + value: "{{ state_attr(local_zone_calendar, 'description' ) }}" + target: + entity_id: !input event_description + - service: input_number.set_value + data: + value: >- + {% set description = state_attr(local_zone_calendar, 'description' ) %} {# copy description field #} + {% if not description.split('#') | count >= 3 %} + {% set temperature_error_code = -4 %} {# no number field #} + {% elif not description.split('#')[1] | is_number %} + {% set temperature_error_code = -3 %} {# not a number #} + {% elif not (description.split('#')[1] | float(0)) >= local_minimum_thermostat_temperature %} + {% set temperature_error_code = -2 %} {# number too small #} + {% elif not (description.split('#')[1] | float(0)) <= local_maximum_thermostat_temperature %} + {% set temperature_error_code = -1 %} {# number too big #} + + {% else %} + {% set temperature_error_code = 0 %} + {% endif %} + {% if temperature_error_code == 0 %} + {{ '%0.1f' | format(description.split('#')[1] | float(0)) }} + {% else %} + {{ local_frost_setting }} + {% endif %} + + target: + entity_id: !input event_temperature + + else: # no currently active event + - service: input_text.set_value + data: + value: (none) + target: + entity_id: !input event_name + - service: input_datetime.set_datetime + data: + datetime: "3000-01-01T00:00:00" + target: + entity_id: !input event_start + - service: input_datetime.set_datetime + data: + datetime: "3000-01-01T00:00:00" + target: + entity_id: !input event_end + - service: input_text.set_value + data: + value: (none) + target: + entity_id: !input event_description + - service: input_number.set_value + data: + value: !input frost_setting + target: + entity_id: !input event_temperature + + ## ---------------------------------------------------------------------------- + ## ACTIONS STEP 3 -- DETERMINE THE REQUIRED TEMPERATURE AND THE REASON + ## ---------------------------------------------------------------------------- + + - choose: + # 1. If a door or window has been open for the set period, turn the heating off + - conditions: + - condition: state + entity_id: !input door_or_window_open_timer + state: idle + - condition: template + value_template: "{{ local_door_or_window_open_sensors | select ('is_state', 'on') | list | count > 0 }}" + sequence: + - service: climate.set_temperature + data: + temperature: !input frost_setting + target: + entity_id: !input thermostat_controls + - service: input_text.set_value + data: + value: "Turned off because a door or window is open" + target: + entity_id: !input setting_reason + + # 2. If the zone has been unoccupied for the set period, turn the heating off + - conditions: + - condition: state + entity_id: !input unoccupancy_timer + state: idle + - condition: template + value_template: "{{ local_zone_occupancy_sensors | reject ('is_state', [ 'unknown', 'unavailable' ] ) | select ('is_state', 'on') | list | count > 0 }}" + sequence: + - service: climate.set_temperature + data: + temperature: !input frost_setting + target: + entity_id: !input thermostat_controls + - service: input_text.set_value + data: + value: "Turned off because the zone is unoccupied" + target: + entity_id: !input setting_reason + + # 3. If there is a manual override in operation + - conditions: + - condition: state + entity_id: !input manual_override_timer + state: active + sequence: + - service: climate.set_temperature + data: + temperature: "{{ states(local_manual_temperature) }}" + target: + entity_id: !input thermostat_controls + - service: input_text.set_value + data: + value: "Set manually to {{ states(local_manual_temperature) }}. Time left {{ ( as_timestamp(state_attr(local_manual_override_timer,'finishes_at'))-as_timestamp(now()) ) | timestamp_custom('%H:%M', False, 0) }}" + target: + entity_id: !input setting_reason + + # 4.1 If there is an active calendar event with no temperature field + - conditions: + - condition: state + entity_id: !input zone_calendar + state: "on" + - condition: template + value_template: >- + {{ not states(local_event_description).split('#') | count >= 3 }} + sequence: + - service: climate.set_temperature + data: + temperature: !input frost_setting + target: + entity_id: !input thermostat_controls + - service: input_text.set_value + data: + value: >- + {{ "Turned off because the calendar event '" + states(local_event_name) + "' does not specify a temperature." }} + target: + entity_id: !input setting_reason + + # 4.2 If there is an active calendar event with a temperature field that is not a number + - conditions: + - condition: state + entity_id: !input zone_calendar + state: "on" + - condition: template + value_template: >- + {{ not states(local_event_description).split('#')[1] | is_number }} + sequence: + - service: climate.set_temperature + data: + temperature: !input frost_setting + target: + entity_id: !input thermostat_controls + - service: input_text.set_value + data: + value: >- + {{ "Turned off because the calendar event '" + states(local_event_name) + "' does not specify a valid number for the temperature." }} + target: + entity_id: !input setting_reason + + # 4.3 If there is an active calendar event with a temperature that is too low + - conditions: + - condition: state + entity_id: !input zone_calendar + state: "on" + - condition: template + value_template: >- + {{ not (states(local_event_description).split('#')[1] | float(0)) >= local_minimum_thermostat_temperature }} + sequence: + - service: climate.set_temperature + data: + temperature: !input frost_setting + target: + entity_id: !input thermostat_controls + - service: input_text.set_value + data: + value: >- + {{ "Turned off because the calendar event '" + states(local_event_name) + "' specifies a temperature below the minimum." }} + target: + entity_id: !input setting_reason + + # 4.4 If there is an active calendar event with a temperature that is too high + - conditions: + - condition: state + entity_id: !input zone_calendar + state: "on" + - condition: template + value_template: >- + {{ not (states(local_event_description).split('#')[1] | float(0)) <= local_maximum_thermostat_temperature }} + sequence: + - service: climate.set_temperature + data: + temperature: !input frost_setting + target: + entity_id: !input thermostat_controls + - service: input_text.set_value + data: + value: >- + {{ "Turned off because the calendar event '" + states(local_event_name) + "' specifies a temperature above the maximum." }} + target: + entity_id: !input setting_reason + + # 4.5 (Else) if there is an active calendar event with a valid temperature + - conditions: + - condition: state + entity_id: !input zone_calendar + state: "on" + sequence: + - service: climate.set_temperature + data: + temperature: "{{ states(local_event_temperature) }}" + target: + entity_id: !input thermostat_controls + - service: input_text.set_value + data: + value: >- + {{ "Set to " + states(local_event_temperature) + " by calendar event '" + states(local_event_name) + "' until " + ( as_timestamp(state_attr(local_zone_calendar, 'end_time')) ) | timestamp_custom('%a %d %b %Y at %H:%M') + "." }} + target: + entity_id: !input setting_reason + + # 5. If there is a calendar but no active calendar event + - conditions: + - condition: state + entity_id: !input zone_calendar + state: "off" + sequence: + - service: climate.set_temperature + data: + temperature: !input frost_setting + target: + entity_id: !input thermostat_controls + - service: input_text.set_value + data: + value: >- + {{ "Turned off because nothing is scheduled."}} + {% if state_attr(local_zone_calendar, 'message') %} + {{ "The next event is '" + state_attr(local_zone_calendar, 'message') + "' " + ( as_timestamp(state_attr(local_zone_calendar, 'start_time')) ) | timestamp_custom('on %a %d %b %Y at %H:%M')}} + {% else %} + {{ "There are no future events." }} + {% endif %} + target: + entity_id: !input setting_reason + + #6. If the calendar state becomes unknown + - conditions: + - condition: state + entity_id: !input zone_calendar + state: unknown + sequence: + - service: climate.set_temperature + data: + temperature: !input frost_setting + target: + entity_id: !input thermostat_controls + - service: input_text.set_value + data: + value: Turned off because the calendar state is unknown + target: + entity_id: !input setting_reason + + #7. If the calendar becomes unavailable + - conditions: + - condition: state + entity_id: !input zone_calendar + state: unavailable + sequence: + - service: climate.set_temperature + data: + temperature: !input frost_setting + target: + entity_id: !input thermostat_controls + - service: input_text.set_value + data: + value: Turned off because the calendar is unavailable + target: + entity_id: !input setting_reason + + # Default - should never happen! + default: + - service: climate.set_temperature + data: + temperature: !input frost_setting + target: + entity_id: !input thermostat_controls + - service: input_text.set_value + data: + value: Turned off by default + target: + entity_id: !input setting_reason + + ## ---------------------------------------------------------------------------- + ## ACTIONS STEP 4 -- ECHO-BLOCK TIMER + ## ---------------------------------------------------------------------------- + + - service: timer.start + data: + duration: + seconds: 20 + target: + entity_id: !input echoblock_timer From 4f7aa770b2967944e70a3319064a0e2d41209253 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Mon, 24 Apr 2023 19:47:05 +0100 Subject: [PATCH 11/50] Fix typo --- {bllueprints => blueprints}/heating_x.yaml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {bllueprints => blueprints}/heating_x.yaml (100%) diff --git a/bllueprints/heating_x.yaml b/blueprints/heating_x.yaml similarity index 100% rename from bllueprints/heating_x.yaml rename to blueprints/heating_x.yaml From fe37c231d5b6bb6bc1944f9f0099ec923f86a7df Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Mon, 24 Apr 2023 19:47:59 +0100 Subject: [PATCH 12/50] Fix blueprint --- blueprints/heating_x.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 7e3136e..ed8d431 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -228,7 +228,7 @@ variables: local_manual_override_timer: !input manual_override_timer local_maximum_thermostat_temperature: !input maximum_thermostat_temperature local_minimum_thermostat_temperature: !input minimum_thermostat_temperature - local_thermostat_set_temperature: !input thermostat_set_temperature_sensors + local_thermostat_set_temperature: '{{ trigger.entity_id | default("unknown") }}' local_zone_calendar: !input zone_calendar local_zone_occupancy_sensors: !input zone_occupancy_sensors From 2da8f5b8f0d98579d9219e25a2b27bb4ebfe6856 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Mon, 24 Apr 2023 19:51:42 +0100 Subject: [PATCH 13/50] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 33af738..46198e4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Heating-X-code-generator +# HeatingX -Use Jinja to create YAML files for all the template sensors and helpers required for a complete home installation of Heating X zones. +Use Jinja to create YAML files for all the template sensors and helpers required for a complete home installation of HeatingX zones. To get started: 1. Make sure you have Python 3 installed. From c3c69836989671cf475ee5e0668ba5dfe9ba5ec0 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Mon, 24 Apr 2023 19:53:31 +0100 Subject: [PATCH 14/50] Migrate to CHANGELOG.md --- CHANGELOG.md | 7 +++++++ blueprints/heating_x.yaml | 21 --------------------- 2 files changed, 7 insertions(+), 21 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..c3752ac --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +06-Feb-23 | Andy Symons | First posted on the community forum +08-Feb-23 | Andy Symons | Improved robustness when sensors become unavailable. Posted on GitHub. +12-Feb-23 | Andy Symons | Improved logic when first starting with idle timers +15-Feb-23 | Andy Symons | Mode changed to queued so all triggers used but without conficting states. +19-Feb-23 | Andy Symons | Continual refresh; robust through restart, all day events, and overlappng events +20-Feb-23 | Andy Symons | More verbose 'reason' text with event details where applicable (needs 255 character helper) +25-Feb-23 | Andy Symons | Robust against absent or invalid tempterature specification in an event. Reports errors in the reason text. diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index ed8d431..c66f464 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -1,24 +1,3 @@ -### ------------------------------------------------------------------------------------ -### -### HEATING X -### --------- -### -### Controls one or more thermostats from a calendar, -### allows temporary manual override, -### and optionally turns off thermostat if a door or window is opened, -### or if the zone is unoccupied for a while. -### Provides detailed status ('reason' text) for the dashboard. -### -### 06-Feb-23 | Andy Symons | First posted on the community forum -### 08-Feb-23 | Andy Symons | Improved robustness when sensors become unavailable. Posted on GitHub. -### 12-Feb-23 | Andy Symons | Improved logic when first starting with idle timers -### 15-Feb-23 | Andy Symons | Mode changed to queued so all triggers used but without conficting states. -### 19-Feb-23 | Andy Symons | Continual refresh; robust through restart, all day events, and overlappng events -### 20-Feb-23 | Andy Symons | More verbose 'reason' text with event details where applicable (needs 255 character helper) -### 25-Feb-23 | Andy Symons | Robust against absent or invalid tempterature specification in an event. Reports errors in the reason text. -### -### ------------------------------------------------------------------------------------ - blueprint: name: "Heating X" description: Controls one or more thermostats from a calendar, allows temporary manual override, and optionally turns off thermostat if a door or window is opened, or if the zone is unoccupied for a while. From 65cf1d446a7069ceb512cc4353fca1cba8e390a7 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Mon, 24 Apr 2023 19:54:23 +0100 Subject: [PATCH 15/50] Fix changelog --- CHANGELOG.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c3752ac..f9310eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,13 @@ 06-Feb-23 | Andy Symons | First posted on the community forum + 08-Feb-23 | Andy Symons | Improved robustness when sensors become unavailable. Posted on GitHub. + 12-Feb-23 | Andy Symons | Improved logic when first starting with idle timers + 15-Feb-23 | Andy Symons | Mode changed to queued so all triggers used but without conficting states. -19-Feb-23 | Andy Symons | Continual refresh; robust through restart, all day events, and overlappng events -20-Feb-23 | Andy Symons | More verbose 'reason' text with event details where applicable (needs 255 character helper) + +19-Feb-23 | Andy Symons | Continual refresh; robust through restart, all day events, and overlappng events. + +20-Feb-23 | Andy Symons | More verbose 'reason' text with event details where applicable (needs 255 character helper). + 25-Feb-23 | Andy Symons | Robust against absent or invalid tempterature specification in an event. Reports errors in the reason text. From 1a5b055fb35a3f25ac8a56b355c6508ba42b686b Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Mon, 24 Apr 2023 21:11:30 +0100 Subject: [PATCH 16/50] Add newline --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 53cb4bb..68b508b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ config.yaml -output/ \ No newline at end of file +output/ From 9a79f847d2f842a5356cdb32033193865b3ef525 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Tue, 25 Apr 2023 14:47:46 +0100 Subject: [PATCH 17/50] Allow the manual override to be overridden --- blueprints/heating_x.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index c66f464..6caf36c 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -241,6 +241,7 @@ trigger: - platform: state entity_id: !input manual_override_timer from: active + not_to: active id: manual_override_end # 5. Zone becomes unoccupied: sensor available and off (clear) @@ -332,7 +333,7 @@ action: sequence: - service: input_number.set_value data: - value: 0 + value: 0 # This value should never be used to set the thermostat. target: entity_id: !input manual_temperature # From 93fbb20a3441729665089319c53e394100073d15 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:24:19 +0100 Subject: [PATCH 18/50] Use Calendar Event Triggers --- blueprints/heating_x.yaml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 6caf36c..b81dd18 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -216,19 +216,17 @@ variables: ## ---------------------------------------------------------------------------- trigger: - # 1. Calendar state to on (active event) - # (Similar to event start but can be around 30 seconds later) - - platform: state + # 1. Calendar event starts + - platform: calendar + event: start entity_id: !input zone_calendar - to: "on" - id: calendar_state_to_on + id: calendar_event_start - # 2. Calendar state to off, unknown, or unavailable (no active event) - # (Similar to event end but can be around 30 seconds later) - - platform: state + # 2. Calendar event ends + - platform: calendar + event: end entity_id: !input zone_calendar - from: "on" - id: calendar_state_to_off + id: calendar_event_end # 3. Change in any one of the thermostat set temperatures - platform: state From e57841691f8e8041d2fc0d0bde4441e19ba5b550 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:24:44 +0100 Subject: [PATCH 19/50] Use Timer Event Trigger for manual override --- blueprints/heating_x.yaml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index b81dd18..c3aaa34 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -236,10 +236,12 @@ trigger: id: set_temperature_change # 4. End of manual override (timer idle, paused, unknown, or unavailable) - - platform: state - entity_id: !input manual_override_timer - from: active - not_to: active + - platform: event + event_type: + - timer.finished + - timer.cancelled + event_data: + entity_id: !input manual_override_timer id: manual_override_end # 5. Zone becomes unoccupied: sensor available and off (clear) From 49c876114ab6893c6fccf700457a182febc62e8b Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:25:06 +0100 Subject: [PATCH 20/50] Specifically detect changes in set temperature --- blueprints/heating_x.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index c3aaa34..b884dbb 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -231,6 +231,7 @@ trigger: # 3. Change in any one of the thermostat set temperatures - platform: state entity_id: !input thermostat_set_temperature_sensors + attribute: temperature for: seconds: 10 id: set_temperature_change From fc3888b3a1afd5d177df95a3fecf733515aad31e Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:49:36 +0100 Subject: [PATCH 21/50] Fix typo --- blueprints/heating_x.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index b884dbb..66ea5bc 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -193,7 +193,7 @@ blueprint: mode: queued # use all triggers but avoid conflicting states ## ---------------------------------------------------------------------------- -## LOCAL VARİABLES +## LOCAL VARIABLES ## needed to capture global variable values for use in templates ## ---------------------------------------------------------------------------- From d2550cdedd710e64a509a9064c06f7d8f0567a80 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Tue, 25 Apr 2023 16:01:27 +0100 Subject: [PATCH 22/50] Detect all temperature changes --- blueprints/heating_x.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 66ea5bc..7b55ad9 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -230,11 +230,13 @@ trigger: # 3. Change in any one of the thermostat set temperatures - platform: state - entity_id: !input thermostat_set_temperature_sensors attribute: temperature + entity_id: !input thermostat_set_temperature_sensors for: seconds: 10 id: set_temperature_change + variables: + set_temperature: "{{ state_attr(trigger.entity_id, 'temperature') }}" # 4. End of manual override (timer idle, paused, unknown, or unavailable) - platform: event @@ -311,7 +313,7 @@ action: state: idle #ignore if same value as before (e.g. triggered by template reload) - condition: template - value_template: "{{ not states(local_thermostat_set_temperature) == states(local_manual_temperature) }}" + value_template: "{{ trigger.set_temperature != states(local_manual_temperature) }}" sequence: - service: timer.start data: From 0ece3b69759c1d160660d3f643f1395238dfdacf Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Tue, 25 Apr 2023 16:28:47 +0100 Subject: [PATCH 23/50] Get rid of extra temp sensor --- blueprints/heating_x.yaml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 7b55ad9..5c34d92 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -16,14 +16,6 @@ blueprint: domain: climate multiple: true - thermostat_set_temperature_sensors: - name: DEVICE ENTITY - Thermostat set temperature - description: The (template) sensors that read the set temperature from the specified thermostats - selector: - entity: - domain: sensor - multiple: true - door_or_window_open_sensors: name: DEVICE ENTITY - Door or window open sensors description: Zero or more sensors that detect whether a door or window is open @@ -231,9 +223,7 @@ trigger: # 3. Change in any one of the thermostat set temperatures - platform: state attribute: temperature - entity_id: !input thermostat_set_temperature_sensors - for: - seconds: 10 + entity_id: !input thermostat_controls id: set_temperature_change variables: set_temperature: "{{ state_attr(trigger.entity_id, 'temperature') }}" @@ -324,7 +314,7 @@ action: # Save the manual setting most recently received (this trigger) - service: input_number.set_value data: - value: "{{ states(local_thermostat_set_temperature) }}" + value: "{{ trigger.set_temperature }}" target: entity_id: !input manual_temperature # From f984716d9442be4cbfc9f37ecfa78d8bf3993f02 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Tue, 25 Apr 2023 16:29:03 +0100 Subject: [PATCH 24/50] Correct comment --- blueprints/heating_x.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 5c34d92..a1e2575 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -392,7 +392,7 @@ action: duration: !input unoccupancy_period target: entity_id: !input unoccupancy_timer - - service: timer.pause # Keeps it in the active state + - service: timer.pause # Put it in the paused state target: entity_id: !input unoccupancy_timer From d9a8b7862c00d24bc405785b85b5f17c0634fbb6 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Tue, 25 Apr 2023 16:40:11 +0100 Subject: [PATCH 25/50] Only update the Calendar Helpers when event starts or ends --- blueprints/heating_x.yaml | 156 +++++++++++++++++++------------------- 1 file changed, 79 insertions(+), 77 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index a1e2575..02836ec 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -397,85 +397,87 @@ action: entity_id: !input unoccupancy_timer ## ---------------------------------------------------------------------------- - ## ACTIONS STEP 2 -- REFRESH THE CALENDAR EVENT HELPERS + ## ACTIONS STEP 2 -- REFRESH THE CALENDAR EVENT HELPERS (IF NEEDED) ## ---------------------------------------------------------------------------- - - if: - - condition: template - value_template: | - {{ states(local_zone_calendar) == 'on' }} - then: - - service: input_text.set_value - data: - value: "{{ state_attr(local_zone_calendar, 'message' ) }}" - target: - entity_id: !input event_name - - service: input_datetime.set_datetime - data: - datetime: "{{ state_attr(local_zone_calendar, 'start_time' ) }}" - target: - entity_id: !input event_start - - service: input_datetime.set_datetime - data: - datetime: "{{ state_attr(local_zone_calendar, 'end_time' ) }}" - target: - entity_id: !input event_end - - service: input_text.set_value - data: - value: "{{ state_attr(local_zone_calendar, 'description' ) }}" - target: - entity_id: !input event_description - - service: input_number.set_value - data: - value: >- - {% set description = state_attr(local_zone_calendar, 'description' ) %} {# copy description field #} - {% if not description.split('#') | count >= 3 %} - {% set temperature_error_code = -4 %} {# no number field #} - {% elif not description.split('#')[1] | is_number %} - {% set temperature_error_code = -3 %} {# not a number #} - {% elif not (description.split('#')[1] | float(0)) >= local_minimum_thermostat_temperature %} - {% set temperature_error_code = -2 %} {# number too small #} - {% elif not (description.split('#')[1] | float(0)) <= local_maximum_thermostat_temperature %} - {% set temperature_error_code = -1 %} {# number too big #} - - {% else %} - {% set temperature_error_code = 0 %} - {% endif %} - {% if temperature_error_code == 0 %} - {{ '%0.1f' | format(description.split('#')[1] | float(0)) }} - {% else %} - {{ local_frost_setting }} - {% endif %} - - target: - entity_id: !input event_temperature - - else: # no currently active event - - service: input_text.set_value - data: - value: (none) - target: - entity_id: !input event_name - - service: input_datetime.set_datetime - data: - datetime: "3000-01-01T00:00:00" - target: - entity_id: !input event_start - - service: input_datetime.set_datetime - data: - datetime: "3000-01-01T00:00:00" - target: - entity_id: !input event_end - - service: input_text.set_value - data: - value: (none) - target: - entity_id: !input event_description - - service: input_number.set_value - data: - value: !input frost_setting - target: - entity_id: !input event_temperature + - choose: + ### Set the calendar event helpers to the current event. ### + - conditions: + - condition: trigger + id: calendar_event_start + sequence: + - service: input_text.set_value + data: + value: "{{ trigger.calendar_event.summary }}" + target: + entity_id: !input event_name + - service: input_datetime.set_datetime + data: + datetime: "{{ trigger.calendar_event.start }}" + target: + entity_id: !input event_start + - service: input_datetime.set_datetime + data: + datetime: "{{ trigger.calendar_event.end }}" + target: + entity_id: !input event_end + - service: input_text.set_value + data: + value: "{{ trigger.calendar_event.description }}" + target: + entity_id: !input event_description + - service: input_number.set_value + data: + value: >- + {% set description = trigger.calendar_event.description ) %} {# copy description field #} + {% if not description.split('#') | count >= 3 %} + {% set temperature_error_code = -4 %} {# no number field #} + {% elif not description.split('#')[1] | is_number %} + {% set temperature_error_code = -3 %} {# not a number #} + {% elif not (description.split('#')[1] | float(0)) >= local_minimum_thermostat_temperature %} + {% set temperature_error_code = -2 %} {# number too small #} + {% elif not (description.split('#')[1] | float(0)) <= local_maximum_thermostat_temperature %} + {% set temperature_error_code = -1 %} {# number too big #} + {% else %} + {% set temperature_error_code = 0 %} + {% endif %} + {% if temperature_error_code == 0 %} + {{ '%0.1f' | format(description.split('#')[1] | float(0)) }} + {% else %} + {{ local_frost_setting }} + {% endif %} + target: + entity_id: !input event_temperature + ### Reset the calendar event helpers when the event ends. ### + - conditions: + - condition: trigger + id: calendar_event_end + sequence: + - service: input_text.set_value + data: + value: (none) + target: + entity_id: !input event_name + - service: input_datetime.set_datetime + data: + datetime: "3000-01-01T00:00:00" + target: + entity_id: !input event_start + - service: input_datetime.set_datetime + data: + datetime: "3000-01-01T00:00:00" + target: + entity_id: !input event_end + - service: input_text.set_value + data: + value: (none) + target: + entity_id: !input event_description + - service: input_number.set_value + data: + value: !input frost_setting + target: + entity_id: !input event_temperature ## ---------------------------------------------------------------------------- ## ACTIONS STEP 3 -- DETERMINE THE REQUIRED TEMPERATURE AND THE REASON From d41907553db63052699affc9fc3a79ce41ec67cd Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Tue, 25 Apr 2023 17:04:05 +0100 Subject: [PATCH 26/50] Fix typos --- blueprints/heating_x.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 02836ec..4598427 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -199,7 +199,6 @@ variables: local_manual_override_timer: !input manual_override_timer local_maximum_thermostat_temperature: !input maximum_thermostat_temperature local_minimum_thermostat_temperature: !input minimum_thermostat_temperature - local_thermostat_set_temperature: '{{ trigger.entity_id | default("unknown") }}' local_zone_calendar: !input zone_calendar local_zone_occupancy_sensors: !input zone_occupancy_sensors @@ -226,7 +225,7 @@ trigger: entity_id: !input thermostat_controls id: set_temperature_change variables: - set_temperature: "{{ state_attr(trigger.entity_id, 'temperature') }}" + set_temperature: "{{ state_attr(trigger.entity_id, 'temperature') }}" # 4. End of manual override (timer idle, paused, unknown, or unavailable) - platform: event @@ -429,7 +428,7 @@ action: - service: input_number.set_value data: value: >- - {% set description = trigger.calendar_event.description ) %} {# copy description field #} + {% set description = trigger.calendar_event.description %} {# copy description field #} {% if not description.split('#') | count >= 3 %} {% set temperature_error_code = -4 %} {# no number field #} {% elif not description.split('#')[1] | is_number %} From 8c9570064fc7fce76adc0448e0f859d37ffa837e Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Wed, 26 Apr 2023 08:29:06 +0100 Subject: [PATCH 27/50] Simplify calendar triggers --- blueprints/heating_x.yaml | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 4598427..74a7f88 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -207,19 +207,13 @@ variables: ## ---------------------------------------------------------------------------- trigger: - # 1. Calendar event starts + # 1. Calendar event starts or ends - platform: calendar event: start entity_id: !input zone_calendar - id: calendar_event_start + id: calendar_event - # 2. Calendar event ends - - platform: calendar - event: end - entity_id: !input zone_calendar - id: calendar_event_end - - # 3. Change in any one of the thermostat set temperatures + # 2. Change in any one of the thermostat set temperatures - platform: state attribute: temperature entity_id: !input thermostat_controls @@ -227,7 +221,7 @@ trigger: variables: set_temperature: "{{ state_attr(trigger.entity_id, 'temperature') }}" - # 4. End of manual override (timer idle, paused, unknown, or unavailable) + # 3. End of manual override (timer idle, paused, unknown, or unavailable) - platform: event event_type: - timer.finished @@ -236,7 +230,7 @@ trigger: entity_id: !input manual_override_timer id: manual_override_end - # 5. Zone becomes unoccupied: sensor available and off (clear) + # 4. Zone becomes unoccupied: sensor available and off (clear) - platform: state entity_id: !input zone_occupancy_sensors to: "off" @@ -244,7 +238,7 @@ trigger: seconds: 10 id: zone_unoccupied - # 6. Zone becomes occupied: sensor 'detected' (on), 'unknown', or 'unavailable' + # 5. Zone becomes occupied: sensor 'detected' (on), 'unknown', or 'unavailable' - platform: state entity_id: !input zone_occupancy_sensors from: "off" @@ -252,7 +246,7 @@ trigger: seconds: 10 id: zone_occupied - # 7. A door or window is opened + # 6. A door or window is opened - platform: state entity_id: !input door_or_window_open_sensors to: "on" @@ -260,7 +254,7 @@ trigger: seconds: 10 id: door_or_window_opened - # 8. A doors or windows is closed, or becomes 'unknown' or 'unavailable' + # 7. A doors or windows is closed, or becomes 'unknown' or 'unavailable' - platform: state entity_id: !input door_or_window_open_sensors from: "on" @@ -268,19 +262,19 @@ trigger: seconds: 10 id: doors_and_windows_closed - # 9. Door or window open timer finished (time to turn off the heating) + # 8. Door or window open timer finished (time to turn off the heating) - platform: state entity_id: !input door_or_window_open_timer from: active id: door_or_window_open_timer_end - # 10. Unoccupancy timer finished (time to turn off the heating) + # 9. Unoccupancy timer finished (time to turn off the heating) - platform: state entity_id: !input unoccupancy_timer from: active id: unoccupancy_timer_end - # 13. Refresh every minute + # 10. Refresh every 2 minutes - platform: time_pattern seconds: "02" # after the now() time is set at seconds 00 @@ -403,7 +397,9 @@ action: ### Set the calendar event helpers to the current event. ### - conditions: - condition: trigger - id: calendar_event_start + id: calendar_event + - condition: template + value_template: "{{ trigger.event == 'start' }}" sequence: - service: input_text.set_value data: @@ -450,7 +446,9 @@ action: ### Reset the calendar event helpers when the event ends. ### - conditions: - condition: trigger - id: calendar_event_end + id: calendar_event + - condition: template + value_template: "{{ trigger.event == 'end' }}" sequence: - service: input_text.set_value data: From b87bf7168b1962decf146d10c0c6ec1e338d901c Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Wed, 26 Apr 2023 08:29:33 +0100 Subject: [PATCH 28/50] Only refresh on state changes --- blueprints/heating_x.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 74a7f88..44baaca 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -274,10 +274,6 @@ trigger: from: active id: unoccupancy_timer_end - # 10. Refresh every 2 minutes - - platform: time_pattern - seconds: "02" # after the now() time is set at seconds 00 - ## ---------------------------------------------------------------------------- ## ACTIONS STEP 1 -- SET THE STATE VARİABLES ## ---------------------------------------------------------------------------- From 247c0defe725c37d8f5a6c7060873c378fca79a4 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Wed, 26 Apr 2023 09:08:25 +0100 Subject: [PATCH 29/50] Remove `local_` prefixes --- blueprints/heating_x.yaml | 64 ++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 44baaca..9593ffb 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -190,17 +190,17 @@ mode: queued # use all triggers but avoid conflicting states ## ---------------------------------------------------------------------------- variables: - local_door_or_window_open_sensors: !input door_or_window_open_sensors - local_event_description: !input event_description - local_event_name: !input event_name - local_event_temperature: !input event_temperature - local_frost_setting: !input frost_setting - local_manual_temperature: !input manual_temperature - local_manual_override_timer: !input manual_override_timer - local_maximum_thermostat_temperature: !input maximum_thermostat_temperature - local_minimum_thermostat_temperature: !input minimum_thermostat_temperature - local_zone_calendar: !input zone_calendar - local_zone_occupancy_sensors: !input zone_occupancy_sensors + door_or_window_open_sensors: !input door_or_window_open_sensors + event_description: !input event_description + event_name: !input event_name + event_temperature: !input event_temperature + frost_setting: !input frost_setting + manual_temperature: !input manual_temperature + manual_override_timer: !input manual_override_timer + maximum_thermostat_temperature: !input maximum_thermostat_temperature + minimum_thermostat_temperature: !input minimum_thermostat_temperature + zone_calendar: !input zone_calendar + zone_occupancy_sensors: !input zone_occupancy_sensors ## ---------------------------------------------------------------------------- ## TRIGGERS @@ -292,7 +292,7 @@ action: state: idle #ignore if same value as before (e.g. triggered by template reload) - condition: template - value_template: "{{ trigger.set_temperature != states(local_manual_temperature) }}" + value_template: "{{ trigger.set_temperature != states(manual_temperature) }}" sequence: - service: timer.start data: @@ -425,9 +425,9 @@ action: {% set temperature_error_code = -4 %} {# no number field #} {% elif not description.split('#')[1] | is_number %} {% set temperature_error_code = -3 %} {# not a number #} - {% elif not (description.split('#')[1] | float(0)) >= local_minimum_thermostat_temperature %} + {% elif not (description.split('#')[1] | float(0)) >= minimum_thermostat_temperature %} {% set temperature_error_code = -2 %} {# number too small #} - {% elif not (description.split('#')[1] | float(0)) <= local_maximum_thermostat_temperature %} + {% elif not (description.split('#')[1] | float(0)) <= maximum_thermostat_temperature %} {% set temperature_error_code = -1 %} {# number too big #} {% else %} {% set temperature_error_code = 0 %} @@ -435,7 +435,7 @@ action: {% if temperature_error_code == 0 %} {{ '%0.1f' | format(description.split('#')[1] | float(0)) }} {% else %} - {{ local_frost_setting }} + {{ frost_setting }} {% endif %} target: entity_id: !input event_temperature @@ -483,7 +483,7 @@ action: entity_id: !input door_or_window_open_timer state: idle - condition: template - value_template: "{{ local_door_or_window_open_sensors | select ('is_state', 'on') | list | count > 0 }}" + value_template: "{{ door_or_window_open_sensors | select ('is_state', 'on') | list | count > 0 }}" sequence: - service: climate.set_temperature data: @@ -502,7 +502,7 @@ action: entity_id: !input unoccupancy_timer state: idle - condition: template - value_template: "{{ local_zone_occupancy_sensors | reject ('is_state', [ 'unknown', 'unavailable' ] ) | select ('is_state', 'on') | list | count > 0 }}" + value_template: "{{ zone_occupancy_sensors | reject ('is_state', [ 'unknown', 'unavailable' ] ) | select ('is_state', 'on') | list | count > 0 }}" sequence: - service: climate.set_temperature data: @@ -517,18 +517,20 @@ action: # 3. If there is a manual override in operation - conditions: + - condition: trigger + id: set_temperature_change - condition: state entity_id: !input manual_override_timer state: active sequence: - service: climate.set_temperature data: - temperature: "{{ states(local_manual_temperature) }}" + temperature: "{{ states(manual_temperature) }}" target: entity_id: !input thermostat_controls - service: input_text.set_value data: - value: "Set manually to {{ states(local_manual_temperature) }}. Time left {{ ( as_timestamp(state_attr(local_manual_override_timer,'finishes_at'))-as_timestamp(now()) ) | timestamp_custom('%H:%M', False, 0) }}" + value: "Set manually to {{ states(manual_temperature) }}. Time left {{ ( as_timestamp(state_attr(manual_override_timer,'finishes_at'))-as_timestamp(now()) ) | timestamp_custom('%H:%M', False, 0) }}" target: entity_id: !input setting_reason @@ -539,7 +541,7 @@ action: state: "on" - condition: template value_template: >- - {{ not states(local_event_description).split('#') | count >= 3 }} + {{ not states(event_description).split('#') | count >= 3 }} sequence: - service: climate.set_temperature data: @@ -549,7 +551,7 @@ action: - service: input_text.set_value data: value: >- - {{ "Turned off because the calendar event '" + states(local_event_name) + "' does not specify a temperature." }} + {{ "Turned off because the calendar event '" + states(event_name) + "' does not specify a temperature." }} target: entity_id: !input setting_reason @@ -560,7 +562,7 @@ action: state: "on" - condition: template value_template: >- - {{ not states(local_event_description).split('#')[1] | is_number }} + {{ not states(event_description).split('#')[1] | is_number }} sequence: - service: climate.set_temperature data: @@ -570,7 +572,7 @@ action: - service: input_text.set_value data: value: >- - {{ "Turned off because the calendar event '" + states(local_event_name) + "' does not specify a valid number for the temperature." }} + {{ "Turned off because the calendar event '" + states(event_name) + "' does not specify a valid number for the temperature." }} target: entity_id: !input setting_reason @@ -581,7 +583,7 @@ action: state: "on" - condition: template value_template: >- - {{ not (states(local_event_description).split('#')[1] | float(0)) >= local_minimum_thermostat_temperature }} + {{ not (states(event_description).split('#')[1] | float(0)) >= minimum_thermostat_temperature }} sequence: - service: climate.set_temperature data: @@ -591,7 +593,7 @@ action: - service: input_text.set_value data: value: >- - {{ "Turned off because the calendar event '" + states(local_event_name) + "' specifies a temperature below the minimum." }} + {{ "Turned off because the calendar event '" + states(event_name) + "' specifies a temperature below the minimum." }} target: entity_id: !input setting_reason @@ -602,7 +604,7 @@ action: state: "on" - condition: template value_template: >- - {{ not (states(local_event_description).split('#')[1] | float(0)) <= local_maximum_thermostat_temperature }} + {{ not (states(event_description).split('#')[1] | float(0)) <= maximum_thermostat_temperature }} sequence: - service: climate.set_temperature data: @@ -612,7 +614,7 @@ action: - service: input_text.set_value data: value: >- - {{ "Turned off because the calendar event '" + states(local_event_name) + "' specifies a temperature above the maximum." }} + {{ "Turned off because the calendar event '" + states(event_name) + "' specifies a temperature above the maximum." }} target: entity_id: !input setting_reason @@ -624,13 +626,13 @@ action: sequence: - service: climate.set_temperature data: - temperature: "{{ states(local_event_temperature) }}" + temperature: "{{ states(event_temperature) }}" target: entity_id: !input thermostat_controls - service: input_text.set_value data: value: >- - {{ "Set to " + states(local_event_temperature) + " by calendar event '" + states(local_event_name) + "' until " + ( as_timestamp(state_attr(local_zone_calendar, 'end_time')) ) | timestamp_custom('%a %d %b %Y at %H:%M') + "." }} + {{ "Set to " + states(event_temperature) + " by calendar event '" + states(event_name) + "' until " + ( as_timestamp(state_attr(zone_calendar, 'end_time')) ) | timestamp_custom('%a %d %b %Y at %H:%M') + "." }} target: entity_id: !input setting_reason @@ -649,8 +651,8 @@ action: data: value: >- {{ "Turned off because nothing is scheduled."}} - {% if state_attr(local_zone_calendar, 'message') %} - {{ "The next event is '" + state_attr(local_zone_calendar, 'message') + "' " + ( as_timestamp(state_attr(local_zone_calendar, 'start_time')) ) | timestamp_custom('on %a %d %b %Y at %H:%M')}} + {% if state_attr(zone_calendar, 'message') %} + {{ "The next event is '" + state_attr(zone_calendar, 'message') + "' " + ( as_timestamp(state_attr(zone_calendar, 'start_time')) ) | timestamp_custom('on %a %d %b %Y at %H:%M')}} {% else %} {{ "There are no future events." }} {% endif %} From 060030a375eab4159df0cde9221046ee66196d93 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Wed, 26 Apr 2023 09:19:03 +0100 Subject: [PATCH 30/50] Infer min/max temperature from thermostat entities --- blueprints/heating_x.yaml | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 9593ffb..ca325fd 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -127,24 +127,6 @@ blueprint: entity: domain: timer - minimum_thermostat_temperature: - name: PARAMETER - Minimum thermostat temperature - description: The minimum temperature that can be set on the thermostat - selector: - number: - min: 0 - max: 100 - default: 5 - - maximum_thermostat_temperature: - name: PARAMETER - Maximum thermostat temperature - description: The maximum temperature that can be set on the thermostat - selector: - number: - min: 0 - max: 100 - default: 95 - frost_setting: name: PARAMETER - Frost setting description: The temperature to be used when the heating is turned off @@ -190,6 +172,7 @@ mode: queued # use all triggers but avoid conflicting states ## ---------------------------------------------------------------------------- variables: + thermostat_controls: !input thermostat_controls door_or_window_open_sensors: !input door_or_window_open_sensors event_description: !input event_description event_name: !input event_name @@ -197,8 +180,8 @@ variables: frost_setting: !input frost_setting manual_temperature: !input manual_temperature manual_override_timer: !input manual_override_timer - maximum_thermostat_temperature: !input maximum_thermostat_temperature - minimum_thermostat_temperature: !input minimum_thermostat_temperature + maximum_thermostat_temperature: "{{ thermostat_controls | map('state_attr', 'max_temp') | min }}" + minimum_thermostat_temperature: "{{ thermostat_controls | map('state_attr', 'min_temp') | max }}" zone_calendar: !input zone_calendar zone_occupancy_sensors: !input zone_occupancy_sensors From 92d639516686049d81857caacb7686c6322bab90 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Wed, 26 Apr 2023 18:54:23 +0100 Subject: [PATCH 31/50] Make sure not to try to set too low a temp --- blueprints/heating_x.yaml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index ca325fd..256656f 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -298,7 +298,7 @@ action: sequence: - service: input_number.set_value data: - value: 0 # This value should never be used to set the thermostat. + value: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" target: entity_id: !input manual_temperature # @@ -418,7 +418,7 @@ action: {% if temperature_error_code == 0 %} {{ '%0.1f' | format(description.split('#')[1] | float(0)) }} {% else %} - {{ frost_setting }} + {{ [frost_setting, minimum_thermostat_temperature] | max }} {% endif %} target: entity_id: !input event_temperature @@ -451,7 +451,7 @@ action: entity_id: !input event_description - service: input_number.set_value data: - value: !input frost_setting + value: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" target: entity_id: !input event_temperature @@ -470,7 +470,7 @@ action: sequence: - service: climate.set_temperature data: - temperature: !input frost_setting + temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" target: entity_id: !input thermostat_controls - service: input_text.set_value @@ -489,7 +489,7 @@ action: sequence: - service: climate.set_temperature data: - temperature: !input frost_setting + temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" target: entity_id: !input thermostat_controls - service: input_text.set_value @@ -528,7 +528,7 @@ action: sequence: - service: climate.set_temperature data: - temperature: !input frost_setting + temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" target: entity_id: !input thermostat_controls - service: input_text.set_value @@ -549,7 +549,7 @@ action: sequence: - service: climate.set_temperature data: - temperature: !input frost_setting + temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" target: entity_id: !input thermostat_controls - service: input_text.set_value @@ -570,7 +570,7 @@ action: sequence: - service: climate.set_temperature data: - temperature: !input frost_setting + temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" target: entity_id: !input thermostat_controls - service: input_text.set_value @@ -591,7 +591,7 @@ action: sequence: - service: climate.set_temperature data: - temperature: !input frost_setting + temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" target: entity_id: !input thermostat_controls - service: input_text.set_value @@ -627,7 +627,7 @@ action: sequence: - service: climate.set_temperature data: - temperature: !input frost_setting + temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" target: entity_id: !input thermostat_controls - service: input_text.set_value @@ -650,7 +650,7 @@ action: sequence: - service: climate.set_temperature data: - temperature: !input frost_setting + temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" target: entity_id: !input thermostat_controls - service: input_text.set_value @@ -667,7 +667,7 @@ action: sequence: - service: climate.set_temperature data: - temperature: !input frost_setting + temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" target: entity_id: !input thermostat_controls - service: input_text.set_value @@ -680,7 +680,7 @@ action: default: - service: climate.set_temperature data: - temperature: !input frost_setting + temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" target: entity_id: !input thermostat_controls - service: input_text.set_value From 5aac0d9860b9c894c43e5e915f24598e5e02e9c7 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Wed, 26 Apr 2023 19:09:02 +0100 Subject: [PATCH 32/50] React to calendar events --- blueprints/heating_x.yaml | 42 ++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 256656f..460055e 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -519,9 +519,10 @@ action: # 4.1 If there is an active calendar event with no temperature field - conditions: - - condition: state - entity_id: !input zone_calendar - state: "on" + - condition: trigger + id: calendar_event + - condition: template + value_template: "{{ trigger.event == 'start' }}" - condition: template value_template: >- {{ not states(event_description).split('#') | count >= 3 }} @@ -540,9 +541,10 @@ action: # 4.2 If there is an active calendar event with a temperature field that is not a number - conditions: - - condition: state - entity_id: !input zone_calendar - state: "on" + - condition: trigger + id: calendar_event + - condition: template + value_template: "{{ trigger.event == 'start' }}" - condition: template value_template: >- {{ not states(event_description).split('#')[1] | is_number }} @@ -561,9 +563,10 @@ action: # 4.3 If there is an active calendar event with a temperature that is too low - conditions: - - condition: state - entity_id: !input zone_calendar - state: "on" + - condition: trigger + id: calendar_event + - condition: template + value_template: "{{ trigger.event == 'start' }}" - condition: template value_template: >- {{ not (states(event_description).split('#')[1] | float(0)) >= minimum_thermostat_temperature }} @@ -582,9 +585,10 @@ action: # 4.4 If there is an active calendar event with a temperature that is too high - conditions: - - condition: state - entity_id: !input zone_calendar - state: "on" + - condition: trigger + id: calendar_event + - condition: template + value_template: "{{ trigger.event == 'start' }}" - condition: template value_template: >- {{ not (states(event_description).split('#')[1] | float(0)) <= maximum_thermostat_temperature }} @@ -603,9 +607,10 @@ action: # 4.5 (Else) if there is an active calendar event with a valid temperature - conditions: - - condition: state - entity_id: !input zone_calendar - state: "on" + - condition: trigger + id: calendar_event + - condition: template + value_template: "{{ trigger.event == 'start' }}" sequence: - service: climate.set_temperature data: @@ -621,9 +626,10 @@ action: # 5. If there is a calendar but no active calendar event - conditions: - - condition: state - entity_id: !input zone_calendar - state: "off" + - condition: trigger + id: calendar_event + - condition: template + value_template: "{{ trigger.event == 'end' }}" sequence: - service: climate.set_temperature data: From 709912fb4152f7a89df7cd9eda29dc556b6a23bf Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Wed, 26 Apr 2023 19:09:28 +0100 Subject: [PATCH 33/50] Start timer after setting manual temp --- blueprints/heating_x.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 460055e..64a573f 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -277,18 +277,18 @@ action: - condition: template value_template: "{{ trigger.set_temperature != states(manual_temperature) }}" sequence: - - service: timer.start - data: - duration: !input manual_override_period - target: - entity_id: !input manual_override_timer - # Save the manual setting most recently received (this trigger) - service: input_number.set_value data: value: "{{ trigger.set_temperature }}" target: entity_id: !input manual_temperature + + - service: timer.start + data: + duration: !input manual_override_period + target: + entity_id: !input manual_override_timer # # b. Manual override end # From 4c94f5c0e81cae7d4ab104c7a7b7140c06589653 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Wed, 26 Apr 2023 19:38:37 +0100 Subject: [PATCH 34/50] Store error codes in `event_temperature` helper --- blueprints/heating_x.yaml | 35 +++++++++-------------------------- 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 64a573f..32fb439 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -64,13 +64,6 @@ blueprint: entity: domain: input_datetime - event_description: - name: HELPER - Event description - description: The global variable (helper) to hold the description of the current event (if any) - selector: - entity: - domain: input_text - event_temperature: name: HELPER - Event temperature description: The global variable (helper) to hold the temperature specified in the current event (if any) @@ -174,7 +167,6 @@ mode: queued # use all triggers but avoid conflicting states variables: thermostat_controls: !input thermostat_controls door_or_window_open_sensors: !input door_or_window_open_sensors - event_description: !input event_description event_name: !input event_name event_temperature: !input event_temperature frost_setting: !input frost_setting @@ -395,30 +387,26 @@ action: datetime: "{{ trigger.calendar_event.end }}" target: entity_id: !input event_end - - service: input_text.set_value - data: - value: "{{ trigger.calendar_event.description }}" - target: - entity_id: !input event_description - service: input_number.set_value data: value: >- {% set description = trigger.calendar_event.description %} {# copy description field #} - {% if not description.split('#') | count >= 3 %} + {% if description.split('#') | count < 3 %} {% set temperature_error_code = -4 %} {# no number field #} {% elif not description.split('#')[1] | is_number %} {% set temperature_error_code = -3 %} {# not a number #} - {% elif not (description.split('#')[1] | float(0)) >= minimum_thermostat_temperature %} + {% elif (description.split('#')[1] | float(0)) < minimum_thermostat_temperature %} {% set temperature_error_code = -2 %} {# number too small #} - {% elif not (description.split('#')[1] | float(0)) <= maximum_thermostat_temperature %} + {% elif (description.split('#')[1] | float(0)) > maximum_thermostat_temperature %} {% set temperature_error_code = -1 %} {# number too big #} {% else %} {% set temperature_error_code = 0 %} {% endif %} + {% if temperature_error_code == 0 %} {{ '%0.1f' | format(description.split('#')[1] | float(0)) }} {% else %} - {{ [frost_setting, minimum_thermostat_temperature] | max }} + {{ temperature_error_code }} {% endif %} target: entity_id: !input event_temperature @@ -444,11 +432,6 @@ action: datetime: "3000-01-01T00:00:00" target: entity_id: !input event_end - - service: input_text.set_value - data: - value: (none) - target: - entity_id: !input event_description - service: input_number.set_value data: value: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" @@ -525,7 +508,7 @@ action: value_template: "{{ trigger.event == 'start' }}" - condition: template value_template: >- - {{ not states(event_description).split('#') | count >= 3 }} + {{ states(event_temperature) | float == -4 }} sequence: - service: climate.set_temperature data: @@ -547,7 +530,7 @@ action: value_template: "{{ trigger.event == 'start' }}" - condition: template value_template: >- - {{ not states(event_description).split('#')[1] | is_number }} + {{ states(event_temperature) | float == -3 }} sequence: - service: climate.set_temperature data: @@ -569,7 +552,7 @@ action: value_template: "{{ trigger.event == 'start' }}" - condition: template value_template: >- - {{ not (states(event_description).split('#')[1] | float(0)) >= minimum_thermostat_temperature }} + {{ states(event_temperature) | float == -2 }} sequence: - service: climate.set_temperature data: @@ -591,7 +574,7 @@ action: value_template: "{{ trigger.event == 'start' }}" - condition: template value_template: >- - {{ not (states(event_description).split('#')[1] | float(0)) <= maximum_thermostat_temperature }} + {{ states(event_temperature) | float == -1 }} sequence: - service: climate.set_temperature data: From 37031833506ff679188b511982f3da2ffd01b2e6 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Wed, 26 Apr 2023 21:20:27 +0100 Subject: [PATCH 35/50] Always update calendar helpers --- blueprints/heating_x.yaml | 63 ++++++++++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 32fb439..7878310 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -365,32 +365,60 @@ action: ## ---------------------------------------------------------------------------- - choose: - ### Set the calendar event helpers to the current event. ### - conditions: - - condition: trigger - id: calendar_event - - condition: template - value_template: "{{ trigger.event == 'start' }}" + - condition: or + conditions: + - condition: and + conditions: + - condition: trigger + id: calendar_event + - condition: template + value_template: "{{ trigger.event == 'start' }}" + # If there is an active event we might as well update the helpers. + - condition: state + entity_id: !input zone_calendar + state: 'on' sequence: - service: input_text.set_value data: - value: "{{ trigger.calendar_event.summary }}" + value: >- + {% if trigger.platform == 'calendar' %} + {{ trigger.calendar_event.summary }} + {% else %} + {{ state_attr(zone_calendar, 'message') }} + {% endif %} target: entity_id: !input event_name - service: input_datetime.set_datetime data: - datetime: "{{ trigger.calendar_event.start }}" + datetime: >- + {% if trigger.platform == 'calendar' %} + {{ trigger.calendar_event.start }} + {% else %} + {{ state_attr(zone_calendar, 'start_time') }} + {% endif %} target: entity_id: !input event_start - service: input_datetime.set_datetime data: - datetime: "{{ trigger.calendar_event.end }}" + datetime: >- + {% if trigger.platform == 'calendar' %} + {{ trigger.calendar_event.end }} + {% else %} + {{ state_attr(zone_calendar, 'end_time') }} + {% endif %} target: entity_id: !input event_end - service: input_number.set_value data: value: >- - {% set description = trigger.calendar_event.description %} {# copy description field #} + {# copy description field #} + {% if trigger.platform == 'calendar' %} + {% set description = trigger.calendar_event.description %} + {% else %} + {% set description = state_attr(zone_calendar, 'description') %} + {% endif %} + {% if description.split('#') | count < 3 %} {% set temperature_error_code = -4 %} {# no number field #} {% elif not description.split('#')[1] | is_number %} @@ -410,12 +438,19 @@ action: {% endif %} target: entity_id: !input event_temperature - ### Reset the calendar event helpers when the event ends. ### - conditions: - - condition: trigger - id: calendar_event - - condition: template - value_template: "{{ trigger.event == 'end' }}" + - condition: or + conditions: + - condition: and + conditions: + - condition: trigger + id: calendar_event + - condition: template + value_template: "{{ trigger.event == 'end' }}" + # If there is no active event we might as well update the helpers. + - condition: state + entity_id: !input zone_calendar + state: 'off' sequence: - service: input_text.set_value data: From 14b21e06a79d02a1f86a2a09c0c83b50d0bba6cb Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Wed, 26 Apr 2023 21:22:19 +0100 Subject: [PATCH 36/50] Get rid of `manual_temperature` helper --- blueprints/heating_x.yaml | 35 ++++------------------------------- 1 file changed, 4 insertions(+), 31 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 7878310..2311b79 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -71,13 +71,6 @@ blueprint: entity: domain: input_number - manual_temperature: - name: HELPER - Manual temperature - description: The global variable (helper) to hold the temperature specified by manual control of the device or the dashboard - selector: - entity: - domain: input_number - setting_reason: name: HELPER - Setting reason description: The global variable (helper) into which the automation writes the reason for the current setting (for use on a dashboard) @@ -170,7 +163,6 @@ variables: event_name: !input event_name event_temperature: !input event_temperature frost_setting: !input frost_setting - manual_temperature: !input manual_temperature manual_override_timer: !input manual_override_timer maximum_thermostat_temperature: "{{ thermostat_controls | map('state_attr', 'max_temp') | min }}" minimum_thermostat_temperature: "{{ thermostat_controls | map('state_attr', 'min_temp') | max }}" @@ -265,35 +257,16 @@ action: - condition: state entity_id: !input echoblock_timer state: idle - #ignore if same value as before (e.g. triggered by template reload) + # ignore if same value as before (e.g. triggered by template reload) - condition: template - value_template: "{{ trigger.set_temperature != states(manual_temperature) }}" + value_template: "{{ set_temperature != trigger.from_state.temperature }}" sequence: - # Save the manual setting most recently received (this trigger) - - service: input_number.set_value - data: - value: "{{ trigger.set_temperature }}" - target: - entity_id: !input manual_temperature - - service: timer.start data: duration: !input manual_override_period target: entity_id: !input manual_override_timer # - # b. Manual override end - # - - conditions: - - condition: trigger - id: manual_override_end - sequence: - - service: input_number.set_value - data: - value: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" - target: - entity_id: !input manual_temperature - # # c. Door or window opened - start timer # - conditions: @@ -526,12 +499,12 @@ action: sequence: - service: climate.set_temperature data: - temperature: "{{ states(manual_temperature) }}" + temperature: "{{ set_temperature }}" target: entity_id: !input thermostat_controls - service: input_text.set_value data: - value: "Set manually to {{ states(manual_temperature) }}. Time left {{ ( as_timestamp(state_attr(manual_override_timer,'finishes_at'))-as_timestamp(now()) ) | timestamp_custom('%H:%M', False, 0) }}" + value: "Set manually to {{ set_temperature }}. Time left {{ ( as_timestamp(state_attr(manual_override_timer,'finishes_at'))-as_timestamp(now()) ) | timestamp_custom('%H:%M', False, 0) }}" target: entity_id: !input setting_reason From af8a7b6dc99fdeab74cf4da6e64d3d8f2c71e9ac Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Wed, 26 Apr 2023 21:39:58 +0100 Subject: [PATCH 37/50] Fix comparison --- blueprints/heating_x.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 2311b79..ca97736 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -259,7 +259,7 @@ action: state: idle # ignore if same value as before (e.g. triggered by template reload) - condition: template - value_template: "{{ set_temperature != trigger.from_state.temperature }}" + value_template: "{{ set_temperature != trigger.from_state.attributes.temperature }}" sequence: - service: timer.start data: From bc361f2d73d4a2e3bfb350c2f67f99f801c0bde6 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Wed, 26 Apr 2023 21:41:48 +0100 Subject: [PATCH 38/50] Set temperature on calendar event or manual override end --- blueprints/heating_x.yaml | 99 ++++++++++++++++++++++++++++++--------- 1 file changed, 77 insertions(+), 22 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index ca97736..5165a1b 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -510,10 +510,19 @@ action: # 4.1 If there is an active calendar event with no temperature field - conditions: - - condition: trigger - id: calendar_event - - condition: template - value_template: "{{ trigger.event == 'start' }}" + - condition: or + conditions: + # Triggered by the calendar event starting. + - condition: and + conditions: + - condition: trigger + id: calendar_event + - condition: template + value_template: "{{ trigger.event == 'start' }}" + # Triggered by the manual override ending. + - condition: trigger + id: manual_override_end + # The calendar event has no temperature field. - condition: template value_template: >- {{ states(event_temperature) | float == -4 }} @@ -532,10 +541,19 @@ action: # 4.2 If there is an active calendar event with a temperature field that is not a number - conditions: - - condition: trigger - id: calendar_event - - condition: template - value_template: "{{ trigger.event == 'start' }}" + - condition: or + conditions: + # Triggered by the calendar event starting. + - condition: and + conditions: + - condition: trigger + id: calendar_event + - condition: template + value_template: "{{ trigger.event == 'start' }}" + # Triggered by the manual override ending. + - condition: trigger + id: manual_override_end + # The calendar event has no temperature field. - condition: template value_template: >- {{ states(event_temperature) | float == -3 }} @@ -554,10 +572,19 @@ action: # 4.3 If there is an active calendar event with a temperature that is too low - conditions: - - condition: trigger - id: calendar_event - - condition: template - value_template: "{{ trigger.event == 'start' }}" + - condition: or + conditions: + # Triggered by the calendar event starting. + - condition: and + conditions: + - condition: trigger + id: calendar_event + - condition: template + value_template: "{{ trigger.event == 'start' }}" + # Triggered by the manual override ending. + - condition: trigger + id: manual_override_end + # The calendar event has no temperature field. - condition: template value_template: >- {{ states(event_temperature) | float == -2 }} @@ -576,10 +603,19 @@ action: # 4.4 If there is an active calendar event with a temperature that is too high - conditions: - - condition: trigger - id: calendar_event - - condition: template - value_template: "{{ trigger.event == 'start' }}" + - condition: or + conditions: + # Triggered by the calendar event starting. + - condition: and + conditions: + - condition: trigger + id: calendar_event + - condition: template + value_template: "{{ trigger.event == 'start' }}" + # Triggered by the manual override ending. + - condition: trigger + id: manual_override_end + # The calendar event has no temperature field. - condition: template value_template: >- {{ states(event_temperature) | float == -1 }} @@ -598,8 +634,19 @@ action: # 4.5 (Else) if there is an active calendar event with a valid temperature - conditions: - - condition: trigger - id: calendar_event + - condition: or + conditions: + # Triggered by the calendar event starting. + - condition: and + conditions: + - condition: trigger + id: calendar_event + - condition: template + value_template: "{{ trigger.event == 'start' }}" + # Triggered by the manual override ending. + - condition: trigger + id: manual_override_end + # The calendar event has no temperature field. - condition: template value_template: "{{ trigger.event == 'start' }}" sequence: @@ -617,10 +664,18 @@ action: # 5. If there is a calendar but no active calendar event - conditions: - - condition: trigger - id: calendar_event - - condition: template - value_template: "{{ trigger.event == 'end' }}" + - condition: or + conditions: + # Triggered by the calendar event starting. + - condition: and + conditions: + - condition: trigger + id: calendar_event + - condition: template + value_template: "{{ trigger.event == 'end' }}" + # Triggered by the manual override ending. + - condition: trigger + id: manual_override_end sequence: - service: climate.set_temperature data: From b3b9a6f2ac17699efdef545cf39b2cc2ec80b194 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Wed, 26 Apr 2023 21:41:57 +0100 Subject: [PATCH 39/50] Move echo block --- blueprints/heating_x.yaml | 91 ++++++++++++++++++++++++++++----------- 1 file changed, 66 insertions(+), 25 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 5165a1b..090fe6d 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -449,7 +449,6 @@ action: ## ---------------------------------------------------------------------------- ## ACTIONS STEP 3 -- DETERMINE THE REQUIRED TEMPERATURE AND THE REASON ## ---------------------------------------------------------------------------- - - choose: # 1. If a door or window has been open for the set period, turn the heating off - conditions: @@ -469,6 +468,12 @@ action: value: "Turned off because a door or window is open" target: entity_id: !input setting_reason + - service: timer.start + data: + duration: + seconds: 1 + target: + entity_id: !input echoblock_timer # 2. If the zone has been unoccupied for the set period, turn the heating off - conditions: @@ -488,6 +493,12 @@ action: value: "Turned off because the zone is unoccupied" target: entity_id: !input setting_reason + - service: timer.start + data: + duration: + seconds: 1 + target: + entity_id: !input echoblock_timer # 3. If there is a manual override in operation - conditions: @@ -507,6 +518,12 @@ action: value: "Set manually to {{ set_temperature }}. Time left {{ ( as_timestamp(state_attr(manual_override_timer,'finishes_at'))-as_timestamp(now()) ) | timestamp_custom('%H:%M', False, 0) }}" target: entity_id: !input setting_reason + - service: timer.start + data: + duration: + seconds: 1 + target: + entity_id: !input echoblock_timer # 4.1 If there is an active calendar event with no temperature field - conditions: @@ -538,6 +555,12 @@ action: {{ "Turned off because the calendar event '" + states(event_name) + "' does not specify a temperature." }} target: entity_id: !input setting_reason + - service: timer.start + data: + duration: + seconds: 1 + target: + entity_id: !input echoblock_timer # 4.2 If there is an active calendar event with a temperature field that is not a number - conditions: @@ -569,6 +592,12 @@ action: {{ "Turned off because the calendar event '" + states(event_name) + "' does not specify a valid number for the temperature." }} target: entity_id: !input setting_reason + - service: timer.start + data: + duration: + seconds: 1 + target: + entity_id: !input echoblock_timer # 4.3 If there is an active calendar event with a temperature that is too low - conditions: @@ -600,6 +629,12 @@ action: {{ "Turned off because the calendar event '" + states(event_name) + "' specifies a temperature below the minimum." }} target: entity_id: !input setting_reason + - service: timer.start + data: + duration: + seconds: 1 + target: + entity_id: !input echoblock_timer # 4.4 If there is an active calendar event with a temperature that is too high - conditions: @@ -631,6 +666,12 @@ action: {{ "Turned off because the calendar event '" + states(event_name) + "' specifies a temperature above the maximum." }} target: entity_id: !input setting_reason + - service: timer.start + data: + duration: + seconds: 1 + target: + entity_id: !input echoblock_timer # 4.5 (Else) if there is an active calendar event with a valid temperature - conditions: @@ -661,6 +702,12 @@ action: {{ "Set to " + states(event_temperature) + " by calendar event '" + states(event_name) + "' until " + ( as_timestamp(state_attr(zone_calendar, 'end_time')) ) | timestamp_custom('%a %d %b %Y at %H:%M') + "." }} target: entity_id: !input setting_reason + - service: timer.start + data: + duration: + seconds: 1 + target: + entity_id: !input echoblock_timer # 5. If there is a calendar but no active calendar event - conditions: @@ -693,6 +740,12 @@ action: {% endif %} target: entity_id: !input setting_reason + - service: timer.start + data: + duration: + seconds: 1 + target: + entity_id: !input echoblock_timer #6. If the calendar state becomes unknown - conditions: @@ -710,6 +763,12 @@ action: value: Turned off because the calendar state is unknown target: entity_id: !input setting_reason + - service: timer.start + data: + duration: + seconds: 1 + target: + entity_id: !input echoblock_timer #7. If the calendar becomes unavailable - conditions: @@ -727,27 +786,9 @@ action: value: Turned off because the calendar is unavailable target: entity_id: !input setting_reason - - # Default - should never happen! - default: - - service: climate.set_temperature - data: - temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" - target: - entity_id: !input thermostat_controls - - service: input_text.set_value - data: - value: Turned off by default - target: - entity_id: !input setting_reason - - ## ---------------------------------------------------------------------------- - ## ACTIONS STEP 4 -- ECHO-BLOCK TIMER - ## ---------------------------------------------------------------------------- - - - service: timer.start - data: - duration: - seconds: 20 - target: - entity_id: !input echoblock_timer + - service: timer.start + data: + duration: + seconds: 1 + target: + entity_id: !input echoblock_timer From 9a91f4df1b782fd68ce354fb9e369b05bb9f7afe Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Wed, 26 Apr 2023 21:52:50 +0100 Subject: [PATCH 40/50] I don't think this is possible anymore --- blueprints/heating_x.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 090fe6d..2ae6fca 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -257,9 +257,6 @@ action: - condition: state entity_id: !input echoblock_timer state: idle - # ignore if same value as before (e.g. triggered by template reload) - - condition: template - value_template: "{{ set_temperature != trigger.from_state.attributes.temperature }}" sequence: - service: timer.start data: From 2eb4f67408927df770f4c81de0fca4960e7fc709 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Thu, 27 Apr 2023 20:00:46 +0100 Subject: [PATCH 41/50] Trigger on calendar end events --- blueprints/heating_x.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 2ae6fca..eb16e29 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -176,7 +176,6 @@ variables: trigger: # 1. Calendar event starts or ends - platform: calendar - event: start entity_id: !input zone_calendar id: calendar_event @@ -241,6 +240,9 @@ trigger: from: active id: unoccupancy_timer_end + - platform: time_pattern + minutes: "/1" + ## ---------------------------------------------------------------------------- ## ACTIONS STEP 1 -- SET THE STATE VARİABLES ## ---------------------------------------------------------------------------- From b58fe046baef9aa221c93a5423c4efa176690996 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Thu, 27 Apr 2023 21:39:31 +0100 Subject: [PATCH 42/50] Get stuff working again --- blueprints/heating_x.yaml | 293 ++++++++++++++++++-------------------- 1 file changed, 138 insertions(+), 155 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index eb16e29..c55d018 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -71,6 +71,13 @@ blueprint: entity: domain: input_number + manual_temperature: + name: HELPER - Manual temperature + description: The global variable (helper) to hold the temperature specified by manual control of the device or the dashboard + selector: + entity: + domain: input_number + setting_reason: name: HELPER - Setting reason description: The global variable (helper) into which the automation writes the reason for the current setting (for use on a dashboard) @@ -163,23 +170,31 @@ variables: event_name: !input event_name event_temperature: !input event_temperature frost_setting: !input frost_setting + manual_temperature: !input manual_temperature manual_override_timer: !input manual_override_timer maximum_thermostat_temperature: "{{ thermostat_controls | map('state_attr', 'max_temp') | min }}" minimum_thermostat_temperature: "{{ thermostat_controls | map('state_attr', 'min_temp') | max }}" zone_calendar: !input zone_calendar zone_occupancy_sensors: !input zone_occupancy_sensors + echoblock_duration: 5 ## ---------------------------------------------------------------------------- ## TRIGGERS ## ---------------------------------------------------------------------------- trigger: - # 1. Calendar event starts or ends + # Calendar event starts or ends - platform: calendar + event: start entity_id: !input zone_calendar - id: calendar_event + id: calendar_event_start - # 2. Change in any one of the thermostat set temperatures + - platform: calendar + event: end + entity_id: !input zone_calendar + id: calendar_event_end + + # Change in any one of the thermostat set temperatures - platform: state attribute: temperature entity_id: !input thermostat_controls @@ -187,7 +202,16 @@ trigger: variables: set_temperature: "{{ state_attr(trigger.entity_id, 'temperature') }}" - # 3. End of manual override (timer idle, paused, unknown, or unavailable) + # Manual override starts + - platform: event + event_type: + - timer.started + - timer.restarted + event_data: + entity_id: !input manual_override_timer + id: manual_override_start + + # Manual override ends - platform: event event_type: - timer.finished @@ -196,7 +220,7 @@ trigger: entity_id: !input manual_override_timer id: manual_override_end - # 4. Zone becomes unoccupied: sensor available and off (clear) + # Zone becomes unoccupied: sensor available and off (clear) - platform: state entity_id: !input zone_occupancy_sensors to: "off" @@ -204,7 +228,7 @@ trigger: seconds: 10 id: zone_unoccupied - # 5. Zone becomes occupied: sensor 'detected' (on), 'unknown', or 'unavailable' + # Zone becomes occupied: sensor 'detected' (on), 'unknown', or 'unavailable' - platform: state entity_id: !input zone_occupancy_sensors from: "off" @@ -255,11 +279,16 @@ action: - conditions: - condition: trigger id: set_temperature_change - #ignore if it is just an echo from a setting from this automation + # Ignore if it is just an echo from a setting from this automation - condition: state entity_id: !input echoblock_timer state: idle sequence: + - service: input_number.set_value + data: + value: "{{ set_temperature }}" + target: + entity_id: !input manual_temperature - service: timer.start data: duration: !input manual_override_period @@ -340,16 +369,12 @@ action: - conditions: - condition: or conditions: - - condition: and - conditions: - - condition: trigger - id: calendar_event - - condition: template - value_template: "{{ trigger.event == 'start' }}" + - condition: trigger + id: calendar_event_start # If there is an active event we might as well update the helpers. - condition: state entity_id: !input zone_calendar - state: 'on' + state: "on" sequence: - service: input_text.set_value data: @@ -413,16 +438,12 @@ action: - conditions: - condition: or conditions: - - condition: and - conditions: - - condition: trigger - id: calendar_event - - condition: template - value_template: "{{ trigger.event == 'end' }}" + - condition: trigger + id: calendar_event_end # If there is no active event we might as well update the helpers. - condition: state entity_id: !input zone_calendar - state: 'off' + state: "off" sequence: - service: input_text.set_value data: @@ -441,7 +462,7 @@ action: entity_id: !input event_end - service: input_number.set_value data: - value: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" + value: -5 # unset temperature target: entity_id: !input event_temperature @@ -467,10 +488,11 @@ action: value: "Turned off because a door or window is open" target: entity_id: !input setting_reason + # Echoblock to avoid setting the temperature to trigger a manual override - service: timer.start data: duration: - seconds: 1 + seconds: "{{ echoblock_duration }}" target: entity_id: !input echoblock_timer @@ -492,56 +514,35 @@ action: value: "Turned off because the zone is unoccupied" target: entity_id: !input setting_reason + # Echoblock to avoid setting the temperature to trigger a manual override - service: timer.start data: duration: - seconds: 1 + seconds: "{{ echoblock_duration }}" target: entity_id: !input echoblock_timer # 3. If there is a manual override in operation - conditions: - condition: trigger - id: set_temperature_change - - condition: state - entity_id: !input manual_override_timer - state: active + id: manual_override_start sequence: - service: climate.set_temperature data: - temperature: "{{ set_temperature }}" + temperature: "{{ states(manual_temperature) }}" target: entity_id: !input thermostat_controls - service: input_text.set_value data: - value: "Set manually to {{ set_temperature }}. Time left {{ ( as_timestamp(state_attr(manual_override_timer,'finishes_at'))-as_timestamp(now()) ) | timestamp_custom('%H:%M', False, 0) }}" + value: "Set manually to {{ states(manual_temperature) }}. Finishes at {{ as_timestamp(state_attr(manual_override_timer,'finishes_at')) | timestamp_custom('%H:%M') }}." target: entity_id: !input setting_reason - - service: timer.start - data: - duration: - seconds: 1 - target: - entity_id: !input echoblock_timer - # 4.1 If there is an active calendar event with no temperature field + # 4. If the calendar state becomes unknown - conditions: - - condition: or - conditions: - # Triggered by the calendar event starting. - - condition: and - conditions: - - condition: trigger - id: calendar_event - - condition: template - value_template: "{{ trigger.event == 'start' }}" - # Triggered by the manual override ending. - - condition: trigger - id: manual_override_end - # The calendar event has no temperature field. - - condition: template - value_template: >- - {{ states(event_temperature) | float == -4 }} + - condition: state + entity_id: !input zone_calendar + state: unknown sequence: - service: climate.set_temperature data: @@ -550,35 +551,22 @@ action: entity_id: !input thermostat_controls - service: input_text.set_value data: - value: >- - {{ "Turned off because the calendar event '" + states(event_name) + "' does not specify a temperature." }} + value: Turned off because the calendar state is unknown target: entity_id: !input setting_reason + # Echoblock to avoid setting the temperature to trigger a manual override - service: timer.start data: duration: - seconds: 1 + seconds: "{{ echoblock_duration }}" target: entity_id: !input echoblock_timer - # 4.2 If there is an active calendar event with a temperature field that is not a number + # 5. If the calendar becomes unavailable - conditions: - - condition: or - conditions: - # Triggered by the calendar event starting. - - condition: and - conditions: - - condition: trigger - id: calendar_event - - condition: template - value_template: "{{ trigger.event == 'start' }}" - # Triggered by the manual override ending. - - condition: trigger - id: manual_override_end - # The calendar event has no temperature field. - - condition: template - value_template: >- - {{ states(event_temperature) | float == -3 }} + - condition: state + entity_id: !input zone_calendar + state: unavailable sequence: - service: climate.set_temperature data: @@ -587,35 +575,26 @@ action: entity_id: !input thermostat_controls - service: input_text.set_value data: - value: >- - {{ "Turned off because the calendar event '" + states(event_name) + "' does not specify a valid number for the temperature." }} + value: Turned off because the calendar is unavailable target: entity_id: !input setting_reason + # Echoblock to avoid setting the temperature to trigger a manual override - service: timer.start data: duration: - seconds: 1 + seconds: "{{ echoblock_duration }}" target: entity_id: !input echoblock_timer - # 4.3 If there is an active calendar event with a temperature that is too low + # 6.1 If there is a calendar but no active calendar event (unset temperature) - conditions: - - condition: or - conditions: - # Triggered by the calendar event starting. - - condition: and - conditions: - - condition: trigger - id: calendar_event - - condition: template - value_template: "{{ trigger.event == 'start' }}" - # Triggered by the manual override ending. - - condition: trigger - id: manual_override_end - # The calendar event has no temperature field. + - condition: trigger + id: + - calendar_event_end + - manual_override_end - condition: template value_template: >- - {{ states(event_temperature) | float == -2 }} + {{ states(event_temperature) | float == -5 }} sequence: - service: climate.set_temperature data: @@ -625,34 +604,32 @@ action: - service: input_text.set_value data: value: >- - {{ "Turned off because the calendar event '" + states(event_name) + "' specifies a temperature below the minimum." }} + {{ "Turned off because nothing is scheduled."}} + {% if state_attr(zone_calendar, 'message') %} + {{ "The next event is '" + state_attr(zone_calendar, 'message') + "' " + ( as_timestamp(state_attr(zone_calendar, 'start_time')) ) | timestamp_custom('on %a %d %b %Y at %H:%M')}} + {% else %} + {{ "There are no future events." }} + {% endif %} target: entity_id: !input setting_reason + # Echoblock to avoid setting the temperature to trigger a manual override - service: timer.start data: duration: - seconds: 1 + seconds: "{{ echoblock_duration }}" target: entity_id: !input echoblock_timer - # 4.4 If there is an active calendar event with a temperature that is too high + # 6.2 If there is an active calendar event with no temperature field - conditions: - - condition: or - conditions: - # Triggered by the calendar event starting. - - condition: and - conditions: - - condition: trigger - id: calendar_event - - condition: template - value_template: "{{ trigger.event == 'start' }}" - # Triggered by the manual override ending. - - condition: trigger - id: manual_override_end + - condition: trigger + id: + - calendar_event_start + - manual_override_end # The calendar event has no temperature field. - condition: template value_template: >- - {{ states(event_temperature) | float == -1 }} + {{ states(event_temperature) | float == -4 }} sequence: - service: climate.set_temperature data: @@ -662,66 +639,64 @@ action: - service: input_text.set_value data: value: >- - {{ "Turned off because the calendar event '" + states(event_name) + "' specifies a temperature above the maximum." }} + {{ "Turned off because the calendar event '" + states(event_name) + "' does not specify a temperature." }} target: entity_id: !input setting_reason + # Echoblock to avoid setting the temperature to trigger a manual override - service: timer.start data: duration: - seconds: 1 + seconds: "{{ echoblock_duration }}" target: entity_id: !input echoblock_timer - # 4.5 (Else) if there is an active calendar event with a valid temperature + # 6.3 If there is an active calendar event with a temperature field that is not a number - conditions: - - condition: or - conditions: - # Triggered by the calendar event starting. - - condition: and - conditions: - - condition: trigger - id: calendar_event - - condition: template - value_template: "{{ trigger.event == 'start' }}" - # Triggered by the manual override ending. - - condition: trigger - id: manual_override_end - # The calendar event has no temperature field. + - condition: trigger + id: + - calendar_event_start + - manual_override_end - condition: template - value_template: "{{ trigger.event == 'start' }}" + value_template: >- + {{ states(event_temperature) | float == -3 }} sequence: - service: climate.set_temperature data: - temperature: "{{ states(event_temperature) }}" + temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" target: entity_id: !input thermostat_controls - service: input_text.set_value data: value: >- - {{ "Set to " + states(event_temperature) + " by calendar event '" + states(event_name) + "' until " + ( as_timestamp(state_attr(zone_calendar, 'end_time')) ) | timestamp_custom('%a %d %b %Y at %H:%M') + "." }} + {{ "Turned off because the calendar event '" + states(event_name) + "' does not specify a valid number for the temperature." }} target: entity_id: !input setting_reason + # Echoblock to avoid setting the temperature to trigger a manual override - service: timer.start data: duration: - seconds: 1 + seconds: "{{ echoblock_duration }}" target: entity_id: !input echoblock_timer - # 5. If there is a calendar but no active calendar event + # 6.4 If there is an active calendar event with a temperature that is too low - conditions: - condition: or conditions: - # Triggered by the calendar event starting. + - condition: trigger + id: + - calendar_event_start - condition: and conditions: - condition: trigger - id: calendar_event - - condition: template - value_template: "{{ trigger.event == 'end' }}" - # Triggered by the manual override ending. - - condition: trigger - id: manual_override_end + id: + - manual_override_end + - condition: state + entity_id: !input zone_calendar + state: "on" + - condition: template + value_template: >- + {{ states(event_temperature) | float == -2 }} sequence: - service: climate.set_temperature data: @@ -731,26 +706,26 @@ action: - service: input_text.set_value data: value: >- - {{ "Turned off because nothing is scheduled."}} - {% if state_attr(zone_calendar, 'message') %} - {{ "The next event is '" + state_attr(zone_calendar, 'message') + "' " + ( as_timestamp(state_attr(zone_calendar, 'start_time')) ) | timestamp_custom('on %a %d %b %Y at %H:%M')}} - {% else %} - {{ "There are no future events." }} - {% endif %} + {{ "Turned off because the calendar event '" + states(event_name) + "' specifies a temperature below the minimum." }} target: entity_id: !input setting_reason + # Echoblock to avoid setting the temperature to trigger a manual override - service: timer.start data: duration: - seconds: 1 + seconds: "{{ echoblock_duration }}" target: entity_id: !input echoblock_timer - #6. If the calendar state becomes unknown + # 6.5 If there is an active calendar event with a temperature that is too high - conditions: - - condition: state - entity_id: !input zone_calendar - state: unknown + - condition: trigger + id: + - calendar_event_start + - manual_override_end + - condition: template + value_template: >- + {{ states(event_temperature) | float == -1 }} sequence: - service: climate.set_temperature data: @@ -759,35 +734,43 @@ action: entity_id: !input thermostat_controls - service: input_text.set_value data: - value: Turned off because the calendar state is unknown + value: >- + {{ "Turned off because the calendar event '" + states(event_name) + "' specifies a temperature above the maximum." }} target: entity_id: !input setting_reason + # Echoblock to avoid setting the temperature to trigger a manual override - service: timer.start data: duration: - seconds: 1 + seconds: "{{ echoblock_duration }}" target: entity_id: !input echoblock_timer - #7. If the calendar becomes unavailable + # 6.6 (Else) if there is an active calendar event with a valid temperature - conditions: - - condition: state - entity_id: !input zone_calendar - state: unavailable + - condition: trigger + id: + - calendar_event_start + - manual_override_end + - condition: template + value_template: >- + {{ states(event_temperature) | float >= 0 }} sequence: - service: climate.set_temperature data: - temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" + temperature: "{{ states(event_temperature) }}" target: entity_id: !input thermostat_controls - service: input_text.set_value data: - value: Turned off because the calendar is unavailable + value: >- + {{ "Set to " + states(event_temperature) + " by calendar event '" + states(event_name) + "' until " + ( as_timestamp(state_attr(zone_calendar, 'end_time')) ) | timestamp_custom('%a %d %b %Y at %H:%M') + "." }} target: entity_id: !input setting_reason + # Echoblock to avoid setting the temperature to trigger a manual override - service: timer.start data: duration: - seconds: 1 + seconds: "{{ echoblock_duration }}" target: entity_id: !input echoblock_timer From 09637940bd55dc27c38c8bbd0624b6644151cbe9 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Thu, 27 Apr 2023 21:41:23 +0100 Subject: [PATCH 43/50] Remove time pattern trigger --- blueprints/heating_x.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index c55d018..078c3ee 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -264,9 +264,6 @@ trigger: from: active id: unoccupancy_timer_end - - platform: time_pattern - minutes: "/1" - ## ---------------------------------------------------------------------------- ## ACTIONS STEP 1 -- SET THE STATE VARİABLES ## ---------------------------------------------------------------------------- From f320af8e138ee6240fad73b5c6f15997be334f88 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:13:34 +0100 Subject: [PATCH 44/50] Improve triggers --- blueprints/heating_x.yaml | 98 ++++++++++++++++++++++++--------------- 1 file changed, 61 insertions(+), 37 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 078c3ee..2b681bb 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -183,17 +183,30 @@ variables: ## ---------------------------------------------------------------------------- trigger: - # Calendar event starts or ends + # Calendar event starts - platform: calendar event: start entity_id: !input zone_calendar id: calendar_event_start + # Calendar event ends - platform: calendar event: end entity_id: !input zone_calendar id: calendar_event_end + # Calendar becomes unknown + - platform: state + entity_id: !input zone_calendar + to: "unknown" + id: calendar_unknown + + # Calendar becomes unavailable + - platform: state + entity_id: !input zone_calendar + to: "unavailable" + id: calendar_unavailable + # Change in any one of the thermostat set temperatures - platform: state attribute: temperature @@ -236,7 +249,7 @@ trigger: seconds: 10 id: zone_occupied - # 6. A door or window is opened + # A door or window is opened - platform: state entity_id: !input door_or_window_open_sensors to: "on" @@ -244,7 +257,7 @@ trigger: seconds: 10 id: door_or_window_opened - # 7. A doors or windows is closed, or becomes 'unknown' or 'unavailable' + # A doors or windows is closed, or becomes 'unknown' or 'unavailable' - platform: state entity_id: !input door_or_window_open_sensors from: "on" @@ -252,16 +265,18 @@ trigger: seconds: 10 id: doors_and_windows_closed - # 8. Door or window open timer finished (time to turn off the heating) - - platform: state - entity_id: !input door_or_window_open_timer - from: active + # Door or window open timer finished (time to turn off the heating) + - platform: event + event_type: timer.finished + event_data: + entity_id: !input door_or_window_open_timer id: door_or_window_open_timer_end - # 9. Unoccupancy timer finished (time to turn off the heating) - - platform: state - entity_id: !input unoccupancy_timer - from: active + # Unoccupancy timer finished (time to turn off the heating) + - platform: event + event_type: timer.finished + event_data: + entity_id: !input unoccupancy_timer id: unoccupancy_timer_end ## ---------------------------------------------------------------------------- @@ -316,12 +331,7 @@ action: - condition: trigger id: doors_and_windows_closed sequence: - - service: timer.start - data: - duration: !input door_or_window_open_period - target: - entity_id: !input door_or_window_open_timer - - service: timer.pause # Keeps it in the active state + - service: timer.cancel target: entity_id: !input door_or_window_open_timer # @@ -349,12 +359,7 @@ action: - condition: trigger id: zone_occupied sequence: - - service: timer.start - data: - duration: !input unoccupancy_period - target: - entity_id: !input unoccupancy_timer - - service: timer.pause # Put it in the paused state + - service: timer.cancel target: entity_id: !input unoccupancy_timer @@ -469,9 +474,8 @@ action: - choose: # 1. If a door or window has been open for the set period, turn the heating off - conditions: - - condition: state - entity_id: !input door_or_window_open_timer - state: idle + - condition: trigger + id: door_or_window_open_timer_end - condition: template value_template: "{{ door_or_window_open_sensors | select ('is_state', 'on') | list | count > 0 }}" sequence: @@ -495,9 +499,8 @@ action: # 2. If the zone has been unoccupied for the set period, turn the heating off - conditions: - - condition: state - entity_id: !input unoccupancy_timer - state: idle + - condition: trigger + id: unoccupancy_timer_end - condition: template value_template: "{{ zone_occupancy_sensors | reject ('is_state', [ 'unknown', 'unavailable' ] ) | select ('is_state', 'on') | list | count > 0 }}" sequence: @@ -521,8 +524,19 @@ action: # 3. If there is a manual override in operation - conditions: - - condition: trigger - id: manual_override_start + - condition: or + conditions: + - condition: trigger + id: manual_override_start + - condition: and + conditions: + - condition: trigger + id: + - doors_and_windows_closed + - zone_occupied + - condition: state + entity_id: !input manual_override_timer + state: active sequence: - service: climate.set_temperature data: @@ -537,9 +551,8 @@ action: # 4. If the calendar state becomes unknown - conditions: - - condition: state - entity_id: !input zone_calendar - state: unknown + - condition: trigger + id: calendar_state_unknown sequence: - service: climate.set_temperature data: @@ -561,9 +574,8 @@ action: # 5. If the calendar becomes unavailable - conditions: - - condition: state - entity_id: !input zone_calendar - state: unavailable + - condition: trigger + id: calendar_unavailable sequence: - service: climate.set_temperature data: @@ -589,6 +601,8 @@ action: id: - calendar_event_end - manual_override_end + - doors_and_windows_closed + - zone_occupied - condition: template value_template: >- {{ states(event_temperature) | float == -5 }} @@ -623,6 +637,8 @@ action: id: - calendar_event_start - manual_override_end + - doors_and_windows_closed + - zone_occupied # The calendar event has no temperature field. - condition: template value_template: >- @@ -653,6 +669,8 @@ action: id: - calendar_event_start - manual_override_end + - doors_and_windows_closed + - zone_occupied - condition: template value_template: >- {{ states(event_temperature) | float == -3 }} @@ -688,6 +706,8 @@ action: - condition: trigger id: - manual_override_end + - doors_and_windows_closed + - zone_occupied - condition: state entity_id: !input zone_calendar state: "on" @@ -720,6 +740,8 @@ action: id: - calendar_event_start - manual_override_end + - doors_and_windows_closed + - zone_occupied - condition: template value_template: >- {{ states(event_temperature) | float == -1 }} @@ -749,6 +771,8 @@ action: id: - calendar_event_start - manual_override_end + - doors_and_windows_closed + - zone_occupied - condition: template value_template: >- {{ states(event_temperature) | float >= 0 }} From 42a6eeb6386ca513ef3a34c2a69eb305ccab6570 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:16:01 +0100 Subject: [PATCH 45/50] Only update event variables on calendar events --- blueprints/heating_x.yaml | 47 +++++++-------------------------------- 1 file changed, 8 insertions(+), 39 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 2b681bb..e2ca356 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -369,54 +369,29 @@ action: - choose: - conditions: - - condition: or - conditions: - - condition: trigger - id: calendar_event_start - # If there is an active event we might as well update the helpers. - - condition: state - entity_id: !input zone_calendar - state: "on" + - condition: trigger + id: calendar_event_start sequence: - service: input_text.set_value data: - value: >- - {% if trigger.platform == 'calendar' %} - {{ trigger.calendar_event.summary }} - {% else %} - {{ state_attr(zone_calendar, 'message') }} - {% endif %} + value: "{{ trigger.calendar_event.summary }}" target: entity_id: !input event_name - service: input_datetime.set_datetime data: - datetime: >- - {% if trigger.platform == 'calendar' %} - {{ trigger.calendar_event.start }} - {% else %} - {{ state_attr(zone_calendar, 'start_time') }} - {% endif %} + datetime: "{{ trigger.calendar_event.start }}" target: entity_id: !input event_start - service: input_datetime.set_datetime data: - datetime: >- - {% if trigger.platform == 'calendar' %} - {{ trigger.calendar_event.end }} - {% else %} - {{ state_attr(zone_calendar, 'end_time') }} - {% endif %} + datetime: "{{ trigger.calendar_event.end }}" target: entity_id: !input event_end - service: input_number.set_value data: value: >- {# copy description field #} - {% if trigger.platform == 'calendar' %} - {% set description = trigger.calendar_event.description %} - {% else %} - {% set description = state_attr(zone_calendar, 'description') %} - {% endif %} + {% set description = trigger.calendar_event.description %} {% if description.split('#') | count < 3 %} {% set temperature_error_code = -4 %} {# no number field #} @@ -438,14 +413,8 @@ action: target: entity_id: !input event_temperature - conditions: - - condition: or - conditions: - - condition: trigger - id: calendar_event_end - # If there is no active event we might as well update the helpers. - - condition: state - entity_id: !input zone_calendar - state: "off" + - condition: trigger + id: calendar_event_end sequence: - service: input_text.set_value data: From 32960f13da207edfe94282b7f5ece74f217c7d8d Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Fri, 28 Apr 2023 09:16:09 +0100 Subject: [PATCH 46/50] Clean up comments --- blueprints/heating_x.yaml | 42 ++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index e2ca356..078851b 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -1,7 +1,11 @@ blueprint: name: "Heating X" - description: Controls one or more thermostats from a calendar, allows temporary manual override, and optionally turns off thermostat if a door or window is opened, or if the zone is unoccupied for a while. + description: >- + Controls one or more thermostats from a calendar, + allows temporary manual override, and optionally turns off thermostat + if a door or window is opened, or if the zone is unoccupied for a while. domain: automation + mode: queued # Use all triggers but avoid conflicting states ### ---------------------------------------------------------------------------- ### INPUTS @@ -157,8 +161,6 @@ blueprint: time: default: "01:00:00" -mode: queued # use all triggers but avoid conflicting states - ## ---------------------------------------------------------------------------- ## LOCAL VARIABLES ## needed to capture global variable values for use in templates @@ -286,7 +288,7 @@ trigger: action: - choose: # - # a. Manual override start + # Manual override start # - conditions: - condition: trigger @@ -307,7 +309,7 @@ action: target: entity_id: !input manual_override_timer # - # c. Door or window opened - start timer + # Door or window opened - start timer # - conditions: - condition: trigger @@ -325,7 +327,7 @@ action: target: entity_id: !input door_or_window_open_timer # - # d. Doors and windows closed - restart and pause timer + # Doors and windows closed - restart and pause timer # - conditions: - condition: trigger @@ -335,7 +337,7 @@ action: target: entity_id: !input door_or_window_open_timer # - # e. Unoccupancy - start timer + # Unoccupancy - start timer # - conditions: - condition: trigger @@ -353,7 +355,7 @@ action: target: entity_id: !input unoccupancy_timer # - # f. Zone occupied - restart and pause timer + # Zone occupied - restart and pause timer # - conditions: - condition: trigger @@ -364,7 +366,7 @@ action: entity_id: !input unoccupancy_timer ## ---------------------------------------------------------------------------- - ## ACTIONS STEP 2 -- REFRESH THE CALENDAR EVENT HELPERS (IF NEEDED) + ## ACTIONS STEP 2 -- REFRESH THE CALENDAR EVENT HELPERS ON CALENDAR EVENT ## ---------------------------------------------------------------------------- - choose: @@ -441,7 +443,7 @@ action: ## ACTIONS STEP 3 -- DETERMINE THE REQUIRED TEMPERATURE AND THE REASON ## ---------------------------------------------------------------------------- - choose: - # 1. If a door or window has been open for the set period, turn the heating off + # If a door or window has been open for the set period, turn the heating off - conditions: - condition: trigger id: door_or_window_open_timer_end @@ -466,7 +468,7 @@ action: target: entity_id: !input echoblock_timer - # 2. If the zone has been unoccupied for the set period, turn the heating off + # If the zone has been unoccupied for the set period, turn the heating off - conditions: - condition: trigger id: unoccupancy_timer_end @@ -491,7 +493,7 @@ action: target: entity_id: !input echoblock_timer - # 3. If there is a manual override in operation + # If there is a manual override in operation - conditions: - condition: or conditions: @@ -518,7 +520,7 @@ action: target: entity_id: !input setting_reason - # 4. If the calendar state becomes unknown + # If the calendar state becomes unknown - conditions: - condition: trigger id: calendar_state_unknown @@ -541,7 +543,7 @@ action: target: entity_id: !input echoblock_timer - # 5. If the calendar becomes unavailable + # If the calendar becomes unavailable - conditions: - condition: trigger id: calendar_unavailable @@ -564,7 +566,7 @@ action: target: entity_id: !input echoblock_timer - # 6.1 If there is a calendar but no active calendar event (unset temperature) + # If there is a calendar but no active calendar event (unset temperature) - conditions: - condition: trigger id: @@ -600,7 +602,7 @@ action: target: entity_id: !input echoblock_timer - # 6.2 If there is an active calendar event with no temperature field + # If there is an active calendar event with no temperature field - conditions: - condition: trigger id: @@ -632,7 +634,7 @@ action: target: entity_id: !input echoblock_timer - # 6.3 If there is an active calendar event with a temperature field that is not a number + # If there is an active calendar event with a temperature field that is not a number - conditions: - condition: trigger id: @@ -663,7 +665,7 @@ action: target: entity_id: !input echoblock_timer - # 6.4 If there is an active calendar event with a temperature that is too low + # If there is an active calendar event with a temperature that is too low - conditions: - condition: or conditions: @@ -703,7 +705,7 @@ action: target: entity_id: !input echoblock_timer - # 6.5 If there is an active calendar event with a temperature that is too high + # If there is an active calendar event with a temperature that is too high - conditions: - condition: trigger id: @@ -734,7 +736,7 @@ action: target: entity_id: !input echoblock_timer - # 6.6 (Else) if there is an active calendar event with a valid temperature + # If there is an active calendar event with a valid temperature - conditions: - condition: trigger id: From b193aef7c07773d7d784f1743a6351362120cb88 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Fri, 28 Apr 2023 09:19:27 +0100 Subject: [PATCH 47/50] Move `mode` back --- blueprints/heating_x.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 078851b..6b6b322 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -5,7 +5,6 @@ blueprint: allows temporary manual override, and optionally turns off thermostat if a door or window is opened, or if the zone is unoccupied for a while. domain: automation - mode: queued # Use all triggers but avoid conflicting states ### ---------------------------------------------------------------------------- ### INPUTS @@ -161,6 +160,8 @@ blueprint: time: default: "01:00:00" +mode: queued # Use all triggers but avoid conflicting states + ## ---------------------------------------------------------------------------- ## LOCAL VARIABLES ## needed to capture global variable values for use in templates From 8343243d0487256932f7e6f8e39ea8fbd74b783d Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Fri, 28 Apr 2023 09:22:49 +0100 Subject: [PATCH 48/50] Add `off_temperature` variable --- blueprints/heating_x.yaml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 6b6b322..521b39f 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -177,6 +177,7 @@ variables: manual_override_timer: !input manual_override_timer maximum_thermostat_temperature: "{{ thermostat_controls | map('state_attr', 'max_temp') | min }}" minimum_thermostat_temperature: "{{ thermostat_controls | map('state_attr', 'min_temp') | max }}" + off_temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" zone_calendar: !input zone_calendar zone_occupancy_sensors: !input zone_occupancy_sensors echoblock_duration: 5 @@ -453,7 +454,7 @@ action: sequence: - service: climate.set_temperature data: - temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" + temperature: "{{ off_temperature }}" target: entity_id: !input thermostat_controls - service: input_text.set_value @@ -528,7 +529,7 @@ action: sequence: - service: climate.set_temperature data: - temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" + temperature: "{{ off_temperature }}" target: entity_id: !input thermostat_controls - service: input_text.set_value @@ -551,7 +552,7 @@ action: sequence: - service: climate.set_temperature data: - temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" + temperature: "{{ off_temperature }}" target: entity_id: !input thermostat_controls - service: input_text.set_value @@ -581,7 +582,7 @@ action: sequence: - service: climate.set_temperature data: - temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" + temperature: "{{ off_temperature }}" target: entity_id: !input thermostat_controls - service: input_text.set_value @@ -618,7 +619,7 @@ action: sequence: - service: climate.set_temperature data: - temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" + temperature: "{{ off_temperature }}" target: entity_id: !input thermostat_controls - service: input_text.set_value @@ -649,7 +650,7 @@ action: sequence: - service: climate.set_temperature data: - temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" + temperature: "{{ off_temperature }}" target: entity_id: !input thermostat_controls - service: input_text.set_value @@ -689,7 +690,7 @@ action: sequence: - service: climate.set_temperature data: - temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" + temperature: "{{ off_temperature }}" target: entity_id: !input thermostat_controls - service: input_text.set_value @@ -720,7 +721,7 @@ action: sequence: - service: climate.set_temperature data: - temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" + temperature: "{{ off_temperature }}" target: entity_id: !input thermostat_controls - service: input_text.set_value From 18f0bece3981a2ba47ed656d495dbbe3ec8e41b4 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Fri, 28 Apr 2023 09:24:45 +0100 Subject: [PATCH 49/50] Separate types of variable --- blueprints/heating_x.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/blueprints/heating_x.yaml b/blueprints/heating_x.yaml index 521b39f..2785d24 100644 --- a/blueprints/heating_x.yaml +++ b/blueprints/heating_x.yaml @@ -164,10 +164,10 @@ mode: queued # Use all triggers but avoid conflicting states ## ---------------------------------------------------------------------------- ## LOCAL VARIABLES -## needed to capture global variable values for use in templates ## ---------------------------------------------------------------------------- variables: + # Input variables needed to capture global variable values for use in templates. thermostat_controls: !input thermostat_controls door_or_window_open_sensors: !input door_or_window_open_sensors event_name: !input event_name @@ -175,12 +175,13 @@ variables: frost_setting: !input frost_setting manual_temperature: !input manual_temperature manual_override_timer: !input manual_override_timer - maximum_thermostat_temperature: "{{ thermostat_controls | map('state_attr', 'max_temp') | min }}" - minimum_thermostat_temperature: "{{ thermostat_controls | map('state_attr', 'min_temp') | max }}" - off_temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" zone_calendar: !input zone_calendar zone_occupancy_sensors: !input zone_occupancy_sensors + # Reusable variables. echoblock_duration: 5 + maximum_thermostat_temperature: "{{ thermostat_controls | map('state_attr', 'max_temp') | min }}" + minimum_thermostat_temperature: "{{ thermostat_controls | map('state_attr', 'min_temp') | max }}" + off_temperature: "{{ [frost_setting, minimum_thermostat_temperature] | max }}" ## ---------------------------------------------------------------------------- ## TRIGGERS From 75a8e80c594aeba7f7b491fffb30b72b566dec60 Mon Sep 17 00:00:00 2001 From: Judah Rand <17158624+judahrand@users.noreply.github.com> Date: Tue, 16 May 2023 10:59:08 +0100 Subject: [PATCH 50/50] Remove unused sensors --- templates/templates.yaml.jinja | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 templates/templates.yaml.jinja diff --git a/templates/templates.yaml.jinja b/templates/templates.yaml.jinja deleted file mode 100644 index ae87e68..0000000 --- a/templates/templates.yaml.jinja +++ /dev/null @@ -1,19 +0,0 @@ -{% for zone in config.zones %} -### {{ zone.heating_zone_friendly_name }} -- sensor: - - name: {{ zone.heating_zone_entity_name }}_target_temperature - unique_id: "{{ zone.target_temperature_unique_id or generate_uuid() }}" - unit_of_measurement: 'C' - icon: mdi:thermometer - state: "{% raw %}{{{% endraw %} state_attr('climate.{{ zone.thermostat_entity_name }}', 'temperature') {% raw %}}}{% endraw %}" - -- sensor: - - name: {{ zone.heating_zone_entity_name }}_current_temperature - unique_id: "{{ zone.current_temperature_unique_id or generate_uuid() }}" - unit_of_measurement: 'C' - icon: mdi:thermometer - state: "{% raw %}{{{% endraw %} state_attr('climate.{{ zone.thermostat_entity_name }}', 'current_temperature') {% raw %}}}{% endraw %}" -{% if not loop.last %} - -{% endif %} -{% endfor -%}