[HOWTO] Мониторинг UPS через sensorsd в OpenBSD (Касается только USB упсов)

FreeBSD, NetBSD, OpenBSD, DragonFly и т. д.

Модератор: arachnid

Аватара пользователя
kasak
Сообщения: 880
ОС: OpenBSD

[HOWTO] Мониторинг UPS через sensorsd в OpenBSD

Сообщение kasak » 27.09.2016 12:23

Под руку попался довольно популярный упс APC Back-UPS ES 550. Кроме мини сервера в него включён аквариум с рыбками. И хотелось бы знать если выключается свет, чтобы реактивно принять меры по спасению рыбок.
Для этого планировал изначально применить apcupsd однако как оказалось в последних версиях OpenBSD применили новый драйвер upd благодаря которому можно обойтись штатными средствами системы для мониторинга.
Минус заключается в том что нештатными средствами воспользоваться уже будет нельзя. Ну да ладно, для достижения наших планов родного sensorsd вполне хватит.
Первое что нужно сделать это понятное дело включить упс и воткнуть его usb кабелем в нашу прекрасную OpenBSD систему.
смотрим на появившиеся датчики:

Код: Выделить всё

$ sysctl hw.sensors.upd0
hw.sensors.upd0.indicator0=On (BatteryPresent), OK
hw.sensors.upd0.indicator1=Off (Charging), OK
hw.sensors.upd0.indicator2=Off (Discharging), OK
hw.sensors.upd0.indicator3=Off (NeedReplacement), OK
hw.sensors.upd0.indicator4=Off (ShutdownImminent), OK
hw.sensors.upd0.indicator5=On (ACPresent), OK
hw.sensors.upd0.indicator6=Off (Overload), OK
hw.sensors.upd0.percent0=100.00% (RemainingCapacity), OK
hw.sensors.upd0.percent1=100.00% (FullChargeCapacity), OK
hw.sensors.upd0.timedelta0=757.000000 secs (RunTimeToEmpty), OK

Теперь в sensorsd.conf нам нужно настроить поведение сенсоров (обратите внимание на то что некоторые сенсоры "нормально выключены" а некоторые "нормально включены"

/etc/sensorsd.conf:

Код: Выделить всё

hw.sensors.upd0.indicator3:low=1:high=0:command=echo "Need to ReplaceBattery sensor: %2" | mail -s "Sensor %t changed" -r noreply@*** kasak@***
hw.sensors.upd0.indicator4:low=1:high=0:command=echo "Sensor ShutdownImminent changed: %2" | mail -s "Sensor %t changed" -r noreply@*** ***@gmail.com ; halt -p
hw.sensors.upd0.indicator5:low=0:high=1:command=echo "Who turn %2 the lights?"  | mail -s "Sensor %t changed" -r noreply@*** ***@gmail.com
hw.sensors.upd0.indicator6:low=1:high=0:command=echo "Reactor overloaded! Sensor %2" |  mail -s "Sensor %t changed" -r noreply@*** kasak@***

первая строка - третий индикатор need replacement, просто шлём письмо на любой свой ящик (можно и локальный) о необходимости замены батареи
вторая строка - shutdown imminent. Упс посылает сигнал о том что выключение неминуемо и нужно срочно выключается. Шлём письмо на нелокальный ящик и выключаемся.
третья строка - индикатор питания в розетке. в случае выключения он пошлёт сигнал. В случае обратного включения тоже. Отправляем на нелокальный ящик
последняя строка - перегрузка. Письмо можно кинуть на локальный ящик.

Дополнительная информация:
1) По умолчанию сенсорсд проверяет инфомрацию с сенсоров каждые 20 секунд, кроме того чтобы датчик "устоялся" проверка должна пройти три раза, поэтому письмо придётся ждать минуту. На мой взгляд это удобно. Значение в 20 секунд меняется параметром -c
2) К сожалению функционал sensorsd не позволяет делать с упсом ничего кроме мониторинга. Однако же, если говорить конкретно о Back-UPS es 550 как в моём случае, родной powerchute personal обладает даже ещё более скудным функционалом. apcupsd в этом плане более продвинутый. Однако же насколько мне известно Back-UPS сам не особенно что умеет делать. Калибровка батареи в моём случае производится выключением питания и работой от батареи на нагрузку до самого разряда упса. Это изменяет параметр hw.sensors.upd0.timedelta0. Исходя из вышесказанного я сделал для себя вывод что sensorsd обладает вполне достаточным функционалом если используется back-ups. А smart-ups имеет rs232 и для него лучше использовать apcupsd. Не включаете smart-ups через usb, иначе не сможете использовать apcupsd.
3) Применительно к питанию аквариумов либо других потребителей где есть моторчики, лучше искать упсы с чистой синусойдой при работе от батарей, в back-ups аппроксимированная синусойда, моторчики это не любят. Однако питание у меня выключается редко, минуту-две вполне можно пережить и на апроксимированной синусойде. Но это вредно, учтите.

Недостатки:
К сожалению имеют место быть ложные срабатывания при перезапуске sensorsd. Срабатывает датчик indicator5 и кажется ещё indicator6. Если случается перезапуск то придут пару писем. Причина неизвестна.
Значения high и low взяты из переписки одного из разработчиков, прочтённые мной на marc.info. Точнее там было написано что сенсор может выдавать вместо On и Off разные значения даже отрицательные и доподлинно неизвестно какие именно посылает тот или иной ибп, исходя из этого пришлось выдумывать такие настройки на каждый сенсор. Писать в high и low буквенные значения не допускается. Следует понимать что sensorsd использует значения high и low и они оба являются триггером, любое из значений вызовет отсылку письма, что мы и наблюдаем. Странно разве что то что срабатывают только два датчика. К сожалению это недоработка которую в будущем надеюсь исправят. Пока что данный способ отражает вполне рабочий вариант хоть и не без недостатков.
Linux fedora 4.14.11-300.fc27.x86_64 #1 SMP Wed Jan 3 13:52:28 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 262
ОС: OpenBSD

Re: [HOWTO] Мониторинг UPS через sensorsd в OpenBSD

Сообщение nerve » 27.09.2016 13:10

я написал свой скрипт, который проверяет значения из sysctl hw.sensors.upd0 и запускаю его из крона.
потому что танцы с бубном вокруг sensorsd.conf не привели ни к чему толковому.

Код: Выделить всё

#!/bin/sh

if [ -f /tmp/powerout.lock ]; then
exit 0
fi

ACstatus () {
sysctl hw.sensors.upd0.indicator2 | cut -c28-29 | grep -q "On" > /dev/null
}

i=0

if ACstatus ; then
  exit 0
else
  logger -t UPS "AC has been disconnected"
  touch /tmp/powerout.lock
  /usr/local/bin/mutt -s "Power outage in office" -- My@email < /root/powerout
    while [ $i -lt "360" ]
      do
    i=$((i+60))
    sleep 60
      if ACstatus ; then
        logger -t UPS "AC has been connected again after ${i} seconds."
        /usr/local/bin/mutt -s "Power returned in TLI office" --My@email
        rm -rf /tmp/powerout.lock
        exit 0
          else
        if [ "$i" -eq "300" ]; then
          /usr/local/bin/mutt -s "No power for 5 min. System is shutting down now." -- My@email
          shutdown -hp +0
        fi
      fi
      done
fi
Спасибо сказали: