Advertisement
cc-editor

Notstrom

Feb 9th, 2025 (edited)
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.61 KB | None | 0 0
  1. settings.load()
  2.  
  3. -- #region Setup
  4. local info = {
  5.     generators = {},
  6.     batteries = {},
  7.     tanks = {},
  8.     input = 0,
  9.     output = 0,
  10. }
  11.  
  12. local generators = {}
  13. for i, unit in pairs(settings.get("notstrom.generators")) do
  14.     generators[i] = peripheral.wrap(unit)
  15.     generators[i].setEnabled(false)
  16.     info.generators[i] = {
  17.         fuel = 0,
  18.         state = "unknown"
  19.     }
  20. end
  21.  
  22. local batteries = {}
  23. for i, unit in pairs(settings.get("notstrom.batteries")) do
  24.     batteries[i] = peripheral.wrap(unit)
  25.     info.batteries[i] = {
  26.         energy = 0,
  27.         max_energy = batteries[i].getEnergyCapacity(),
  28.         state = "unknown"
  29.     }
  30. end
  31.  
  32. local tanks = {}
  33. for i, unit in pairs(settings.get("notstrom.tanks")) do
  34.     tanks[i] = peripheral.wrap(unit)
  35.     info.tanks[i] = {
  36.         amount = 0,
  37.         max_amount = tanks[i].getInfo().capacity
  38.     }
  39. end
  40.  
  41. local monitor = peripheral.wrap(settings.get("notstrom.monitor"))
  42.  
  43. local input_meter = peripheral.wrap(settings.get("notstrom.input_meter"))
  44. local output_meter = peripheral.wrap(settings.get("notstrom.output_meter"))
  45.  
  46. local max_threshold = settings.get("notstrom.max_threshold")
  47. local min_threshold = settings.get("notstrom.min_threshold")
  48. -- #endregion
  49.  
  50. local function update_data()
  51.     for i, generator in pairs(generators) do
  52.         info.generators[i].fuel = generator.getFluid().amount
  53.         if generator.getEnabled() then
  54.             if generator.isRunning() then
  55.                 info.generators[i].state = "running"
  56.             else
  57.                 info.generators[i].state = "enabled"
  58.             end
  59.         else
  60.             info.generators[i].state = "disabled"
  61.         end
  62.     end
  63.  
  64.     for i, battery in pairs(batteries) do
  65.         local previous_energy = info.batteries[i].energy
  66.         local current_energy = battery.getEnergy()
  67.         info.batteries[i].energy = current_energy
  68.  
  69.         if math.abs(current_energy - previous_energy) <= 16000 then
  70.             info.batteries[i].state = "ok"
  71.         elseif current_energy > previous_energy then
  72.             info.batteries[i].state = "charging"
  73.         else
  74.             info.batteries[i].state = "discharging"
  75.         end
  76.     end
  77.  
  78.     for i, tank in pairs(tanks) do
  79.         info.tanks[i].amount = tank.getInfo().amount
  80.     end
  81.  
  82.     info.input = input_meter.getAveragePower()
  83.     info.output = output_meter.getAveragePower()
  84. end
  85.  
  86. local function control_generators()
  87.     print("Input:", info.input, "Output:", info.output)
  88.     local generator_output = 4096
  89.  
  90.     local generators_running = 0
  91.     for i, generator in pairs(generators) do
  92.         if generator.isRunning() then
  93.             generators_running = generators_running + 1
  94.         end
  95.     end
  96.  
  97.     local below_max_threshold = 0
  98.     local below_min_threshold = 0
  99.     for i, battery in pairs(info.batteries) do
  100.         if battery.energy < max_threshold then
  101.             below_max_threshold = below_max_threshold + 1
  102.             print("Battery", i, "below threshold")
  103.         end
  104.         if battery.energy < min_threshold then
  105.             below_min_threshold = below_min_threshold + 1
  106.             print("Battery", i, "below minimal threshold")
  107.         end
  108.     end
  109.  
  110.     local generators_needed = math.ceil(((info.output - 200 - generator_output * generators_running) - info.input) / generator_output)
  111.     generators_needed = math.max(generators_needed, below_min_threshold)
  112.     generators_needed = math.min(generators_needed, #generators)
  113.  
  114.     if below_max_threshold > 0 then
  115.         print("Generators needed: ", generators_needed)
  116.         for i, generator in pairs(generators) do
  117.             if i <= generators_needed then
  118.                 generator.setEnabled(true)
  119.                 print("Enabling generator", i)
  120.             else
  121.                 generator.setEnabled(false)
  122.                 print("Disabling generator", i)
  123.             end
  124.         end
  125.     else
  126.         print("No generators needed")
  127.         for i, generator in pairs(generators) do
  128.             generator.setEnabled(false)
  129.         end
  130.     end
  131. end
  132.  
  133. local function display_clock(x, y)
  134.     monitor.setCursorPos(x, y)
  135.     local time = textutils.formatTime(os.time(), true)
  136.     if #time == 4 then
  137.         time = "0" .. time
  138.     end
  139.     monitor.write(time)
  140. end
  141.  
  142. local function display_battery(id, x, y)
  143.     monitor.setCursorPos(x, y)
  144.     monitor.write("Batterie "..id)
  145.  
  146.     -- energy
  147.     local energy_value = info.batteries[id].energy
  148.     if energy_value > max_threshold then
  149.         monitor.setTextColor(colors.green)
  150.     elseif energy_value > min_threshold then
  151.         monitor.setTextColor(colors.yellow)
  152.     else
  153.         monitor.setTextColor(colors.red)
  154.     end
  155.  
  156.     local energy = tostring(energy_value)
  157.     if #energy < 4 then
  158.         energy = "< 1"
  159.     else
  160.         energy = energy:sub(1, #energy - 3)
  161.     end
  162.     for i = 1, 5 - #energy do
  163.         energy = " " .. energy
  164.     end
  165.     energy = energy .. " kRF"
  166.     monitor.setCursorPos(x+1, y+2)
  167.     monitor.write(energy)
  168.     monitor.setTextColor(colors.white)
  169.  
  170.     -- energy percentage
  171.     local percentage = math.floor(info.batteries[id].energy / info.batteries[id].max_energy * 100)
  172.     if percentage == 100 then
  173.         monitor.setCursorPos(x+3, y+3)
  174.     elseif percentage < 10 then
  175.         monitor.setCursorPos(x+5, y+3)
  176.     else
  177.         monitor.setCursorPos(x+4, y+3)
  178.     end
  179.     monitor.write(tostring(percentage) .. " %")
  180.  
  181.     -- state
  182.     local state = info.batteries[id].state
  183.     monitor.setCursorPos(x+1, y+4)
  184.     if state == "unknown" then
  185.         monitor.setTextColor(colors.lightGray)
  186.         monitor.write("UNBEKANNT")
  187.     elseif state == "ok" then
  188.         monitor.setTextColor(colors.lime)
  189.         monitor.write("STATISCH")
  190.     elseif state == "charging" then
  191.         monitor.setTextColor(colors.green)
  192.         monitor.write("LAEDT")
  193.     elseif state == "discharging" then
  194.         monitor.setTextColor(colors.orange)
  195.         monitor.write("ENTLAEDT")
  196.     end
  197.     monitor.setTextColor(colors.white)
  198. end
  199.  
  200. local function display_fuel(x, y)
  201.     monitor.setCursorPos(x, y)
  202.     monitor.write("Dieseltank ")
  203.  
  204.     local fuel = 0
  205.     local max_fuel = 0
  206.     for i, tank in pairs(tanks) do
  207.         fuel = fuel + info.tanks[i].amount
  208.         max_fuel = max_fuel + info.tanks[i].max_amount
  209.     end
  210.     local percentage = math.floor(fuel / max_fuel * 100)
  211.  
  212.     fuel = fuel / 1000
  213.     local fuel_text = tostring(fuel)
  214.     for i = 1, 5 - #fuel_text do
  215.         fuel_text = " " .. fuel_text
  216.     end
  217.     monitor.write(fuel_text .. "l ")
  218.  
  219.     if percentage == 100 then
  220.         monitor.setCursorPos(x+18, y)
  221.     elseif percentage < 10 then
  222.         monitor.setTextColor(colors.red)
  223.         monitor.setCursorPos(x+20, y)
  224.     else
  225.         monitor.setCursorPos(x+19, y)
  226.     end
  227.     monitor.setTextColor(colors.white)
  228.     monitor.write(tostring(percentage) .. "%")
  229. end
  230.  
  231. local function display_throuput(x, y)
  232.     monitor.setCursorPos(x, y)
  233.     monitor.write("Durchsatz")
  234.  
  235.     local input = tostring(info.input)
  236.     for i = 1, 5 - #input do
  237.         input = " " .. input
  238.     end
  239.     input = input .. " RF"
  240.  
  241.     local output = tostring(info.output)
  242.     for i = 1, 5 - #output do
  243.         output = " " .. output
  244.     end
  245.     output = output .. " RF"
  246.  
  247.     monitor.setCursorPos(x+12, y)
  248.     monitor.write("Input: " .. input)
  249.     monitor.setCursorPos(x+30, y)
  250.     monitor.write("Output: " .. output)
  251. end
  252.  
  253. local function display_generator(id, x, y)
  254.     monitor.setCursorPos(x, y)
  255.     monitor.write("Generator"..id)
  256.  
  257.     local state = info.generators[id].state
  258.     monitor.setCursorPos(x+1, y+2)
  259.     if state == "unknown" then
  260.         monitor.setTextColor(colors.lightGray)
  261.         monitor.write("UNBEKANNT")
  262.     elseif state == "running" then
  263.         monitor.setTextColor(colors.orange)
  264.         monitor.write("AKTIV")
  265.     elseif state == "disabled" then
  266.         monitor.setTextColor(colors.lime)
  267.         monitor.write("BEREIT")
  268.     end
  269.     monitor.setTextColor(colors.white)
  270. end
  271.  
  272. local function display_info()
  273.     monitor.setBackgroundColor(colors.black)
  274.     monitor.setTextColor(colors.white)
  275.     monitor.clear()
  276.  
  277.     monitor.setCursorPos(3, 2)
  278.     monitor.write("Notstrom Ueberwachung")
  279.  
  280.     display_clock(44, 2)
  281.  
  282.     local battery_offset = 12
  283.     for i, _ in ipairs(info.batteries) do
  284.         display_battery(i, 3 + battery_offset * (i-1), 4)
  285.     end
  286.  
  287.     display_fuel(3, 11)
  288.  
  289.     display_throuput(3, 14)
  290.  
  291.     local generator_offset = 12
  292.     for i, _ in ipairs(info.generators) do
  293.         display_generator(i, 3 + generator_offset * (i-1), 17)
  294.     end
  295. end
  296.  
  297. while true do
  298.     update_data()
  299.     control_generators()
  300.     display_info()
  301.     sleep(5)
  302. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement