[OBSOLETE] Heatmiser Neostat Integration

Hello everybody,

My latest code is now on Github and this supports up to 30 thermostats, plus quite a few other improvements to make everything work a bit more smoothly and hopefully intuitively. There will probably be some further small updates (plus a timer version for non-thermostat devices that @VaticanUK is working on) but these are the main ones.

In the Bridge device there is a new parameter called ‘Debug Mode’, this enables extra printing of device status and error messages if you are having problems. The setting is set on the Bridge and then should cascade down to the Thermostat devices to increase the logging on them too.

For the 30 thermostat code to work you will need the latest firmware from Heatmiser which should be rolled out imminently, however I have written it to be backwards compatible, so you can safely upgrade the Device Handlers now and it will start working fully after Heatmiser update your NeoHub.

Any questions let me know, or any problems too!

Hi Chris,

Now summer’s gone I’ve got the heating back on, so thought it time to properly set up my NeoStats.

I’ve got your system set up, but can’t get the child devices created in SmartThings app on my phone (I’m using the Android version).

Flashed the nodeMCU with latest .bin from your GitHub
Set up the Bridge device in ST IDE, then config the Bridge App in ST app.

When I tap ‘Create Thermostat Devices’ nothing happens.
It does successfully create a test child device however.
In the ST Logs:

2804d074-4cd5-4815-b728-181169b58a9d  10:36:49 PM: debug Sometimes it refuses to create a device, adding one test device now to fix things
2804d074-4cd5-4815-b728-181169b58a9d  10:36:43 PM: debug uri /neorelay?device=hubcommand&command={"AWAY_ON":0}
2804d074-4cd5-4815-b728-181169b58a9d  10:36:43 PM: debug Setting all Thermostats to Away
2804d074-4cd5-4815-b728-181169b58a9d  10:36:39 PM: debug uri /config?ip_for_st=
2804d074-4cd5-4815-b728-181169b58a9d  10:36:39 PM: debug Configuring NeoBridge
2804d074-4cd5-4815-b728-181169b58a9d  10:36:37 PM: debug refreships()
2804d074-4cd5-4815-b728-181169b58a9d  10:36:35 PM: debug Refreshing all children (done from Bridge)
2804d074-4cd5-4815-b728-181169b58a9d  10:36:33 PM: debug uri /neorelay?device=hubzonesetup&command={"GET_ZONES":0}
2804d074-4cd5-4815-b728-181169b58a9d  10:36:33 PM: debug Requesting List of Thermostats
2804d074-4cd5-4815-b728-181169b58a9d  10:36:33 PM: debug Removing Child Thermostats
2804d074-4cd5-4815-b728-181169b58a9d  10:31:37 PM: debug uri /neorelay?device=hubzonesetup&command={"GET_ZONES":0}
2804d074-4cd5-4815-b728-181169b58a9d  10:31:37 PM: debug Requesting List of Thermostats
2804d074-4cd5-4815-b728-181169b58a9d  10:31:37 PM: debug Removing Child Thermostats

Bridge nodeMCU is working:{%22GET_ZONES%22:0}

{"relaycommand": {"GET_ZONES":0},
"relaydevice": "hubzonesetup",
"relayresult":{"Day Seating":2,"Dining Room":4,"Hallway":5,"Kitchen":3,"Living Room":1}
, "timingstr":"start:0 gotcommand:0 processedresult:1 connectedneohub:4 postwrite:5 postclientconnect:5 postheader:9 postjsoncommand:13 waitedfortimeout:42 availableloop:42-bytes:74"}

what could it be?
In the Hub smartapp, what should I set for ‘Password’ field? I couldn’t see anything about that in your GitHub instructions/

Thanks for your help

Did you follow this process:
Remove devices
Add test device
Remove devices
Create thermostats

That seems to be the only way ST allows it to work and hopefully should be fine for you too… Probably best to wait 5-10s between each button press to ensure they are finished, and you can always return to the device list view to confirm the removal/addition has been successful.

Hi, I gave that a go but still no luck…

Screen video here:

Ah, the text box with the home icon should show the responses from the NodeMCU but nothing is appearing there, hence it seems your ST hub isn’t receiving the responses from the NodeMCU after submitting the request to it.

Can you send a screenshot of the Neohub bridge device page of your ST dashboard. (Where it shows DNI and stuff like that). Plus also can you give me a quick overview of how the neohub connects to lan/internet and the NodeMCU to Wi-Fi. Do you have a single router/modem? What brand? That sort of thing please.


Hey, I had a look back through my DNI settings and got it figured out thank you.

I had added the MAC address including the colons. I removed these colons from the MAC address and the bridge app started receiving data. I was then able to get the child stats created. Might be worth a note in the docs about that or just a screenshot of that screen would be handy.

I’m now playing around to see how it all works and what I can do with the child stats.

Something I’d like to do is have them all turn to away mode when the mode /routine changes (I. E. When everyone leaves home turn to away, and back to auto when someone arrives).
In routines I can set the temp on the child stats, but can’t work out how to set away mode, can it be done? Problem with setting temp, is I guess the stat will still follow it’s own timed schedule and will turn itself back on later?

Thanks for cracking heatmiser Chris, excited to have go this far.

Some questions on Alexa…

I can say ‘set hallway thermostat to 20 degrees’ and it changes almost immediately, but alexa responds with “it’s set to auto” always, rather than responding with the set point.

Also if I ask “what’s the hallway thermostat set to” she responds with the same and tells me “auto”

I can ask for the temperature and she will tell me the exact room temperature, Eg “18.2 degrees”

Is there a way to get her to respond to what the setpoint is?

In the Alexa app it doesn’t allow a setpoint to be changed, see screenshots…

The Alexa thermostat integration has just changed, it used to respond fine with the temperature and that was why I made it use auto - as that was all Amazon had made work. You’re right that they now support other modes so I’ll swap it over and that should hopefully start it saying the temperature again. You can also have a quick go yourself as I’m away for a bit at the moment, there is a button in the bridge thermostat (at the bottom) which changes the mode to auto, try swapping that to heat and I imagine it will work properly again.

As for changing mode with routines then both the bridge and thermostats have an away mode. The bridge sets away for all devices while away for a thermostat sets it to frost (which Heatmiser have just decided to be the equivalent of away mode in the latest firmware)

I couldn’t find that option in the bridge stat, the options on the bottom row are:
Refresh thermostat info / Set all stats to away / Create test device.

I’ve seen in Webcore that you can access the setAllAwayOn and setAllAwayOff methods on the Bridge device, so that may be a way to control this when a mode changes.

Also, while looking through the logs I spotted this exception, in case you hadn’t see this before:

2804d074-4cd5-4815-b728-181169b58a9d  1:35:45 PM: error groovy.json.JsonException: Lexing failed on line: 2, column: 2, while reading 'r', no possible valid JSON value or punctuation could be recognized.
2804d074-4cd5-4815-b728-181169b58a9d  1:35:43 PM: debug uri /neorelay?device=hubzonerefresh&command={"INFO":"Day Seating"}

That’s interesting I haven’t seen that error before. We’re there any other related lines in the logs? Otherwise I’ll have a look when I get back, but it might be because you have a space in the thermostat name. Do you get it just for that thermostat? I’ve tried everything to deal with it correctly but sometimes ST gets unhappy about commands with spaces in them.

Yes I suggest using those functions for now and ill expand on it when I’m back so that you can also do it through Alexa/Home. Whatever I add I will keep backwards compatibility for those functions.

Hi cau you send me your email I have just purchased a SmartThings and am trying to get me neostats to work with it I believe you sell a usb stick that I can use


Hey again, I had another look at the logs. They only appear on the bridge device, and they don’t seem to correlate with a particular thermosta. They appear sporadically - some times a bunch togerher, other times individually.

Here are a few that happened at a similar time.
I have 5 thermostats (Kitchen, Day Seating, Hallway, Living Room, Dining Room), and at this point it seems like 4 of them errored.

  9:36:46 PM: debug uri /neorelay?device=hubzonerefresh&command={"INFO":"Kitchen"}
  9:36:41 PM: error groovy.json.JsonException: Lexing failed on line: 2, column: 2, while reading 'r', no possible valid JSON value or punctuation could be recognized.
  9:36:39 PM: debug uri /neorelay?device=hubzonerefresh&command={"INFO":"Dining Room"}
  9:35:56 PM: error groovy.json.JsonException: Lexing failed on line: 2, column: 2, while reading 'r', no possible valid JSON value or punctuation could be recognized.
  9:35:54 PM: debug uri /neorelay?device=hubzonerefresh&command={"INFO":"Living Room"}
  9:35:30 PM: error groovy.json.JsonException: Lexing failed on line: 2, column: 2, while reading 'r', no possible valid JSON value or punctuation could be recognized.
  9:35:28 PM: debug uri /neorelay?device=hubzonerefresh&command={"INFO":"Dining Room"}
  9:34:42 PM: error groovy.json.JsonException: Lexing failed on line: 2, column: 2, while reading 'r', no possible valid JSON value or punctuation could be recognized.
  9:34:40 PM: debug uri /neorelay?device=hubzonerefresh&command={"INFO":"Day Seating"}
  9:33:16 PM: debug Received a refresh command for Hallway

No rush anyway, something to poke around with when you return.
I’m working away on my first device handler at the moment for MAX! eq3 radiator valves. You’ve been an inspiration.

Hi @Meirion_Williams I’ll check it out, thanks. That looks like an ST error rather than the device handler but I’m sure there will be something causing it.

@Theshark You can now visit my online store which I created quickly to make it easier to get payment/delivery instructions and messages.

Hi @cjcharles any idea if this should work with Neoair stats? I’ve set everything up to the point of adding the stats. Whilst they appear, I get the stat screen with no info about it’s current condition and non of the controls for it work.

I’m seeing this in ST logs (only against the neostat bridge)

Thanks and great work!

Should work… Though I haven’t done any testing as I don’t have one.

Can you go to the IP address of the NodeMCU and type IP/neorelay?command={“INFO”:“Neoairstatname”} and paste the results here. Perhaps it has some different formatting or else there is something quite different in it’s behaviour. I assume all the other stats are working? How many of each type do you have?

Only 4 Neoairs I’m afraid (have a uhf8-rf wiring centre) so testing a neostat isn’t an easy option.

Here’s the output as requested -
{“relaycommand”: {“INFO”:“Neoairstatname”},
“relayresult”:{“error”:“Invalid Json”}, “timingstr”:“start:0 gotcommand:1 processedresult:1 connectedneohub:5 postwrite:5 postclientconnect:5 postheader:10 postjsoncommand:24 waitedfortimeout:59 availableloop:61-bytes:24”}

What part of the communication does the relayresult in the above refer to?

Oddly, the neostat bridge device in ST seems to be working insofar that if I set all thermostats to away mode from there, it works.

Sorry, please can you try:

(and try substituting the 0 for 1, 2, 3) - You have an old version of the Neohub firmware, hence the words will not work and you will need to use numbers (I expect there will be no difference between the 1/2/3/ options).


So here’s what I get for 0,1,2 (forgot the 4th stat is not integrated yet).

{“relaycommand”: {“INFO”:0},
“relayresult”:{“error”:“Invalid Json”}, “timingstr”:“start:0 gotcommand:0 processedresult:1 connectedneohub:5 postwrite:5 postclientconnect:5 postheader:8 postjsoncommand:9 waitedfortimeout:36 availableloop:40-bytes:24”}
{“relaycommand”: {“INFO”:1},
“relayresult”:{“error”:“Invalid Json”}, “timingstr”:“start:0 gotcommand:0 processedresult:0 connectedneohub:4 postwrite:4 postclientconnect:4 postheader:7 postjsoncommand:11 waitedfortimeout:23 availableloop:39-bytes:24”}
{“relaycommand”: {“INFO”:2},
“relayresult”:{“error”:“Invalid Json”}, “timingstr”:“start:1 gotcommand:1 processedresult:1 connectedneohub:7 postwrite:7 postclientconnect:7 postheader:11 postjsoncommand:13 waitedfortimeout:26 availableloop:41-bytes:24”}

Also, when I checked this morning, the devices for the stats are correctly reporting data on temp, periods, etc. in the ST app and they correctly refresh that data on the automated update schedule(it it set to 1m?). They’re still not accepting commands though.

Another quick question Chris, do you know if we can get the data for when the stats are calling for heat? (Shown in the Heatmiser app by the flame icon)

Thinking it would be great to get some graphs going of current temp, setpoints and heat demand.

Funny you should ask, it’s on my development plan for the weekend actually! If you like I’ll send you a beta version to test it when I’m ready to test.