Heatmiser Neo-hub support, ugly and work in progress

Hi All,

Started adding support for the Heatmiser Neo-hub / Neostat / Neostat-e

Reading and setting temperature works. The rest will follow when I get time, it’s ugly and will probably only work with a single stat at present but the code is here if you want to take a look: github.com/MindrustUK/Heatmiser … -assistant


Already looks pretty okay.

Some feedback:

[li] Don’t implement functionality that you don’t support (away mode does nothing)[/li]
[li] Update method should be the only method fetching data from the device. The target_temperature property should just read the instance variable[/li][/ul]

Thanks for the feedback, much appreciated!

I’m aware of away mode not working, I know how to make it work I just need to find some time to put it in. However yes I should probably keep things out till they’re ready.

Obvious as that looks now that I’ve read you’re comment about the update method I was having some trouble getting to grips with how I was planning to put this in. As I’m sure you’ve noticed data is read from the device all over the place.

I’ll try and find some time soon to fix these things and push a new revision up.

Just pushed a new update.

Away mode now works.
Update is now the only place fetching data apart from initial setup.
Still only supports one thermostat but should generally be a lot cleaner.

Few more outstanding things like pulling in the port from the configuration file and working out the heating / cooling states.

Was it still on your radar to extend this to work with multiple neo-stats? I might open a PR from your code and try to add this functionality.

Yeah it’s still on my list, I’ve had some problems getting the electric underfloor heating to play nice so it’s on hold at the minute. Unfortunately work and other commitments have been demanding so I’m not getting a lot of project time at the minute. Please feel free to open a PR, I think (last I looked at it) it should just be a case of adding an iterative for each device during update.

Thanks for the response and the work you’ve done so far on this, I’ve added in your component as a custom component, it iterates to create a new object for each thermostat, but not for all of the values (I’ve attached a screenshot form the Heatmiser app, the HA output, and the JSON response from the hub, although the forum doesn’t let you upload json, so I’ve given it an xml extension!)

I’ll hopefully find time in the next few weeks to get this done, looks like you’ve done the hard work already. It looks like this isn’t using a Heatmiser Neo Python library (as it seems one doesn’t exist, I could only find a node javascript library), but instead this is parsing all of the json within the component. Hopefully it can be extended without too much platform-specific logic working its way into the component.

There’s a CELCIUS / CELSIUS typo in your code which I’ll put in a PR for, and I’ll also look at moving from the deprecated thermostat component to the newer climate one.

heatmiser.xml (7.5 KB)

Well had some time this weekend so ported this over to a climate device and corrected my spelling. Hoping to get my hands on a Neostat-e towards the end of the month so I can add support for multiple stats on one controller. Let me know if you have any feedback.

Hi, firstly thanks for you work on this so far, I was just wondering if there had been any further progress getting this working with multiple Neostats?
I’ve currently got 5 Neostat-e connected to my hub and whilst it appears to find them all they are all reporting the data from the first zone that was added.

I’m happy to be a guinea pig to test any further updates you have :slight_smile:

Hi all,

Sorry for the lack of updates. I’ve not got a second Neostat so far so haven’t made any progress on this one.

I’ll pick this up again when I have some funding to do so.


I’ve spent some time looking at this and spoke with another developer and I think I have some working code for the update.

    def update(self):
    """ Get Updated Info. """
    _LOGGER.debug("Entered update(self)")
    response = self.json_request({"INFO": "0"})
    if response:
        # Add handling for mulitple thermostats here
        _LOGGER.debug("update() json response: %s " % response)
        # self._name = device['device']
        for device in response['devices']:
          if self._name == device['device']:
            tmptempfmt = device["TEMPERATURE_FORMAT"]
            if (tmptempfmt == False) or (tmptempfmt.upper() == "C"):
              self._temperature_unit = TEMP_CELSIUS
              self._temperature_unit = TEMP_FAHRENHEIT
            self._away = device['AWAY']
            self._target_temperature =  round(float(device["CURRENT_SET_TEMPERATURE"]), 2)
            self._current_temperature = round(float(device["CURRENT_TEMPERATURE"]), 2)
    return False

I’ve personally tested this and it returns the correct data for my five thermostats, hopefully this will be of help for someone else.

Thanks for sharing the code. I’ve merged your pull request. It seems sensible and seems to work with a single thermostat as well.

Hi NeoHub-owners :slight_smile:

I have my own heatmiser neohub support, which i’ve just put here: https://github.com/RJ/heatmiser-neohub.py (functional, but work-in-progress)

I query the hub for all data and cache it, neostat device objects have a reference to the hub and read from its cached data. Any update calls are debounced / cached for 15secs, so the hub isn’t queried once for each neostat device.

Sort of supports neoplugs too, but no switch UI for them yet. (works on cli)

Away mode is implemented as “frost” on the neostats.

They correctly report the current operation (idle or heating).

Next step is probably a custom UI card that uses more heatmisery concepts instead of the generic hass thermostat UI.
Every smart thermostat seems to use different terminology for similar things, but perhaps not quite similar enough for a generic UI to be good enough. Would be nice to set the hold/target/frost (not even heatmiser docs name these consistently…) temps independently.

Hope this is useful to someone. Would be nice to get neohub support into hass for real some time. I’m still trying to get my head around how the async updates are supposed to work, and how to schedule them.


Thanks for working on this R_J I’m about to pickup some heatmise thermostats so im loving that there is someone working on the integration with home assistant and not to mention its all local control! Do you know if the thermostats work with radiator heaters too?

Hey guys, has anyone had a go at these https://www.heatmisershop.co.uk/wifi-thermostats/ I might grab one and have a crack.

Thank you R_J for working on this. As a Heatmiser NeoStat owner, I would be very interested in this. I have 2x NeoStat-e, 1x Neostat ultra and a NeoStat-Air with boiler control, as well as a NeoPlug and would like to be able to integrate controlling them with other Smart Home devices.
I am currently new to HA and have limited experience with Python. Once I have got my installation of HA working and have got my head around it, I’d like to look at this. Please post any updates on it.

Just installed this and up and running straight away.

I’ve actaully got the Solfex version running which are just white-labelled heatmisers.

Running neohub and 3 stats.

Apologies - old thread I know! I need ot buy a couple of electric underfloor heating thermostats / probs which I need to get integrated into HA.

Could anyone recommend what to gt from the store and which component to use - this custom one or the one in HA itself?



I’ve managed to get this setup for 3 neostat version2 and a Neohub version2 using the code the original poster provided, but with a slight adaptation.

I’m running Hassio so had to install it in a ‘custom_components/climate’ (rather than thermostat) and changing the config to:


platform: heatmiserneo
host: XXX.XXX.X.XX
port: 4242
debug: True

1 Like

Issue i’m getting now is it’s not reporting the current operation (idle or heating), I’m just getting UNKNOWN in the ‘state’ of the entity.#

Any ideas?