Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Шелезяки —> Даешь 220 в LPT

Мониторим 220 на FreeBSD через LPT

Автор: -ZG-.


Недавняя реализация простой охранной системы через LPT на FreeBSD, дала почву для развития этой темы. По сути это ее продолжение но немного отделенное по смыслу.
В статье описан способ мониторинга наличия напряжения 220 вольт в электросети через LPT порт.

Статья будет полезна тем, у кого есть ПК с LPT портом, UPS без возможности управления с ПК, желающим корректного завершения работы ОС, вырубания соседних машин и уведомления при отсутствии электричества.

Общая схема:



Дано:

UPS без возможности подключения к ПК.
Сервер FreeBSD с LPT портом
Простейшая безопасная схема для подключения 220 к LPT =).
Программа lptmon

Пример работы:

Гдето работает сервер, внезапно пропадает электричество. Cервер и его друзья: конвертер, маршрутизатор, серверы и пр. продолжают работать от UPS.
Cервер, почуяв неладное отправляет об этом смс админу, пишет лог, ждет минуту (вдруг это 5ти секундный сбой) и вырубает другие серверы. Все корректно завершено, данные не утеряны, админ в курсе.
Если электричество появилось, но минута не прошла и сервер не успел вырубиться, он отправляет смс админу что все впорядке и продолжает работать.
Если сервер успел вырубиться, и электричество появилось например через час, то при появлении 220 сервер врубается (через опцию в биосе), загружается, врубает другие сервера через Wake on LAN (прим: настройка Wake on LAN в статье не описывается) и отправляет смс админу о том что все ок.

Инструменты:

FreeBSD + mysql (второе не обязательно, только для лога)
LPT порт
Паяльник, припой, канифоль, провода
Cхема мониторинга 220 (блок питания и оптрон)
программа lptmon

Суть:

У LPT порта есть 5 ног чтения (они же пины) 10,11,12,13 и 15, заметьте 14й тут нет!. Они являются входами и используются принтерами как тумблеры, при событиях например:
кончилась бумага,
принтер занят,
ошибка печати, итд итп.

Они то нам и нужны, к ним можно подключить 5 разных устройств.

Распиновка LPT порта



Под FreeBSD работает программа lptmon которая мониторит эти пины.
Если взять кусок проволоки и замкнуть любой из вышеперечисленных
пинов на землю. (земля - любой с 18 по 25 пин этого же LPT порта) то программа
будет считать что пин включился. Каждый пин, через программу lptmon, может вызывать 3 события при которых можно выполнять комманды или запускать скрипты:
1. Пин включился
2. Пин работает (срабатывает каждую секунду пока пин замкнут)
3. Пин выключился

Собстно lptmon выполняя комманды при событиях от пинов запускает скрипты которые пишут в базу лог срабатывания, текущее состояние устройств подключенных к lpt порту, сохраняет скриншоты с камеры на винт, отправляют смс если нада итд.

План действий

1. Собрать схему, подключить ее к LPT
2. Настроить lptmon
3. Настроить скрипты.

1. Сборка и подключение схемы

Схема


Т.к мы будем подключать 220 к порту, необходимо позаботиться о его безопасности. Для этого нужно использовтаь небольшое напряжение, для чего берем блок питания (я нашел на 5в, 2.5А от конвертера) подключаем его к оптрону через резистор и потом уже к LPT.
Оптрон, грубо говоря, работает по принципу: если есть достаточное напряжение и сила тока на 1 и 2 ногах то он замыкает 5 и 4 ноги. Если силы и напряжения не достаточно (когда БП выключен) то он не замыкает 4 и 5 ноги. А если более чем достаточные (например бп переглючил и он стал давать 120вольт) то оптрон сгарает и это не влияет на 4 и 5 ноги (т.е на вторую цепь).
Поскольку оптрон (4n35) штука защитная, имеющая две цепи не связанные между собой, он еще и призван умирать при силе тока большей чем 60мА ( это 0.06А, а у моего БП аж 2.5А). То есть, силы тока 2.5А более чем достаточно для того чтоб он испугался и умер. По этому, для того чтобы ограничить силу тока используем резистор. В моем случае это 500ом. Резистор подбирается индивидуально под блок питания. Вычислить резистор можно формулой R=U/I где U - напряжение дающее БП (вольты), I - нужная оптрону сила тока (Амперы) для работы. Сила тока нужная оптрону для замыкания второй цепи лежит в пределах от 0 до 60 мА, Допустим решили подавать ему 1мА для чего расчитаем резистор: R=5в/0.01А , R = 500 следовательно нам нужен резистор 500ом. Можно взять и меньше, 400, 300 ом главное чтоб сила тока не получилась больше 60мА.

Для подключения к LPT был разобран старый шнур от принтера. В корпусе от шнура собраны гнездо для подключения БП и оптрон.
Вот что получилось:

Готовый lpt разьем и черный кабель от БП.


Оптрон с резистором, они внутри разъема



2. Настройка lptmon

Создаем директорию /usr/local/etc/lptmon
качаем архив lptmon.tar.gz с программой lptmon и примерами скриптов и распаковываем:
#mkdir /usr/local/etc/lptmon
#cd /usr/local/etc/lptmon
#fetch http://zgbox.ru/files/notes/lptmon.tar.gz
#tar -xzvf lptmon.tar.gz

Зеркало:
файл скачан размер размещён примечание
lptmon+.tar.gz
333 26.3kb 2011-06-29 lptmon, скрипты, исходники

В архиве лежит lptmon.c - это исходники программы, писал я ее сам, это моя первая программа на С++ под FreeBSD как и в прочем первая на C =) так что если есть примечения, дополнения - в студию.
Также там лежит сам уже откомпелированный файл lptmon, можно юзать его, установив chmod 777 lptmon если необходимо, а можно откомпелировать исходники коммандой
#CC lptmon.c -o lptmon_compiled

Директория to_rc.d содержит скрипт lptmon который необходимо скопировать директорию в /usr/local/etc/rc.d/ он нужен для автоматического запуска программы lptmon при старте FreeBSD. Также необходимо в файл /etc/rc.conf прописать lptmon_enable="YES" иначе никакого (авто)запуска он выполнять небудет. Собсно делаем:
#cp to_rc.d/lptmon /usr/local/etc/rc.d/lptmon
#echo lptmon_enable="YES" >> /etc/rc.conf

Теперь программа lptmon будет стартовать с системой, также ее можно стартовать вручную как просто запустив ./lptmon так и выполнив rc.d скрипт /usr/local/etc/rc.d/lptmon start или stop
В запуске нет ничего особенного, просто запускается /usr/local/etc/lptmoon/lptmon а при stop убивается коммандой killall lptmon
Но пока не нужно ничего запускать, сначала нужно настроить конфиг, об этом чуть пожже.
Директория testlpt, в ней лежит программа pr22 и ее исходник для тестирования lpt порта. Работает просто: запускается, получает состояния с 10 по 15 пинов и если какойто пин замкнут на землю то выдает pin10 on
у меня в данный момент 10й пин замкнут на что программа отвечает
#./pr22
pin10 on

Можно смело использовать в своих скриптах
Итак собсно пробуем замнкть один или несколько из 10,11,12,13,15 пинов на землю (на любой с 18 по 25 пин) и запустить ./pr22
Если программа показывает что замкнутые пин(ы) on значит все ок, если нет - то я хз почему не видит ваш lpt порт, ковыряйте исходники %)

Переходим к настройке самого lptmon.
Итак, исходя из того, что у нас будет подключена схема к 12 пину то сконфигурим так чтоб при событиях 12 пина при старте и запуске выполнялись скрипты 12_start, 12_end.

Ложим конфиг lptmon.config из расспакованного архива в /usr/local/etc/lptmon.config и редактируем любимым редактором, у меня это mcedit от mc.
#cp lptmon.config /usr/local/etc/lptmon.config
#mcedit /usr/local/etc/lptmon.config

Это сокращенный, необходимый только для этой статьи конфиг, подробный в архиве.
#конфиг файл lptmon.config программы lptmon
#должн лежать в /usr/local/etc/
#в параметрах допускаются табы и пробелы
#ковычки не допустимы!

#каждый пин может вызывать 3 события (выполнять комманды) при смене состояния:
#1. при переходе из пассивного состояния в активное
#2. при работе в цикле (срабатыват каждый раз при опросе если пин 
# в активном состоянии)
#3. при переходе из активного состояния в пассивное

pin12enable = yes
pin12onstart = /usr/local/etc/lptmon/220v/12_start
pin12oncycle = /usr/local/etc/lptmon/220v/12_cycle
pin12onend = /usr/local/etc/lptmon/220v/12_end


3. Настройка скриптов

листинг 12_start
#!/bin/sh

#скрипт срабатывает когда дали электричество
#или загрузился комп

db_host=localhost
db_pass=
db_user=root
db_name=security
obname=220v

#двумя запросами пишем лог в базу и устанавливаем статус on для устройства 220v

sql="use $db_name; insert into objects_hist (obname,status,dt) values \
('$obname','on',now());"
#echo $sql
/bin/echo $sql | /usr/local/bin/mysql -h$db_host -u$db_user -p$db_pass

sql="use $db_name; update objects set status='on', dtstart=now() \ 
where obname='$obname';"
/bin/echo $sql | /usr/local/bin/mysql -h$db_host -u$db_user -p$db_pass

#отправляем смс админу о том что 220 дали или серв включился

/usr/local/etc/lptmon/sms '220v ON '`date +%m.%d-%H:%M:%S`

листинг 12_end
#!/bin/sh

#срабатывает когда отключилось 220

db_host=localhost
db_pass=
db_user=root
db_name=security
obname=220v

#пишем в базу логи и состояние off устройства 220v

sql="use $db_name; insert into objects_hist (obname,status,dt) values \
 ('$obname','off',now());"
#echo $sql
#/bin/echo $sql | /usr/local/bin/mysql -h$db_host -u$db_user -p$db_pass

sql="use $db_name; update objects set status='off', dtend=now() \ 
where obname='$obname';"
#/bin/echo $sql | /usr/local/bin/mysql -h$db_host -u$db_user -p$db_pass


#отправляем смс о том что нет электричества и ставим таймер на 60 сек
#по завершению которого скрипт 12_cycle вырубит компы

/usr/local/etc/lptmon/sms '220v OFF '`date +%m.%d-%H:%M:%S`
echo 60 > /usr/local/etc/lptmon/220v/timer

Эти скрипты выполняют по два Sql запроса к mysql. Запросы обновляют текущее состояие устройства с именем 220v в таблице objects и пишут лог в таблицу objects_hist. Дамп структуры таблиц dump_security.sql также лежит в архиве.
Помимо этого скрипты отправляют смс.
Скрипт 12_end записывает цифру 60 в файл /usr/local/etc/lptmon/220v/timer для того чтобы потом скрипт 12_cycle который будет срабатывай каждую секунду пока нет электричества, брал эту цифру и отнимал по единице. Когда станет 0 он запустит программу wudown которая вырубит по сети комп с windows (ip 192.168.97.52) и вырубит сервак коммандой shutdown -p now.
листинг 12_cycle
#!/bin/sh

path=/usr/local/etc/lptmon/220v/timer
timer=`cat $path`
timer=`expr $timer - 1`;
if [ $timer -gt 0 ]; then
echo $timer > $path
echo $timer
else
echo "shuttdowning..."
/usr/local/bin/wudown 192.168.97.52 1209 shutdown
shutdown -p now
fi




первоисточник



размещено: 2011-06-29,
последнее обновление: 2011-08-21,
автор: -ZG-


Ытя, 2011-07-08 в 7:21:57

Очередной костыль.
Не вижу смысла в этом. Хотя, если просто поучиться, то может и есть толк.

Artem, 2011-12-17 в 22:18:04

Что делать в ситуации, когда сервак уже выключился, а бесперебойник не успел полностью розрядиться и включилось питание фитча "сервер врубается (через опцию в биосе)" не поможет?

-ZG-, 2011-12-25 в 18:59:22

2Artem такаяже ситуация, как вариант в момент пропажи электричества (или через минуту) скриптом быкапить настройки, вырубать соседние машины, корректно завершать демоны и базы и ждать пока сдохнет упсник и обесточит сервак.
А если вдруг электричество появилось - то запускать остановленное.
у меня так и настроено, только еще смски шлет в момент вырубания 220 и через минуту его отсутствия.

2ZG, 2012-02-29 в 11:07:00

2Artem & -ZG-
Если с ЮПС-ом разговаривать на его языке, то после пропадания напруги ЮПС посылает сигнал компу, комп сам решает на каком моменте издыхания батарей отключаться и шлет об этом сигнал ЮПСу, который запускает отчет давая компу шутдауниться и после этого отключает розетки до тех пор, пока не появится напруга.

Обучить комп общаться с ЮПСом можно этим:
networkupstools.org

-ZG-, 2012-03-01 в 8:45:29

Это конечно все правильно, если упс умеет разговаривать с пк, а если неумеет...

sergoff, 2012-06-25 в 14:42:51

) интересно товарищ выразился насчет силы тока в в оптроне))..

на самом деле сила тока зависит от нагрузки. а так как нагрузка блока питания - обычный светодиод ( вход оптрона) то расчет будет такой: Uвх=5В, Uled=1.5..2.5 В Iled=5..20 ( ток достаточный для работы любого индикаторного светодиода) откуда  Ur=Uвх - Uled= 5-2=3В, а так как Iled=Ir то находим сопротивление R=Ur/Iled =  3/0.005 = 600 Ом )) так что автор угадал



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0498 секунд
Из них PHP: 24%; SQL: 76%; Число SQL-запросов: 83 шт.
У Вас отключено GZIP-сжатие в браузере. Размер страницы 50266