TapHome

Geminox THRi

Modbus RTU
Submitted by
Last updated: 03. 2026

Requires external gateway

Amit DM-OT2

The Geminox THRi is a gas condensing boiler connected to TapHome through the Amit DM-OT2 OpenTherm-to-Modbus RTU gateway. The DM-OT2 translates the boiler’s OpenTherm protocol into Modbus RTU holding registers, giving TapHome access to temperature sensors, heating and DHW thermostats, burner status, and heat source power monitoring.

The template uses bitmask registers for status and control (H:100 and H:200), Float registers for temperatures and pressure, and a cyclic extra OT register reading mechanism to retrieve min/max values from OpenTherm data-IDs that are not mapped to standard registers.

Hardware connection

Gateway overview

The Amit DM-OT2 is a DIN-rail mounted converter with a galvanically isolated RS-485 interface and an OpenTherm/+ interface. It acts as an OpenTherm master, communicating with the boiler, and as a Modbus RTU slave on the RS-485 bus.

Technical specifications
  • Power supply: 20–30 V DC, max 30 mA
  • Operating temperature: -40°C to +70°C
  • Protocol: Modbus RTU Slave, RS-485
  • Baud rate: 9600, no parity, 2 stop bits
  • Max converters: 63 on a single RS-485 network
  • RS-485 isolation: Galvanic, 500 V AC
  • Mounting: 35 mm DIN rail
Terminal connections
TerminalSignalDescription
1G485RS-485 ground
2BRS-485 signal B (-)
3ARS-485 signal A (+)
4GNDPower supply ground
5+24VPower supply +24 V DC
6RC1OpenTherm/+ interface
7RC2OpenTherm/+ interface
RS-485 wiring to TapHome

Connect using a 3-wire RS-485 connection:

  • A (terminal 3) → A+/D+ on TapHome RS-485
  • B (terminal 2) → B-/D- on TapHome RS-485
  • G485 (terminal 1) → GND on TapHome power supply (mandatory)

Important — Grounding

The G485 ground wire must be connected between the DM-OT2 and the TapHome power supply. Without proper grounding, communication errors may occur.

Bus termination

The DM-OT2 has jumpers for RS-485 termination:

  • Jumpers fitted — terminal station (idle states and terminations active). Use on the last device on the bus.
  • Jumpers not fitted — intermediate station. Use on all other devices.

Both jumpers must always be set simultaneously.

Configuration

DIP switch addressing

DIP switches ADR0–ADR5 (switches 1–6) set the Modbus slave address (range 1–63). Address 0 is not permitted.

Address calculation: Each switch represents a binary value — ADR0=1, ADR1=2, ADR2=4, ADR3=8, ADR4=16, ADR5=32. Sum the values of switches in the ON position.

Address examples:

AddressSwitches ON
1ADR0
2ADR1
3ADR0 + ADR1
5ADR0 + ADR2
10ADR1 + ADR3

Recommended: Address 1 (ADR0=ON, all others OFF).

Communication speed

DIP switches COMM0–COMM3 (switches 7–10) configure the baud rate and parity. For TapHome, set:

  • COMM0: OFF, COMM1: OFF, COMM2: ON — this selects 9600 baud, no parity

With no parity selected, the DM-OT2 automatically uses 2 stop bits. Changes take effect immediately.

Protocol selection

DIP switch MODE (switch 11) selects the protocol:

  • Not fitted (OFF) — Modbus RTU (required for TapHome)
  • Fitted (ON) — ARION protocol

A change takes effect after a restart.

Device capabilities

Status monitoring

Three binary status sensors read individual bits from the Status register (H:100):

  • Burner (bit 4) — indicates whether the burner flame is active
  • Heating (bit 2) — indicates whether central heating is active
  • DHW Heating (bit 3) — indicates whether domestic hot water heating is active

These sensors update every 2500 ms and provide real-time visibility into the boiler’s operating state.

Heating and DHW control

Two enable switches control heating and DHW via the Control register (H:200):

  • Heating Enable (bit 5) — enables or disables central heating
  • DHW Enable (bit 6) — enables or disables domestic hot water heating

Both switches use a read-modify-write pattern: the template reads the full H:200 register, masks out the target bit, sets the new value, and writes back. A counter-based debounce (cnt=5 polling cycles) ensures the switch shows the written state immediately after toggling, preventing flickering while the boiler processes the command.

Temperature thermostats

Two thermostat devices provide both current temperature reading and setpoint control:

  • Heating Circuit Temperature — reads the current flow temperature from H:102 (Float) and reads/writes the desired temperature to H:201 (Float). A service attribute shows the min/max setpoint range from OpenTherm data-ID 49.
  • DHW Thermostat — reads the current DHW temperature from H:106 (Float) and reads/writes the desired temperature to H:205 (Float). A service attribute shows the min/max setpoint range from OpenTherm data-ID 48.
Temperature sensors

Three read-only temperature sensors provide additional monitoring:

  • Flue Gas Temperature (H:118) — exhaust gas temperature from the boiler, useful for monitoring combustion efficiency
  • Return Water Temperature (H:108) — return water temperature from the heating circuit
  • Outdoor Temperature (H:110) — outdoor ambient temperature from the boiler’s sensor, used for weather-compensated heating curves

All temperature registers use 32-bit Float format (2 consecutive holding registers).

Pressure monitoring
  • Heating Circuit Pressure (H:114) — water pressure in the heating circuit in bar. Low pressure may indicate a water leak or the need to refill the system.
Heat source power
  • Heat Source Power — a dimmer model representing the boiler’s modulation level. Two service attributes from OpenTherm data-ID 15 show the minimum modulation percentage and the maximum boiler power in kW.

Extra OpenTherm register reading

The template includes a cyclic mechanism for reading OpenTherm data-IDs that are not directly mapped to standard Modbus registers. This is used to retrieve min/max temperature ranges and boiler capacity data.

How it works:

  1. The module ReadScript enables extra OT register reading by setting bit 10 of H:200
  2. It writes the desired OpenTherm data-ID to H:216 and triggers a read via H:217
  3. The response appears in H:120, with status in H:121 (1=success, 3=error)
  4. The script cycles through three data-IDs: 48 (DHW min/max), 49 (heating min/max), and 15 (boiler capacity)

The retrieved values are stored in internal variables (TUV_MM, Top_MM, Kotol_MM) and made available as service attributes on the corresponding devices.

Service diagnostics

The module exposes nine service attributes for monitoring:

  • Gateway ID (H:0) — confirms the gateway type (197 = DM-OT2)
  • Firmware Version (H:1) — current gateway firmware version
  • Time (H:2) — gateway uptime counter
  • Guard Time (H:4) — Modbus communication failure evaluation timeout in milliseconds
  • Reset Counter (H:8) — number of gateway resets (resettable via service action)
  • Modbus Message Counter (H:9) — total Modbus messages processed (resettable via service action)
  • DHW Present (H:100, bit 6) — whether DHW heating capability is available
  • TV2 Present (H:100, bit 7) — whether a secondary heating circuit is available
  • Heat Source Power [%] (H:112) — current boiler modulation as a percentage

Two service actions allow resetting the gateway counters:

  • Reset Reset Counter — clears the gateway reset counter (H:8)
  • Reset Modbus Message Counter — clears the Modbus message counter (H:9)

The module ReadScript also monitors OpenTherm communication status (H:100 bit 0) and device errors (H:100 bit 1, H:101), reporting them as errors and warnings in TapHome.

LED indicators

LEDFunction
PWRConverter is powered
RxDReceiving data on RS-485
TxDTransmitting data on RS-485
RxOTReceiving data on OpenTherm
TxOTTransmitting data on OpenTherm

Normal state: PWR on, RxD/TxD blink during Modbus communication, RxOT/TxOT blink during OpenTherm communication.

Troubleshooting

No Modbus communication (RxD/TxD LEDs not blinking)
  1. Check RS-485 cables:
    • A (terminal 3) correctly connected to A+/D+ on TapHome
    • B (terminal 2) correctly connected to B-/D- on TapHome
    • G485 (terminal 1) connected to TapHome power supply ground — most common issue
  2. Verify the Modbus slave address on DIP switches ADR0–ADR5
  3. Confirm DIP switch MODE is OFF (Modbus RTU selected)
  4. Check the communication speed settings (COMM0=OFF, COMM1=OFF, COMM2=ON for 9600 baud)
  5. Confirm TapHome is set to: 9600 baud, no parity, 2 stop bits
No OpenTherm communication (RxOT/TxOT LEDs not blinking)
  1. Check the wiring between RC1/RC2 terminals and the boiler’s OpenTherm connector
  2. Verify the boiler supports OpenTherm (not all Geminox models have an OT interface)
  3. Check that the DM-OT2 has correct power supply (20–30 V DC)
OT communication error in TapHome

If TapHome reports “OT communication error” (Status bit 0 = 0):

  1. Check the OpenTherm wiring between the DM-OT2 and the boiler
  2. Restart the DM-OT2 by cycling power
  3. Check the Guard Time service attribute — if set to 0, the connection is permanently marked as disconnected
Device error in TapHome

If TapHome reports “Device error” (Status bit 1 = 1):

  1. Read the Last Error register value from TapHome warnings
  2. Consult the boiler’s service manual for the specific error code
  3. The error originates from the boiler itself, not the gateway
Additional capabilities

The DM-OT2 gateway also exposes registers for boiler supply water temperature (H:116), direct DHW temperature (H:104), and additional control bits on H:200 for OT communication enable and error acknowledgment. These can be added in a future template update.

Available devices

Geminox THRi (via Amit DM-OT2) Module
Service Attributes
Gateway IDreads H:0 (UInt16); switch: 197=\'DM-OT2\', other=\'Unknown\'; identifies the Amit DM-OT2 gateway
Firmware Versionreads H:1 (UInt16); gateway firmware version number
Timereads H:2 (UInt32); gateway uptime or system time counter
Guard Time [ms]reads H:4 (UInt16); Modbus guard time in milliseconds
Reset Counterreads H:8 (UInt16); number of gateway resets since last clear
Modbus Message Counterreads H:9 (UInt16); total Modbus messages processed since last clear
DHW Presentreads bit 6 of Status (H:100); \'Yes\' if DHW heating is available, \'No\' otherwise
TV2 Presentreads bit 7 of Status (H:100); \'Yes\' if secondary heating circuit (TV2) is available, \'No\' otherwise
Heat Source Power [%]reads H:112 (Float); current boiler modulation/power output as percentage
Service Actions
Reset Reset Counterwrites H:8 (UInt16) = 0; clears the gateway reset counter
Reset Modbus Message Counterwrites H:9 (UInt16) = 0; clears the Modbus message counter

Geminox THRi (cez Amit DM-OT2)

Read (module)
Status := modbusr(H, 100, Uint16);
if(getbit(Status, 0) = 0, adderror("Chyba komunikacie OT"));
if(getbit(Status, 1) = 1, adderror("Chyba zariadenia OT"));

var lastError := modbusr(H, 101, Uint16);
if(lastError != 0, addwarning("Chyba zariadenia " + lastError));

# povol citanie extra OT registrov
var ret := modbusr(H, 200, Uint16);
if getbit(ret, 10) = 0
    modbusw(H, 200, Uint16, ret + (1 << 10));
end

# citanie extra OT registrov
var reg := modbusr(H,216,Uint16);
var stat := modbusr(H,121,Uint16);
var out := 0;
if reg = 48
    #TUV Min/Max
    if  stat = 1
        out := modbusr(H,120,Uint16);
        TUV_MM := out;
        modbusw(H, 216, Uint16, 49);
        modbusw(H, 217, Uint16, 1);
    end
elseif reg = 49
    #kurenie Min/Max
    if stat = 1
        out := modbusr(H,120,Uint16);
        Top_MM := out;
        modbusw(H, 216, Uint16, 15);
        modbusw(H, 217, Uint16, 0);
    end
elseif reg = 15
    #kotol Min/Max
    if stat = 1
        out := modbusr(H,120,Uint16);
        Kotol_MM := out;
        modbusw(H, 216, Uint16, 48);
        modbusw(H, 217, Uint16, 1);
    end 
else
    #zaciname s TUV Min/Max
    modbusw(H, 216, Uint16, 48);
    modbusw(H, 217, Uint16, 1);
end

if modbusr(H,121,Uint16) = 3
    #ak chyba zaciname odznova s TUV Min/Max
    modbusw(H, 216, Uint16, 48);
    modbusw(H, 217, Uint16, 1);
end
Service Attributes
ID
switch(modbusr(H, 0, Uint16),
197, "DM-OT2",
"Unknown")
Verze firmware
modbusr(H, 1, Uint16)
Čas
modbusr(H, 2, Uint32)
GuardTime [ms]
modbusr(H, 4, Uint16)
Počítadlo resetů
modbusr(H, 8, Uint16)
Počítadlo MODBUS zpráv
modbusr(H, 9, Uint16)
Ohřev TUV přítomen
if(getbit(Status, 6), "Ano", "Ne")
TV2 přítomna
if(getbit(Status, 7), "Ano", "Ne")
Výkon topného zdroje [%]
modbusr(H, 112, Float)
Service Actions
Nulovat Počítadlo resetů
modbusw(H, 8, Uint16, 0)
Nulovat Počítadlo MODBUS zpráv
modbusw(H, 9, Uint16, 0)
Burner Reed Contact Read-only

Burner flame status — active when the boiler burner is firing

Register: H:100 UInt16 bitmask

Burner

Read
getbit(Status, 4)
Heating Reed Contact Read-only

Central heating status — active when the heating circuit is running

Register: H:100 UInt16 bitmask

Heating

Read
getbit(Status, 2)
DHW Heating Reed Contact Read-only

Domestic hot water heating status — active when the DHW circuit is running

Register: H:100 UInt16 bitmask

DHW Heating

Read
getbit(Status, 3)
Heating Enable Switch

Enables or disables central heating via read-modify-write on the control register

Register: H:200 UInt16 bitmask

Heating Enable

Read switch state
if cnt = 0
    var ret := getbit(modbusr(H,200,Uint16), 5);
    return (ret);
else
    cnt := cnt -1;
    return (St);
end
Write switch state
var ret := modbusr(H,200,Uint16);
var x := (ret & 0xffdf) + (St << 5);
modbusw(H, 200, Uint16, x);
cnt := 5;
DHW Enable Switch

Enables or disables domestic hot water heating via read-modify-write on the control register

Register: H:200 UInt16 bitmask

DHW Enable

Read switch state
if cnt = 0
    var ret := getbit(modbusr(H,200,Uint16), 6);
    return (ret);
else
    cnt := cnt -1;
    return (St);
end
Write switch state
var ret := modbusr(H,200,Uint16);
var x := (ret & 0xffbf) + (St << 6);
modbusw(H, 200, Uint16, x);
cnt := 5;
Flue Gas Temperature Temperature Sensor Read-only

Exhaust gas temperature from the boiler combustion chamber

Register: H:118 Float Unit: °C numeric

Flue Gas Temperature

Read temperature
MODBUSR(H, 118, Float)
Return Water Temperature Temperature Sensor Read-only

Return water temperature from the heating circuit

Register: H:108 Float Unit: °C numeric

Return Water Temperature

Read temperature
MODBUSR(H, 108, Float)
Heating Circuit Temperature Thermostat

Heating circuit flow temperature with adjustable setpoint and min/max range from OpenTherm

Register: H:102H:201 Float Unit: °C numeric
Service Attributes
Heating Circuit Min / Max Temperature

Heating Circuit Temperature

Read temperature
MODBUSR(H, 102, Float)
Read desired temperature
MODBUSR(H, 201, Float)
Write desired temperature
MODBUSW(H, 201, Float, Se)
Service Attributes
Min / Max Teplota Vykurovacieho okruhu
getbyte(Top_MM, 1) + "/" + getbyte(Top_MM, 0)
Heating Circuit Pressure Variable Read-only

Water pressure in the heating circuit

Register: H:114 Float Unit: bar numeric

Heating Circuit Pressure

Read
MODBUSR(H, 114, Float)
DHW Thermostat Thermostat

Domestic hot water temperature with adjustable setpoint and min/max range from OpenTherm

Register: H:106H:205 Float Unit: °C numeric
Service Attributes
DHW Min / Max Temperature

DHW Thermostat

Read temperature
MODBUSR(H, 106, Float)
Read desired temperature
MODBUSR(H, 205, Float)
Write desired temperature
MODBUSW(H, 205, Float, Se)
Service Attributes
Min / Max Teplota TUV
getbyte(TUV_MM, 1) + "/" + getbyte(TUV_MM, 0)
Outdoor Temperature Temperature Sensor Read-only

Outdoor ambient temperature from the boiler sensor

Register: H:110 Float Unit: °C numeric

Outdoor Temperature

Read temperature
MODBUSR(H, 110, Float)
Heat Source Power Dimmer Read-only

Boiler modulation level with min modulation percentage and max power service attributes

Service Attributes
Min Modulation [%]
Max Power [kW]

Heat Source Power

Read level
MODBUSR(H, 112, Float) / 100
Service Attributes
Minimalna modulacia [%]
getbyte(Kotol_MM, 1)
Max vykon [kW]
getbyte(Kotol_MM, 0)
Connection: Modbus RTU • 9600 baud• 8N2 • Slave ID: $[SlaveId]
Possible improvements (5)
  • H:104 DHW Temperature (direct) — H:104 Float — likely DHW flow temperature; not exposed as separate device (DHW Thermostat uses H:106 for current)
  • H:116 Boiler Water Temperature — H:116 Float — boiler flow/supply water temperature; could complement return water temp
  • H:200 bit 0 OT Communication Enable — Bit 0 of H:100 indicates OT comm status; corresponding control bit on H:200 could enable/disable OT communication
  • H:200 bit 1 Device Error Acknowledge — Bit 1 of H:100 indicates device error; potential error acknowledgment via H:200
  • H:203 Heating Circuit Desired Temperature (alternative) — Potential alternative setpoint register; template uses H:201 for heating circuit desired temp

Sources