Introduction
The house I live in features so called 'heat recovery ventilation' (in Dutch, Warmte Terugwin Ventilatie 'WTW'), which has extremely limited control. Whenever there is smoke or dust outside we have to unplug it as it has no normal 'off' setting. A few years ago I did add an MQTT controlled relay to the power switch so we could at least quickly turn it off when needed, but this did not provide speed control and wasn't quite ideal. Therefore it was my goal to give it a little bit better speed management through whatever interface I could find on the device, which turned out to be OpenTherm.
This write-up details my intial exploration of the HRV system and OpenTherm. It provides the final set of IDs I could use to communicate with the HRV.
Heat Recovery Ventilation (HRV)
The unit installed in our house is a 'Brink Renovent HR Medium/Large'. The idea of this system is to provide mechanical ventilation, but instead of just pulling in cold air from the outside, it performs a heat exchange. This allows the system to use the outgoing warm air to heat up the fresh cold air, saving energy. It actually works nicely for this purprose. However as it pulls in air from one intake on the outside of the house it is sensitive to bad quality air getting sucked in. As I live in a rural area, sometimes smoke and dusty air can occur and we do turn off the device then.
Control
By default, its only form of control is a three way knob which allows you to switch between three speeds, '1100', '2200' and '3300'. The knob switches a set of 24V contacts to signal to the HRV which speed it should run at.
My initial idea was to simply replace this switch with a set of relays to very rudimentary control the speed. However this would mean replacing the existing knob, meaning it would no longer function. This would not be idea, because if my new control system would fail I want some kind of basic fall back. However, reading through the entire manual I found a mention of speed control through OpenTherm. It seems that this option was added for some extra control box which would allow ventilation speed based on CO2 levels and the like. Now if some other box can use OpenTherm to control the HRV, then surely I could use it too!
OpenTherm endeavors
The manual did not provide any more details on the OpenTherm control and details on OpenTherm for HRV system on the internet are fairly scarse. I couldn't find any other projects or products that mentioned this HRV with OpenTherm control. I ended up calling the manufactorer who refused to provide any more information beyond 'You should have bought the special control box when you got the HRV'. Obviously that wouldn't do. I ended up finding various open source OpenTherm projects. The well established 'OpenTherm Gateway' (https://otgw.tclcode.com/index.html#intro) didn't seem really suitable for what I wanted! After some more searching I found the perfect Arduino shield: (https://www.tindie.com/products/jiripraus/opentherm-gateway-arduino-shield/)[https://www.tindie.com/products/jiripraus/opentherm-gateway-arduino-shield/]. The hardware seemed to do exactly what I wanted, a nice well documented interface for the OpenTherm protocol.
After about a week shipping delay and some initial troubles I got the hardware running with my Arduino. The next step was to connect to via OpenTherm to the HRV.
OpenTherm Protocol exploration
The OpenTherm protocol is poorly documentated. The only standard I could find is v2.2 from 2003! (https://github.com/jpraus/arduino-opentherm/raw/master/doc/Opentherm%20Protocol%20v2-2.pdf)[https://github.com/jpraus/arduino-opentherm/raw/master/doc/Opentherm%20Protocol%20v2-2.pdf] This standard does not make any mention of ventilation systems and features only a few message IDs. However, it does provide some very nice background on how the protocol works.
The OpenTherm website it self is rather broken, but does provide some secret documents if you are willing to do some webscrapping.
I found two key items:
(OpenTherm-Function-Matrix-v1_0.xlsx)[https://www.opentherm.eu/document/opentherm-function-matrix-v1-0/]
'Honeywell OpenTherm TestTool V2.4'
The first document is an excel 'tool' which specifies for every type of OpenTherm device what message IDs it needs to support. The second item is a zip folder which provides a testing tool, some manual, but most importantly a text file with all the message IDs, whether they provide READ or WRITE access and the associated data types (as of version 2.3b):
;Data-Id Map (OpenTherm Technical Specifications v2.3b)
;Remarks: This is a complete list of available defined ID's
; it can be edited with a text editor. combined read/write ID's
; are on 2 seperate lines. To reduce the number of lines,
; delete non used ID's
0,STATUS,READ,FLAG,00000000,FLAG,00000000,Yes
1,"CONTROL SETPOINT",WRITE,F8.8,0,100,"10,00",Yes
2,"MASTER CONFIG/MEMBERID",WRITE,FLAG,00000000,U8,0,255,0,Yes
3,"SLAVE CONFIG/MEMBERID",READ,FLAG,00000000,U8,0,255,0,Yes
4,"COMMAND",WRITE,U8,0,255,2,U8,0,255,0,Yes
With these two items I could try to read some data from my HRV.
Reading data from the HRV
I used the Tindie board with very simple script that simply tries to read data from all possible message IDs to see what the HRV would respond to. The content of the responses didn't matter too much as I would need to corrolate it with the TestTool document and Excel sheet after the fact. I ended up getting the correct reads for the following IDs:
70
72
74
75
77
80
81
82
83
86
88
89
After some correlation with the other documents I could correctly read the current nominal ventilation speed and the temperature sensors. I've added these message IDs for the Arduino OpenTherm board: https://github.com/jpraus/arduino-opentherm/pull/19/commits/fea13843fa5c8adc354b4bf285e166225b880be3
Conclusion
With this all setup I could now read data from the HRV so the next step was to write data to it to control it and allow some remote control, which will be the next write-up.
References
https://en.wikipedia.org/wiki/Heat_recovery_ventilation https://www.opentherm.eu/document/ https://www.tindie.com/products/jiripraus/opentherm-gateway-arduino-shield/ https://github.com/ihormelnyk/opentherm_library