I found the root cause: my gas fire place is sending an update 4 times per second with the status (for instance 'On'). The Evohome thermostat is programmed to switch off when the fireplace switches on. Because I previously didn't validate the current status of the heating system as a requirement before sending the switch off signal, the script was firing thousands of messages to the Evohome server.
I hoped to prevent this by configuring the 'Poll Interval' in the Evohome hardware tab with a higher number. But this concerns only the reading from the evohome server. Sending to the Evohome server is unlimited.
I solved it now (by checking the actual status of the thermostat before sending the off signal), but a little mistake in the script would bring the same error back. Normally I would use the checkFirst() command for each of the commands to the thermostat. But this one is unfortunately not available for .setMode() nor for .updateSetPoint()
Does anyone have a solution to limit the number of updates to a certain device on the script level? I was thinking about a lastUpdate object, but cannot wrap my mind around that one at the moment.
Code: Select all
package.path = package.path .. ';' .. '/home/pi/domoticz/scripts/lua/Telegram.lua'
local telegram = require('Telegram')
local home_status = 197 -- 221 is test, 197 echt
local pir_wk_delay = 333
local pir_tk = 224
local pir_tk_delay = 334 -- 334 echt, 230 is test
local evohome_controller = 331
local evohome_tuinkamer = 332
local evohome_woonkamer = 330
local haard_status = 252 -- Haard status vanuit Node-RED
local calendar_atwork = 268
local tuindeur = 73 -- Deur
---local variable = 'PIR count tuinkamer' -- define as type integer; initial value 0 <- VARIABELE MOET NOG GEWIST WORDEN IN DOMOTICZ
local test_button = 164 -- 164
local trigger1 = 'every 15 minutes'
return
{
active = true,
on =
{
timer = { trigger1, },
devices = { home_status, calendar_atwork, pir_tk_delay, pir_tk, test_button, haard_status, tuindeur }
},
data =
{
pir_counter = { initial = 0 } -- Counts mogen niet meer dan 5 minuten oud zijn
},
logging = { level = domoticz.LOG_DEBUG, marker = 'Evohome' },
execute = function(dz, item)
local Time = require('Time')
-- uitschakelen van script
local manualOverrideSwitch = 336
if (manualOverrideSwitch and dz.devices(manualOverrideSwitch).state == 'On') then
--telegram.sendText(telegram.getId('rik'), 'Evohome control is handmatig uitgeschakeld (disable script switches)')
--dz.log('Evohome control is handmatig uitgeschakeld (disable script switches)', dz.LOG_DEBUG)
return
end
-- Start script
local home_status = dz.devices(home_status) -- Home status device
local pir_wk_delay = dz.devices(pir_wk_delay)
local pir_tk = dz.devices(pir_tk)
local pir_tk_delay = dz.devices(pir_tk_delay)
local evohome_controller = dz.devices(evohome_controller)
local evohome_tuinkamer = dz.devices(evohome_tuinkamer)
local evohome_woonkamer = dz.devices(evohome_woonkamer)
local haard_status = dz.devices(haard_status)
local tuindeur = dz.devices(tuindeur)
local calendar_atwork = dz.devices(calendar_atwork)
local test_button = dz.devices(test_button)
--local variable = dz.variables(variable)
-- Counter obv PIR tuinkamer
if item == pir_tk and pir_tk.state == 'Open' then
dz.data.pir_counter = dz.data.pir_counter + 1
--telegram.sendText(telegram.getId('rik'), 'Evohome: Beweging gedetecteerd, ' .. dz.data.pir_counter .. ' keer')
if (dz.data.pir_counter == 5) then
telegram.sendText(telegram.getId('rik'), 'Tuinkamer waarschijnlijk in gebruik')
--variable.set(9999)
dz.data.pir_counter = 0 -- reset the counter
if calendar_atwork.state == 'Off' and evohome_tuinkamer.mode == 'TemporaryOverride' then
evohome_tuinkamer.updateSetPoint(dz.EVOHOME_MODE_AUTO)
telegram.sendText(telegram.getId('rik'), 'Evohome: Beweging gesignaleerd in tuinkamer en Rik niet naar kantoor, verwarming weer aan')
elseif calendar_atwork.state == 'On' then
--evohome_tuinkamer.updateSetPoint(dz.EVOHOME_MODE_AUTO)
telegram.sendText(telegram.getId('rik'), 'Evohome: Beweging gesignaleerd in tuinkamer en Rik wel aan het werk, verwarming weer aan (SCHAKELT NIET)')
end
end
end
if item.isTimer then
dz.data.pir_counter = 0 -- reset the counter
--telegram.sendText(telegram.getId('rik'), 'PIR counter elke 3 minuten gereset')
return
end
-- Home status verandering
if item == home_status and (home_status.state == 'Away' or home_status.state == 'Vacation') then
evohome_controller.setMode(dz.EVOHOME_MODE_AWAY)
telegram.sendText(telegram.getId('rik'), 'Evohome: Huis verlaten - thermostaat op afwezig')
elseif item == home_status and (home_status.state == 'Home' or home_status.state == 'Kids') then
evohome_controller.setMode(dz.EVOHOME_MODE_AUTO)
telegram.sendText(telegram.getId('rik'), 'Evohome: Thuis - thermostaat op auto programma')
if calendar_atwork.state == 'On' then -- om te zorgen dat bij thuiskomst de tuinkamer nog op werkmodus blijft
evohome_tuinkamer.updateSetPoint(10, dz.EVOHOME_MODE_TEMPORARY_OVERRIDE, dz.time.rawDate .. 'T23:59:00Z')
telegram.sendText(telegram.getId('rik'), 'Evohome: Rik vandaag nog op kantoor - tuinkamer blijft 10 graden')
end
elseif item == home_status and home_status.state == 'Sleep' then
evohome_controller.setMode(dz.EVOHOME_MODE_AWAY, dz.time.addMinutes(120).getISO() )
telegram.sendText(telegram.getId('rik'), 'Evohome: Sleep - programma voor 2u onderbroken')
end
-- Work modus aan voor tuinkamer
if item == calendar_atwork and calendar_atwork.state == 'On' then
evohome_tuinkamer.updateSetPoint(10, dz.EVOHOME_MODE_TEMPORARY_OVERRIDE, dz.time.addMinutes(1440).getISO())
telegram.sendText(telegram.getId('rik'), 'Evohome: Vandaag naar kantoor - tuinkamer 10 graden')
elseif item == calendar_atwork and calendar_atwork.state == 'Off' then
evohome_tuinkamer.updateSetPoint(dz.EVOHOME_MODE_AUTO)
telegram.sendText(telegram.getId('rik'), 'Evohome: Terug van kantoor - tuinkamer auto')
end
-- Haard - UITKIJKEN MET DEZE OMDAT DE OPENHAARD EEN PAAR KEER PER SECONDE DE STATUS DOORSTUURT!
if item == haard_status then
if haard_status.state == 'On' and evohome_woonkamer.mode ~= 'PermamentOverride' then
--evohome_woonkamer.updateSetPoint(14, dz.EVOHOME_MODE_PERMANENT_OVERRIDE)
telegram.sendText(telegram.getId('rik'), 'Evohome: Haard gaat aan, verwarming woonkamer op 14 graden (SCHAKELT NIET)')
elseif haard_status.state == 'Off' and evohome_woonkamer.mode ~= 'FollowSchedule' then
--evohome_woonkamer.updateSetPoint(dz.EVOHOME_MODE_FOLLOW_SCHEDULE)
telegram.sendText(telegram.getId('rik'), 'Evohome: Haard gaat uit, verwarming woonkamer op 14 graden (SCHAKELT NIET)')
end
end
-- Tuindeur, verarming woonkamer uit
if item == tuindeur then
if tuindeur.state == 'Open' then
evohome_woonkamer.updateSetPoint(19, dz.EVOHOME_MODE_PERMANENT_OVERRIDE)
telegram.sendText(telegram.getId('rik'), 'Evohome: Tuindeur gaat open, verwarming woonkamer op 10 graden')
elseif tuindeur.state == 'Closed' then
evohome_woonkamer.updateSetPoint(dz.EVOHOME_MODE_FOLLOW_SCHEDULE)
end
end
-- Bewegingssensor voor tuinkamer
if item == pir_tk_delay and pir_tk_delay.state == 'Off' and (evohome_tuinkamer.mode == 'FollowSchedule' or evohome_tuinkamer.mode == 'Auto') then
evohome_tuinkamer.updateSetPoint(10, dz.EVOHOME_MODE_TEMPORARY_OVERRIDE, dz.time.rawDate .. 'T23:59:00Z')
telegram.sendText(telegram.getId('rik'), 'Evohome: Geen beweging meer in tuinkamer, verwarming weer 10 graden')
end
end
}