local tanks={} local data ={} function Tanks () print ("Loading tanks") tankID = 1 per_list = peripheral.getNames() for i = 1, #per_list do methods = peripheral.getMethods(per_list[i]) for j = 1, #methods do if methods[j] == "getTankInfo" then tanks[tankID] = per_list[i] tankID = tankID+1 end end end print ("Tanks loaded") return tanks end function Tank_Data_Dump (__tank_ident) tank = peripheral.wrap(__tank_ident) if tank == nil then return end curr_tank_data = tank.getTankInfo() curr_tank_data["peripheralName"] = __tank_ident for i=1,#curr_tank_data do if curr_tank_data[i]["contents"]==nil then curr_tank_data[i]["contents"] = {} curr_tank_data[i]["contents"]["rawName"]="" else curr_tank_data[i]["contents"]["amount"]=nil curr_tank_data[i]["contents"]["name"]=nil curr_tank_data[i]["contents"]["id"]=nil end curr_tank_data[i]["capacity"] = nil curr_tank_data[i]["signalWhen"] = "above" curr_tank_data[i]["percentage"] = 50 curr_tank_data[i]["redstone"] = {} curr_tank_data[i]["redstone"]["side"] = "top" --curr_tank_data[i]["redstone"]["strength"] = 15 curr_tank_data[i]["redstone"]["bundled"] = 0 end return curr_tank_data end function Data_Dump () print("Preparing data dump") data["interval"] = 5 data["tanks"] = {} for i=1,#tanks do data["tanks"][i] = Tank_Data_Dump(tanks[i]) end local h = fs.open("config.cfg", "w") h.write(textutils.serialize( data ) ) h.close() print ("Data dumped, Edit 'config.cfg' to your liking and start program again") end function Data_Load () print("Loading config") local h = fs.open("config.cfg", "r") data = textutils.unserialize( h.readAll() ) h.close() print("Loaded config") end function Reset_Redstone () sides = rs.getSides() for i=1,#sides do rs.setOutput(sides[i],false) rs.setBundledOutput(sides[i],0) end end function Set_Redstone(__state,__redstone) if __redstone["bundled"]==0 then rs.setOutput(__redstone["side"],__state) else signal = rs.testBundledInput(__redstone["side"],__redstone["bundled"]) if signal ~= __state then if signal ==true then rs.setBundledOutput(__redstone["side"],rs.getBundledInput(__redstone["side"]) - __redstone["bundled"]) else rs.setBundledOutput(__redstone["side"],rs.getBundledInput(__redstone["side"]) + __redstone["bundled"]) end end end end function Output (__tank_info, __tank_config) perc=0 if __tank_info["contents"]~= nil then perc = __tank_info["contents"]["amount"]/__tank_info["capacity"]*100 end if __tank_config["signalWhen"] == "above" then if perc>__tank_config["percentage"] then Set_Redstone(true,__tank_config["redstone"]) else Set_Redstone(false,__tank_config["redstone"]) end else if __tank_config["signalWhen"] == "below" then if perc<__tank_config["percentage"] then Set_Redstone(true,__tank_config["redstone"]) else Set_Redstone(false,__tank_config["redstone"]) end end end end if not fs.exists("config.cfg") then Tanks() Data_Dump() else Reset_Redstone() Data_Load() print ("Looping") while (true) do for i=1,#data["tanks"] do tank_info = peripheral.call(data["tanks"][i]["peripheralName"],"getTankInfo") if tank_info == nil then data["tanks"][i] = nil else for j=1, #data["tanks"][i] do if data["tanks"][i][j]["contents"]["rawName"] == "" or tank_info[j]["contents"]==nil then Output(tank_info[j],data["tanks"][i][j]) else if (data["tanks"][i][j]["contents"]["rawName"] == tank_info[j]["contents"]["rawName"]) then Output(tank_info[j],data["tanks"][i][j]) end end end end end sleep(data["interval"]) end end