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.

Presence sensor - Reset timer/delay
#11
@Erwin

I used your script and it woked fine, but then i disabel the timer i like to kill the remaining time counter. I see that it repeat until the value = 0 but it will be nice to kill thit timer counter.

Code:
-- ** Staircase logic with external time object and retriggering on input object Version 3.1 ** -- -- ****************************** Created by Erwin van der Zwart **************************** -- -- ************************************** SET PARAMETERS ************************************ -- -- Set input address AddressInput = '40/0/1' -- Set output address AddressOutput = '40/0/4' -- Set external time address (optional) AddressExternalTime = '40/0/2' -- Use time left indication UseTimeLeft = true -- Set to true if time left indication will be used -- Set feedback adress of time left indication (optional) AddressTimeLeft = '40/0/3' -- Set time delay (Used when external time is not available) SetDelay = 10 -- Seconds or Minutes SetSec = true -- Set to false for Minutes -- Set factor delay (Multiplies Delay) SetFac = 1 -- Set unique name for staircase timer (to avoid same storage name usage) StaircaseName = 'Staircase_1' -- Logic can be turned of by value 0 Off_by_Value_Zero = false -- ************************************** END PARAMETERS ************************************ -- -- *************************** DON'T CHANGE ANYTHING UNDER THIS LINE ************************ -- inputvalue = event.getvalue if Off_by_Value_Zero == false and (event.getvalue() == false or event.getvalue() == 0) then   -- Exit script   return end ValueInput = grp.getvalue(AddressInput) ValueOutput = grp.getvalue(AddressOutput) ValueExternalTime = grp.getvalue(AddressExternalTime) if SetSec == true then   SetSeconds = 1 else   SetSeconds = 60 end if ValueExternalTime == nil then ValueExternalTime = 0 end if ValueExternalTime > 0 then   StairCaseTime = ValueExternalTime * SetSeconds * SetFac else   StairCaseTime = SetDelay * SetSeconds * SetFac end if ValueInput == true then   --check for earlier started scrips   --check storage for stpid value   stpid = storage.get(StaircaseName)     --check if stpid has a value   if stpid == nil then      pid = os.getpid()      storage.set(StaircaseName, pid)   else      -- kill earlier running script          os.kill(stpid, signal.SIGKILL)      -- create new pid for next time to kill      pid = os.getpid()        storage.set(StaircaseName, pid)   end   if ValueOutput == false then     grp.write(AddressOutput, true)     ValueOutput = true   end   -- Check time left indication is used   if UseTimeLeft == true then     if StairCaseTime > 0 then         grp.update(AddressTimeLeft, StairCaseTime)         repeat           StairCaseTime = StairCaseTime - 1           grp.update(AddressTimeLeft, StairCaseTime)           os.sleep(1)         until StairCaseTime == 0     end       else     os.sleep(StairCaseTime)   end   ValueOutput = grp.getvalue(AddressOutput)   if ValueOutput == true then     ValueInput = grp.getvalue(AddressInput)     if ValueInput == true then         grp.write(AddressInput, false)       ValueInput = false     end     if Off_by_Value_Zero == false then       if ValueOutput == true then             grp.write(AddressOutput, false)         ValueOutput = false           end     else       -- Do nothing, this will trigger else condition below on next run     end   end   else   --check for earlier started scrips   --check storage for stpid value   stpid = storage.get(StaircaseName)     --check if stpid has a value   if stpid == nil then   else     -- kill earlier running script         os.kill(stpid, signal.SIGKILL)     grp.update(AddressTimeLeft, 0)     pid = nil     storage.set(StaircaseName, pid)   end   if ValueOutput == true then     grp.write(AddressOutput, false)   end end-- ** Staircase logic with external time object and retriggering on input object Version 3.1 ** -- -- ****************************** Created by Erwin van der Zwart **************************** -- -- ************************************** SET PARAMETERS ************************************ -- -- Set input address AddressInput = '40/0/1' -- Set output address AddressOutput = '40/0/4' -- Set external time address (optional) AddressExternalTime = '40/0/2' -- Use time left indication UseTimeLeft = true -- Set to true if time left indication will be used -- Set feedback adress of time left indication (optional) AddressTimeLeft = '40/0/3' -- Set time delay (Used when external time is not available) SetDelay = 10 -- Seconds or Minutes SetSec = true -- Set to false for Minutes -- Set factor delay (Multiplies Delay) SetFac = 1 -- Set unique name for staircase timer (to avoid same storage name usage) StaircaseName = 'Staircase_1' -- Logic can be turned of by value 0 Off_by_Value_Zero = false -- ************************************** END PARAMETERS ************************************ -- -- *************************** DON'T CHANGE ANYTHING UNDER THIS LINE ************************ -- inputvalue = event.getvalue if Off_by_Value_Zero == false and (event.getvalue() == false or event.getvalue() == 0) then   -- Exit script   return end ValueInput = grp.getvalue(AddressInput) ValueOutput = grp.getvalue(AddressOutput) ValueExternalTime = grp.getvalue(AddressExternalTime) if SetSec == true then   SetSeconds = 1 else   SetSeconds = 60 end if ValueExternalTime == nil then ValueExternalTime = 0 end if ValueExternalTime > 0 then   StairCaseTime = ValueExternalTime * SetSeconds * SetFac else   StairCaseTime = SetDelay * SetSeconds * SetFac end if ValueInput == true then   --check for earlier started scrips   --check storage for stpid value   stpid = storage.get(StaircaseName)     --check if stpid has a value   if stpid == nil then      pid = os.getpid()      storage.set(StaircaseName, pid)   else      -- kill earlier running script          os.kill(stpid, signal.SIGKILL)      -- create new pid for next time to kill      pid = os.getpid()        storage.set(StaircaseName, pid)   end   if ValueOutput == false then     grp.write(AddressOutput, true)     ValueOutput = true   end   -- Check time left indication is used   if UseTimeLeft == true then     if StairCaseTime > 0 then         grp.update(AddressTimeLeft, StairCaseTime)         repeat           StairCaseTime = StairCaseTime - 1           grp.update(AddressTimeLeft, StairCaseTime)           os.sleep(1)         until StairCaseTime == 0     end       else     os.sleep(StairCaseTime)   end   ValueOutput = grp.getvalue(AddressOutput)   if ValueOutput == true then     ValueInput = grp.getvalue(AddressInput)     if ValueInput == true then         grp.write(AddressInput, false)       ValueInput = false     end     if Off_by_Value_Zero == false then       if ValueOutput == true then             grp.write(AddressOutput, false)         ValueOutput = false           end     else       -- Do nothing, this will trigger else condition below on next run     end   end   else   --check for earlier started scrips   --check storage for stpid value   stpid = storage.get(StaircaseName)     --check if stpid has a value   if stpid == nil then   else     -- kill earlier running script         os.kill(stpid, signal.SIGKILL)     grp.update(AddressTimeLeft, 0)     pid = nil     storage.set(StaircaseName, pid)   end   if ValueOutput == true then     grp.write(AddressOutput, false)   end end
Reply


Messages In This Thread
Presence sensor - Reset timer/delay - by Mr.D - 14.04.2017, 21:18
RE: Presence sensor - Reset timer/delay - by P3774n - 13.02.2023, 21:03

Forum Jump: