🔧 Monthly Sonoff TRV Exercise (Zigbee2MQTT) – Prevent Valve Sticking

:wrench: Monthly Sonoff TRV Exercise (Zigbee2MQTT) – Prevent Valve Sticking

Hey Home Assistant users! :wave:

If you’re using Sonoff TRVs via Zigbee2MQTT, here’s a blueprint that will help ensure your radiator valves don’t get stuck after the summer break. This automation exercises the valves once per month to prevent limescale or mechanical sticking — a common problem that causes radiators to stay cold in winter.


:hammer_and_wrench: What It Does

This automation:

  • Runs on a configurable day and hour each month
  • Reads each selected TRV’s hvac_action state
    • If idle → toggles valve_closing_degree
    • If heating → toggles valve_opening_degree
  • Physically moves the valve open/close 3 times to prevent seizing
  • :white_check_mark: Optional: Restrict to summer months only (May–August)
  • :white_check_mark: Optional: Send a notification when complete

:white_check_mark: Requirements

  • Sonoff TRVs managed by Zigbee2MQTT
  • Each TRV must expose:
    • A climate.* entity with hvac_action
    • MQTT control via a topic like zigbee2mqtt/livingroom_trv
    • The valve_closing_degree and valve_opening_degree attributes

:inbox_tray: Import the Blueprint

Use the button below to import directly into Home Assistant:

Open in Home Assistant


:bulb: Why This Matters

Thermostatic Radiator Valves (TRVs) that stay closed all summer are at risk of mechanical sticking, especially due to water impurities or limescale. By triggering a controlled motion each month, this blueprint keeps them healthy and responsive year-round — no cold surprises when winter returns. :snowflake::fire:


Let me know if you tweak or expand the logic — or if your TRVs behave slightly differently. Happy automating! :raised_hands:

Thanks for this blue print, it should be able to do just what I want if I can resolve a niggle with spaces in the entity name.

Entity names with spaces - my TRVs are names “TRV RoomX” e.g. “TRV Bed1”. In HA the entity is shown as “climate.trv_bed1”. When this is called against z2m it gives an error of " z2m: Entity ‘trv_bed1’ is unknown"

A normal change to the entity will give in z2m: “z2m:mqtt: MQTT publish: topic ‘z2mha02/TRV Bed1’, payload

After setup there’s another thing I’ve noticed you can only set a single Zigbee2MQTT MQTT topic prefix - I’ve currently got 2 as I’ve split my house into 2 zones, between two z2m instances. Would be grate to specify more than one, but its not a big issue though - I’ve just created a job for each z2m instance.

Hi all — quick update.

I’ve published a new version of the blueprint (v1.1) with a reworked internal logic:

What’s changed:

  • Instead of using raw MQTT messages and manipulating valve_closing_degree / valve_opening_degree, the blueprint now controls TRVs using Home Assistant’s native climate.* services.
  • It sets the TRV to heat with a setpoint of 35 °C for a short period, then restores the original mode and temperature.
  • Additional delays were added between steps to ensure state changes are reliably processed.
  • The blueprint no longer relies on constructing MQTT topics, so it works regardless of how your TRVs are named in Zigbee2MQTT — including names with spaces like TRV Bed1.

The change was made because controlling valve_closing_degree directly through MQTT proved unreliable — the valves wouldn’t always move, or would respond with noticeable delay. By switching to climate control via Home Assistant services (which is the intended way to manage these TRVs), the blueprint is now much more predictable and consistent.

Hi @sptaylo1— thanks for your feedback on the original version.

Just wanted to follow up that the issues you raised should now be resolved in the new version of the blueprint (v1.1):

Since it no longer uses raw MQTT topic publishing, it doesn’t rely on matching entity names to Zigbee2MQTT topics. So even if your device name has spaces (e.g., TRV Bed1), it will still work correctly.

Appreciate you pointing out the edge case — let me know if you try the updated version and how it goes.

Tip!
If you lower the exercise temp. to 30c it works with Tado smart termostat valve x.

1 Like

Many thanks for your update to blueprint. I’ve finally gotten around to try it again it now works brilliantly, all my TRVs are being exercised on a regular basis.

1 Like

Thanks both for the feedback.

I’ve just published a new version of the blueprint where the exercise temperature is now configurable, with a default of 30 °C. This should make it more flexible across different TRV brands - including Tado, as @Mixound pointed out. You can adjust the value up or down depending on what your devices support.

I’m also really glad to hear from @sptaylo1 that the latest changes are working reliably in practice. The move away from direct MQTT valve_*_degree commands to standard climate.* controls seems to have made the behavior far more consistent across setups.

If you update to the latest version, you’ll be able to set your own preferred exercise temperature while keeping all the other scheduling and notification options.