Official Honeywell evohome/Round Thermostat integration (EU-only)

Not trying to be a smartass, but most of the things you’ve asked me to do, I already mentioned I did in my original post. (The only thing I hadn’t done was check the v1 evohome client)

But I did manage to figure it out. The v1 client was giving me an invalid password error instead of the invalid grant. Now I knew for 100% that the password was correct (as I had logged in with it already multiple times the past few days).

So i figured something must be going wrong with the special characters in the password. As it had all 3 of these in it: &@!

After changing the password on both accounts, they did work with the pythone evohome client (both v1 and v2).

Maybe honeywell changed the password rules to allow special characters somewhere along the way, but the client wasn’t updated for that?

That’s great you’re online.

I suspect there’s an issue with the & character - maybe you could submit an issue at

or

and one of us will sort it out.

Dug a bit more, but I get the feeling its a honeywell issue. For some reason their API just throws invalid password errors around when you have a & in a password. I tried creating a session manually on the v1 api while knowing the password is correct, and it still gives me an invalid password error.

Do they not use the same v1 or v2 API for their own website? As those passwords seem to work fine there.

Here you go

Yeah, I’m working on the batteries. About 6 TRV’s decided to go low at the same time.

To be clear - did you:
a) use the evohomeclient library via Python, or
b) use the Honeywell RESTful API via (say) CURL?

I suspect that if using a), the & has to be escaped.

I don’t know!

I did B, using Postman. Because after looking at the evohomeclient code I was not convinced the problem was there. There didn’t seem to be much string mangling going on.

I think you’ve got it right.

If you’re keen -could you work out how to escape the & char in the headers/post-data & I can update the python libraries, otherwise (no bother) I’ll come up with a workaround, to throw a more useful warning, either in the client library, or the HA component.

I think you’ll have to do the more useful warning anyway, because the password is in the json in the body, so as far as I know it does not need to be escaped?

OK, I’ll do that - thanks for your help.

Hi @zxdavb, quick question, if you were to implement turning down the heat based on open windows, how would you do it? I’ve tried a number of different ways, from turning off the heat, to storing the temperature in a variable, but I can’t really get something that will get me back 100% of the time to the state that the heating was in before… I will lose the time on my previous temporary override, for example, if I add another temporary override for the window being open. What are the cases that can be used that will put the heating back in the state where it was before?

Also, I know there is some functionality in the TRV to hook up an external window sensor, do you think we could somehow trigger that from the component?

The HR92s have an (optional) open window function, as an alternative to the (optional) open window sensor you allude to - if enabled, it is triggered on the basis of a significant drop in ambient temperature.

AFAIK, open window mode has no place in the Public/RESTful API - so no options there.

I think it would be a bad idea to implement an openwindow mode via HA - but I was thinking of a variable ecomode offset, rather than the fixed 3C from the controller - but there is some recent activity from the (new) vendor about this - the vendor is no longer Honeywell, but Resideo - see:

I guess you could do something with HA integrating a window sensor with evohome outpoints via automatons - you could record the current state, and restore it later, etc. - I’ll leave that up to others to explore.

You can track (and even trigger) open window mode via evohome_RF, using a nanoCUL with (something like) evofw3 on it.

The problem with the TRV’s open window function is that it waits for a certain drop in temperature and then sets it for 30 minutes as a fixed time, which is kind of dumb. In my rooms that have round thermostats, it rarely detects it because they are on the other side of the room. And 30 minutes is never really the right amount of time. If we could emulate the window sensor that feeds into it, I would hope we could do it for the duration that the window is open. Maybe I will try to write an appdaemon to do this.

Hey I got this in the log today if it’s interesting to you:



Logger: evohome.logger
Source: /usr/local/lib/python3.7/site-packages/evohome/message.py:1026
First occurred: July 6, 2020, 3:58:32 AM (21 occurrences)
Last logged: July 6, 2020, 3:59:34 AM

    EXCEPTION, raw_packet = >>> 045 RP --- 01:158182 04:136489 --:------ 313F 009 00FCB10004060707E4 <<<
    EXCEPTION, raw_packet = >>> 045 RP --- 01:158182 04:136505 --:------ 313F 009 00FCB10004060707E4 <<<
    EXCEPTION, raw_packet = >>> 045 RP --- 01:158182 04:136495 --:------ 313F 009 00FCB50004060707E4 <<<
    EXCEPTION, raw_packet = >>> 045 RP --- 01:158182 04:136481 --:------ 313F 009 00FCB90004060707E4 <<<
    EXCEPTION, raw_packet = >>> 045 RP --- 01:158182 04:136485 --:------ 313F 009 00FC870104060707E4 <<<

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/evohome/message.py", line 1019, in payload
    self._payload = payload_parser(self.raw_payload) if payload_parser else None
  File "/usr/local/lib/python3.7/site-packages/evohome/message.py", line 708, in sync_datetime
    return {"datetime": _dt(payload[4:18])}
  File "/usr/local/lib/python3.7/site-packages/evohome/message.py", line 311, in _dt
    second=int(seqx[:2], 16),
ValueError: second must be in 0..59

Thanks for reporting this.

This is a known issue & has already been fixed in the newest library. It is because the unused 8th bit is used to indicate DST (summer time).

It is not clear to me whether this issue was caused by the very latest evohome firmware, or only became apparent after DST started - I think the former, but it could have been the later.

Anyway, this error shouldn’t cause any issue with your system, as this payload is not used by HA.

hey all,
did something change in the attributes at all?
i had a load of templates for reporting the status based on “hvac_action” however i dont see this as an attirbute any more?

      radiator_status_bathroom:
        friendly_name: "Radiator Status: Bathroom"
        value_template: "{{ state_attr('climate.bathroom', 'hvac_action') }}"    

my bad, im an idiot

The hvac_action() property has been removed from Evohome zones as this data was inaccurate - the algorithm used to provide this data was not reliable, and there is no reasonable hope for a satisfactory alternative.

You will have no indication if a zone is actively calling for heat ( CURRENT_HVAC_* ), nor if the heat source is currently active. However, you will continue to have the hvac_mode() property, which will indicate if the heating is enabled, or not ( HVAC_MODE_* ).

This will be most obvious by the absence of this information in the UI.

There is no intervention required for this breaking change.

(@zxdavb - #38244) (evohome docs)

1 Like

its a shame this happened, i found that always worked well for me, to establish if a RAD was actually on or not. this was helpful to see what came on/off during the day or if a room was heating and a window was open (eg. close that window)

anyone got a workaround for if a rad is actually “on” on or not?

1 Like

I wrote the original code, and made the recent decision to remove it. You can see from the graphs above how inaccurate it is: see where the lightning strike is point - the room is clearly getting warming, but HA believes the zone is not calling for heat!

I should never have put this code into HA, sorry.

When I first wrote the hvac_action() code, I knew it was a bit ropey, but I thought I’d work out a way of making it accurate later on… This proved not to be the case.

The good news is that the upcoming evohome_rf integration will do this, flawlessly.

In the meantime, you can simply reproduce the original functionality in your automations (it will be just as accurate):

def hvac_action(self) -> Optional[str]:	
    """Return the current running hvac operation if supported."""	
    if self._evo_tcs.systemModeStatus["mode"] == EVO_HEATOFF:	
        return CURRENT_HVAC_OFF	
    if self.target_temperature <= self.min_temp:	
        return CURRENT_HVAC_OFF	
    if not self._evo_device.temperatureStatus["isAvailable"]:	
        return None	
    if self.target_temperature <= self.current_temperature:	
        return CURRENT_HVAC_IDLE	
    return CURRENT_HVAC_HEAT	

In short: the room is calling for heat if: a) the heating is on (and there’s a tweak for things like openwindow mode), and b) the target temp is lower than the current temp.

1 Like

Please see the new project here:
https://community.home-assistant.io/t/honeywell-evohome-via-rf-hgi80-hgs80

1 Like

Hi David,

I’m having a very strange problem which I don’t understand at all that I’m hoping you might be able to shed some light on. Every night at either 00:47 or 01:47, the heat in my daughter’s room is getting turned off, and as far as I can tell, there’s nothing in anything I’ve configured that is doing it. I have searched and none of my automations or schedules ever turn the heat off anywhere, they always turn it to minimum 12 degrees. Could you possibly take a look at the below snippet of when it happens and tell me any idea you may have what could be causing it?? Thanks.

2020-09-07 00:43:26 DEBUG (MainThread) [homeassistant.components.evohome] Status = {'locationId': '3184115', 'gateways': [{'gatewayId': '2937956', 'temperatureControlSystems': [{'systemId': '4187037', 'zones': [{'zoneId': '4187036', 'temperatureStatus': {'temperature': 24.0, 'isAvailable': True}, 'activeFaults': [], 'setpointStatus': {'targetHeatTemperature': 25.0, 'setpointMode': 'FollowSchedule'}, 'name': 'Living Room'}, {'zoneId': '4217766', 'temperatureStatus': {'temperature': 21.0, 'isAvailable': True}, 'activeFaults': [], 'setpointStatus': {'targetHeatTemperature': 19.0, 'setpointMode': 'TemporaryOverride', 'until': '2020-09-08T00:29:00+02:00'}, 'name': 'Dining Room'}, {'zoneId': '4217767', 'temperatureStatus': {'temperature': 20.5, 'isAvailable': True}, 'activeFaults': [], 'setpointStatus': {'targetHeatTemperature': 17.0, 'setpointMode': 'TemporaryOverride', 'until': '2020-09-08T00:29:00+02:00'}, 'name': 'Entrance'}, {'zoneId': '4217768', 'temperatureStatus': {'temperature': 21.0, 'isAvailable': True}, 'activeFaults': [], 'setpointStatus': {'targetHeatTemperature': 21.0, 'setpointMode': 'TemporaryOverride', 'until': '2020-09-08T00:29:00+02:00'}, 'name': 'Laundry room'}, {'zoneId': '4217769', 'temperatureStatus': {'temperature': 22.5, 'isAvailable': True}, 'activeFaults': [], 'setpointStatus': {'targetHeatTemperature': 21.0, 'setpointMode': 'TemporaryOverride', 'until': '2020-09-08T00:29:00+02:00'}, 'name': "Sebastian's Room"}, {'zoneId': '4217770', 'temperatureStatus': {'temperature': 22.5, 'isAvailable': True}, 'activeFaults': [], 'setpointStatus': {'targetHeatTemperature': 5.0, 'setpointMode': 'TemporaryOverride', 'until': '2020-09-08T00:29:00+02:00'}, 'name': "Sophie's Room"}, {'zoneId': '4217771', 'temperatureStatus': {'temperature': 22.0, 'isAvailable': True}, 'activeFaults': [], 'setpointStatus': {'targetHeatTemperature': 20.0, 'setpointMode': 'TemporaryOverride', 'until': '2020-09-08T00:29:00+02:00'}, 'name': 'Guest Bedroom'}, {'zoneId': '4217772', 'temperatureStatus': {'temperature': 22.5, 'isAvailable': True}, 'activeFaults': [{'faultType': 'TempZoneActuatorLowBattery', 'since': '2020-08-26T04:39:38'}, {'faultType': 'TempZoneActuatorCommunicationLost', 'since': '2020-08-29T14:06:37'}], 'setpointStatus': {'targetHeatTemperature': 21.0, 'setpointMode': 'TemporaryOverride', 'until': '2020-09-08T00:29:00+02:00'}, 'name': 'Master Closet'}, {'zoneId': '4217773', 'temperatureStatus': {'temperature': 22.5, 'isAvailable': True}, 'activeFaults': [{'faultType': 'TempZoneActuatorLowBattery', 'since': '2020-08-26T04:51:10'}], 'setpointStatus': {'targetHeatTemperature': 21.0, 'setpointMode': 'TemporaryOverride', 'until': '2020-09-07T22:29:00Z'}, 'name': 'Master Bedroom'}, {'zoneId': '4217774', 'temperatureStatus': {'temperature': 19.0, 'isAvailable': True}, 'activeFaults': [], 'setpointStatus': {'targetHeatTemperature': 17.0, 'setpointMode': 'TemporaryOverride', 'until': '2020-09-08T00:29:00+02:00'}, 'name': 'Garage'}, {'zoneId': '4217775', 'temperatureStatus': {'temperature': 21.0, 'isAvailable': True}, 'activeFaults': [], 'setpointStatus': {'targetHeatTemperature': 21.0, 'setpointMode': 'TemporaryOverride', 'until': '2020-09-07T22:29:00Z'}, 'name': 'Office & Library'}, {'zoneId': '4217776', 'temperatureStatus': {'temperature': 23.0, 'isAvailable': True}, 'activeFaults': [{'faultType': 'TempZoneSensorCommunicationLost', 'since': '2020-08-25T19:45:28'}], 'setpointStatus': {'targetHeatTemperature': 21.0, 'setpointMode': 'TemporaryOverride', 'until': '2020-09-07T22:29:00Z'}, 'name': 'Master Bath'}], 'activeFaults': [], 'systemModeStatus': {'mode': 'DayOff', 'isPermanent': True}}], 'activeFaults': []}]}
2020-09-07 00:43:26 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=climate.sophie_s_room, old_state=<state climate.sophie_s_room=heat; hvac_modes=['off', 'heat'], min_temp=5.0, max_temp=25.0, preset_modes=['none', 'temporary', 'permanent'], current_temperature=23.0, temperature=21.0, hvac_action=idle, preset_mode=temporary, status=setpoints=this_sp_from=2020-09-06T21:30:00+02:00, this_sp_temp=21.5, next_sp_from=2020-09-07T06:30:00+02:00, next_sp_temp=23.0, zone_id=4217770, active_faults=[], setpoint_status=target_heat_temperature=21.0, setpoint_mode=TemporaryOverride, until=2020-09-08T00:29:00+02:00, temperature_status=temperature=22.5, is_available=True, friendly_name=Sophie's Room, icon=mdi:radiator, supported_features=17 @ 2020-09-07T00:30:02.310637+02:00>, new_state=<state climate.sophie_s_room=off; hvac_modes=['off', 'heat'], min_temp=5.0, max_temp=25.0, preset_modes=['none', 'temporary', 'permanent'], current_temperature=23.0, temperature=5.0, hvac_action=off, preset_mode=temporary, status=setpoints=this_sp_from=2020-09-06T21:30:00+02:00, this_sp_temp=21.5, next_sp_from=2020-09-07T06:30:00+02:00, next_sp_temp=23.0, zone_id=4217770, active_faults=[], setpoint_status=target_heat_temperature=5.0, setpoint_mode=TemporaryOverride, until=2020-09-08T00:29:00+02:00, temperature_status=temperature=22.5, is_available=True, friendly_name=Sophie's Room, icon=mdi:radiator, supported_features=17 @ 2020-09-07T00:43:26.838813+02:00>>