Horstmann - hrt4-zw & ASR-ZW Z-wave Thermostat

Hi all, had a fair bit of aggro getting these things working so thought I’d knock up and all-in-one post.

I’m UK based and wanted a smart heating system. Nest etc didn’t seem to do what I wanted, and having an existing smartthings ecosystem (temp sensors etc) I wondered if it were possible to add something cheap that would be (a) a bit of initial aggro but, (b) work well for my needs.


  • Cheap
  • Reliable
  • Customisable (to link into home alarm, wake alarms, presence sensors, multiroom etc).

So first up, bought one of these from ebay for £25 (£60 new)

Had a load of aggro installing it, finally following the instructions from here : The ‘aggo’ part was mainly down to poor instructions - I could get the thermostat to control the switch, but when paired to smartthings, I could see the setpoint changing if I physically spun the wheel, but this didn’t have any effect on the switch. It was as if one was connected, or the other. Started to think I’d wasted my money! Grr. Anyhoo, it was because it needed to be reset, as per instructions here (https://k2aab.com/home-automation/fibaro-hc2-and-horstmann-hrt4-zw/) and quoted below just in case.

Not here, that in my hours of messing about trying to get the f**ker working, I installed some new DTH’s.

Here’s the thermostat

here’s the modified code found on here:

And here’s the switch:

Again, with the code found here:

Followed the install below, and this gave the two devices in smartthings.

If I turn the wheel, this reflects immediately in the device type in smartthings, and the switch activates as planned if the temp is lower than the temp set on the dial. Result!

Next up, wanted to be able to control this from smartthings. Boo. This seems a bit of a pain, possibly due to the time delay of a battery powered thermostat, I don’t quite get it and to be honest I got cheesed off trying to figure it out, so instead, I sacked it off and went a different route.

Webcore! Woo!

So at the minute, I have two simple pistons (I’ll expand on this in a bit)

Very simple, and this means if the physical wheel is spun, after 5 seconds of ‘stability’, the ‘target’ temp is set as a variable. This variable can also be set by the up/down arrows in smartthings from the thermostat device (note that changing it in software does not change the display on the thermostat - rather the last device to alter is the one which sets the target temp overall, make sense?).

Obviously this setpoint can be easily set by webcore via timers, presence, whatever. The list is endless.

Now all I need to do is add a few TRV’s.

Not the best guide, but if I’d had this available yesterday I probably could have saved some heartache.

Does anyone know if its possible that, after setting the setpoint via webcore or the app etc, how the display on the dial can be forced to reflect this?

At the minute if the dial is set to 18, and the app changes it to say 10, the dial continues to read 18.

I’m still in testing phase a little here and I’m unsure if the heating is getting switched on by an ‘out of whack’ dial… I. E. Setpoint is altered to 10, but dial still reads 18, so heating kicks in. Not entirely sure. Was potentially thinking of disassotiating the thermostat from the receiver and just having the receiver controlled by webcore and the actual setpoint (thinking the dial can still be used as a physical switch to alter the temp and setpoint anyway). Not the best explanation I’m sure. But hopefully you get the point =p

Did you ever sort the temp display issue?

nope. but not a prob for me. It does mean that the thermostat, in effect, is displaying the wrong temp, but it doesn’t effect me. If I spin the thermostat to say, 27 degrees, this sets the setpoint of the front room rad to 27… so boiler switches on. The ‘boost’ only works for 30 mins then returns to schedule as defined in the periodic piston.


Would you mind posting the code, I cannot see it above? Thanks!


I’ve actually became a little obsessed with this to be honest, but my coding is pretty horrific to say the least.

I essentially have a number of pistons running on timers (5 mins).

Eg for frontroom, it says

Set variables
1500-1600 = 21

  • every 5 mins

If time is 3-4pm
And temp frontroom is less than targettemp1500-1600
set frontroom rad to 30 degrees
Set frontroom rad to 1 degree


Then another ‘checktemps’ Piston running every 5 mins which switches on a set of virtual buttons

Is valve open?
Turn frontroom-toocold ON
Is valve closed?
Turn it off.


Until the end of this Piston which says

Is any of the ‘too cold’ switches on for any room?
If so, switch the boiler on
Else, switch the boiler off.

Make sense? It’s horrible, but pretty easy to duplicate. It’s a bit of a mess really and I’m sure there’s easy ways to write the code better, but I’ve added in occupancy sensors, voice announcements etc and it works absolutely phenomenonly well. We’ve pretty much halved our gas usage using it.

Anything I can do to help, feel free to ask. But it’s hardly user friendly, it’s just ‘grown’ rather organically into something I find rather special. The actual schedules and temps are a doddle to alter, and since I use Shm as security, the heating only kicks in if we’re in home mode anyway. But I have a 30 min ‘boost’ which kicks in regardless if the other half nears home at a certain time (or it can be manually pressed if for example we’ve been awol and are returning).

The possibilities and tweaks are endless.

examples. here’s the code for the boost for the hallway (boost being a virtual button which if you turn on, blasts the heating for 30 mins in the hallway.

And here’s a clearer look (the above is anonymised and looks more confusing).


Here’s the schedule hallway piston

and again a clearer view…

And Here’s the hallway boost timer piston too

And clearer…



Finally, my checktemps piston which controls the lot. This runs every minute.

Which DTH are you using for the stat? Thanks.

dth for trv:

dth for thermostat:

That is cool, any idea how to factory reset the device. It was connected to fibaro hcl, which bit the dust. I now wish to reset it to work with fibaro.