---
source_pdf: "modbus_templates/Helios/easyControls 2.0 - Modbus_82269_0916.pdf"
pages_extracted: "1-20 (of 48, German section only — variable list is primary content)"
snapshot_date: 2026-03-20
relevance: medium
notes: "Helios easyControls 2.0 Modbus Gateway TCP/IP documentation. Document NR. 82269. This is the OLDER version using non-standard Modbus TCP/IP (ASCII-encoded variables over holding registers at address 180, port 502). NOT directly compatible with TapHome standard Modbus integration. Included for background context only."
---

# Helios easyControls 2.0 — Modbus Gateway TCP/IP

**Document:** NR. 82 269
**Publisher:** HELIOS Ventilatoren GmbH + Co KG
**Protocol:** Modbus TCP/IP (non-standard — ASCII-encoded variable access)
**Applies to:** Helios KWL units with easyControls 2.0 (firmware >= 2.01)

---

## IMPORTANT: Non-Standard Modbus Protocol

The easyControls 2.0 uses a **non-standard Modbus implementation**:
- Communication via **Modbus TCP/IP**, Port **502**
- Modbus address is always **180**
- Variables are accessed by writing ASCII-encoded variable names (e.g., "v00104\0") to holding registers starting at register address 1
- Read and write operations exclusively support **Holding Registers** only
- Each read/write operation requires first writing the variable name as hex-encoded ASCII, then reading back the result
- The number of registers = (number of ASCII characters + null termination) / 2, rounded up

**This is NOT compatible with standard Modbus register-based access used in TapHome.** The easyControls 3.0 with Modbus RTU is the supported version.

---

## Chapter 1 — General Information

### 1.2 System Requirements

- Software version of the device must be at least **Version 2.01**
- If an older version is installed, update via the web interface: "Erstinbetriebnahme" > "Software jetzt aktualisieren"

### 1.3 The Modbus Interface (General)

- Communication via **Modbus TCP/IP**, Port **502**
- Modbus address is always **180**
- Only Holding Registers are supported (read and write)
- Access to other register types results in ILLEGAL_DATA_ADDRESS error
- Start address for reading/writing is always **register 1**
- Each register access uses hexadecimal notation, terminated with ASCII NULL (0x00)
- The count of registers needed = (number of ASCII hex pairs + null termination) / 2 (rounded up)

### 1.4 Modbus Simulation Programs

- **modpoll** — free command-line program (DOSBox under Windows): http://www.modbusdriver.com/modpoll.html
- **Modbus Poll** — Windows test program: http://www.modbustools.com/modbus_poll.asp
- Demo programs also available at: http://www.easycontrols.net → Download

---

## Chapter 2 — Modbus with modpoll.exe

### 2.1 Writing Variables

Variables are written in format "vXXXXX=YYYYY...\0" as hex-encoded ASCII characters. Register start address is always 1.

**Example:** Writing variable v00003 (Language) to "fr" (French):
```
modpoll -m tcp -a 180 -t4:hex -r 1 -0 -1 -o 2.0 192.168.1.10 0x7630 0x3030 0x3033 0x3D66 0x7200
```

### 2.2 Reading Variables

Reading requires a two-step process:
1. Write the variable name "vXXXXX\0" as hex-encoded ASCII to registers starting at address 1
2. Read back from register address 1 with the correct count of registers

**Example:** Reading v00004 (Date):
1. Write: `0x7630 0x3030 0x3034 0x0000` (encodes "v00004\0")
2. Read 9 registers → response decoded as ASCII: "v00004=11.12.0013/0"

### 2.3 Reading Wrong Number of Registers

- Too few registers (count < 4): Modbus slave cannot respond in "vXXXXX=YYYY...\0" format → ILLEGAL_DATA_ADDRESS exception
- Too many registers: Extra registers are filled with 0x0000

---

## Chapter 4 — Variable List

### System & Configuration Variables

| Description | Access | Type | Count | Variable | Notes | Min | Max |
|------------|--------|------|-------|----------|-------|-----|-----|
| Article designation | RW | char[31] | 20 | v00000 | W: 0 < strlen < 31 | - | - |
| Order number | RW | char[16] | 12 | v00001 | W: 0 < strlen < 17 | - | - |
| MAC address webserver | R | char[18] | 13 | v00002 | W: 0 < strlen < 17 | - | - |
| Language | RW | char[2] | 5 | v00003 | WR: "de", "en", "fr", "sl" | - | - |
| Date | RW | char[10] | 9 | v00004 | R: per format setting; W: dd.mm.yy only | - | - |
| Time | RW | char[10] | 9 | v00005 | R: Format hh:mm:ss; W: hh:mm:ss | - | - |
| Summer/Winter | RW | char[1] | 5 | v00006 | W: "o"=Active; R: 0=Winter, 1=Summer | - | - |
| Auto software updates | RW | char[1] | 5 | v00007 | W: "o"=Active; R: 0=Winter, 1=activated | - | - |
| Helios Portal access | RW | char[1] | 5 | v00008 | W: "o"=Active; R: 0=Winter, 1=activated | - | - |

### Fan Speed Variables

| Description | Access | Type | Count | Variable | Notes | Min | Max |
|------------|--------|------|-------|----------|-------|-----|-----|
| Fan voltage level 1 extract | RW | char[3] | 6 | v00012 | R: Format = .1f | 1.6 | 10 |
| Fan voltage level 1 supply | RW | char[3] | 6 | v00013 | R: Format = .1f | 1.6 | 10 |
| Fan voltage level 2 extract | RW | char[3] | 6 | v00014 | R: Format = .1f | 1.6 | 10 |
| Fan voltage level 2 supply | RW | char[3] | 6 | v00015 | R: Format = .1f | 1.6 | 10 |
| Fan voltage level 3 extract | RW | char[3] | 6 | v00016 | R: Format = .1f | 1.6 | 10 |
| Fan voltage level 3 supply | RW | char[3] | 6 | v00017 | R: Format = .1f | 1.6 | 10 |
| Fan voltage level 4 extract | RW | char[3] | 6 | v00018 | R: Format = .1f | 1.6 | 10 |
| Fan voltage level 4 supply | RW | char[3] | 6 | v00019 | R: Format = .1f | 1.6 | 10 |
| Min fan level | RW | char[1] | 5 | v00020 | RW: Fan level | 0 | 1 |

### Control & Mode Variables

| Description | Access | Type | Count | Variable | Notes | Min | Max |
|------------|--------|------|-------|----------|-------|-----|-----|
| KWL-BE activated | RW | char[1] | 5 | v00020 | RW: 0=Off, 1=On | 0 | 1 |
| KWL-BEC activated | RW | char[1] | 5 | v00022 | RW: 0=Off, 1=On | 0 | 1 |
| Device configuration | RW | char[1] | 5 | v00023 | RW: 1=DiBt, 2=Passivhaus | 1 | 2 |
| Preheating status | RW | char[1] | 5 | v00024 | RW: 0=Off, 1=On | 0 | 1 |
| Operating mode | RW | char[1] | 5 | v00101 | R: 0=Auto, 1=Manual; W: 0=Auto, 1=Manual | 0 | 1 |
| Fan level | RW | char[1] | 5 | v00102 | RW: Fan level | 0 | 4 |

### Humidity & CO2 Control Variables

| Description | Access | Type | Count | Variable | Notes | Min | Max |
|------------|--------|------|-------|----------|-------|-----|-----|
| Humidity control status | RW | char[1] | 5 | v00033 | RW: 1=RF, 2=Temp, 3=combined | 0 | 2 |
| Humidity control setpoint | RW | char[2] | 5 | v00034 | RW: in percent | 20% | 80% |
| Humidity control step | RW | char[2] | 5 | v00035 | RW: in percent | 5% | 20% |
| Humidity control stop time | RW | char[2] | 5 | v00036 | RW: in hours | 0h | 24h |
| CO2 control status | RW | char[1] | 5 | v00037 | RW: 0=Off, 2=Stepped, 3=Stepless | 0 | 2 |
| CO2 control setpoint | RW | char[4] | 6 | v00038 | RW: in ppm | 300 | 2000 |
| CO2 control step | RW | char[3] | 6 | v00039 | RW: in ppm | 50 | 400 |
| VOC control status | RW | char[1] | 5 | v00040 | RW: 0=Off, 2=Stepped, 3=Stepless | 0 | 2 |
| VOC control setpoint | RW | char[4] | 6 | v00041 | RW: in ppm | 300 | 2000 |
| VOC control step | RW | char[3] | 6 | v00042 | RW: in ppm | 50 | 400 |
| Comfort temperature | RW | char[4] | 6 | v00043 | R: Format = .1f | 10 | 25 |

### Temperature Sensor Variables (Read-Only)

| Description | Access | Type | Count | Variable | Notes | Min | Max |
|------------|--------|------|-------|----------|-------|-----|-----|
| Outdoor air temperature | R | char[7] | 8 | v00104 | R: Format = .1f, >=9999 = "-" | -27 | <9999 |
| Supply air temperature | R | char[7] | 8 | v00105 | R: Format = .1f, >=9999 = "-" | -27 | <9999 |
| Exhaust air temperature | R | char[7] | 8 | v00106 | R: Format = .1f, >=9999 = "-" | -27 | <9999 |
| Extract air temperature | R | char[7] | 8 | v00107 | R: Format = .1f, >=9999 = "-" | -27 | <9999 |
| VHZ channel sensor (outdoor T5) | R | char[7] | 8 | v00108 | R: Format = .1f, >=9999 = "-" | -27 | <9999 |
| NHZ return sensor (hot water T7) | R | char[7] | 8 | v00110 | R: Format = .1f, >=9999 = "-" | -27 | <9999 |
| Percentage fan level | R | char[3] | 6 | v00103 | R: percentage fan control | 0 | 100 |
| Supply air RPM | R | char[4] | 6 | v00348 | R: min^-1 | 0 | 9999 |
| Extract air RPM | R | char[4] | 6 | v00349 | R: min^-1 | 0 | 9999 |

### External Sensor Variables (Read-Only)

| Description | Access | Type | Count | Variable | Notes | Min | Max |
|------------|--------|------|-------|----------|-------|-----|-----|
| Ext. sensor KWL-FTF Humidity 1-8 | R | char[4] | 6 | v00111-v00118 | R: >=9999 = "-" | 0 | <9999 |
| Ext. sensor KWL-FTF Temp 1-8 | R | char[7] | 8 | v00119-v00126 | R: Format = .1f, >=9999 = "-" | -27 | <9999 |
| Ext. sensor KWL-CO2 1-8 | R | char[4] | 6 | v00128-v00135 | R: Format = .1f, >=9999 = "-" | 0 | <9999 |
| Ext. sensor KWL-VOC 1-8 | R | char[4] | 6 | v00136-v00143 | R: >=9999 = "-" | 0 | <9999 |

### Heat Exchanger & Maintenance Variables

| Description | Access | Type | Count | Variable | Notes | Min | Max |
|------------|--------|------|-------|----------|-------|-----|-----|
| VHZ type | RW | char[1] | 5 | v01010 | RW: 1=EH-Basis, 2=EH-ERW, 3=SEWT, 4=1-Interval, 2-Constant | 1 | 4 |
| Filter change | RW | char[1] | 5 | v01031 | RW: 0=No, 1=Yes | 0 | 1 |
| Change interval | RW | char[2] | 5 | v01032 | RW: in months | 0 | 12 |
| Remaining time | R | char[10] | 9 | v01033 | R: in minutes | 2 | 2^32-1 |
| Bypass room temp | RW | char[2] | 5 | v01035 | RW: in C | 10 | 40 |
| Bypass outdoor temp min | RW | char[2] | 5 | v01036 | RW: in C | 5 | 20 |

### Party & Quiet Mode Variables

| Description | Access | Type | Count | Variable | Notes | Min | Max |
|------------|--------|------|-------|----------|-------|-----|-----|
| Party mode duration | RW | char[3] | 6 | v00091 | RW: in minutes | 5 | 180 |
| Party mode fan level | RW | char[3] | 5 | v00092 | RW: fan level | 0 | 4 |
| Party mode remaining | R | char[3] | 6 | v00093 | R: in minutes | 0 | 180 |
| Party mode activate/cancel | RW | char[1] | 5 | v00094 | RW: 0=Off, 1=On | 0 | 1 |
| Quiet mode duration | RW | char[3] | 6 | v00096 | RW: in minutes | 5 | 180 |
| Quiet mode fan level | RW | char[1] | 5 | v00097 | RW: fan level | 0 | 4 |
| Quiet mode remaining | R | char[3] | 6 | v00098 | R: in minutes | 0 | 180 |
| Quiet mode activate/cancel | RW | char[1] | 5 | v00099 | RW: 0=Off, 1=On | 0 | 1 |

### Holiday & Weekly Program Variables

| Description | Access | Type | Count | Variable | Notes | Min | Max |
|------------|--------|------|-------|----------|-------|-----|-----|
| Holiday program | RW | char[1] | 5 | v00601 | RW: 0=Off, 1=Interval, 2=Constant | 0 | 2 |
| Holiday fan level | RW | char[1] | 5 | v00602 | RW: fan level | 1 | 4 |
| Holiday start | RW | char[10] | 9 | v00603 | RW: per date format | - | - |
| Holiday end | RW | char[10] | 9 | v00604 | RW: per date format | - | - |
| Holiday interval | RW | char[2] | 5 | v00605 | RW: hours | 1 | 24 |
| Holiday switch-on time | RW | char[3] | 6 | v00606 | RW: in minutes | 5 | 300 |
| Weekly profile NHZ | RW | char[1] | 5 | v00201 | RW: value for variables v00230..v00259 | 0 | 6 |

### Operating Hours & Status (Read-Only)

| Description | Access | Type | Count | Variable | Notes | Min | Max |
|------------|--------|------|-------|----------|-------|-----|-----|
| Software version basis | R | char[5] | 7 | v01101 | R: Format "xx.xx" | 0 | 99.99 |
| Operating hours supply fan | R | char[10] | 9 | v01103 | in minutes | 0 | 2^32-1 |
| Operating hours extract fan | R | char[10] | 9 | v01104 | in minutes | 0 | 2^32-1 |
| Operating hours VHZ | R | char[10] | 9 | v01105 | in minutes | 0 | 2^32-1 |
| Operating hours NHZ | R | char[10] | 9 | v01106 | in minutes | 0 | 2^32-1 |
| Output VHZ in % | R | char[10] | 9 | v01108 | value/100 | 0 | 2^32-1 |
| Output NHZ in % | R | char[10] | 9 | v01109 | value/100 | 0 | 2^32-1 |

### Error, Warning & Status Flag Variables

| Description | Access | Type | Count | Variable | Notes | Min | Max |
|------------|--------|------|-------|----------|-------|-----|-----|
| Errors (as int-value) | R | char[10] | 9 | v01123 | R: Bitcoded errors (see coding table) | 0 | 2^32-1 |
| Warnings (as int-value) | R | char[3] | 6 | v01124 | R: Bitcoded warnings | 0 | 2^8-1 |
| Infos (as int-value) | R | char[3] | 6 | v01125 | R: Bitcoded infos | 0 | 2^8-1 |
| Error count | R | char[2] | 5 | v01300 | R: Bitcoded error count from v01303 | 0 | 32 |
| Warning count | R | char[1] | 5 | v01301 | R: Bitcoded warning count from v01304 | 0 | 8 |
| Info count | R | char[1] | 5 | v01302 | R: Bitcoded info count from v01305 | 0 | 8 |
| Errors (string) | R | char[32] | 20 | v01303 | R: Error string, see coding tables | - | - |
| Warnings (string) | R | char[8] | 8 | v01304 | R: Warning string, see coding tables | - | - |
| Infos (string) | R | char[8] | 8 | v01305 | R: Info string, see coding tables | - | - |
| Status flags | R | char[32] | 20 | v01306 | R: Sysflags as string (see coding table) | - | - |

---

## Error Coding Tables (Variable v01303)

### Errors (32-bit bitmask)

| Bit | Error# | Hex | Description |
|-----|--------|-----|-------------|
| 0 | 1 | 0x00000001 | Fan speed error supply fan |
| 1 | 2 | 0x00000002 | Fan speed error extract fan |
| 2 | 3 | 0x00000004 | -free- |
| 3 | 4 | 0x00000008 | SD card error writing E-EPROM data (FLASH ring buffer FULL) |
| 4 | 5 | 0x00000010 | Bus overcurrent |
| 5 | 6 | 0x00000020 | -free- |
| 6 | 7 | 0x00000040 | BASIS: 0-Xing error VHZ EH (zero crossing detection) |
| 7 | 8 | 0x00000080 | Ext. module VHZ: 0-Xing error VHZ EH |
| 8 | 9 | 0x00000100 | Ext. module NHZ: 0-Xing error NHZ EH |
| 9 | 10 | 0x00000200 | BASIS: Internal temp sensor (T1) outdoor — missing/cable break |
| 10 | 11 | 0x00000400 | BASIS: Internal temp sensor (T2) supply — missing/cable break |
| 11 | 12 | 0x00000800 | BASIS: Internal temp sensor (T3) extract — missing/cable break |
| 12 | 13 | 0x00001000 | BASIS: Internal temp sensor (T4) exhaust — missing/cable break |
| 13 | 14 | 0x00002000 | BASIS: Internal temp sensor (T1) outdoor — short circuit |
| 14 | 15 | 0x00004000 | BASIS: Internal temp sensor (T2) supply — short circuit |
| 15 | 16 | 0x00008000 | BASIS: Internal temp sensor (T3) extract — short circuit |
| 16 | 17 | 0x00010000 | BASIS: Internal temp sensor (T4) exhaust — short circuit |
| 17 | 18 | 0x00020000 | Ext. module VHZ configured but not present or failed |
| 18 | 19 | 0x00040000 | Ext. module NHZ configured but not present or failed |
| 19 | 20 | 0x00080000 | Ext. module VHZ: channel sensor (T5) outdoor — missing/cable break |
| 20 | 21 | 0x00100000 | Ext. module NHZ: channel sensor (T6) supply — missing/cable break |
| 21 | 22 | 0x00200000 | Ext. module NHZ: channel sensor (T7) return — missing/cable break |
| 22 | 23 | 0x00400000 | Ext. module VHZ: channel sensor (T5) outdoor — short circuit |
| 23 | 24 | 0x00800000 | Ext. module NHZ: channel sensor (T6) supply — short circuit |
| 24 | 25 | 0x01000000 | Ext. module NHZ: channel sensor (T7) return — short circuit |
| 25 | 26 | 0x02000000 | Ext. module VHZ: safety limiter automatic |
| 26 | 27 | 0x04000000 | Ext. module VHZ: safety limiter manual |
| 27 | 28 | 0x08000000 | Ext. module NHZ: safety limiter automatic |
| 28 | 29 | 0x10000000 | Ext. module NHZ: safety limiter manual |
| 29 | 30 | 0x20000000 | Ext. module NHZ: frost protection hot water register (T7 < 7C) |
| 30 | 31 | 0x40000000 | Ext. module NHZ: frost protection via supply sensor (T6 < 7C) |
| 31 | 32 | 0x80000000 | Frost protection external hot water (fest < 5C, PH only) |

### Warnings (8-bit bitmask, Variable v01304)

| Bit | # | Hex | Description |
|-----|---|-----|-------------|
| 0 | 1 | 0x01 | Internal humidity sensor delivers no value |
| 1-7 | 2-8 | — | -free- |

### Infos (8-bit bitmask, Variable v01305)

| Bit | # | Hex | Description |
|-----|---|-----|-------------|
| 0 | 1 | 0x01 | Filter change |
| 1 | 2 | 0x02 | Frost protection WT |
| 2 | 3 | 0x04 | SD card error |
| 3 | 4 | 0x08 | External module failure (see LOG file) |
| 4-7 | 5-8 | — | -free- |

### StateFlags (32-bit bitmask, Variable v01306)

| Bit | # | Hex | Description |
|-----|---|-----|-------------|
| 0 | 1 | 0x00000001 | SYSTEM initialized (BT display until then: SYSTEM BOOTING) |
| 1 | 2 | 0x00000002 | SYSTEM software update active (BT display: SYSTEM LOADING) |
| 2 | 3 | 0x00000004 | Firmware update being activated |
| 3 | 4 | 0x00000008 | INBA active |
| 4 | 5 | 0x00000010 | Party mode active |
| 5 | 6 | 0x00000020 | Quiet mode active |
| 6 | 7 | 0x00000040 | Holiday mode active |
| 7 | 8 | 0x00000080 | VHZ on BASIS module configured |
| 8 | 9 | 0x00000100 | VHZ on extension module configured |
| 9 | 10 | 0x00000200 | Extension module VHZ active (BT display: show VHZ) |
| 10 | 11 | 0x00000400 | VHZ configured |
| 11 | 12 | 0x00000800 | VHZ: Heating type (0=Electric/Ground, 1=Air) |
| 12 | 13 | 0x00001000 | NHZ configured (temperature profile set, incl. HEIZUNG_AUS) |
| 13 | 14 | 0x00002000 | Extension module NHZ active (BT display: show NHZ) |
| 14 | 15 | 0x00004000 | NHZ active (control, error, identical to "Nachheizung.Ein") |
| 15 | 16 | 0x00008000 | NHZ: Heating type (0=Electric, 1=Hot water) |
| 16 | 17 | 0x00010000 | CO2 control on |
| 17 | 18 | 0x00020000 | Humidity control on |
| 18 | 19 | 0x00040000 | -free- |
| 19 | 20 | 0x00080000 | VOC control on |
| 20 | 21 | 0x00100000 | min. 1 external contact connected (EM or ES) |
| 21 | 22 | 0x00200000 | External contact function ACTIVE |
| 22 | 23 | 0x00400000 | Allow external access |
| 23 | 24 | 0x00800000 | External access active |
| 24 | 25 | 0x01000000 | Defrost heat exchanger |
| 25 | 26 | 0x02000000 | Defrost hot water register |
| 26 | 27 | 0x04000000 | Filter change due |
| 27 | 28 | 0x08000000 | Config_1 (DIBT) / 0 = Config_2 (PHI) |
| 28 | 29 | 0x10000000 | BEC-U1 deactivated via web (display function only) |
| 29 | 30 | 0x20000000 | Lock user interface |
| 30 | 31 | 0x40000000 | Master password required (set after 3 wrong password attempts) |
| 31 | 32 | 0x80000000 | Display fan level in % |

---

## Chapter 5 — Other/Notes

Helios accepts no liability for textual errors. Illustrations and information are non-binding. The right is reserved to make technical changes without notification.

**Use of the Modbus protocol is at the user's own risk.**
