воскресенье, 18 ноября 2012 г.

Sensors


Вывод данных о температуре ядер, процессора и т.п. с помощью lua без использования команды conky_parse("${execi 4 sensors | grep 'Core 0' | cut -c 15-16} °C") и без расчета места расположения необходимых данных.


Этим способом мы избавляемся от энергоемкой команды execi и не вызываем программу обработки строки conky_parse(...)
Для получения данных необходимо, чтобы lm-sensors был установлен, впрочем он должен быть установлен и для вывода с помощью conky_parse.

В терминале даем команду

sensors

В окне терминала будет выведены сведения о доступных данных. У меня это выглядит так



Все эти данные загоняем в память используя локальные переменные

local f = io.popen("sensors")
local sensors = f:read("*a")
f:close()

и удаляем перенос строк и "мусор"

sensors = string.gsub(sensors,"[\n\r]","")

Теперь решаем, что именно будем выводить. Для примера я буду выводить в окно conky следующие данные

- температура первого ядра Core 0
- температуру второго ядра Core 1
- температуру процессора CPU Temperature
- обороты вентилятора процессора CPU FAN Speed

Забираем данные о температуре первого ядра

local s,f,t = string.find(sensors, "Core 0:%s*([%p%d]*)")

В этой строке дается команда найти значения находящиеся после Core 0:

Немного о символах в этой и последующих строках

- %s - означает пробел
- %p - означает знак препинания, "+" и "-" тоже, в этом случае, относятся к ним
- %d - означает цифру
- %a - означает букву
-  * - означает множество однотипных символов
- ([%p%d]*) - всё, что находится внутри скобок будет забрано
- [%p%d]* означает, что последовательно будут взяты сначала все знаки препинания, а затем все цифры

Назначаем локальную переменную и присваиваем ей значение температуры первого ядра, заодно включаем в значение двоеточие и обозначение температуры

local cpu1_temp = ": "..t.."°C"

Температуру второго ядра, температуру процессора и обороты вентилятора заберем следующими строками

local s,f,t = string.find(sensors, "Core 1:%s*([%p%d]*)")
local cpu2_temp = ": "..t.."°C"
local s,f,t = string.find(sensors, "CPU FAN Speed:%s*(%d*)")
local fan_speed = ": "..t.." об/мин" 
local s,f,t = string.find(sensors, "CPU Temperature:%s*([%p%d]*)")
local cpu_temp = ": "..t.."°C"

Теперь выводим данные в окно conky. Это можно сделать таким образом, привожу только строку выводящую текст, подготовка шрифта, цвета и координаты - пропущены.

cairo_show_text(cr, "Температура Core1 " .. cpu1_temp)

выдаст в окно conky значение температуры первого ядра. Вот кажется и всё, но, это для каждого значения необходимо повторять строку столько раз, сколько выводим параметров, рассчитывая каждый раз координаты, расстояние между значениями, чтобы всё было ровно. По моему личному мнению прогресс двигают лентяи. Поэтому продолжим.

Создаем базу выводимых значений с названием name, т.к. вывод будем делать в двух колонках, сначала идут данные для первой колонки, далее для второй

name = {"Температура CPU", "Температура Core1", "Температура Core2", "Обороты вентилятора", cpu_temp, cpu1_temp, cpu2_temp, fan_speed}

запускаем вывод текста в цикле, первым значением будет "0". Это сделано для того, чтобы вывод первой строки был в заданных координатах, т.к. у нас всего 8 значений, то последнее значение будет седьмым, не забываем, что счет идет с нуля

for i = 0, 7 do

В первой колонке будут размещены названия выводимого параметра, во второй - значение. Поэтому надо разделить данные, сначала будут выведена первая колонка, содержащая четыре названия

if i < 4 then

Назначаем координаты первой колонки

cairo_move_to(cr, x, y + gap_1*i)

для вывода каждого названия в новой строке к координате по вертикали "y" прибавляем расстояние между строк. Я использую значение размера шрифта, но оно может быть любым. Это значение умножаем на номер цикла. Поэтому цикл начинается с "0", При умножении на "0" получаем "0" и координаты остаются равными заданным

else

После вывода названий, как только счетчик будет равен четырем, сдвигаем вывод текста по горизонтали, и возвращаем вертикальную координату

cairo_move_to(cr, x + gap_2, y + gap_1*(i-4))
end

Выводим текст

cairo_show_text(cr, name[i+1])
end

Вот что видно на экране



Готовый скрипт можно взять https://dl.dropbox.com/u/22038871/sensors_detect.lua.tar.gz

1 комментарий:

  1. Did you hear there is a 12 word sentence you can speak to your man... that will induce deep emotions of love and impulsive attractiveness to you buried within his heart?

    That's because deep inside these 12 words is a "secret signal" that triggers a man's impulse to love, idolize and protect you with his entire heart...

    12 Words Who Fuel A Man's Desire Response

    This impulse is so hardwired into a man's brain that it will drive him to work harder than before to take care of you.

    In fact, fueling this influential impulse is so binding to achieving the best possible relationship with your man that once you send your man a "Secret Signal"...

    ...You'll immediately notice him open his mind and soul for you in a way he never expressed before and he'll identify you as the only woman in the universe who has ever truly understood him.

    ОтветитьУдалить