Advertisement
DanFrmSpace

energy_farm_monitor

Jun 7th, 2025 (edited)
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.49 KB | None | 0 0
  1. -- Energy Farm Data Collection Script
  2. -- Collects data from solar panels and energy cubes, transmits to remote monitor
  3.  
  4. local WIRELESS_CHANNEL = 100
  5. local UPDATE_INTERVAL = 5 -- seconds
  6. local COMPUTER_ID = "computer_1"
  7.  
  8. -- Initialize wireless modem
  9. local wirelessModem = peripheral.wrap("left")
  10. if not wirelessModem then
  11.     error("No wireless modem found on left of computer")
  12. end
  13. wirelessModem.open(WIRELESS_CHANNEL)
  14.  
  15. -- Function to safely get peripheral data
  16. local function safeGetData(peripheral, method, default)
  17.     local success, result = pcall(function()
  18.         return peripheral[method]()
  19.     end)
  20.     return success and result or default
  21. end
  22.  
  23. -- Function to collect solar panel data
  24. local function collectSolarData()
  25.     local solarData = {}
  26.    
  27.     for i = 0, 9 do
  28.         local panelName = "advancedSolarGenerator_" .. i
  29.         local panel = peripheral.wrap(panelName)
  30.        
  31.         if panel then
  32.             solarData[panelName] = {
  33.                 energy = safeGetData(panel, "getEnergy", 0),
  34.                 maxEnergy = safeGetData(panel, "getMaxEnergy", 0),
  35.                 energyPercentage = safeGetData(panel, "getEnergyFilledPercentage", 0),
  36.                 productionRate = safeGetData(panel, "getProductionRate", 0),
  37.                 maxOutput = safeGetData(panel, "getMaxOutput", 0),
  38.                 canSeeSun = safeGetData(panel, "canSeeSun", false),
  39.                 energyNeeded = safeGetData(panel, "getEnergyNeeded", 0),
  40.                 comparatorLevel = safeGetData(panel, "getComparatorLevel", 0)
  41.             }
  42.         else
  43.             print("Warning: Solar panel " .. panelName .. " not found")
  44.         end
  45.     end
  46.    
  47.     return solarData
  48. end
  49.  
  50. -- Function to collect energy cube data
  51. local function collectEnergyCubeData()
  52.     local cubeData = {}
  53.    
  54.     for i = 0, 5 do
  55.         local cubeName = "advancedEnergyCube_" .. i
  56.         local cube = peripheral.wrap(cubeName)
  57.        
  58.         if cube then
  59.             cubeData[cubeName] = {
  60.                 energy = safeGetData(cube, "getEnergy", 0),
  61.                 maxEnergy = safeGetData(cube, "getMaxEnergy", 0),
  62.                 energyPercentage = safeGetData(cube, "getEnergyFilledPercentage", 0),
  63.                 isEjecting = safeGetData(cube, "isEjecting", false),
  64.                 mode = safeGetData(cube, "getMode", "Unknown"),
  65.                 inputColor = safeGetData(cube, "getInputColor", "None"),
  66.                 outputColor = safeGetData(cube, "getOutputColor", "None"),
  67.                 comparatorLevel = safeGetData(cube, "getComparatorLevel", 0),
  68.                 canEject = safeGetData(cube, "canEject", false),
  69.                 hasStrictInput = safeGetData(cube, "hasStrictInput", false)
  70.             }
  71.         else
  72.             print("Warning: Energy cube " .. cubeName .. " not found")
  73.         end
  74.     end
  75.    
  76.     return cubeData
  77. end
  78.  
  79. -- Function to calculate totals and statistics
  80. local function calculateStats(solarData, cubeData)
  81.     local stats = {
  82.         solar = {
  83.             totalEnergy = 0,
  84.             totalMaxEnergy = 0,
  85.             totalProductionRate = 0,
  86.             averagePercentage = 0,
  87.             panelsSeeSun = 0,
  88.             totalPanels = 0
  89.         },
  90.         cubes = {
  91.             totalEnergy = 0,
  92.             totalMaxEnergy = 0,
  93.             averagePercentage = 0,
  94.             ejectingCubes = 0,
  95.             totalCubes = 0
  96.         },
  97.         system = {
  98.             totalSystemEnergy = 0,
  99.             totalSystemCapacity = 0,
  100.             systemPercentage = 0
  101.         }
  102.     }
  103.    
  104.     -- Calculate solar stats
  105.     for name, data in pairs(solarData) do
  106.         stats.solar.totalEnergy = stats.solar.totalEnergy + data.energy
  107.         stats.solar.totalMaxEnergy = stats.solar.totalMaxEnergy + data.maxEnergy
  108.         stats.solar.totalProductionRate = stats.solar.totalProductionRate + data.productionRate
  109.         stats.solar.averagePercentage = stats.solar.averagePercentage + data.energyPercentage
  110.         if data.canSeeSun then
  111.             stats.solar.panelsSeeSun = stats.solar.panelsSeeSun + 1
  112.         end
  113.         stats.solar.totalPanels = stats.solar.totalPanels + 1
  114.     end
  115.    
  116.     if stats.solar.totalPanels > 0 then
  117.         stats.solar.averagePercentage = stats.solar.averagePercentage / stats.solar.totalPanels
  118.     end
  119.    
  120.     -- Calculate cube stats
  121.     for name, data in pairs(cubeData) do
  122.         stats.cubes.totalEnergy = stats.cubes.totalEnergy + data.energy
  123.         stats.cubes.totalMaxEnergy = stats.cubes.totalMaxEnergy + data.maxEnergy
  124.         stats.cubes.averagePercentage = stats.cubes.averagePercentage + data.energyPercentage
  125.         if data.isEjecting then
  126.             stats.cubes.ejectingCubes = stats.cubes.ejectingCubes + 1
  127.         end
  128.         stats.cubes.totalCubes = stats.cubes.totalCubes + 1
  129.     end
  130.    
  131.     if stats.cubes.totalCubes > 0 then
  132.         stats.cubes.averagePercentage = stats.cubes.averagePercentage / stats.cubes.totalCubes
  133.     end
  134.    
  135.     -- Calculate system totals
  136.     stats.system.totalSystemEnergy = stats.solar.totalEnergy + stats.cubes.totalEnergy
  137.     stats.system.totalSystemCapacity = stats.solar.totalMaxEnergy + stats.cubes.totalMaxEnergy
  138.     if stats.system.totalSystemCapacity > 0 then
  139.         stats.system.systemPercentage = (stats.system.totalSystemEnergy / stats.system.totalSystemCapacity) * 100
  140.     end
  141.    
  142.     return stats
  143. end
  144.  
  145. -- Function to format energy values for display
  146. local function formatEnergy(energy)
  147.     if energy >= 1000000000 then
  148.         return string.format("%.2fGFE", energy / 1000000000)
  149.     elseif energy >= 1000000 then
  150.         return string.format("%.2fMFE", energy / 1000000)
  151.     elseif energy >= 1000 then
  152.         return string.format("%.2fkFE", energy / 1000)
  153.     else
  154.         return string.format("%.0fFE", energy)
  155.     end
  156. end
  157.  
  158. -- Function to transmit data
  159. local function transmitData(data)
  160.     local message = {
  161.         timestamp = os.epoch("utc"),
  162.         source = COMPUTER_ID,
  163.         data = data
  164.     }
  165.    
  166.     wirelessModem.transmit(WIRELESS_CHANNEL, WIRELESS_CHANNEL, message)
  167.     print("Data transmitted on channel " .. WIRELESS_CHANNEL)
  168. end
  169.  
  170. -- Function to display local status
  171. local function displayLocalStatus(stats)
  172.     term.clear()
  173.     term.setCursorPos(1, 1)
  174.    
  175.     print("=== ENERGY FARM MONITOR ===")
  176.     print("Time: " .. textutils.formatTime(os.time(), true))
  177.     print("")
  178.    
  179.     print("SOLAR PANELS:")
  180.     print("  Total Energy: " .. formatEnergy(stats.solar.totalEnergy))
  181.     print("  Capacity: " .. formatEnergy(stats.solar.totalMaxEnergy))
  182.     print("  Production: " .. formatEnergy(stats.solar.totalProductionRate) .. "/t")
  183.     print("  Average Fill: " .. string.format("%.1f%%", stats.solar.averagePercentage))
  184.     print("  Sun Visible: " .. stats.solar.panelsSeeSun .. "/" .. stats.solar.totalPanels)
  185.     print("")
  186.    
  187.     print("ENERGY CUBES:")
  188.     print("  Total Energy: " .. formatEnergy(stats.cubes.totalEnergy))
  189.     print("  Capacity: " .. formatEnergy(stats.cubes.totalMaxEnergy))
  190.     print("  Average Fill: " .. string.format("%.1f%%", stats.cubes.averagePercentage))
  191.     print("  Ejecting: " .. stats.cubes.ejectingCubes .. "/" .. stats.cubes.totalCubes)
  192.     print("")
  193.    
  194.     print("SYSTEM TOTAL:")
  195.     print("  Energy: " .. formatEnergy(stats.system.totalSystemEnergy))
  196.     print("  Capacity: " .. formatEnergy(stats.system.totalSystemCapacity))
  197.     print("  Fill Level: " .. string.format("%.1f%%", stats.system.systemPercentage))
  198.     print("")
  199.    
  200.     print("Next update in " .. UPDATE_INTERVAL .. " seconds...")
  201. end
  202.  
  203. -- Main monitoring loop
  204. local function main()
  205.     print("Starting Energy Farm Monitor...")
  206.     print("Wireless channel: " .. WIRELESS_CHANNEL)
  207.     print("Update interval: " .. UPDATE_INTERVAL .. " seconds")
  208.     print("")
  209.    
  210.     while true do
  211.         local solarData = collectSolarData()
  212.         local cubeData = collectEnergyCubeData()
  213.         local stats = calculateStats(solarData, cubeData)
  214.        
  215.         local fullData = {
  216.             solar = solarData,
  217.             cubes = cubeData,
  218.             stats = stats
  219.         }
  220.        
  221.         transmitData(fullData)
  222.         displayLocalStatus(stats)
  223.        
  224.         sleep(UPDATE_INTERVAL)
  225.     end
  226. end
  227.  
  228. -- Error handling wrapper
  229. local function runWithErrorHandling()
  230.     local success, error = pcall(main)
  231.     if not success then
  232.         print("Error occurred: " .. tostring(error))
  233.         print("Restarting in 5 seconds...")
  234.         sleep(5)
  235.         runWithErrorHandling()
  236.     end
  237. end
  238.  
  239. -- Start the program
  240. runWithErrorHandling()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement