(16.12.2018, 00:08)Erwin van der Zwart Wrote: Hi,
This is an old script i created when i was learning LUA so probably can be improved (:
BR,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 = '6/0/0' -- Set output address AddressOutput = '6/0/1' -- Set external time address (optional) AddressExternalTime = '6/0/2' -- Use time left indication UseTimeLeft = true -- Set to false if no time left indication is used -- Set feedback adress of time left indication (optional) AddressTimeLeft = '6/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
Erwin
Thanks alot. Will not be improved by me, because Lua is not my strong side at all. But will definitly test it.. Thanks alot.
I gonna create three virtual objects and then i am wondering whats the correct datatype. Is it 10 Time/date. ?