Automating Radiator Valves (TRV) with a boiler and Hive thermostat

I’ve just purchased the below Zigee TRV’s (Rebranded Tuya/Moes HY367) - Tuya Thermostatic Radiator Valve Controller (HY367) Zigbee compatibility

Link to TRV: https://www.amazon.co.uk/Sandy-Beach-Thermostat-Connecting-Additional/dp/B093B4SCBT

At the price of £26 each I thought it’s worth a go.

I already have the Hive active heating thermostat integrated in to my Home Assistant and have a simple automation to set the temp higher at 07:30 and then lower at 21:30 respectively. This works fine, and it uses its own thermostat (in the living room) to determine whether it needs to send a signal to the boiler to turn on the heating.

I previously had a manual TRV on each of the 5 radiators in my house. These have now been swapped out for the HY367 model listed above. They all paired with the ZHA integration and I can manually adjust/turn on/set each one individually.

The problem lies with how to automate this together with the Hive thermostat.

I want a pretty basic system, but I’m getting my head in a muddle trying to work out the automations required. I am looking for the following:

  • At 07:30, set all TRV’s to a temp of 19.5
    → If any of the TRV’s report their current temp as lower than 19.5, switch on the boiler via the Hive thermostat control (climate.set_temperature). But, because of Hive’s own thermostat, it uses this to determine when to call for heat from the boiler. So, I think I would need to artificially set the Hive thermostat to something higher, say 25, so that it initiates that call for heat.
    or
    → If all of the TRV’s report their current temp as 19.5 or above, no need to call for heat at this time.

Then, ongoing throughout the day, if the temp of any TRV falls below the set temp, do the same as above by calling for heat via the Hive thermostat

Once any/all TRV’s reach their set temp, turn the call for heat off by setting the Hive thermostat down to something like 15, to force it.

Additionally, if any of the TRV’s are manually adjusted using the TRV head itself, again, call for heat by setting the Hive thermostat to 25 to force the it.

  • At 21:30, set all TRV’s to a temp of 17 which will also turn off the boiler via the Hive thermostat (set to something like 15 to force it)

As you can see, a lot relies on having to force/override the existing Hive thermostat to do the call for heat to turn the boiler on, as without this, no hot water will be pumping round the system regardless of what the TRV’s want to do.

Am I overthinking this, or missing something else? What is the best way to achieve this?

I am also happy to drop the Hive system now I have individual TRV’s but presume I need some kind of zigbee dry contact relay wired in to the boiler instead of the Hive receiver I currently have. Then, I can just say “turn the boiler on” when a TRV needs it, and off again when not.

Thanks for helping :slight_smile:

James

Slight update, I’ve now removed my Hive Hub and integrated the Hive Receiver and Thermostat directly in to Home Assistant (paired with ZHA), so I can use it locally and not through the Hive Cloud. This also now allows me to directly control turning the call for heat on/off but it still requires me to set a temperature that is higher than what the thermostat shows…

I am also in process of buying TRVs. Can you confirm that the TRVs are pairing with ZHA? I ordered the new Sonoff Zigbee 3.0 dongle, which should work with ZHA. So hopefully the TRVs will also connect without any issues.

Yes, if it is zigbee based, it should pair straight to Home Assistant. I am using the ZHA integration with my USB zigbee dongle.

How to add Zigbee devices to Home Assistant via SONOFF Zigbee 3.0 USB Dongle Plus? How to flash firmware to Cc2652P? - SONOFF Official - this has instructions on how to enable your USB dongle with ZHA, after which, you can pair your TRV’s if they are supported.

My HY367 wasn’t supported, added support here:

1 Like

Hi @tedted

With the gas crisis I too have finally bitten the bullet and paired my hive thermostat and controller via zigbee2mqtt.
I have eq3 max TRVs and am looking to achieve the same as you.
How did you get on?
What’s the ZHA integration with the hive controller like?

It’d be good to collaborate if you’re still on this quest!

Tristan.

I have tried to connect mine but keeps showing a big 1P in the screen. No idea what to do and can’t find any manual to solve it.

How has this went for you?

I’m considering buying hive + TRV’s to work entirely through Home Assistant but it seems you may not be having the best of luck?

Hey @tedted, did you solve the problem? Having same issue and I dont understand why its not in official Tuya app.

Not sure if this will help any one else, but this is what I have done to get this working.

I did try and do it slightly smarter with a for loop, but it threw up some type errors, I may have a look at making it smarter later, but for now hardcoding will do!

Step 1: Create a Sensor with a Value template:

  - platform: template
    sensors:
      boiler_on_off:
        friendly_name: Boiler on off switch
        value_template: "{% if (states.climate.{trv1_id}.attributes.temperature > 7 and states.climate.{trv1_id}.attributes.temperature > states.climate.{trv1_id}.attributes.current_temperature) or 
(states.climate.{trv2_id}.attributes.temperature > 7 and states.climate.{trv2_id}.attributes.temperature > states.climate.{trv2_id}.attributes.current_temperature) %} {{True}}{% else%}{{False}}{% endif%}"
        unique_id: sensor.boiler_on_off_switch

Explanation:
In an IF statement, I check 2 things, firstly, is the TRV target temp set to 7 (my TRVs - these ones) don’t turn on and off properly with the switch, so I just set the target temperature as something really low. I then check to see if the target temperature is greater than the current temperature.
If the Target Temperature is greater than 7 and less than the target temperature, I return True, but if the target temp is 7 or less than the current temp, I return false.

I can then add an or statement, which is the same logic repeated for each TRV.

I can then just use a simple automation to check the state of boiler_on_off and if true, turn on the boiler, else if False turn off the boiler.

I have done some basic testing and this is working, but will do some more testing this week as my heating schedule kicks in to see any issues.

Hope this helps!

1 Like

Hi. Can you provide some feedback after a couple of days of testing? Also, what do you use to turn on and off the boiler? A relay switch? which one?

I am currently pondering the idea of having a similar setup, but a bit more intricate.
In my home, I have:

  • a living room that has a central ‘dumb’ programmable thermostat and 3 radiators with ‘dumb’ thermostatic valves.
  • a pellet stove in the living room that blows its hot air directly over the thermostat
  • 3 bedrooms with ‘dumb’ thermostatic valves

With that setup, when the pellet is on in the living thermostat is reporting a very high temperature and never calls for heat. This lead to very cold bedrooms in the winter as the radiators only heat when the pellet is off.

So I have two possible plan of actions:

  1. Ask the thermostat for the highest temperature possible during the day. This will always ask for heat, but as all radiators have thermostatic valves, I can prevent the rooms from being overheated. With that setup however, the burner always keep the pipes at temperature, even when all valves are “closed”.
  2. Install smart TVR in the bedrooms and a relay in parallel with the thermostat. Now when the bedrooms TVR need heat, they can trigger the relay and start the burner. In the living room, I can keep the dumb valves and set the thermostat to 20°. If I keep the ‘dumb’ valves in the living on 3 (i.e. 21°C), the living should never be come too hot. I think this setup should allow me to save a bit more. Ideally I would get smart TVR everywhere and a smart relay in place of the thermostat. But that would be 200€ more expensive and I do not think it is really worth it.

Does this make sense or am I completely missing something here in your opinion?

@lambtho If you are looking for a relay solution for switching the boiler, I can recommend the Shelly 1. We are using this successfully on a gas thermostat. It can be powered from the thermostat / boiler supply as well.

Hey folks,

I usually don’t post much (first message actually) but I stumbled upon this thread and it looks exactly like what I succesfully did in my house (if it’s not, it might still help for some parts). Apologies for resurecting a quite old thread.

Also sorry for the long post.

My initial setup was a Hive SLR2 +
SLT3B that were already there when I bought the house 18 months ago.
My problem with that was there was only 1 sensor (presumably on the SLR2) for the whole house and obviously this was install next to the boiler in a tiny laundry room so the room would get warm enough way quicker than the rest of the 2 storey house.

I connected both the SLR2 and SLT3b to MQTT bought a number of TRV (enough Tuya TV02 to cover the ground floor rooms + main one I cared about upstairs) and same amount of external temperature sensors (Sonoff SNZB02)(because my TRVs internal temp sensor are biased since very close to the radiator.
I quickly ditched the SLT3b cause it kept messing with the connection (I’m not sure you can have it controlling the hvac without the hvac losing the connection to your zigbee network, it kinda goes through the SLT3b).

For the pairing of SLR2 to z2MQTT either follow this Hive SLR2 control via MQTT | Zigbee2MQTT or there’s plenty of videos on youtube.

Then for HA config, I have:

  • 1 mqtt climate for the SLR2b (actually not sure that is required, this should be autodiscovered but can’t remember why I’ve overriden that )
  • 1 simple switch to turn on/off the hvac for temperature
  • 1 simple switch to turn on/off the hvac for water heating (not posted here but it’s basically the same as the heater but for the water endpoint)
  • 1 switch to control having several thermostat querying hvac to turn on/off (used in the generic_thernostat integration)
  • 2 scripts:
    • 1 that checks if boiler needs to start (remember there’s loads of thermostats)
    • 1 that checks if boiler needs to stop
  • couple automation to sync TRV and external sensor temperature (so the TRV don’t cut the heat too early) + heating setpoint (so I can change the wanted temperature for a room from either HA or the valve itself).

Note that I also have 2 radiators with each a TRV in my living room and both are sync to each other through either HA living room thermostat or each of the TRV itself (changing one change the other automatically).

You can then add a generic_thermostat for each room, the sensor needs to be the room external sensor (not the TRV one) and the heater switch you previously setup (the one controlling several thermostats).

Simple heater switch look like this.

# switch.heater
- platform: template
  switches:
    heater:
      icon_template: >-
        {% if is_state_attr('climate.slr2', 'running_state_heat', 'heat')%}
          mdi:radiator
        {% else %}
          mdi:radiator-off
        {% endif %}
      value_template: "{{ 'on' if is_state_attr('climate.slr2', 'running_state_heat', 'heat') else 'off' }}"
      turn_on:
        - service: mqtt.publish
          data:
            topic: "zigbee2mqtt/Boiler - Laundry Room/heat/set"
            payload: "{ \"system_mode_heat\":\"heat\", \"temperature_setpoint_hold_heat\":\"1\", \"occupied_heating_setpoint_heat\":\"25\" }"
        - service: mqtt.publish
          data:
            topic: "zigbee2mqtt/Boiler - Laundry Room/get"
            payload: "{ \"running_state_heat\":\"\" }"
      turn_off:
        - service: mqtt.publish
          data:
            topic: "zigbee2mqtt/Boiler - Laundry Room/heat/set"
            payload: "{ \"system_mode_heat\": \"off\", \"temperature_setpoint_hold_heat\": \"0\" }"
        - service: mqtt.publish
          data:
            topic: "zigbee2mqtt/Boiler - Laundry Room/get"
            payload: "{ \"running_state_heat\":\"\" }"

Turning on arbitrarily set the target temp to 25 as we only care for the temperature to be above the current room temperature where the SLR2 is (so it doesn’t auto turn off). It will be turn off by the generic_thermostat when the room sensor actually reach the “real” target temperature that you set on the thermostat.

Obviously this will not work with several rooms because the thermostats will conflict between each other with such a simple switch. So we need another one:

# switch.heater_therms
- platform: template
  switches:
    heater_therms:
      value_template: "{{ 'on' if is_state_attr('climate.slr2', 'running_state_heat', 'heat') else 'off' }}"
      turn_on:
        service: script.turn_on
        target:
          entity_id: script.check_boiler_needs_start
      turn_off:
        service: script.turn_on
        target:
          entity_id: script.check_boiler_needs_stop

You could merge those 2 above switches but I like to keep them simple. Also you could use the 1st one as a “force on/off”.
Notice that it calls the 2 scripts that will checks if we actually need to do anything (in case another room is already heating or if all the room reached the target temperature).

The start is simple, we only need to check if it’s already on or not.

# script.check_boiler_needs_start
# script to be called when multiple thermostats try to start the boiler
check_boiler_needs_start:
  alias: "Check Boiler Needs Start"
  sequence:
  - choose:
    - conditions:
      - not:
        - condition: state
          entity_id: climate.slr2
          attribute: running_state_heat
          state: "heat"
      sequence:
      - service: switch.turn_on
        target:
          entity_id: switch.heater
    default: []
  mode: single

The stop is a bit more involved as we need to check every room

# script.check_boiler_needs_stop
## Script to be called when multiple thermostat tries to stop the boiler
check_boiler_needs_stop:
  alias: "Check Boiler Needs Stop"
  sequence:
  - choose:
    - conditions:
      - alias: "If boiler is heating"
        condition: state
        entity_id: climate.slr2
        attribute: running_state_heat
        state: "heat"
      - alias: "If all thermostats reached their target temperature"
        condition: template
        value_template: >-
         {% set climates_to_filter = "climate.boiler_*|climate.slr2|climate.trv_*" %}
         {% set ns = namespace(found_at_least_one_not_reach_temp = false) %}
         {%- for state in states.climate | rejectattr("entity_id", "match", climates_to_filter) | selectattr('state', '!=', 'off') -%}
           {%- set ns.found_at_least_one_not_reach_temp = ns.found_at_least_one_not_reach_temp or state_attr(state.entity_id, "temperature") > state_attr(state.entity_id, "current_temperature") -%}
           {#{ state.entity_id + "\n" if state_attr(state.entity_id, "temperature") > state_attr(state.entity_id, "current_temperature")  }#}
         {%- endfor -%}
         {{not ns.found_at_least_one_not_reach_temp}}
      sequence:
      - service: switch.turn_off
        target:
          entity_id: switch.heater
    default: []
  mode: single

The value_template part goes through all climates, you need to filter out any climate you want to check using the climates_to_filter variable. Here I filter anything starting with “boiler” “slr2” or “trv_” as I only want the generic_thermostat that I manually setup for each room.

I can post my SLR2 mqtt climate override script if needed but tbh it looks like the default HA MQTT discovery payload so probably not needed if you auto-discover MQTT devices. Let me know if you want me to share te blueprints for the automation scripts to sync external sensor/virtual thermostat/trvs, there’s also plenty of already existing blueprint on this forum.

Here is an example of a virtual room thermostat that ties it all together:

# climate.living_room
# this is your virtual thermostat that you should expose in your UI
- platform: awesome_thermostat
  name: living_room
  unique_id: climate_living_room
  heater: switch.heater_therms
  target_sensor: sensor.sensor_livingroom_temperature
  cold_tolerance: 0.3
  hot_tolerance: 0
  min_cycle_duration:
    seconds: 5
  precision: 0.1
  #window_sensor: binary_sensor.livingroom_windows
  #motion_sensor: input_boolean.livingroom_motion_sensor
  #motion_mode: comfort
  #no_motion_mode: eco
  #motion_delay:
  #  minutes: 5
  eco_temp: 16
  away_temp: 12
  boost_temp: 22
  comfort_temp: 20
  sleep_temp: 18

Pretty standard. I use awesome_thermostat but you can replace it with generic_thermostat and that should work fine.

Of course in all those scripts you should replace the “Boiler - Laundry Room” with the friendly name of your SLR2.
climate.slr2 refers to the mqtt integration of your SLR2 in HA (should be auto discovered from z2mqtt).

Hopefully that is exhaustive enough but feel free to ask for more info.

1 Like

Thanks so much for this, I’ve still yet to fully implement it. I have the Hive receiver and thermostat, Sonoff temp sensors and also some ZigBee TRVs. Sounds the same as you…

I plan to have one on each radiator to be able to heat only some rooms when required, rather than all.

Will the boiler be ok as it’s still pumping all the hot water round the system but with only one or two radiator valves open ad hoc…

I don’t have any issue with that. It’s just that your one radiator will get warmer water when all the TRVs are closed (especially if it’s end of the line). It’s exactly the same as closing all the manual valve but one in your previous setup.

I’ve only replace about half my valves so far (cause I’m on a tight budget at the moment) but have already seen a huge improvement:

  1. the house feels nicer cause rooms don’t get over heated.
  2. rooms at the end of the circuit gets warmer quicker because of that.
  3. reduced my gas consumption by quite a lot incidentally

Btw, just re-read the og post and for the scheduling part you should be able to use your TRVs’ built in scheduling with something like awesome_thermostat + scheduler-component.

That’s my plan as well, just didn’t get around to do it yet (but that should be the easy part).

Which TRVs are you using please? Thanks

I’ve got those Qiumi Zigbee Thermostat Radiator Valve https://amzn.eu/d/frL2iJz which are configured as Tuya TV02 in ZigBee2Mqtt (TuYa TV02-Zigbee control via MQTT | Zigbee2MQTT)

Should work with those scripts and any TRV that supports reading the current temperature. The attribute name might not be exactly “current_temperature” so you might have to tweak that in the scripts. You can find the corresponding attribute name either from your device ZigBee2Mqtt’s description page or if it’s already discovered in HA, from the states page in the developer tools page.

Alternatively, if you share with us your hardware and setup, I can help you adapt those scripts for you needs…

1 Like

So I’ve finally got round to doing this and wanted to provide an update…

My setup is:

1 x Hive SLR1b receiver
1 x Hive SLT3b control / thermostat
6 x SONOFF Zigbee TRVZB
6 x SONOFF Temp/Humidity Sensor SNZB -02

All directly paired using Zigbee2MQTT.

The Hive part I’ve been using for a few years and the SLR3b is in the living area so the setpoint temperature was measured there.

Now, the plan is to individually set (and maintain) temperatures in various rooms.

I’ve gone down the route of a simple automation without relying on any third party integration/module just so I can get it working as expected before I look to optimise it further.

Therefore, I have 3 new automations:

  • 1 that detects when the value of the sensor in a room drops below the wanted temp and then turns on the TRV in that room, and sets the setpoint on both the TRV and the Hive receiver to an arbitrary target temp of 30 in order to turn the boiler on and open the valve.

  • 1 that detects when the value of the sensor in a room rises above the wanted temp and then turns off the TRV in that room (but doesn’t do anything with the Hive receiver as there may be other TRVs that are still on).

  • 1 that checks if ALL TRV’s are off/idle and then sets the setpoint on the Hive receiver to an arbitrary target temp of 15 in order to turn the boiler off.

Everything is working although I’ve noticed the SNZB-02 sensors are not great at updating in a timely manner… sometimes no update in over 10 or 20 minutes even though the temp has changed, which means the boiler is off/on more than it needs to be. Any idea’s?

Here’s are my automations in case it helps anyone:


Turn On TRVs As Required

alias: Turn On TRVs As Required
description: ""
trigger:
  - type: temperature
    platform: device
    device_id: 3f35bbea52ca313de09dea036797550d
    entity_id: 214b82be213f5dfb2ab2147b61689a7c
    domain: sensor
    below: 18.5
    id: temp-living
    for:
      hours: 0
      minutes: 2
      seconds: 0
  - type: temperature
    platform: device
    device_id: 1466899eb72a6658ff82dd988aa2968c
    entity_id: 49e8f5813d7bb6a3926fcbdf3bd9483e
    domain: sensor
    below: 18.5
    id: temp-kitchen
    for:
      hours: 0
      minutes: 2
      seconds: 0
  - type: temperature
    platform: device
    device_id: ca1753cec52a82e84e5346cb1969f16e
    entity_id: 40cac5268b1ee07369c2425ba2b6f164
    domain: sensor
    below: 18.5
    id: temp-hall
    for:
      hours: 0
      minutes: 2
      seconds: 0
  - type: temperature
    platform: device
    device_id: 5dee911480a9ab77ea24d66729978642
    entity_id: d315d7ac83a2c97d17bda481961d958b
    domain: sensor
    below: 18.5
    id: temp-office
    for:
      hours: 0
      minutes: 2
      seconds: 0
  - type: temperature
    platform: device
    device_id: 7e90b307725c451355032ddd6e1e012b
    entity_id: 3bed64ea5f82127682dd6081b2b4c6a6
    domain: sensor
    id: temp-emilia
    below: 18.5
    for:
      hours: 0
      minutes: 2
      seconds: 0
condition:
  - condition: time
    after: "07:30:00"
    before: "21:00:00"
action:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - temp-living
        sequence:
          - service: climate.set_temperature
            metadata: {}
            data:
              temperature: 30
            target:
              entity_id:
                - climate.living_room_left_trv
                - climate.living_room_right_trv
          - service: climate.turn_on
            metadata: {}
            data: {}
            target:
              entity_id:
                - climate.living_room_left_trv
                - climate.living_room_right_trv
      - conditions:
          - condition: trigger
            id:
              - temp-kitchen
        sequence:
          - service: climate.set_temperature
            metadata: {}
            data:
              temperature: 30
            target:
              entity_id: climate.kitchen_trv
          - service: climate.turn_on
            metadata: {}
            data: {}
            target:
              entity_id: climate.kitchen_trv
      - conditions:
          - condition: trigger
            id:
              - temp-hall
        sequence:
          - service: climate.set_temperature
            metadata: {}
            data:
              temperature: 30
            target:
              entity_id: climate.hall_trv
          - service: climate.turn_on
            metadata: {}
            data: {}
            target:
              entity_id: climate.hall_trv
      - conditions:
          - condition: trigger
            id:
              - temp-office
        sequence:
          - service: climate.set_temperature
            metadata: {}
            data:
              temperature: 30
            target:
              entity_id: climate.office_trv
          - service: climate.turn_on
            metadata: {}
            data: {}
            target:
              entity_id: climate.office_trv
      - conditions:
          - condition: trigger
            id:
              - temp-emilia
        sequence:
          - service: climate.set_temperature
            metadata: {}
            data:
              temperature: 30
            target:
              entity_id: climate.emilias_trv
          - service: climate.turn_on
            metadata: {}
            data: {}
            target:
              entity_id: climate.emilias_trv
  - service: climate.turn_on
    metadata: {}
    data: {}
    target:
      entity_id: climate.hive_receiver
  - service: climate.set_temperature
    metadata: {}
    data:
      temperature: 30
    target:
      entity_id: climate.hive_receiver
mode: single

Turn Off TRVs As Required

alias: Turn Off TRVs As Required
description: ""
trigger:
  - type: temperature
    platform: device
    device_id: 3f35bbea52ca313de09dea036797550d
    entity_id: 214b82be213f5dfb2ab2147b61689a7c
    domain: sensor
    id: temp-living
    above: 19.5
    for:
      hours: 0
      minutes: 0
      seconds: 0
  - type: temperature
    platform: device
    device_id: 1466899eb72a6658ff82dd988aa2968c
    entity_id: 49e8f5813d7bb6a3926fcbdf3bd9483e
    domain: sensor
    id: temp-kitchen
    above: 19.5
    for:
      hours: 0
      minutes: 0
      seconds: 0
  - type: temperature
    platform: device
    device_id: ca1753cec52a82e84e5346cb1969f16e
    entity_id: 40cac5268b1ee07369c2425ba2b6f164
    domain: sensor
    id: temp-hall
    above: 19
    for:
      hours: 0
      minutes: 0
      seconds: 0
  - type: temperature
    platform: device
    device_id: 5dee911480a9ab77ea24d66729978642
    entity_id: d315d7ac83a2c97d17bda481961d958b
    domain: sensor
    id: temp-office
    above: 19
    for:
      hours: 0
      minutes: 0
      seconds: 0
  - type: temperature
    platform: device
    device_id: 7e90b307725c451355032ddd6e1e012b
    entity_id: 3bed64ea5f82127682dd6081b2b4c6a6
    domain: sensor
    id: temp-emilia
    above: 19
    for:
      hours: 0
      minutes: 0
      seconds: 0
condition:
  - condition: time
    after: "07:30:00"
    before: "21:30:00"
action:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - temp-living
        sequence:
          - service: climate.set_temperature
            metadata: {}
            data:
              temperature: 15
            target:
              entity_id:
                - climate.living_room_left_trv
                - climate.living_room_right_trv
          - service: climate.turn_off
            metadata: {}
            data: {}
            target:
              entity_id:
                - climate.living_room_left_trv
                - climate.living_room_right_trv
      - conditions:
          - condition: trigger
            id:
              - temp-kitchen
        sequence:
          - service: climate.set_temperature
            metadata: {}
            data:
              temperature: 15
            target:
              entity_id: climate.kitchen_trv
          - service: climate.turn_off
            metadata: {}
            data: {}
            target:
              entity_id: climate.kitchen_trv
      - conditions:
          - condition: trigger
            id:
              - temp-hall
        sequence:
          - service: climate.set_temperature
            metadata: {}
            data:
              temperature: 15
            target:
              entity_id: climate.hall_trv
          - service: climate.turn_off
            metadata: {}
            data: {}
            target:
              entity_id: climate.hall_trv
      - conditions:
          - condition: trigger
            id:
              - temp-office
        sequence:
          - service: climate.set_temperature
            metadata: {}
            data:
              temperature: 15
            target:
              entity_id: climate.office_trv
          - service: climate.turn_off
            metadata: {}
            data: {}
            target:
              entity_id: climate.office_trv
      - conditions:
          - condition: trigger
            id:
              - temp-emilia
        sequence:
          - service: climate.set_temperature
            metadata: {}
            data:
              temperature: 15
            target:
              entity_id: climate.emilias_trv
          - service: climate.turn_off
            metadata: {}
            data: {}
            target:
              entity_id: climate.emilias_trv
mode: single



Turn Off Heating (Hive Receiver/Boiler) As Required

alias: Turn Off Heating As Required
description: ""
trigger:
  - platform: state
    entity_id:
      - climate.living_room_left_trv
      - climate.living_room_right_trv
      - climate.kitchen_trv
      - climate.hall_trv
      - climate.office_trv
      - climate.emilia_trv
    attribute: hvac_action
    to: idle
condition:
  - condition: time
    after: "07:30:00"
    before: "21:30:00"
  - condition: state
    entity_id: climate.living_room_left_trv
    attribute: hvac_action
    state: idle
  - condition: state
    entity_id: climate.living_room_right_trv
    attribute: hvac_action
    state: idle
  - condition: state
    entity_id: climate.kitchen_trv
    attribute: hvac_action
    state: idle
  - condition: state
    entity_id: climate.hall_trv
    attribute: hvac_action
    state: idle
  - condition: state
    entity_id: climate.office_trv
    attribute: hvac_action
    state: idle
  - condition: state
    entity_id: climate.emilia_trv
    attribute: hvac_action
    state: idle
action:
  - service: climate.set_temperature
    data:
      temperature: 15
    target:
      entity_id: climate.hive_receiver
  - service: climate.turn_off
    metadata: {}
    data: {}
    target:
      entity_id: climate.hive_receiver
mode: single

Questions:

  • How can this be improved/optimised or is it simple enough to maintain like this?
  • Can I unpair the SLR3b and still keep the SLT1b (which actually does all the work turning the boiler on/off) as the SLR3b control unit is now not required/used. Does the SLT1b expect the thermostat unit to always be paired (otherwise it might always ben flashing orange)

Thanks!

1 Like

Hey tedted22

Glad you’ve finally got something somewhat working for you, great progress! :slight_smile:

To answer your question to the best of my knowledge:

  • AFAIK, you don’t have to pair the SLT3b although you’ll still have the weird blinking from the boiler switch part, it should still work for turning on/off via your zigbee controller. Personally, I just kept it paired so I can see it in z2mqtt but I turned it off and don’t even think about it anymore (to the point where I can’t even tell you if it’s still on the wall or not XD).
  • For the SNZB-02 being not very responsive, unfortunately I had mixed result with it where I’m starting to think the built quality between sensors can very quite a lot. I’ve got 6 of them at home, 3 work like a charm and the other 3 have started giving me headache in the past few weeks (disconnections, partial discovery when re-pairing, or flat out no reporting once paired). However, the normal behavior from the info I could collect should be:
    • The sensor should usually report in the next 10 seconds from detecting a temp change. You can test it by just taking the sensor in your hand and breath on it for a few seconds (it should then report quite shortly). Now there’s a number of things that could hinder that or making it better:
      • Connection quality => make sure the sensor has a good LQI (Link Quality Indication) otherwise the sensor might try its best to report but packets are just dropped because of the connection. I try to aim at 150+. You can usually make it better by trial and error, moving the sensor closer to a router device. If you use z2mqtt, I believe you can also play on which router is actually relaying the connection by choosing which one is open to pairing in the “permit join” drop down (I believe that’s what it is for, someone correct me if I’m wrong). I’m also not sure how good zigbee is at taking the best route so might be worth trying it out.
      • in z2mqtt, you can tweak the minimal report time in order to try and make it report more often. On a per sensor basis, there’s a “reporting” tab in there where you should be able to change “Min rep interval” and “min rep change”. I believe the interval are in minutes, and the change are in tenth of the unit you’ve choosen for SNZ-02B (the interface doesn’t tell cause it very much depends on the sensor) => I’d change that last one to at least something <= 20 if it’s not the case. Mine are set at 5min and 20 (e.g 0.2°C).
      • Unfortunately, I’ve read online that some of the instances of SNZ-02B have some hardware issues and often comes with broken soldering. Some people managed to fix it though so if you’re handy enough and you think your sensor is definitely broken… I didn’t try that (yet) myself for my broken ones, I might just try and find a more consistent one, although I think it’s proven to be quite hard to find (deffo open to suggestions on what people have successfully, reliably use as their temperature sensors).

As for the home assistant part itself, instead of setting the TRV target temp to an high value, I personnally prefer having an automation re-calibrating the local_temperature (TRV usually have a local_temperature_calibration attribute) because that way I can see the proper temperature directly on the TRV itself and tweak it on that end if needed (sometimes it’s easier to go tweak the temp on the TRV manually instead of reaching for your phone/going to your potentially wall mounted controller).

The recalibration might require a bit of testing cause depending on the TRV (but I believe yours is very similar to mine) the reported local_temperature might not include the calibration so you need to do the (simple) math to find out the target calibration value to match your external sensor.

I would really wish I could find a way to auto-discover MQTT TRVs as proper generic thermostat entities cause if that was the case, you could just get rid of this automation entirely keeping just the recalibration part (which could also be integrated in the integration itself).