LogicMachine Forum
lua table find higest value - 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: lua table find higest value (/showthread.php?tid=2695)



lua table find higest value - benanderson_475 - 23.06.2020

I want to get the highest time and then switch the groups on in the order from highest time(stored in on_time) to lowest time until all the groups are on, groups/ range i am interested in are 1/1/1 to 1/1/20
i am storing the obj.updatetime in a table with the associated address etc as below
Code:
function chk_off()   t ={} for i = 1, 20 do     addr = '1/1/'.. tostring(i)     obj = grp.find(addr)       if obj and obj.value == 0  then      --put all off obj in table with update time       table.insert(t, {address = addr, level = obj.value, upd_time = obj.updatetime, on_time = os.time() -obj.updatetime }  )     end      end   return t end 

Then i want to get the highest value from all the t.on_time/s and switch each off, in order from the longest off value (stored in on_time) until all the complete range 1/1/1 - 1/1/20 are all off
this runs from a function which is called from a scheduled script every x minutes.
This is where i am stuck, this is what i have so far, my question is how can i calculate the highest on_time value and what will happen if two possibility have the same on_time value?
I hope this is making sense....

Code:
function load_time_off() t = chk_off() if t then   for k, v in ipairs(t) do log(v.on_time) -- this gives me all the on_time vals -- how to get highest on_time value?? and switch on the associated address    end end     end



RE: lua table find higest value - admin - 23.06.2020

You can find the maximum value like this. If two items have the same on_time then the one that appears first in the table will be returned.
Code:
max_index = 0 max_time = 0 for index, item in ipairs(t) do   if item.on_time > max_time then     max_index = index     max_time = item.on_time   end end max_item = t[ max_index ] if max_item then   log(max_item) end

Or you can sort the table using custom comparison function. In this case the order of elements in not defined if on_time is the same. t[1] will contain the element with maximum on_time value.
Code:
table.sort(t, function(a, b)   return a.on_time > b.on_time end) log(t)



RE: lua table find higest value - benanderson_475 - 23.06.2020

(23.06.2020, 06:28)admin Wrote: You can find the maximum value like this. If two items have the same on_time then the one that appears first in the table will be returned.
Code:
max_index = 0 max_time = 0 for index, item in ipairs(t) do   if item.on_time > max_time then     max_index = index     max_time = item.on_time   end end max_item = t[ max_index ] if max_item then   log(max_item) end

Or you can sort the table using custom comparison function. In this case the order of elements in not defined if on_time is the same. t[1] will contain the element with maximum on_time value.
Code:
table.sort(t, function(a, b)   return a.on_time > b.on_time end) log(t)
Many Thanks, i have it working


RE: lua table find higest value - manos@dynamitec - 08.04.2024

Hello Admin,

I am using the following to find max value of multiple tables with multiple tagged objects. Now I am repeating the same calculation many times in a resident script; how can I achieve the same but with something like a table containing multiple tables in and run the for loop once per table?

Code:
--Actual Lux Values lux_rest = grp.tag('Lux_Rest') lux_hal1 = grp.tag('Lux_H1') lux_hal2 = grp.tag('Lux_H2') lux_hal3 = grp.tag('Lux_H3') lux_hal4 = grp.tag('Lux_H4') lux_hal5 = grp.tag('Lux_H5') lux_hal6 = grp.tag('Lux_H6') lux_hal7 = grp.tag('Lux_H7') -----------MAX LUX VALUE-------------- -- Calculate Max Lux Value in Zone Under Restaurant t0 = {} for i, v in ipairs(lux_rest) do   table.insert(t0, v.value) end if t0 then   table.sort(t0)     local max = t0[#t0]     grp.checkwrite('3/0/0', max, 1) end os.sleep(0.1) -- Calculate Max Lux Value in Hal 1 t1 = {} for i, v in ipairs(lux_hal1) do   table.insert(t1, v.value) end if t1 then   table.sort(t1)     local max = t1[#t1]     grp.checkwrite('3/0/10', max, 1) end os.sleep(0.1) -- Calculate Max Lux Value in Hal 2 t2 = {} for i, v in ipairs(lux_hal2) do   table.insert(t2, v.value) end if t2 then   table.sort(t2)     local max = t2[#t2]     grp.checkwrite('3/0/20', max, 1) end os.sleep(0.1) -- Calculate Max Lux Value in Hal 3 t3 = {} for i, v in ipairs(lux_hal3) do   table.insert(t3, v.value) end if t3 then   table.sort(t3)     local max = t3[#t3]     grp.checkwrite('3/0/30', max, 1) end os.sleep(0.1) -- Calculate Max Lux Value in Hal 4 t4 = {} for i, v in ipairs(lux_hal4) do   table.insert(t4, v.value) end if t4 then   table.sort(t4)     local max = t4[#t4]     grp.checkwrite('3/0/40', max, 1) end os.sleep(0.1) -- Calculate Max Lux Value in Hal 5 t5 = {} for i, v in ipairs(lux_hal5) do   table.insert(t5, v.value) end if t5 then   table.sort(t5)     local max = t5[#t5]     grp.checkwrite('3/0/50', max, 1) end os.sleep(0.1) -- Calculate Max Lux Value in Hal 6 t6 = {} for i, v in ipairs(lux_hal6) do   table.insert(t6, v.value) end if t6 then   table.sort(t6)     local max = t6[#t6]     grp.checkwrite('3/0/60', max, 1) end os.sleep(0.1) -- Calculate Max Lux Value in Hal 7 t7 = {} for i, v in ipairs(lux_hal7) do   table.insert(t7, v.value) end if t7 then   table.sort(t7)     local max = t7[#t7]     grp.checkwrite('3/0/70', max, 1) end

Kind regards


RE: lua table find higest value - admin - 08.04.2024

Try this:
Code:
tags = {   { tag = 'tag1', output = '1/1/1' },   { tag = 'tag2', output = '2/1/1' }, } function tag_max(tag)   local objects = grp.tag(tag)   local result = -math.huge   for _, object in ipairs(objects) do     result = math.max(result, object.value)   end   return result end for _, t in ipairs(tags) do   max = tag_max(t.tag)   grp.checkwrite(t.output, max)   os.sleep(0.1) end



RE: lua table find higest value - manos@dynamitec - 08.04.2024

(08.04.2024, 14:07)admin Wrote: Try this:
Code:
tags = {   { tag = 'tag1', output = '1/1/1' },   { tag = 'tag2', output = '2/1/1' }, } function tag_max(tag)   local objects = grp.tag(tag)   local result = -math.huge   for _, object in ipairs(objects) do     result = math.max(result, object.value)   end   return result end for _, t in ipairs(tags) do   max = tag_max(t.tag)   grp.checkwrite(t.output, max)   os.sleep(0.1) end

Thank you Admin. Works as expected Smile .

If I want to also calculate the min value in the same script and write on diff object?