Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --Скрипт openComputers, для мониторинга заряда Lapotronic Capacitor батарейки из GT++
- --Автор: aka_zaratustra 2021-2024
- --Версия сборки под которую писался скрипт: GTNH 2.7
- --Лицензия: MIT
- --Минимальная конфигурация компьютера openComputers - любой минимальный сэтап со сдвоенным монитором T1.
- --Для цветного вывода рекомендуемая конфигурация компьютера openComputers - Т2 видеокарта, сдвоенный монитор Т2, остальное может быть минимальным.
- --Адаптер с пустым внутренним слотом установлен в смежном блоке с контроллером Lapotronic Capacitor.
- --Никаких других адаптеров, подключенных к греговским механизмам в сети компьютера openComputers быть не должно.
- local ver = "1.9" -- версия программы
- --История изменений версий приведена внизу скрипта
- --начальный режим работы мониторинга:
- --1 - сальдо расход/приход
- --2 - отдельно расход/приход
- local draw_mode = 2
- --период расчета прихода расхода (5 сек, 5 мин, 1 час)
- local mode = 2
- --разрешение монитора
- local Width = 20
- local Height = 5
- if draw_mode == 2 then
- Width = 22
- end
- local component = require("component")
- local computer = require("computer")
- local event = require('event')
- --local ADDRESS_PSS = "9885"
- local object = {}
- object.PSS = {}
- local PSS = object.PSS
- --Найдем компонент батареи
- for address, name in component.list("gt", false) do
- local componentGT = component.proxy(address)
- local info = componentGT.getSensorInformation()
- --print(info[1])
- if string.find(info[1], "Operational Data") then
- PSS.component = componentGT
- --print(info[1])
- end
- end
- --PSS.component = component.proxy(component.get(ADDRESS_PSS))
- local gpu = component.gpu
- local PrintChargePercent --процент заряда батареи
- local PrintChargeAmount -- количество заряда в eu
- -- скорость изменения заряда eu/t
- local PrintChargeChange
- local iChargeChange = 0
- local AvarageChargeChange = 0
- -- скорость прихода и расхода заряда eu/t
- local PrintChargeIncome
- local iChargeIncome = 0
- local AvarageChargeIncome = 0
- local PrintChargeOutcome
- local iChargeOutcome = 0
- local AvarageChargeOutcome = 0
- local PrintChargeTime -- время за которое произойдет полная зарядка/разрядка
- local LastTime = computer.uptime() -- счетчик времени
- local iLastChargeAmount = 0 -- количество заряда в eu, которое было на прошлой итерации
- local iLastChargeIncome = 0 -- количество притока заряда в eu, которое было на прошлой итерации
- local iLastChargeOutcome = 0 -- количество оттока заряда в eu, которое было на прошлой итерации
- local AvarageDimSize = 20 -- количество хранимых последних значений скорости заряда. Используется для сглаживания скачков
- local current_i = 1
- local iChargeChangeDim = {} -- массив последних значений скорости зарядки
- --инициализируем массив
- for i = 1, AvarageDimSize do
- iChargeChangeDim[i] = 0
- end
- local iChargeIncomeDim = {} -- массив последних значений прихода заряда
- --инициализируем массив
- for i = 1, AvarageDimSize do
- iChargeIncomeDim[i] = 0
- end
- local iChargeOutcomeDim = {} -- массив последних значений расхода заряда
- --инициализируем массив
- for i = 1, AvarageDimSize do
- iChargeOutcomeDim[i] = 0
- end
- local info = object.PSS.component.getSensorInformation() --получаем таблицу с текстом состояния батареи
- function Log(s)
- LogFile = io.open("debugLog.txt", "a")
- LogFile:write(s .. "\n")
- LogFile:close()
- end
- function howManyYears(t) -- преобразовать секунды в количество лет, месяцев, дней, часов, минут, секунд
- if t < 60 then --если осталось меньше минуты
- return tostring(math.floor(t)) .. " сек"
- elseif t < 60*60 then --если осталось меньше часа
- local minutes = math.floor(t/60)
- local seconds = math.floor(math.fmod(t, 60))
- return tostring(minutes) .. " мин " .. tostring(seconds) .. " сек"
- elseif t < 60*60*24 then --если осталось меньше суток
- local hours = math.floor(t/(60*60))
- local minutes = math.floor(math.fmod(t, 60*60)/60)
- return tostring(hours) .. " ч " .. tostring(minutes) .. " мин"
- elseif t < 60*60*24*30 then --если осталось меньше месяца
- local days = math.floor(t/(60*60*24))
- local hours = math.floor(math.fmod(t, 60*60*24)/(60*60))
- return tostring(days) .. " д " .. tostring(hours) .. " ч"
- elseif t < 60*60*24*30*12 then --если осталось меньше года
- local months = math.floor(t/(60*60*24*30))
- local days = math.floor(math.fmod(t, 60*60*24*30)/(60*60*24))
- return tostring(months) .. " мес " .. tostring(days) .. " д "
- else --если осталось больше года
- local years = math.floor(t/(60*60*24*30*12))
- local months = math.floor(math.fmod(t, 60*60*24*30*12)/(60*60*24*30))
- return tostring(years) .. " г " .. tostring(months) .. " мес"
- end
- end
- function draw1() --отрисовать значения на экране по варианту 1
- if gpu ~= nil then
- gpu.fill(1,1,Width,Height,' ')
- gpu.setForeground(0xFFFFFF)
- gpu.set(1,1, "Заряд: "..PrintChargePercent)
- gpu.set(1,2, " "..PrintChargeAmount)
- if AvarageChargeChange < 0 then
- gpu.setForeground(0xFF0000)
- elseif AvarageChargeChange > 0 then
- gpu.setForeground(0x00FF00)
- end
- gpu.set(1,3, " "..PrintChargeChange)
- gpu.setForeground(0xFFFFFF)
- gpu.set(1,4, "Время: "..PrintChargeTime)
- end
- end
- function draw2() --отрисовать значения на экране по варианту 2
- if gpu ~= nil then
- gpu.fill(1,1,Width,Height,' ')
- gpu.setForeground(0xFFFFFF)
- gpu.set(1,1, "Charge: "..PrintChargePercent)
- gpu.set(1,2, " "..PrintChargeAmount)
- if AvarageChargeIncome < 0 then
- gpu.setForeground(0xFF0000)
- elseif AvarageChargeIncome > 0 then
- gpu.setForeground(0x00FF00)
- end
- local spaces = string.rep(" ", 9 - string.len(PrintChargeIncome))
- gpu.set(1,3, spaces..PrintChargeIncome)
- gpu.setForeground(0xFFFFFF)
- if AvarageChargeOutcome < 0 then
- gpu.setForeground(0xFF0000)
- elseif AvarageChargeOutcome > 0 then
- gpu.setForeground(0x00FF00)
- end
- local spaces = string.rep(" ", 9 - string.len(PrintChargeOutcome))
- gpu.set(10,3, spaces..PrintChargeOutcome)
- gpu.setForeground(0xFFFFFF)
- gpu.set(19,3, "eu/t")
- if mode == 0 then
- last_s = "(last 5 seconds)"
- elseif mode == 1 then
- last_s = "(last 5 minutes)"
- else
- last_s = "(last 1 hour)"
- end
- gpu.setForeground(0xFFFFFF)
- gpu.set(3,4, last_s)
- if AvarageChargeIncome + AvarageChargeOutcome < 0 then
- gpu.setForeground(0xFF0000)
- elseif AvarageChargeIncome + AvarageChargeOutcome > 0 then
- gpu.setForeground(0x00FF00)
- end
- gpu.set(1,5, "Time: "..PrintChargeTime)
- end
- end
- function formatGrade(n, postscriptum) --преобразует число в выводимую строку с сокращением триад 123456789 -> 123 M, присоединяет в концу строки второй параметр
- local sn = ""
- if math.abs(n) < 1000 then
- sn = tostring(math.floor(n*100)/100).." "
- elseif math.abs(n) < 1000000 then
- sn = tostring(math.floor(n/10)/100).."K "
- elseif math.abs(n) < 1000000000 then
- sn = tostring(math.floor(n/10000)/100).."M "
- elseif math.abs(n) < 1000000000000 then
- sn = tostring(math.floor(n/10000000)/100).."G "
- elseif math.abs(n) < 1000000000000000 then
- sn = tostring(math.floor(n/10000000000)/100).."T "
- elseif math.abs(n) < 1000000000000000000 then
- sn = tostring(math.floor(n/10000000000000)/100).."P "
- elseif math.abs(n) < 1000000000000000000000 then
- sn = tostring(math.floor(n/10000000000000000)/100).."E "
- else
- sn = tostring(math.floor(n/10000000000000000000)/100).."Z "
- end
- return sn..postscriptum
- end
- function cutSpaces(s)
- --for i = 1, #s do
- -- local c = s:sub(i,i)
- -- print(string.byte(c))
- --end
- --s,_ = s:gsub(' ','') --вырезаем пробелы (для 2.1.1.3)
- --s,_ = s:gsub(',','') --вырезаем запятые (для 2.1.1.0)
- --s,_ = s:gsub(string.char(194),'') --вырезаем какие-то непонятные символы (для 2.1.2.0) «Перемещение курсора в начало строки»
- --s,_ = s:gsub(string.char(160),'') --вырезаем какие-то непонятные символы (для 2.1.2.0) Вроде похож на пробел, но не пробел - «неразрывный пробел»
- s,_ = s:gsub("%D+", "") --оставляем только цифры
- return s
- end
- function update() --обновление инфы о состоянии батареи
- info = object.PSS.component.getSensorInformation() --получаем таблицу с текстом состояния батареи
- --########################ДЛЯ ДЭБАГА
- -- debugFile = io.open("debugFile.txt", "w")
- -- for name, val in pairs(info) do --просмотрим таблицу
- -- -- --print(name, val)
- -- debugFile:write(name, val .. "\n")
- -- --os.sleep(0.5)
- -- end
- -- debugFile:close()
- --goto done
- --########################
- local s = info[2] --строчка с текущим зарядом
- --s = string.sub(s,15,string.len(s)-3) --отрезаем лишние куски от строки
- s = cutSpaces(s)
- local iChargeAmount = tonumber(s)
- local s = info[23] --строчка с текущим wireless зарядом
- s = cutSpaces(s)
- iChargeAmount = iChargeAmount + tonumber(s)
- local s = info[10+mode] --строчка с текущим приходом заряда в секунду
- --s = string.sub(s,16,string.len(s)-6) --отрезаем лишние куски от строки
- s,_ = s:gsub("(last 5", "")
- s,_ = s:gsub("(last 1", "")
- s = cutSpaces(s)
- AvarageChargeIncome = tonumber(s)
- local s = info[13+mode] --строчка с текущим расходом заряда
- --s = string.sub(s,17,string.len(s)-6) --отрезаем лишние куски от строки
- s,_ = s:gsub("(last 5", "")
- s,_ = s:gsub("(last 1", "")
- s = cutSpaces(s)
- --print(s)
- AvarageChargeOutcome = tonumber(s)
- AvarageChargeOutcome = AvarageChargeOutcome * -1
- --строчка с процентным использованием батарейки
- local s = info[5] --общий объем хранилища
- s,_ = s:gsub("Total Capacity: ", "")
- s = cutSpaces(s)
- local TotalCapacity = tonumber(s)
- local ChargePercent = iChargeAmount/TotalCapacity*100
- --Log("TotalCapacity "..TotalCapacity)
- --Log("iChargeAmount "..iChargeAmount)
- --Log("PrintChargePercent "..PrintChargePercent)
- PrintChargePercent = string.sub(tostring(ChargePercent),1,6).."%"
- --print(PrintChargePercent)
- PrintChargeAmount = formatGrade(iChargeAmount, "eu") --форматируем в выводимую строку
- --print(PrintChargeAmount)
- --
- PrintChargeIncome = formatGrade(AvarageChargeIncome, "") --форматируем в выводимую строку
- if AvarageChargeIncome > 0 then --добавим плюс в начале, если идет прирост энергии
- PrintChargeIncome = "+"..PrintChargeIncome
- end
- PrintChargeOutcome = formatGrade(AvarageChargeOutcome, "") --форматируем в выводимую строку
- local s = info[16] --Time to Full
- local TimeToFull = tonumber(s)
- s,_ = s:gsub("Time to Full: ", "")
- s,_ = s:gsub("Time to Empty: ", "")
- PrintChargeTime = s
- --отрисовываем на экране вариант вывода в зависимости от выбранного режима
- if draw_mode == 1 then
- draw1()
- else
- draw2()
- end
- ::done::
- end
- local needToChangeMode = false
- function handleEvent() --вызывается событием
- needToChangeMode = true
- end
- --for name, val in pairs(PSS.component) do --просмотрим таблицу
- --print(name, val)
- --os.sleep(2)
- --end
- require("component").gpu.setResolution(Width, Height)
- event.listen("key_down", handleEvent) -- listen for keypress
- while true do --вечный главный цикл программы
- os.sleep(1)
- --если, пока спали, была нажата кнопка, то меняем режим
- if needToChangeMode == true then
- mode = mode + 1
- if mode > 2 then
- mode = 0
- end
- needToChangeMode = false
- --Log("mode:" .. mode)
- end
- update() --выводим на экран инфу
- end
- -- Версия 1.1
- -- Добавлены в вывод общего заряда и скорости заряда два разрадя после запятой: 12K eu/t -> 12.56K eu/t
- -- Указание ширины и высоты разрешения экрана вынесены в константы и указываются в начале скрипта
- -- Версия 1.2
- -- Добавлено сглаживание значения скорости заряда батареи. Теперь выводится средняя скорость за последнее количество секунд, указанное в константе AvarageDimSize
- -- Устранена проблема отказа запуска программы из-за наличия вокруг блока адаптера других блоков Грега, например электрических проводов
- -- Версия 1.3
- -- Добавлен режим вывода информации на экран, при котором входящая и исходящая скорости заряда батареи отображаются отдельно.
- -- Добавлена возможность переключения между режимами вывода информации на экран непосредственно во время работы программы. Переключение между режимами происходит по нажатию любой клавиши.
- -- Версия 1.4
- -- Усовершенствованно цветовое отображение информации времени оставшегося до заряда/разряда батареи. Теперь время выводится зеленым если батарея заряжается, и красным если разряжается.
- -- Начальный режим работы мониторинга установлен в "отдельно расход/приход" (задается константой mode)
- -- Версия 1.5
- -- Учтено изменение формата информации в таблице состояния батареи для версии 2.1.1.3 (на версии 2.1.1.0 разделители триад были запятые, а в 2.1.1.3 стали пробелом)
- -- Версия 1.6
- -- Учтено изменение формата информации в таблице состояния батареи для версии 2.1.2.0
- -- Версия 1.7
- -- Учтено изменение формата информации в таблице состояния батареи для версии 2.1.2.3 (количество увеличения и уменьшения заряда батареи переместились на другие строчки)
- -- Версия 1.8 Теперь поддерживает Lapotronic Capacitor, но не поддерживает Power Sub Station! Для PSS пользуйтесь прошлой версией!
- -- Версия 1.9
- -- Адаптировано под GTNH 2.7.
- -- Добавлено 3 режима отображения усреднения значений: 5 секунд, 5 минут, 1 час. Переключается нажатием любой кнопки глядя в монитор OpenComputers.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement