Возникла необходимость поставить дома еще один сервер, и я задался целью мониторить его показатели в домашнем умном доме, в качестве которого используется Home Assistant. Быстрое и потом вдумчивое гугление не дало устраивающих меня универсальных решений, поэтому построил свой велосипед.
Вводные: мониторить будем загрузку и температуру процессора,
загрузку оперативной памяти и свопа, свободное место на дисках,
продолжительность аптайма, общую загрузку системы, температуру и
состояние smart дисков по отдельности, и состояние raid (на сервере
с ubuntu server 20 поднят простой софтовый raid1). Диски WD Green,
материнская плата GA-525 со встроенным atom525.
На сервере умного дома уже поднят брокер mosquitto, поэтому в
качестве метода передачи данных выбран mqtt.
В первых разделах сего труда приведены принципы примененных методов
сбора данных, а в конце - скрипты передачи данных и настройки
HA.
Все команды в примерах выполняются от пользователя root
Оглавление
Сбор
показаний системных датчиков
Сбор данных о
нагруженности системы
Сбор данных о
состоянии жестких дисков
Сбор данных о
состоянии RAID
Передача
собранных данных
Настройка Home
Assistant
Показания системных датчиков
Для получения встроенных датчиков воспользуемся утилитой
sensors
Если она не установлена, поставим ее:
apt-get install lm-sensors
Сначала надо найти все имеющиеся датчики. Запускаем команду
sensors-detect
и отвечаем y на все вопросы. После этого можно
поглядеть что получилось:
sensors
Надо отметить, что лично у меня sensors стал выводить все найденные датчики только после перезагрузки. Может какой то баг, не знаю.
Надо бы как то формализовать вывод. К счастью у sensors есть
удобный режим вывода в json, и можно скрыть название адаптора.
sensors -A -u -j
Выдаст длинный json. Вот мой, например.
Ну вот, с этим работать удобнее. Для передачи показаний дальше
надо разобрать данные. Для разбора json прямо в консоли есть
шикарнейшая утилита - jp. Если она не установлена - для
ubuntu она есть в пакетах:
apt-get install jq
Определяем xpath нужного параметра. Можно глазами, можно с помощью например этого удобного онлайн-инструмента.
Теперь прямо одной строкой можно получить интересующие нас
данные. Я хочу сохранять температуру процессора, одного ядра
хватит, частоту вращения кулера, и еще какой то третий сенсор
temp3, который показался мне подходящим для косвенной оценки
температуры внутри корпуса:
sensors -A -u -j | jq '.["coretemp-isa-0000"]["Core
0"].temp2_input'
sensors -A -u -j | jq '.["it8720-isa-0290"].fan1.fan1_input'
sensors -A -u -j | jq
'.["it8720-isa-0290"].temp3.temp3_input'
Нагруженность системы
Будем получать процент занятости памяти и свапа, свободное место на диске, интегральную загрузку системы, загрузку процессора, продолжительность аптайма.
Утилизация памяти. Самый простой способ по моему - воспользоваться командой free. Чтобы не ломать глаза, есть параметр -m, выводящий все значения в мегабайтах.
Берем знаничения всего и использовано, и из них вычисляем
процент использования. Наверное можно где-нибудь добыть готовый
процент, но вдруг понадобится потом исходное значение.
free -m | grep "Mem" | awk '{print $2}'
Соответственно в параметр grep отдаем название строки, а в параметр awk - номер столбца, в результате получаем готовую цифру. Дальше по аналогии можно получить остальные данные, а процент вычислить по формуле. В разделе передача данных в скрипте можно найти алгоритм расчета.
Свободное место на дисках получаем по аналогии,
с помощью команды df. Нужные мне данные уже посчитаны в
процентах, просто берем готовое, используя тот же подход, что и с
памятью. Есть только одно отличие - нам нужна цифра, а тут
получится строка. Для удаления символа процента последняя
команда:
df
df | grep "/dev/md127p1" | awk '{print $5}' | sed 's/%$//'
df | grep "/dev/md126p1" | awk '{print $5}' | sed
's/%$//'
Суммированную загрузку системы можно получить в
файле /proc/loadavg. Надо понимать, что цифры там - показатель,
измеренный в попугаях. Первые три строки означают среднее
количество процессов или потоков, которые выполняются, находятся в
очереди на выполнение или ждут завершения операций ввода/вывода за
1, 5 и 15 минут. То есть это не процент и не доля от целого. Просто
если это значение представить в виде числа, то большое (больше
единицы) число там это плохо, п'нятненько?
Я буду брать за 15 минут:
cat /proc/loadavg | awk '{print $3}'
Аптайм нам даст команда uptime:
uptime | awk '{print $3}' | sed 's/,$//'
Ну и наконец загрузку процессора возьмем у
программы mpstat. Я использую именно эту программу, потому что она
по умолчанию суммирует ядра, кроме того выдает информацию и тут же
заканчивает свой процесс. Тут тоже потребуются арифметические
вычисления, потому что все распространенные утилиты отдельно
считают задачи пользователя и системы, но зато суммируют время
простоя. Таким образом, если мы хотим получить просто цифру
загруженности, то надо или из единицы вычесть простой, или сложить
все направления. Если mpstat у вас не установлена, то это можно
сделать командой apt install sysstat.
Итак,mpstat | grep all | awk '{print
$13}'
Получение из этого числа конкретного процента загрузки
процессора реализовано почти так же как и в случае с вычислением
занятой памяти будет в скрипте выгрузки, но есть нюанс.
Дело в том, что му почти наверняка получим нецелое число, и в
зависимости от текущей локали там может быть не запятая а точка. Да
и вообще bash бывает плохо умеет работать в числами с точкой.
Поэтому вычисление текущей загрузки передано программе bc
cpuidle=$(mpstat | grep all | awk '{print $13}')
cpuload=$(echo "100-$cpuidle" | bc -l)
echo "Текущая загрузка процессора: $cpuload"
Показания состояния жестких дисков
Для получения температуры дисков воспользуемся
утилитой hddtemp. Если ее нет, ставим:
apt-get install hddtemp
Работать вообще просто: для получения температуры ей указывается устройство, и с параметром -n не будет лишних данных:
Для получения данных со SMART воспользуемся
smartmontools
apt-get install smartmontools
Для использования надо указать на какой диск смотреть, и ключ
-a, иначе будет выведена просто короткая справка о диске.
smartctl -a /dev/sda
Утилита вываливает целую гору информации, несколько экранов. Не
буду приводить тут скриншоты, слишком много. Из всей этой кучи надо
выделить интересующие показатели. Я для себя выделил эти:
Raw_Read_Error_Rate количество ошибок чтения.
Ненулевые значения уже требуют внимания, а большие говорят о скором
выходе диска из строя. В интернетах пишут, что у некоторых моделей
большое значение в этом поле является нормальным. В общем случае
значение должно быть равно нулю. А поскольку мы все таки мониторим,
нас будет волновать увеличение этого числа;
Reallocated_Sector_Ct количество
перераспределённых секторов. Большое значение говорит о большом
количестве ошибок диска;
Seek_Error_Rate количество ошибок
позиционирования. Большое значение говорит о плохом состоянии
диска;
Spin_Retry_Count количество попыток повторной
раскрутки. Большое значение говорит о плохом состоянии диска;
Reallocated_Event_Count количество операций
перераспределения секторов;
Offline_Uncorrectable количество неисправных
секторов. Большое значение говорит о повреждённой поверхности.
Чтобы их вытащить из ответа утилиты, можно воспользоваться
удобной функцией - вывод значений в формате json. Для этого к
строке запуска добавляем параметр -j, вот так:
smartctl -a -j /dev/sda
В ответ получим длинный json, для удобства анализа сохраняем в файл. Вот мой. Ваш, скорее всего будет несколько иным. В этом внушительном файле надо глазами или иным образом получить json xpath к интересующим параметрам.
Получив xpath, выделяем конкретную цифру с помощью той же утилиты jq, вот так (в конце в комментарии имя параметра):
smartctl -a /dev/sda -j | jq
'.ata_smart_attributes.table[0].raw.value' #Raw_Read_Error_Rate
smartctl -a /dev/sda -j | jq
'.ata_smart_attributes.table[3].raw.value'
#Reallocated_Sector_Ct
smartctl -a /dev/sda -j | jq
'.ata_smart_attributes.table[4].raw.value' #Seek_Error_Rate
smartctl -a /dev/sda -j | jq
'.ata_smart_attributes.table[6].raw.value' #Spin_Retry_Count
smartctl -a /dev/sda -j | jq
'.ata_smart_attributes.table[12].raw.value'
#Reallocated_Event_Count
smartctl -a /dev/sda -j | jq
'.ata_smart_attributes.table[14].raw.value'
#Offline_Uncorrectable
Кроме того, есть такой ответ на вопрос типа "ты нормально скажи - здоров ты или нет" - запустив утилиту с параметром -H, можно получить суммарный вывод о здоровье диска. У режима тоже есть параметр -j, выводящий структурированный json.
Также выделям его из json:
smartctl -a /dev/sda -j | jq '.smart_status.passed'
#smart_status
Некоторые модели дисков тестируют себя сами автоматически,
некоторые нет, поэтому чтобы застраховаться, надо запланировать в
cron запуск теста. В общем случае достаточно короткого ежедневно и
длинного еженедельно.
smartctl -t short /dev/sda
быстрое тестирование, занимает около 2 минут
smartctl -t long /dev/sda
расширенный тест, занимает около 1 часа.
Если этот вариант не нравится, у программы есть режим демона,
smartd, который сам будет запускать тестирование, и может даже
слать отчеты. Отчетов нам не нужно, а вот автотестирование
пригодится. Настройку smartd легко нагуглить.
Показания состояния RAID
ДисклеймерНа контролируемом сервере поднят просто raid на mdadm. На
разделах дисков создано два массива, для системы и для /var.
Рассматривается мониторинг именно такой конфигурации, для иной
конфигурации на mdadm можно адаптировать, а про аппаратный raid
ничего не знаю.
Самый простой способ узнавать что происходит, что я нашел - это
брать уже готовые данные в виртуальной файловой системе sys.
[1] [2]
Тут есть определенная проблема - я не нашел способа проверить
работоспособность этого метода. Буду исходить из мысли что все
хорошо.
Итак, получаем названия разделов
cat /proc/mdstat
Вижу что то такое:
Сначала надо вызвать проверку
echo 'check' >/sys/block/md126/md/sync_action
echo 'check' >/sys/block/md127/md/sync_action
А потом просто взять готовое
cat /sys/block/md126/md/mismatch_cnt
cat /sys/block/md127/md/mismatch_cnt
если команды возвращают 0, то все ок.
Команды запуска проверки запускаем из крона периодически, иначе данные будут неактуальны.
Сбор и передача данных
Если на сервере не установлен клиент mosquitto, то ставим
его:
apt-get install mosquitto-clients
Создаем где-нибудь скрипты, куда сведем все команды сбора и
публикации. Я разделил все операции на три группы - частые
(показатели системы), средние (состяние raid и свободного места), и
редкие (данные smart):
touch system.sh && touch drives.sh && touch
smart.sh
chmod u+x system.sh &&chmod u+x drives.sh &&chmod
u+x smart.sh
В созданные файлы пишем:
system.sh
#!/bin/bash#Укажите адрес вашего брокера и учетные данныеip=xx.xx.xx.xxusr="xx"pass="xx"tempdrive1=$(hddtemp "/dev/sda" -n)echo "Температура диска 1: $tempdrive1"tempdrive2=$(hddtemp "/dev/sdb" -n)echo "Температура диска 2: $tempdrive2"tempcpu=$(sensors -A -u -j | jq '.["coretemp-isa-0000"]["Core 0"].temp2_input')echo "Температура процессора: $tempcpu"fan=$(sensors -A -u -j | jq '.["it8720-isa-0290"].fan1.fan1_input')echo "Скорость кулера процессора: $fan"temp3=$(sensors -A -u -j | jq '.["it8720-isa-0290"].temp3.temp3_input')echo "Температура системы: $temp3"totalram=$(free -m | grep "Mem" | awk '{print $2}')echo "Всего памяти: $totalram"usedram=$(free -m | grep "Mem" | awk '{print $3}')echo "Всего использовано памяти: $usedram"usedrampercent=$(($usedram * 100 / $totalram))echo "Всего использовано памяти в процентах: $usedrampercent"totalswap=$(free -m | grep "Swap" | awk '{print $2}')echo "Всего свопа: $totalswap"usedswap=$(free -m | grep "Swap" | awk '{print $3}')echo "Всего использовано свопа: $usedswap"usedswappercent=$(($usedswap * 100 / $totalswap))echo "Всего использовано свопа в процентах: $usedswappercent"averageload=$(cat /proc/loadavg | awk '{print $3}')echo "Средняя загрузка системы: $averageload"uptimedata=$(uptime | awk '{print $3}' | sed 's/,$//')echo "Аптайм: $uptimedata"cpuidle=$(mpstat | grep all | awk '{print $13}')cpuload=$(echo "100-$cpuidle" | bc -l) #небольшой костыль, для того чтобы bash нормально обработал точку в поданных данныхecho "Текущая загрузка процессора: $cpuload"echo " "echo "Публикация данных"mosquitto_pub -h $ip -t "srv/tempdrive1" -m $tempdrive1 -u $usr -P $passmosquitto_pub -h $ip -t "srv/tempdrive2" -m $tempdrive2 -u $usr -P $passmosquitto_pub -h $ip -t "srv/tempcpu" -m $tempcpu -u $usr -P $passmosquitto_pub -h $ip -t "srv/fan" -m $fan -u $usr -P $passmosquitto_pub -h $ip -t "srv/temp3" -m $temp3 -u $usr -P $passmosquitto_pub -h $ip -t "srv/usedrampercent" -m $usedrampercent -u $usr -P $passmosquitto_pub -h $ip -t "srv/usedswappercent" -m $usedswappercent -u $usr -P $passmosquitto_pub -h $ip -t "srv/averageload" -m $averageload -u $usr -P $passmosquitto_pub -h $ip -t "srv/uptimedata" -m $uptimedata -u $usr -P $passmosquitto_pub -h $ip -t "srv/cpuload" -m $cpuload -u $usr -P $pass
#!/bin/bash#Укажите адрес вашего брокера и учетные данныеip=xx.xx.xx.xxusr="xx"pass="xx"raid_system_status=$(cat /sys/block/md126/md/mismatch_cnt)echo "Исправность RAID системного раздела: $raid_system_status"raid_var_status=$(cat /sys/block/md127/md/mismatch_cnt)echo "Исправность RAID раздела данных: $raid_var_status"freesystemdisk=$(df | grep "/dev/md127p1" | awk '{print $5}' | sed 's/%$//')echo "Занято места на системном разделе: $freesystemdisk"freedatadisk=$(df | grep "/dev/md126p1" | awk '{print $5}' | sed 's/%$//')echo "Занято места на разделе данных: $freedatadisk"echo " "echo "Публикация данных"mosquitto_pub -h $ip -t "srv/raid_system_status" -m $raid_system_status -u $usr -P $passmosquitto_pub -h $ip -t "srv/raid_var_status" -m $raid_var_status -u $usr -P $passmosquitto_pub -h $ip -t "srv/freesystemdisk" -m $freesystemdisk -u $usr -P $passmosquitto_pub -h $ip -t "srv/freedatadisk" -m $freedatadisk -u $usr -P $pass
#!/bin/bash#Укажите адрес вашего брокера и учетные данныеip=xx.xx.xx.xxusr="xx"pass="xx"Raw_Read_Error_Rate1=$(smartctl -a /dev/sda -j | jq '.ata_smart_attributes.table[0].raw.value')echo "SMART Raw_Read_Error_Rate диска 1: $Raw_Read_Error_Rate1"Reallocated_Sector_Ct1=$(smartctl -a /dev/sda -j | jq '.ata_smart_attributes.table[3].raw.value')echo "SMART Reallocated_Sector_Ct диска 1: $Reallocated_Sector_Ct1"Seek_Error_Rate1=$(smartctl -a /dev/sda -j | jq '.ata_smart_attributes.table[4].raw.value')echo "SMART Seek_Error_Rate диска 1: $Seek_Error_Rate1"Spin_Retry_Count1=$(smartctl -a /dev/sda -j | jq '.ata_smart_attributes.table[6].raw.value')echo "SMART Spin_Retry_Count диска 1: $Spin_Retry_Count1"Reallocated_Event_Count1=$(smartctl -a /dev/sda -j | jq '.ata_smart_attributes.table[12].raw.value')echo "SMART Reallocated_Event_Count диска 1: $Reallocated_Event_Count1"Offline_Uncorrectable1=$(smartctl -a /dev/sda -j | jq '.ata_smart_attributes.table[14].raw.value')echo "SMART Offline_Uncorrectable диска 1: $Offline_Uncorrectable1"smart_status1=$(smartctl -a /dev/sda -j | jq '.smart_status.passed')echo "Исправность диска 1: $smart_status1"Raw_Read_Error_Rate2=$(smartctl -a /dev/sdb -j | jq '.ata_smart_attributes.table[0].raw.value')echo "SMART Raw_Read_Error_Rate диска 2: $Raw_Read_Error_Rate2"Reallocated_Sector_Ct2=$(smartctl -a /dev/sdb -j | jq '.ata_smart_attributes.table[3].raw.value')echo "SMART Reallocated_Sector_Ct диска 2: $Reallocated_Sector_Ct2"Seek_Error_Rate2=$(smartctl -a /dev/sdb -j | jq '.ata_smart_attributes.table[4].raw.value')echo "SMART Seek_Error_Rate диска 2: $Seek_Error_Rate2"Spin_Retry_Count2=$(smartctl -a /dev/sdb -j | jq '.ata_smart_attributes.table[6].raw.value')echo "SMART Spin_Retry_Count диска 2: $Spin_Retry_Count2"Reallocated_Event_Count2=$(smartctl -a /dev/sdb -j | jq '.ata_smart_attributes.table[12].raw.value')echo "SMART Reallocated_Event_Count диска 2: $Reallocated_Event_Count2"Offline_Uncorrectable2=$(smartctl -a /dev/sdb -j | jq '.ata_smart_attributes.table[14].raw.value')echo "SMART Offline_Uncorrectable диска 2: $Offline_Uncorrectable2"smart_status2=$(smartctl -a /dev/sdb -j | jq '.smart_status.passed')echo "Исправность диска 2: $smart_status2"echo " "echo "Публикация данных"mosquitto_pub -h $ip -t "srv/Raw_Read_Error_Rate1" -m $Raw_Read_Error_Rate1 -u $usr -P $passmosquitto_pub -h $ip -t "srv/Reallocated_Sector_Ct1" -m $Reallocated_Sector_Ct1 -u $usr -P $passmosquitto_pub -h $ip -t "srv/Seek_Error_Rate1" -m $Seek_Error_Rate1 -u $usr -P $passmosquitto_pub -h $ip -t "srv/Spin_Retry_Count1" -m $Spin_Retry_Count1 -u $usr -P $passmosquitto_pub -h $ip -t "srv/Reallocated_Event_Count1" -m $Reallocated_Event_Count1 -u $usr -P $passmosquitto_pub -h $ip -t "srv/Offline_Uncorrectable1" -m $Offline_Uncorrectable1 -u $usr -P $passmosquitto_pub -h $ip -t "srv/Raw_Read_Error_Rate2" -m $Raw_Read_Error_Rate2 -u $usr -P $passmosquitto_pub -h $ip -t "srv/Reallocated_Sector_Ct2" -m $Reallocated_Sector_Ct2 -u $usr -P $passmosquitto_pub -h $ip -t "srv/Seek_Error_Rate2" -m $Seek_Error_Rate2 -u $usr -P $passmosquitto_pub -h $ip -t "srv/Spin_Retry_Count2" -m $Spin_Retry_Count2 -u $usr -P $passmosquitto_pub -h $ip -t "srv/Reallocated_Event_Count2" -m $Reallocated_Event_Count2 -u $usr -P $passmosquitto_pub -h $ip -t "srv/Offline_Uncorrectable2" -m $Offline_Uncorrectable2 -u $usr -P $passmosquitto_pub -h $ip -t "srv/smart_status1" -m $smart_status1 -u $usr -P $passmosquitto_pub -h $ip -t "srv/smart_status2" -m $smart_status2 -u $usr -P $pass
Запускаем, убеждаемся что в логах Mosquitto broker в Home Assistant светятся обращения
Если не светятся, то или неверо заданы параметры подключения, или брокер закрыт для обращения извне, или не знаю.
Настройка в Home Assistant
Ну, почти все. Осталось в конфиге Home Assistant добавить датчики.
Длинный кусок конфига
sensor: - platform: mqtt state_topic: "srv/tempdrive1" name: "Сервер nextcloud температура диска 1" unit_of_measurement: C - platform: mqtt state_topic: "srv/tempdrive2" name: "Сервер nextcloud температура диска 2" unit_of_measurement: C - platform: mqtt state_topic: "srv/tempcpu" name: "Сервер nextcloud температура процессора" unit_of_measurement: C - platform: mqtt state_topic: "srv/fan" name: "Сервер nextcloud частота кулера" unit_of_measurement: ppm - platform: mqtt state_topic: "srv/temp3" name: "Сервер nextcloud температура системы" unit_of_measurement: C - platform: mqtt state_topic: "srv/usedrampercent" name: "Сервер nextcloud использовано RAM" unit_of_measurement: "%" - platform: mqtt state_topic: "srv/usedswappercent" name: "Сервер nextcloud использовано SWAP" unit_of_measurement: "%" - platform: mqtt state_topic: "srv/freesystemdisk" name: "Сервер nextcloud занято места на системном разделе" unit_of_measurement: "%" - platform: mqtt state_topic: "srv/freedatadisk" name: "Сервер nextcloud занято места на разделе данных" unit_of_measurement: "%" - platform: mqtt state_topic: "srv/averageload" name: "Сервер nextcloud средняя загрузка системы" - platform: mqtt state_topic: "srv/uptimedata" name: "Сервер nextcloud аптайм" - platform: mqtt state_topic: "srv/cpuload" name: "Сервер nextcloud текущая загрузка процессора" unit_of_measurement: "%" - platform: mqtt state_topic: "srv/Raw_Read_Error_Rate1" name: "Сервер nextcloud диск 1 SMART Raw_Read_Error_Rate" - platform: mqtt state_topic: "srv/Reallocated_Sector_Ct1" name: "Сервер nextcloud диск 1 SMART Reallocated_Sector_Ct" - platform: mqtt state_topic: "srv/Seek_Error_Rate1" name: "Сервер nextcloud диск 1 SMART Seek_Error_Rate" - platform: mqtt state_topic: "srv/Spin_Retry_Count1" name: "Сервер nextcloud диск 1 SMART Spin_Retry_Count" - platform: mqtt state_topic: "srv/Reallocated_Event_Count1" name: "Сервер nextcloud диск 1 SMART Reallocated_Event_Count" - platform: mqtt state_topic: "srv/Offline_Uncorrectable1" name: "Сервер nextcloud диск 1 SMART Offline_Uncorrectable" - platform: mqtt state_topic: "srv/smart_status1" name: "Сервер nextcloud диск 1 SMART статус" - platform: mqtt state_topic: "srv/Raw_Read_Error_Rate2" name: "Сервер nextcloud диск 2 SMART Raw_Read_Error_Rate" - platform: mqtt state_topic: "srv/Reallocated_Sector_Ct2" name: "Сервер nextcloud диск 2 SMART Reallocated_Sector_Ct" - platform: mqtt state_topic: "srv/Seek_Error_Rate2" name: "Сервер nextcloud диск 2 SMART Seek_Error_Rate" - platform: mqtt state_topic: "srv/Spin_Retry_Count2" name: "Сервер nextcloud диск 2 SMART Spin_Retry_Count" - platform: mqtt state_topic: "srv/Reallocated_Event_Count2" name: "Сервер nextcloud диск 2 SMART Reallocated_Event_Count" - platform: mqtt state_topic: "srv/Offline_Uncorrectable2" name: "Сервер nextcloud диск 2 SMART Offline_Uncorrectable" - platform: mqtt state_topic: "srv/smart_status2" name: "Сервер nextcloud диск 2 SMART статус" - platform: mqtt state_topic: "srv/raid_system_status" name: "Сервер nextcloud RAID статус системного раздела" - platform: mqtt state_topic: "srv/raid_var_status" name: "Сервер nextcloud RAID статус раздела данных"
Перезагружаем, запускаем еще разок скрипты на сервере, чтобы данные опубликовались первый раз, и все! Для красоты можно создать карточку на дашборде. Смысла в ней особенно нет, какие то критические показатели можно вынести на главный дашборд, а остальные использовать только в автоматизациях. Но пусть будет:
Убедившись что все работает, добавляем скрипты в крон. Системные показатели я передаю раз в полчаса, состояние дисков раз в час, а состояние smart раз в сутки.
Приведенное решение - не панацея, для других конфигураций
настройку очевидно надо корректировать на месте. Кроме того, по
аналогии можно интегрировать любой параметр. Получаем нужный
параметр той или иной программой -> приводим его к простому виду
-> передаем через mqtt.
В следующей статье я опишу свой вариант обратной интеграции - когда
linux компьютер выступает в качестве исполнительного элемента для
умного дома, то есть меняет состояние устройств, выводит сообщения,
воспроизводит звуки.
Также для многих будет не очевидна необходимость контролировать состояние сервера на умном доме - имея задачей только рассылку уведомлений проще делать это непосредственно на контролируемом сервере. Хотя некоторые данные хорошо бы хранить исторически, так что смысл все же есть. Кроме того, я интересно и с пользой провел воскресный вечер.
На скриншоте видно, что обсуждаемый сервер запланирован под nextcloud. Его внутренние показатели тоже можно прекрасно добавить в HA, для этого там есть чудесный api. А у HA есть встроенная интеграция.