30.01.2020, 16:01
(29.01.2020, 22:05)Erwin van der Zwart Wrote: Hi,Thank you so much for the correction! Now it works perfectly! It is a great script!
You need to add the blocking after the kill part to make sure the previous script is killed when the new one started.
BR,Code:-- ** Staircase logic with external time object and retriggering on input object Version 3.2 ** -- -- ****************************** Created by Erwin van der Zwart **************************** -- -- ************************************** SET PARAMETERS ************************************ -- -- Set input address AddressInput = '21/1/40' -- 01. 1 bit (boolean) -- Set output address AddressOutput = '1/1/40' -- 01. 1 bit (boolean) -- Set external time address (optional) AddressExternalTime = '55/1/4' -- 07. 2 byte unsigned integer -- 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 = '55/1/5' -- 255 byte string -- Set blocking address AddressBlocking = '40/1/40' -- Set time delay (Used when external time is not available) SetDelay = 120 -- 2 minutes -- Seconds or Minutes SetSec = true -- Set to false for Minutes -- Set factor delay (Multiplies Delay) SetFac = 1 -- Logic can be turned of by value 0 Off_by_Value_Zero = false -- ************************************** END PARAMETERS ************************************ -- -- *************************** DON'T CHANGE ANYTHING UNDER THIS LINE ************************ -- Input_Value = event.getvalue() if Off_by_Value_Zero == false and (Input_Value == false or Input_Value == 0) then return else tpid = storage.get('PID:' .. _SCRIPTNAME) if tpid == nil then pid = os.getpid() storage.set('PID:' .. _SCRIPTNAME, pid) else pid = os.getpid() storage.set('PID:' .. _SCRIPTNAME, pid) os.kill(tpid, signal.SIGKILL) end blocking = grp.getvalue(AddressBlocking) if not blocking then return end function Calculate_Time(StairCaseTime) if StairCaseTime > (86400 -1) then StairCaseTime = (86400 -1) end local hours = math.floor(StairCaseTime / 3600 % 24) local minutes = math.floor(StairCaseTime / 60 % 60) local seconds = math.floor(StairCaseTime % 60) time = { day = 0, hour = hours, minute = minutes, second = seconds, } time =string.format('%02d:%02d:%02d',time.hour,time.minute,time.second) return time end if Input_Value == true or Input_Value == 1 then ValueExternalTime = grp.getvalue(AddressExternalTime) or SetDelay if SetSec == true then Multiply_Seconds = 1 else Multiply_Seconds = 60 end StairCaseTime = ValueExternalTime * Multiply_Seconds * SetFac ValueOutput = grp.getvalue(AddressOutput) if ValueOutput == false then grp.write(AddressOutput, true) end if UseTimeLeft == true then if StairCaseTime > 0 then time = Calculate_Time(StairCaseTime) grp.update(AddressTimeLeft, time) repeat StairCaseTime = StairCaseTime - 1 time = Calculate_Time(StairCaseTime) grp.update(AddressTimeLeft, time) os.sleep(1) until StairCaseTime == 0 end else os.sleep(StairCaseTime) end grp.write(AddressOutput, false) elseif Input_Value == false or Input_Value == 0 then ValueOutput = grp.getvalue(AddressOutput) if ValueOutput == true then if UseTimeLeft == true then time = Calculate_Time(0) grp.update(AddressTimeLeft, time) end grp.write(AddressOutput, false) end end storage.delete('PID:' .. _SCRIPTNAME) end
Erwin