I have done the same a while ago, to optimize the heating of my new house, since it was heating slow and I was wasting a lot of energy.
Instead I have used ESP01 units with 2 one wire temperature sensors attached, runing a mysensor sketch that is gate with inputs (from the development branch)
I have one sensor on the incoming water line and one to the return line
To heat a house in the most efficient way, the heaters should all have about the same flow/temperature drop. if one rediator has a much lower flow resistance, most of the water will be passing through that radiator and the pump is wasting engery pumping the wafer round and the other radiators get not enough water to radiate a lot of heat, and heating will be slow.
To adjust the heaters I reduced the out flow valve and kept the inflow open, that increases the temperature drop over the radiator. hot water can always go in when the pump starts but flows out slowly, so residence time is long and makes it om efficient. since changing the flow on one radiator will have an impact on the others, I changed the flows one at the time and then looked in the logging of domoticz what the maximum temperature drop was. at the end I also adjusted the inlet valves of some radiators that were close to the heater to limit the flow and get more flow at the end of the system. (here a dutch reference side about it
http://www.cv-inregelen.nl/waterzijdig-inregelen)
When you have adjusted the flows you can bring down the boiler water temperature of the heater to safe some more energy and cost.
next to that you can adjust the boiler water temperature based on the outside temperature, when it is outside <0C i want my house to be heated quickly so the boiler wafer will go to ~80C and when it is hot outside I don't need so much heating power, so I reduce the boiler water temperature.
I do that through the open therm gateway (
http://otgw.tclcode.com/index.html)
last but not least I recently installed a magnetic valve in one of the waterlines, since I only spend a lot of time in my workroom in the weekend and I forgot to turn of the heater by hand.. so it had been heating all week while nobody was there, waste of energy that had to be solved
.
now I manually open the valve (just a press of a switch on the domoticz app) when I need to and it automatically closes when the central heater goes off at night
turning off the heater I have also automated, based on the outside temperature I turn off the heater at a different time, since the hous will stay warm for a while it is a waste of energy to keep heating it until you go to bed.
when it is outside >10C the heater switches off at 20:00 , between 0C and 10C it switches off at 21:00 and under 0C is switches off at 21:30
Since my heater is modulating, the temperature data over the heater is changing all the time.
issue with domoticz is that it is only logging every 5 minutes, so the resolution is low...
so I pulled out the data in csv and processed with a macro it in excel to see which radiator I had to adjust (twice a week to get some statistics for every heater)
now my 3 heaters in the living room get in about the same temperature and all have a drop of 10C
the heater in the bathroom I have added a thermostat in the end, since it was always heating faster than the livingroom and was a waste of energy
and my workroom, I manually switch on in the morning when I know I will be there, but need to integrate some logic in there because the temperature is not yet controlled....
this is the mysensor sketch i used
Code: Select all
#include <EEPROM.h>
#include <SPI.h>
#include <DallasTemperature.h>
#include <OneWire.h>
// Enable debug prints to serial monitor
#define MY_DEBUG
// Use a bit lower baudrate for serial prints on ESP8266 than default in MyConfig.h
#define MY_BAUD_RATE 9600
// Gateway mode always enabled for ESP8266. But we add this anyway ;)
#define MY_GATEWAY_ESP8266
#define MY_ESP8266_SSID "xxx"
#define MY_ESP8266_PASSWORD "xxx"
// Enable MY_IP_ADDRESS here if you want a static ip address (no DHCP)
#define MY_IP_ADDRESS 192,168,2,113
#define MY_IP_GATEWAY_ADDRESS 192,168,2,254
#define MY_IP_SUBNET_ADDRESS 255,255,255,0
// The port to keep open on node server mode
#define MY_PORT 5003
// How many clients should be able to connect to this gateway (default 1)
#define MY_GATEWAY_MAX_CLIENTS 2
#include <ESP8266WiFi.h>
#include <MySensor.h>
// Dallas stuff
#define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No
#define ONE_WIRE_BUS 2 // Pin where dallase sensor is connected
#define MAX_ATTACHED_DS18B20 16
unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature.
float lastTemperature[MAX_ATTACHED_DS18B20];
int numSensors=0;
boolean receivedConfig = false;
boolean metric = true;
// Initialize temperature message
MyMessage msg(0,V_TEMP);
void setup()
{
Serial.println("debug setup");
// Startup up the OneWire library
sensors.begin();
// requestTemperatures() will not block current thread
sensors.setWaitForConversion(false);
}
void presentation() {
Serial.println("Presentation:");
// Send the sketch version information to the gateway and Controller
sendSketchInfo("Temperature Sensor", "1.1");
// Fetch the number of attached temperature sensors
numSensors = sensors.getDeviceCount();
Serial.print("sensors: ");
Serial.println(numSensors);
// Present all sensors to controller
for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
present(i, S_TEMP);
}
}
void loop()
{
Serial.println("Loop:");
// Fetch temperatures from Dallas sensors
sensors.requestTemperatures();
// query conversion time and sleep until conversion completed
int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
// sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
sleep(conversionTime);
// Read temperatures and send them to controller
for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
// Fetch and round temperature to one decimal
float temperature = static_cast<float>(static_cast<int>((getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
Serial.print("Reading sensor: ");
Serial.print(i);
Serial.print(" with value: ");
Serial.println(temperature);
// Only send data if temperature has changed and no error
#if COMPARE_TEMP == 1
if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
#else
if (temperature != -127.00 && temperature != 85.00) {
#endif
// Send in the new temperature
send(msg.setSensor(i).set(temperature,1));
// Save new temperatures for next compare
lastTemperature[i]=temperature;
}
}
delay(60000);
}
p.s. I also tried to do the same with Z-wave binary input units since they claim also to work with onewire sensors, but those node kept dropping off and acting strange, so i changed to the cheaper ESP units with a vlotage regulator and some old phone chargers to power the units