shikhalev.org

Дано — известная многим программа Conky, используемая в основном для мониторинга различных параметров системы, датчиков и т.д. Собственно, с датчиками у меня и возникала регулярно проблема — выбор датчика в Conky производится по номеру, т.е. примерно так ${hwmon 1 temp 1}; при этом данный номер, как показывает практика, может меняться после каждой перезагрузки.

Вероятно, с этим можно как-то бороться через настройки, правила eudev или еще как. Но я пошел по пути наименьшего сопротивления и воспользовался средствами Lua. Результат выложен в репозиторий conky, конкретно — модуль hwmon.

Как это работает

Полный код доступен на GitHub.

Как выяснилось, в Lua можно использовать глобальные переменные, благодаря чему можно определить соответствие номеров и имен устройств один раз, не тратя ресурсы при последующих вызовах. Поэтому, не заморачиваясь на оптимизации, перебираем все устройства hwmon и заносим их в таблицу, используя имя (из файла name) как ключ, а индекс как значение.

Отдельный момент — это NVME — там для всех устройств используется одно имя (собственно «nvme»), и нужно их как-то корректно различать. К счастью, способ есть — по пути /sys/class/hwmon находятся символические ссылки, которые указывают на соответствующие подкаталоги внутри /sys/devices, где полный путь в случае NVME содержит номер устройства в системе. У меня это выглядит вот так:

# ls -l /sys/class/hwmon
итого 0
lrwxrwxrwx 1 root root 0 окт 21 16:09 hwmon0 -> ../../devices/virtual/thermal/thermal_zone0/hwmon0
lrwxrwxrwx 1 root root 0 окт 21 16:09 hwmon1 -> ../../devices/pci0000:00/0000:00:01.1/0000:01:00.0/nvme/nvme0/hwmon1
lrwxrwxrwx 1 root root 0 окт 21 16:09 hwmon2 -> ../../devices/pci0000:00/0000:00:01.2/0000:02:00.2/0000:03:04.0/0000:06:00.0/nvme/nvme1/hwmon2
lrwxrwxrwx 1 root root 0 окт 21 02:42 hwmon3 -> ../../devices/pci0000:00/0000:00:18.3/hwmon/hwmon3
lrwxrwxrwx 1 root root 0 окт 21 02:42 hwmon4 -> ../../devices/pci0000:00/0000:00:03.1/0000:08:00.0/hwmon/hwmon4
lrwxrwxrwx 1 root root 0 окт 21 02:42 hwmon5 -> ../../devices/virtual/thermal/thermal_zone1/hwmon5
lrwxrwxrwx 1 root root 0 окт 21 02:42 hwmon6 -> ../../devices/platform/it87.2624/hwmon/hwmon6

Соответственно, посредством readlink несложно получить путь, из которого примитивно выделяется участок «nvmeN» (в Lua для этого используется :match('nvme%d+')), который и добавляется в таблицу вместо имени.

Ну, а по итогу для получения значения датчика посредством метода conky_parse() вызывается стандартное выражение ${hwmon ...} с индексом, полученным из таблицы.

Как это использовать

Для начала следует разместить модули utils.lua и hwmon.lua туда, где Conky их найдет. Ну, или прописать путь их размещения в Conky. Затем можно просто загрузить модуль через lua_load или же подгрузить его в свой lua-модуль, если таковой используется.

Дальше в секции TEXT использовать:

${lua hwmon k10temp temp 1}

Или определить в своем lua-скрипте что-то типа:

function conky_cputemp()
    return conky_hwmon('k10temp', 'temp', 1)
end

Такой вариант позволит не только отображать значение через ${lua ...}, но и отрисовывать его через ${lua_bar ...} и ${lua_graph ...}.

PS. Температурные датчики it8686

По умолчанию ядро не поддерживает датчики на моей материнской плате, решение — установить сторонний модуль it87, как описано на сайте «Forza’s ramblings». Там сказано про материнские платы на базе чипсета B450, но и для моей Gigabyte B550M AORUS PRO AX все прекрасно заработало.