I've added an Open Therm GateWay to my home setup. This device is situated between the central heating and the thermostat, and it monitors the communication between those two. Ypu are then able to indert extra messages. The device I bought from Nodo Shop. It's an DIY project, and I had only to solder a few parts. I added an NodeMCU to act as an bridge from serial to WiFi.

I hooked this up, added the gateway to Domoticz and it worked.


Domoticz gives you the control, because the interface is serial, you can only have one controller. Commands are passed to the OTGW like:

  http://<ip-adres domoticz>:<port domoticz>/json.htm?type=command&param=setsetpoint&idx=133&setpoint=15.5 

This sets the thermostat to 15.5, idx=133 point to the index of the device "Room temperature"

The OTGW has a software controlle named Opentherm Monitor, if you want to use that, you will have to stop domoticz. Opentherm monitor gives you even more control.
Domoticz gives you all kinds of graphs:

The boiler water temperature of a day.

After fiddling around, I made this script to push the current time and day to the thermostat. This runs on the raspberry pi that runs domoticz::

# Sync the date of this machine via OTGW to the thermostat
# OTGW command
# (http://otgw.tclcode.com/firmware.html)
# SC=hh:mm/d d=1 (monday) through 7 (sunday)
# example 09:00 on monday:
# SC=9:00/1
# complete url should be:
# http://<ip-adress domoticz>:<port>/json.htm?type=command&param=sendopenthermcommand&idx=9&cmnd=SC=0

use LWP::UserAgent [search.cpan.org];
use HTTP::Request [kobesearch.cpan.org];

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
                   $year = $year + 1900;

if ($wday == 0) {

my $URL = "http://<ip-adress-domoticz>:<port-domoticz>/json.htm?type=command&param=sendopenthermcommand&idx=9&cmnd=SC=$hour$\:$min/$wday";

print "URL is $URL \n";

my $agent = LWP::UserAgent->new(env_proxy => 1,keep_alive => 1, timeout => 30);
my $header = HTTP::Request->new(GET => $URL);
my $request = HTTP::Request->new('GET', $URL, $header);
my $response = $agent->request($request);

# Check the outcome of the response
if ($response->is_success){
    print "URL:$URL\nHeaders:\n";
    print $response->headers_as_string;
    print "\nContent:\n";
    print $response->as_string;
}elsif ($response->is_error){
    print "Error:$URL\n";
    print $response->error_as_HTML;

I use this in cron, once a day.