Honeywell CH/DHW via RF - evohome, sundial, hometronics, chronotherm

ANSWER: For anyone who has HVAC:

For HVAC, you will have to add the following to your configuration, regardless of whether you enforce_known_list: true, or not:

 - 30:123456: {"class": "FAN"}  # Ventilation unit
 - 40:123456: {"class": "CO2"}  # CO2 sensor
 - 50:123456: {"class": "HUM"}  # Humidity sensor (indoor, relative humidity)
 - 60:123456: {"class": "SWI"}  # Boost/timer switch (2-way or 4-way)

You will need to do this, otherwise you get error messages like:

Unknown src type: 40:123456, is it HVAC?
Corrupt packet: Unknown src type: 40:123456
Corrupt packet: Invalid code for 30:123456 (RFG) to Tx: 31DA

I have an Itho Renova Tiepakket CVE (Itā€™s written down on the itho box)

What else do you have - switches, sensors, etc?

Only a four button switch. Speed 1,2,3 and a timer button.

This one:

3 Likes

@cinnamon Your system if full of packets from your neighbours, and it - significantlt - presented a cognitive blind spot for me.

However, I now think this is your known devices list (you should confirm this for yourself):

     "known_list": {
        "01:087939": {"alias": "Controller"},
        "02:017205": {"alias": "Woonkamer (UFH controller)"},
        "04:023992": {"alias": "Kastenkamer"},
        "04:024000": {"alias": "Slaapkamer Nova"},
        "04:059569": {"alias": "Slaapkamer"},
        "04:225657": {"alias": "Toilet"},
        "04:225661": {"alias": "Badkamer"},
        "04:225663": {"alias": "Slaapkamer Evi"},
        "10:078099": {"alias": "Heating control"},
        "18:073736": {"alias": "Gateway (HGI80-compatible)"},
        "02:153425": {"class": "SWI", "alias": "Itho CVE RF Switch"},
        "20:007902": {"class": "FAN", "alias": "Itho CVE Fan"}
    },

The above is in JSON - it is pretty easy to translate into YAML.

Your must have the classes for the two HVAC devices.

I now have my HVAC C02 sensor showing and working, itā€™s in min(s) instead of ppm but is changing up and down.

Iā€™ve only just upgraded and have both of those but canā€™t work out what they are as their always in that state.

The new OT sensors triggered another thought. Would it be possible to control the state of the DHW keep warm on a combi boiler. Iā€™ve seen it mentioned somewhere as a feature of OT, but that Honeywell have never implemented it.

This appears to be a bug in HA - I will implement a workaround.

So, version 0.17.7 released.

The fault log binary sensor is live.

If you have HVAC - use this version, but make the correct changes to known_list first.

If you have OTB or UFH - use this version.

If you see a message like this:

Support the development of ramses_rf by reporting this packet

Please consider sending me a PM.

2022-01-11 07:29:38 ERROR (MainThread) [homeassistant.config] Unknown error calling evohome_cc CONFIG_SCHEMA
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/config.py", line 842, in async_process_component_config
    return component.CONFIG_SCHEMA(config)  # type: ignore
  File "/usr/local/lib/python3.9/site-packages/voluptuous/schema_builder.py", line 272, in __call__
    return self._compiled([], data)
  File "/usr/local/lib/python3.9/site-packages/voluptuous/schema_builder.py", line 594, in validate_dict
    return base_validate(path, iteritems(data), out)
  File "/usr/local/lib/python3.9/site-packages/voluptuous/schema_builder.py", line 386, in validate_mapping
    cval = cvalue(key_path, value)
  File "/usr/local/lib/python3.9/site-packages/voluptuous/schema_builder.py", line 817, in validate_callable
    return schema(data)
  File "/usr/local/lib/python3.9/site-packages/voluptuous/schema_builder.py", line 272, in __call__
    return self._compiled([], data)
  File "/usr/local/lib/python3.9/site-packages/voluptuous/schema_builder.py", line 594, in validate_dict
    return base_validate(path, iteritems(data), out)
  File "/usr/local/lib/python3.9/site-packages/voluptuous/schema_builder.py", line 373, in validate_mapping
    new_key = ckey(key_path, key)
  File "/usr/local/lib/python3.9/site-packages/voluptuous/schema_builder.py", line 817, in validate_callable
    return schema(data)
  File "/usr/src/homeassistant/homeassistant/helpers/config_validation.py", line 797, in validator
    value = config[key]
TypeError: string indices must be integers
2022-01-11 07:29:38 ERROR (MainThread) [homeassistant.setup] Setup failed for evohome_cc: Invalid config.
evohome_cc:
  restore_state: true
  serial_port: 
    port_name: /dev/serial/by-id/usb-SHK_NANO_CUL_868-if00-port0
    baudrate: 57600
  packet_log: 
    file_name: /config/packet.log
    rotate_backups: 3
  ramses_rf:
   enforce_known_list: true
   max_zones: 8
  schema:
    controller: 01:050858
    # zones:
    #   '00':
    #     devices:
    #       - '04:055594'
    #       - '04:055514'    
  known_list:
    - 01:050858 # Controller
    - 04:055594 # Living Room Rad 1
    - 04:055596 # Front Room
    - 04:055510 # Utility
    - 03:055510: {faked: true} # Utility Xiaomi Faked Sensor
    - 04:055514 # Living Room Rad 2
    - 04:055480 # Guest Room
    - 04:055506 # Master Bedroom
    - 04:055486 # Ed Office 
    - 04:055482 # Yvette Office
    - 04:055600 # Hallway
    - 07:014869 # Stored Hot Water
    - 18:141846 # nanoCUL
    - 13:215029 # Stored Hot Water - Relay
    - 13:246213 # Central Heating - Relay
    - 22:245508 # Living Room - Thermostat
    - 22:245512 # Front Room - Thermostat
    - 22:245517 # Master Bedroom - Thermostat

I did also update HA to 2021.12.9, in case it is related.

EDIT: Manually downgraded to 0.17.6 and it now looks better on start up, will know in 5 minutes. For anyone else, I had to downgrade manually as the 0.17.6 has been removed as release:

This issue is described in the release notes, no?

I am sorry I should have mentioned the breaking change in my post above as wellā€¦

restore_state: is now restore_cache:

evohome_cc:
  restore_cache: true

The release notes day:

The restore_state configuration parameter is now called restore_cache - the system will not start until you change (or remove) it.

I will make the above more obvious.

I am sorry, I donā€™t like creating breaking changes. However, they are considered changes and are done for good reasons.

In the above case, there is a plan to be able to restore state independently of the schema, in a future release.

My apologies, slap deserved for that one :wink:

2022-01-11 10:51:54 ERROR (MainThread) [homeassistant.components.climate] Error while setting up evohome_cc platform for climate
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 257, in _async_setup_platform
    await asyncio.gather(*pending)
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 382, in async_add_entities
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 613, in _async_add_entity
    await entity.add_to_platform_finish()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 748, in add_to_platform_finish
    self.async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 505, in async_write_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 540, in _async_write_ha_state
    attr.update(self.state_attributes or {})
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 261, in state_attributes
    self.current_temperature,
  File "/config/custom_components/evohome_cc/climate.py", line 324, in current_temperature
    return round(sum(temps) / len(temps), 1) if temps else None
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

Trying to run 0.17.7
had to revert back to 0.17.6

The relevant code is:

def current_temperature(self) -> Optional[float]:
    temps = [z.temperature for z in self._device.zones if z.temperature is not None]
    return round(sum(temps) / len(temps), 1) if temps else None

I have not recently made any changes here, and - as you can see - it is a pretty resilient piece of codeā€¦ So, I have no ideasā€¦

Is this reproducible? Does HA start OK, or not? If it does start OK, with evohome_cc running OK does it disappear after a few minutes?

Do you have any zones beside TRV (radiator) zones?

Well I have the issue now that HGI80 is having issues today could be related

[ramses_rf.protocol.protocol] MsgTransport.write( W --- 18:000730 01:223036 --:------ 2349 007 017FFF00FFFFFF): no dispatcher

Think I need to restart the HGI80

This release is beta code - specifically: it may not play nice with a HGI80. The release notes say:

WARNING : this release may cause a HGI80 to exceed itā€™s duty cycle if you have an OTB - this is a WIP

Hello,

I have installed 0.17.7 and it seems to be working fine, but my ventillation and button to control the ventillation do not seem detected properly (the entities are created in HA but they are always unavailable).

My configuration is as follow:

evohome_cc:
  serial_port: /dev/serial/by-id/usb-SparkFun_evofw3_atmega32u4-if00 #/dev/ttyACM2
  ramses_rf:
    enforce_known_list: true
  packet_log: packet.log
  restore_cache: true
  schema:
    controller: 01:076010
  known_list:
    - 01:076010 #controller
    - 02:024358 #UFH zone
    - 03:111111: {faked: true} #maddie
    - 03:222222: {faked: true} #Parents
    - 03:123456: {faked: true} #Luke
    - 04:081013 #bathroom 2nd floor
    - 04:161168 #utility Room
    - 04:161198 #bathroom 1st floor
    - 04:240790 #bathroom attic
    - 10:052644 #boiler relay
    - 18:198151 #dongle evofw3
    - 22:015492 #thermostat office
    - 22:015505 #thermostat guest bedroom
    - 29:156898: {"class": "SWI"} #RF remote control for ventillation
    - 30:042165 #internet gateway
    - 32:132125: {"class": "FAN"} #Orcon ventillation

And I have the following messages in my logs:

Logger: ramses_rf.message
Source: /usr/local/lib/python3.9/site-packages/ramses_rf/message.py:325
First occurred: 1:19:32 PM (1 occurrences)
Last logged: 1:19:32 PM

I --- 32:132125 --:------ 32:132125 313F 009 007C0310A5130207D0 < Corrupt packet: Invalid code for 32:132125 (FAN) to Tx: 313F
Logger: ramses_rf.protocol.message
Source: /usr/local/lib/python3.9/site-packages/ramses_rf/protocol/message.py:387
First occurred: 1:18:42 PM (34 occurrences)
Last logged: 1:32:32 PM

I --- 32:132125 --:------ 32:132125 31DA 030 00EF007FFF312503A206400776048EF0010058C8C80000EF00317A25A600 < AssertionError(25)
I --- 32:132125 --:------ 32:132125 31DA 030 00EF007FFF312603A206400776048FF0010058ACAC0000EF00314325A600 < AssertionError(26)
I --- 32:132125 --:------ 32:132125 31DA 030 00EF007FFF312603A206400777048FF001005884840000EF0028E8258B00 < AssertionError(26)
I --- 32:132125 --:------ 32:132125 31DA 030 00EF007FFF31260398064A07750494F00100585C5C0000EF001DBB1F5B00 < AssertionError(26)
I --- 32:132125 --:------ 32:132125 31DA 030 00EF007FFF3126038E064A0777049EF001005850500000EF00159715CF00 < AssertionError(26)
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/ramses_rf/protocol/message.py", line 378, in _validate
    result = PAYLOAD_PARSERS.get(self.code, parser_unknown)(
  File "/usr/local/lib/python3.9/site-packages/ramses_rf/protocol/parsers.py", line 152, in wrapper
    return fnc(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/ramses_rf/protocol/parsers.py", line 1731, in parser_31da
    assert payload[12:14] == "EF", payload[12:14]
AssertionError: 24
Logger: ramses_rf.protocol.message
Source: /usr/local/lib/python3.9/site-packages/ramses_rf/protocol/message.py:394
First occurred: 1:18:42 PM (15 occurrences)
Last logged: 1:33:42 PM

I 132 32:132125 --:------ 32:132125 31D9 017 002A030020202020202020202020202008 < Corrupt payload: Payload doesn't match '^(00|01|21)[0-9A-F]{4}([02]{28})?$': 002A030020202020202020202020202008
I --- 29:156898 32:132125 --:------ 22F3 007 00023C03040000 < Corrupt payload: Payload doesn't match '^0000[0-9A-F]{2}([0-9A-F]{8})?$': 00023C03040000
I 133 32:132125 --:------ 32:132125 31D9 017 002A030020202020202020202020202008 < Corrupt payload: Payload doesn't match '^(00|01|21)[0-9A-F]{4}([02]{28})?$': 002A030020202020202020202020202008
I 134 32:132125 --:------ 32:132125 31D9 017 002A040020202020202020202020202008 < Corrupt payload: Payload doesn't match '^(00|01|21)[0-9A-F]{4}([02]{28})?$': 002A040020202020202020202020202008
I 135 32:132125 --:------ 32:132125 31D9 017 002A040020202020202020202020202008 < Corrupt payload: Payload doesn't match '^(00|01|21)[0-9A-F]{4}([02]{28})?$': 002A040020202020202020202020202008

In order to try to help, I have captured different messages corresponding to different button pressed on my remote control and the corresponding response from the ventillation unit. This is as follow:

When pressing button speed 1:
2022-01-11T13:20:13.549279 070  I --- 29:156898 32:132125 --:------ 22F1 003 000104
2022-01-11T13:20:13.575907 062  I 125 32:132125 --:------ 32:132125 31D9 017 002A010020202020202020202020202008
2022-01-11T13:20:13.669389 061  I --- 32:132125 --:------ 32:132125 31DA 030 00EF007FFF312403C00690078204C8F001004150500000EF00159715B300
2022-01-11T13:20:19.721274 074  I --- 34:235203 --:------ 34:235203 30C9 003 00077C
2022-01-11T13:20:21.451725 063  I --- --:------ --:------ 10:052644 1FD4 003 00E11D
2022-01-11T13:20:22.852152 061  I --- 32:132125 --:------ 32:132125 31DA 030 00EF007FFF312403C00690078304CAF001004150500000EF0015B3159700


When pressing button speed 2: 
2022-01-11T13:21:48.000071 062  I --- 29:156898 32:132125 --:------ 22F1 003 000204
2022-01-11T13:21:48.034955 061  I 126 32:132125 --:------ 32:132125 31D9 017 002A020020202020202020202020202008
2022-01-11T13:21:48.133647 062  I --- 32:132125 --:------ 32:132125 31DA 030 00EF007FFF312403C00686078204C8F00100426E6E0000EF0015CF15B300


When pressing button speed 3:
2022-01-11T13:25:21.575176 061  I --- 29:156898 32:132125 --:------ 22F1 003 000304
2022-01-11T13:25:21.597754 061  I 127 32:132125 --:------ 32:132125 31D9 017 002A030020202020202020202020202008
2022-01-11T13:25:21.691388 061  I --- 32:132125 --:------ 32:132125 31DA 030 00EF007FFF312403DE0686077E04BDF0010043C8C80000EF001DF21DF200
2022-01-11T13:25:22.796290 061  I --- 32:132125 --:------ 32:132125 31DA 030 00EF007FFF312403DE0686077D04BDF0010043C8C80000EF001DBB1DF200

When pressing button away:
2022-01-11T13:26:07.412337 063  I --- 29:156898 32:132125 --:------ 22F1 003 000004
2022-01-11T13:26:07.442880 061  I 128 32:132125 --:------ 32:132125 31D9 017 002A000020202020202020202020202008
2022-01-11T13:26:07.535700 061  I --- 32:132125 --:------ 32:132125 31DA 030 00EF007FFF312403CA0668077B049BF001005514140000EF00310B25A600

When pressing button auto:
2022-01-11T13:26:55.836475 062  I --- 29:156898 32:132125 --:------ 22F1 003 000404
2022-01-11T13:26:55.861455 064  I 129 32:132125 --:------ 32:132125 31D9 017 002A040020202020202020202020202008
2022-01-11T13:26:55.955853 064  I --- 32:132125 --:------ 32:132125 31DA 030 00EF007FFF312503AC067C07820480F001005814140000EF00056C056C00

When pressing button timer (1 click):
2022-01-11T13:28:06.767137 063  I --- 29:156898 32:132125 --:------ 22F3 007 00020F03040000
2022-01-11T13:28:06.796517 062  I 130 32:132125 --:------ 32:132125 31D9 017 002A030020202020202020202020202008
2022-01-11T13:28:06.900119 061  I --- 32:132125 --:------ 32:132125 31DA 030 00EF007FFF30250398067C078404B9F001004DC8C8000EEF0015CF15B300

When pressing button timer (2 clicks):
2022-01-11T13:29:34.257878 057  I --- 29:156898 32:132125 --:------ 22F3 007 00021E03040000
2022-01-11T13:29:34.283831 062  I 132 32:132125 --:------ 32:132125 31D9 017 002A030020202020202020202020202008
2022-01-11T13:29:34.377995 062  I --- 32:132125 --:------ 32:132125 31DA 030 00EF007FFF312503A2065E077A0493F001004DC8C8001DEF000C960CB200


When pressing button timer (3 clicks):
2022-01-11T13:30:40.349439 055  I --- 29:156898 32:132125 --:------ 22F3 007 00023C03040000
2022-01-11T13:30:40.371162 062  I 133 32:132125 --:------ 32:132125 31D9 017 002A030020202020202020202020202008
2022-01-11T13:30:40.465413 062  I --- 32:132125 --:------ 32:132125 31DA 030 00EF007FFF312503A2064A07780495F001004DC8C8003BEF00312725A600
2022-01-11T13:30:42.724493 062  I --- 32:132125 --:------ 32:132125 31DA 030 00EF007FFF312503A2064A07790494F001004DC8C8003BEF0030EF25A600

If you prefer I can send you a full packet.log, but I thought it might be easier for you to have just the relevant packets and to know what they correspond to on the remote.
Let me know if I can do anything else to help :slight_smile:

Hello again,
I have noticed an error in my logs (with version 0.17.7 and latest version of HA):

Logger: homeassistant.components.sensor
Source: helpers/entity_platform.py:592
Integration: Sensor (documentation, issues)
First occurred: 2:04:45 PM (1 occurrences)
Last logged: 2:04:45 PM

Platform evohome_cc does not generate unique IDs. ID 02:024358-heat_demand already exists - ignoring sensor.02_024358_heat_demand

I have tried to delete or rename the existing sensor but it did not help. Restarting with restore_cache: "false"did not help either.

This does not prevent the system from working (i.e. I can still fake zone which is the most important to me) so do not spend too much time on this one, Iā€™m just putting it here in case other people have similar errors.

Thanks again for your hard work

This is an easy fix - it has now been fixed). In any case, you can ignore this one.

This is outdoor_humidity (I am guessing) - I didnā€™t think anyone would have this. Can you confirm your HVAC tracks this?

This tells me youā€™re running 0.17.6 and not 0.17.7? In the latest version of the library, we have:

    _22F3: {  # switch_duration
        I_: r"^00[0-9A-F]{4}([0-9A-F]{8})?$",
    }, 

ā€¦ youā€™ll see that your payload, 00023C03040000 will satisfy the latest regex, but not the old one.

ā€¦