76. Мониторинг температуры процессора. Из Proxmox в Home Assistant.


Одним из важнейших показателей, которые необходимо отслеживать у аппаратной части любого компьютера, является температура процессора. Её сегодня и будем получать в самой распространённой конфигурации: мини-пк с установленным Proxmox, внутри которого работает виртуальная машина с Home Assistant.Тема мониторинга физических ресурсов уже затрагивалась ранее на этом сайте. Однако на отслеживании температуры процессора хотелось бы остановиться чуть подольше.

Для начала, какими инструментами можно получить необходимую информацию? Учитывая что речь идёт о модифицированном Дебиан.
- lm-sensors
- hddtemp
- glances
- модификация файла интерфейса для отображения CPU Temp.
- API.
- чтение файла Hardware Monitor


Первые 3 по сути это один и тот же вариант, с той лишь разницей что меняется название стороннего софта. Ну и для Glances есть одноимённая интеграция.

Недокументированная модификация интерфейса гипервизора это конечно смело, но звучит рискованно.

Получение данных этого вида через API скоро превратится в детскую мечту целого поколения, т.к. запрос на эту фичу открыт на БагЗилле проксмокса аж с середины 2012 года. И до сих пор он без официального ответа.

Казалось бы что можно обойтись максимально простыми решением "из коробки" и использовать записи hwmon.
Однако, как показала практика, это не самый точный вариант и такое решение не является универсальным для всех. 

Значит надо искать максимально простой и надёжный способ получить искомые данные и передать их в ХА.

В итоге, после немалого количества проб и ошибок было решено остановиться на утилите lm-sensors в виду её простоты, доступности, и надёжности.

Установка и настройка.

1. Открываем консоль проксмокса и пишем apt install lm-sensors.
2. Запускаем команду sensors-detect. С её помощью будет проведён полное сканирование системы на наличие разных видов сенсоров. рекомендуется ответить "да" на каждый вопрос.
3. После завершения sensors-detect, он предложит сгенерировать файл /etc/modules, который загружает необходимые модули ядра при запуске системы, и предложит добавить необходимые строки в конфигурационный файл /etc/modules.
4. После завершения настройки lm-sensors, для применения изменений рекомендуется перезагрузить систему.

Использование lm-sensors.

Чтобы получить базовую информацию о температурах выполняем команду sensors в терминале.



Т.к. нас интересует температура всего процессора целиком (со всеми ядрами, потоками и прочей требухой), то смотрим на значение Package id 0.
Это в любой конфигурации будет значение температуры именно самого камня. Соответственно, если физических камней несколько, то и Package id тоже будет несколько. 

Итак, нужное значение выводится на экран, но надо бы его отфильтровать. Для этого воспользуемся командой: sensors | grep 'Package id 0:'
Она отобразит только значение температуры процессора с тем знаком, который указан и с символом системы измерения:


Т.к. надо получить только цифры, то отсеем всё лишнее, видоизменив команду:
sensors | grep 'Package id 0:' | sed 's/+//;s/°C//'

Скрипт для Home Assistant.

Теперь надо сделать так, чтобы:
1. эта команда выполнялась регулярно
2. каким-то образом передать эти данные в Home Assistant.

Всех этих зайцев можно убить одним скриптом и одним встроенным инструментом. Но обо всём по порядку.



Для того, что-то выполнялось регулярно, в системе есть планировщик задач - крон, ну или кронтаб (crontab). Но чтобы сказать ему что надо что-то делать регулярно, надо ему объяснить или указать на это самое "что-то". Так что к кронтабу ещё вернёмся.

Итак, нужен скрипт, который будет запускать определённую выше команду, брать выданный результат и отправлять его в ХА.
Для того, чтобы одна система могла связаться  с другой есть много разных способов, в данном случае воспользуемся API Home Assistant. Это самый удобный способ чтобы проксмокс мог быстро инициировать соединение, авторизоваться и передать данные.


Для начала настроим Долгосрочный Токен Доступа.


Нажав на имя своего пользователя в нижней части ХА, оказываемся в панели его настроек и там создадим нужный токен. Можно дать ему имя, чтобы знать для какой цели нужен именно этот токен. И не забыть скопировать предложенный код куда-то в сторону, т.к. он больше нигде показан не будет.

Этот токен  подставим в скрипт:
#!/bin/bash

url_base="адрес_home_assistant_в_локальной_сети:8123/api/states"
token="здесь_пишем_свой_токен"

send_to_ha() {
  local sensor_name=$1
  local temperature=$2
  local friendly_name=$3
  local icon=$4
  local unique_id=$5

  local url="${url_base}/${sensor_name}"
  local payload="{\"state\":\"${temperature}\",\"attributes\": {\"friendly_name\":\"${friendly_name}\",\"icon\":\"${icon}\",\"state_class\":\"measurement\",\",\"unit_of_measurement\":\"°C\",\"device_class\":\"temperature\",\"unique_id\":\"${unique_id}\"}}"

  curl -k -X POST -H "Authorization: Bearer ${token}" -H 'Content-type: application/json' --data "${payload}" "${url}"
}

# Получаем температуру CPU с использованием команды sensors
cpu_temp=$(sensors | grep 'Package id 0:' | awk '{print $4}' | sed 's/+//;s/°C//')

# Определяем идентификатор сенсора и вызываем функцию для отправки данных
entity_id="sensor.Minicomp_CPU_Temp"
send_to_ha "${entity_id}" "${cpu_temp}" "Minicomp-CPU-Temperature" "mdi:cpu-64-bit" "unique_id_minicomp_temp"

Теперь создадим новый файл для этого скрипта в проксмоксе: nano cpu_temp.sh и вставляем в него текст, сохраняемся и выходим.

Чтобы этот скрипт можно было запускать, сделаем его исполняемым:
 chmod +x cpu_temp.sh.

Осталось добавить запускабельный скрипт в планировщик:
crontab -e

И добавляем с расписанием запуска каждую минуту:
*/1 * * * * /root/cpu_temp.sh > /dev/null 2>&1
Если в системе настроено оповещение по e-mail, то все события планировщика автоматически так же отправляются. Чтобы не получать каждую минуту новое письмо, то вывод именно этой задачи перенаправлен в пустоту.

Результат можно видеть на прилагаемом скриншоте.


Комментарии