Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OpenTherm v3.0 Compatibility? #1

Open
regnerus opened this issue Jun 12, 2018 · 24 comments
Open

OpenTherm v3.0 Compatibility? #1

regnerus opened this issue Jun 12, 2018 · 24 comments

Comments

@regnerus
Copy link

I understand this might be the wrong repository to ask such a question, however I was wondering if you have any information about compatibility with OpenTherm protocol specification v3.0. Unfortunately I can not find the specification information online but as I understand the signal low and signal high voltages are higher then with specification V2.2.

If I measure the voltage between the OpenTherm connections on my central heating unit/boiler I measure around 26.5V. Would it be possible to switch out the Zeners to higher value ones? Furthermore does anyone happen to know what the signal low and signal high values for V3.0 are? I assume the signal low will be around that 26.5V, but is there a method to also measure the signal high voltage?

Help would be greatly appreciated however please do not hesitate to close this issue since it is not directly related to the OpenTherm library.

@ihormelnyk
Copy link
Owner

ihormelnyk commented Jun 12, 2018

Hi @regnerus ,
I can't find OpenTherm v3.0 specification also, but most likely these specifications are compatible by voltage levels. OpenTherm is low power protocol, so you can see higher values on unconnected wires. I think you will see valid voltage levels if you connect boiler to some opentherm thermostat or adapter

@regnerus
Copy link
Author

regnerus commented Jun 13, 2018

Hi @ihormelnyk, thanks for the fast reply! I know that the specification is not online... I actually emailed the OpenTherm association about this however you have to become a (paid) member in order to see those documents.

I have the Honeywell Round Modulation thermostat which supports OpenTherm. I tried however to build an OpenTherm adapter to the exact schematic and components as provided on your page and validated that all the connections are working as supposed to, however I get a constant timeout message from the Arduino library.

The wikipedia page about OpenTherm https://en.wikipedia.org/wiki/OpenTherm mentions OpenTherm V3.0 which has something called OpenTherm Smart Power, to allow thermostats running of the power from the connection, which got me wondering if the actual voltages could differ in that case or if just the amperage is different.

Currently I am just trying to explore all options to why the adapter I've built is not working...

@ihormelnyk
Copy link
Owner

Hi @regnerus ,
What kind of controller do you use, what pins do you use for communication between controller and adapter? Are you sure that adapter output pin connected to controller input pin and adapter input pin to controller output pin and they are properly configured in sketch? Can you attach some photos?

@regnerus
Copy link
Author

regnerus commented Jun 13, 2018

@ihormelnyk I used the exact schematic and components as in this post (http://ihormelnyk.com/Page/arduino_opentherm_controller) with the exception that I used a rectifier IC that I still had laying around instead of 4 separate diodes.

Here are two screenshots from Eagle, I used to board layout to visualise how the components fit on the breadboard but I soldered the connections by hand so the traces are different in reality of course.
screen shot 2018-06-13 at 20 25 20
screen shot 2018-06-13 at 20 25 38

I'll update this post with some pictures of the physical breadboard and the connections when I get home.

Update I see now that the value of the transistor is wrong in the schematic, I used the BC558A.

I also created a version on a solderless breadboard so I can quickly debug by switching components.

For debugging I am currently running the code on an (original) Arduino Uno, however if I get it to work I would like to include an ESP8266 controller (For example a Wemos).

@ihormelnyk
Copy link
Owner

So you've used this sketch https://github.com/ihormelnyk/opentherm_library/blob/master/examples/OpenTherm_Demo/OpenTherm_Demo.ino and J2.IN is connected to UNO GPIO2 and J2.OUT to GPIO3? Does boiler enable heating when adapter is connected?

@zenz
Copy link

zenz commented Nov 10, 2021

Any updates for this topic? I have a BAXI boiler which run with OT 3.0. But I found that with This OT Library, I can only read states from boiler, but cannot set any thing including boiler status(heaitng on off extra).

@diyless
Copy link

diyless commented Nov 10, 2021

@zenz there is 4.2 version already, it is fully compatible with 2.2 version, there are no breaking changes.

@zenz
Copy link

zenz commented Nov 10, 2021

@zenz there is 4.2 version already, it is fully compatible with 2.2 version, there are no breaking changes.

As I tested with my BAXI boiler, it's running with OT3.0, I have to add some more status bits to make it to work.
In OT3.0 the HB flag8 have these description:
bit:description {clear/0, set/1}
0: CH enable [CH is disabled, CH is enabled]
1: DHW enable [DHW is disabled, DHW is enabled]
2: Cooling enable [Cooling is disabled, Cooling is enabled]
3: OTC active [OTC not active, OTC is active]
4: CH2 enable [CH2 is disabled, CH2 is enabled]
5: Summer/winter mode [winter mode active, summer mode active]
6: DHW blocking [DHW unblocked, DHW blocked]
7: reserved

I have to set bit 5 to true to disable winter mode. or else the boiler will enable CH automatically. so weird.
I don't know if it's OT design or BAXI's design.

@ihormelnyk
Copy link
Owner

You are not the first who is saying about weird Baxi logic. A common practice in addition to clearing CH flag is to set the boiler temperature to 10 degrees celsius.

@pavon87
Copy link

pavon87 commented Dec 14, 2021

Hi @senz
Which boiler do you have? Recently I install a BAXI Compact Platinium 30/30, and almost everything it's working fine (enable / disable hot water, set temperature of hot water, enable / disable heating, setting the temperature of heating with PID) except the most important, tell to boiler when must start heating or stop, in other words, the thermostat.

@Evgen2
Copy link

Evgen2 commented Feb 11, 2022

Any updates for this topic? I have a BAXI boiler which run with OT 3.0. But I found that with This OT Library, I can only read states from boiler, but cannot set any thing including boiler status(heaitng on off extra).

Just look at code and wonder why setBoilerStatus() call buildSetBoilerStatusRequest() were in turn
return buildRequest(OpenThermMessageType::READ_DATA, OpenThermMessageID::Status, data);

seems that setBoilerStatus() really is getBoilerStatus(), and right setBoilerStatus() must call buildRequest(OpenThermMessageType::WRITE_DATA, ....

@zenz
Copy link

zenz commented Feb 11, 2022

Should read the OT protocol definition. READ_DATA is correct for this MSG ID.

Any updates for this topic? I have a BAXI boiler which run with OT 3.0. But I found that with This OT Library, I can only read states from boiler, but cannot set any thing including boiler status(heaitng on off extra).

Just look at code and wonder why setBoilerStatus() call buildSetBoilerStatusRequest() were in turn return buildRequest(OpenThermMessageType::READ_DATA, OpenThermMessageID::Status, data);

seems that setBoilerStatus() really is getBoilerStatus(), and right setBoilerStatus() must call buildRequest(OpenThermMessageType::WRITE_DATA, ....

Should read the OT protocol definition. READ_DATA is correct for this MSG ID.

@Chupaka
Copy link
Contributor

Chupaka commented Feb 11, 2022

@Evgen2 a quotation from OpenTherm 2.2 specification, just in case:

The status exchange is a special form of conversation which should be initiated by the master by sending a
READ-DATA(id=0,MasterStatus,00) message. The slave must respond with READ-ACK(id=0,MasterStatus,
SlaveStatus) to send back the Slave Status information in the same single conversation. Since it is
mandatory to support this data object, the slave cannot respond with DATA-INVALID or UNKNOWN-DATAID. A
WRITE-DATA(id=0,...) from the master should not be used.

@pavon87
Copy link

pavon87 commented Feb 11, 2022

In my case, with a BAXI boiler with OT 3.0 using the default library opentherm_library, almost everything it's working fine (enable / disable hot water, set temperature of hot water, enable / disable heating, setting the temperature of heating with PID) except tell to boiler when must start heating or stop, in other words, the thermostat. If I enable the heating, it's start heating and if I disable heating it stops, but I think that is not the correct way.....
Any idea about it?

@Evgen2
Copy link

Evgen2 commented Feb 11, 2022

Should read the OT protocol definition. READ_DATA is correct for this MSG ID.

OT protocol makes me crazy

OK

I can only read states from boiler, but cannot set any thing including boiler status(heaitng on off extra).

but how you fix it?
My Navien boiler has jumper for OT using, and with this jumper set OFF it work with OT controller just in read-only mode

@zenz
Copy link

zenz commented Feb 11, 2022

but how you fix it? My Navien boiler has jumper for OT using, and with this jumper set OFF it work with OT controller just in read-only mode

I already write down my solution with BAXI boiler, please check my above post.

@zenz
Copy link

zenz commented Feb 11, 2022

In my case, with a BAXI boiler with OT 3.0 using the default library opentherm_library, almost everything it's working fine (enable / disable hot water, set temperature of hot water, enable / disable heating, setting the temperature of heating with PID) except tell to boiler when must start heating or stop, in other words, the thermostat. If I enable the heating, it's start heating and if I disable heating it stops, but I think that is not the correct way..... Any idea about it?

Check this repo for what you want.
https://github.com/diyless/esp32-wifi-thermostat

@Evgen2
Copy link

Evgen2 commented Feb 12, 2022

Check this repo for what you want. https://github.com/diyless/esp32-wifi-thermostat

very interesting.
Some remarks

  1. I see no delay in loop(), so you handle boiler's controller as fast as possible without idle time
  2. Compared to original ihormelnyk's code you check responce's id in processResponse(). In my case I get ones in some minutes response id=0 (Status) in response to request with non zero id. Strange thing, but check responce's id deal with it.
  3. You use 1 second interval for PID. Seems it is too fast for a slow home heating process

@zenz
Copy link

zenz commented Feb 14, 2022

Check this repo for what you want. https://github.com/diyless/esp32-wifi-thermostat

very interesting. Some remarks

1. I see no delay in loop(), so you handle boiler's controller as fast as possible without idle time

2. Compared to original ihormelnyk's code you  check responce's id in processResponse(). In my case I get ones in some minutes response id=0 (Status) in response to  request with non zero id. Strange thing, but  check responce's id  deal with it.

3. You use 1 second interval for PID. Seems it is too fast  for a slow home heating process

Please read OT definition.
DIYLESS's code using async method to send request and handle response. it's the very good idea to handle things. 1second is not very fast indeed, especially when you need to handle the fast change CH temp so that the boiler not to enter the protection mode.
BTW. try not to use delay in code, and absolutely don't use delay in interrupts.

@Evgen2
Copy link

Evgen2 commented Feb 14, 2022

Please read OT definition. DIYLESS's code using async method to send request and handle response. it's the very good idea to handle things. 1second is not very fast indeed, especially when you need to handle the fast change CH temp so that the boiler not to enter the protection mode. BTW. try not to use delay in code, and absolutely don't use delay in interrupts.

With OT you have two controllers on both side of OT. The main task of gas boiler's controller is to control gas boiler, not to read-write OT bus. I have no idea how boiler's controller work, in worse case it don't use interrupts as we have in void OpenTherm::sendBit() function (with delayMicroseconds(500) in it!). So it seems that we should use OT no more than 50% of time, One sendrequest and get response take about 250 ms in my case, and 2 times per second for communication is good enough/

And there are no reasons for fast change of CH temp within 1 second except measurement noise. On the other hand boiler's controller react within about minute, not seconds and there is no cense to change target temp every second. Moreover, my Navien has some too fast cycle protection.

It seems to me more reasonable to calculate the average temperature for some time and use this average value for PID regulator

@zenz
Copy link

zenz commented Feb 14, 2022

@Evgen2
You don't need to get CH temp per second(actually even in async mode, you cannot reach that), but you need to communicate with OT slave per second(and also need to guarantee the request was successfully sent to slave, so sometimes you may need to resent the request).
most of the boilers have a temp exceeded protection, such like you set it to 45C, your boiler is a 24kw/h boiler, min output is about 10kW/h, but your room only need 8kW/h, in this situation, your boiler will reach the set point very quick, but your room indeed not reach the needed temp. then the boiler goes to protect mode without burning for about 3minutes, your room will slowly cold down.
So a better way is watching the CH temp as fast as possible and change the set point 5C higher than the CH temp every 5 seconds, so that the boiler will not go to protect mode until your room reach the temperature in above situation(we call it low load mode).

@Evgen2
Copy link

Evgen2 commented Feb 14, 2022

@Evgen2 You don't need to get CH temp per second(actually even in async mode, you cannot reach that), but you need to communicate with OT slave per second(and also need to guarantee the request was successfully sent to slave, so sometimes you may need to resent the request).

and in your code there is no limits for number of communications per second

most of the boilers have a temp exceeded protection, such like you set it to 45C, your boiler is a 24kw/h boiler, min output is about 10kW/h, but your room only need 8kW/h, in this situation, your boiler will reach the set point very quick, but your room indeed not reach the needed temp. then the boiler goes to protect mode without burning for about 3minutes, your room will slowly cold down. So a better way is watching the CH temp as fast as possible and change the set point 5C higher than the CH temp every 5 seconds, so that the boiler will not go to protect mode until your room reach the temperature in above situation(we call it low load mode).

In my case slow down from 65 to 45C output T take about 15 min. From 45 to 65 it take about 20 min, with delay about 1 min from time of command to burning flame, next 30 sec took low flame with 15% modulation, next 2 min goes to 40% .
So all processes are not so fast

@rmull561
Copy link

I'm trying to switch "eco" mode on a de Dietrich boiler. It controls DHW pre-heating. It can be set in the configuration menu of the boiler, but I don't know how to set it in OpenTherm. Their OpenTherm-based thermostat AD301 has this feature documented in the manual, so I think it should be possible.

The boiler reports OT version 3.0. I tried setting the bit 6 in the master status, but that disables DHW completely. I tried also setting the bit 7 and all bits in the master configuration, but it doesn't seem to be doing anything. There are zero TSPs reported and no other remote parameters than the two specified in OT2.2. I tried iterating over all unspecified IDs and found four that can be read: 35, 36, 113, 114. The first two change value when the boiler is heating, one of them looks like fan speed. The other two always return zero.

Any suggestions what else could I try?

@rmull561
Copy link

I'm dumb. Only now I tried the obvious thing. It's the bit 1 of the master status which disables and enables the eco mode on this boiler. I guess that's the reason why bit 6 was added later to have something to actually disable DHW. What a mess of specification.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

8 participants