Manual · for version 1.4.6 · View on GitHub
This manual comes from the public repository of the Home Assistant integration. It still uses the old name OpenThermostat, and calls the box the E32: the BBQKees Gateway E32 V2 that Emthera runs on today.
Devices: what OpenThermostat reads, and how sure we are #
The firmware and the project's main repository are not public at the moment. What these guides say about downloading the firmware or a release ZIP from GitHub, updating the E32's firmware from Home Assistant or with Check for updates, and the tester program's GitHub form does not work for now. The Home Assistant integration is installed and updated through the Marketplace as described. A few references to pages that are not public have no link here. Questions or problems: open an issue.
OpenThermostat works with devices of many brands. This page says which routes work for any device, which devices we have tested and how: verified with a real capture (what a real device sent, kept as a test), or built from the device description, not yet confirmed (made from what Zigbee2MQTT or Home Assistant says the device sends). Every device in the table below is a test that runs on every build, so a change that would stop reading it is caught before a release.
Your device is not in the table, or not read well? Add a device: send a capture. It takes a few minutes, and from then on every build is tested against your device.
Any device, through Home Assistant #
These routes do not depend on the brand:
- Radiator valve: any valve Home Assistant knows as a
climateentity (ZHA, Z-Wave, Zigbee2MQTT, Shelly, a cloud integration). Choose it in the room's form, section Radiator valves; Home Assistant then drives it on the E32's rules. Its target temperature comes from the entity'stemperature, or fromtarget_temp_lowwhen the device has only a temperature range. Its battery comes from a battery sensor on the same device, its opening from a position sensor when it has one. - Setting device (the thermostat or knob you set a room with): any
climate,numberorinput_numberentity. A thermostat with only a temperature range (such as the Bosch Room thermostat II) works through itstarget_temp_low. - Thermometer: any Home Assistant temperature sensor, or a Bluetooth thermometer the E32 hears itself (pvvx, Shelly H&T, Xiaomi).
Zigbee2MQTT valves the E32 drives itself #
For the valve models it knows (Bosch BTH-RA, Sonoff TRVZB, Sonoff TRV Gen2, Tuya TV02), the E32 talks to Zigbee2MQTT on the same MQTT broker itself, also when Home Assistant is away. For any other Zigbee2MQTT valve choose Other (setpoint only). It reads the common names in this order and uses the first one the valve sends:
- target temperature:
occupied_heating_setpoint, thencurrent_heating_setpoint; the E32 writes the target temperature under the name the valve itself uses; - opening:
position, thenpi_heating_demand; only shown, the boiler never relies on the opening of a valve the E32 does not know; - battery:
battery(a percentage) andbattery_low(a flag); - mode:
system_mode, thenpreset; only to see that someone switched the valve off, which the E32 then leaves alone.
A message the E32 cannot read (too large, cut off, not a device state) is never dropped silently: the E32's System → Diagnostics and system log page and Home Assistant's Diagnostics tab (Connection with the E32) say "Messages the E32 could not read since it started: 3, last: zigbee2mqtt/…, too large (7.1 KB)". Put that line in your report.
The device matrix #
The table is generated from the test collection (test/fixtures/devices/) by tools/dev/device_matrix.py, so it
says exactly what the tests hold.
Radiator valves #
| Device | How it is connected | Status | What the E32 reads | Known limits |
|---|---|---|---|---|
| Bosch BTH-RA (Radiator thermostat II) | Zigbee2MQTT, read by the E32 as bosch_bth_ra or as a Home Assistant climate entity |
Built from the device description, not yet confirmed | target temperature; opening; battery %; its own temperature; mode | operating_mode pause is its own window detection: the E32 leaves it alone. |
| Sonoff TRV Gen2 (TRV-ZBT) | Zigbee2MQTT, read by the E32 as sonoff_trv_zbt |
Verified with a real capture | target temperature; battery %; its own temperature; mode; sensor choice | No valve position: heating/idle_valve_position are limits, not a readback; the E32 drives it by temperature (Sonoff: the Gen2 cannot be driven by position). Needs Zigbee2MQTT 2.12.1 or later. Its whole state is 2.2-2.4 KB: read since E32 1.4.4 (up to 6 KB); E32 1.4.3 dropped it (#15). |
| Sonoff TRV Gen2 (TRV-ZBT), update on offer | Zigbee2MQTT, read by the E32 as sonoff_trv_zbt |
Verified with a real capture | target temperature; battery %; its own temperature; mode; sensor choice | No valve position: heating/idle_valve_position are limits, not a readback; the E32 drives it by temperature (Sonoff: the Gen2 cannot be driven by position). Needs Zigbee2MQTT 2.12.1 or later. Its whole state is 2.2-2.4 KB: read since E32 1.4.4 (up to 6 KB); E32 1.4.3 dropped it (#15). |
| Sonoff TRVZB | Zigbee2MQTT, read by the E32 as sonoff_trvzb or as a Home Assistant climate entity |
Built from the device description, not yet confirmed | target temperature; battery %; its own temperature; mode; sensor choice | No valve position (valve_opening_degree is a limit); driven by temperature. Older Zigbee2MQTT names the sensor select external/internal: the E32 reads both. |
| Tuya TV02 (TS0601) | Zigbee2MQTT, read by the E32 as tuya_tv02 or as a Home Assistant climate entity |
Built from the device description, not yet confirmed | target temperature; low-battery flag; its own temperature; mode | A low-battery flag only, no battery percentage. No valve position; driven by temperature. |
Setting devices #
| Device | How it is connected | Status | What the E32 reads | Known limits |
|---|---|---|---|---|
| Bosch Room thermostat II (BTH-RM) | Zigbee2MQTT or any integration, as a Home Assistant climate entity | Verified with a real capture | target temperature from target_temp_low (a temperature range only) |
A temperature range only (supported_features 386): the target temperature is target_temp_low (the Bosch's occupied_heating_setpoint), target_temp_high its cooling setpoint; read so since integration 1.3.0, on the room card since 1.4.4 (#16). The E32 test also reads its Zigbee2MQTT state as an unknown valve (model generic). |
Thermometers #
| Device | How it is connected | Status | What the E32 reads | Known limits |
|---|---|---|---|---|
| Aqara Climate Sensor W100 (TH-S04D) | Zigbee2MQTT or any integration, through its Home Assistant temperature sensor | Verified with a real capture | room temperature through Home Assistant | The E32 test also reads its Zigbee2MQTT state as an unknown valve (model generic): target temperature, battery, mode. |
| Sonoff SNZB-02B | Zigbee2MQTT or any integration, through its Home Assistant temperature sensor | Verified with a real capture | room temperature through Home Assistant | none known |
| Sonoff SNZB-02UL | Zigbee2MQTT or any integration, through its Home Assistant temperature sensor | Verified with a real capture | room temperature through Home Assistant | none known |
Boilers #
| Device | How it is connected | Status | What the E32 reads | Known limits |
|---|---|---|---|---|
| Nefit EcomLine HRC 22H | EMS Classic behind a Bosch EasyControl Adapter (0x08) | Verified with a real capture | The boiler's 0x18 and 0x34 broadcasts with a tap and a keep-warm episode (test_dhw_episodes); the E32 has driven it since 1.0. | none known |
| Nefit TopLine AquaPower+ HRC 25/CW6 | EMS Classic, directly on the bus (product 115, version 3.6), with a hot water storage tank | Verified with a real capture | The boiler's UBAMonitorFast (0x18) and UBAMonitorWW (0x34) broadcasts, hot water with a storage tank (test_dhw_episodes). | Only the boiler's 0x18 and 0x34 lines of the recording are kept here. |