Question about the heating example script  [Solved]

Easy to use, 100% Lua-based event scripting framework.
Post Reply
Posts: 177
Joined: Sunday 29 November 2015 21:46
Target OS: Raspberry Pi
Domoticz version: 2.3852
Location: Spain

Question about the heating example script

Post by elmortero » Saturday 12 November 2016 2:23

Hi Danny,

I have been using dzvents from the beginning but I have limited coding skills.
Now winter is about to start I am implementing a heating script, based on the example you provided (simple room heating with hysteresis control).
I want to add a condition to the script: no heating when a window is open (dt5)
Simple enough, or so I thought. Because if the window is open when the switchOnTemp is reached the heating does not start. But I also want the heater to turn if the window is openend while the heater was already started.

Can you tell me where to put the window-open-check to achieve this?

Posts: 185
Joined: Monday 25 November 2013 18:51
Target OS: Raspberry Pi
Domoticz version: beta

Re: Question about the heating example script  [Solved]

Post by jkimmel » Monday 14 November 2016 2:17

Assuming there is a device 'Window' you could trigger that device and also question state of this device, something like this:

Code: Select all

-- assumptions:
-- the setpoint is set by a selector dummy device where the values are numeric temperatures
-- but you can easily change it to a setpoint device

local BOILER_DEVICE = 'Boiler' -- switch device
local SETPOINT_DEVICE = 'Setpoint' -- selector dummy device
local TEMPERATURE_SENSOR = 'Temperature'
local HYSTERESIS = 0.5 -- temp has to drop this value below setpoint before boiler is on again
local LOGGING = true
local WINDOW_DEVICE = 'Window' -- !!!

return {
	on = {
		['timer'] = 'every minute',
		WINDOW_DEVICE   -- Triggers Window state
	data = {
		temperatureReadings = { history = true, maxItems = SMOOTH_FACTOR }
	active = true,
	execute = function(domoticz, device, triggerInfo)

		local avgTemp
		local temperatureReadings =

		-- first check if the sensor got a new reading or the setpoint was changed:
		if (triggerInfo.type == domoticz.EVENT_TYPE_DEVICE) then

			local sensor = domoticz.devices[TEMPERATURE_SENSOR]

			if (sensor.changed and sensor.attributeChanged('temperature')) then
				-- sensor just reported a new reading
				-- add it to the readings table

				local current = sensor.temperature

				if (current ~= 0 and current ~= nil) then
					-- no need to be here, weird state detected
					domoticz.log('Strange sensor reading.. skiping', domoticz.LOG_ERROR)

			elseif (domoticz.devices[SETPOINT_DEVICE].changed) then
				-- a new setpoint was set
				if LOGGING then domoticz.log('Setpoint was set to ' .. device.state) end
				-- no business here, bail out...

		-- now determine what to do

		local boiler = domoticz.devices[BOILER_DEVICE]
		local setpoint = domoticz.devices[SETPOINT_DEVICE]

		if (setpoint.state == nil or setpoint.state == 'Off') then
			return -- we're done here

		local setpointValue = tonumber(setpoint.state)

		-- determine at which temperature the boiler should be
		-- switched on
		local switchOnTemp = setpointValue - HYSTERESIS

		-- don't use the current reading but average it out over
		-- the past <SMOOTH_FACTOR> readings (data smoothing) to get rid of noise, wrong readings etc
		local avgTemp = temperatureReadings.avg(1, SMOOTH_FACTOR)

		if LOGGING then
			domoticz.log('Average: ' .. avgTemp, domoticz.LOG_INFO)
			domoticz.log('Setpoint: ' .. setpointValue, domoticz.LOG_INFO)
			domoticz.log('Current boiler state: ' .. boiler.state, domoticz.LOG_INFO)
			domoticz.log('Switch-on temperature: ' .. switchOnTemp, domoticz.LOG_INFO)

		if (avgTemp >= setpointValue and boiler.state == 'On')  then
			if LOGGING then domoticz.log('Target temperature reached, boiler off') end

		if (avgTemp < setpointValue and boiler.state == 'Off') then
			if (avgTemp < switchOnTemp) then
				if LOGGING then domoticz.log('Heating is required, boiler switched on') end
				if LOGGING then domoticz.log('Average temperature below setpoint but within hysteresis range, waiting for temperature to drop to ' .. switchOnTemp) end
				if WINDOW_DEVICE.state == 'Open' then boiler.switchOff() end -- !!!
You could refine by inserting something like only if 'window is open longer then x min'

Posts: 177
Joined: Sunday 29 November 2015 21:46
Target OS: Raspberry Pi
Domoticz version: 2.3852
Location: Spain

Re: Question about the heating example script

Post by elmortero » Wednesday 04 January 2017 23:43

Thanks, did just that.
Only if the window stays open for more than 3 minutes (or in case of the bathroom, the door) the heating will be switched off because of that.

Sorry for the late reply.

Post Reply

Who is online

Users browsing this forum: No registered users and 3 guests