DIY или Сделай Сам / Как из китайского роутера сделать управляемую розетку, или ещё один проект для умного дома и офиса

в 9:13, , рубрики: china, ethernet, remote control, smart home, switch, wifi, вай-фай, дистанционное управление, китайский, пинг, роутер, умный дом, метки: , , , , , , , , , , ,

DIY или Сделай Сам / Как из китайского роутера сделать управляемую розетку, или ещё один проект для умного дома и офиса
Последнее время на Хабре всё больше статей на тему «Умный Дом», «Сделай Сам», и меня это радует. Внесу и я свой скромный вклад в развитие цивилицазии. Добро пожаловать в мир умных вещей!
Краткая предистория

Сначала был хаос… Пропустим этапы сотворения мира и эпоху динозавров и перейдём сразу к 21 веку. Кругом беспроводные технологии, электроника повсюду, космические корабли летят к Марсу…
Открыв для себя китайские интернет-магазины разных товаров, я накупил всякого добра. В частности, были куплены наборы для дистанционного управления лампочками: пультик и к нему несколько коробочек. В результате я сделал дома 4 управляемые розетки и теперь, лёжа вечером на диване и читая Хабр, можно зажечь или погасить свет в комнате и в коридоре, не вставая с дивана. Удобно.
Ещё были куплены совершенно чудесные маленькие дешёвые WiFi-роутеры. Один из них использован как «удлинитель» для беспроводного интернета в детской, а другой оставался в резерве. Кстати, рекомендую, весьма неплохие характеристики за сумму менее 600 рублей.
В «закромах Родины» лежало много разных хороших вещей, и были большие новогодние выходные. И родился проект…
Цель и средства

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

плата с микроконтроллером AtMega16 от старого проекта

твердотельное реле

2-строчный ЖКИ-дисплей

корпус

провода и прочие расходные материалы

Техническое задание

Устройству было дано имя «MZ-switch», и оно должно было делать следующие вещи:принимать команды от хозяина через интернет

работать как реле управления нагрузкой и как реле времени

работать как «пинговалка» и уметь перезагружать роутер и отключать нагрузку при отсутствии пингов

программировать параметры работы из командной строки и сохранять их в своей памяти

показывать статус на дисплее

радовать хозяина своим существованием

Инжекция кода в роутер

Когда я получил роутер, то, разумеется, сразу полез внутрь. Сначала я полез туда не механически, а метафизически, через телнет.
Выяснилось, что внутри у него неонка Линукс, и даже можно при желании написать и запустить собственный скрипт. Можно даже сохранить его в памяти роутера, но вот как заставить скрипт автоматически запускаться при старте?
Несколько дней было убито на то, чтобы найти возможность запуска скрипта. Основная идея была в «инжекции кода» в запуск какого-то стартового скрипта, и такой скрипт был найден! Инжекция выглядит так:
Теперь мой роутер при старте извлекает из своей памяти сохранённые там скрипты и запускает их. Следовательно, можно реализовать свой алгоритм взаимодействия с окружающим миром.
Добившись от роутера запуска скриптов, я полез в него механически. Внутри обнаружился последовательный порт, через который можно получить доступ к консоли. Припаяв 3 штырька к нужным точкам платы, я получил возможность управлять роутером через последовательный порт с помощью микроконтроллера.
Микроконтроллер и программа управления

Микроконтроллер должен уметь общаться через последовательный порт с роутером, управлять нагрузкой, отображать на дисплее результаты работы и вообще делать всю грязную работу. От предыдущего проекта оставалась плата с микросхемой AtMega16, имеющая нужный функционал. Она и пошла в дело.
Базовый алгоритм работы микроконтроллера выглядит так: получаем строку с командой, анализируем, выполняем, возвращаем строку с ответом. Это напомнило мне логику работы аналоговых модемов: S-регистры с данными и AT-команды управления.
Уважая копирайты и вообще для разнообразия, алгоритм оперирует понятиями R-регистров и MZ-команд. Регистры хранят числа и строки, а команды позволяют изменять регистры и управлять логикой работы.
Пример команды настройки контраста дисплея: "MZ+R0=200"
Умный алгоритм

Алгоритм работы микроконтроллера состоит из нескольких отдельных задач:передача данных из буфера передачи

приём данных и сохранение их в буфере приёма

анализ принятых данных и определение команд

чтение и запись внутренних R-регистров

управление нагрузкой и логикой работы

индикация режимов работы

отсчёт интервалов времени

Всё это удалось разместить в объёме 8К кода и 512 байт данных, использовав всего половину ресурсов микроконтроллера. Так что можно ещё чего-нибудь придумать и напрограммировать. Например, показывать на дисплее время, погоду, играть музыку и передвигаться по квартире.
Управляющая программа была написана и отлажена на обычном терминале. При этом не пострадало ни одно устройство.
В результате получился следующий функционал устройства:пауза после включения: позволяет дождаться загрузки роутера и не реагировать на «мусор», который он при этом выдаёт в консоль

если требуется авторизация, то ввод логина и пароля в ответ на запрос от роутера

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

запуск основного скрипта, который будет выполняться роутером при работе (loop)

приём команд от роутера и передача ответных сообщений

сторожевой таймер для перезагрузки роутера при отстутсвии активности

запуск скрипта, перезагружающего роутер (halt)

включение и выключение нагрузки с помощью оптоизолированного реле

возможность настраивать все параметры и хранить их в памяти микроконтроллера

Шайтан-машина

Почему-то очень часто реализация функционала какой-нибудь простой вещи напоминает мне задачи из игры Incredible mashine. Ну как может цель «включить лампочку» состоять из таких затейливых вещей и действий? А вот как:Чтобы роутер мог выполнять наши скрипты, сделаем «инжекцию кода» в один из его собственных скриптов.

Инжектированный код создаёт в папке /tmp несколько служебных скриптов, которыми мы потом воспользуемся.

Роутер не позволяет создавать файлы с атрибутом «исполняемый» и, благодаря заботливым китайцам, не имеет команды chmod.

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

Роутер имеет WEB-интерфейс для управления, но изменить/добавить свою страничку нельзя: всё read-only

Но мы элегантно обходим эту неприятность: оказывается, есть страничка для запуска любой команды, но на неё нет прямых ссылок. Набираем адрес этой странички вручную, и можем запускать свои скрипты! Хоть и не красивой кнопкой, а олдскульной командной строкой.

Чтобы устройство получило команду от пользователя, используем метод «сохрани-и-передай»: один скрипт вызывается из формы ввода команд и сохраняет ввод пользователя в файл. Другой скрипт постоянно проверяет наличие этого файла, а найдя — отправляет через последовательный порт на микроконтроллер.

Получив ввод пользователя, микроконтроллер выделяет из него команду и выполняет её. Например команду «включить нагрузку».

Всё, задача решена!
Сборка в корпус

Множество проектов не доживают до релиза из-за того, что лень или не из чего делать нормальный корпус. В данном случае изначально была поставлена цель: сделать «промышленный образец», чтобы он выглядел по-взрослому, а не как обычно.
Корпус был взят достаточно просторный, чтобы всё там разместить без тесноты. Пара выходных с дрелью и напильником, йо-хо-хо и бутылка рома, и вот устройство собрано. Все крепёжные элементы были найдены в шкафу, где хранятся остатки от сборки мебели и вообще хлам полезные в хозяйстве мелочи. Не удивляйтесь креплениям из дюбелей: винтов с гайками под нужный диаметр не нашлось.
Незаменимым материалом при сборке являются «китайские сопли» — трубочки из пластмассы для клеевых пистолетов. За неимением такого пистолета все работы выполнялись жалом обычного паяльника.
Вот что получилось в итоге:
снаружи
изнутри
Зачем это было нужно

Не буду говорить, что создано уникальное устройство, аналогов которому ещё не существует. Хотя, почему не буду? Буду! Любой новый продукт в маркетинговых материалах именуется не иначе как «уникальный» и «не имеющий аналогов». В крайнем случае «в несколько раз лучше, чем обычный...». Поэтому говорю: получилось действительно уникальное устройство, более чем в 9000 раз умнее, чем обычная розетка.
Можно подключить электрочайник и включать его с ноутбука через Wi-Fi. А можно включить пароходную сирену, если в доме пропал интернет. А можно подключить к устройству Самый Главный Сервер и перезагружать его, находясь дома.
На самом деле данный проект был реализован в качестве «разминки для ума», чтобы не растерять навыки в программировании микроконтроллеров и владении паяльником.Материалы проекта разрешается копировать и модифицировать. Желательно со ссылкой на автора проекта.


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js