Carrier/Bryant Infinitive Integration

It looks like you’re using the custom card Simple Thermostat. That card has some support for displaying additional attributes. Here’s my version:
image

And here’s the code I use for the card:

control:
  _headings: true
  fan:
    auto:
      icon: mdi:autorenew
      name: Auto
    high:
      icon: mdi:chevron-triple-right
      name: High
    low:
      icon: mdi:chevron-right
      name: Low
    medium:
      icon: mdi:chevron-double-right
      name: Medium
  hvac:
    cool:
      icon: mdi:snowflake
      name: Cool
    heat:
      icon: mdi:fire
      name: Heat
    heat_cool:
      icon: mdi:autorenew
      name: Heat/Cool
decimals: '0'
entity: climate.infinitive
sensors:
  - attribute: current_humidity
    name: Humidity
    unit: '%'
  - attribute: blower_rpm
    name: Fan Speed
    unit: rpm
  - attribute: airflow_cfm
    name: Airflow
    unit: cfm
step_size: '1'
type: custom:simple-thermostat

You should be able to copy/paste this code into the Lovelace card code editor.

1 Like

@strikeir13 @jmckinleyii Thanks to both of you !!!

Now I just need my entity to get stable as it gets “unavailable” randomly…

@strikeir13 What would make the current temp and set temp being -4.4 instead of the current values and also, where would I be able to edit which attribute to display ?

You can read up on the Simple Thermostat options in the GitHub repo: GitHub - nervetattoo/simple-thermostat: A different take on the thermostat card for Home Assistant ♨️

As far as the temp being -4.4, that seems to me like there is an issue somewhere. Does the Infinitive web UI show the correct values? If not, you may need to review your Infinitive setup totally separate from the HA connection. If the Infinitive web UI is correct, then it could be your custom component yaml config.

I can confirm that Infinitive does return the right values

I would check your Celsius/Fahrenheit settings in HA because it appears that Infinitive is reading Celsius correctly and HA is getting those values and converting them to Fahrenheit. I guess it’s also possible that it’s an issue with the integration itself when it receives the temp in Celsius but I feel like I remember others that are using Celsius with no issue

So turns out, changing the unit from Celcius to Fahrenheit and then back to Celcius did the trick !

Edit: I spoke too quickly, switched back to -4 …

Play with the Celsius/Fahrenheit thing and if we think it’s an issue with the integration I’ll dig into it and hopefully we can knock it out.

I honestly didn’t do a lot of QA on the temperature units. I did some cursory checks and was just letting HA handle it but there may be something that I need to change.

So I did some testing yesterday and the outdoor temp is correct. It’s just the Current temp that doesn’t reflect the real one and the Temps with the +/- that I have no idea what’s for.

Is there other card available other than Simple Thermostat and the official thermostat so I can do other testing and see if the problem is on the Front End Card or on the Integration ?

What does the standard HA climate card show? Are the setpoints on it correct?

Same results. I tested to change the units to Fahrenheit in the thermostat and HA and it displays the right values.

And if I swith both devices back to Celcius, it seems to want to display the right values but than immediately apply the conversion a second time I’d guess and displays the wrong one again.

It’s almost like when it’s converting from Fahrenheit to Celsius, it does the conversion and than it applies -28 to both values …

But the conversion for the Outdoor temp is stable.

So I think I’ve found what needed to be changed (and maybe what would be changed on the repo itself to grab the thermostat’s unit in a variable instead of hard coding TEMP_FAHRENHEIT in climate.py .) By changing TEMP_FAHRENHEIT to TEMP_CELSIUS, everything is working properly.

I got this working myself with the following config

  • Hyper-V running Raspian OS.

Does anyone have any idea on how to setup home/away with this?

Tried installing the addon, I’m encountering the following supervisor error:

Invalid build environment, can't build this add-on!

Running HomeAssistant on a RP4.

Version: core-2021.9.6
Supervisor: supervisor-2021.09.0
OS: Home Assistant OS 6.4

Hi
I run it on a ncu. To use on a Raspberry. Comment line 18 with # and remove # from 19 of docker file. Then rebuild.

And here’s the code I use for the card:

[…]

sensors:

  • attribute: current_humidity
    name: Humidity
    unit: ‘%’
  • attribute: blower_rpm
    name: Fan Speed
    unit: rpm
  • attribute: airflow_cfm
    name: Airflow
    unit: cfm
    step_size: ‘1’
    type: custom:simple-thermostat

You should be able to copy/paste this code into the Lovelace card code editor.

Thank you for this. The configuration for the additional buttons worked great. But I am having no luck with configuration for the sensors - when I use your code, the simple thermostat card comes up blank - i.e. with no information at all. It seems that it doesn’t like the attributes?

It sounds like maybe it’s not finding the attributes, but I’m not sure. If you post your Lovelace code and the dev tools output for your infinitive entity, that might help.

Hi,

Here is my lovelace code:

type: custom:simple-thermostat
entity: climate.infinitive
control:
  _headings: true
  fan:
    auto:
      icon: mdi:autorenew
      name: Auto
    high:
      icon: mdi:chevron-triple-right
      name: High
    low:
      icon: mdi:chevron-right
      name: Low
    medium:
      icon: mdi:chevron-double-right
      name: Medium
  hvac:
    cool:
      icon: mdi:snowflake
      name: Cool
    heat:
      icon: mdi:fire
      name: Heat
    heat_cool:
      icon: mdi:autorenew
      name: Heat/Cool
decimals: '0'
sensors:
  - attribute: blower_rpm
    name: Blower Speed
    unit: rpm

Here is the output from devtools for the infinitive entity:

hvac_modes: off, heat, cool, heat_cool
min_temp: 7
max_temp: 35
fan_modes: auto, low, medium, high
preset_modes: home, Hold
current_temperature: null
temperature: 19
fan_mode: null
preset_mode: home
current_humidity: null
target_humidity: null
blower_rpm: null
stage: null
override_duration: null
airflow_cfm: null
outdoor_temp: null
aux_heat: null
heatpump_coil_temp: null
heatpump_outside_temp: null
heatpump_stage: null
friendly_name: Infinity Thermostat
supported_features: 25

Hmmm… looks like the issue is that the infinitive integration is not reporting any data although it is reported via the thermostat UI

image

I’ve dug into this some more, and the issue seems to be what is being returned by the infinitive server.

I’ve added a debug logger to the update(self):

 def update(self):
        """Update current status from infinitive device."""
        _LOGGER.debug("Updating Infinitive status")
        status = self._inf_device.get_status()
        _LOGGER.debug("status retrived")
        _LOGGER.debug(status)
        _LOGGER.debug("try keys")

And debug log indicates that only some of the status variables are being returned

2021-11-05 14:27:57 DEBUG (SyncWorker_2) [custom_components.infinitive.climate] Updating Infinitive status
2021-11-05 14:27:57 DEBUG (SyncWorker_2) [custom_components.infinitive.climate] status retrived
2021-11-05 14:27:57 DEBUG (SyncWorker_2) [custom_components.infinitive.climate] {'currentTemp': 23, 'currentHumidity': 39, 'outdoorTemp': 10, 'mode': 'heat', 'coolActive': False, 'heatActive': False, 'fanMode': 'low', 'hold': False, 'heatSetpoint': 19, 'coolSetpoint': 26}
2021-11-05 14:27:57 DEBUG (SyncWorker_2) [custom_components.infinitive.climate] try keys
2021-11-05 14:27:57 DEBUG (SyncWorker_2) [custom_components.infinitive.climate] dict_keys(['currentTemp', 'currentHumidity', 'outdoorTemp', 'mode', 'coolActive', 'heatActive', 'fanMode', 'hold', 'heatSetpoint', 'coolSetpoint'])
2021-11-05 14:27:57 DEBUG (SyncWorker_2) [custom_components.infinitive.climate] Status update error: 'blowerRPM'

The question is why?

I don’t know where the actual pyinfinitive.py is on my system (it’s clearly there since things are working), but looking at its code listing on github, I see the following:

def get_status(self):
        """Return current status of an infinitive device."""
        configstatus = self._get_configstatus(self.config_url, '')
        handlerstatus = self._get_configstatus(self.airhandler_url, '')
        heatpumpstatus = self._get_configstatus(self.heatpump_url, 'heatpump_')
        
        return {**configstatus, **heatpumpstatus, **handlerstatus}

As far as I can tell, the status variables being returned do not quite match what’s expected. According to infinitive’s GitHub page, configstatus should return the following:

{
   "tempUnit":"F",
   "currentTemp": 70,
   "currentHumidity": 50,
   "outdoorTemp": 50,
   "mode": "heat",
   "stage":2,
   "fanMode": "auto",
   "hold": true,
   "holdDurationMins":0,
   "heatSetpoint": 68,
   "coolSetpoint": 74,
   "targetHumidity":45,
   "rawMode": 64
}

Compare that to what I get back in a status update:

“tempUnit” no
“currentTemp” yes
“currentHumidity” yes
“outdoorTemp” yes
“mode” yes
“stage” no, unless that’s “coolActive” or “heatActive”
“fanMode” yes
“hold” yes
“holdDurationMins” no
“heatSetpoint” yes
“coolSetpoint” yes
“targetHumidity” no [maybe because my system does not have a humidifier?]
“rawMode” no

It’s clear that I am not getting back anything for heatpumpstatus or handlerstatus, which have the blowerRPM and airflwoCFM status variables.

I feel like I am missing something here …

I did a bit more digging and attempted to get the 3 type of status objects directly from climate.py. This confirmed that only configstatus is being returned, but not the other two.

test code in climate.py:

host = self._inf_device.ip
        port = self._inf_device.port
        _LOGGER.debug("host is")
        _LOGGER.debug(host)
        _LOGGER.debug("port is")
        _LOGGER.debug(port)

        base_url = 'http://' + str(host) + ':' + str(port)
        config_url = base_url + '/api/zone/1/config'
        airhandler_url = base_url + '/api/airhandler'
        heatpump_url = base_url + '/api/heatpump'

        configstatus = self._inf_device._get_configstatus(config_url, '')
        _LOGGER.debug("configstatus retrived")
        _LOGGER.debug(configstatus)


        airhandlerstatus = self._inf_device._get_configstatus(airhandler_url, '')
        _LOGGER.debug("air handler status retrived")
        _LOGGER.debug(airhandlerstatus)

        heatpumpstatus = self._inf_device._get_configstatus(heatpump_url, '')
        _LOGGER.debug("heatpump status retrived")
        _LOGGER.debug(heatpumpstatus)

debug output:

2021-11-05 21:29:46 DEBUG (SyncWorker_3) [custom_components.infinitive.climate] host is

2021-11-05 21:29:46 DEBUG (SyncWorker_3) [custom_components.infinitive.climate] 192.168.86.79

2021-11-05 21:29:46 DEBUG (SyncWorker_3) [custom_components.infinitive.climate] port is

2021-11-05 21:29:46 DEBUG (SyncWorker_3) [custom_components.infinitive.climate] 8080

2021-11-05 21:29:46 DEBUG (SyncWorker_3) [custom_components.infinitive.climate] configstatus retrived

2021-11-05 21:29:46 DEBUG (SyncWorker_3) [custom_components.infinitive.climate] {'currentTemp': 23, 'currentHumidity': 45, 'outdoorTemp': 8, 'mode': 'heat', 'coolActive': False, 'heatActive': False, 'fanMode': 'low', 'hold': False, 'heatSetpoint': 22, 'coolSetpoint': 25}

2021-11-05 21:29:46 DEBUG (SyncWorker_3) [custom_components.infinitive.climate] air handler status retrived

2021-11-05 21:29:46 DEBUG (SyncWorker_3) [custom_components.infinitive.climate] {}

2021-11-05 21:29:46 DEBUG (SyncWorker_3) [custom_components.infinitive.climate] heatpump status retrived

2021-11-05 21:29:46 DEBUG (SyncWorker_3) [custom_components.infinitive.climate] {}

I dug deeper and did a manual JSON request:

LOGGER.debug("trying to get airhandler status manually")
        session = requests.Session()
        session.mount(base_url, HTTPAdapter(max_retries=5))
        status_raw = session.get(airhandler_url)
        _LOGGER.debug("what is the raw status we received?")
        _LOGGER.debug(status_raw)

And the result is …

2021-11-05 22:41:37 DEBUG (SyncWorker_5) [custom_components.infinitive.climate] what is the raw status we received?
2021-11-05 22:41:37 DEBUG (SyncWorker_5) [custom_components.infinitive.climate] <Response [404]>

WTF? And yet the Infinitive GUI works fine…