Pull to refresh

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

Reading time5 min
Views55K
Последнее время на Хабре всё больше статей на тему «Умный Дом», «Сделай Сам», и меня это радует. Внесу и я свой скромный вклад в развитие цивилизации. Добро пожаловать в мир умных вещей!



image

Краткая предистория

Сначала был хаос… Пропустим этапы сотворения мира и эпоху динозавров и перейдём сразу к 21 веку. Кругом беспроводные технологии, электроника повсюду, космические корабли летят к Марсу…

Открыв для себя китайские интернет-магазины разных товаров, я накупил всякого добра. В частности, были куплены наборы для дистанционного управления лампочками: пультик и к нему несколько коробочек. В результате я сделал дома 4 управляемые розетки и теперь, лёжа вечером на диване и читая Хабр, можно зажечь или погасить свет в комнате и в коридоре, не вставая с дивана. Удобно.

Ещё были куплены совершенно чудесные маленькие дешёвые WiFi-роутеры. Один из них использован как «удлинитель» для беспроводного интернета в детской, а другой оставался в резерве. Кстати, рекомендую, весьма неплохие характеристики за сумму менее 600 рублей.
В «закромах Родины» лежало много разных хороших вещей, и были большие новогодние выходные. И родился проект…

Цель и средства

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


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

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


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

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

code_inject

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

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

Микроконтроллер и программа управления

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

Умный алгоритм

Алгоритм работы микроконтроллера состоит из нескольких отдельных задач:
  • передача данных из буфера передачи
  • приём данных и сохранение их в буфере приёма
  • анализ принятых данных и определение команд
  • чтение и запись внутренних R-регистров
  • управление нагрузкой и логикой работы
  • индикация режимов работы
  • отсчёт интервалов времени


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

В результате получился следующий функционал устройства:
  • пауза после включения: позволяет дождаться загрузки роутера и не реагировать на «мусор», который он при этом выдаёт в консоль
  • если требуется авторизация, то ввод логина и пароля в ответ на запрос от роутера
  • запуск скрипта, позволяющего настроить конфигурацию роутера для работы с устройством (init)
  • запуск основного скрипта, который будет выполняться роутером при работе (loop)
  • приём команд от роутера и передача ответных сообщений
  • сторожевой таймер для перезагрузки роутера при отстутсвии активности
  • запуск скрипта, перезагружающего роутер (halt)
  • включение и выключение нагрузки с помощью оптоизолированного реле
  • возможность настраивать все параметры и хранить их в памяти микроконтроллера


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

Почему-то очень часто реализация функционала какой-нибудь простой вещи напоминает мне задачи из игры Incredible machine. Ну как может цель «включить лампочку» состоять из таких затейливых вещей и действий? А вот как:
  • Чтобы роутер мог выполнять наши скрипты, сделаем «инжекцию кода» в один из его собственных скриптов.
  • Инжектированный код создаёт в папке /tmp несколько служебных скриптов, которыми мы потом воспользуемся.
  • Роутер не позволяет создавать файлы с атрибутом «исполняемый» и, благодаря заботливым китайцам, не имеет команды chmod.
  • Но мы элегантно обходим эту неприятность: сначала копируем какой-нибудь исполняемый скрипт под нужным нам именем в папку /tmp, а затем перезаписываем его содержимое!
  • Роутер имеет WEB-интерфейс для управления, но изменить/добавить свою страничку нельзя: всё read-only
  • Но мы элегантно обходим эту неприятность: оказывается, есть страничка для запуска любой команды, но на неё нет прямых ссылок. Набираем адрес этой странички вручную, и можем запускать свои скрипты! Хоть и не красивой кнопкой, а олдскульной командной строкой.
  • Чтобы устройство получило команду от пользователя, используем метод «сохрани-и-передай»: один скрипт вызывается из формы ввода команд и сохраняет ввод пользователя в файл. Другой скрипт постоянно проверяет наличие этого файла, а найдя — отправляет через последовательный порт на микроконтроллер.
  • Получив ввод пользователя, микроконтроллер выделяет из него команду и выполняет её. Например команду «включить нагрузку».

Всё, задача решена!

Сборка в корпус

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

Вот что получилось в итоге:
снаружи
снаружи
изнутри
изнутри

Зачем это было нужно

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

Материалы проекта разрешается копировать и модифицировать. Желательно со ссылкой на автора проекта.
Tags:
Hubs:
Total votes 89: ↑82 and ↓7+75
Comments36

Articles