Advertisement
aka_zaratustra

Мониторинг заряда PSS ver 1.1

Apr 24th, 2021
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.43 KB | None | 0 0
  1. --Скрипт openComputers, для мониторинга заряда Power Sub-Station батарейки из GT++
  2. --Автор: aka_zaratustra весна 2021
  3. --Версия сборки под которую писался скрипт: GTNH 2.1.0.0
  4.  
  5. --Минимальная конфигурация компьютера openComputers - любой минимальный сэтап со сдвоенным монитором T1.
  6. --Для цветного вывода рекомендуемая конфигурация компьютера openComputers - Т2 видеокарта, сдвоенный монитор Т2, остальное может быть минимальным.
  7. --Адаптер с пустым внутренним слотом установлен в смежном блоке с контроллером Power Sub-Station.
  8. --Никаких других адаптеров, подключенных к греговским механизмам в сети компьютера openComputers быть не должно.
  9.  
  10. local ver = "1.1" -- версия программы
  11. --История изменений версий приведена внизу скрипта
  12.  
  13. --разрешение монитора
  14. local Width = 20
  15. local Height = 4
  16.  
  17. local component = require("component")
  18. local computer = require("computer")
  19.  
  20.  
  21. --local ADDRESS_PSS = "9885"
  22.  
  23.  
  24.    
  25. local object = {}
  26. object.PSS = {}
  27. local PSS = object.PSS
  28. --PSS.component = component.proxy(component.get(ADDRESS_PSS))
  29. PSS.component = component.proxy(component.gt_machine.address)
  30. --PSS.address = address
  31. local gpu = component.gpu
  32.  
  33.  
  34.  
  35. local PrintChargePercent  --процент заряда батареи
  36. local PrintChargeAmount  -- количество заряда в eu
  37.  
  38. -- скорость изменения заряда eu/t
  39. local PrintChargeChange  
  40. local iChargeChange = 0
  41.  
  42. local PrintChargeTime  -- время за которое произойдет полная зарядка/разрядка
  43.  
  44.  
  45. local LastTime = computer.uptime() -- счетчик времени
  46. local iLastChargeAmount = 0  -- количество заряда в eu, которое было на прошлой итерации
  47.  
  48. local info = object.PSS.component.getSensorInformation() --получаем таблицу с текстом состояния батареи
  49.  
  50. function howManyYears(t) -- преобразовать секунды в количество лет, месяцев, дней, часов, минут, секунд
  51.  
  52.     if t < 60 then --если осталось меньше минуты
  53.         return tostring(math.floor(t)) .. " сек"
  54.     elseif t < 60*60 then --если осталось меньше часа
  55.         local minutes = math.floor(t/60)
  56.         local seconds = math.floor(math.fmod(t, 60))
  57.         return tostring(minutes) .. " мин " .. tostring(seconds) .. " сек"
  58.     elseif t < 60*60*24 then --если осталось меньше суток
  59.         local hours = math.floor(t/(60*60))
  60.         local minutes = math.floor(math.fmod(t, 60*60)/60)
  61.         return tostring(hours) .. " ч " .. tostring(minutes) .. " мин"
  62.     elseif t < 60*60*24*30 then --если осталось меньше месяца
  63.         local days = math.floor(t/(60*60*24))
  64.         local hours = math.floor(math.fmod(t, 60*60*24)/(60*60))
  65.         return  tostring(days) .. " д " .. tostring(hours) .. " ч"
  66.     elseif t < 60*60*24*30*12 then --если осталось меньше года
  67.         local months = math.floor(t/(60*60*24*30))
  68.         local days = math.floor(math.fmod(t, 60*60*24*30)/(60*60*24))
  69.         return  tostring(months) .. " мес " .. tostring(days) .. " д "
  70.     else --если осталось больше года
  71.         local years = math.floor(t/(60*60*24*30*12))
  72.         local months = math.floor(math.fmod(t, 60*60*24*30*12)/(60*60*24*30))
  73.         return  tostring(years) .. " год " .. tostring(months) .. " мес"
  74.     end
  75. end
  76.  
  77. function draw() --отрисовать значения на экране
  78.     if gpu ~= nil then
  79.         gpu.fill(1,1,Width,Height,' ')
  80.         gpu.set(1,1, "Заряд: "..PrintChargePercent)
  81.         gpu.set(1,2, "       "..PrintChargeAmount)
  82.         if iChargeChange < 0 then
  83.             gpu.setForeground(0xFF0000)
  84.         elseif iChargeChange > 0 then
  85.             gpu.setForeground(0x00FF00)
  86.         end
  87.         gpu.set(1,3, "       "..PrintChargeChange)
  88.         gpu.setForeground(0xFFFFFF)
  89.         gpu.set(1,4, "Время: "..PrintChargeTime)
  90.     end
  91. end
  92.  
  93. function formatGrade(n, postscriptum) --преобразует число в выводимую строку с сокращением триад 123456789 -> 123 M, присоединяет в концу строки второй параметр
  94.     local sn = ""
  95.     if math.abs(n) < 1000 then
  96.         sn = tostring(math.floor(n*100)/100).." "
  97.     elseif math.abs(n) < 1000000 then
  98.         sn = tostring(math.floor(n/10)/100).."K "
  99.     elseif math.abs(n) < 1000000000 then
  100.         sn = tostring(math.floor(n/10000)/100).."M "
  101.     elseif math.abs(n) < 1000000000000 then
  102.         sn = tostring(math.floor(n/10000000)/100).."G "
  103.     else
  104.         sn = tostring(math.floor(n/10000000000)/100).."T "
  105.     end
  106.     return sn..postscriptum
  107. end
  108.  
  109. function update() --обновление инфы о состоянии батареи
  110.    
  111.     local ThisTime = computer.uptime()
  112.     local deltaTicks = (ThisTime - LastTime)*20 --сколько времени в тиках прошло после последнего обновления
  113.     LastTime = ThisTime
  114.     --print(deltaTicks)
  115.    
  116.  
  117.     info = object.PSS.component.getSensorInformation() --получаем таблицу с текстом состояния батареи
  118.  
  119.     local s = info[3] --строчка с текущим зарядом
  120.     s = string.sub(s,15,string.len(s)-3) --отрезаем лишние куски от строки
  121.     s,_ = s:gsub(',','') --вырезаем запятые
  122.     --print(s)
  123.     local iChargeAmount = tonumber(s)
  124.     --print(iChargeAmount)
  125.  
  126.     local s = info[4] --строчка с полной емкостью батареи
  127.     s = string.sub(s,14,string.len(s)-3) --отрезаем лишние куски от строки
  128.     s,_ = s:gsub(',','') --вырезаем запятые
  129.     --print(s)
  130.     local iBatteryCap = tonumber(s)
  131.     --print(iBatteryCap)
  132.    
  133.     local dChargePercent = iChargeAmount / iBatteryCap * 100 --процент заряда батареи неокругленный
  134.     dChargePercent = math.floor(dChargePercent*100)/100 --округляем с масштабированием, так чтобы получилось два знака после запятой (например 33.33%)
  135.     PrintChargePercent = tostring(dChargePercent) .. " %"
  136.     --print(PrintChargePercent)
  137.  
  138.     PrintChargeAmount = formatGrade(iChargeAmount, "eu") --форматируем в выводимую строку
  139.    
  140.     --print(PrintChargeAmount)
  141.    
  142.     iChargeChange = math.floor((iChargeAmount - iLastChargeAmount)/deltaTicks) -- скорость зарядки батареи в eu/t
  143.     PrintChargeChange = formatGrade(iChargeChange, "eu/t") --форматируем в выводимую строку
  144.     if iChargeChange > 0 then --добавим плюс в начале, если идет прирост энергии
  145.         PrintChargeChange = "+"..PrintChargeChange
  146.     end
  147.     --print(PrintChargeChange)
  148.     iLastChargeAmount = iChargeAmount
  149.    
  150.     --время, оставшееся до полной зарядки или полной разрядки батареи
  151.     local ticksRemain
  152.     if iChargeChange < 0 then --если батарея разряжается
  153.         ticksRemain = -iChargeAmount/iChargeChange
  154.     elseif iChargeChange > 0 then --если батарея заряжается
  155.         ticksRemain = (iBatteryCap - iChargeAmount)/iChargeChange
  156.     else --если батарея разрядилась до нуля
  157.         ticksRemain = 0
  158.     end
  159.     --print(ticksRemain/20)
  160.     PrintChargeTime = howManyYears(ticksRemain/20)
  161.     --print(PrintChargeTime)
  162.    
  163.     draw() --отрисовываем на экране
  164. end
  165.  
  166. --for name, val in pairs(info) do --просмотрим таблицу
  167.    
  168.         --print(name, val)
  169.    
  170.    
  171. --end
  172.  
  173. require("component").gpu.setResolution(Width, Height)
  174.  
  175.  
  176. while true do --вечный главный цикл программы
  177.     update()
  178.     os.sleep(1)
  179. end
  180.  
  181. -- Версия 1.1
  182. -- Добавлены в вывод общего заряда и скорости заряда два разряда после запятой: 12K eu/t -> 12.56K eu/t
  183. -- Указание ширины и высоты разрешения экрана вынесены в константы и указываются в начале скрипта
  184.  
  185.  
  186.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement