![]() |
|
Timer for multiple toilet's vents - Printable Version +- LogicMachine Forum (https://forum.logicmachine.net) +-- Forum: LogicMachine eco-system (https://forum.logicmachine.net/forumdisplay.php?fid=1) +--- Forum: Scripting (https://forum.logicmachine.net/forumdisplay.php?fid=8) +--- Thread: Timer for multiple toilet's vents (/showthread.php?tid=5664) |
Timer for multiple toilet's vents - 2MAX - 14.10.2024 Hi, I need help with 60 vents control in administration building. One off vent 6/1/0 need to be controlled with lights 3/0/7,3/0/9, 3/0/11 or 3/0/13. When one of this lights is switched ON more then 5 minutes, or all off lights are turned to OFF, then I need to switch vent ON for time that can be set over group adress 11/4/1 in seconds. Thaks for help RE: Timer for multiple toilet's vents - admin - 14.10.2024 This can be done with 2 resident scripts: 1. OR gate for light groups: https://kb.logicmachine.net/scripting/logic-functions-central-statuses/ 2. Modified staircase timer that uses status from the OR gate: https://kb.logicmachine.net/scripting/staircase-timer/ We can help with the modifications but you need describe the vent logic in more detail:
RE: Timer for multiple toilet's vents - 2MAX - 16.10.2024 (14.10.2024, 06:55)admin Wrote: This can be done with 2 resident scripts: Hi, thaks for your answer. I look for scripts, but I need help with edit this script. Time is same for all vents. In both of case we want to retrigger running time and then switch off. RE: Timer for multiple toilet's vents - admin - 16.10.2024 Timer script: Code: if not client then
-- input to output mapping
mapping = {
['0/0/1'] = '0/0/6',
['0/1/1'] = '0/1/6',
['0/2/1'] = '0/2/6',
}
-- turn output on when input is on for X seconds
ondelay = 5 * 60
-- keep output on for X seconds
offdelayaddress = '11/4/1'
timers = {}
for input, output in pairs(mapping) do
timers[ input ] = {
output = output,
state = 'off',
}
end
function timerset(timer, input)
if input then
if timer.state ~= 'ondelay' then
timer.state = 'ondelay'
timer.ticks = ondelay
end
else
grp.checkwrite(timer.output, true)
timer.state = 'offdelay'
timer.ticks = grp.getvalue(offdelayaddress)
end
end
function timertimeout(timer)
if timer.state == 'ondelay' then
timerset(timer, false)
else
grp.checkwrite(timer.output, false)
timer.state = 'off'
timer.ticks = nil
end
end
grp.sender = 'tm'
client = require('localbus').new(0.1)
client:sethandler('groupwrite', function(event)
local timer = timers[ event.dst ]
if timer and event.sender ~= grp.sender then
local value = tonumber(event.datahex, 16) or 0
timerset(timer, value ~= 0)
end
end)
end
client:loop(1)
for _, timer in pairs(timers) do
if timer.ticks then
timer.ticks = timer.ticks - 1
if timer.ticks == 0 then
timertimeout(timer)
end
end
endRE: Timer for multiple toilet's vents - 2MAX - 16.10.2024 Code: if not client then
-- input to output mapping
mapping = {
['0/1/1'] = '0/1/2',
}
-- turn output on when input is on for X seconds
ondelay = 5 * 60
-- keep output on for X seconds
offdelayaddress = '0/1/4'
timers = {}
for input, output in pairs(mapping) do
timers[ input ] = {
output = output,
state = 'off',
}
end
function timerset(timer, input)
if input then
if timer.state ~= 'ondelay' then
timer.state = 'ondelay'
timer.ticks = ondelay
end
else
grp.checkwrite(timer.output, true)
timer.state = 'offdelay'
timer.ticks = grp.getvalue(offdelayaddress)
end
end
function timertimeout(timer)
if timer.state == 'ondelay' then
timerset(timer, false)
else
grp.checkwrite(timer.output, false)
timer.state = 'off'
timer.ticks = nil
end
end
grp.sender = 'tm'
client = require('localbus').new(0.1)
client:sethandler('groupwrite', function(event)
local timer = timers[ event.dst ]
if timer and event.sender ~= grp.sender then
local value = tonumber(event.datahex, 16) or 0
timerset(timer, value ~= 0)
end
end)
end
client:loop(1)
for _, timer in pairs(timers) do
if timer.ticks then
timer.ticks = timer.ticks - 1
if timer.ticks == 0 then
timertimeout(timer)
end
end
end(16.10.2024, 05:31)admin Wrote: Timer script: I try with other adresses, but nothing happend on the bus. What I do wrong? RE: Timer for multiple toilet's vents - admin - 16.10.2024 Works for me. Do you have it as resident script with 0 sleep time? Enable logging for 0/1/1 and 0/1/2. Setting 0/1/1 to OFF should immediately set 0/1/2 to ON for 10 seconds. RE: Timer for multiple toilet's vents - 2MAX - 16.10.2024 (16.10.2024, 07:16)admin Wrote: Works for me. Do you have it as resident script with 0 sleep time? Yeah, it works, I have 60s time. Thank You (16.10.2024, 07:21)2MAX Wrote:(16.10.2024, 07:16)admin Wrote: Works for me. Do you have it as resident script with 0 sleep time? Code: groups = {
--samples
{ tag = 'my_group_and', output = '4/0/0', mode = 'and' },
{ tag = 'my_group_or', output = '4/0/1', mode = 'or' },
{ tag = 'my_group_avg', output = '4/0/2', mode = 'avg' },
} |