Here is my approach:
Code for the Timeout counter and the virtual switch.
The code is triggered either by time interval to countdown the timeout value or device action(virtual switch, created via "Create Virtual Sensors")
For demo purpose I have set timer interval to 1 minute and the timeout value to 3 minutes.
Code: Select all
local INTERVAL = 5
local INTERVAL = 1
local TIMEOUT = 240
local TIMEOUT = 3
local PROG = 'lockRS'
local logToFile = true
local tmpLogFile = '/var/log/domoticz/RS.log'
return {
on = {
devices = {
'RS Stop'
},
timer = {
'every ' .. INTERVAL .. ' minutes'
},
},
data = {
mailTo = { initial = 'root@localhost' }
},
logging = {
level = domoticz.LOG_INFO,
marker = PROG
},
execute = function(dz, item, info)
local idxRSStop = dz.globalData.idxRSStop
--dz.log('RS Stop')
logheader = os.date('%Y-%m-%d %H:%M:%S ',os.time()) .. '-' .. PROG .. '-'
if item.isTimer then
if dz.globalData.RSStopTime > 0 then
if (dz.globalData.RSStopTime - INTERVAL) <= 0 and dz.devices(idxRSStop).state == 'On' then -- reset timeout value
dz.globalData.RSStopTime = 0
dz.devices(idxRSStop).setState('Off').silent()
logtext = 'RS Timeout - reset by timer plan'
else -- count down timeout value
dz.globalData.RSStopTime = dz.globalData.RSStopTime - INTERVAL
logtext = 'RS Timeout - remaining ' .. tostring(dz.globalData.RSStopTime) .. ' minutes'
end
else -- nothing to do
return 0
end
elseif item.isDevice then -- virtual switch hit
--item.dump()
if item.state == 'On' then -- switch set on -> set timeout value
dz.globalData.RSStopTime = TIMEOUT
logtext = 'RS Timeout - set to ' .. tostring(dz.globalData.RSStopTime) .. ' minutes'
else -- switch set off - reset timeout value
logtext = 'RS Timeout - reset by manual action'
dz.globalData.RSStopTime = 0
end
else
logtext = info.scriptName .. ': Triggered by unknown event'
end
dz.log(logtext)
dz.email('message from your lockRS script', logtext, dz.data.mailTo)
if logToFile then os.execute('echo ' .. logheader .. logtext .. ' >>' .. tmpLogFile) end
end
}
And this is the relevant code snippet for the shutter. It prevents moving the 3 shutters 'RS Kueche' , 'RS WZ li' , 'RS WZ re' when virtual switch is 'On'
Code: Select all
if ( name == 'RS Kueche' or name == 'RS WZ li' or name == 'RS WZ re') and dz.devices(idxRSStop).state == 'On' then
logtext = ' ' .. name .. ' - action locked for ' .. timeout .. ' minutes - (switch "RS Stop" set, to enable normal behaviour: set switch "RS Stop" off)'
dz.log(logtext)
if logToFile then os.execute('echo ' .. logheader .. logtext .. ' >>' .. tmpLogFile) end
else
dz.devices(id).setLevel(lev).withinMin(2)
--dz.devices(id).setLevel(lev).silent()
logtext = ' ' .. name .. ' level set from ' .. curLevel .. '% to ' .. lev .. '%'
dz.log(logtext)
if logToFile then os.execute('echo ' .. logheader .. logtext .. ' >>' .. tmpLogFile) end
--curLevel = dz.devices(id).level
--logtext = ' ' .. name .. ' new level ' .. curLevel .. '%'
--dz.log(logtext)
--if logToFile then os.execute('echo ' .. logheader .. logtext .. ' >>' .. tmpLogFile) end
end
Here is a sample log
2022-01-05 15:43:19.870 Status: User: Admin (IP: 192.168.11.21) initiated a switch command (377/RS Stop/On)
2022-01-05 15:43:20.034 Status: dzVents: Info: Handling events for: "RS Stop", value: "On"
2022-01-05 15:43:20.034 Status: dzVents: Info: lockRS: ------ Start internal script: lockRS: Device: "RS Stop (Virtual)", Index: 377
2022-01-05 15:43:20.035 Status: dzVents: Info: lockRS: RS Timeout - set to 3 minutes
2022-01-05 15:43:20.057 Status: dzVents: Info: lockRS: ------ Finished lockRS
2022-01-05 15:44:00.429 Status: dzVents: Info: lockRS: ------ Start internal script: lockRS:, trigger: "every 1 minutes"
2022-01-05 15:44:00.430 Status: dzVents: Info: lockRS: RS Timeout - remaining 2 minutes
2022-01-05 15:44:00.448 Status: dzVents: Info: lockRS: ------ Finished lockRS
2022-01-05 15:45:00.457 Status: dzVents: Info: lockRS: ------ Start internal script: lockRS:, trigger: "every 1 minutes"
2022-01-05 15:45:00.458 Status: dzVents: Info: lockRS: RS Timeout - remaining 1 minutes
2022-01-05 15:45:00.477 Status: dzVents: Info: lockRS: ------ Finished lockRS
2022-01-05 15:45:00.477 Status: dzVents: Info: setRSTimeBasedv6: ------ Start internal script: setRSTimeBasedv6:, trigger: "at 15:45"
2022-01-05 15:45:00.495 Status: dzVents: Info: setRSTimeBasedv6: RS Kueche - action locked for 1 minutes - (switch "RS Stop" set, to enable normal behaviour: set switch "RS Stop" off)
2022-01-05 15:45:00.514 Status: dzVents: Info: setRSTimeBasedv6: ------ Finished setRSTimeBasedv6
2022-01-05 15:46:00.471 Status: dzVents: Info: lockRS: ------ Start internal script: lockRS:, trigger: "every 1 minutes"
2022-01-05 15:46:00.493 Status: dzVents: Info: lockRS: RS Timeout - reset by timer plan
2022-01-05 15:46:00.549 Status: dzVents: Info: lockRS: ------ Finished lockRS