Провайдер плачет.
Но он не смог поступить иначе.
Гремит гроза...»
Гроза! Стихия! Караул! Иной раз тяжело предугадать, какой ущерб она может учинить домашней электронике… Благо, её можно предупредить, тем самым исключив возможность выхода из строя, скажем, хотя бы домашних маршрутизаторов и модемов – обычно они в первую очередь и подвергаются воздействию буйных явлений природы.
За прошедшие лета я похоронил ровным счётом два модема – причиной их гибели послужили резкие перепады в сети электропитания. В этом же году я наконец набрался смелости порвать сей порочный круг и попытаться спасти бедный D-Link от преждевременной погибели!
Наиболее рациональным решением было бы просто изредка поглядывать в оконце и в случае приближения грозы заблаговременно отключать модем от сети электропитания; но как быть, если иной раз приходится оставить дом на продолжительное время, а родные не ведают, что делать, куда нажимать и что переключать в случае наступления грозы?
То-то и оно! Потому мне и подумалось, что будет неплохо соорудить некое подобие EAS (Emergency Alert System) для дома, с пищанием, оповещением по TV и прочими финтифлюшками.
Для начала я набросал две простеньких схемки, по которым можно было бы воплотить в жизнь задуманное. Первая из них – как дoлжно получать текущий код погоды EAS-клиенту; вторая же – что должно быть отображено на экране телевизора.
и
Но, как говорится в одной небезызвестной поговорке, «скоро сказка сказывается, да не скоро дело делается». Думу долгую думал я, как же выводить буду на телевизор оповещение; то и дело откладывал на потом реализацию проекта, но вот «потом» и пришло нежданно-негаданно – в голове спонтанно возникла донельзя простая идея того, как же всё-таки разделаться с этой проблемой.
Решением оказалось превращение Raspberry Pi B+ в EAS-клиент путём запуска браузера epiphany в kiosk-режиме. Браузер цепляется за локальный веб-сервер, который, в свою очередь, возвращает следующий код:
...
<script type="text/javascript">
setInterval('window.location.reload()', 60000);
</script>
...
<?php
if( !is_available( $home_server ) ) {
echo '<center><div class="center"><h1>The EAS server is offline...</h1><center><p>An attempt to reconnect to the server will be performed in 60 seconds</p></center></div></center>';
}
else { echo '<iframe src="http://podivilov.local/api/method/EAS.getCode/" style="position:fixed; top:0px; left:0px; bottom:0px; right:0px; width:100%; height:100%; border:none; margin:0; padding:0; overflow:hidden; z-index:999999;">Iframe does not supported by this browser...</iframe>'; }
?>
...
Таким образом, благодаря простецкому js-скрипту и тегу iframe, мы
Но не будем забегать столь далеко вперёд, давайте же разберёмся, как устроен EAS-клиент изнутри; если быть более точным, как происходит загрузка:
- Старт ОС (raspbian)
- Обращение к скрипту /etc/rc.local
- Инициализация иксов посредством xinit
- Запуск браузера
- Подключение к серверу
- Получение и вывод данных
Скрипт /etc/rc.local отличается от оригинального одной-единственной строкой:
#!/bin/sh -e
## Инициируем загрузку иксов
xinit ./home/eas/eas.boot &
exit 0
А скрипт /home/eas/eas.boot ответственен за запуск браузера:
#!/bin/sh
## Ставим запрет на функционирование DPMS
xset -dpms
## Отключаем экранную заставку
xset s off
## Предотвращаем самопроизвлоьное выключение монитора
xset s noblank
## Запускаем оконный менеджер
matchbox-window-manager -use_titlebar no &
## Скрываем курсор мыши
unclutter -idle 0.01 -root &
## Запускаем браузер в kiosk-режиме на весь экран
WEBKIT_DISABLE_TBS=1 epiphany-browser -a http://podivilov.local/ --profile /home/eas/.config
Наш браузер обращается к домашнему серверу, обозначенному как podivilov.local; тот же, в свою очередь, запрашивает у внешнего сервера данные о погоде, default и extra коды (default – целое число, нуль или единица; нуль – EAS не активирована, единица – активирована; extra – код погоды, полученный с сайта прогноза погоды, требуемый для отладки).
Происходит это следующим образом:
<?php
...
$code_default = file_get_contents('https://***.podivilov.ru/api/method/weather.getCode/?token=*****');
$code_extra = file_get_contents('https://***.podivilov.ru/api/method/weather.getCode.extra/?token=*****');
...
?>
Данные о погоде внешний сервер получает с сайта openweathermap.org:
<?php
...
$json = file_get_contents('http://api.openweathermap.org/data/2.5/weather?lat=**.******&lon=**.******&APPID=*****'); // lat & lon – широта и долгота, а APPID – api-код, который можно получить опосля регистрации на сайте
$data = json_decode($json,true);
$result = substr($data['weather'][0]['icon'], 0, -1);
...
?>
Полученный сервером extra-код обрабатывается, проходя несколько условий, и на выходе мы получаем код, которым уже можно воспользоваться для предотвращения потенциального выгорания модема и прочей бытовой техники.
В зависимости от условий погоды и полученного кода наша система выводит на экран различные наборы цифр: например, если ожидается сильная гроза и следует выключить пробки №1 (маршрутизатор/модем) вкупе с №2 (прочая бытовая техника), а также вручную освободить ADSL-порт на модеме (дабы предотвратить возможное выгорание порта), EAS-система отображает код 12 (пробка №1 и №2).
Помимо этого, каждые полчаса на домашних компьютерах менеджер задач запускает следующий скрипт (оный опрашивает сервер, не ожидается ли гроза; если ответ положителен, запускается программа, предупреждающая о возможном наступлении катаклизма):
dim xHttp: Set xHttp = createobject("MSXML2.ServerXMLHTTP")
xHttp.Open "GET", "https://***.podivilov.ru/api/method/weather.getCode/?token=*****", False
xHttp.setOption 2, 13056
xHttp.Send
If xHttp.responseText = "1" Then
Set objShell = CreateObject("WScript.Shell")
objShell.Run """C:\путь\к\программе\EAS.exe"""
Set objShell = Nothing
Else
WScript.Quit
End If
Но, согласитесь, лучше один раз увидеть, чем тысячу раз услышать. Собственно, пред вами результат того, о чём велось повествование выше:
Вот и сказочке конец, а кто слушал – молодец… Берегите себя и свои модемы!
Спасибо за внимание!
—
Комментарии (23)
Andrusha
01.07.2017 17:37+4Я так понимаю, идея купить ИБП с защитой телефонной и локальной сети не рассматривалась?
Mihip
01.07.2017 20:10+3Увы, домашние финансы покамест не мне принадлежат (17 лет, стабильного заработка нет, учусь), а своими не располагаю на данный момент. Поэтому приходится всячески изгаляться!
А сама идея безусловно хороша. Спасибо!electronus
01.07.2017 21:16+1Найдите на барахолке старый дохлый UPS с защитой тел линии и купите его ради этой защиты. Все-же будет дешевле распберри
Andrusha
02.07.2017 01:17Как сказали выше, можно б/у за копейки взять, самого простого Иппона хватит. Мне вообще бесплатно в своё время достался, дохлая батарея — не проблема, телефонную линию он и так защитит.
skylevels
02.07.2017 13:05Только не надо иппон, да еще самый дешевый! Вы его разбирали хоть раз? Там на телефонных розетках контакты не паспаяны/не разведены. Ищите бу APC.
Markscheider
03.07.2017 16:37Посмотрите также в сторону таких мелких фиговинок…
APC P1-RSGhool
02.07.2017 14:09Была у меня на обслуживании линия с 50 метрами неэкранированной воздушки.
Роутеры и порты на свитчах умирали и при защите apc-шным упсом и при пропуске через специальное устройство грозозащиты.
Забил, поставил оптику — проблема снялась…
aGFicmFoYWJy
01.07.2017 19:08+1Тоже было подобное, только выходил из строя телефонный интерфейс, а LAN была доступна.
Alexey2005
01.07.2017 21:48За что я ненавижу ADSL, так это за редкостную прожорливость модемов. Мало того, что такой модем потребляет минимум 20 Вт, так ещё и греется как кипятильник. На фоне экономной RPi такой модем выглядит кошмарным уродливым монстром, который к тому же быстро выжирает любой аккумулятор.
thealfest
03.07.2017 11:37мой adsl-модем (новый тп-линк) потребляет менее 1 ватта ( 5в, <200мА). Древний zyxel около 5 ватт.
koronabora
01.07.2017 22:36+1Модемы и роутеры теряют свои кишочки и порты из-за разрядов по сигнальному кабелю, а не из-за перепадов в сети электропитания дома.
Решение для ADSL: ибп (можно даже бу с дохлым акб) с грозозащитой модема
Решение для витой пары: что-то типа такого — https://shop.nag.ru/catalog/02557.Elementy-SKS/05627.Grozozaschita-molniezaschita/01743.Nag-APC
Решение для коаксиального кабеля: продаются специальные бочонки грозозащиты. Они обычно уже стоят по дороге к модему.
Решение для оптики: не требуется
plukashov
01.07.2017 23:29Я думаю, система алертов все же не исключает человеческий фактор. Может так оказаться, что никого нет дома, или погодные условия изменятся ночью, и сигнализация всех разбудит.
Почему бы на том же самом распбери не собрать систему аварийного завершения работы и прекращения подачи питания? Пары реле и нехитрой схемы было бы достаточно.Mihip
01.07.2017 23:37Вы правы. Отнюдь, ночью она не сработает, в скрипте выполняется проверка, день сейчас али же ночь. Ночью система молчит.
Может так оказаться, что никого нет дома
Можно отправлять SMS-ки через шлюз sms.ru, там, если мне память не изменяет, до 5 СМС на родной номер бесплатно в день.
Почему бы на том же самом распбери не собрать систему аварийного завершения работы и прекращения подачи питания? Пары реле и нехитрой схемы было бы достаточно.
Не хотелось бы, чтобы с домашним сервером что-нибудь приключилось, ведь нормальной UPS нет, которая могла бы оповещать сервер о том, что «стабильная подача электроэнергии прекращена, пора что-то и предпринять». Да и сервер, который отвечает за прогноз погоды, может вернуть код, не соответствующий действительной погоде за окном и всё обесточится просто так.
Так что человеческий фактор в данном случае даже имеет некоторые преимущества над автоматикой.
xxWolf
02.07.2017 00:07Видел сотни сгоревших от грозы модемов, работа такая, очень редко сгорают от сети, скорее блок питания выходит из строя. Зато вот со стороны телефонного кабеля приходят разряды часто, о чем уже выше писали. ИБП с защитой модема не всегда адекватно работает, были случаи когда вообще линк не поднимался за такой защитой) Если нет грозозащиты, для витой пары имеет смысл использовать б/у свитч, его хватает на 2-3 наведенных разряда:)
CrazyRoot
02.07.2017 13:03Не понял каким образом выводится алерт на ТВ.
Нет, понятно что малина подключена по HDMI к телеку, не понятно каким образом телек переключит HDMI вход.
Т.е. я сижу смотрю телек, начинается гроза, срабатывает оповещение, но телек мне его не покажет, поскольку в качестве источника сигнала, выбран антенный вход, а не HDMI от малины.
Mihip
02.07.2017 13:04Всё правильно. Здесь нет автоматики. Человек слышит сигнал тревоги, включает телевизор и, если заранее не было сделано, переключает на HDMI.
electronus
Модель модема в студию. Если уверены в том что это было только по питанию, то проще было бы поставить суппрессор возле блока питания модема. Но мне кажется, что занос высокого был по телефонной линии, а «выход» через потрошки модема по питанию. Тогда выключение пробок не спасёт. Ноль останется. В подтверждение моей теории может стать тот факт, что выгорал только модем, а не вся бытовая электроника?
Mihip
Точно не скажу, но последним пострадавшим был ZyXEL. Да, Ваша теория действительно больше походит на правду, так как вместе с модемом сгорела сетевая карта на одном из ПК.
Внёс поправки в текст статьи, забыл упомянуть, что помимо отображаемого EAS кода также дана расшифровка всех кодов: