It thought that it would be better to do this in an own topic.
The problem: script for room heating is editted and works fine with old version dzventz. Then the 2.x version came intergrated in domoticz and I changed the lines that needed to be compatible for the 2.x version to work.
That part I have figured out i hope , but the temp reading has some issues i think or some code is not as it should now to work with the 2.x version.
the code
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 = 'State-CV-Badkamer' -- switch device
local SETPOINT_DEVICE = 'Thermostaat Badkamer' -- selector dummy device
local TEMPERATURE_SENSOR = 'TH-Badkamer'
local HYSTERESIS = 0.1 -- temp has to drop this value below setpoint before boiler is on again
local SMOOTH_FACTOR = 3
local LOGGING = true
local OVERRIDE_SWITCH = 'CV-Badkamer-Override' -- override switch
return {
on = {
timer = { 'every minute'},
device = { TEMPERATURE_SENSOR, SETPOINT_DEVICE}
},
data = {
temperatureReadings = { history = true, maxItems = SMOOTH_FACTOR }
},
active = true,
execute = function(domoticz, device, triggerInfo)
local avgTemp
local temperatureReadings = domoticz.data.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
temperatureReadings.add(current)
else
-- no need to be here, weird state detected
domoticz.log('Strange sensor reading.. skiping', domoticz.LOG_ERROR)
return
end
elseif (domoticz.devices(SETPOINT_DEVICE).changed) then
-- a new setpoint was set
if LOGGING then domoticz.log('Setpoint was set to ' .. device.state) end
else
-- no business here, bail out...
return
end
end
-- now determine what to do
local boiler = domoticz.devices(BOILER_DEVICE)
local setpoint = domoticz.devices(SETPOINT_DEVICE)
local override = domoticz.devices(OVERRIDE_SWITCH)
if (setpoint.state == nil or setpoint.state == 'Off') then
boiler.switchOff()
return -- we're done here
end
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)
local avgTemp = temperatureReadings.avg(1, SMOOTH_FACTOR, 0) -- when there's no average, return 0 (or whatever you want it to return)
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)
end
if (avgTemp >= setpointValue and boiler.state == 'On') then
if LOGGING then domoticz.log('Target temperature reached, boiler off') end
boiler.switchOff()
boiler.switchOff().afterMin(2)
end
if (avgTemp < setpointValue and boiler.state == 'Off' and override.state == 'Off') then
if (avgTemp < switchOnTemp) then
if LOGGING then domoticz.log('Heating is required, boiler switched on') end
boiler.switchOn()
boiler.switchOn().afterMin(2)
else
if LOGGING then domoticz.log('Average temperature below setpoint but within hysteresis range, waiting for temperature to drop to ' .. switchOnTemp) end
end
end
if (boiler.state == 'On' and override.state == 'On') then
if LOGGING then domoticz.log('Override is aan, CV Badkamer UIT') end
boiler.switchOff()
boiler.switchOff().afterMin(2)
end
end
}
With the line you gave me to try, the avg is now 0 so the "temp" in the room is 0 so the heating always keeps turning on even though the setpoint is low.
Hope you can help out here
