Интеграция ИБП в систему MajorDoMo через NUT (Linux)

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

electric
Сообщения: 309
Зарегистрирован: Вт сен 17, 2013 10:11 pm
Благодарил (а): 3 раза
Поблагодарили: 56 раз

Интеграция ИБП в систему MajorDoMo через NUT (Linux)

Сообщение electric » Чт май 29, 2014 10:20 pm

Доброго времени суток всем домашним автоматчикам...
Решил поделиться своей небольшой заготовкой для будущего умного дома.
Я считаю что любая система автоматического управления, тем более умная, должна иметь надежное питание, поэтому каждый инженер решает задачу, каким образом осуществить гарантированное питание своего детища. Есть многие способы решения, но в любом случае в системе присутствует аккумуляторная батарея. Ввиду того, что я оказался счастливым обладателем ИБП типа Ippon Back Power Pro 600VA, еще в старом (белом) корпусе, решил его применить. Забегая немного вперед, отмечу, что изначально хотел использовать Powercom IMP-425AP, но его не получилось привязать...
Итак, в качестве сервера у меня трудится/пыжится Raspberry Pi на Debian Wheezy (Raspbian) с установленными пакетами PHP5, Apache, MySQL и пр. Более подробно установка хорошо описана на сайте и форуме. Пока из периферии работают различные ардуины с Ethernet-шилдами. Планы конечно грандиозные, но сейчас более конкретно.
Сам ИБП у меня подключен не напрямую, через вводной автомат с доп. контактами и реле на два перекидных контакта (см. схему) в качестве сервисного байпаса, чтобы можно было безболезненно ИБП вывести в ремонт.
Изображение
Мой бесперебойник имеет на борту порт RS-232 и USB для интеграции. ИМХО, схема интеграции в систему MDM должна быть примерно такая:
Изображение
--------
Моя идея мониторинга ИБП такова: в MDM можно в классе systemStates создать объект UPS с сопутствующим классу свойством - условный цвет системы питания.
Зеленый - питание в норме, связь с ИБП есть.
Желтый - отсутствует внешнее питание, система работает от АКБ
Красный - отсутствует внешнее питание, система работает от разряженной АКБ
Серый - нет связи с ИБП.
Соответственно рядом с иконками системы, коммуникаций и защиты расположить меняющую цвет иконку ИБП.
Дополнение 1. Можно извлекать дополнительные данные, например, напряжение на входе в ИБП, на выходе, емкость АКБ, температуру и пр.
Дополнение 2. В будущем попробую реализовать управление ИБП через shell-скрипт, например, отключать пищалку ночью, запускать тестирование АКБ и пр.
Дополнение 3. С корректным shutdown пока не разобрался, мой ИБПшник что то мудрит, работает как ему вздумается))
--------
Условно реализацию можно разделить на этапы.
1. Установка ПО на сервер для обмена данными с ИБП по цифровому интерфейсу USB. Передача информации о состоянии ИБП и управляющих команд.
Неглубокий поиск на просторах всемирной паутины привел меня к универсальному решению для интеграции практически любого ИБП в Linux-систему - программный продукт Network UPS Tools или коротко - NUT. Его используют даже в коммерческих системах - т.е. это ПО довольно надежное. Теперь смотрим как обстоят дела с поддержкой моего ИБП Ippon Back Power Pro 600VA, для этого переходим по ссылке compatible UPS, выбираем нашу модель ИБП и видим, что подключение по USB необходимо осуществлять с помощью универсальных драйверов blazer_usb.
Используя опыт других пользователей в инете и ознакомившись с документацией, получилась следующая схемка:
Изображение
Не буду подробно описывать установку, подобных манов полно в интернете, приведу лишь тексты файлов конфигураций:
nut.conf

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

MODE=standalone
ups.conf

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

[ippon-600]
    driver = blazer_usb
    port = auto
    desc = "Ippon Back Power Pro 600"
    default.battery.voltage.high = 13.60
    default.battery.voltage.low = 10.60
upsd.conf

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

LISTEN 127.0.0.1 3493
upsd.users

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

[admin]
password = admin123
actions = SET
instcmds = ALL
[monmaster]
password = master123
upsmon master
[monslave]
password = slave123
upsmon slave
upsmon.conf

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

#ippon-600 - название ИБПшника из файла ups.conf
#monmaster master123 - имя пользователя и пароль из файла upsd.users
MONITOR ippon-600@localhost 1 monmaster master123 master
MINSUPPLIES 1
SHUTDOWNCMD "sudo halt -t now" #комадна выключения сервера
NOTIFYCMD "/var/lib/nut/nutalert" #при изменении состояния ИБП выполнить этот скрипт
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 100
POWERDOWNFLAG /var/lib/nut/killpower
#эти сообщения будут записываться в лог-файл и передаваться в скрипт NOTIFYCMD
NOTIFYMSG ONLINE    "UPS on line power" #"UPS %s on line power"
NOTIFYMSG ONBATT    "UPS on battery power" #"UPS %s on battery"
NOTIFYMSG LOWBATT    "UPS battery low" #"UPS %s battery is low"
NOTIFYMSG FSD        "UPS %s: forced shutdown in progress"
NOTIFYMSG COMMOK    "UPS commok" #"Communications with UPS %s established"
NOTIFYMSG COMMBAD    "UPS commbad" #"Communications with UPS %s lost"
NOTIFYMSG SHUTDOWN    "Auto logout and shutdown proceeding"
NOTIFYMSG REPLBATT    "UPS %s battery needs to be replaced"
NOTIFYMSG NOCOMM    "UPS nocomm" #"UPS %s is unavailable"
NOTIFYMSG NOPARENT    "upsmon parent process died - shutdown impossible"
#какие предпринять действия при изменении состояния ИБП.
#syslog - запись в системный лог, exec - выполнение скрипта из секции NOTIFYCMD
NOTIFYFLAG ONLINE    SYSLOG+EXEC
NOTIFYFLAG ONBATT    SYSLOG+EXEC
NOTIFYFLAG LOWBATT    SYSLOG+EXEC
NOTIFYFLAG FSD        SYSLOG+WALL
NOTIFYFLAG COMMOK    SYSLOG+EXEC
NOTIFYFLAG COMMBAD    SYSLOG+EXEC
NOTIFYFLAG SHUTDOWN    SYSLOG+WALL
NOTIFYFLAG REPLBATT    SYSLOG+WALL
NOTIFYFLAG NOCOMM    SYSLOG+EXEC
NOTIFYFLAG NOPARENT    SYSLOG+WALL
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5
2. Передача данных от демона UPSMON в систему Majordomo.
Для оперативной передачи состояния ИБПшника в МДМ, я написал shell-скрипт, который вызывается демоном UPSMON с передачей ему сообщения (непосредственно сообщение и несет смысловую нагрузку состояния ИБП). Текст скрипта:

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

#!/bin/bash
case "$1" in
"UPS on line power") curl "http://127.0.0.1/objects/?object=UPS&op=m&m=checkInputState&stateColor=green" ;;
"UPS on battery power") curl "http://127.0.0.1/objects/?object=UPS&op=m&m=checkInputState&stateColor=yellow" ;;
"UPS battery low") curl "http://127.0.0.1/objects/?object=UPS&op=m&m=checkInputState&stateColor=red" ;;
"UPS commbad") curl "http://127.0.0.1/objects/?object=UPS&op=m&m=checkInputState&stateColor=grey" ;;
"UPS nocomm") curl "http://127.0.0.1/objects/?object=UPS&op=m&m=checkInputState&stateColor=grey" ;;
"UPS commok")
    STATEUPS=`upsc ippon-600@localhost ups.status`
    case "$STATEUPS" in
        "OL") curl "http://127.0.0.1/objects/?object=UPS&op=m&m=checkInputState&stateColor=green" ;;
        "OB") curl "http://127.0.0.1/objects/?object=UPS&op=m&m=checkInputState&stateColor=yellow" ;;
        "LB") curl "http://127.0.0.1/objects/?object=UPS&op=m&m=checkInputState&stateColor=red" ;;
        *) curl "http://127.0.0.1/objects/?object=UPS&op=m&m=checkInputState&stateColor=green" ;;
    esac
    ;;
*) curl "http://127.0.0.1/objects/?object=UPS&op=m&m=checkInputState&stateColor=green" ;;
esac
exit 0
Здесь у меня получилась первая загвоздка. Если по какой то причине связь с ИБП теряется, по моей задумке цвет система меняет на серый с сообщением типа "Нет связи с ИБП".
Но возникает вопрос, если связь с ИБП восстановилась - как узнать, в каком он состоянии сейчас? В программном пакете есть набор команд "upsc". Если в консоли набрать команду "upsc [вашИБП]@localhost", в окне появится информация о бесперебойнике. Можно уточнить запрос дописав интересующее свойство, например "ups.status" или "ups.input.voltage" и пр., в ответ будет состояние именно этого свойства. Соответственно после восстановления связи я отсылаю запрос на текущее состояние ИБП. Ну строка "http://127.0.0.1/objects/?object=UPS&op ... olor=green" думаю многим знакома, тут расписывать нечего. Вызываем метод "checkInputState" объекта "UPS" с передачей ему параметра "stateColor" в состоянии "green".
3. Прием и обработка данных в Majordomo.
Как писал выше, я создал новый объект "UPS" в классе "systemStates". Вместо стандартного метода "checkState", который вызывается автоматически, создал новый "checkInputState" чтобы его можно было вызывать вручную. Метод типа php-скрипт:

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

$details=array();
$t=$params['stateColor'];
$red_state=0;
$yellow_state=0;
$grey_state=0;

if ($t == "red") {
 $red_state=1;
 $details[]="Батарея ИБП разряжена";
}
if ($t == "yellow") {
 $yellow_state=1;
 $details[]="Работа от аккумуляторов ИБП";
}
if ($t == "grey") {
 $grey_state=1;
 $details[]="Нет связи с ИБП";
}

if ($red_state) {
 $state='red';
 $state_title='Красный'; 
} elseif ($yellow_state) {
 $state='yellow';
 $state_title='Жёлтый';
} elseif ($grey_state) {
 $state='grey';
 $state_title='Серый';
} else {
 $state='green';
 $state_title='Зелёный';   
}

$this->setProperty('stateDetails',implode(". ",$details));

if ($this->getProperty('stateColor')!=$state) {
 $this->setProperty('stateColor',$state);
 $this->setProperty('stateTitle',$state_title);
 if ($state!='green') {
  say("Уровень системы питания изменился на ".$state_title.".");
  say(implode(". ",$details));
 } else {
  say("Уровень системы питания восстановлен на ".$state_title);
 }
 $this->callMethod('stateChanged');
}
 
В меню, где отображаются иконки состояния системы добавил еще одну <img src="/img/icons/status/ups_%UPS.stateColor%.png" align="absmiddle">.
Саму иконку скачал в инете, подрисовал в фотошопе, если кому надо, могу выложить...
И вот тут всплыл еще один косяк. После полной перезагрузки малинки или при первом включении система почему то не отрабатывала переход от цвета серого (драйвер видимо не успевал стартовать) к цвету зеленому (все ОК). Поэтому пришлось запускать раз в минуту еще один скрипт. Данный сценарий "SystemInfo_UPS" прописал в методе "onNewMinute" и вызываю раз в минуту. Смысл - так сказать еще раз удостовериться, в каком состоянии ИБП на данный момент.

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

//Скрипт проверки состояния ИБП.
//Если вдруг upsmon не смог передать изменение состояния в MDM.
$UPS_state=exec("upsc ippon-600@localhost ups.status");
//$UPS_state="LB";
switch ($UPS_state) {
case "OL":callMethod("UPS.checkInputState",array("stateColor"=>"green"));break;
case "OL TRIM":callMethod("UPS.checkInputState",array("stateColor"=>"green"));break;
case "OB":callMethod("UPS.checkInputState",array("stateColor"=>"yellow"));break;
case "LB":callMethod("UPS.checkInputState",array("stateColor"=>"red"));break;
//default:
//    callMethod("UPS.checkInputState",array("stateColor"=>"green"));
};
В итоге получилось как то так:
Изображение
P.S. Согласен, что получилось слишком мудрено и сложно, можно было просто в методе "checkState" объекта "UPS", который вызывает автоматически, получить строку командой типа "$UPS=exec("upsc ippon-600@localhost");" и потом парсить её как душе угодно. Но мне хочется разобраться как работает демон UPSMON, ведь с его помощью можно корректно завершать работу не только малинки, но и других потребителей питания от этого ИБПшника - благо клиентов для NUT достаточно, даже для винды есть.
За это сообщение автора electric поблагодарили (всего 10):
Anton_kulibin (Вт окт 07, 2014 7:18 pm) • pdmitry2 (Ср окт 08, 2014 3:32 am) • sergejey (Ср окт 08, 2014 11:16 am) • dmw (Вт дек 09, 2014 3:26 pm) • Ivan (Чт янв 01, 2015 4:13 pm) • MiDash (Ср фев 18, 2015 1:04 pm) • Vittaly (Ср мар 04, 2015 10:34 am) • ErmolenkoM (Вт ноя 03, 2015 1:13 pm) • djleon (Пн фев 06, 2017 9:33 pm) • Hardwarest (Пн мар 18, 2019 1:59 am)
Рейтинг: 11.63%
Было: Majordomo v.0.6.0.b на Cubietruck. OS Armbian с переносом на HDD
Стало: ioBroker на Cubietruck OS Armbian + ZigBee Xiaomi + OWFS + BLE.
DiArt
Сообщения: 210
Зарегистрирован: Пт апр 12, 2013 2:27 pm
Откуда: Уфа
Благодарил (а): 28 раз
Поблагодарили: 16 раз

Re: Интеграция ИБП в систему MajorDoMo через NUT (Linux)

Сообщение DiArt » Пт май 30, 2014 12:18 pm

Супер! у меня как раз вроде такой же ИБП. на выходных надо будет обязательно попробовать. Тоже малинка.
сразу вопрос. подключен ИБП к малинке через USB-разветвитель? у емня просто 4-х портовый USB-хаб пассивный. К нему подключен внешний винт 2,5 ан 320 гигов. Система висит на нём. Также был подключен WI-FI свисток. Но показалось что по кабелю более стабильно. Иногда подключаю клаву, мышь. пока питания на всё хватает. Вытащит ли ещё и ИБП-шник вот думаю....
Система на Неттоп 3Q Nettop Qoo!
(Intel Celeron J1800, 2x2410 МГц, 4096 Мб, HDD 1000 Гб, HDMI, VGA , Wi-Fi, Ethernet, Ubuntu 14.04.2)
Вторая система на Raspberry Pi 3.
D-Link DCS-930L/Broadlink RM2-Pro/BroadLink SP3 CC/Ginzzu HS-K07W
Я в CONNECT
electric
Сообщения: 309
Зарегистрирован: Вт сен 17, 2013 10:11 pm
Благодарил (а): 3 раза
Поблагодарили: 56 раз

Re: Интеграция ИБП в систему MajorDoMo через NUT (Linux)

Сообщение electric » Пт май 30, 2014 12:49 pm

DiArt писал(а):сразу вопрос. подключен ИБП к малинке через USB-разветвитель?
Нет, подключен по USB напрямую в малинку, у меня пока мало периферии.
DiArt писал(а):у емня просто 4-х портовый USB-хаб пассивный. К нему подключен внешний винт 2,5 ан 320 гигов. Система висит на нём. Также был подключен WI-FI свисток. Но показалось что по кабелю более стабильно. Иногда подключаю клаву, мышь. пока питания на всё хватает. Вытащит ли ещё и ИБП-шник вот думаю....
Да ладно... Чо, прям винт внешний 2,5 по USB работает без внешнего питания? Еще свистки вай-фай???
Фото в студию всего этого...
Было: Majordomo v.0.6.0.b на Cubietruck. OS Armbian с переносом на HDD
Стало: ioBroker на Cubietruck OS Armbian + ZigBee Xiaomi + OWFS + BLE.
DiArt
Сообщения: 210
Зарегистрирован: Пт апр 12, 2013 2:27 pm
Откуда: Уфа
Благодарил (а): 28 раз
Поблагодарили: 16 раз

Re: Интеграция ИБП в систему MajorDoMo через NUT (Linux)

Сообщение DiArt » Пт май 30, 2014 2:13 pm

electric писал(а):[
Да ладно... Чо, прям винт внешний 2,5 по USB работает без внешнего питания? Еще свистки вай-фай???
Фото в студию всего этого...
Либо вечером, либо завтра выложу.
У меня питание 2A microUSB которое питает малинку. Там ещё есть вход для питания USB. Так вот у меня провод на винте 2 USB-порта. Один вход в хаб, второй в зарядку. И все работает.
Система на Неттоп 3Q Nettop Qoo!
(Intel Celeron J1800, 2x2410 МГц, 4096 Мб, HDD 1000 Гб, HDMI, VGA , Wi-Fi, Ethernet, Ubuntu 14.04.2)
Вторая система на Raspberry Pi 3.
D-Link DCS-930L/Broadlink RM2-Pro/BroadLink SP3 CC/Ginzzu HS-K07W
Я в CONNECT
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: Интеграция ИБП в систему MajorDoMo через NUT (Linux)

Сообщение Ivan » Пт май 30, 2014 4:48 pm

У меня малинка с пасивным хабом умирала на 3G модеме.
Поставил активный, тоже умирало. Пока не поставил заведомо хороший ИП. К сожалению на блоках питания пишут что хотят. Проблема в том что схемотехника у них дешовая. И если он в холостую выдаёт 5,6 то под нагрузкой часто проваливается до 4,2
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
DiArt
Сообщения: 210
Зарегистрирован: Пт апр 12, 2013 2:27 pm
Откуда: Уфа
Благодарил (а): 28 раз
Поблагодарили: 16 раз

Re: Интеграция ИБП в систему MajorDoMo через NUT (Linux)

Сообщение DiArt » Пн июн 02, 2014 9:01 am

Все получилось. Выложи плиз пак иконок.
Система на Неттоп 3Q Nettop Qoo!
(Intel Celeron J1800, 2x2410 МГц, 4096 Мб, HDD 1000 Гб, HDMI, VGA , Wi-Fi, Ethernet, Ubuntu 14.04.2)
Вторая система на Raspberry Pi 3.
D-Link DCS-930L/Broadlink RM2-Pro/BroadLink SP3 CC/Ginzzu HS-K07W
Я в CONNECT
electric
Сообщения: 309
Зарегистрирован: Вт сен 17, 2013 10:11 pm
Благодарил (а): 3 раза
Поблагодарили: 56 раз

Re: Интеграция ИБП в систему MajorDoMo через NUT (Linux)

Сообщение electric » Пн июн 02, 2014 6:57 pm

DiArt писал(а):Все получилось. Выложи плиз пак иконок.
Прикрепил архив.
Там иконки, текст скрипта и пару картинок...
Вложения
MajorDoMo_NUT_monitorUPS.7z
(159.21 КБ) 402 скачивания
Было: Majordomo v.0.6.0.b на Cubietruck. OS Armbian с переносом на HDD
Стало: ioBroker на Cubietruck OS Armbian + ZigBee Xiaomi + OWFS + BLE.
DiArt
Сообщения: 210
Зарегистрирован: Пт апр 12, 2013 2:27 pm
Откуда: Уфа
Благодарил (а): 28 раз
Поблагодарили: 16 раз

Re: Интеграция ИБП в систему MajorDoMo через NUT (Linux)

Сообщение DiArt » Ср июн 04, 2014 7:23 am

Благодарю
Система на Неттоп 3Q Nettop Qoo!
(Intel Celeron J1800, 2x2410 МГц, 4096 Мб, HDD 1000 Гб, HDMI, VGA , Wi-Fi, Ethernet, Ubuntu 14.04.2)
Вторая система на Raspberry Pi 3.
D-Link DCS-930L/Broadlink RM2-Pro/BroadLink SP3 CC/Ginzzu HS-K07W
Я в CONNECT
Anton_kulibin
Сообщения: 354
Зарегистрирован: Вт окт 09, 2012 8:05 am
Откуда: Луза Кировская обл. Россия
Благодарил (а): 20 раз
Поблагодарили: 34 раза

Re: Интеграция ИБП в систему MajorDoMo через NUT (Linux)

Сообщение Anton_kulibin » Вт окт 07, 2014 7:17 pm

Благодарю за инструкцию все получилось. NUT у меня давно был настроил, но внедрить в МДМ руки не доходили.
Linux версия. Ubuntu Server 16.04+2xArduinoMega+Eth_GW_Mysensors_10node+WeatherStation+Xiaomi
CONNECT
zelevova
Сообщения: 291
Зарегистрирован: Вт ноя 18, 2014 11:43 pm
Откуда: Краснодарский край
Благодарил (а): 32 раза
Поблагодарили: 68 раз

Re: Интеграция ИБП в систему MajorDoMo через NUT (Linux)

Сообщение zelevova » Пт дек 05, 2014 10:01 am

Спасибо большое! Все как по часам.
После полной перезагрузки малинки или при первом включении система почему то не отрабатывала переход от цвета серого
Скорее всего не успевает стартовать Majordomo. Нужно прописать что бы нут_мон стартовал после запуска скуля и апача. В скрипте запуска зависимости проставить. Тогда не надо будет каждую минуту его дергать.

Для себя сделал скрипт для получения информации от бесперибойника "nut.php":

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

<?php
if(isset($_GET['ups']) && isset($_GET['parm']))
{
        $value = exec("/usr/local/bin/upsc ".$_GET['ups']."@127.0.0.1 ".$_GET['parm']);
        $parent = "/".$_GET['parm'].": /";
        $value = preg_replace($parent, "", $value);
        echo $value;
}
?>
положил его в корень апача на компьютере где бесперибойник и обращаюсь к нему "http://ups.home.lan/nut.php?ups=myups&p ... ut.voltage". В ответ получаю входящее напряжение на ИБП. Получаем некий вольтметр в сети, полезно когда частые проблемы с напряжение.
Так можно запросить любой параметр который выводит команда upsc.
За это сообщение автора zelevova поблагодарил:
MiDash (Пт дек 04, 2015 8:34 pm)
Рейтинг: 1.16%
Majordomo (GitHub) на cubietruck + MegaD + 1-wire
CONNECT: http://connect.smartliving.ru/profile/311
Ответить