After some reading I have been able to integrate my Exacontrol e7c thermostat and Bulex Themacondens heater (bai) using the MQTT climate entity. As it took some effort I thought to share it:
climate:
name: Centrale verwarming
availability_topic: "ebusd/global/signal"
payload_available: "true"
payload_not_available: "false"
max_temp: 30
min_temp: 10
temp_step: 0.5
precision: 0.5
# Current temperature
current_temperature_topic: "ebusd/e7c/DisplayedRoomTemp"
current_temperature_template: "{{value_json['temp'].value}}"
# Set temperature
temperature_state_topic: "ebusd/e7c/HeatingTemp1"
temperature_state_template: "{{value_json['temp'].value}}"
temperature_command_topic: "ebusd/e7c/DesiredTemperature"
# action
action_topic: "ebusd/bai/SetMode"
action_template: >
{%- if is_state('climate.centrale_verwarming', 'off') -%}
{{ "off" }}
{%- elif value_json['disablehc'].value == 0 -%}
{{ "heating" }}
{%- else -%}
{{ "idle" }}
{%- endif -%}
# modes
modes:
- "heat"
- "off"
mode_state_topic: "ebusd/e7c/HeatingEnable"
mode_state_template: >-
{% set values = { 'on':'heat', 'off':'off'} %}
{% set state = value_json["onoff"].value %}
{{ values[state] if state in values.keys() else 'off' }}
mode_command_topic: "ebusd/e7c/HeatingEnable/set"
mode_command_template: >-
{% set values = { 'heat':'on', 'off':'off'} %}
{{ values[value] if value in values.keys() else 'off' }}
# presets
preset_modes:
- "programma"
- "vakantie"
preset_mode_command_topic: "ebusd/e7c/DesiredPreset"
preset_mode_state_topic: "ebusd/e7c/DesiredPreset"
MQTT climate is not ideal as setting the temperature uses different MQTT topics. For a moment I though it would be easier to write a custom component for all the logic, but I solved it by using two automations that subscribe to DesiredPreset/DesiredTemperature, and do the necessary things.
I’m quite happy with how it works now. I also try not to bang the ebus too much, so I have not changed pollinterval. In fact, I don’t really rely on polling but let the automations fetch an update only when necessary (although I then do a /get ?1 to enable automatic polling for the future just in case). I also have a force update automation that runs when the climate entity turns on, or changes to unknown.
I only rely on polling when physically interacting with the device. As far as I understand, because of the default caching, it takes maximum 300 seconds for the HA climate to be updated, which I can live with.
Using the following hardware: EBUS to WiFi adapter by Daniel Kucera's store
I like it over the ‘official’ one as it does not need an external power suppy.