home-assistant / core

:house_with_garden: Open source home automation that puts local control and privacy first.
https://www.home-assistant.io
Apache License 2.0
73.38k stars 30.64k forks source link

Honeywell TCC error when adjusting settings #78531

Closed JCrankWV closed 1 year ago

JCrankWV commented 2 years ago

The problem

When I attempt to change a temperature set point the attache error occurs, and the set point is not change. I have deleted and reinstalled the integration, but still getting the same error.

Thank you for any assistance.

What version of Home Assistant Core has the issue?

2022.08.6

What was the last working version of Home Assistant Core?

No response

What type of installation are you running?

Home Assistant OS

Integration causing the issue

honeywell total comfort

Link to integration documentation on our website

https://www.home-assistant.io/integrations/honeywell

Diagnostics information

No response

Example YAML snippet

No response

Anything in the logs that might be useful for us?

Logger: homeassistant.components.websocket_api.http.connection
Source: components/honeywell/climate.py:265 
Integration: Home Assistant WebSocket API (documentation, issues) 
First occurred: 7:52:36 AM (5 occurrences) 
Last logged: 7:56:53 AM

[547765684256] not enough arguments for format string
[547765689968] not enough arguments for format string
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 971, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/simplejson/__init__.py", line 525, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 370, in decode
    obj, end = self.raw_decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 400, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 429, in _resp_json
    return resp.json()
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 975, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/websocket_api/commands.py", line 200, in handle_call_service
    await hass.services.async_call(
  File "/usr/src/homeassistant/homeassistant/core.py", line 1738, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1775, in _execute_service
    await cast(Callable[[ServiceCall], Awaitable[None]], handler.job.target)(
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 204, in handle_service
    await service.entity_service_call(
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 676, in entity_service_call
    future.result()  # pop exception if have
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 931, in async_request_call
    await coro
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 713, in _handle_entity_call
    await result
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 588, in async_service_temperature_set
    await entity.async_set_temperature(**kwargs)
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 446, in async_set_temperature
    await self.hass.async_add_executor_job(
  File "/usr/local/lib/python3.10/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 265, in set_temperature
    self._device.setpoint_heat = temperature
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 212, in setpoint_heat
    self._client._set_thermostat_settings(self.deviceid,
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 491, in _set_thermostat_settings
    result = self._post_json(url, data=data)
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 455, in _post_json
    return self._request_json('post', *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 443, in _request_json
    return self._resp_json(resp, req)
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 433, in _resp_json
    _LOG.exception("Failed to de-JSON %s %s" % req, resp)
TypeError: not enough arguments for format string

Additional information

No response

probot-home-assistant[bot] commented 2 years ago

honeywell documentation honeywell source (message by IssueLinks)

probot-home-assistant[bot] commented 2 years ago

Hey there @rdfurman, mind taking a look at this issue as it has been labeled with an integration (honeywell) you are listed as a code owner for? Thanks! (message by CodeOwnersMention)

rdfurman commented 2 years ago

Huh, this is an odd one considering nothing has changed with the honeywell integration or somecomfort library. Are you able to set the temperature using https://www.mytotalconnectcomfort.com/portal?

JCrankWV commented 2 years ago

Yes sir the Honeywell website and app work fine.

ahagadorn commented 2 years ago

I can confirm this issue.

mrkfc commented 2 years ago

I'm getting the same error "Failed to call service climate/set_temperature. not enough arguments for format string". It works fine in the Honeywell My Total Comfort app. I'm not sure that it ever worked in HA. I haven't had it installed long and I'm a relatively new HA user. My HA is running on a Raspberry Pi. I can change the thermostat mode (off, heat, cool, fan) from the dashboard, but get the error when trying to change the temperature.

mrkfc commented 2 years ago

I've been experimenting with this problem further. I can change the mode with no "failed to call service" error. I can also raise and lower the temperature with no problem only when it does not exceed the scheduled set temperature. It will not go above the set temp for heat or below the set temp for cool. I'm using the Honeywell Total Connect Comfort (US) integration that I installed by clicking on the Add Integration button and have added the card to a dashboard. It seems that the code works, but not in all cases. I've also tried it in the card options screen with the Preset option set to None, Away and Hold. It works the same in all three. The "current temperature" doesn't seem to be a limiting factor. The scheduled set temperature is the limiting factor.

rdfurman commented 2 years ago

Are you able to set the temp higher than the scheduled heat setting (or lower than scheduled cool setting) with Honeywell website?

mrkfc commented 2 years ago

I'm sorry. I replied to the email instead of entering my reply here. Here is my reply. Yes. Everything works as it should in the Honeywell website and in the Honeywell app. The error "failed to call service climate/set.temperature. not enough arguments for format string" occurs when trying to exceed the set point, but works when changing down and up below the set point. This leads me to believe that there may be an additional parameter required when attempting to exceed the set temperature. Thanks for your attention to this. I'm not that experienced in Python.

rdfurman commented 2 years ago

Interesting. I just tried setting the temp in HASS above the scheduled temp with my setup and it created a temporary hold on the thermostat at the temp I set in HASS.

Now I'm wondering if this is the correct behavior. Should it have updated the scheduled set temp? I'll have to think on this for a bit.

Regardless, I'm not seeing that same error as you see. Maybe it's a difference in thermostat models?

mrkfc commented 2 years ago

I have the Honeywell RTH9585WF Smart Color Thermostat. The more I look, the worse it gets. When I use the card on a HA dashboard, I can change the temp on the ring (heat-down and/or up, but not above the set temp). I set it down to 65. Then when I look at the 3 dots menu, the temp is shown as 70 degrees, even though the thermostat is set to 72. The thermostat never gets set to a hold. When I try to change the temp on the 3 dots menu, it changes briefly, but returns to 70, even though the thermostat shows a set temp of 72. Actually, it never changes the thermostat set temp, up or down either. The card appears that it goes down and stays at 65, but the thermostat never reflects the change and stays at 72. This is getting very confusing.

rdfurman commented 2 years ago

Is this what the website / app look like for you?

Screenshot_20221012-084742.jpg

mrkfc commented 2 years ago

Yes. It looks like that when I have it set on Auto and I have a Temporary Hold. I have figured out some of my confusion. I've been using the Home Assistant Android app. I made the incorrect assumption that the Honeywell integration worked the same in the Android app and the web interface. It doesn't. I need to concentrate on the web interface only for now. I'll have to restart my diagnosis based on the web interface.

lhauduc commented 2 years ago

I am having similar issues with TCC integration in HA, I have 7 minisplit units, connected to 2 RedLink gateways. I link my account in HA through the Honeywell TCC integration, and I can see all 7 devices just fine. Some information is reported correctly (auto/heat/cool/off setting, as well as temperature set point and current temperature), however hvac_action and fan_action are always reported idle, and set temperature returns this error message. So right now, my HA climate devices are mostly "read-only" (though I can turn on/off and set mode, just not the temperature). I've seen many similar issues reported, and was wondering if there was a known fix for this. Thanks for the work on this integration! tcc_error

ShortPutt commented 1 year ago

I’m having the exact same problem. I have 2 Honeywell thermostats that I’ve been integrating them into Home assistant. They were both working fine, then one started getting the error below when I try to change the target temp. I suspect as I’ve been testing I’ve exceeded the api rate limit. The thermostat that stopped working is the one I’ve been testing with. In my research I saw one that said the limit resets at midnight guess I’ll know tomorrow. Is anyone familiar w the api rate limit? Do u know how it works?

Here is the error from the logs:

  Logger: somecomfort
  Source: components/honeywell/__init__.py:105 
  First occurred: 8:06:02 PM (1 occurrences) 
  Last logged: 8:06:02 PM

  API Rate Limited.

UPDATE:

The next day I am able to set the temp on both thermostats, so looks like the api rate limit resets at midnight. Additional Information on the API can be found here: https://developer.honeywellhome.com/


UPDATE #2:

Each day the automation updates successfully a few times, then starts getting following error each time it updates. The automation runs every 1/2 hour, and today (3 days after previous update) there is no API Rate Limit error. I am going to dig into the code & will update this post when I have more info. Could be there are actually 2 errors here, API Rate Limit and whatever this one is.

Here is the error in the logs (w/o the trace):

  Logger: homeassistant.components.automation.variable_test
  Source: components/honeywell/climate.py:251
  Integration: Automation ([documentation](https://www.home-assistant.io/integrations/automation), [issues](https://github.com/home-assistant/home-assistant/issues?q=is%3Aissue+is%3Aopen+label%3A%22integration%3A+automation%22))
  First occurred: 9:30:00 AM (3 occurrences)
  Last logged: 9:30:00 AM

HVAC 24A Set Temp: Choose at step 1: choice 1: Error executing script. Unexpected error for call_service at pos 2: not enough arguments for format string HVAC 24A Set Temp: Error executing script. Unexpected error for choose at pos 1: not enough arguments for format string While executing automation automation.variable_test


UPDATE #3:

client.py calls the Honeywell api to set the temperature, it gets a 200 back and is expecting a json payload, but apparently the payload is not json. Next step, get the values of req & resp. I'm not sure exactly how to do that, so if anyone knows, please let me know.

Here is the offending code:

def _resp_json(resp, req):
    try:
        return resp.json()
    except:
        # Any error doing this is probably because we didn't
        # get JSON back (the API is terrible about this).
        _LOG.exception("Failed to de-JSON %s %s" % req, resp)

UPDATE #4

I fixed the error in previous update by changing last line to _LOG.exception("Failed to de-JSON %s %s" % (req, resp)) Now it fails on the result.get('success') line n the following code with the error 'NoneType' object has no attribute 'get'

 def _set_thermostat_settings(self, thermostat_id, settings):
    data = {'SystemSwitch': None,
            'HeatSetpoint': None,
            'CoolSetpoint': None,
            'HeatNextPeriod': None,
            'CoolNextPeriod': None,
            'StatusHeat': None,
            'DeviceID': thermostat_id,
        }
    data.update(settings)
    url = "%s/Device/SubmitControlScreenChanges" % self._baseurl
    with self._retries_login():
        result = self._post_json(url, data=data)
        if result.get('success') != 1:
            raise APIError('API rejected thermostat settings')

So it would seem the post.json command returned nothing.

Also, I bumped Home Assistant stored_traces to 96 last night so this morning I have traces for the last 24 executions. Turns out 5 failed with the above error, 15 successfully changed the target temperature and 4 did not attempt to change the temp setting. I am no longer getting the API Rate Limit error, so I think I can rule out making too many calls to the API. I want to modify the code to print the url and data variables in the log, but haven't yet figured out how to do this. I will be interesting to see if the calls that fail have different data than those that succeed.

Its also important to note that there is nothing special about the ones that failed. There were other changes that were exactly the same and worked, so I can rule out something specific about the changes that failed.


UPDATE #5

Updated the code above to not fail and to print the url and data in the log.

Here is the updated code:

 def _set_thermostat_settings(self, thermostat_id, settings):
    data = {'SystemSwitch': None,
            'HeatSetpoint': None,
            'CoolSetpoint': None,
            'HeatNextPeriod': None,
            'CoolNextPeriod': None,
            'StatusHeat': None,
            'DeviceID': thermostat_id,
        }
    data.update(settings)
    url = "%s/Device/SubmitControlScreenChanges" % self._baseurl             
    _LOG.info ("DEBUG.url: %s" % url)                                           
    _LOG.info ("DEBUG..data: %s" % data)                                         
    with self._retries_login():
        result = self._post_json(url, data=data)
        if result is None:
            raise APIError('API rejected thermostat settings')
        elif result.get('success') != 1:
            raise APIError('API rejected thermostat settings')

It fails gracefully now with the following. So we finally find the real error.

2022-11-16 08:18:11.970 ERROR (SyncWorker_10) [somecomfort] Failed to de-JSON /Device/SubmitControlScreenChanges <Response [200]>
Traceback (most recent call last):
        File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 971, in json
    return complexjson.loads(self.text, **kwargs)
        File "/usr/local/lib/python3.10/site-packages/simplejson/__init__.py", line 525, in loads
    return _default_decoder.decode(s)
        File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 370, in decode
    obj, end = self.raw_decode(s)
        File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 400, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
        File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 429, in _resp_json
    return resp.json()
        File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 975, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
2022-11-16 08:18:11.981 ERROR (SyncWorker_10) [homeassistant.components.honeywell.const] Temperature 68.0 out of range

However its not consistent. There were a number of attempts to change the thermostat's temperature to 68 that failed, but also 1 that succeeded. The limits on the thermostat were set to 65/80. I updated them to 60/80 just to be sure.

rdfurman commented 1 year ago

Really good investigation and I appreciate the effort you're putting into debugging this!

One thing I'd like to clear up super fast, https://developer.honeywellhome.com/ and associated documentation isn't actually the API this integration is using. That documentation if for the API that the Honeywell Lyric integration uses. This integration is for the legacy mytotalconnectcomfort.com API. mytotalconnectcomfort.com has no documentation as far as I'm aware and Honeywell seem reluctant to provide any kind of developer support for it. I've called them in the past to see if I can get documentation on the API and I'm still waiting on a response.

With that out of the way, it does appear that the API responds with a different structure for different devices. Perhaps you can add a debug log that prints the full JSON response for your thermostat?

ShortPutt commented 1 year ago

Thanks for jumping in on this.

I figured the APIs were different, thanks for clarifying.

I made the following changes to the code

def _set_thermostat_settings(self, thermostat_id, settings):                   
        data = {'SystemSwitch': None,                           
                'HeatSetpoint': None,                                 
                'CoolSetpoint': None,                        
                'HeatNextPeriod': None,                                        
                'CoolNextPeriod': None,                      
                'StatusHeat': None,                                    
                'DeviceID': thermostat_id,                                           
            }                                                       
        data.update(settings)                                       
        url = "%s/Device/SubmitControlScreenChanges" % self._baseurl 

        _LOG.error ("AndyLog: url: %s" % url)                          
        _LOG.error ("AndyLog: data: %s" % data)                          

        with self._retries_login():                                          
            result = self._post_json(url, data=data)                                         

            if result is None:                                                               
                _LOG.error ("AndyLog: Thermostat Temperature Change FAILED - result is None")    
                raise APIError ('result is None, API rejected thermostat settings')              

            elif result.get('success') != 1:
                _LOG.error ("AndyLog: Thermostat Temperature Change FAILED - result not success")
                raise APIError('API rejected thermostat settings')                               

            else:
                _LOG.error ("AndyLog: Thermostat Temperature Change Successful")

Here's the relevant output (retrieved from log w/ grep 'honeywell|AndyLog|somecomfort|Successful|FAILED').

A few things to note.

Update

Overnight the logs are more of the same except these two. I don't see how the code sends these api calls to set CoolNextPeriod to 90 & 44. I'm not sure this is the same problem as Temperature out of range, but it might be a clue if we can find the code that sends these calls.

'CoolNextPeriod': 90

2022-11-16 18:30:00.043 ERROR (SyncWorker_11) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-11-16 18:30:00.051 ERROR (SyncWorker_11) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': None, 'HeatNextPeriod': None, 'CoolNextPeriod': 90, 'StatusHeat': None, 'DeviceID': 7061292, 'StatusCool': 1}
2022-11-16 18:30:00.705 ERROR (SyncWorker_11) [somecomfort] AndyLog: result: {'success': 1}
2022-11-16 18:30:00.707 ERROR (SyncWorker_11) [somecomfort] AndyLog: Thermostat Temperature Change Successful
2022-11-16 18:30:00.710 ERROR (SyncWorker_11) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-11-16 18:30:00.712 ERROR (SyncWorker_11) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 68.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7061292}
2022-11-16 18:30:01.376 ERROR (SyncWorker_11) [somecomfort] Failed to de-JSON /Device/SubmitControlScreenChanges <Response [200]>
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 429, in _resp_json
2022-11-16 18:30:01.381 ERROR (SyncWorker_11) [somecomfort] AndyLog: Thermostat Temperature Change FAILED - result is None

'CoolNextPeriod' 44

2022-11-17 07:30:00.067 ERROR (SyncWorker_11) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-11-17 07:30:00.071 ERROR (SyncWorker_11) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': None, 'HeatNextPeriod': None, 'CoolNextPeriod': 44, 'StatusHeat': None, 'DeviceID': 7061292, 'StatusCool': 1}
2022-11-17 07:30:00.624 ERROR (SyncWorker_11) [somecomfort] AndyLog: result: {'success': 1}
2022-11-17 07:30:00.625 ERROR (SyncWorker_11) [somecomfort] AndyLog: Thermostat Temperature Change Successful
2022-11-17 07:30:00.628 ERROR (SyncWorker_11) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-11-17 07:30:00.629 ERROR (SyncWorker_11) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 69.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7061292}
2022-11-17 07:30:01.442 ERROR (SyncWorker_11) [somecomfort] AndyLog: result: {'success': 1}
2022-11-17 07:30:01.445 ERROR (SyncWorker_11) [somecomfort] AndyLog: Thermostat Temperature Change Successful

Here's the 8am call successfully changing the thermostat temp to 68 on the same thermostat where 68 fails more often than it succeeds.

2022-11-17 08:00:00.032 ERROR (SyncWorker_7) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-11-17 08:00:00.053 ERROR (SyncWorker_7) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 68.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7061292}
2022-11-17 08:00:00.719 ERROR (SyncWorker_7) [somecomfort] AndyLog: result: {'success': 1}
2022-11-17 08:00:00.722 ERROR (SyncWorker_7) [somecomfort] AndyLog: Thermostat Temperature Change Successful

I also had a thought that maybe the heat point in the schedule might be causing the temp out of range condition, but those are set at 65. I assumed that's the point where the heat turns on when the thermostat is in auto mode. I never use auto mode because it never really gets cold enough here to need heat. Never-the-less, I changed them all to 60.

Let me know if you have ideas on other things I can try.

sgordon46 commented 1 year ago

I'm receiving the same error. Any progress on a resolution or root cause determined?

ShortPutt commented 1 year ago

Not sure exactly which issue you are referring to. I'd say The API Rate Limit issue is resolved, but we have not identified root cause for the Temperature Out of Range issue yet. Which error are you getting?

sgordon46 commented 1 year ago

Source: components/honeywell/climate.py:251

  1. Test Notifications: If at step 1: Error executing script. Unexpected error for call_service at pos 2: not enough arguments for format string
  2. Test Notifications: Error executing script. Unexpected error for if at pos 1: not enough arguments for format string
  3. While executing automation automation.test_notifications
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 971, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/simplejson/__init__.py", line 525, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 372, in decode
    obj, end = self.raw_decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 402, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 429, in _resp_json
    return resp.json()
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 975, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 684, in _async_call_service_step
    await service_task
  File "/usr/src/homeassistant/homeassistant/core.py", line 1744, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1781, in _execute_service
    await cast(Callable[[ServiceCall], Awaitable[None]], handler.job.target)(
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 208, in handle_service
    await service.entity_service_call(
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 678, in entity_service_call
    future.result()  # pop exception if have
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 943, in async_request_call
    await coro
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 715, in _handle_entity_call
    await result
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 613, in async_service_temperature_set
    await entity.async_set_temperature(**kwargs)
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 471, in async_set_temperature
    await self.hass.async_add_executor_job(
  File "/usr/local/lib/python3.10/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 258, in set_temperature
    self._set_temperature(**kwargs)
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 251, in _set_temperature
    setattr(self._device, f"setpoint_{mode}", temperature)
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 212, in setpoint_heat
    self._client._set_thermostat_settings(self.deviceid,
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 491, in _set_thermostat_settings
    result = self._post_json(url, data=data)
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 455, in _post_json
    return self._request_json('post', *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 443, in _request_json
    return self._resp_json(resp, req)
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 433, in _resp_json
    _LOG.exception("Failed to de-JSON %s %s" % req, resp)
TypeError: not enough arguments for format string
ShortPutt commented 1 year ago

That error is masking the real error. Look at my updates #4 & #5 above to get to the real error. You need to modify the code in client.py to get past the errors that prevent you from getting the real error message.

sgordon46 commented 1 year ago

@ShortPutt I cannot figure out how to view/edit the client.py file.

ShortPutt commented 1 year ago

How you edit it depends on how you are running HA.

I run HA in a docker container and I have portainer running, so I used portainer to open a console in the homeassistant image and then vi to edit client.py. You could also use docker to open a shell in the image from a terminal or ssh.

Make a backup of client.py before you change it Then edit /usr/local/lib/python3.10/site-packages/somecomfort/client.py

Restart HA after u make the changes.

sgordon46 commented 1 year ago

I'm running HA on raspberry pi bare metal. I connected via smb share and could not find the files. I also ssh to the system directly. Not sure which path to look at. I must be missing something.

rdfurman commented 1 year ago

Looks like you're still getting a return code of 200 (SUCCESS) so I'm wondering if there are some situations in which the honeywell API returns SUCCESS status code but no body to deserialize. I can look into making a branch that accepts 200 responses with no body. Would you be able to test it out for me when I get it committed?

ShortPutt commented 1 year ago

Sure I can test it after Nov. 30.

ShortPutt commented 1 year ago

sgordon46 - the trace in your log shows the location is /usr/local/lib/python3.10/site-packages/somecomfort/client.py. Or you could wait a bit and see if we can get it fixed.

rdfurman commented 1 year ago

@ShortPutt This may be quicker for you to do a quick edit in client.py so we can see what the resp actually was.

@staticmethod
    def _resp_json(resp, req):
        try:
            return resp.json()
        except:
            # Any error doing this is probably because we didn't
            # get JSON back (the API is terrible about this).
            _LOG.exception('Failed to de-JSON %s response' % req)
            _LOG.exception('Response was %s' % resp) # <-- THIS IS THE NEW LINE
            raise APIError('Failed to process %s response', req)
ShortPutt commented 1 year ago

Got it. I'll test it next week on Dec.1 and post the results. Sorry I can't test it sooner.

ShortPutt commented 1 year ago

@rdfurman Since I've been back its been behaving much better. Only 2 failures. Here's the details.

Firstly, _resp_json in the version of client.py I'm running is a bit different than what you sent. Not sure why my version is different but it might be a clue to potentially other differences. Here's the unaltered _resp_json from my client.py - there is no raise error at the end.

    @staticmethod                                                                  
    def _resp_json(resp, req):                                                       
        try:                                                                         
            return resp.json()                                                          
        except:                                                                      
            # Any error doing this is probably because we didn't                          
            # get JSON back (the API is terrible about this).
            _LOG.exception("Failed to de-JSON %s %s" % req, resp)

I modified it to:

    @staticmethod                                            
    def _resp_json(resp, req):                                         
        try:                                                                         
            return resp.json()                                    
        except:                                                  
            # Any error doing this is probably because we didn't     
            # get JSON back (the API is terrible about this).
            _LOG.exception('Response was %s' % resp)                       # Moved before de-JSON msg to get resp before next cmd fails
            _LOG.exception("Failed to de-JSON %s %s" % req, resp)          # This fails, so changed to _LOG.exception("Failed to de-JSON %s %s" % (req, resp))
            raise APIError('Failed to process %s response', req)

Here is an error from the log. You can see the response was <Response [200]>:

2022-12-01 11:30:00.066 ERROR (SyncWorker_6) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': None, 'HeatNextPeriod': None, 'CoolNextPeriod': 72, 'StatusHeat': None, 'DeviceID': 7039159, 'StatusCool': 1}
2022-12-01 11:30:11.317 ERROR (SyncWorker_6) [somecomfort] Response was <Response [200]>
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 971, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/simplejson/__init__.py", line 525, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 372, in decode
    obj, end = self.raw_decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 402, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 429, in _resp_json
    return resp.json()
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 975, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
2022-12-01 11:30:11.327 ERROR (SyncWorker_6) [somecomfort] Failed to de-JSON /Device/SubmitControlScreenChanges <Response [200]>
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 971, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/simplejson/__init__.py", line 525, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 372, in decode
    obj, end = self.raw_decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 402, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 429, in _resp_json
    return resp.json()
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 975, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
2022-12-01 11:30:11.331 ERROR (SyncWorker_6) [homeassistant.components.honeywell.const] Temperature 69.0 out of range

Interestingly, the call that failed was setting CoolNextPeriod, not CoolSetpoint. Occasionally it does this before setting the CoolSetpoint. I'd like to understand the logic to setting CoolNextPeriod first, it seems random.

Calling CoolNextPeriod does not appear to be (part of) the problem because all other calls were successful. Here are a couple successful runs from the log:

2022-12-01 12:30:00.039 ERROR (SyncWorker_8) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-01 12:30:00.042 ERROR (SyncWorker_8) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': None, 'HeatNextPeriod': None, 'CoolNextPeriod': 72, 'StatusHeat': None, 'DeviceID': 7061292, 'StatusCool': 1}
2022-12-01 12:30:00.901 ERROR (SyncWorker_8) [somecomfort] AndyLog: Thermostat Temperature Change Successful
2022-12-01 12:30:00.904 ERROR (SyncWorker_8) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-01 12:30:00.906 ERROR (SyncWorker_8) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 69.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7061292}
2022-12-01 12:30:01.916 ERROR (SyncWorker_8) [somecomfort] AndyLog: Thermostat Temperature Change Successful
2022-12-01 12:30:01.928 ERROR (SyncWorker_2) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-01 12:30:01.940 ERROR (SyncWorker_2) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 68.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7039159}
2022-12-01 12:30:02.529 ERROR (SyncWorker_2) [somecomfort] AndyLog: Thermostat Temperature Change Successful

2022-12-01 13:00:00.032 ERROR (SyncWorker_8) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-01 13:00:00.045 ERROR (SyncWorker_8) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 68.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7061292}
2022-12-01 13:00:00.728 ERROR (SyncWorker_8) [somecomfort] AndyLog: Thermostat Temperature Change Successful
2022-12-01 13:00:00.731 ERROR (SyncWorker_2) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-01 13:00:00.733 ERROR (SyncWorker_2) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 67.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7039159}
2022-12-01 13:00:01.464 ERROR (SyncWorker_2) [somecomfort] AndyLog: Thermostat Temperature Change Successful

2022-12-01 13:30:00.028 ERROR (SyncWorker_7) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-01 13:30:00.035 ERROR (SyncWorker_7) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 66.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7061292}
2022-12-01 13:30:00.790 ERROR (SyncWorker_7) [somecomfort] AndyLog: Thermostat Temperature Change Successful

I appreciate your help with this. Let me know your thoughts.

rdfurman commented 1 year ago

Hmmmmmm. Seems weird that that honeywell API is returning a 200 with no body for only some request payloads... Perhaps we can track which call exactly is causing this? I see that _set_thermostat_settings is the only place that sets "CoolNextPeriod" and that function is called from 6 places. Perhaps we can throw a log out in these 6 places to see which one is causing the error?

I see 2 paths from here:

  1. We simply say 200 status is okay and allow a response with no body in _resp_json, or
  2. We figure out why honeywell isn't returning a body for this one request body

Option 1 is the quick and dirty way, option 2 would be preferable.

ShortPutt commented 1 year ago

Let's work on option 2. Over the weekend I experienced only a few failures. I will add debug statements and get back when I have more info.

Update

I only found 5 places where _set_thermostat_settings is called:

fan_mode
system_mode
setpoint_cool
setpoint_heat
_set_hold

I will let it run and let you know what I find.

Update

Well I haven't had any failures since I put the debug statements in, but the debugs did help me figure out what the CoolNextPeriod calls do. They are used to set the hold until the next schedule change. Honeywell divides the day into 96 15 minute segments. I see calls for CoolNextPeriod for 28, 44, 72 & 92. That equates to 7am, 11am, 6pm & 11pm - precisely when the schedule changes on my thermostats. @rdfurman you probably knew that.

ShortPutt commented 1 year ago

Failed again last night. Here's the log w/ some annotations. For some context, Device ID 7061292 is 24A, Device ID 7039159 is 24B.

Successful updates at midnight, 12:30, 1:00 & 1:30

2022-12-07 00:00:00.036 DEBUG (SyncWorker_8) [somecomfort] AndyLog: _get_hold: hold: temporary  period: 28
2022-12-07 00:00:00.037 DEBUG (SyncWorker_8) [somecomfort] AndyLog: setpoint_cool: before lower: 60.0, upper: 99.0, temp: 69.0
2022-12-07 00:00:00.037 DEBUG (SyncWorker_8) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-07 00:00:00.037 DEBUG (SyncWorker_8) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 69.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7039159}
2022-12-07 00:00:00.541 DEBUG (SyncWorker_8) [somecomfort] AndyLog: Thermostat Temperature Change Successful
2022-12-07 00:00:00.542 DEBUG (SyncWorker_8) [somecomfort] AndyLog: setpoint_cool: after lower: 60.0, upper: 99.0, temp: 69.0

2022-12-07 00:00:54.640 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 00:05:54.647 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 00:10:54.649 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 00:15:54.655 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 00:20:54.657 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 00:25:54.660 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds

2022-12-07 00:30:00.047 DEBUG (SyncWorker_5) [somecomfort] AndyLog: _get_hold: hold: temporary  period: 28
2022-12-07 00:30:00.048 DEBUG (SyncWorker_5) [somecomfort] AndyLog: setpoint_cool: before lower: 60.0, upper: 99.0, temp: 68.0
2022-12-07 00:30:00.048 DEBUG (SyncWorker_5) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-07 00:30:00.048 DEBUG (SyncWorker_5) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 68.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7039159}
2022-12-07 00:30:00.719 DEBUG (SyncWorker_5) [somecomfort] AndyLog: Thermostat Temperature Change Successful
2022-12-07 00:30:00.720 DEBUG (SyncWorker_5) [somecomfort] AndyLog: setpoint_cool: after lower: 60.0, upper: 99.0, temp: 68.0

2022-12-07 00:30:00.723 DEBUG (SyncWorker_2) [somecomfort] AndyLog: _get_hold: hold: temporary  period: 28
2022-12-07 00:30:00.723 DEBUG (SyncWorker_2) [somecomfort] AndyLog: setpoint_cool: before lower: 60.0, upper: 99.0, temp: 70.0
2022-12-07 00:30:00.723 DEBUG (SyncWorker_2) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-07 00:30:00.723 DEBUG (SyncWorker_2) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 70.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7061292}
2022-12-07 00:30:01.335 DEBUG (SyncWorker_2) [somecomfort] AndyLog: Thermostat Temperature Change Successful
2022-12-07 00:30:01.335 DEBUG (SyncWorker_2) [somecomfort] AndyLog: setpoint_cool: after lower: 60.0, upper: 99.0, temp: 70.0

2022-12-07 00:30:54.673 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 00:35:54.689 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 00:40:54.693 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 00:45:54.699 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 00:50:54.704 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 00:55:54.711 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds

2022-12-07 01:00:00.024 DEBUG (SyncWorker_3) [somecomfort] AndyLog: _get_hold: hold: temporary  period: 28
2022-12-07 01:00:00.025 DEBUG (SyncWorker_3) [somecomfort] AndyLog: setpoint_cool: before lower: 60.0, upper: 99.0, temp: 68.0
2022-12-07 01:00:00.025 DEBUG (SyncWorker_3) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-07 01:00:00.025 DEBUG (SyncWorker_3) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 68.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7061292}
2022-12-07 01:00:00.521 DEBUG (SyncWorker_3) [somecomfort] AndyLog: Thermostat Temperature Change Successful
2022-12-07 01:00:00.521 DEBUG (SyncWorker_3) [somecomfort] AndyLog: setpoint_cool: after lower: 60.0, upper: 99.0, temp: 68.0

2022-12-07 01:00:00.524 DEBUG (SyncWorker_7) [somecomfort] AndyLog: _get_hold: hold: temporary  period: 28
2022-12-07 01:00:00.524 DEBUG (SyncWorker_7) [somecomfort] AndyLog: setpoint_cool: before lower: 60.0, upper: 99.0, temp: 67.0
2022-12-07 01:00:00.524 DEBUG (SyncWorker_7) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-07 01:00:00.524 DEBUG (SyncWorker_7) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 67.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7039159}
2022-12-07 01:00:01.114 DEBUG (SyncWorker_7) [somecomfort] AndyLog: Thermostat Temperature Change Successful
2022-12-07 01:00:01.114 DEBUG (SyncWorker_7) [somecomfort] AndyLog: setpoint_cool: after lower: 60.0, upper: 99.0, temp: 67.0

2022-12-07 01:00:54.723 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 01:05:54.733 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 01:10:54.738 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 01:15:54.743 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 01:20:54.749 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 01:25:54.753 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds

2022-12-07 01:30:00.052 DEBUG (SyncWorker_9) [somecomfort] AndyLog: _get_hold: hold: temporary  period: 28
2022-12-07 01:30:00.053 DEBUG (SyncWorker_9) [somecomfort] AndyLog: setpoint_cool: before lower: 60.0, upper: 99.0, temp: 69.0
2022-12-07 01:30:00.053 DEBUG (SyncWorker_9) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-07 01:30:00.053 DEBUG (SyncWorker_9) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 69.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7061292}
2022-12-07 01:30:00.561 DEBUG (SyncWorker_9) [somecomfort] AndyLog: Thermostat Temperature Change Successful
2022-12-07 01:30:00.562 DEBUG (SyncWorker_9) [somecomfort] AndyLog: setpoint_cool: after lower: 60.0, upper: 99.0, temp: 69.0

Then a failure at 2am when setting temp for 24B. and a successful call to set temp for 24a. The call for 24B is the same call that was successful at 12:30.

2022-12-07 01:30:54.759 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 01:35:54.763 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 01:40:54.769 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 01:45:54.773 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 01:50:54.777 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 01:55:54.781 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds

2022-12-07 02:00:00.023 DEBUG (SyncWorker_1) [somecomfort] AndyLog: _get_hold: hold: temporary  period: 28
2022-12-07 02:00:00.023 DEBUG (SyncWorker_1) [somecomfort] AndyLog: setpoint_cool: before lower: 60.0, upper: 99.0, temp: 68.0
2022-12-07 02:00:00.023 DEBUG (SyncWorker_1) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-07 02:00:00.023 DEBUG (SyncWorker_1) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 68.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7039159}
2022-12-07 02:00:00.649 ERROR (SyncWorker_1) [somecomfort] Response was <Response [200]>
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 971, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/simplejson/__init__.py", line 525, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 372, in decode
    obj, end = self.raw_decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 402, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 456, in _resp_json
    return resp.json()
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 975, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
2022-12-07 02:00:00.665 ERROR (SyncWorker_1) [somecomfort] Failed to de-JSON /Device/SubmitControlScreenChanges <Response [200]>
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 971, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/simplejson/__init__.py", line 525, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 372, in decode
    obj, end = self.raw_decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 402, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 456, in _resp_json
    return resp.json()
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 975, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
2022-12-07 02:00:00.668 ERROR (SyncWorker_1) [homeassistant.components.honeywell.const] Temperature 68.0 out of range
2022-12-07 02:00:00.676 DEBUG (SyncWorker_2) [somecomfort] AndyLog: _get_hold: hold: temporary  period: 28
2022-12-07 02:00:00.676 DEBUG (SyncWorker_2) [somecomfort] AndyLog: setpoint_cool: before lower: 60.0, upper: 99.0, temp: 70.0
2022-12-07 02:00:00.676 DEBUG (SyncWorker_2) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-07 02:00:00.677 DEBUG (SyncWorker_2) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 70.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7061292}
2022-12-07 02:00:01.839 DEBUG (SyncWorker_2) [somecomfort] AndyLog: Thermostat Temperature Change Successful
2022-12-07 02:00:01.840 DEBUG (SyncWorker_2) [somecomfort] AndyLog: setpoint_cool: after lower: 60.0, upper: 99.0, temp: 70.0

Then a login failure which may have caused the following failures;

2022-12-07 02:00:54.785 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 02:01:07.244 ERROR (SyncWorker_10) [somecomfort] Session Error occurred: Received 500.

2022-12-07 02:01:07.247 ERROR (SyncWorker_10) [somecomfort] Attempting to login again.
2022-12-07 02:01:07.634 ERROR (SyncWorker_10) [somecomfort] Login failed
2022-12-07 02:01:07.710 ERROR (SyncWorker_10) [somecomfort] Session Error occurred: Received 500.
2022-12-07 02:01:07.714 ERROR (MainThread) [homeassistant.helpers.entity] Update for climate.24a fails
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 489, in _retries_login
    self.keepalive()
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 560, in keepalive
    raise SomeComfortError()
somecomfort.client.SomeComfortError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 527, in async_update_ha_state
    await self.async_device_update()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 730, in async_device_update
    await task
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 357, in async_update
    await self._data.async_update()
  File "/usr/src/homeassistant/homeassistant/components/honeywell/__init__.py", line 183, in async_update
    await self._refresh_devices()
  File "/usr/src/homeassistant/homeassistant/components/honeywell/__init__.py", line 174, in _refresh_devices
    await self._hass.async_add_executor_job(device.refresh)
  File "/usr/local/lib/python3.10/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 89, in refresh
    data = self._client._get_thermostat_data(self.deviceid)
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 505, in _get_thermostat_data
    with self._retries_login():
  File "/usr/local/lib/python3.10/contextlib.py", line 135, in __enter__
    return next(self.gen)
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 492, in _retries_login
    self._login()
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 51, in wrapper
    return fn(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 449, in _login
    self.keepalive()
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 560, in keepalive
    raise SomeComfortError()
somecomfort.client.SomeComfortError
2022-12-07 02:01:07.733 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:01:44.788 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:02:44.792 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:03:44.790 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:04:44.792 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:05:54.791 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 02:06:00.785 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:06:44.792 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:07:44.793 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:08:44.795 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:09:44.796 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:10:54.798 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 02:11:05.600 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:11:44.799 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:12:44.800 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:13:44.805 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:14:44.817 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:15:54.812 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 02:16:01.650 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:16:44.812 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:17:44.813 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:18:44.814 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:19:44.819 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:20:54.816 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 02:21:02.027 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:21:44.816 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:22:44.818 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:23:44.822 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:24:44.820 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:25:54.822 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 02:26:01.176 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:26:44.822 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:27:44.823 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:28:44.824 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:29:44.824 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None

2022-12-07 02:30:00.025 DEBUG (SyncWorker_6) [somecomfort] AndyLog: _get_hold: hold: temporary  period: 28
2022-12-07 02:30:00.025 DEBUG (SyncWorker_6) [somecomfort] AndyLog: setpoint_cool: before lower: 60.0, upper: 99.0, temp: 68.0
2022-12-07 02:30:00.026 DEBUG (SyncWorker_6) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-07 02:30:00.026 DEBUG (SyncWorker_6) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 68.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7039159}
2022-12-07 02:30:00.810 ERROR (SyncWorker_6) [somecomfort] Response was <Response [200]>
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 971, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/simplejson/__init__.py", line 525, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 372, in decode
    obj, end = self.raw_decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 402, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 456, in _resp_json
    return resp.json()
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 975, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
2022-12-07 02:30:00.815 ERROR (SyncWorker_6) [somecomfort] Failed to de-JSON /Device/SubmitControlScreenChanges <Response [200]>
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 971, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/simplejson/__init__.py", line 525, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 372, in decode
    obj, end = self.raw_decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 402, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 456, in _resp_json
    return resp.json()
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 975, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
2022-12-07 02:30:00.819 ERROR (SyncWorker_6) [homeassistant.components.honeywell.const] Temperature 68.0 out of range

2022-12-07 02:30:00.823 DEBUG (SyncWorker_4) [somecomfort] AndyLog: _get_hold: hold: temporary  period: 28
2022-12-07 02:30:00.823 DEBUG (SyncWorker_4) [somecomfort] AndyLog: setpoint_cool: before lower: 60.0, upper: 99.0, temp: 71.0
2022-12-07 02:30:00.823 DEBUG (SyncWorker_4) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-07 02:30:00.823 DEBUG (SyncWorker_4) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 71.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7061292}
2022-12-07 02:30:02.016 ERROR (SyncWorker_4) [somecomfort] Response was <Response [200]>
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 971, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/simplejson/__init__.py", line 525, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 372, in decode
    obj, end = self.raw_decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 402, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 456, in _resp_json
    return resp.json()
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 975, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
2022-12-07 02:30:02.025 ERROR (SyncWorker_4) [somecomfort] Failed to de-JSON /Device/SubmitControlScreenChanges <Response [200]>
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 971, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/simplejson/__init__.py", line 525, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 372, in decode
    obj, end = self.raw_decode(s)
  File "/usr/local/lib/python3.10/site-packages/simplejson/decoder.py", line 402, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/somecomfort/client.py", line 456, in _resp_json
    return resp.json()
  File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 975, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
2022-12-07 02:30:02.033 ERROR (SyncWorker_4) [homeassistant.components.honeywell.const] Temperature 71.0 out of range

2022-12-07 02:30:02.053 ERROR (MainThread) [homeassistant.components.automation.hvac_24b_set_temp] HVAC 24B Set Temp: Choose at step 1: choice 1: Error executing script. Unexpected error for call_service at pos 1: None
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 684, in _async_call_service_step
    await service_task
  File "/usr/src/homeassistant/homeassistant/core.py", line 1744, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1781, in _execute_service
    await cast(Callable[[ServiceCall], Awaitable[None]], handler.job.target)(
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 208, in handle_service
    await service.entity_service_call(
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 695, in entity_service_call
    future.result()  # pop exception if have
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:30:02.073 ERROR (MainThread) [homeassistant.components.automation.hvac_24a_set_temp] HVAC 24A Set Temp: Choose at step 1: choice 1: Error executing script. Unexpected error for call_service at pos 1: None
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 684, in _async_call_service_step
    await service_task
  File "/usr/src/homeassistant/homeassistant/core.py", line 1744, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1781, in _execute_service
    await cast(Callable[[ServiceCall], Awaitable[None]], handler.job.target)(
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 208, in handle_service
    await service.entity_service_call(
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 695, in entity_service_call
    future.result()  # pop exception if have
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:30:02.078 ERROR (MainThread) [homeassistant.components.automation.hvac_24b_set_temp] HVAC 24B Set Temp: Error executing script. Unexpected error for choose at pos 1: None
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 896, in _async_choose_step
    await self._async_run_script(script)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1029, in _async_run_script
    await self._async_run_long_action(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 648, in _async_run_long_action
    long_task.result()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1524, in async_run
    await asyncio.shield(run.async_run())
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 409, in async_run
    await self._async_step(log_exceptions=False)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 453, in _async_step
    self._handle_exception(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 476, in _handle_exception
    raise exception
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 684, in _async_call_service_step
    await service_task
  File "/usr/src/homeassistant/homeassistant/core.py", line 1744, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1781, in _execute_service
    await cast(Callable[[ServiceCall], Awaitable[None]], handler.job.target)(
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 208, in handle_service
    await service.entity_service_call(
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 695, in entity_service_call
    future.result()  # pop exception if have
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:30:02.088 ERROR (MainThread) [homeassistant.components.automation.hvac_24b_set_temp] While executing automation automation.hvac_24b_set_temp
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/automation/__init__.py", line 551, in async_trigger
    await self.action_script.async_run(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1524, in async_run
    await asyncio.shield(run.async_run())
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 409, in async_run
    await self._async_step(log_exceptions=False)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 453, in _async_step
    self._handle_exception(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 476, in _handle_exception
    raise exception
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 896, in _async_choose_step
    await self._async_run_script(script)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1029, in _async_run_script
    await self._async_run_long_action(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 648, in _async_run_long_action
    long_task.result()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1524, in async_run
    await asyncio.shield(run.async_run())
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 409, in async_run
    await self._async_step(log_exceptions=False)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 453, in _async_step
    self._handle_exception(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 476, in _handle_exception
    raise exception
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 684, in _async_call_service_step
    await service_task
  File "/usr/src/homeassistant/homeassistant/core.py", line 1744, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1781, in _execute_service
    await cast(Callable[[ServiceCall], Awaitable[None]], handler.job.target)(
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 208, in handle_service
    await service.entity_service_call(
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 695, in entity_service_call
    future.result()  # pop exception if have
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:30:02.105 ERROR (MainThread) [homeassistant.components.automation.hvac_24a_set_temp] HVAC 24A Set Temp: Error executing script. Unexpected error for choose at pos 1: None
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 896, in _async_choose_step
    await self._async_run_script(script)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1029, in _async_run_script
    await self._async_run_long_action(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 648, in _async_run_long_action
    long_task.result()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1524, in async_run
    await asyncio.shield(run.async_run())
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 409, in async_run
    await self._async_step(log_exceptions=False)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 453, in _async_step
    self._handle_exception(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 476, in _handle_exception
    raise exception
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 684, in _async_call_service_step
    await service_task
  File "/usr/src/homeassistant/homeassistant/core.py", line 1744, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1781, in _execute_service
    await cast(Callable[[ServiceCall], Awaitable[None]], handler.job.target)(
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 208, in handle_service
    await service.entity_service_call(
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 695, in entity_service_call
    future.result()  # pop exception if have
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:30:02.121 ERROR (MainThread) [homeassistant.components.automation.hvac_24a_set_temp] While executing automation automation.hvac_24a_set_temp
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/automation/__init__.py", line 551, in async_trigger
    await self.action_script.async_run(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1524, in async_run
    await asyncio.shield(run.async_run())
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 409, in async_run
    await self._async_step(log_exceptions=False)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 453, in _async_step
    self._handle_exception(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 476, in _handle_exception
    raise exception
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 896, in _async_choose_step
    await self._async_run_script(script)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1029, in _async_run_script
    await self._async_run_long_action(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 648, in _async_run_long_action
    long_task.result()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1524, in async_run
    await asyncio.shield(run.async_run())
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 409, in async_run
    await self._async_step(log_exceptions=False)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 453, in _async_step
    self._handle_exception(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 476, in _handle_exception
    raise exception
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 684, in _async_call_service_step
    await service_task
  File "/usr/src/homeassistant/homeassistant/core.py", line 1744, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1781, in _execute_service
    await cast(Callable[[ServiceCall], Awaitable[None]], handler.job.target)(
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 208, in handle_service
    await service.entity_service_call(
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 695, in entity_service_call
    future.result()  # pop exception if have
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:30:54.825 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 02:31:01.022 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:31:44.827 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:32:44.827 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:34:44.829 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 813, in _update_entity_states
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 532, in async_update_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 585, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 332, in state_attributes
    data[ATTR_FAN_MODE] = self.fan_mode
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 226, in fan_mode
    return HW_FAN_MODE_TO_HA[self._device.fan_mode]
KeyError: None
2022-12-07 02:35:54.830 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 02:40:54.835 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 02:45:54.839 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 02:50:54.843 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 02:55:54.846 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds

Then at 3am it started working again. I included logs showing successful temp changes at 3am and 3:30, but there have been no failures through 10am

2022-12-07 03:00:00.022 DEBUG (SyncWorker_1) [somecomfort] AndyLog: _get_hold: hold: temporary  period: 28
2022-12-07 03:00:00.022 DEBUG (SyncWorker_1) [somecomfort] AndyLog: setpoint_cool: before lower: 60.0, upper: 99.0, temp: 68.0
2022-12-07 03:00:00.023 DEBUG (SyncWorker_1) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-07 03:00:00.023 DEBUG (SyncWorker_1) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 68.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7039159}
2022-12-07 03:00:00.400 DEBUG (SyncWorker_1) [somecomfort] AndyLog: Thermostat Temperature Change Successful
2022-12-07 03:00:00.400 DEBUG (SyncWorker_1) [somecomfort] AndyLog: setpoint_cool: after lower: 60.0, upper: 99.0, temp: 68.0

2022-12-07 03:00:00.402 DEBUG (SyncWorker_10) [somecomfort] AndyLog: _get_hold: hold: temporary  period: 28
2022-12-07 03:00:00.403 DEBUG (SyncWorker_10) [somecomfort] AndyLog: setpoint_cool: before lower: 60.0, upper: 99.0, temp: 70.0
2022-12-07 03:00:00.403 DEBUG (SyncWorker_10) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-07 03:00:00.403 DEBUG (SyncWorker_10) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 70.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7061292}
2022-12-07 03:00:00.715 DEBUG (SyncWorker_10) [somecomfort] AndyLog: Thermostat Temperature Change Successful
2022-12-07 03:00:00.716 DEBUG (SyncWorker_10) [somecomfort] AndyLog: setpoint_cool: after lower: 60.0, upper: 99.0, temp: 70.0

2022-12-07 03:00:54.853 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 03:05:54.860 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 03:10:54.871 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 03:15:54.876 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 03:20:54.883 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds
2022-12-07 03:25:54.888 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.24a is taking over 10 seconds

2022-12-07 03:30:00.025 DEBUG (SyncWorker_6) [somecomfort] AndyLog: _get_hold: hold: temporary  period: 28
2022-12-07 03:30:00.025 DEBUG (SyncWorker_6) [somecomfort] AndyLog: setpoint_cool: before lower: 60.0, upper: 99.0, temp: 71.0
2022-12-07 03:30:00.026 DEBUG (SyncWorker_6) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-07 03:30:00.026 DEBUG (SyncWorker_6) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 71.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7061292}
2022-12-07 03:30:00.512 DEBUG (SyncWorker_6) [somecomfort] AndyLog: Thermostat Temperature Change Successful
2022-12-07 03:30:00.512 DEBUG (SyncWorker_6) [somecomfort] AndyLog: setpoint_cool: after lower: 60.0, upper: 99.0, temp: 71.0

2022-12-07 03:30:00.515 DEBUG (SyncWorker_2) [somecomfort] AndyLog: _get_hold: hold: temporary  period: 28
2022-12-07 03:30:00.515 DEBUG (SyncWorker_2) [somecomfort] AndyLog: setpoint_cool: before lower: 60.0, upper: 99.0, temp: 69.0
2022-12-07 03:30:00.515 DEBUG (SyncWorker_2) [somecomfort] AndyLog: url: https://www.mytotalconnectcomfort.com/portal/Device/SubmitControlScreenChanges
2022-12-07 03:30:00.515 DEBUG (SyncWorker_2) [somecomfort] AndyLog: data: {'SystemSwitch': None, 'HeatSetpoint': None, 'CoolSetpoint': 69.0, 'HeatNextPeriod': None, 'CoolNextPeriod': None, 'StatusHeat': None, 'DeviceID': 7039159}
2022-12-07 03:30:00.868 DEBUG (SyncWorker_2) [somecomfort] AndyLog: Thermostat Temperature Change Successful
2022-12-07 03:30:00.868 DEBUG (SyncWorker_2) [somecomfort] AndyLog: setpoint_cool: after lower: 60.0, upper: 99.0, temp: 69.0

I'm not sure these logs are going to help much, let me know what you think.

rdfurman commented 1 year ago

Can you try setting your cool point to 71 for debugging?

lluigi20 commented 1 year ago

I try setting cool to 71 directly from Honeywell app and changes the heat setting as well. Apparently tries to keep a minimum difference of 4 degrees.

But this cannot be related to my issue, as I get the the same error regardless of what direction I try to change the cooling.

Luis Avalos


From: RDFurman @.> Sent: Friday, December 16, 2022 10:10:35 AM To: home-assistant/core @.> Cc: lluigi20 @.>; Manual @.> Subject: Re: [home-assistant/core] Honeywell TCC error when adjusting settings (Issue #78531)

Can you try setting your cool point to 71 for debugging?

— Reply to this email directly, view it on GitHubhttps://github.com/home-assistant/core/issues/78531#issuecomment-1355153130, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AQTZMNR365B5ZK3S6JS7O7DWNSH7XANCNFSM6AAAAAAQNKLA2I. You are receiving this because you are subscribed to this thread.Message ID: @.***>

ShortPutt commented 1 year ago

I don't understand how setting the cool point to 71 helps debug, but I am not able to work on this over the holidays, so let's discuss further after New Years.

rdfurman commented 1 year ago

The reason I was interested in 71 is due to this error I found in your logs:

2022-12-07 02:30:02.033 ERROR (SyncWorker_4) [homeassistant.components.honeywell.const] Temperature 71.0 out of range
ShortPutt commented 1 year ago

Update. I've been running my HA automation that adjusts the thermostat temp on only 1 HVAC since Jan 5 and haven't had a single failure. The thermostat temp has been set multiple times from 60 - 72 degrees. No heat, only cool.

Next week I'll start running the automation on both HVACs.

I'm beginning to think this is a Honeywell API bug. @rdfurman do you think that's possible?

mkmer commented 1 year ago

@ShortPutt: I've been working on porting the somecomfort API to AsyncIO. Hopefully it will fix all your troubles in the 2023.2 release.
One thing I did notice while porting the code: When the session keys are expired, some web pages return a "200" with application/text instead of application/json (aka null json conversion). We'll have to see, but I suspect the issue related to expired session keys. I'm looking forward to sussing this out.

ShortPutt commented 1 year ago

@mkmer That sounds promising! Looking forward to trying it out.

I've been getting errors again and it could very well be expired session keys. I won't have the ability to look into this until Feb, but I will install 2023.2 when its available and give it a run.

mkmer commented 1 year ago

Update. I've been running my HA automation that adjusts the thermostat temp on only 1 HVAC since Jan 5 and haven't had a single failure. The thermostat temp has been set multiple times from 60 - 72 degrees. No heat, only cool.

Next week I'll start running the automation on both HVACs.

I'm beginning to think this is a Honeywell API bug. @rdfurman do you think that's possible?

I didn't notice this comment.

One BIG discovery I found while moving to async was that when multiple devices were configured, HA would update every device for every entity (aka 2x2=4, if you had 4 devices it would 4x4=16 updates) with a delay between each request.

This is the "bad" code - it is called by each entity in update(self): (https://github.com/mkmer/HomeAssistant_Core/blob/cb13418babd21a1e9584978b0c523f1b1e4e1cb0/homeassistant/components/honeywell/init.py#L160-L163)

ShortPutt commented 1 year ago

I'm back looking at this. I ran automations for both thermostats for 1 day - every single temp change call failed. I turned the automation for 1 of the thermostats off, now it works about 50% of the time. So it certainly looks like updating multiple thermostats is an issue. I'm going to work on debugging w/ a single thermostat update.

@mkmer, how are you doing w/ the rewrite? Let me know if I can help.

mkmer commented 1 year ago

Rewrite is in 2023.2 (released today). Please try it out.

ShortPutt commented 1 year ago

I updated HA to 2023.2. My HA automations that set the Honeywell temp are failing w the following log messages:

`2023-02-02 10:00:00.684 ERROR (MainThread) [somecomfort] Failed to de-JSON /portal/Device/SubmitControlScreenChanges <ClientResponse(https://www.mytotalconnectcomfort.com/portal/Error?aspxerrorpath=/portal/Device/SubmitControlScreenChanges) [200 OK]>
<CIMultiDictProxy('Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Content-Type': 'text/html; charset=utf-8', 'Content-Encoding': 'gzip', 'Expires': '-1', 'Vary': 'Accept-Encoding', 'Server': 'Microsoft-IIS/8.5', 'ADRUM_0': 'g:147cfdf7-50b6-4629-b8fe-a80718c4344d', 'ADRUM_1': 'n:honeywell-prod_f7be1c76-506d-4111-81c5-fc62766aedb7', 'ADRUM_2': 'i:197987', 'ADRUM_3': 'e:28', 'X-XSS-Protection': '1; mode=block', 'X-UA-Compatible': 'IE=edge', 'X-Frame-Options': 'DENY', 'Date': 'Thu, 02 Feb 2023 14:59:59 GMT', 'Content-Length': '3448', 'Set-Cookie': 'NSC_NZUDD-443-WT=ffffffff090ecc0445525d5f4f58455e445a4a42378b;expires=Thu, 02-Feb-2023 14:57:42 GMT;path=/;secure;httponly')>
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/AIOSomecomfort/__init__.py", line 101, in _resp_json
    return await resp.json()
  File "/usr/src/homeassistant/homeassistant/helpers/aiohttp_client.py", line 52, in json
    return await super().json(*args, loads=loads, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/aiohttp/client_reqrep.py", line 1103, in json
    raise ContentTypeError(
aiohttp.client_exceptions.ContentTypeError: 0, message='Attempt to decode JSON with unexpected mimetype: text/html; charset=utf-8', url=URL('https://www.mytotalconnectcomfort.com/portal/Error?aspxerrorpath=/portal/Device/SubmitControlScreenChanges')
2023-02-02 10:00:00.692 ERROR (MainThread) [homeassistant.components.automation.new_automation] HVAC 24A Set Temp: Choose at step 1: choice 1: Error executing script. Unexpected error for call_service at pos 1: 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 684, in _async_call_service_step
    await service_task
  File "/usr/src/homeassistant/homeassistant/core.py", line 1787, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1824, in _execute_service
    await cast(Callable[[ServiceCall], Awaitable[None]], handler.job.target)(
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 213, in handle_service
    await service.entity_service_call(
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 681, in entity_service_call
    future.result()  # pop exception if have
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 968, in async_request_call
    await coro
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 721, in _handle_entity_call
    await result
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 613, in async_service_temperature_set
    await entity.async_set_temperature(**kwargs)
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 304, in async_set_temperature
    await self._set_temperature(**kwargs)
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 294, in _set_temperature
    await self._device.set_setpoint_cool(temperature)
  File "/usr/local/lib/python3.10/site-packages/AIOSomecomfort/device.py", line 147, in set_setpoint_cool
    await self._client._set_thermostat_settings(
  File "/usr/local/lib/python3.10/site-packages/AIOSomecomfort/__init__.py", line 172, in _set_thermostat_settings
    if result.get("success") != 1:
AttributeError: 'NoneType' object has no attribute 'get'
2023-02-02 10:00:00.699 ERROR (MainThread) [homeassistant.components.automation.new_automation] HVAC 24A Set Temp: Error executing script. 
Unexpected error for choose at pos 1: 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 896, in _async_choose_step
    await self._async_run_script(script)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1029, in _async_run_script
    await self._async_run_long_action(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 648, in _async_run_long_action
    long_task.result()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1524, in async_run
    await asyncio.shield(run.async_run())
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 409, in async_run
    await self._async_step(log_exceptions=False)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 453, in _async_step
    self._handle_exception(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 476, in _handle_exception
    raise exception
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 684, in _async_call_service_step
    await service_task
  File "/usr/src/homeassistant/homeassistant/core.py", line 1787, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1824, in _execute_service
    await cast(Callable[[ServiceCall], Awaitable[None]], handler.job.target)(
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 213, in handle_service
    await service.entity_service_call(
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 681, in entity_service_call
    future.result()  # pop exception if have
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 968, in async_request_call
    await coro
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 721, in _handle_entity_call
    await result
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 613, in async_service_temperature_set
    await entity.async_set_temperature(**kwargs)
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 304, in async_set_temperature
    await self._set_temperature(**kwargs)
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 294, in _set_temperature
    await self._device.set_setpoint_cool(temperature)
  File "/usr/local/lib/python3.10/site-packages/AIOSomecomfort/device.py", line 147, in set_setpoint_cool
    await self._client._set_thermostat_settings(
  File "/usr/local/lib/python3.10/site-packages/AIOSomecomfort/__init__.py", line 172, in _set_thermostat_settings
    if result.get("success") != 1:
AttributeError: 'NoneType' object has no attribute 'get'
2023-02-02 10:00:00.707 ERROR (MainThread) [homeassistant.components.automation.new_automation] While executing automation automation.new_automation
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/automation/__init__.py", line 546, in async_trigger
    await self.action_script.async_run(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1524, in async_run
    await asyncio.shield(run.async_run())
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 409, in async_run
    await self._async_step(log_exceptions=False)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 453, in _async_step
    self._handle_exception(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 476, in _handle_exception
    raise exception
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 896, in _async_choose_step
    await self._async_run_script(script)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1029, in _async_run_script
    await self._async_run_long_action(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 648, in _async_run_long_action
    long_task.result()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1524, in async_run
    await asyncio.shield(run.async_run())
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 409, in async_run
    await self._async_step(log_exceptions=False)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 453, in _async_step
    self._handle_exception(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 476, in _handle_exception
    raise exception
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 684, in _async_call_service_step
    await service_task
  File "/usr/src/homeassistant/homeassistant/core.py", line 1787, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1824, in _execute_service
    await cast(Callable[[ServiceCall], Awaitable[None]], handler.job.target)(
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 213, in handle_service
    await service.entity_service_call(
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 681, in entity_service_call
    future.result()  # pop exception if have
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 968, in async_request_call
    await coro
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 721, in _handle_entity_call
    await result
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 613, in async_service_temperature_set
    await entity.async_set_temperature(**kwargs)
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 304, in async_set_temperature
    await self._set_temperature(**kwargs)
  File "/usr/src/homeassistant/homeassistant/components/honeywell/climate.py", line 294, in _set_temperature
    await self._device.set_setpoint_cool(temperature)
  File "/usr/local/lib/python3.10/site-packages/AIOSomecomfort/device.py", line 147, in set_setpoint_cool
    await self._client._set_thermostat_settings(
  File "/usr/local/lib/python3.10/site-packages/AIOSomecomfort/__init__.py", line 172, in _set_thermostat_settings
    if result.get("success") != 1:
AttributeError: 'NoneType' object has no attribute 'get'
2023-02-02 10:05:12.529 WARNING (MainThread) [homeassistant.helpers.entity] Update of sensor.wan_ip is taking over 10 seconds`

Here's the automation


alias: HVAC 24B Set Temp
description: ""
trigger:
  - platform: time_pattern
    minutes: "15"
    seconds: "00"
  - platform: time_pattern
    minutes: "45"
    seconds: "00"
condition: []
action:
  - choose:
      - conditions:
          - condition: template
            value_template: "{{ adj | abs >= 1 }}"
        sequence:
          - service: climate.set_temperature
            data:
              temperature: |
                {{ newThermostatTemp | int }}
            target:
              entity_id: climate.24b
          - choose:
              - conditions:
                  - condition: template
                    value_template: >-
                      {{ state_attr('climate.24b', 'temperature') != newThermostatTemp | int }}
                    alias: Temp Change Failed
                sequence:
                  - service: system_log.write
                    data:
                      level: warning
                      logger: HVAC
                      message: >
                        HA HVAC 24B Set Temp FAILED

                        Date / Time              {{ dt }}

                        Thermostat Temp          {{ thermostatTemp }}

                        ESP Temp                 {{ ESPTemp }}

                        Target Temp              {{ targetTemp }}

                        Temp Adjustment           {{ adj | round }}

                        New Thermostat Temp      {{ newThermostatTemp | int }}

                        Thermostat set to        {{ state_attr('climate.24b','temperature') }}
              - conditions:
                  - condition: template
                    value_template: >-
                      {{ state_attr('climate.24b', 'temperature') == newThermostatTemp | int }}
                    alias: Temp Change Successful
                sequence:
                  - service: system_log.write
                    data:
                      level: warning
                      logger: HVAC
                      message: >
                        HA HVAC 24B Set Temp Successful

                        Date / Time              {{ dt }}

                        Thermostat Temp          {{ thermostatTemp }}

                        ESP Temp                 {{ ESPTemp }}

                        Target Temp              {{ targetTemp }}

                        Temp Adjustment           {{ adj | round }}

                        New Thermostat Temp      {{ newThermostatTemp | int }}

                        Thermostat set to        {{ state_attr('climate.24b', 'temperature') }}
            default:
              - service: system_log.write
                data:
                  level: warning
                  logger: HVAC
                  message: >
                    HA HVAC 24A Set Temp - Default Action SHOULD NEVER HAPPEN

                    {{ dt }}

                    Thermostat Temp          {{ thermostatTemp }}

                    ESP Temp                       {{ ESPTemp }}

                    Target Temp                   {{ targetTemp }}

                    Temp Adjustment             {{ adj | round }}

                    New Thermostat Temp  {{ newThermostatTemp | int }}

                    Thermostat set to    {{ state_attr('climate.24b', 'temperature') }}
      - conditions:
          - condition: template
            value_template: "{{ adj | abs < 1 }}"
            alias: Temp No Change
        sequence:
          - service: system_log.write
            data:
              level: warning
              logger: HVAC
              message: >
                HA HVAC 24B Set Temp No Change

                Date / Time              {{ dt }}

                Thermostat Temp          {{ thermostatTemp }}

                ESP Temp                 {{ ESPTemp }}

                Target Temp              {{ targetTemp }}

                Temp Adjustment           {{ adj | round }}

                New Thermostat Temp      {{ newThermostatTemp | int }}

                Thermostat set to        {{ state_attr('climate.24b','temperature') }}
    default: []
mode: single
trace:
  stored_traces: 24
variables:
  dt: "{{now().strftime(\"%Y/%m/%d %I:%M:%S\")}}"
  thermostatTemp: "{{ state_attr('climate.24b', 'temperature') | float }}"
  ESPTemp: "{{ states.sensor.esp32_6520_temp.state | float }}"
  targetTemp: |-
    {% if now().hour < 18 and now().hour > 11 %}
      {{ states.input_number.hvac_24b_temp_mid_day.state | float }}
    {% else %}
      {{ states.input_number.hvac_24b_target_temp.state | float }}
    {% endif %}
  adj: "{{ ESPTemp - targetTemp }}"
  newThermostatTemp: "{{ thermostatTemp - adj }}"
mkmer commented 1 year ago

The problem is here: aiohttp.client_exceptions.ContentTypeError: 0, message='Attempt to decode JSON with unexpected mimetype: text/html; charset=utf-8', url=URL('https://www.mytotalconnectcomfort.com/portal/Error?aspxerrorpath=/portal/Device/SubmitControlScreenChanges')

Maybe your not actually logged in when the script tried to run. This will take a bit for me to clean up the "failure" path that was followed here. Please try resetting the integration without the scripts enabled - once your sure it's logged in (and you can change modes,etc), try the script and let me know what happens. Thanks!

ShortPutt commented 1 year ago

I reloaded the integration after I updated HA. After seeing your note above I changed the thermostat target temp w/ HA UI card and the change was reflected on the thermostat, so looks like its logged in and communicating w/ the thermostat and the UI Card is working.

Let me know if there is something else I can do to help.

mkmer commented 1 year ago

Is it working fine now?
I clearly have to better deal with failure paths - thanks for the log files to chase that down.

ShortPutt commented 1 year ago

No, its failing. Same error.

mkmer commented 1 year ago

Is it possible your trying to set a temperature that's out of the thermostat range? I'm not sure why the web site is rejecting your control command and returning the error redirect. I've been able to set temp commands in my instance "fine".

Try setting the temp with the service command - something simple.

ShortPutt commented 1 year ago

Definitely not setting a temp out of range. I'll try using the service command later this afternoon.