MindrustUK / Heatmiser-for-home-assistant

Heatmiser Neo-Hub / Neostat support for home-assistant.io
87 stars 30 forks source link

Make thermostat's hvac capabilities configurable #78

Open robcos opened 3 years ago

robcos commented 3 years ago

https://github.com/MindrustUK/Heatmiser-for-home-assistant/pull/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 commented 3 years ago
Screenshot 2021-06-25 at 14 10 03
Trouble-51 commented 3 years ago

These are configurable in e.g. the “simple thermostat” app, but that may not be true for other apps

On 25 Jun 2021, at 14:12, Roberto Cosenza @.***> wrote:



— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub, or unsubscribe.

gadget78 commented 3 years ago

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 commented 3 years ago

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 commented 3 years ago

@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 commented 3 years ago

I'm I’m out of town until the 20th so I can’t help with that right now

On Wed, 4 Aug 2021 at 18:12, leaskovski @.***> wrote:

@robcos https://github.com/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.

— You are receiving this because you were mentioned.

Reply to this email directly, view it on GitHub https://github.com/MindrustUK/Heatmiser-for-home-assistant/issues/78#issuecomment-892788305, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAAP3ZSOL2RS32OCMGNTEE3T3FRH3ANCNFSM47J3KZKQ . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&utm_campaign=notification-email .

leaskovski commented 3 years ago

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 commented 3 years ago

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 commented 3 years ago

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 commented 3 years ago

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 commented 3 years ago

@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 commented 3 years ago

This I believe addresses the issue of only setting the hvac mode if the device lists that mode as part of its available modes. https://github.com/lynchdonala/Heatmiser-for-home-assistant/commit/40b6802a7e9b259911a7851ee759ee98a19f6432

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

robcos commented 3 years ago

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 commented 2 years ago

@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 commented 2 years ago

@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)?

leaskovski commented 2 years ago

@jfparis and @lynchdonala it looks similar to the changes I made in my branch of the code...

https://github.com/leaskovski/Heatmiser-for-home-assistant/commit/7d829f53e4273cc4b0c1e1d668ce3441d03c21e5 with a bug fix: https://github.com/leaskovski/Heatmiser-for-home-assistant/commit/8483288a4def187d1922e87bcb8cb5d5d7569362

jfparis commented 2 years ago

@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 commented 2 years ago

@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 commented 2 years ago

@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 commented 2 years ago

@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 commented 2 years ago

I only have heating stats (plus a timer for the hot water)

On Fri, 29 Oct 2021 at 14:29, Jean-François Paris @.***> wrote:

@ribbal https://github.com/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

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/MindrustUK/Heatmiser-for-home-assistant/issues/78#issuecomment-954745332, or unsubscribe https://github.com/notifications/unsubscribe-auth/AHKF5QVQZODVZ2JJCIMJPETUJKVUBANCNFSM47J3KZKQ . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

ribbal commented 2 years ago

I've created a PR (https://github.com/MindrustUK/Heatmiser-for-home-assistant/pull/85), which will hopefully make things better.

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

jfparis commented 2 years ago

Thanks @ribbal

stikonas commented 2 years ago

I guess this can be closed now

robcos commented 2 years ago

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 commented 2 years ago

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 commented 2 years ago

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

robcos commented 2 years ago

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 commented 2 years ago

@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 commented 2 years ago

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 commented 2 years ago

Added the ability to manually configure (override default) HVAC modes, in this PR https://github.com/MindrustUK/Heatmiser-for-home-assistant/pull/103

image

image

Restart HA, after changing any of the settings.

MindrustUK commented 2 years ago

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

robcos commented 2 years ago

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

MindrustUK commented 2 weeks ago

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

MindrustUK commented 1 week ago

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