«Модем горит,
Провайдер плачет.
Но он не смог поступить иначе.
Гремит гроза...»


Гроза! Стихия! Караул! Иной раз тяжело предугадать, какой ущерб она может учинить домашней электронике… Благо, её можно предупредить, тем самым исключив возможность выхода из строя, скажем, хотя бы домашних маршрутизаторов и модемов – обычно они в первую очередь и подвергаются воздействию буйных явлений природы.



За прошедшие лета я похоронил ровным счётом два модема – причиной их гибели послужили резкие перепады в сети электропитания. В этом же году я наконец набрался смелости порвать сей порочный круг и попытаться спасти бедный 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, мы создали костыль и обременили себя лишними проблемами облегчили себе жизнь; ведь ежели домашний сервер окажется недоступным вследствие того, что его отключили перед грозой, браузер не выдаст стандартную ошибку, мол, «увы и ах, доступа к сети больше нет» (и будет долго-долго ждать, пока кто-нибудь не соблаговолит мышкой ткнуть в кнопку «обновить страницу»), а просто продолжит ежеминутно обновлять страницу и пытаться подгрузить содержимое iframe.



Но не будем забегать столь далеко вперёд, давайте же разберёмся, как устроен EAS-клиент изнутри; если быть более точным, как происходит загрузка:

  1. Старт ОС (raspbian)
  2. Обращение к скрипту /etc/rc.local
  3. Инициализация иксов посредством xinit
  4. Запуск браузера
  5. Подключение к серверу
  6. Получение и вывод данных

Скрипт /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

Но, согласитесь, лучше один раз увидеть, чем тысячу раз услышать. Собственно, пред вами результат того, о чём велось повествование выше:


Вот и сказочке конец, а кто слушал – молодец… Берегите себя и свои модемы!

Спасибо за внимание!

UPD1. Система EAS в действии

Поделиться с друзьями
-->

Комментарии (23)


  1. electronus
    01.07.2017 17:12
    +2

    Модель модема в студию. Если уверены в том что это было только по питанию, то проще было бы поставить суппрессор возле блока питания модема. Но мне кажется, что занос высокого был по телефонной линии, а «выход» через потрошки модема по питанию. Тогда выключение пробок не спасёт. Ноль останется. В подтверждение моей теории может стать тот факт, что выгорал только модем, а не вся бытовая электроника?


    1. Mihip
      01.07.2017 20:17

      Точно не скажу, но последним пострадавшим был ZyXEL. Да, Ваша теория действительно больше походит на правду, так как вместе с модемом сгорела сетевая карта на одном из ПК.

      Внёс поправки в текст статьи, забыл упомянуть, что помимо отображаемого EAS кода также дана расшифровка всех кодов:


  1. Andrusha
    01.07.2017 17:37
    +4

    Я так понимаю, идея купить ИБП с защитой телефонной и локальной сети не рассматривалась?


    1. Mihip
      01.07.2017 20:10
      +3

      Увы, домашние финансы покамест не мне принадлежат (17 лет, стабильного заработка нет, учусь), а своими не располагаю на данный момент. Поэтому приходится всячески изгаляться!

      А сама идея безусловно хороша. Спасибо!


      1. electronus
        01.07.2017 21:16
        +1

        Найдите на барахолке старый дохлый UPS с защитой тел линии и купите его ради этой защиты. Все-же будет дешевле распберри


      1. Andrusha
        02.07.2017 01:17

        Как сказали выше, можно б/у за копейки взять, самого простого Иппона хватит. Мне вообще бесплатно в своё время достался, дохлая батарея — не проблема, телефонную линию он и так защитит.


        1. skylevels
          02.07.2017 13:05

          Только не надо иппон, да еще самый дешевый! Вы его разбирали хоть раз? Там на телефонных розетках контакты не паспаяны/не разведены. Ищите бу APC.


      1. Markscheider
        03.07.2017 16:37

        Посмотрите также в сторону таких мелких фиговинок…

        APC P1-RS
        image


    1. serg_p
      01.07.2017 21:18

      да просто купить ибп ????


    1. Ghool
      02.07.2017 14:09

      Была у меня на обслуживании линия с 50 метрами неэкранированной воздушки.
      Роутеры и порты на свитчах умирали и при защите apc-шным упсом и при пропуске через специальное устройство грозозащиты.

      Забил, поставил оптику — проблема снялась…


  1. aGFicmFoYWJy
    01.07.2017 19:08
    +1

    Тоже было подобное, только выходил из строя телефонный интерфейс, а LAN была доступна.


  1. Alexey2005
    01.07.2017 21:48

    За что я ненавижу ADSL, так это за редкостную прожорливость модемов. Мало того, что такой модем потребляет минимум 20 Вт, так ещё и греется как кипятильник. На фоне экономной RPi такой модем выглядит кошмарным уродливым монстром, который к тому же быстро выжирает любой аккумулятор.


    1. electronus
      01.07.2017 22:11

      Аналогично и кабельные модемы. 1А по 12В легко.


    1. thealfest
      03.07.2017 11:37

      мой adsl-модем (новый тп-линк) потребляет менее 1 ватта ( 5в, <200мА). Древний zyxel около 5 ватт.


  1. koronabora
    01.07.2017 22:36
    +1

    Модемы и роутеры теряют свои кишочки и порты из-за разрядов по сигнальному кабелю, а не из-за перепадов в сети электропитания дома.

    Решение для ADSL: ибп (можно даже бу с дохлым акб) с грозозащитой модема
    Решение для витой пары: что-то типа такого — https://shop.nag.ru/catalog/02557.Elementy-SKS/05627.Grozozaschita-molniezaschita/01743.Nag-APC
    Решение для коаксиального кабеля: продаются специальные бочонки грозозащиты. Они обычно уже стоят по дороге к модему.
    Решение для оптики: не требуется


    1. Mihip
      01.07.2017 22:37
      +1

      Отсюда мораль: как можно скорее переходить на оптику.


  1. plukashov
    01.07.2017 23:29

    Я думаю, система алертов все же не исключает человеческий фактор. Может так оказаться, что никого нет дома, или погодные условия изменятся ночью, и сигнализация всех разбудит.
    Почему бы на том же самом распбери не собрать систему аварийного завершения работы и прекращения подачи питания? Пары реле и нехитрой схемы было бы достаточно.


    1. Mihip
      01.07.2017 23:37

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

      Может так оказаться, что никого нет дома

      Можно отправлять SMS-ки через шлюз sms.ru, там, если мне память не изменяет, до 5 СМС на родной номер бесплатно в день.

      Почему бы на том же самом распбери не собрать систему аварийного завершения работы и прекращения подачи питания? Пары реле и нехитрой схемы было бы достаточно.

      Не хотелось бы, чтобы с домашним сервером что-нибудь приключилось, ведь нормальной UPS нет, которая могла бы оповещать сервер о том, что «стабильная подача электроэнергии прекращена, пора что-то и предпринять». Да и сервер, который отвечает за прогноз погоды, может вернуть код, не соответствующий действительной погоде за окном и всё обесточится просто так.

      Так что человеческий фактор в данном случае даже имеет некоторые преимущества над автоматикой.


      1. zerg59
        02.07.2017 11:26
        +2

        Можно на малинке поднять nut сервер и она будет изображать из себя ups http://wynandbooysen.com/raspberry-pi-ups-server-using-nut.html


        1. Mihip
          02.07.2017 13:05

          Здорово! Премного благодарен!


  1. xxWolf
    02.07.2017 00:07

    Видел сотни сгоревших от грозы модемов, работа такая, очень редко сгорают от сети, скорее блок питания выходит из строя. Зато вот со стороны телефонного кабеля приходят разряды часто, о чем уже выше писали. ИБП с защитой модема не всегда адекватно работает, были случаи когда вообще линк не поднимался за такой защитой) Если нет грозозащиты, для витой пары имеет смысл использовать б/у свитч, его хватает на 2-3 наведенных разряда:)


  1. CrazyRoot
    02.07.2017 13:03

    Не понял каким образом выводится алерт на ТВ.
    Нет, понятно что малина подключена по HDMI к телеку, не понятно каким образом телек переключит HDMI вход.
    Т.е. я сижу смотрю телек, начинается гроза, срабатывает оповещение, но телек мне его не покажет, поскольку в качестве источника сигнала, выбран антенный вход, а не HDMI от малины.


    1. Mihip
      02.07.2017 13:04

      Всё правильно. Здесь нет автоматики. Человек слышит сигнал тревоги, включает телевизор и, если заранее не было сделано, переключает на HDMI.