Доработка розетки SONOFF® S20. Используется для перезагрузки роутера.

Опубликовал | 25.12.2017

Я расскажу о нестандартном применении управляемой розетки. Она будет автоматически перезагружать роутер при пропадании интернета.
Как известно лень — двигатель прогресса… Я живу в частном доме и иногда пропадает интернет, а потом то ли роутер зависает, то ли не обновляет подключение к сети, но главное без перезагрузки интернет не восстанавливается. Все бы и не страшно, но надо надо лезть к роутеру, а он не на видном месте стоит, так я еще и с соседом делюсь интернетом, а по закону подлости когда пропадает интернет и меня нет дома. Решение вопроса описано в статье…

Вот и появилась идея сделать автоматическую перезагрузку роутера. Я для этого даже купил плату ESP8266 и реле, но вот все это собрать в готовое изделие руки не доходили, хотя у меня и 3D принтер есть. Правда больше на заказ печатаю, а для себя уже и руки не доходят.
Случайно увидел распродажу розеток SONOFF® S20 и понял, что не стоит самому мучится, что-то паять и конструировать, когда уже все готовое есть только прошивку осталось написать, ну это уже проще :)
Правда еще 2 месяца ждал когда пришлют, видимо не хотели со скидкой продавать, но я то не тороплюсь…
Прислали розетку, поигрался я с родной прошивкой, обзоры в сети есть, но что-то постоянно отваливается она от моего роутера и решил я ее перепрошить.
Фото розетки:

Разобрал розетку.

Для первой перепрошивки необходимо необходимо припаять разъем для подключения адаптера. Адаптер у меня уже был.

Припаял разъем. Распиновка разъема с лева на право: +3.3в, RХ, TX, GND.

Подключил адаптер

Прошивку я писал в среде Arduino ide 1.8.5
Для правильной прошивки данной розетки необходимо установить следующие настройки платы:

Для перевода розетки в режим прошивки надо нажать кнопку на плате розетки и не отпуская подключить адаптер в USB компьютера, подождать не менее 3 сек, затем отпустить. При прошивке подавать 220в на розетку нельзя! Питание берется с платы адаптера.
В программе использовал библиотеку ESP8266Ping.

Текст программы
#include <ESP8266WiFi.h>
#include <ESP8266Ping.h>

const char* ssid = «ssid»; // подставить название своей сети WiFi
const char* password = «password»; //подставить пароль свой сети WiFi
//IPAddress ip(192, 168, 1, 70); //Node static IP
//IPAddress gateway(192, 168, 0, 1);
//IPAddress subnet(255, 255, 255, 0);

//const char* remote_host = «www.ya.ru»; //адрес для пинга
const IPAddress remote_ip(87, 250, 250, 242); // адрес для пинга
unsigned long previousMillis = 0;
const long interval = 300; //интервал между пингами в сек
const long T_ROUTER = 60; // время ожидания загрузки роутера в сек
const long T_RELAY = 5; // задержка от выключения реле до включения в сек

int PIN_RELAY = 12;
int PIN_LED = 13;
int PIN_BUTTON = 0;
int COUNT_PING = 0; //количество попыток при отсутствии пинга (не задается)
int COUNT_PING_MAX = 2; //максимальное количество отсутствия пинга до перезагрузки роутера
int COUNT_WIFI = 0; //счетчик попыток подключения к WiFi
int COUNT_WIFI_MAX = 60; //300; // Таймаут до перезагрузки роутера при отсутствии WiFi в сек

void setup()
{
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_RELAY, OUTPUT);
pinMode(PIN_BUTTON, INPUT);
digitalWrite(PIN_RELAY, HIGH);
digitalWrite(PIN_LED, LOW);
Serial.begin(115200);
delay(10);
attachInterrupt(PIN_BUTTON, Click, FALLING);
}

void ConnectWIFI()
{
Serial.println(«Подключаюсь к WiFi»);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
// WiFi.config(ip, gateway, subnet);
while (WiFi.status() != WL_CONNECTED)
{
if (COUNT_WIFI <= COUNT_WIFI_MAX)
{
COUNT_WIFI++;
}
else
{
Serial.println();
Relay(); //перезагружаемся так как нет подключения к WiFi
Serial.println(«Подключаюсь к WiFi»);
}
//Serial.println(WiFi.status());
digitalWrite(PIN_LED, !digitalRead(PIN_LED)); //моргаем зеленым светодиодом
delay(1000);
Serial.print(".");
}
COUNT_WIFI = 0; // сбрасываем счетчик попыток подключения к WiFi
Serial.println();
Serial.print(«WiFi подключен, ip: „);
Serial.println(WiFi.localIP());
//Serial.println(WiFi.status());
digitalWrite(PIN_LED, LOW); // зажигаем зеленый светодиод
COUNT_PING = 0; // сбрасываем счетчик неуспешных пингов
}

void Relay()
{
if (digitalRead(PIN_RELAY) == HIGH)
{
digitalWrite(PIN_RELAY, LOW); //отключаем питание на розетке
Serial.println(“Реле ВЫключено»);
}
delay(T_RELAY*1000);
digitalWrite(PIN_RELAY, HIGH); //включаем питание на розетке
Serial.println(«Реле Включено, ждем загрузки роутера»);
delay(T_ROUTER*1000); // ждем загрузки роутера
COUNT_PING = 0; // сбрасываем счетчик неуспешных пингов
COUNT_WIFI = 0; // сбрасываем счетчик попыток подключения к WiFi
previousMillis = 0;
}

void Click()
{
digitalWrite(PIN_RELAY, LOW); //отключаем питание на розетке
Serial.println(«Реле выключено кнопкой»);
}

void loop()
{
if (WiFi.status() != WL_CONNECTED) // нет подключения к WiFi
{
ConnectWIFI(); //подключаемся к WiFi
}
unsigned long currentMillis = millis();
if (((currentMillis — previousMillis) >= interval*1000) && (digitalRead(PIN_RELAY) == HIGH) && (WiFi.status() == WL_CONNECTED))
{
previousMillis = currentMillis;
Serial.print(«Попытка пинга: „);
//Serial.println(remote_host);
Serial.println(remote_ip);
//if(Ping.ping(remote_host))
if (Ping.ping(remote_ip))
{ //пинг есть
Serial.println(“Пинг есть!!»);
COUNT_PING = 0;// сбрасываем счетчик неуспешных пингов
} else
{ // пинга нет
Serial.print(«Пинг отсутствует :( „);
COUNT_PING ++;
Serial.println(COUNT_PING);
}
}
if (COUNT_PING >= COUNT_PING_MAX) // если превышено количество попыток пинга перезагружаем роутер
{
Relay();
}
if (digitalRead(PIN_RELAY) == LOW) // нажата кнопка, перезагружаем роутер
{
Relay();
}
}

Суть работы заключается в следующем. Розетка подключается к домашней сети WiFi и с периодом 5 минут пингует сервер яндекса. При отсутствии пинга более двух периодов по 5 минут розетка отключает питание на 5 секунд, далее ждет 1 минуту для загрузки роутера и пытается пинговать опять. При отсутствии подключения к WiFi, так же перезагружает роутер.
Все временные интервалы можно поменять на нужные вам.Текст программы хорошо прокомментирован, думаю кому надо разберутся. В крайнем случае обращайтесь в личку, помогу подправить текст программы.
В данный момент еще тестирую розетку на столе, а затем поставлю в работу. За несколько дней проблем в работе не заметил.
Для мониторинга работы хотел отправлять количество перезагрузок роутера на сайт народного мониторинга. Как сделаю, то дополню обзор.
А какое не стандартное применение розетки нашли вы?

Планирую купить 0 Добавить в избранное +2 +2

(c) 2017 Источник материала

Рекламные ссылки