Hi there
I have rewritten the Water All code
This is my expression of the code. It includes a network retry function to prevent errors during network glitches and an optimised ‘serpentine sequence’ as it snakes through the plant bed.
Not sure what to do with it so I am putting it here for feedback.
No comments. Short variable names and no whitespace as I was up against the 3000 character limit.
local wt=variable("Watering Time (Seconds)")
local st=os.time()*1000
local tries=9
local delay=20
local fail=1
local pts
while tries>0 do
tries=tries-1
pts=api({method="GET",url="/api/points"})
if pts then
toast("Plant list obtained","info")
tries=0
fail=0
else
toast("Error - Retrying","warn")
wait(delay*1000)
end
end
if fail==1 then
toast("Fatal Error - No plants","error")
return
end
local pls={}
for _,v in pairs(pts)do
if v.pointer_type=="Plant" then
table.insert(pls,{n=v.name,x=v.x,y=v.y})
end
end
-- Dynamic X clustering with serpentine Y sweep
local tol=50
table.sort(pls,function(a,b)return a.x<b.x end)
local grps={{}}
for _,p in ipairs(pls)do
local g=grps[#grps]
if #g==0 then
table.insert(g,p)
else
if math.abs(p.x-g[1].x)<=tol then
table.insert(g,p)
else
table.insert(grps,{p})
end
end
end
local s_pls={}
for i,g in ipairs(grps)do
table.sort(g,function(a,b)return a.y<b.y end)
if i%2==0 then
-- Reverse Y order for even groups
local rev={}
for j=#g,1,-1 do table.insert(rev,g[j])end
g=rev
end
for _,p in ipairs(g)do table.insert(s_pls,p)end
end
pls=s_pls
local c=0
local t=#pls
local job="Watering "..t.." plants"
send_message("info",job.." for "..wt.."s each","toast")
for _,v in pairs(pls)do
local cn="("..math.floor(v.x)..","..math.floor(v.y)..")"
local pn=v.n or"plant"
if #pn>20 then pn=string.sub(pn,1,20).."..."end
set_job_progress(job,{percent=100*c/t,status="Moving to "..pn.." "..cn,time=st})
move_absolute(v.x,v.y,-280)
set_job_progress(job,{percent=100*(c+0.5)/t,status="Watering "..pn,time=st})
write_pin(8,"digital",1)
wait(wt*1000)
write_pin(8,"digital",0)
c=c+1
end
set_job_progress(job,{percent=100,status="Complete",time=st})