«Ты, гроза, грозись, а мы друг за друга держись!» — сказ о том, как я ADSL-модем спасал

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

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



За прошедшие лета я похоронил ровным счётом два модема – причиной их гибели послужили резкие перепады в сети электропитания. В этом же году я наконец набрался смелости порвать сей порочный круг и попытаться спасти бедный D-Link от преждевременной погибели!

Наиболее рациональным решением было бы просто изредка поглядывать в оконце и в случае приближения грозы заблаговременно отключать модем от сети электропитания; но как быть, если иной раз приходится оставить дом на продолжительное время, а родные не ведают, что делать, куда нажимать и что переключать в случае наступления грозы?

То-то и оно! Потому мне и подумалось, что будет неплохо соорудить некое подобие EAS (Emergency Alert System) для дома, с пищанием, оповещением по TV и прочими финтифлюшками.

Для начала я набросал две простеньких схемки, по которым можно было бы воплотить в жизнь задуманное. Первая из них – как дóлжно получать текущий код погоды 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

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

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

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

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

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

              0
              Посмотрите также в сторону таких мелких фиговинок…
              APC P1-RS
              image

              Если здешние гуры скажут, что оно поможет от грозы и прохода высокого по телефонной линии — готов безвозмездно передать подобный девайс автору поста. Ибо валяется без дела (ADSL перестал пользоваться).

              UPD: на фото не моя железка, но похожая. На моей снизу RJ-гнезда под тлф (вход и выход).
              0
              да просто купить ибп ????
                0
                Была у меня на обслуживании линия с 50 метрами неэкранированной воздушки.
                Роутеры и порты на свитчах умирали и при защите apc-шным упсом и при пропуске через специальное устройство грозозащиты.

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

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

                  0
                  За что я ненавижу ADSL, так это за редкостную прожорливость модемов. Мало того, что такой модем потребляет минимум 20 Вт, так ещё и греется как кипятильник. На фоне экономной RPi такой модем выглядит кошмарным уродливым монстром, который к тому же быстро выжирает любой аккумулятор.
                  • НЛО прилетело и опубликовало эту надпись здесь
                      0
                      мой adsl-модем (новый тп-линк) потребляет менее 1 ватта ( 5в, <200мА). Древний zyxel около 5 ватт.
                      +1
                      Модемы и роутеры теряют свои кишочки и порты из-за разрядов по сигнальному кабелю, а не из-за перепадов в сети электропитания дома.

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

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

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

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

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

                          Так что человеческий фактор в данном случае даже имеет некоторые преимущества над автоматикой.
                            +2
                            Можно на малинке поднять nut сервер и она будет изображать из себя ups http://wynandbooysen.com/raspberry-pi-ups-server-using-nut.html
                              0
                              Здорово! Премного благодарен!
                          0
                          Видел сотни сгоревших от грозы модемов, работа такая, очень редко сгорают от сети, скорее блок питания выходит из строя. Зато вот со стороны телефонного кабеля приходят разряды часто, о чем уже выше писали. ИБП с защитой модема не всегда адекватно работает, были случаи когда вообще линк не поднимался за такой защитой) Если нет грозозащиты, для витой пары имеет смысл использовать б/у свитч, его хватает на 2-3 наведенных разряда:)
                            0
                            Не понял каким образом выводится алерт на ТВ.
                            Нет, понятно что малина подключена по HDMI к телеку, не понятно каким образом телек переключит HDMI вход.
                            Т.е. я сижу смотрю телек, начинается гроза, срабатывает оповещение, но телек мне его не покажет, поскольку в качестве источника сигнала, выбран антенный вход, а не HDMI от малины.

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

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                            Самое читаемое