Skip to main content

CTC smart home integration, free and open source

CTC integration for Gladys Assistant

CTC heat pumps (EcoZenith, EcoHeat, EcoPart) over local Modbus: readings, optional control.

This integration shows a CTC heat pump (EcoZenith i255, i360 or i550, EcoHeat, EcoPart, and the EcoAir they drive) in Gladys, over the Modbus TCP interface of its display, on your local network, without any cloud.

Never tested with a real CTC: it follows CTC's BMS manual (162 600 16-3, 2026-02-02) and the HA-CTC-Local-Easyconf integration for Home Assistant, which runs on real units. Not affiliated with CTC.

Before you start​

  1. A display with 3 ports (the manual: only those talk Modbus over TCP/IP).
  2. On the display: Installer (Advanced), Define, Remote control, set Ethernet to Modbus TCP. This is reported to exclude the myUplink cloud connection.
  3. Give the display a fixed address in your router.
  4. The controller serves one Modbus client at a time: remove any other one (Home Assistant, a script), or both will fail.
  5. Modbus has no password: anyone who reaches port 502 can read the registers and write the control ones. Keep the heat pump on a trusted network (a VLAN, or a firewall rule letting only Gladys reach it), and never open port 502 to the internet.

Configuration​

FieldWhat it does
IP address of the CTC displayAn IPv4 address or a host name, port 502 unless you add one (192.168.1.80:5020).
Allow the commandsOff by default. See "Control" below.
Refresh interval30 s by default, from 10 to 600 s.
LanguageNames of the device and features added from now on, state texts, errors.

Save, then add the heat pump from the Discovery tab.

The Test the connection button reads the controller, at most once per refresh interval, and shows its state.

What you get​

Temperatures (outdoor, flow and its setpoint, return, radiator water, heat pump in and out, discharge and suction gas, brine, hot water upper and lower, room 1 and 2), high and low pressure, compressor speed, charge pump, brine pump and fan (%), degree minutes, immersion heater power, phase currents, hot water capacity, compressor operating time and its last 24 h, the immersion heater and compressor energy counters (kWh, plain values), the system, heat pump, heating circuit 1 and SmartGrid statuses, and the stored hot water mode, room setting and heating mode of circuit 1, read only. Compressor running, defrosting and "stopped by an alarm" are derived from the heat pump status.

A value appears once its register answered with a number. CTC answers "no sensor" with markers (9999, 32767...) and stays silent for a register the model lacks: such a block is left out after three silent rounds, until the integration restarts, and the configuration screen lists it.

The energy counters are plain values, not an energy index: nothing proves yet that they never go back nor jump.

Control​

Gladys writes only to CTC's volatile control registers (the 1000 block), never to the stored settings, whose memory tolerates a limited number of writes; the code refuses any other address before anything is sent. The controller forgets a control value 5 minutes after the last write and at its own restart, so Gladys writes what it holds again every minute. If the integration stops, the heat pump goes back to its own settings within 5 minutes.

Three commands:

  • Heating circuit 1 mode: Controller's own program (gives control back, writes nothing), Heating off, Heating, Auto.
  • Hot water mode: Controller's own program, Economy, Normal, Comfort. The temperatures of these modes are the controller's own settings: Gladys writes no hot water temperature.
  • Room setpoint, circuit 1: 10 to 30 °C, in tenths of a degree.

When nothing is in force (nothing held, or a hold the controller no longer acknowledges), the commands show what the controller follows: its own program, its own room setting. The feature Control held by Gladys says what is held and since when, what is asked but not in force, and the last hold that ended.

How a hold ends​

The room setpoint, the hot water mode and the Heating or Auto mode end:

  • at the panel: change the matching setting on the display (heating mode of circuit 1, room setting of circuit 1, hot water mode). Gladys notes these settings once the controller has acknowledged its value and gives the hold back at the first different reading (a setting it cannot read gives nothing back);
  • after 24 hours, by themselves;
  • with Controller's own program or the button Give control back to the heat pump;
  • when "Allow the commands" is turned off, when the display software version changes, or when the controller refuses the value.

The heating off has no end by the time: giving it back restarts the heating, which Gladys never does without a click. It ends only:

  • with Controller's own program, Heating, Auto or the button Give control back to the heat pump, when "Allow the commands" is on;
  • at the panel: set the heating mode of circuit 1 to Auto or On; Gladys gives the heating off back when it reads that setting, different from the one noted and other than Off, on two rounds in a row;
  • when the address is removed from the configuration, or the device is deleted in Gladys.

The status and Control held by Gladys say since when it is held. In the last resort, setting Ethernet back to anything but Modbus TCP on the display, or stopping the integration, makes the controller forget within 5 minutes; the heating off kept in /data is written again when the integration starts again.

Whether the panel or the 1000 block wins while Gladys holds a value is not known (never tested with a real CTC).

Heating off​

Heating off (zone mode of circuit 1 = Off) is the protective command. It works even when "Allow the commands" is off, while the controller has not been read yet, after a failed round and when /data cannot be written or is slow. It never waits behind the queued reads, but CTC answers one request at a time: it waits for the Modbus exchange in flight to end (usually a fraction of a second; up to about 7 s behind a rewrite whose identity read and write both stay unanswered), then leaves first. Its own answer is awaited 5 s; the line stays open after a silence.

It is refused only when no controller address is known: none in the configuration and none kept in /data (the address of the stop, or the last address where a CTC was identified). Before the configuration has been read from Gladys (it is read again every 5 s, doubled up to 5 minutes, while Gladys does not answer), it waits for it up to 2.5 s, then uses the address kept in /data.

It is kept in /data with its address and its date: after a restart of the integration it is written again at once, before the configuration is even read. When the configuration gives a new address, it is written there only once a round has identified a CTC at that address (the same display software version as before, when one was known); this wait is kept in /data too.

When the controller does not acknowledge it within 3.5 s, Gladys answers that it is recorded and not yet acknowledged; when the controller refuses it (Modbus exception 1, 2 or 3), Gladys says so. In both cases it is kept and tried again as soon as the line is free, then after 15 s, then twice as long each time, up to 5 minutes (30 minutes after a refusal). Once acknowledged, it is written again every minute.

A newer mode (Heating, Auto) replaces it once its write has left; /data is written before that, before the line is taken. If the controller refuses the newer mode, the heating off stays. A command asked before the heating off and not sent yet is cancelled.

Whether CTC keeps its frost protection with the zone mode Off is not known: check it on your installation before relying on it in winter.

The other commands​

They need Allow the commands. Before each write, Gladys reads the display software version again in the same Modbus session and refuses when it is missing or not the one read before (another controller at that address). The write must leave within 3.5 s of the click or it is not sent. Several commands at once (a scene) are written one after the other, in order; a newer click of the same feature replaces an older one not sent yet. A write the controller acknowledges is held; one without an answer is reported "sent, without acknowledgement" and written again within the minute; a write refused by the controller is not held. None of them is written again after a restart of the integration: the controller forgets them within 5 minutes.

The control registers cannot be read back (the manual: write only): the acknowledgement of the controller is the confirmation Gladys can give. The statuses (heating circuit 1, heat pump) show the effect.

Not done (yet)​

The hot water setpoint (register 1033: the manual gives no scale for the 1000 block, a wrong guess could overheat the water), the heating circuits 2 to 4, cooling, the immersion heater and compressor limits, the SmartGrid inputs, the alarm codes (65xxx), the display's web interface.

Configuration settings​

These are the settings CTC asks for in its configuration screen in Gladys.

SettingTypeRequiredDescription
Your CTC heat pumpsectionNoShows your CTC heat pump (EcoZenith i255/i360/i550, EcoHeat, EcoPart, EcoAir behind them) in Gladys through the Modbus TCP interface of its display, without any cloud: temperatures, pressures, statuses, energy counters. On the display, set Installer > Define > Remote control > Ethernet to Modbus TCP (a display with 3 ports is needed). Enter its IP address (give it a fixed address in your router), save, then add the heat pump from the Discovery tab. The controller serves one Modbus client only: remove any other one. A setpoint or mode held by Gladys ends after 24 hours or when the setting is changed at the panel; a heating off ends only by a click, the panel, or removing the address. Modbus has no password: keep the heat pump on a trusted network. Never tested with a real CTC. Not affiliated with CTC.
IP address of the CTC displaystringYesAn IPv4 address or a host name (Modbus port 502 unless you add one, for example 192.168.1.80:5020).
Allow the commandsbooleanNoOff by default. On: Gladys may set the heating circuit 1 mode (heating, auto), the hot water mode (economy, normal, comfort) and the room setpoint of circuit 1 (10 to 30 °C), written to CTC's volatile registers only, never to its stored settings. "Heating off" works even when this is off.
Refresh interval (s)numberNoHow often the controller is read, in seconds.
Language of the feature namesselectNoUsed for the names of the device and features added from now on, for the state texts and for the command errors.

How to install CTC in Gladys​

  1. In Gladys, open Integrations: CTC appears in the catalog, next to the native integrations, with a community badge.
  2. Click Install. Gladys pulls the Docker image (ghcr.io/lm1lc3n7/gladys-ctc:0.1.1), starts it in a sandbox isolated from the core, and generates the integration's interface (devices, discovery and configuration).
  3. Open the Configuration screen of the integration, fill in the settings, and save.
  4. You can also install it directly from its repository URL: https://github.com/LM1LC3N7/gladys-ctc.

CTC requires Gladys >=5.1.0. The catalog inside Gladys refreshes every hour, so a new version becomes available at most one hour after its release.

Not running Gladys yet? It is free and open source: follow the installation guide to get started.

About external integrations​

CTC is an external integration: a community integration packaged as a Docker container and published on GitHub, that Gladys installs in one click and runs in a sandbox isolated from its core. It is published and maintained by LM1LC3N7, not by the Gladys core team.

Subscribe to the Gladys Assistant newsletter

A few emails per month about new releases and project news. Sent by Pierre-Gilles Leymarie, founder of the project. Unsubscribe anytime 🙂