This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm that you accept these cookies being set.

Timer for multiple toilet's vents
#5
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
(7 hours ago)admin Wrote: 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
end

I try with other adresses, but nothing happend on the bus. What I do wrong?

Attached Files Thumbnail(s)
   
Reply


Messages In This Thread
Timer for multiple toilet's vents - by 2MAX - 14.10.2024, 04:21
RE: Timer for multiple toilet's vents - by 2MAX - 6 hours ago

Forum Jump: