Дано — известная многим программа Conky, используемая в основном для мониторинга различных параметров системы, датчиков и т.д.
Собственно, с датчиками у меня и возникала регулярно проблема — выбор датчика в Conky производится по номеру, т.е. примерно так ${hwmon 1 temp 1}
;
при этом данный номер, как показывает практика, может меняться после каждой перезагрузки.
Вероятно, с этим можно как-то бороться через настройки, правила eudev
или еще как. Но я пошел по пути наименьшего сопротивления и воспользовался
средствами Lua. Результат выложен в репозиторий conky, конкретно — модуль hwmon
.
Как это работает
Полный код доступен на GitHub.
Как выяснилось, в Lua можно использовать глобальные переменные, благодаря чему можно определить соответствие номеров и имен устройств
один раз, не тратя ресурсы при последующих вызовах. Поэтому, не заморачиваясь на оптимизации, перебираем все устройства hwmon
и заносим их в таблицу,
используя имя (из файла name
) как ключ, а индекс как значение.
Отдельный момент — это NVME — там для всех устройств используется одно имя (собственно «nvme»), и нужно их
как-то корректно различать. К счастью, способ есть — по пути /sys/class/hwmon
находятся символические ссылки, которые указывают на соответствующие
подкаталоги внутри /sys/devices
, где полный путь в случае NVME содержит номер устройства в системе. У меня это выглядит вот так:
Соответственно, посредством readlink
несложно получить путь, из которого примитивно выделяется участок «nvmeN» (в Lua для этого используется
:match('nvme%d+')
), который и добавляется в таблицу вместо имени.
Ну, а по итогу для получения значения датчика посредством метода conky_parse()
вызывается стандартное выражение ${hwmon ...}
с индексом,
полученным из таблицы.
Как это использовать
Для начала следует разместить модули utils.lua
и hwmon.lua
туда, где Conky их найдет. Ну, или прописать путь их размещения в Conky. Затем можно
просто загрузить модуль через lua_load
или же подгрузить его в свой lua-модуль, если таковой используется.
Дальше в секции TEXT
использовать:
Или определить в своем lua-скрипте что-то типа:
Такой вариант позволит не только отображать значение через ${lua ...}
, но и отрисовывать его через ${lua_bar ...}
и ${lua_graph ...}
.
PS. Температурные датчики it8686
По умолчанию ядро не поддерживает датчики на моей материнской плате, решение — установить сторонний модуль it87
, как описано на сайте
«Forza’s ramblings». Там сказано про материнские платы на базе чипсета B450, но и для моей Gigabyte B550M AORUS PRO AX все прекрасно заработало.