Advertisement
aka_zaratustra

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

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