Skip to content

Instantly share code, notes, and snippets.

@pavax
Last active March 24, 2025 11:14
Show Gist options
  • Save pavax/8d6ed250765d89cb281d4a1762b8d2e8 to your computer and use it in GitHub Desktop.
Save pavax/8d6ed250765d89cb281d4a1762b8d2e8 to your computer and use it in GitHub Desktop.
z2m_aqara_trv_external_temperature.yaml
blueprint:
name: Aqara TRV E1 External Temperature Control
description: >
This automation allows the Aqara TRV E1 Smart Radiator Thermostat to use temperature readings from an external sensor rather than its internal sensor. Whenever the temperature sensor reports a new value, it is sent to the TRV for more accurate climate control.
domain: automation
source_url: "https://gist.github.com/pavax/8d6ed250765d89cb281d4a1762b8d2e8"
input:
external_temp_sensor:
name: External Temperature Sensor
description: Select the temperature sensor that will provide temperature readings to the Aqara TRV.
selector:
entity:
filter:
domain: sensor
device_class:
- temperature
aqara_trv_device:
name: Aqara TRV Device
description: Select the Aqara Smart Radiator Thermostat E1 that will receive the external temperature data.
selector:
device:
multiple: false
filter:
- integration: mqtt
manufacturer: Aqara
model: Smart radiator thermostat E1 (SRTS-A01)
- integration: mqtt
manufacturer: Aqara
model: Smart radiator thermostat E1
- integration: mqtt
manufacturer: Aqara
model: Aqara Smart Radiator thermostat E1 (SRTS-A01)
- integration: mqtt
manufacturer: Aqara
model: Aqara smart radiator thermostat E1 (SRTS-A01)
external_temperature_input_name:
name: TRV's Input Sensor Name
description: Enter a keyword or name used to identify the TRV’s number sensor entity-id, which sets the external temperature value. Defaults to 'external'.
selector:
text:
default: "external"
mode: single
max_exceeded: silent
variables:
aqara_trv_device: !input aqara_trv_device
external_temp_sensor: !input external_temp_sensor
external_temperature_input_name: !input external_temperature_input_name
trigger:
- trigger: state
entity_id: !input external_temp_sensor
action:
- variables:
aqara_trv_device_name: "{{ device_attr(aqara_trv_device, 'name') }}"
aqara_trv_select_entity: >-
{% set device_entities = device_entities(aqara_trv_device) %}
{{ expand(states['select'])
| selectattr('entity_id','in', device_entities)
| selectattr('attributes.options', 'contains', 'external')
| map(attribute='entity_id')
| first
}}
aqara_trv_number_entity: >-
{% set device_entities = device_entities(aqara_trv_device) %}
{{ expand(states['number'])
| selectattr('entity_id','in', device_entities)
| selectattr('entity_id', 'contains', external_temperature_input_name)
| map(attribute='entity_id')
| first
}}
- if:
- condition: template
value_template: >-
{{ is_state(external_temp_sensor, "unavailable") or is_state(external_temp_sensor, "unknown") }}
then:
- action: select.select_option
target:
entity_id: "{{aqara_trv_select_entity}}"
data:
option: internal
- action: system_log.write
data:
level: error
message: External temperature sensor unavailable
logger: Aqara TRV
- stop: External temperature sensor unavailable
- if:
- condition: template
value_template: "{{ not is_state(aqara_trv_select_entity, 'external')}}"
then:
- action: select.select_option
target:
entity_id: "{{aqara_trv_select_entity}}"
data:
option: external
- delay:
hours: 0
minutes: 0
seconds: 10
milliseconds: 0
- action: number.set_value
data:
value: >-
{{ (states(external_temp_sensor)|float(0)|round(1)) }}
target:
entity_id: "{{aqara_trv_number_entity}}"
@adamkorski
Copy link

@adamkorski yes

do I have to do two automations or can I add two thermostats in one?

@Riemi001
Copy link

Riemi001 commented Jan 7, 2025

I updated ha and the blueprint to the newest version. When i add a new device, no Aquara TRV devices are in the list.

@Riemi001 Can you try it again. In the newest version it looks like the model string changed. I updated the blueprint

Thanks, it's working again now

@Oniicode
Copy link

I'd like to point out a fatal flaw with this blueprint, especially for people living in countries where heating is seriously expensive:
What happens if the external temperature sensor fails, and its state becomes unavailable or unknown?

In my observation, unavailable or unknown turns into 0 when cast/converted to float using {{ (states(external_temp_sensor)|float(0)|round(1)) }}.
The TRV receives that 0 value, thinks its super cold and opens the valve to 100%, and it stays that way until fixed manually. That actually happened to me while I was out on vacation. That did hurt in my wallet.

Here's a way to fix it. By falling back to the TRV's internal sensor when the external one fails.

actions:
  - variables:
    # ...
  - if:
      - condition: template
        value_template: >-
          {{ is_state(external_temp_sensor, "unavailable") or is_state(external_temp_sensor, "unknown") }}
    then:
      - action: select.select_option
        target:
          entity_id: "{{aqara_trv_select_entity}}"
        data:
          option: internal
      - stop: Temperature sensor failed.
    # ...

@pavax
Copy link
Author

pavax commented Mar 24, 2025

I'd like to point out a fatal flaw with this blueprint, especially for people living in countries where heating is seriously expensive: What happens if the external temperature sensor fails, and its state becomes unavailable or unknown?

In my observation, unavailable or unknown turns into 0 when cast/converted to float using {{ (states(external_temp_sensor)|float(0)|round(1)) }}. The TRV receives that 0 value, thinks its super cold and opens the valve to 100%, and it stays that way until fixed manually. That actually happened to me while I was out on vacation. That did hurt in my wallet.

Here's a way to fix it. By falling back to the TRV's internal sensor when the external one fails.

actions:
  - variables:
    # ...
  - if:
      - condition: template
        value_template: >-
          {{ is_state(external_temp_sensor, "unavailable") or is_state(external_temp_sensor, "unknown") }}
    then:
      - action: select.select_option
        target:
          entity_id: "{{aqara_trv_select_entity}}"
        data:
          option: internal
      - stop: Temperature sensor failed.
    # ...

Thanks for pointing out this flaw- I updated the script.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment