Suggestions for radiator valves using collective heating

@KiJo-DuKa

I went for the Eurotronic Spirit valves.

Initially I had some problems getting them all paired with Homey. That was more a Homey / App problem than Spirit related. Somehow the device ID’s were changed and that caused that problem.

Reception was an issue for a while, too. Again that seems more a Homey issue. I am currently running Homey Firmware Versie: 1.5.13 and the v1.2.1 App and it is working without any issues. I do have a good z-wave mesh.

I have replaced batteries too. I think that a normal AA battery lasts around 12 to 18 months. It also depends on how often you adjust the SET temperature, of course.

So, bottomline: I am pleased with them!

Hi,

I have 5 Eurotronic Spirit valves. I coincidentally replaced the supplied batteries this morning of the first two units I purchased. (I think they were cheap batteries). You can easily trigger alerts when the batteries get low. The supplied batteries lasted about 1,5 month, so that’s pretty bad. According to what I read everywhere, proper batteries should be able to work for about a year.

So far I’m very happy with them. The physical setup was really easy. I needed to use one of the supplied adapter rings on radiators. I purchased a separate pink cap for my daughter’s bedroom radiator. They respond very quickly (usually within one or two seconds). You do hear the motor which handles the valve itself, but I don’t think it’s very bad. I also have one in my bedroom, and I don’t find it too disturbing.

You may need to keep in mind that they do NOT function as a z-wave repeater as they don’t have a permanent power supply, so you may need to keep the distance between Homey and the valve in mind (unless you have other permanently connected zwave-plus devices. I purchased a few smart plugs (tussenstekkers) for this purpose. Else Homey couldn’t reach one of the Valve’s (and/or the other way round of course)

As said. I’m very happy with the valves and would recommend them to everyone.

1 Like

Hi Lennard,
Thanks for the expanded reply.

For me/us it is just a future adjustment, regarding my heating system upgrade. Now the system is working with a ‘zone regeling’ Watts. It is working fine, but to regulate the system via the internet and an app is a beter functionality. There is no Watts app ‘yet’.
First, also, the homey system has to develope more.

Jorgen

The most important reason to go for the Spirits was that they are managed locally. Some of the other valves are controlled directly via the internet (so even if you are at home, the control goes via the internet). I find it annoyingly enough that Homey is constantly internet-connected ( No added value for my usage) but I don’t like the idea that I can’t manage my radiators/heating in my own house if my internet connection is down, or if the other side has a disruption.

(The fact that I CAN manage them when I’m not home is a nice-to-have for me)

That is a sure thing and I’ll take that within considerations regarding the specs.

Thanks

Well said !

I’ve two Tado Radiator Valves but I’ll buy a Eurotronic to test it. Your experience with them looks great !

That’s why I love Homey so much, no worry about different brands, you can manage everything the same way :star_struck:

Hi,
Do you also have ‘block verwarming’?

I was wandering, which respect to the whole system. Which device is sending the signal towards the boiler?

Whitin the offers of the apps, you see always the thermostaat regulators, but not the boiler regulator. You’re using the genuin transmitter?

Rgds

Hi,

Yes, I also have collective heating (blokverwarming) in the sense that there is a central boiler per 6 appartments (I think - could be 18, not sure if the other portico’s in the same blok of houses have seperate collective boilers, but that doesn’t really matter for the story :slight_smile: )

In our case we don’t control the boiler. It’s ‘on’ 24/7 during the cold months. (We have individual 80 liter boilers for warm water). This basically means the hot water is pumped into the central system constantly and that the radiator valves regulate how much (if any) of the water is pumped into the radiators. From what they told me, the system scales up when more heat is required and down when less is required (which makes it more energy-friendly)

This is the reason that ‘only’ radiator valves work out of the box. If you need to actively send signals towards your collective boiler, I think you may have an issue :frowning: . Depending on how the signalling works, you could look into smart relais.

In most of the cases the boiler runs based on outside temp. So when the outside temp gets lower, the water running thru ur radiators is getting warmer. There is no need to send a signal to the boiler, it runs all by himself.
This is the case in block heating most of the times!

I know it’s an older discussion, but I’ve written a Homey script and combined with a couple of flows (explained in the script) I have set up my zone heating this way and it works nice and smooth.
Still busy on refining it. My script works with Plugwise Anna as thermostat and 12 Eurotronic Spirit valves in 9 different zones.

If you set one of the Spirit valves to a new temp, the script will be executed and decide if the Anna needs to fire up the boiler. Anna uses OpenTherm, so Anna decides if it’s needs to boost or just use cosy flames.

Please, feel free to comment on my script for improvements!

Thanks to mrtaunus for sharing his example (https://github.com/athombv/com.athom.homeyscript/wiki/example:-ThermostatTriggered.js)

/*
* Zone heating script by Maarten Meijer
* dd 2020-1-6
* for Anna thermostat and Eurotronic Valves
*
* Set the valve temperature treshold to at least 0.5 to prevent running this script for every 0.1 temp-change.
* Do some temp calibration to your valves, most of my valves had a 1.5 degrees offset on the measured temperature.
*
* create 2 flows per zone:
* WHEN request_temp from valve in ZONE-X changes THEN run script with argument ZONE-X,set
* WHEN temp from valve in ZONE-X changes THEN run script with argument ZONE-X,need
*
* If you have more then one radiator in a zone, then set it up as a master-slave
* WHEN request_temp from valve-1 in ZONE-X changes THEN change request_temp from valve-2 in ZONE-X
* 
*/

let debug = false;
let arguments = args[0].split(",");
let zoneName = arguments[0];// First argument is the zone that's doing the request;
let requestType = arguments[1];// Second argument is the trigger type, set is when a valve is set to a target temp, need is when temperature changes.
// The offset temp is used to overcome temperature differnces between valves and thermostat
// To be sure the thermostat heats up to provide heat to the selected valve
var offSetTemp = 1
if(requestType == "set"){ //for different offsets between set/need, use for boost
var offSetTemp = 1; 
}

let hysteresis = 0.5; // Used to prevent switching on/off for every 0.5 degrees

var logText = ""; //future variable for posting to Homey timeline

log('----------------');
log('Call from zone:', arguments[0], ' type:', arguments[1]);
log('----------------');

// Get all zones and devices
let zones = await Homey.zones.getZones();
let devices = await Homey.devices.getDevices();

// Set requesting zone according to Args
let zone = getZone(zones, zoneName);

let thermostat;
let valves = [];
let otherValves = [];

//Find Anna Thermostat by driverID, Anna can be in any zone
Object.values(devices).forEach(device => {
    
    if (device.driverId === 'anna') {
        thermostat = device;
        if (debug) {
            log('Thermostat:', thermostat.name, '( zone:',thermostat.zoneName,', type:', thermostat.class, ')');
        }
    }
});

if (debug) {
log('----------------');
}

// Find Valves in specified Zone and put the other ones in the otherValves array
Object.values(devices).forEach(device => {
if (deviceInZone(device.zone, zone)) {
    
    if (device.driverId === 'spirit_zwave') { //} && device.virtualClass === 'heater') {
        valves.push(device);
        if (debug) {
            log('Valve:', device.name, '( zone:',device.zoneName,')');
        }
    }
} else {
    if (device.driverId === 'spirit_zwave') { //} && device.virtualClass === 'heater') {
        otherValves.push(device);
        if (debug) {
            log('Valve in different zone:', device.name, '( zone:',device.zoneName,')');
        }
    }
}
});

if (debug) {
log('----------------');
}

var thermostatTemp = thermostat.capabilitiesObj.target_temperature.value; //current target temperature Thermostat Anna
var zoneRequestTemp = valves[0].capabilitiesObj.target_temperature.value; //requested temp master Valve in zone

// Loop trough the other valves to see if one has requested a higher temperature to prevent cooling down being initiated by this request
var otherTemp = 0;
var highestOtherTemp = 0;

Object.values(otherValves).forEach(otherValve => {
otherTemp = otherValve.capabilitiesObj.target_temperature.value;
if(otherTemp > highestOtherTemp) {
    highestOtherTemp = otherTemp;
}
});
log(highestOtherTemp);

log(new Date().toISOString(), 'Thermostat temp:', thermostatTemp, 'Zone request temp:', zoneRequestTemp, 'Hysteresis:', hysteresis); 

// If thermostat is already set to a near value, decide what to do.
if (thermostatTemp >= zoneRequestTemp + hysteresis) {
//if(highestOtherTemp <= zoneRequestTemp) {
    callForHeatOrCool(false, valves);
//}
}
else if (thermostatTemp < zoneRequestTemp - hysteresis) {
callForHeatOrCool(true, valves);
}

return true;

// ########################################################################

function getZone(zones, zoneName) {
    let retVal;
    Object.values(zones).forEach(z => {
        if (z.name === zoneName) {
            retVal = z;
        }
    });
    return retVal;
}

function deviceInZone(deviceZone, matchZone) {
    if (deviceZone == matchZone.id) {
        return true;
    }
    else if (deviceZone.parent) {
        return deviceInZone(zones[deviceZone.parent], matchZone);
    }
}
if (debug) {
    log('----------------');
}
function callForHeatOrCool(heat, radiatorRelays) {
    Object.values(valves).forEach(valve => {
        valve.setCapabilityValue('onoff', heat);
        if (heat) {
            log("Call for HEAT from ", thermostat.name, ' to ', valve.name);
            thermostat.setCapabilityValue('target_temperature', zoneRequestTemp + offSetTemp);
        }
        else {
            log("Call for COOL from ", thermostat.name, ' to ', valve.name);
            thermostat.setCapabilityValue('target_temperature', zoneRequestTemp - offSetTemp);
        }
    });
}

Looks nice!
From what I undestand of the code, the Anna thermostat is not aware of the zones right? I can imagine that one zone requires ‘more power’ to heat up than the other.

I moved to a family house recently. So I now have my own central heating unit too. This unit doesn’t support Opentherm (only on-off). I currently use a Fibaro relay to switch on or off and the ‘Sets’ app to switch the relay with a few flows. (if one of the valves requests heat, the relay switches on)

So it boils down to what you created, but using the ‘Sets’ app. :slight_smile:

1 Like

The power thing is a thing I could implement. By working with variables I can have a learning mode to see the amount of time it takes before a zone reaches it’s target temperature.
But I’m thinking of writing an app for zone-heating, but as I’m rather new to Homey, I don’t know where to start yet…

And I also could make use of the percentage opening of the Spirit valve.