Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: Make thermostat's HVAC capabilities (Heat, Cool, Fan, etc.) configurable #78

Open
robcos opened this issue Jun 25, 2021 · 44 comments

Comments

@robcos
Copy link
Contributor

robcos commented Jun 25, 2021

#75 adds support for new hvac modes. These modes are hardcoded however there are 2 minor problems with this:

  1. Some hardware thermostats may not support some modes
  2. Even though a thermostat has support for something, it does not mean that the user has equipment to actually use that mode. For example, if the thermostat may support HVAC_MODE_FAN_ONLY but the user may have no fans.

In both cases, we should not show modes/ui for modes that are not meaningful to the user.

The easiest is to provide some configuration, per thermostat. Bonus would be to infer the default configuration for point 1 at least.

@robcos
Copy link
Contributor Author

robcos commented Jun 25, 2021

Screenshot 2021-06-25 at 14 10 03

@Trouble-51
Copy link

Trouble-51 commented Jun 29, 2021 via email

@gadget78
Copy link

gadget78 commented Jul 13, 2021

yes after updating, i too am having issues with it listing all these other modes..
as i only have heat, but its putting itself into fan mode :( which it doesnt have :(
how can we manually turn these off or set the hvac_modes ?

going to the 3 dots menu, and selecting "heat" in options, doesn't seem to work, it jumps back to fan mode only ..
the 'off' works, and its showing the right temperature ok, but desired/set temp isnt right with the outer slider :(
althou i can see in the history read out, that the set/desired heat IS being read within that correctly, but it doesn't get changed when moving slide about... ..

EDIT .........
ok manually editing line 42 of climate.py file, removing the modes that's are not needed, DOES remove them from the displays/menus etc so that's a workaround that DOES work :)
but im sadly still not able to get mine working it seems, doesn't switch over to "heat" mode properly, still does show as fan only when you select heat :(

@leaskovski
Copy link
Contributor

I came here to report the same issue with my "heat" mode only thermostats not allowing me to use them properly. They are reporting their details ok, but no target temp is being reported, and the set temp slider isn't available, because they are showing up as heat mode.

@leaskovski
Copy link
Contributor

@robcos do you have a data capture for your thermostats that support heating and cooling? I want to compare this to stats that do heating only so we can make sure we set the hvac_mode property when loading in the stats.

@robcos
Copy link
Contributor Author

robcos commented Aug 4, 2021 via email

@leaskovski
Copy link
Contributor

leaskovski commented Aug 5, 2021

Righty, so I had a look at what was coming out of my stats, and on my Hub (using your neohubapi example code), my stats get listed as...

        {
            "ACTIVE_LEVEL": 2,
            "ACTIVE_PROFILE": 0,
            "ACTUAL_TEMP": "23.8",
            "AVAILABLE_MODES": [
                "heat"
            ],
            "AWAY": false,
            "COOL_MODE": false,
            "COOL_ON": false,
            "COOL_TEMP": 0,
            "CURRENT_FLOOR_TEMPERATURE": 127,
            "DATE": "thursday",
            "DEVICE_ID": 1,
            "FAN_CONTROL": "Automatic",
            "FAN_SPEED": "Off",
            "FLOOR_LIMIT": false,
            "HC_MODE": "VENT",
            "HEAT_MODE": true,
            "HEAT_ON": false,
            "HOLD_COOL": 0,
            "HOLD_OFF": true,
            "HOLD_ON": false,
            "HOLD_TEMP": 12,
            "HOLD_TIME": "0:00",
            "HOLIDAY": false,
            "LOCK": false,
            "LOW_BATTERY": false,
            "MANUAL_OFF": true,
            "MODELOCK": false,
            "MODULATION_LEVEL": 0,
            "OFFLINE": false,
            "PIN_NUMBER": "0000",
            "PREHEAT_ACTIVE": false,
            "RECENT_TEMPS": [<ive blanked this>],
            "SET_TEMP": "18.0",
            "STANDBY": false,
            "SWITCH_DELAY_LEFT": "0:00",
            "TEMPORARY_SET_FLAG": false,
            "THERMOSTAT": true,
            "TIME": "10:45",
            "TIMER_ON": false,
            "WINDOW_OPEN": false,
            "WRITE_COUNT": 5,
            "ZONE_NAME": "Kitchen"
        },

In this you can see the API reports the stats as vents, which isn't right, so I think it might be a bug with their API which we might have to work around.

That said, looking at the Hub details...

{
    "ALT_TIMER_FORMAT": 2,
    "CORF": "C",
    "DEVICE_ID": "NeoHub",
    "DST_AUTO": true,
    "DST_ON": true,
    "FORMAT": 2,
    "GDEVLIST": [
        1,
        2,
        3,
        4,
        5
    ],
    "GLOBAL_HC_MODE": "heating",
    "GLOBAL_SYSTEM_TYPE": "HeatOnly",
    "HEATING_LEVELS": 4,
    "HUB_TYPE": 1,
    "HUB_VERSION": 2110,
    "NTP_ON": "Running",
    "PARTITION": "4",
    "TIMESTAMP": 0,
    "TIMEZONESTR": null,
    "TIME_ZONE": 0.0,
    "UTC": 1628157834
}

You can see that the global heating mode (GLOBAL_HC_MODE) is set to heating. So I wonder if the individual stats should be overridden by the global stat?

It will be interesting to see what yours comes back with for these, as mine is an older version I think.

Edit:
Im wondering if the global system is set to HEATONLY, when the individual stats report VENT, then the stat HVAC_MODE should be set to HVAC_MODE_HEAT?

@leaskovski
Copy link
Contributor

I have fired an email to Heatmiser support as I think this is an issue with their API. We can override the VENT value for stats that only have a supported mode of heating, but we shouldn't have to. Lets see what they come back with.

@leaskovski
Copy link
Contributor

leaskovski commented Aug 6, 2021

So support came back to me to say that...

As you do not have any neoStat-HC stats on the system, you can ignore HC_MODE VENT. The app only utilises this if it is the correct "DEVICE_TYPE". It defaults to vent when not used.

So the HC_MODE is not applicable to some stats. Looking at device type (which has to be pulled using the {“GET_ENGINEERS”:0} command, it is my guess that only the HC device types should use HC_MODE, where as the others should just ignore it...
DEVICE TYPE ID NUMBERS
TCM = 01 <<<<< This is my device type
Wi-Fi STAT = SMARTSTAT = 02
COOLSWITCH = 03
TCM-RH = 04
WDS = 05
NEOPLUG = 06
NEOAIR = 07
Smart Stat HC = 08
NeoAir HW = 09 (combined model)
REPEATER = 10
NEOSTAT - HC =11
Neostat-V2 = 12
Neoair V2 =13
Remote Air sensor =14
NeoAir-V2 combined mode = 15
RF Switch Wifi = 16
Edge wifi thermostat = 17

I think only device types 8 and 11 need to use HC MODE.

Edit....

Im still of the opinion though that stats supported hvac_modes should be set in relation to what is in the AVAILABLE_MODES property of the stat data.

@gadget78
Copy link

gadget78 commented Aug 8, 2021

was trying to see how mine compared and get it fixed better !...
you said so I had a look at what was coming out of my stats, and on my Hub (using your neohubapi example code)
where abouts/how did you get these stats ?

@leaskovski
Copy link
Contributor

@gadget78 , I was using the repo for the neohubapi which this component now uses (https://gitlab.com/neohubapi/neohubapi). When you run the example.py code, it dumps all the data out to the command line window, so you can grab it from there.

@lynchdonala
Copy link
Contributor

lynchdonala commented Sep 14, 2021

This I believe addresses the issue of only setting the hvac mode if the device lists that mode as part of its available modes.
lynchdonala@40b6802

Works for my Neo Air thermostats allowing successful control via the thermostat card, which now only shows the 'heat' and 'Off'/'Standby' modes

@robcos
Copy link
Contributor Author

robcos commented Sep 14, 2021

Thanks @lynchdonala, LGTM.

That's an improvement. We should still make the modes configurable though as some modes may be available in the thermostat but not in the actual home (e.g. fan mode)

@jfparis
Copy link

jfparis commented Oct 28, 2021

@lynchdonala I tested your patch on the neoStat V2 (only available mode is heading) and it works great
Would strongly suggest you put a pull request

@jfparis
Copy link

jfparis commented Oct 29, 2021

@lynchdonala one caveat though. your code relies on the assumption that the possible values AVAILABLE_MODES are the same than the one used by homeassistant climate integration
"heat" is the same but I cannot find a list of the other possible values in heatmiser API documentation. Have you seen some dumps from the newest thermostat (the one with fans)?

@jfparis
Copy link

jfparis commented Oct 29, 2021

@leaskovski
Need to review and test but I am not sure what you want to update self._hvac_modes every time. Shouldn't that be set up once and for all when the component is initialised?
Maybe there is a case there: I need to test this with maybe one of the thermostat unavailable at startup and see if it updates later on

@leaskovski
Copy link
Contributor

@jfparis I can't remember why I did it like that, but it was probably to do it with the least amount of code changes! lol. Yes, in theory I can't see why these settings would change normally, so only when the thermostat is initialised, would it really need to be set.

@ribbal
Copy link
Contributor

ribbal commented Oct 29, 2021

@jfparis @leaskovski I've tested the changes proposed by @leaskovski, and I've found that they don't work (for me). I got it to work with some minor changes. Below are the changes I made:

  1. I moved the self._hvac_modes = block of code to the __init__ method (as per @jfparis's comment above) and replaced thermostat with neostat
  2. the self._hvac_modes = HVAC_MODE_OFF needs to be a list; so, I replaced this code with self._hvac_modes = [HVAC_MODE_OFF]
  3. again in the self._hvac_modes = block of code (now in the __init__ method), the | operator doesn't work as expected; I replaced the code to use append e.g. self._hvac_modes = self._hvac_modes.append(HVAC_MODE_HEAT)

@jfparis
Copy link

jfparis commented Oct 29, 2021

@ribbal
I am not fully surprised re 2 and 3. I was actually googling in the background because | is not an operator that I used very often but I wanted to test in the evening before commenting

What type of thermostat do you have? Fan / HVAC capable or just heating? Mine is just heating so it would be good if a FAN /HVAC person could test it

Looks like we have a solution to the bug and all we need is a PR

@ribbal
Copy link
Contributor

ribbal commented Oct 29, 2021 via email

@ribbal
Copy link
Contributor

ribbal commented Oct 29, 2021

I've created a PR (#85), which will hopefully make things better.

Thanks to @leaskovski for doing the initial work and prompting me to have a look.

@jfparis
Copy link

jfparis commented Oct 29, 2021

Thanks @ribbal

@stikonas
Copy link
Contributor

stikonas commented Jan 4, 2022

I guess this can be closed now

@robcos
Copy link
Contributor Author

robcos commented Jan 6, 2022

I don't think this solves the issue I pointed out.
What I was talking about is the use case where the thermostat supports a mode but I have no use for that mode.
For example, my thermostats have a vent mode but I have no fan in my house so I'd rather not see the option to put the thermostat in vent mode at all.

In other words, I think we have fixed (1) from my original issue but (2) is still pending

@ribbal
Copy link
Contributor

ribbal commented Jan 6, 2022

Hi @robcos, this is what I am seeing for my neoStats:
image

Please could you post an image of what you see using latest version of this Heatmiser integration (is it still the same as your original screenshot dated 25th June 2021 - I did experience the same last year, but not any longer)?

Could it be that the settings of your stats are set to support multiple modes (heat, fan, cool, etc) and this is simply being reflected in homeassistant?

@ribbal
Copy link
Contributor

ribbal commented Jan 6, 2022

@robcos, please could you post your debug logs here?

@robcos
Copy link
Contributor Author

robcos commented Jan 6, 2022

Yes, @ribbal it is because the thermostat supports "VENT" (and afaik it can't be changed) but I have no vent facility in my home.

I think what you are experiencing is different - let me explain it better, once more.

Your change is reading the different modes that the thermostat supports - that's great. Without your change, we would simply hardcode all modes - no matter what hardware thermostat you have.

Nevertheless, there are thermostats that support a lot of modes (e.g. Neostat HC) but that does not mean that the user has the actual facilities supported by the thermostat. Specifically, you may have a VENT thermostat but no fans in the house so, ideally, home assistant should be configured not to show the VENT icon. I'm not saying that home assistant should automatically detect this (it's impossible) but rather we should give the user the opportunity to hide the mode. Note that clicking the "vent" button actually puts the thermostat in a non-working state so it is quite bad from a user point of view

@ribbal
Copy link
Contributor

ribbal commented Jan 6, 2022

@robcos, ahh I see; I don't have any Neostat HCs.

Looking at the manual (see: https://www.heatmiser.com/en/digital-thermostats-manual-finder/), is it possible for you to disable the Fan/VENT from the Feature Menu (Feature 10 'System Type')?

@robcos
Copy link
Contributor Author

robcos commented Jan 7, 2022

Good hint! Unfortunately it does not do what we were hoping for (would have been great to be able to disable the vent in the hardward thermostat). I did some debugging and this is the result:

Feature 10 Description available_modes
1 2 Pipe System, Selectable Heat or Cool only [heat', 'vent']
2 2 Pipe System, Cool only ['cool', 'vent']
3 2 Pipe System Heat & Cool (fans for Cool only) ['heat', 'vent']
4 4 Pipe System Heat, Cool & Auto ['heat', 'vent']
5 2 Pipe System Cooling & 2 Stage Heating ['heat', 'vent']

As you can see, the thermostat almost always returns ['heat', 'vent'] which is incorrect.
It also means that the current implementation, I believe, has broken the cooling functionality for us HC users as the thermostat never returns ['heat', 'cool'] :-(

One full instance of the logs:

2022-01-07 22:47:42 DEBUG (MainThread) [custom_components.heatmiserneo] devices_data: {'thermostats': [NeoStat(_logger=<HassLogger neohub (INFO)>, _data_=namespace(ACTIVE_LEVEL=2, ACTIVE_PROFILE=0, ACTUAL_TEMP='23.3', AVAILABLE_MODES=['heat', 'vent'], AWAY=False, COOL_MODE=False, COOL_ON=False, COOL_TEMP=127.5, CURRENT_FLOOR_TEMPERATURE=127.5, DATE='friday', DEVICE_ID=1, FAN_CONTROL='Manual', FAN_SPEED='Off', FLOOR_LIMIT=False, HC_MODE='HEATING', HEAT_MODE=True, HEAT_ON=False, HOLD_COOL=127.5, HOLD_OFF=True, HOLD_ON=False, HOLD_TEMP=35, HOLD_TIME='0:00', HOLIDAY=False, LOCK=False, LOW_BATTERY=False, MANUAL_OFF=True, MODELOCK=False, MODULATION_LEVEL=0, OFFLINE=False, PIN_NUMBER='0000', PREHEAT_ACTIVE=False, PRG_TEMP=0, PRG_TIMER=False, RECENT_TEMPS=['22.6', '22.5', '22.5', '22.4', '22.4', '22.4', '22.3', '22.3', '22.3', '22.3', '22.3', '22.3', '22.3', '22.4', '22.4', '22.3', '22.3', '22.3', '22.3', '22.3', '22.3', '22.3', '22.3', '22.3', '22.3', '22.3', '22.3', '22.3', '22.2', '22.2', '22.2', '22.2', '22.3', '22.3', '22.4', '22.4', '22.4', '22.5', '22.6', '22.7', '22.6', '22.7', '22.8', '22.8', '22.7', '22.9', '23.1', '23.2', '23.4', '23.3', '23.3', '23.3', '23.3', '23.3', '23.7', '23.7', '23.8', '24.0', '24.2', '24.2', '24.1', '24.2', '24.2', '24.1', '24.1', '24.3', '24.4', '24.2', '24.0', '23.9', '23.8', '23.8', '23.7', '23.6', '23.5', '23.4', '23.4', '23.4', '23.4', '23.5', '23.5', '23.6', '23.8', '23.8', '24.0', '24.0', '23.9', '23.8', '23.7', '23.7', '23.6', '23.6', '23.5', '23.5', '23.5', '23.4'], RELATIVE_HUMIDITY=0, SET_TEMP='12.0', STANDBY=True, SWITCH_DELAY_LEFT='0:00', TEMPORARY_SET_FLAG=False, THERMOSTAT=True, TIME='22:47', TIMER_ON=False, WINDOW_OPEN=False, WRITE_COUNT=118, ZONE_NAME='Basement Laundry'), _hub=<neohubapi.neohub.NeoHub object at 0x7fda28ee5ac0>, _simple_attrs=('active_level', 'active_profile', 'available_modes', 'away', 'cool_on', 'cool_temp', 'current_floor_temperature', 'date', 'device_id', 'fan_control', 'fan_speed', 'floor_limit', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'fan_control', 'fan_speed', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'hold_off', 'hold_on', 'hold_temp', 'hold_time', 'holiday', 'lock', 'low_battery', 'manual_off', 'modelock', 'modulation_level', 'offline', 'pin_number', 'preheat_active', 'prg_temp', 'prg_timer', 'standby', 'switch_delay_left', 'temporary_set_flag', 'time', 'timer_on', 'window_open', 'write_count'), active_level=2, active_profile=0, available_modes=['heat', 'vent'], away=False, cool_on=False, cool_temp=127.5, current_floor_temperature=127.5, date='friday', device_id=1, fan_control='Manual', fan_speed='Off', floor_limit='Basement Laundry', hc_mode='HEATING', heat_mode=True, heat_on=False, hold_cool=127.5, hold_off=True, hold_on=False, hold_temp=35, hold_time=datetime.timedelta(0), holiday=False, lock=False, low_battery=False, manual_off=True, modelock=False, modulation_level=0, offline=False, pin_number=0, preheat_active=0, prg_temp=0, prg_timer=False, standby=True, switch_delay_left=datetime.timedelta(0), temporary_set_flag=False, time=datetime.timedelta(seconds=82020), timer_on=False, window_open=False, write_count=118, name='Basement Laundry', target_temperature='12.0', temperature='23.3', weekday=<Weekday.FRIDAY: 'friday'>), NeoStat(_logger=<HassLogger neohub (INFO)>, _data_=namespace(ACTIVE_LEVEL=1, ACTIVE_PROFILE=0, ACTUAL_TEMP='21.6', AVAILABLE_MODES=['heat', 'vent'], AWAY=False, COOL_MODE=False, COOL_ON=False, COOL_TEMP=127.5, CURRENT_FLOOR_TEMPERATURE=127.5, DATE='friday', DEVICE_ID=2, FAN_CONTROL='Automatic', FAN_SPEED='Off', FLOOR_LIMIT=False, HC_MODE='HEATING', HEAT_MODE=True, HEAT_ON=False, HOLD_COOL=30, HOLD_OFF=True, HOLD_ON=False, HOLD_TEMP=28, HOLD_TIME='0:00', HOLIDAY=False, LOCK=False, LOW_BATTERY=False, MANUAL_OFF=True, MODELOCK=False, MODULATION_LEVEL=0, OFFLINE=False, PIN_NUMBER='0000', PREHEAT_ACTIVE=False, PRG_TEMP=0, PRG_TIMER=False, RECENT_TEMPS=['21.3', '21.3', '21.3', '21.3', '21.3', '21.3', '21.2', '21.3', '21.2', '21.3', '21.2', '21.2', '21.3', '21.3', '21.3', '21.2', '21.2', '21.2', '21.2', '21.2', '21.2', '21.2', '21.2', '21.2', '21.2', '21.2', '21.2', '21.2', '21.1', '21.1', '21.1', '21.1', '21.1', '21.2', '21.2', '21.2', '21.2', '21.3', '21.3', '21.4', '21.3', '21.4', '21.5', '21.4', '21.4', '21.5', '21.6', '21.6', '21.7', '21.7', '21.8', '21.7', '21.8', '21.8', '22.3', '22.3', '22.1', '22.2', '22.3', '22.4', '22.2', '22.2', '22.2', '22.2', '22.1', '22.2', '22.2', '22.2', '22.1', '22.2', '22.1', '22.2', '22.1', '22.1', '22.0', '22.0', '22.0', '21.9', '22.0', '22.0', '22.0', '22.0', '22.1', '22.1', '22.2', '22.2', '22.0', '21.9', '21.8', '21.8', '21.7', '21.7', '21.6', '21.6', '21.7', '21.6'], RELATIVE_HUMIDITY=0, SET_TEMP='12.0', STANDBY=True, SWITCH_DELAY_LEFT='0:00', TEMPORARY_SET_FLAG=False, THERMOSTAT=True, TIME='22:47', TIMER_ON=False, WINDOW_OPEN=False, WRITE_COUNT=112, ZONE_NAME='Basement Bathroom'), _hub=<neohubapi.neohub.NeoHub object at 0x7fda28ee5ac0>, _simple_attrs=('active_level', 'active_profile', 'available_modes', 'away', 'cool_on', 'cool_temp', 'current_floor_temperature', 'date', 'device_id', 'fan_control', 'fan_speed', 'floor_limit', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'fan_control', 'fan_speed', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'hold_off', 'hold_on', 'hold_temp', 'hold_time', 'holiday', 'lock', 'low_battery', 'manual_off', 'modelock', 'modulation_level', 'offline', 'pin_number', 'preheat_active', 'prg_temp', 'prg_timer', 'standby', 'switch_delay_left', 'temporary_set_flag', 'time', 'timer_on', 'window_open', 'write_count'), active_level=1, active_profile=0, available_modes=['heat', 'vent'], away=False, cool_on=False, cool_temp=127.5, current_floor_temperature=127.5, date='friday', device_id=2, fan_control='Automatic', fan_speed='Off', floor_limit='Basement Bathroom', hc_mode='HEATING', heat_mode=True, heat_on=False, hold_cool=30, hold_off=True, hold_on=False, hold_temp=28, hold_time=datetime.timedelta(0), holiday=False, lock=False, low_battery=False, manual_off=True, modelock=False, modulation_level=0, offline=False, pin_number=0, preheat_active=0, prg_temp=0, prg_timer=False, standby=True, switch_delay_left=datetime.timedelta(0), temporary_set_flag=False, time=datetime.timedelta(seconds=82020), timer_on=False, window_open=False, write_count=112, name='Basement Bathroom', target_temperature='12.0', temperature='21.6', weekday=<Weekday.FRIDAY: 'friday'>), NeoStat(_logger=<HassLogger neohub (INFO)>, _data_=namespace(ACTIVE_LEVEL=1, ACTIVE_PROFILE=0, ACTUAL_TEMP='20.5', AVAILABLE_MODES=['heat', 'vent'], AWAY=False, COOL_MODE=False, COOL_ON=False, COOL_TEMP=127.5, CURRENT_FLOOR_TEMPERATURE=127.5, DATE='friday', DEVICE_ID=3, FAN_CONTROL='Automatic', FAN_SPEED='Off', FLOOR_LIMIT=False, HC_MODE='HEATING', HEAT_MODE=True, HEAT_ON=False, HOLD_COOL=23, HOLD_OFF=True, HOLD_ON=False, HOLD_TEMP=35, HOLD_TIME='0:00', HOLIDAY=False, LOCK=False, LOW_BATTERY=False, MANUAL_OFF=True, MODELOCK=False, MODULATION_LEVEL=0, OFFLINE=False, PIN_NUMBER='0000', PREHEAT_ACTIVE=False, PRG_TEMP=0, PRG_TIMER=False, RECENT_TEMPS=['19.1', '19.1', '19.1', '19.1', '19.1', '19.2', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.0', '19.1', '19.0', '19.0', '19.0', '19.0', '19.0', '19.0', '19.0', '19.0', '19.0', '19.0', '18.9', '19.0', '18.9', '19.0', '19.0', '19.0', '19.0', '19.0', '19.0', '19.0', '19.0', '19.0', '19.0', '19.0', '19.0', '19.0', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.2', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.0', '19.1', '19.1', '19.1', '19.1', '19.1', '19.1', '19.2', '19.2', '19.2', '19.4', '19.6', '19.8', '20.0', '20.1', '20.2', '20.3', '20.4', '20.4', '20.5'], RELATIVE_HUMIDITY=0, SET_TEMP='12.0', STANDBY=True, SWITCH_DELAY_LEFT='0:00', TEMPORARY_SET_FLAG=False, THERMOSTAT=True, TIME='22:47', TIMER_ON=False, WINDOW_OPEN=False, WRITE_COUNT=96, ZONE_NAME='Basement Room'), _hub=<neohubapi.neohub.NeoHub object at 0x7fda28ee5ac0>, _simple_attrs=('active_level', 'active_profile', 'available_modes', 'away', 'cool_on', 'cool_temp', 'current_floor_temperature', 'date', 'device_id', 'fan_control', 'fan_speed', 'floor_limit', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'fan_control', 'fan_speed', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'hold_off', 'hold_on', 'hold_temp', 'hold_time', 'holiday', 'lock', 'low_battery', 'manual_off', 'modelock', 'modulation_level', 'offline', 'pin_number', 'preheat_active', 'prg_temp', 'prg_timer', 'standby', 'switch_delay_left', 'temporary_set_flag', 'time', 'timer_on', 'window_open', 'write_count'), active_level=1, active_profile=0, available_modes=['heat', 'vent'], away=False, cool_on=False, cool_temp=127.5, current_floor_temperature=127.5, date='friday', device_id=3, fan_control='Automatic', fan_speed='Off', floor_limit='Basement Room', hc_mode='HEATING', heat_mode=True, heat_on=False, hold_cool=23, hold_off=True, hold_on=False, hold_temp=35, hold_time=datetime.timedelta(0), holiday=False, lock=False, low_battery=False, manual_off=True, modelock=False, modulation_level=0, offline=False, pin_number=0, preheat_active=0, prg_temp=0, prg_timer=False, standby=True, switch_delay_left=datetime.timedelta(0), temporary_set_flag=False, time=datetime.timedelta(seconds=82020), timer_on=False, window_open=False, write_count=96, name='Basement Room', target_temperature='12.0', temperature='20.5', weekday=<Weekday.FRIDAY: 'friday'>), NeoStat(_logger=<HassLogger neohub (INFO)>, _data_=namespace(ACTIVE_LEVEL=0, ACTIVE_PROFILE=0, ACTUAL_TEMP='20.9', AVAILABLE_MODES=['heat', 'vent'], AWAY=False, COOL_MODE=False, COOL_ON=False, COOL_TEMP=18, CURRENT_FLOOR_TEMPERATURE=127.5, DATE='friday', DEVICE_ID=4, FAN_CONTROL='Automatic', FAN_SPEED='Off', FLOOR_LIMIT=False, HC_MODE='HEATING', HEAT_MODE=True, HEAT_ON=False, HOLD_COOL=23, HOLD_OFF=True, HOLD_ON=False, HOLD_TEMP=17, HOLD_TIME='0:00', HOLIDAY=False, LOCK=False, LOW_BATTERY=False, MANUAL_OFF=True, MODELOCK=False, MODULATION_LEVEL=0, OFFLINE=False, PIN_NUMBER='0000', PREHEAT_ACTIVE=False, PRG_TEMP=0, PRG_TIMER=False, RECENT_TEMPS=['20.6', '20.5', '20.5', '20.5', '20.5', '20.5', '20.4', '20.4', '20.4', '20.4', '20.3', '20.3', '20.3', '20.3', '20.3', '20.3', '20.3', '20.2', '20.2', '20.2', '20.2', '20.2', '20.2', '20.1', '20.2', '20.2', '20.1', '20.1', '20.1', '20.3', '21.0', '21.4', '21.6', '21.6', '21.7', '21.7', '21.8', '21.8', '21.9', '22.0', '22.0', '21.8', '21.2', '20.8', '20.6', '20.7', '21.2', '20.9', '20.8', '20.8', '20.7', '20.8', '20.8', '20.8', '20.7', '20.8', '20.8', '20.9', '20.9', '20.9', '20.8', '20.9', '20.9', '20.9', '20.9', '20.9', '20.9', '21.1', '21.8', '22.1', '22.2', '22.3', '22.3', '22.4', '22.1', '22.0', '22.3', '22.4', '22.1', '22.0', '22.4', '22.3', '21.7', '21.4', '21.3', '21.2', '21.1', '21.1', '21.1', '21.1', '21.1', '21.0', '21.0', '21.0', '21.0', '20.9'], RELATIVE_HUMIDITY=0, SET_TEMP='19.0', STANDBY=False, SWITCH_DELAY_LEFT='0:00', TEMPORARY_SET_FLAG=True, THERMOSTAT=True, TIME='22:47', TIMER_ON=False, WINDOW_OPEN=False, WRITE_COUNT=1, ZONE_NAME='Ground Floor Kitchen'), _hub=<neohubapi.neohub.NeoHub object at 0x7fda28ee5ac0>, _simple_attrs=('active_level', 'active_profile', 'available_modes', 'away', 'cool_on', 'cool_temp', 'current_floor_temperature', 'date', 'device_id', 'fan_control', 'fan_speed', 'floor_limit', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'fan_control', 'fan_speed', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'hold_off', 'hold_on', 'hold_temp', 'hold_time', 'holiday', 'lock', 'low_battery', 'manual_off', 'modelock', 'modulation_level', 'offline', 'pin_number', 'preheat_active', 'prg_temp', 'prg_timer', 'standby', 'switch_delay_left', 'temporary_set_flag', 'time', 'timer_on', 'window_open', 'write_count'), active_level=0, active_profile=0, available_modes=['heat', 'vent'], away=False, cool_on=False, cool_temp=18, current_floor_temperature=127.5, date='friday', device_id=4, fan_control='Automatic', fan_speed='Off', floor_limit='Ground Floor Kitchen', hc_mode='HEATING', heat_mode=True, heat_on=False, hold_cool=23, hold_off=True, hold_on=False, hold_temp=17, hold_time=datetime.timedelta(0), holiday=False, lock=False, low_battery=False, manual_off=True, modelock=False, modulation_level=0, offline=False, pin_number=0, preheat_active=0, prg_temp=0, prg_timer=False, standby=False, switch_delay_left=datetime.timedelta(0), temporary_set_flag=True, time=datetime.timedelta(seconds=82020), timer_on=False, window_open=False, write_count=1, name='Ground Floor Kitchen', target_temperature='19.0', temperature='20.9', weekday=<Weekday.FRIDAY: 'friday'>), NeoStat(_logger=<HassLogger neohub (INFO)>, _data_=namespace(ACTIVE_LEVEL=0, ACTIVE_PROFILE=0, ACTUAL_TEMP='23.6', AVAILABLE_MODES=['heat', 'vent'], AWAY=False, COOL_MODE=False, COOL_ON=False, COOL_TEMP=18, CURRENT_FLOOR_TEMPERATURE=127.5, DATE='friday', DEVICE_ID=5, FAN_CONTROL='Automatic', FAN_SPEED='Off', FLOOR_LIMIT=False, HC_MODE='HEATING', HEAT_MODE=True, HEAT_ON=False, HOLD_COOL=24.5, HOLD_OFF=True, HOLD_ON=False, HOLD_TEMP=22.5, HOLD_TIME='0:00', HOLIDAY=False, LOCK=False, LOW_BATTERY=False, MANUAL_OFF=True, MODELOCK=True, MODULATION_LEVEL=0, OFFLINE=False, PIN_NUMBER='0000', PREHEAT_ACTIVE=False, PRG_TEMP=0, PRG_TIMER=False, RECENT_TEMPS=['22.0', '21.9', '22.0', '21.9', '21.9', '21.9', '21.8', '21.8', '21.8', '21.8', '21.8', '21.8', '21.7', '21.8', '21.8', '21.7', '21.7', '21.7', '21.7', '21.7', '21.6', '21.6', '21.6', '21.6', '21.6', '21.5', '21.5', '21.5', '21.5', '21.7', '22.4', '22.5', '22.2', '22.1', '22.6', '22.3', '22.1', '22.5', '22.6', '22.3', '22.5', '22.6', '22.4', '22.2', '22.0', '21.8', '22.1', '22.1', '22.1', '22.1', '22.2', '22.2', '22.1', '22.2', '22.1', '22.1', '22.1', '22.1', '22.2', '22.2', '22.0', '22.1', '22.1', '22.1', '22.1', '22.1', '22.1', '22.1', '22.1', '22.7', '22.5', '22.3', '22.2', '22.1', '22.1', '22.7', '22.7', '22.6', '22.5', '22.4', '22.4', '22.3', '22.3', '22.4', '22.4', '22.4', '22.4', '22.4', '22.4', '22.4', '22.4', '22.4', '22.4', '22.3', '22.4', '23.7'], RELATIVE_HUMIDITY=0, SET_TEMP='19.0', STANDBY=False, SWITCH_DELAY_LEFT='0:00', TEMPORARY_SET_FLAG=True, THERMOSTAT=True, TIME='22:47', TIMER_ON=False, WINDOW_OPEN=False, WRITE_COUNT=6, ZONE_NAME='Ground Floor Living Room'), _hub=<neohubapi.neohub.NeoHub object at 0x7fda28ee5ac0>, _simple_attrs=('active_level', 'active_profile', 'available_modes', 'away', 'cool_on', 'cool_temp', 'current_floor_temperature', 'date', 'device_id', 'fan_control', 'fan_speed', 'floor_limit', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'fan_control', 'fan_speed', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'hold_off', 'hold_on', 'hold_temp', 'hold_time', 'holiday', 'lock', 'low_battery', 'manual_off', 'modelock', 'modulation_level', 'offline', 'pin_number', 'preheat_active', 'prg_temp', 'prg_timer', 'standby', 'switch_delay_left', 'temporary_set_flag', 'time', 'timer_on', 'window_open', 'write_count'), active_level=0, active_profile=0, available_modes=['heat', 'vent'], away=False, cool_on=False, cool_temp=18, current_floor_temperature=127.5, date='friday', device_id=5, fan_control='Automatic', fan_speed='Off', floor_limit='Ground Floor Living Room', hc_mode='HEATING', heat_mode=True, heat_on=False, hold_cool=24.5, hold_off=True, hold_on=False, hold_temp=22.5, hold_time=datetime.timedelta(0), holiday=False, lock=False, low_battery=False, manual_off=True, modelock=True, modulation_level=0, offline=False, pin_number=0, preheat_active=0, prg_temp=0, prg_timer=False, standby=False, switch_delay_left=datetime.timedelta(0), temporary_set_flag=True, time=datetime.timedelta(seconds=82020), timer_on=False, window_open=False, write_count=6, name='Ground Floor Living Room', target_temperature='19.0', temperature='23.6', weekday=<Weekday.FRIDAY: 'friday'>), NeoStat(_logger=<HassLogger neohub (INFO)>, _data_=namespace(ACTIVE_LEVEL=0, ACTIVE_PROFILE=0, ACTUAL_TEMP='20.7', AVAILABLE_MODES=['heat', 'vent'], AWAY=False, COOL_MODE=False, COOL_ON=False, COOL_TEMP=18, CURRENT_FLOOR_TEMPERATURE=127.5, DATE='friday', DEVICE_ID=6, FAN_CONTROL='Automatic', FAN_SPEED='Off', FLOOR_LIMIT=False, HC_MODE='HEATING', HEAT_MODE=True, HEAT_ON=False, HOLD_COOL=23.5, HOLD_OFF=True, HOLD_ON=False, HOLD_TEMP=21.5, HOLD_TIME='0:00', HOLIDAY=False, LOCK=False, LOW_BATTERY=False, MANUAL_OFF=True, MODELOCK=False, MODULATION_LEVEL=0, OFFLINE=False, PIN_NUMBER='0000', PREHEAT_ACTIVE=False, PRG_TEMP=0, PRG_TIMER=False, RECENT_TEMPS=['20.4', '20.3', '20.3', '20.3', '20.3', '20.3', '20.9', '21.4', '21.4', '21.2', '21.0', '21.5', '21.5', '21.3', '21.1', '21.0', '20.9', '20.8', '20.8', '20.8', '20.7', '20.6', '20.6', '20.6', '20.6', '20.5', '20.5', '20.5', '20.5', '20.5', '20.5', '20.5', '20.5', '20.6', '21.1', '21.5', '21.4', '21.2', '21.0', '21.3', '21.7', '21.4', '21.2', '21.0', '20.9', '20.8', '21.0', '20.9', '21.0', '20.9', '21.0', '21.0', '21.0', '21.0', '21.0', '21.0', '21.0', '21.0', '20.9', '20.9', '20.8', '20.9', '20.8', '20.8', '20.8', '21.0', '21.5', '21.5', '21.1', '21.2', '21.6', '21.4', '21.2', '21.0', '21.3', '21.6', '21.4', '21.2', '21.1', '21.0', '20.9', '20.8', '21.0', '21.0', '21.0', '21.0', '21.0', '21.0', '20.9', '20.9', '20.9', '20.9', '20.9', '20.9', '20.8', '20.7'], RELATIVE_HUMIDITY=0, SET_TEMP='20.5', STANDBY=False, SWITCH_DELAY_LEFT='0:00', TEMPORARY_SET_FLAG=True, THERMOSTAT=True, TIME='22:47', TIMER_ON=False, WINDOW_OPEN=False, WRITE_COUNT=16, ZONE_NAME='First Floor Bedroom'), _hub=<neohubapi.neohub.NeoHub object at 0x7fda28ee5ac0>, _simple_attrs=('active_level', 'active_profile', 'available_modes', 'away', 'cool_on', 'cool_temp', 'current_floor_temperature', 'date', 'device_id', 'fan_control', 'fan_speed', 'floor_limit', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'fan_control', 'fan_speed', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'hold_off', 'hold_on', 'hold_temp', 'hold_time', 'holiday', 'lock', 'low_battery', 'manual_off', 'modelock', 'modulation_level', 'offline', 'pin_number', 'preheat_active', 'prg_temp', 'prg_timer', 'standby', 'switch_delay_left', 'temporary_set_flag', 'time', 'timer_on', 'window_open', 'write_count'), active_level=0, active_profile=0, available_modes=['heat', 'vent'], away=False, cool_on=False, cool_temp=18, current_floor_temperature=127.5, date='friday', device_id=6, fan_control='Automatic', fan_speed='Off', floor_limit='First Floor Bedroom', hc_mode='HEATING', heat_mode=True, heat_on=False, hold_cool=23.5, hold_off=True, hold_on=False, hold_temp=21.5, hold_time=datetime.timedelta(0), holiday=False, lock=False, low_battery=False, manual_off=True, modelock=False, modulation_level=0, offline=False, pin_number=0, preheat_active=0, prg_temp=0, prg_timer=False, standby=False, switch_delay_left=datetime.timedelta(0), temporary_set_flag=True, time=datetime.timedelta(seconds=82020), timer_on=False, window_open=False, write_count=16, name='First Floor Bedroom', target_temperature='20.5', temperature='20.7', weekday=<Weekday.FRIDAY: 'friday'>), NeoStat(_logger=<HassLogger neohub (INFO)>, _data_=namespace(ACTIVE_LEVEL=0, ACTIVE_PROFILE=0, ACTUAL_TEMP='20.3', AVAILABLE_MODES=['heat', 'vent'], AWAY=False, COOL_MODE=False, COOL_ON=False, COOL_TEMP=18, CURRENT_FLOOR_TEMPERATURE=127.5, DATE='friday', DEVICE_ID=7, FAN_CONTROL='Automatic', FAN_SPEED='Off', FLOOR_LIMIT=False, HC_MODE='HEATING', HEAT_MODE=True, HEAT_ON=False, HOLD_COOL=33, HOLD_OFF=True, HOLD_ON=False, HOLD_TEMP=21, HOLD_TIME='0:00', HOLIDAY=False, LOCK=False, LOW_BATTERY=False, MANUAL_OFF=True, MODELOCK=False, MODULATION_LEVEL=0, OFFLINE=False, PIN_NUMBER='0000', PREHEAT_ACTIVE=False, PRG_TEMP=0, PRG_TIMER=False, RECENT_TEMPS=['20.0', '19.9', '19.9', '19.9', '19.9', '19.8', '19.8', '19.8', '19.9', '19.9', '19.9', '19.9', '19.9', '19.9', '19.9', '19.9', '19.9', '19.8', '19.8', '19.8', '19.8', '19.8', '19.8', '19.8', '19.7', '19.8', '19.7', '19.7', '19.7', '19.8', '20.3', '20.6', '20.8', '20.9', '21.0', '21.0', '21.1', '21.2', '21.2', '21.2', '21.3', '21.3', '21.3', '21.4', '21.4', '21.3', '21.7', '21.2', '20.8', '21.0', '21.3', '21.3', '21.3', '21.3', '21.4', '21.4', '21.4', '21.4', '21.4', '21.4', '21.4', '21.3', '21.3', '21.4', '21.4', '21.3', '21.3', '21.3', '21.3', '21.3', '21.3', '21.3', '21.3', '21.3', '21.3', '21.3', '21.4', '21.4', '21.4', '21.5', '21.5', '21.5', '21.6', '21.6', '21.6', '21.6', '21.6', '21.6', '21.6', '21.5', '21.0', '20.7', '20.5', '20.4', '20.4', '20.3'], RELATIVE_HUMIDITY=0, SET_TEMP='18.0', STANDBY=False, SWITCH_DELAY_LEFT='0:00', TEMPORARY_SET_FLAG=True, THERMOSTAT=True, TIME='22:47', TIMER_ON=False, WINDOW_OPEN=False, WRITE_COUNT=160, ZONE_NAME='First Floor Bathroom'), _hub=<neohubapi.neohub.NeoHub object at 0x7fda28ee5ac0>, _simple_attrs=('active_level', 'active_profile', 'available_modes', 'away', 'cool_on', 'cool_temp', 'current_floor_temperature', 'date', 'device_id', 'fan_control', 'fan_speed', 'floor_limit', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'fan_control', 'fan_speed', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'hold_off', 'hold_on', 'hold_temp', 'hold_time', 'holiday', 'lock', 'low_battery', 'manual_off', 'modelock', 'modulation_level', 'offline', 'pin_number', 'preheat_active', 'prg_temp', 'prg_timer', 'standby', 'switch_delay_left', 'temporary_set_flag', 'time', 'timer_on', 'window_open', 'write_count'), active_level=0, active_profile=0, available_modes=['heat', 'vent'], away=False, cool_on=False, cool_temp=18, current_floor_temperature=127.5, date='friday', device_id=7, fan_control='Automatic', fan_speed='Off', floor_limit='First Floor Bathroom', hc_mode='HEATING', heat_mode=True, heat_on=False, hold_cool=33, hold_off=True, hold_on=False, hold_temp=21, hold_time=datetime.timedelta(0), holiday=False, lock=False, low_battery=False, manual_off=True, modelock=False, modulation_level=0, offline=False, pin_number=0, preheat_active=0, prg_temp=0, prg_timer=False, standby=False, switch_delay_left=datetime.timedelta(0), temporary_set_flag=True, time=datetime.timedelta(seconds=82020), timer_on=False, window_open=False, write_count=160, name='First Floor Bathroom', target_temperature='18.0', temperature='20.3', weekday=<Weekday.FRIDAY: 'friday'>), NeoStat(_logger=<HassLogger neohub (INFO)>, _data_=namespace(ACTIVE_LEVEL=0, ACTIVE_PROFILE=0, ACTUAL_TEMP='21.3', AVAILABLE_MODES=['heat', 'vent'], AWAY=False, COOL_MODE=False, COOL_ON=False, COOL_TEMP=18, CURRENT_FLOOR_TEMPERATURE=127.5, DATE='friday', DEVICE_ID=8, FAN_CONTROL='Automatic', FAN_SPEED='Off', FLOOR_LIMIT=False, HC_MODE='HEATING', HEAT_MODE=True, HEAT_ON=False, HOLD_COOL=26.5, HOLD_OFF=True, HOLD_ON=False, HOLD_TEMP=21, HOLD_TIME='0:00', HOLIDAY=False, LOCK=False, LOW_BATTERY=False, MANUAL_OFF=True, MODELOCK=False, MODULATION_LEVEL=0, OFFLINE=False, PIN_NUMBER='0000', PREHEAT_ACTIVE=False, PRG_TEMP=0, PRG_TIMER=False, RECENT_TEMPS=['21.0', '21.0', '21.0', '21.0', '21.0', '21.0', '21.0', '21.1', '21.1', '21.1', '21.1', '21.2', '21.2', '21.2', '21.3', '21.3', '21.2', '21.2', '21.2', '21.2', '21.2', '21.2', '21.2', '21.3', '21.3', '21.2', '21.2', '21.2', '21.2', '21.2', '21.2', '21.2', '21.2', '21.2', '21.1', '21.2', '21.2', '21.5', '22.2', '22.0', '21.7', '21.6', '21.6', '21.6', '21.5', '21.5', '21.8', '21.6', '21.8', '21.8', '21.9', '21.8', '21.8', '21.9', '21.9', '21.9', '21.8', '21.9', '21.9', '21.8', '21.5', '21.7', '21.9', '21.9', '21.8', '21.8', '21.8', '21.8', '21.7', '21.7', '21.7', '21.7', '21.7', '21.7', '21.7', '21.7', '21.6', '21.5', '21.5', '21.4', '21.4', '21.4', '21.4', '21.5', '21.5', '21.5', '21.5', '21.5', '21.4', '21.4', '21.4', '21.4', '21.4', '21.4', '21.4', '21.4'], RELATIVE_HUMIDITY=0, SET_TEMP='18.0', STANDBY=False, SWITCH_DELAY_LEFT='0:00', TEMPORARY_SET_FLAG=True, THERMOSTAT=True, TIME='22:45', TIMER_ON=False, WINDOW_OPEN=False, WRITE_COUNT=64, ZONE_NAME='First Floor Master Bathroom'), _hub=<neohubapi.neohub.NeoHub object at 0x7fda28ee5ac0>, _simple_attrs=('active_level', 'active_profile', 'available_modes', 'away', 'cool_on', 'cool_temp', 'current_floor_temperature', 'date', 'device_id', 'fan_control', 'fan_speed', 'floor_limit', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'fan_control', 'fan_speed', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'hold_off', 'hold_on', 'hold_temp', 'hold_time', 'holiday', 'lock', 'low_battery', 'manual_off', 'modelock', 'modulation_level', 'offline', 'pin_number', 'preheat_active', 'prg_temp', 'prg_timer', 'standby', 'switch_delay_left', 'temporary_set_flag', 'time', 'timer_on', 'window_open', 'write_count'), active_level=0, active_profile=0, available_modes=['heat', 'vent'], away=False, cool_on=False, cool_temp=18, current_floor_temperature=127.5, date='friday', device_id=8, fan_control='Automatic', fan_speed='Off', floor_limit='First Floor Master Bathroom', hc_mode='HEATING', heat_mode=True, heat_on=False, hold_cool=26.5, hold_off=True, hold_on=False, hold_temp=21, hold_time=datetime.timedelta(0), holiday=False, lock=False, low_battery=False, manual_off=True, modelock=False, modulation_level=0, offline=False, pin_number=0, preheat_active=0, prg_temp=0, prg_timer=False, standby=False, switch_delay_left=datetime.timedelta(0), temporary_set_flag=True, time=datetime.timedelta(seconds=81900), timer_on=False, window_open=False, write_count=64, name='First Floor Master Bathroom', target_temperature='18.0', temperature='21.3', weekday=<Weekday.FRIDAY: 'friday'>), NeoStat(_logger=<HassLogger neohub (INFO)>, _data_=namespace(ACTIVE_LEVEL=0, ACTIVE_PROFILE=0, ACTUAL_TEMP='21.0', AVAILABLE_MODES=['heat', 'vent'], AWAY=False, COOL_MODE=False, COOL_ON=False, COOL_TEMP=18, CURRENT_FLOOR_TEMPERATURE=127.5, DATE='friday', DEVICE_ID=9, FAN_CONTROL='Automatic', FAN_SPEED='Low', FLOOR_LIMIT=False, HC_MODE='HEATING', HEAT_MODE=True, HEAT_ON=True, HOLD_COOL=23, HOLD_OFF=True, HOLD_ON=False, HOLD_TEMP=19, HOLD_TIME='0:00', HOLIDAY=False, LOCK=False, LOW_BATTERY=False, MANUAL_OFF=True, MODELOCK=False, MODULATION_LEVEL=0, OFFLINE=False, PIN_NUMBER='0000', PREHEAT_ACTIVE=False, PRG_TEMP=0, PRG_TIMER=False, RECENT_TEMPS=['21.0', '21.3', '21.5', '21.0', '21.2', '21.7', '21.8', '21.9', '21.6', '21.6', '22.1', '21.8', '21.5', '21.9', '21.8', '21.5', '21.3', '21.2', '21.1', '21.1', '21.1', '21.7', '21.7', '21.4', '21.3', '21.2', '21.1', '21.1', '21.5', '21.6', '21.4', '21.2', '21.1', '21.1', '21.2', '21.7', '21.5', '21.2', '21.3', '21.3', '21.1', '21.1', '21.1', '21.1', '20.9', '21.2', '21.7', '21.8', '21.9', '22.1', '22.2', '22.0', '22.3', '22.4', '22.4', '22.3', '22.1', '22.0', '21.9', '21.7', '21.7', '21.3', '21.1', '21.0', '20.8', '20.7', '20.7', '20.6', '20.5', '20.4', '20.4', '20.3', '20.2', '20.2', '20.1', '20.1', '20.0', '20.2', '20.8', '21.3', '21.5', '21.1', '21.2', '21.5', '21.2', '21.1', '21.5', '21.3', '21.0', '21.4', '21.5', '21.1', '21.2', '21.6', '21.4', '21.1'], RELATIVE_HUMIDITY=0, SET_TEMP='21.5', STANDBY=False, SWITCH_DELAY_LEFT='0:00', TEMPORARY_SET_FLAG=True, THERMOSTAT=True, TIME='22:46', TIMER_ON=False, WINDOW_OPEN=False, WRITE_COUNT=251, ZONE_NAME='First Floor Master Bedroom'), _hub=<neohubapi.neohub.NeoHub object at 0x7fda28ee5ac0>, _simple_attrs=('active_level', 'active_profile', 'available_modes', 'away', 'cool_on', 'cool_temp', 'current_floor_temperature', 'date', 'device_id', 'fan_control', 'fan_speed', 'floor_limit', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'fan_control', 'fan_speed', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'hold_off', 'hold_on', 'hold_temp', 'hold_time', 'holiday', 'lock', 'low_battery', 'manual_off', 'modelock', 'modulation_level', 'offline', 'pin_number', 'preheat_active', 'prg_temp', 'prg_timer', 'standby', 'switch_delay_left', 'temporary_set_flag', 'time', 'timer_on', 'window_open', 'write_count'), active_level=0, active_profile=0, available_modes=['heat', 'vent'], away=False, cool_on=False, cool_temp=18, current_floor_temperature=127.5, date='friday', device_id=9, fan_control='Automatic', fan_speed='Low', floor_limit='First Floor Master Bedroom', hc_mode='HEATING', heat_mode=True, heat_on=True, hold_cool=23, hold_off=True, hold_on=False, hold_temp=19, hold_time=datetime.timedelta(0), holiday=False, lock=False, low_battery=False, manual_off=True, modelock=False, modulation_level=0, offline=False, pin_number=0, preheat_active=0, prg_temp=0, prg_timer=False, standby=False, switch_delay_left=datetime.timedelta(0), temporary_set_flag=True, time=datetime.timedelta(seconds=81960), timer_on=False, window_open=False, write_count=251, name='First Floor Master Bedroom', target_temperature='21.5', temperature='21.0', weekday=<Weekday.FRIDAY: 'friday'>), NeoStat(_logger=<HassLogger neohub (INFO)>, _data_=namespace(ACTIVE_LEVEL=1, ACTIVE_PROFILE=0, ACTUAL_TEMP='17.1', AVAILABLE_MODES=['heat', 'vent'], AWAY=False, COOL_MODE=False, COOL_ON=False, COOL_TEMP=127.5, CURRENT_FLOOR_TEMPERATURE=127.5, DATE='friday', DEVICE_ID=10, FAN_CONTROL='Automatic', FAN_SPEED='Off', FLOOR_LIMIT=False, HC_MODE='HEATING', HEAT_MODE=True, HEAT_ON=False, HOLD_COOL=23, HOLD_OFF=True, HOLD_ON=False, HOLD_TEMP=19.5, HOLD_TIME='0:00', HOLIDAY=False, LOCK=False, LOW_BATTERY=False, MANUAL_OFF=True, MODELOCK=False, MODULATION_LEVEL=0, OFFLINE=False, PIN_NUMBER='0000', PREHEAT_ACTIVE=False, PRG_TEMP=0, PRG_TIMER=False, RECENT_TEMPS=['17.3', '17.1', '17.1', '17.1', '17.0', '16.8', '17.0', '17.0', '16.9', '16.9', '16.8', '16.8', '16.8', '16.8', '16.8', '16.7', '16.7', '16.7', '16.7', '16.7', '16.6', '16.5', '16.9', '17.1', '17.0', '16.9', '16.8', '16.8', '16.9', '16.9', '16.8', '16.7', '16.7', '16.7', '16.5', '17.0', '17.2', '16.9', '16.8', '16.6', '17.0', '17.1', '17.0', '16.9', '16.8', '16.8', '17.4', '17.2', '17.3', '17.1', '17.0', '17.2', '17.2', '17.3', '17.1', '17.0', '16.9', '17.0', '16.9', '16.9', '16.7', '17.1', '17.3', '16.9', '16.9', '16.9', '16.8', '16.7', '16.7', '17.5', '17.1', '17.0', '16.8', '16.7', '16.6', '17.1', '17.4', '17.1', '16.9', '17.0', '16.9', '16.8', '16.7', '16.7', '16.7', '16.6', '16.6', '16.6', '16.7', '17.2', '17.0', '16.9', '16.7', '16.6', '16.6', '16.7'], RELATIVE_HUMIDITY=0, SET_TEMP='17.0', STANDBY=True, SWITCH_DELAY_LEFT='0:00', TEMPORARY_SET_FLAG=False, THERMOSTAT=True, TIME='22:47', TIMER_ON=False, WINDOW_OPEN=False, WRITE_COUNT=100, ZONE_NAME='Second Floor Bedroom'), _hub=<neohubapi.neohub.NeoHub object at 0x7fda28ee5ac0>, _simple_attrs=('active_level', 'active_profile', 'available_modes', 'away', 'cool_on', 'cool_temp', 'current_floor_temperature', 'date', 'device_id', 'fan_control', 'fan_speed', 'floor_limit', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'fan_control', 'fan_speed', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'hold_off', 'hold_on', 'hold_temp', 'hold_time', 'holiday', 'lock', 'low_battery', 'manual_off', 'modelock', 'modulation_level', 'offline', 'pin_number', 'preheat_active', 'prg_temp', 'prg_timer', 'standby', 'switch_delay_left', 'temporary_set_flag', 'time', 'timer_on', 'window_open', 'write_count'), active_level=1, active_profile=0, available_modes=['heat', 'vent'], away=False, cool_on=False, cool_temp=127.5, current_floor_temperature=127.5, date='friday', device_id=10, fan_control='Automatic', fan_speed='Off', floor_limit='Second Floor Bedroom', hc_mode='HEATING', heat_mode=True, heat_on=False, hold_cool=23, hold_off=True, hold_on=False, hold_temp=19.5, hold_time=datetime.timedelta(0), holiday=False, lock=False, low_battery=False, manual_off=True, modelock=False, modulation_level=0, offline=False, pin_number=0, preheat_active=0, prg_temp=0, prg_timer=False, standby=True, switch_delay_left=datetime.timedelta(0), temporary_set_flag=False, time=datetime.timedelta(seconds=82020), timer_on=False, window_open=False, write_count=100, name='Second Floor Bedroom', target_temperature='17.0', temperature='17.1', weekday=<Weekday.FRIDAY: 'friday'>), NeoStat(_logger=<HassLogger neohub (INFO)>, _data_=namespace(ACTIVE_LEVEL=2, ACTIVE_PROFILE=0, ACTUAL_TEMP='19.3', AVAILABLE_MODES=['heat', 'vent'], AWAY=False, COOL_MODE=False, COOL_ON=False, COOL_TEMP=23, CURRENT_FLOOR_TEMPERATURE=127.5, DATE='friday', DEVICE_ID=11, FAN_CONTROL='Automatic', FAN_SPEED='Off', FLOOR_LIMIT=False, HC_MODE='HEATING', HEAT_MODE=True, HEAT_ON=False, HOLD_COOL=23, HOLD_OFF=True, HOLD_ON=False, HOLD_TEMP=20, HOLD_TIME='0:00', HOLIDAY=False, LOCK=False, LOW_BATTERY=False, MANUAL_OFF=True, MODELOCK=False, MODULATION_LEVEL=0, OFFLINE=False, PIN_NUMBER='0000', PREHEAT_ACTIVE=False, PRG_TEMP=0, PRG_TIMER=False, RECENT_TEMPS=['19.7', '19.5', '19.5', '19.5', '19.5', '19.4', '19.6', '19.5', '19.4', '19.4', '19.4', '19.4', '19.4', '19.4', '19.3', '19.3', '19.3', '19.3', '19.3', '19.3', '19.3', '19.2', '19.2', '19.2', '19.3', '19.3', '19.3', '19.3', '19.3', '19.3', '19.2', '19.2', '19.2', '19.2', '19.1', '19.4', '20.0', '19.9', '19.8', '19.7', '20.0', '20.1', '19.8', '19.8', '19.7', '19.7', '19.8', '19.7', '19.6', '19.5', '19.5', '19.5', '19.4', '19.4', '19.2', '19.2', '19.2', '19.2', '19.4', '20.1', '19.9', '19.7', '19.6', '19.5', '19.6', '19.5', '19.5', '19.4', '19.4', '19.5', '19.3', '19.2', '19.2', '19.2', '19.2', '19.3', '19.4', '19.3', '19.3', '19.3', '19.3', '19.2', '19.2', '19.2', '19.3', '19.3', '19.3', '19.3', '19.3', '19.3', '19.2', '19.2', '19.2', '19.2', '19.3', '19.3'], RELATIVE_HUMIDITY=0, SET_TEMP='20.0', STANDBY=False, SWITCH_DELAY_LEFT='0:00', TEMPORARY_SET_FLAG=False, THERMOSTAT=True, TIME='22:43', TIMER_ON=False, WINDOW_OPEN=False, WRITE_COUNT=89, ZONE_NAME='Second Floor Bathroom'), _hub=<neohubapi.neohub.NeoHub object at 0x7fda28ee5ac0>, _simple_attrs=('active_level', 'active_profile', 'available_modes', 'away', 'cool_on', 'cool_temp', 'current_floor_temperature', 'date', 'device_id', 'fan_control', 'fan_speed', 'floor_limit', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'fan_control', 'fan_speed', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'hold_off', 'hold_on', 'hold_temp', 'hold_time', 'holiday', 'lock', 'low_battery', 'manual_off', 'modelock', 'modulation_level', 'offline', 'pin_number', 'preheat_active', 'prg_temp', 'prg_timer', 'standby', 'switch_delay_left', 'temporary_set_flag', 'time', 'timer_on', 'window_open', 'write_count'), active_level=2, active_profile=0, available_modes=['heat', 'vent'], away=False, cool_on=False, cool_temp=23, current_floor_temperature=127.5, date='friday', device_id=11, fan_control='Automatic', fan_speed='Off', floor_limit='Second Floor Bathroom', hc_mode='HEATING', heat_mode=True, heat_on=False, hold_cool=23, hold_off=True, hold_on=False, hold_temp=20, hold_time=datetime.timedelta(0), holiday=False, lock=False, low_battery=False, manual_off=True, modelock=False, modulation_level=0, offline=False, pin_number=0, preheat_active=0, prg_temp=0, prg_timer=False, standby=False, switch_delay_left=datetime.timedelta(0), temporary_set_flag=False, time=datetime.timedelta(seconds=81780), timer_on=False, window_open=False, write_count=89, name='Second Floor Bathroom', target_temperature='20.0', temperature='19.3', weekday=<Weekday.FRIDAY: 'friday'>), NeoStat(_logger=<HassLogger neohub (INFO)>, _data_=namespace(ACTIVE_LEVEL=0, ACTIVE_PROFILE=0, ACTUAL_TEMP='20.2', AVAILABLE_MODES=['heat', 'vent'], AWAY=False, COOL_MODE=False, COOL_ON=False, COOL_TEMP=18, CURRENT_FLOOR_TEMPERATURE=127.5, DATE='friday', DEVICE_ID=12, FAN_CONTROL='Manual', FAN_SPEED='Off', FLOOR_LIMIT=False, HC_MODE='HEATING', HEAT_MODE=True, HEAT_ON=False, HOLD_COOL=23, HOLD_OFF=True, HOLD_ON=False, HOLD_TEMP=21, HOLD_TIME='0:00', HOLIDAY=False, LOCK=False, LOW_BATTERY=False, MANUAL_OFF=True, MODELOCK=False, MODULATION_LEVEL=0, OFFLINE=False, PIN_NUMBER='0000', PREHEAT_ACTIVE=False, PRG_TEMP=0, PRG_TIMER=False, RECENT_TEMPS=['20.0', '19.9', '19.9', '19.8', '19.8', '19.8', '19.8', '19.7', '19.7', '19.7', '19.6', '19.6', '19.6', '19.5', '19.5', '19.5', '19.5', '19.4', '19.5', '19.4', '19.4', '19.4', '19.4', '19.4', '19.3', '19.3', '19.3', '19.3', '19.3', '19.2', '19.2', '19.2', '19.2', '19.4', '19.7', '20.0', '20.2', '20.3', '20.5', '20.6', '20.5', '20.7', '20.7', '20.8', '20.4', '20.9', '20.8', '21.0', '21.1', '21.5', '21.4', '21.5', '21.8', '21.9', '22.0', '22.0', '21.9', '22.0', '22.1', '21.9', '21.9', '21.7', '21.7', '21.7', '21.7', '21.7', '21.8', '21.9', '21.9', '21.9', '21.9', '22.0', '22.0', '21.9', '21.6', '21.6', '21.4', '21.3', '21.2', '21.1', '21.1', '21.0', '20.9', '20.8', '20.7', '20.7', '20.7', '20.7', '20.6', '20.6', '20.5', '20.5', '20.4', '20.4', '20.3', '20.3'], RELATIVE_HUMIDITY=0, SET_TEMP='18.0', STANDBY=False, SWITCH_DELAY_LEFT='0:00', TEMPORARY_SET_FLAG=True, THERMOSTAT=True, TIME='22:45', TIMER_ON=False, WINDOW_OPEN=False, WRITE_COUNT=150, ZONE_NAME='Second Floor Study Francesca'), _hub=<neohubapi.neohub.NeoHub object at 0x7fda28ee5ac0>, _simple_attrs=('active_level', 'active_profile', 'available_modes', 'away', 'cool_on', 'cool_temp', 'current_floor_temperature', 'date', 'device_id', 'fan_control', 'fan_speed', 'floor_limit', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'fan_control', 'fan_speed', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'hold_off', 'hold_on', 'hold_temp', 'hold_time', 'holiday', 'lock', 'low_battery', 'manual_off', 'modelock', 'modulation_level', 'offline', 'pin_number', 'preheat_active', 'prg_temp', 'prg_timer', 'standby', 'switch_delay_left', 'temporary_set_flag', 'time', 'timer_on', 'window_open', 'write_count'), active_level=0, active_profile=0, available_modes=['heat', 'vent'], away=False, cool_on=False, cool_temp=18, current_floor_temperature=127.5, date='friday', device_id=12, fan_control='Manual', fan_speed='Off', floor_limit='Second Floor Study Francesca', hc_mode='HEATING', heat_mode=True, heat_on=False, hold_cool=23, hold_off=True, hold_on=False, hold_temp=21, hold_time=datetime.timedelta(0), holiday=False, lock=False, low_battery=False, manual_off=True, modelock=False, modulation_level=0, offline=False, pin_number=0, preheat_active=0, prg_temp=0, prg_timer=False, standby=False, switch_delay_left=datetime.timedelta(0), temporary_set_flag=True, time=datetime.timedelta(seconds=81900), timer_on=False, window_open=False, write_count=150, name='Second Floor Study Francesca', target_temperature='18.0', temperature='20.2', weekday=<Weekday.FRIDAY: 'friday'>), NeoStat(_logger=<HassLogger neohub (INFO)>, _data_=namespace(ACTIVE_LEVEL=0, ACTIVE_PROFILE=0, ACTUAL_TEMP='21.6', AVAILABLE_MODES=['heat', 'vent'], AWAY=False, COOL_MODE=False, COOL_ON=False, COOL_TEMP=18, CURRENT_FLOOR_TEMPERATURE=127.5, DATE='friday', DEVICE_ID=13, FAN_CONTROL='Automatic', FAN_SPEED='Off', FLOOR_LIMIT=False, HC_MODE='HEATING', HEAT_MODE=True, HEAT_ON=False, HOLD_COOL=23.5, HOLD_OFF=True, HOLD_ON=False, HOLD_TEMP=16, HOLD_TIME='0:00', HOLIDAY=False, LOCK=False, LOW_BATTERY=False, MANUAL_OFF=True, MODELOCK=False, MODULATION_LEVEL=0, OFFLINE=False, PIN_NUMBER='0000', PREHEAT_ACTIVE=False, PRG_TEMP=0, PRG_TIMER=False, RECENT_TEMPS=['21.4', '21.3', '21.3', '21.2', '21.2', '21.2', '21.2', '21.1', '21.1', '21.0', '21.0', '21.0', '21.0', '20.9', '20.9', '20.9', '20.9', '20.9', '20.9', '20.9', '20.8', '20.8', '20.8', '20.9', '20.8', '20.8', '20.8', '20.7', '20.7', '20.7', '20.6', '20.6', '20.7', '20.8', '21.3', '21.7', '21.9', '22.0', '22.2', '22.3', '22.2', '22.4', '22.4', '21.8', '21.8', '22.5', '22.7', '22.8', '23.1', '23.3', '23.6', '23.7', '23.8', '23.6', '23.9', '24.1', '24.2', '23.9', '23.7', '23.3', '23.2', '23.2', '23.2', '23.1', '23.1', '23.1', '23.1', '23.1', '23.0', '23.1', '23.0', '23.0', '22.9', '22.8', '22.9', '23.1', '23.0', '22.9', '22.8', '22.7', '22.6', '22.5', '22.4', '22.3', '22.2', '22.2', '22.1', '22.1', '22.0', '22.0', '21.9', '21.9', '21.8', '21.8', '21.7', '21.6'], RELATIVE_HUMIDITY=0, SET_TEMP='18.0', STANDBY=False, SWITCH_DELAY_LEFT='0:00', TEMPORARY_SET_FLAG=True, THERMOSTAT=True, TIME='22:46', TIMER_ON=False, WINDOW_OPEN=False, WRITE_COUNT=237, ZONE_NAME='Second Floor Study Roberto'), _hub=<neohubapi.neohub.NeoHub object at 0x7fda28ee5ac0>, _simple_attrs=('active_level', 'active_profile', 'available_modes', 'away', 'cool_on', 'cool_temp', 'current_floor_temperature', 'date', 'device_id', 'fan_control', 'fan_speed', 'floor_limit', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'fan_control', 'fan_speed', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'hold_off', 'hold_on', 'hold_temp', 'hold_time', 'holiday', 'lock', 'low_battery', 'manual_off', 'modelock', 'modulation_level', 'offline', 'pin_number', 'preheat_active', 'prg_temp', 'prg_timer', 'standby', 'switch_delay_left', 'temporary_set_flag', 'time', 'timer_on', 'window_open', 'write_count'), active_level=0, active_profile=0, available_modes=['heat', 'vent'], away=False, cool_on=False, cool_temp=18, current_floor_temperature=127.5, date='friday', device_id=13, fan_control='Automatic', fan_speed='Off', floor_limit='Second Floor Study Roberto', hc_mode='HEATING', heat_mode=True, heat_on=False, hold_cool=23.5, hold_off=True, hold_on=False, hold_temp=16, hold_time=datetime.timedelta(0), holiday=False, lock=False, low_battery=False, manual_off=True, modelock=False, modulation_level=0, offline=False, pin_number=0, preheat_active=0, prg_temp=0, prg_timer=False, standby=False, switch_delay_left=datetime.timedelta(0), temporary_set_flag=True, time=datetime.timedelta(seconds=81960), timer_on=False, window_open=False, write_count=237, name='Second Floor Study Roberto', target_temperature='18.0', temperature='21.6', weekday=<Weekday.FRIDAY: 'friday'>), NeoStat(_logger=<HassLogger neohub (INFO)>, _data_=namespace(ACTIVE_LEVEL=2, ACTIVE_PROFILE=0, ACTUAL_TEMP='18.4', AVAILABLE_MODES=['heat', 'vent'], AWAY=False, COOL_MODE=False, COOL_ON=False, COOL_TEMP=22, CURRENT_FLOOR_TEMPERATURE=127.5, DATE='friday', DEVICE_ID=14, FAN_CONTROL='Automatic', FAN_SPEED='Off', FLOOR_LIMIT=False, HC_MODE='HEATING', HEAT_MODE=True, HEAT_ON=False, HOLD_COOL=23, HOLD_OFF=True, HOLD_ON=False, HOLD_TEMP=22, HOLD_TIME='0:00', HOLIDAY=False, LOCK=False, LOW_BATTERY=False, MANUAL_OFF=True, MODELOCK=False, MODULATION_LEVEL=0, OFFLINE=False, PIN_NUMBER='0000', PREHEAT_ACTIVE=False, PRG_TEMP=0, PRG_TIMER=False, RECENT_TEMPS=['18.3', '18.2', '18.2', '18.2', '18.1', '18.1', '18.2', '18.1', '18.0', '18.1', '18.0', '18.0', '18.0', '18.0', '18.0', '18.0', '17.9', '18.0', '18.0', '18.0', '18.0', '17.9', '17.9', '17.9', '17.9', '17.8', '17.8', '17.8', '17.9', '17.8', '17.8', '17.8', '17.8', '17.9', '18.1', '18.3', '18.4', '18.4', '18.5', '18.5', '18.5', '18.6', '18.7', '19.2', '18.9', '18.9', '19.1', '19.2', '19.2', '19.2', '19.3', '19.5', '19.5', '19.5', '19.6', '19.7', '19.5', '19.7', '19.7', '19.7', '19.6', '19.7', '19.8', '19.7', '19.7', '19.7', '19.7', '19.6', '19.6', '19.6', '19.7', '19.7', '19.6', '19.5', '19.5', '19.3', '19.4', '19.3', '19.1', '19.0', '18.9', '18.8', '18.7', '18.7', '18.7', '18.7', '18.6', '18.6', '18.6', '18.6', '18.6', '18.5', '18.5', '18.5', '18.5', '18.4'], RELATIVE_HUMIDITY=0, SET_TEMP='15.0', STANDBY=False, SWITCH_DELAY_LEFT='0:00', TEMPORARY_SET_FLAG=False, THERMOSTAT=True, TIME='22:47', TIMER_ON=False, WINDOW_OPEN=False, WRITE_COUNT=93, ZONE_NAME='Loft Bedroom'), _hub=<neohubapi.neohub.NeoHub object at 0x7fda28ee5ac0>, _simple_attrs=('active_level', 'active_profile', 'available_modes', 'away', 'cool_on', 'cool_temp', 'current_floor_temperature', 'date', 'device_id', 'fan_control', 'fan_speed', 'floor_limit', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'fan_control', 'fan_speed', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'hold_off', 'hold_on', 'hold_temp', 'hold_time', 'holiday', 'lock', 'low_battery', 'manual_off', 'modelock', 'modulation_level', 'offline', 'pin_number', 'preheat_active', 'prg_temp', 'prg_timer', 'standby', 'switch_delay_left', 'temporary_set_flag', 'time', 'timer_on', 'window_open', 'write_count'), active_level=2, active_profile=0, available_modes=['heat', 'vent'], away=False, cool_on=False, cool_temp=22, current_floor_temperature=127.5, date='friday', device_id=14, fan_control='Automatic', fan_speed='Off', floor_limit='Loft Bedroom', hc_mode='HEATING', heat_mode=True, heat_on=False, hold_cool=23, hold_off=True, hold_on=False, hold_temp=22, hold_time=datetime.timedelta(0), holiday=False, lock=False, low_battery=False, manual_off=True, modelock=False, modulation_level=0, offline=False, pin_number=0, preheat_active=0, prg_temp=0, prg_timer=False, standby=False, switch_delay_left=datetime.timedelta(0), temporary_set_flag=False, time=datetime.timedelta(seconds=82020), timer_on=False, window_open=False, write_count=93, name='Loft Bedroom', target_temperature='15.0', temperature='18.4', weekday=<Weekday.FRIDAY: 'friday'>)], 'timeclocks': [NeoStat(_logger=<HassLogger neohub (INFO)>, _data_=namespace(ACTIVE_LEVEL=0, ACTIVE_PROFILE=0, ACTUAL_TEMP='0.0', AVAILABLE_MODES=['heat'], AWAY=False, COOL_MODE=False, COOL_ON=False, COOL_TEMP=0, CURRENT_FLOOR_TEMPERATURE=0, DATE='sunday', DEVICE_ID=18, FAN_CONTROL='Automatic', FAN_SPEED='Off', FLOOR_LIMIT=False, HC_MODE='VENT', HEAT_MODE=True, HEAT_ON=False, HOLD_COOL=0, HOLD_OFF=True, HOLD_ON=False, HOLD_TEMP=0, HOLD_TIME='0:00', HOLIDAY=False, LOCK=False, LOW_BATTERY=False, MANUAL_OFF=True, MODELOCK=False, MODULATION_LEVEL=0, OFFLINE=True, PIN_NUMBER='0000', PREHEAT_ACTIVE=False, PRG_TEMP=0, PRG_TIMER=False, RECENT_TEMPS=[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None], RELATIVE_HUMIDITY=0, SET_TEMP='0.0', STANDBY=False, SWITCH_DELAY_LEFT='0:00', TEMPORARY_SET_FLAG=False, TIME='0:00', TIMECLOCK=True, TIMER_ON=False, WINDOW_OPEN=False, WRITE_COUNT=0, ZONE_NAME='First Floor Master Bedroom Aux'), _hub=<neohubapi.neohub.NeoHub object at 0x7fda28ee5ac0>, _simple_attrs=('active_level', 'active_profile', 'available_modes', 'away', 'cool_on', 'cool_temp', 'current_floor_temperature', 'date', 'device_id', 'fan_control', 'fan_speed', 'floor_limit', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'fan_control', 'fan_speed', 'hc_mode', 'heat_mode', 'heat_on', 'hold_cool', 'hold_off', 'hold_on', 'hold_temp', 'hold_time', 'holiday', 'lock', 'low_battery', 'manual_off', 'modelock', 'modulation_level', 'offline', 'pin_number', 'preheat_active', 'prg_temp', 'prg_timer', 'standby', 'switch_delay_left', 'temporary_set_flag', 'time', 'timer_on', 'window_open', 'write_count'), active_level=0, active_profile=0, available_modes=['heat'], away=False, cool_on=False, cool_temp=0, current_floor_temperature=0, date='sunday', device_id=18, fan_control='Automatic', fan_speed='Off', floor_limit='First Floor Master Bedroom Aux', hc_mode='VENT', heat_mode=True, heat_on=False, hold_cool=0, hold_off=True, hold_on=False, hold_temp=0, hold_time=datetime.timedelta(0), holiday=False, lock=False, low_battery=False, manual_off=True, modelock=False, modulation_level=0, offline=True, pin_number=0, preheat_active=0, prg_temp=0, prg_timer=False, standby=False, switch_delay_left=datetime.timedelta(0), temporary_set_flag=False, time=datetime.timedelta(0), timer_on=False, window_open=False, write_count=0, name='First Floor Master Bedroom Aux', target_temperature='0.0', temperature='0.0', weekday=<Weekday.SUNDAY: 'sunday'>)]}

@ribbal
Copy link
Contributor

ribbal commented Jan 10, 2022

Added the ability to manually configure (override default) HVAC modes, in this PR #103

image

image

Restart HA, after changing any of the settings.

@MindrustUK
Copy link
Owner

Looks like this is feature complete. Leaving for a week for further comments before closing.

@robcos robcos closed this as completed Feb 25, 2022
@robcos
Copy link
Contributor Author

robcos commented Jun 16, 2022

I never had a way of properly testing this earlier and I am afraid it is pretty broken. I'm unable to even see the 2 temperatures once I use this version

@robcos robcos reopened this Jun 16, 2022
@MindrustUK
Copy link
Owner

Have started re-building this feature in dev. Keep an eye out for sometime in the future. This hasn't been forgotten.

@MindrustUK
Copy link
Owner

Have managed to score a neoStat-HC on eBay that I'll be adding to my test bed to further flesh out this feature.

@MindrustUK
Copy link
Owner

Need to expand const.py list to a dictionary which will include capabilities against correct products, then include custom configuration to enable / disable / select the desired feature subset as viable via persistent configuration within Home Assistant's registry.

@MindrustUK MindrustUK changed the title Make thermostat's hvac capabilities configurable Feature: Make thermostat's HVAC capabilities (Heat, Cool, Fan, etc.) configurable Oct 25, 2024
@MindrustUK
Copy link
Owner

This also falls into tech debt for features like DEVICE_TYPES_THAT_HAVE_BATTERIES = [2, 5, 13, 14] This should also be updated in the Heatmiser product dictionary in const.py so adding battery sensors can be evaluated against the device information which makes sustaining this feature cleaner.

@ocrease
Copy link
Collaborator

ocrease commented Dec 11, 2024

@robcos are you still monitoring this issue and do you still have your NeoStat HCs? If you do, would you be willing to try the latest pre-relase version and see how you get on?

@ocrease
Copy link
Collaborator

ocrease commented Dec 12, 2024

@MindrustUK I don't plan to work on this, but based on everything I've discovered in the past month, this is only relevant for NeoStat HCs and even then the only configuration required here is whether Fan Only / Vent is enabled. Enabling heating and/or cooling can be done elsewhere, but Vent mode is always an option on NeoStat HCs. This feature is only to support users who have a NeoStat HC but it has not fan to control.

@MindrustUK
Copy link
Owner

It's certainly one of the more complex use cases. I'll revisit this when I have time, I secured one of the the NeoStat HC devices a while back and having come this far it seems a shame not to complete the support.

@ocrease
Copy link
Collaborator

ocrease commented Jan 30, 2025

v3.1.0-beta.4 has been released which updates the Configure flow. It is only relevant for installations with NeoStat HC devices. For all other devices, only Heat (and Off) is supported so there is no configuration to do.

For NeoStat HC devices, the list of options depends on the GLOBAL_SYSTEM_TYPE.

  • For HeatOnly, only Heat and Fan Only (eg vent) are options
  • For CoolOnly, only Cool and Fan Only (eg vent) are options
  • Otherwise, all options are available - Heat, Cool, Auto and Fan Only

You can untick some options if they are not relevant on your installation.

I haven't got a NeoStat HC for real world testing. If any of you want to try it and feedback, that would be great. Please include the diagnostics output (from "Download Diagnostics") if you have any issues.

@MindrustUK
Copy link
Owner

Hi @ocrease I've given this a quick smoke test, everything looks good here for me. Tried the device control and configuring the options around it. All looking good here.

@ocrease
Copy link
Collaborator

ocrease commented Feb 1, 2025

Further improvements in v3.1.0-beta.6. See #254 for details. I think it is feature complete now, but I haven't got a NeoStat HC to test with.

@MindrustUK
Copy link
Owner

@ocrease quick smoke test shows everything working as I'd expect, as my NeostatHC is on a desk and not in "production" use, I'd have to wait for other users in the thread to confirm correct behavior.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

10 participants