Умный дом на основе API Telegram

Как реализовать рабочую IoT систему на API Telegram, создавать устройства, предусмотрев масштабируемость и развитие проекта.

8ca33da06c018260d6d864fe46afc30e.jpg

Привет, Хабр! Около года назад я доводил до ума настольные часы на лампах ИН-14. Работая над ними, мне хотелось привнести что-то новое в подобную классику: светодиодная RGB подсветка ламп, красивые эффекты для неё, управление подсветкой с телефона, создание приложения, Bluetooth, Wi-Fi, синхронизация времени…

Тут я и задумался, как я вообще пришёл к тому, что часам нужен Wi-Fi? Для чего вообще устройствам выход в сеть, беспроводные соединения? Все эти вопросы открыли для меня огромный мир IoT и я с невероятным интересом начал туда погружаться, изучая как теорию, так и предложения на рынке.

Рассуждения об IoT и как я пришёл к своему кейсу.

На мой взгляд, существует несколько подходов к планированию своего умного дома:

  1. Вам нужно просто включать-выключать пару розеток. Вы покупаете умную розетку любого производителя, настраиваете приложение, профит.

  2. У вас есть бюджет и вам нужен полноценный умный дом с огромными возможностями, различными датчиками, охраной, обладающий отказоустойчивостью, резервным питанием и т.д. Вы обращаетесь в контору, вам создают всё под ключ, профит.

  3. У вас нет бюджета, но есть углубленные знания в сфере IoT, вы ищете компоненты, микроконтроллеры, создаете код, платы, делаете нереально крутую систему, которая подходит именно вам, профит.

  4. У вас нет бюджета и углублённых знаний о построении сложных систем, и вы хотите такие же широкие возможности.

Так сложилось, что мои желания и бюджет как раз относились к последнему пункту. Виделось два решения:

  • купить устройства от одного производителя, настроив одну экосистему,

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

Из-за незнания всех тонкостей я выбрал второй вариант, и столкнулся с очень существенной, и как мне сейчас кажется весьма очевидной проблемой: несколько разных приложений, регистрация в каждом, настройка под себя, невозможность объединить в один интерфейс, сложность взаимодействия.

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

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

Итак, основные задачи кейса:

  • попробовать создать свою IoT экосистему,

  • предусмотреть масштабируемость и добавление новых устройств,

  • сделать управление максимально удобным,

  • устройства должны быть бюджетнее, чем готовые решения,

  • создать максимально интуитивную настройку всей системы.

Хотелось сделать такой проект, чтобы не только мне было понятно и удобно пользоваться, а чтобы я мог предложить её как минимум своим друзьям и знакомым, а как максимум — предлагать готовое решение на рынке.

О системе умного дома

40b383bb79c013e9ab1358c417ef2620.png

Первая важная задача — определить, с помощью чего будет происходить управление. Выбор пал на использование API Telegram, это даёт возможность управлять устройствами просто из чата. Конечно, можно было создать очередное приложение, что вышло бы в разы сложнее, дольше, ненадёжнее. Пользователям приходилось бы скачивать его, регистрироваться, запоминать пароли. Вот некоторые из преимуществ использования мессенджера:

  1. Безопасность. Аккаунт под надеждой защитой Telegram.

  2. Удобство. Очень просто переключиться с любого диалога на бота.

  3. Кроссплатформенность. Одно приложение для любых устройств: поддерживается Android, iOS, Windows, Linux и другие.

  4. Доступность. Управлять умным домом можно из любой точки мира, где доступен интернет.

Вторая важная задача — определить «мозг» всех устройств. Здесь мой выбор пал на чип ESP8266 на плате ESP-12F. Важный плюс — возможность писать код в простейшей Arduino IDE и наличие протокола ESP-NOW для связи устройств между собой внутри дома. Как я выяснил позже, решение оказалось вполне рабочим, но спорным. Обо всех минусах расскажу в конце статьи.

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

На данный момент разработано несколько устройств:

  1. Шлюз в виде часов Miss You Even When We’re Together (MYEWWT).

  2. Умная розетка.

  3. Умное реле.

  4. Беспроводной сенсорный выключатель.

Miss You Even When We’re Together

86b52482628128cc06e4619084aedd2b.jpg

Умный дом нуждается в одной очень важной штуке. Её называют шлюз. Обычно она где-то лежит, собирая пыль как Wi-Fi-роутер, и тихонько выполняет свои неприметные, но важные функции: объединяет все устройства умного дома в единую сеть, а также выходит в интернет через Wi-Fi.

В принципе всё. Скучноватая у неё работа, да?

Зачем устройству просто стоять и выполнять эти функции, если можно сделать круче, интереснее и удобнее? Именно так я подумал и решил приступить к созданию MYEWWT.  

39c5c866c373a11c5819dca768c977df.jpg

MYEWWT выполнено в виде настольных часов, сочетающих в себе функции Wi-Fi шлюза, часов реального времени, оснащено датчиком влажности, температуры воздуха, а также фоторезистором для адаптивного изменения яркости сегментов часов в зависимости от условий освещённости в помещении.

MYEWWT взаимодействует c API Telegram, позволяя пользователю отправлять команды и предоставляет на них ответ в Telegram-боте, заранее созданном пользователем.

89600b02a39b19c32acfaa33b4679568.jpg

MYEWWT подключается к Интернету через WI-Fi и взаимодействует с Telegram ботом, получая команды от него, обрабатывает их и управляет периферийными устройствами: выключателями света, умными розетками и т.д. с помощью технологии ESP-NOW.

Возможности устройства MYEWWT:

  • соединение с точкой доступа Wi-Fi и выход в интернет,

  • обмен данными с другими устройствами умного дома с применением технологии ESP-NOW,

  • контроль температуры и влажности воздуха в помещении,

  • возможность смены цвета сегментов часов на любой из диапазона RGB.

Как настроить MYEWWT?

Чтобы управлять системой умного дома grib technology с помощью устройства MYEWWT нужно создать собственного бота в Telegram.

Для этого необходимо:

  1. Открыть диалог с BotFather. Это главный бот — он создаёт ботов. Нажать старт, а после его ответа ввести команду /newbot.

  2. Придумать любое название (name) для бота, например «Мой дом» или «Квартира_50».

  3. Придумать имя бота (username). Оно должно оканчиваться на »_bot». Стоит обратить внимание, имя должно быть уникальное и написано на латинице.

Пример диалога с ботомПример диалога с ботом

После завершения процедуры создания бота, необходимо сохранить выделенные на скрине данные — ссылку на бота и токен. Токен обязательно нужно хранить в тайне, так как с помощью него предоставляется доступ к боту. (На скрине недействительный, зафотошопленный токен).

После этого остается сделать следующее:

  1. Включить MYWWT. Все сегменты загорятся переливающейся радугой. Нужно подключиться с телефона, планшета или компьютера к Wi-Fi сети MYEWWT с паролем iloveyou.

  2. Зайти в браузер по адресу http://10.10.10.10 и ввести точку доступа своего домашнего Wi-Fi, пароль и токен созданного бота в предложенную форму.

b7ff670359f5a32e10ae4a9a61c05259.jpg

После всех процедур в течении нескольких секунд MYEWWT соединится с сетью, время синхронизируется по NTP серверу и станет доступен весь функционал MYEWWT.

3д модель платы3д модель платысхема платысхема платы

На плату подаётся питание 5 В от USB кабеля. Так как микроконтроллеру ESP-12F требуется питание 3.3 В, предусмотрен блок стабилизации напряжения — непосредственно сам стабилизатор AMS1117–3.3, а также входные и выходные сглаживающие конденсаторы для обеспечения стабильности работы платы.

Светодиодам WS2812b, в отличие от ESP-12f, для корректной работы требуется 5 В, поэтому на плате предусмотрен конвертер логических уровней на основе N-канального MOSFET транзистора.

Также в схему подключен модуль DHT-22, который обменивается с модулем ESP-12f показаниями температуры и влажности воздуха по линии SDA.

Для обеспечения адаптивной яркости светодиодов в схему включен фоторезистор, подключенный к ADC пину микроконтроллера с применением резисторов, обеспечивающих рабочий диапазон на аналоговом входе микроконтроллера.

Принцип работы системы умного дома

535097b1695bc14a5cd362058a4362e0.png

На картинке представлена схема. Именно так происходит управление всей системой: отправленное боту сообщение обрабатывается устройством MYEWWT. Если в систему добавлены дополнительные устройства — умные розетки, реле и т.д., команда от бота обрабатывается сначала устройством MYEWWT, затем передаётся подключенным в систему устройствам с применением технологии ESP-NOW.

Подробнее о прошивке

Код я начал писать в среде Arduino IDE с применением SDK от компании Espressif для микроконтроллера ESP-12F, затем развил его в среде VS Code с применением набора инструментов PlatformIO.

Большая часть кода проекта прокомментирована и разбита на удобные части в виде нескольких файлов:

  • основная, с общим циклом и объявлением глобальных переменных и некоторых функций,

  • для функций, вызываемых при отправке и приеме сообщений через ESP-NOW,

  • функции, используемые для работы адресных светодиодов,

  • блок с функциями для работы сервера (captive portal),

  • функция-обработчик сообщений с бота Telegram,

  • блок с прочими системными функциями: отсчёт времени, обновление прошивки, синхронизация времени и т.д.

В моей системе умного дома используются два типа соединений:

  1. От сервера Telegram к шлюзу MYEWWT.

  2. От шлюза MYEWWT к прочим устройствам системы (розетки, реле, выключатели и т.д.).

Соединение сервер-MYEWWT.

Все аспекты безопасности самого API Telegram, а конкретно защита профиля, защита чатов и т.д. описаны здесь.

Между серверами Telegram и MYEWWT устанавливается соединение по защищённому каналу связи, это гарантирует протокол SSL, сами сервера Telegram не дают возможности подключиться и получить запрос от бота, без использования SSL шифрования.

В коде прошивки благодаря BearSSL (реализация протокола SSL на языке C) создаётся клиент, с помощью которого мы имеем возможность получать и отправлять запросы к API Telegram, конкретно к указанному в прошивке (при настройке MYEWWT) боту.

Чтобы другой пользователь, получивший ссылку на бота под управлением MYEWWT или обнаружив его в поиске не смог получить доступ к нему, в коде прошивки создаётся white list, где находятся ID пользователей. ID — уникальный номер аккаунта в Telegram, его невозможно подделать и изменить. Таким образом, при настройке MYEWWT, доступ получает первый человек, обратившийся к боту, его ID сохраняется в энергонезависимой памяти, и возможность обмена сообщений закрепляется за данным пользователем, сообщения от других пользователей просто отсеиваются.

Также в коде прошивки есть возможность выдать правда доступа к MYEWWT другим пользователям — достаточно в настройках выбрать меню «Добавить пользователя» и указать его ID.

Подводя итог, можно сделать вывод о безопасности подобного соединения. Чтобы иметь несанкционированный доступ к боту — придется получить доступ к аккаунту владельца MYEWWT, что сделать довольно сложно, а при должных настройках безопасности Telegram профиля — практически невозможно.

Соединение MYEWWT-устройства

Внутри дома прочие устройства, такие как розетки, реле, выключатели и т.д. не подключены к Wi-Fi и не связаны с интернетом (за исключением попыток связи с сервером для обновления прошивки раз в n часов)

Связь между MYEWWT и другими устройствами передаётся с помощью ESP-NOW — встроенного в SDK от Espressif метода передачи данных. Данное соединение одноранговое, не требует времязатратного «рукопожатия», а также обеспечено возможностью применения протокола CCMP, алгоритма AES-128. Связь между устройствами устанавливается посредством отправки пакета на MAC-адрес устройства, либо с использованием широковещательной передачи.

В документации указано ограниченное число соединений:

Максимум 20 пар, включая зашифрованные, поддерживаются на одном устройстве, включая зашифрованные пары. Максимум 10 зашифрованных пар поддерживаются в режиме Station. Максимум 6 в режиме SoftAP или SoftAP + Station.

А также указано о необходимости регистрации устройств на этапе компиляции прошивки:

 esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_COMBO, 1, NULL, 0);

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

esp_now_register_recv_cb(OnDataRecv);
esp_now_register_send_cb(OnDataSent);

и непосредственно функцией отправки пакета:

esp_now_send(mac_addr, (uint8_t *) &to_switch, sizeof(to_switch));

ограничиваясь, таким образом, лишь памятью ESP-12f, где хранятся MAC адреса добавленных устройств.

Также стоит отметить, чтобы функции ESP-NOW отрабатывались без ошибок, оба устройства должны быть установлены на один и тот же канал Wi-Fi. Устройства время от времени сканируют сеть, выбирают точку доступа MYEWWT, или точку доступа домашней сети Wi-Fi при недоступности сети MYEWWT, и настраиваются на её канал. При этом подключение к самой точке доступа не требуется.

Структуры для связи по ESP-NOW

Управление с помощью ESP-NOW происходит благодаря созданию структур, в которых присутствуют несколько основных переменных. ID, value, SSID и password.

SSID и password необходимы для обмена между устройствами данными об основной точке доступа Wi-Fi, чтобы устройство могло настроиться на канал и/или соединиться с сервером для обновления прошивки.

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

  • to_relay (на принимающем устройстве from_MYEWWT),

  • to_switch (на принимающем устройстве from_MYEWWT),

  • to_MYEWWT (на принимающем устройстве from_device).

Структуры с переменными в коде:

struct {
byte ID;
byte value;
char WIFI_ROUTER_SSID[35];
} to_relay
   
struct {
byte ID;
char WIFI_ROUTER_SSID[35];
uint8_t Address[6];
} to_switch;

struct {
byte ID;
byte value;
} to_MYEWWT

ID:

  • 0 — запрос на настройку к MYEWWT от прибора,

  • 1 — запрос от MYEWWT к прибору,

  • 2 — запрос на настройку к MYEWWT от выключателя,

  • 3 — отчет об успешной настройке к MYEWWT от выключателя,

  • 4 — запрос к прибору от выключателя,

  • 5 — отправка данных к выключателю от MYEWWT,

  • 6 — уведомление об открытой двери,

  • 7 — отчет о получении уведомления открытой двери.

value:

  • 0 — выключено,

  • 1 — включено,

  • 2 — запрос на включение/выключение,

  • 3 — запрос состояния.

Обновление прошивки

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

Данная возможность реализована с помощью встроенной в SDK библиотеки ESP8266httpUpdate.

В функции обновления сначала создаётся клиент:

WiFiClient client;

затем объявляются callback функции:

ESPhttpUpdate.onStart(update_started);
ESPhttpUpdate.onEnd(update_finished);
ESPhttpUpdate.onProgress(update_progress);
ESPhttpUpdate.onError(update_error);

и непосредственно сама строчка, отвечающая за связь с сервером и обновление прошивки:

t_httpUpdate_return ret = ESPhttpUpdate.update(client, "http://www.myserver.ru/myewwt_v2.bin");

Функция обновления прошивки справляется с некоторыми внештатными ситуациями и не вызывает поломок и «окирпичивания» модуля: при внезапном отключении питания, обрыве связи с сервером и прочими проблемами прошивка приостанавливается и возобновляется при восстановлении подключения или подключении питания.

Ещё одна интересная задача, которую удалось решить в процессе — конвертер из Юникода.

Конвертер из Юникода

Помимо прочих, в проекте используются библиотека FastBot от AlexGyver, для удобного парсинга сообщений от бота. Функционал MYEWWT предполагает использование смайликов и кириллических символов, но при обращении с API Telegram обработчик получает Юникод, поэтому библиотека FastBot была доработана — дописана функция конвертации символов Юникода в UTF-8.

В википедии найдены алгоритмы преобразования Юникода в UTF-8. Нужно определить, сколько октетов используется, в соответствии с этим создать шаблоны в битовом выражении, далее побитно включить или выключить нужные биты в шаблоне, затем с помощью логического умножения взять маской биты и включить, после этого преобразовать в последовательность символов HEX системы. В результате успешно получаем русский, индийский и прочие алфавиты.

С другими символами и смайлами ситуация обстоит немного иначе: UTF-8 может занимать и 4 бита, кодируя в принципе весь диапазон Юникода, но во входящем сообщении от Telegram мы видим суррогатные пары UTF-16. Если коротко, цельные байты UTF-8 разбиваются на две пары — верхняя и нижняя часть суррогатной пары. Её нам нужно восстановить в цельный Юникод по формуле, чтобы затем преобразовать в уже знакомую нам последовательность HEX в utf-8:

Код

String convertUnicode(String unicodeStr) {
  String out = "";
  int len = unicodeStr.length();
  char iChar;
  char* error;
  int32_t unicode_bytes; //переменная для числовой записи байтов юникода
  int32_t surr_bytes1; // верхняя часть суррогатной пары
  int32_t surr_bytes2; // нижняя часть суррогатной пары
  for (int i = 0; i < len; i++) {
    iChar = unicodeStr[i];
    if (iChar == '\\') {
      iChar = unicodeStr[++i];
      if (iChar == 'u') {
        char unicode[6];
        unicode[0] = '0';
        unicode[1] = 'x';
        for (int j = 0; j < 4; j++) {
          iChar = unicodeStr[++i];
          unicode[j + 2] = iChar;
        }

        unicode_bytes = strtol(unicode, &error, HEX); //получаем число - юникод в hex

        if ((unicode_bytes >= 0xD800) && (unicode_bytes <= 0xDBFF)) { //если находим первую кодовую единицу суррогатной пары
          surr_bytes1 = unicode_bytes;
        }
        
        else if ((unicode_bytes >= 0xDC00) && (unicode_bytes <= 0xDFFF)) { //если находим вторую кодовую единицу суррогатной пары

          surr_bytes2 = unicode_bytes;
          unicode_bytes = (0x10000 + ((surr_bytes1 - 0xD800) * 0x0400) + (surr_bytes2 - 0xDC00)); //собираем из суррогатной пары полный юникод

          //собираем по алгоритму для 4 октетов
          byte myByte1 = unicode_bytes & 0b111111;
          bitSet(myByte1, 7);
          bitClear(myByte1, 6);

          unicode_bytes >>= 6;
          byte myByte2 = unicode_bytes & 0b111111;
          bitSet(myByte2, 7);
          bitClear(myByte2, 6);

          unicode_bytes >>= 6;
          byte myByte3 = unicode_bytes & 0b111111;
          bitSet(myByte3, 7);
          bitClear(myByte3, 6);

          unicode_bytes >>= 6;
          byte myByte4 = unicode_bytes & 0b111;
          bitSet(myByte4, 7);
          bitSet(myByte4, 6);
          bitSet(myByte4, 5);
          bitSet(myByte4, 4);
          bitClear(myByte4, 3);

          out += (char)myByte4;
          out += "\0x";
          out += (char)myByte3;
          out += "\0x";
          out += (char)myByte2;
          out += "\0x";
          out += (char)myByte1;
        }

        else if (unicode_bytes < 0x800) { //если требуется 2 октета
          byte myByte1 = unicode_bytes & 0b111111;
          bitSet(myByte1, 7);
          bitClear(myByte1, 6);

          unicode_bytes >>= 6;
          byte myByte2 = unicode_bytes & 0b11111;
          bitSet(myByte2, 7);
          bitSet(myByte2, 6);
          bitClear(myByte2, 5);

          out += (char)myByte2;
          out += "\0x";
          out += (char)myByte1;
        }
        else if (unicode_bytes >= 0x800) { //если требуется три октета

          byte myByte1 = unicode_bytes & 0b111111;
          bitSet(myByte1, 7);
          bitClear(myByte1, 6);

          unicode_bytes >>= 6;
          byte myByte2 = unicode_bytes & 0b111111;
          bitSet(myByte2, 7);
          bitClear(myByte2, 6);
          
          unicode_bytes >>= 6;
          byte myByte3 = unicode_bytes & 0b1111;
          bitSet(myByte3, 7);
          bitSet(myByte3, 6);
          bitSet(myByte3, 5);
          bitClear(myByte3, 4);

          out += (char)myByte3;
          out += "\0x";
          out += (char)myByte2;
          out += "\0x";
          out += (char)myByte1;
        }
      } else if (iChar == '/') {
        out += iChar;
      } else if (iChar == 'n') {
        out += '\n';
      }
    } else {
      out += iChar;
    }
  }
  return out;
}

Реле и розетка

584dc334cc51df7f1a14e547f91cba47.jpg

Розетка и реле сделаны на основе одной платы, различия лишь в корпусе и подключении: в реле это клеммы, в розетке это штепсель и вилка.

ef3663afad61c173ab7a9ed63ae3fc84.jpg

Реле вышло очень компактным и отлично помещается в плоские настенные светильники, можно установить в торшеры, настольные лампы. Вмещается даже в некоторые потолочные чаши для люстры. А вообще, установить можно куда угодно: главное соблюдать мощность — 2.2 КВт, потому что на плате установлено реле на 10 А.

3д модель платы3д модель платысхемасхема

На плату подаётся питание 5 В от блока питания, подключенного через изоляционную прокладку. Так как микроконтроллеру ESP-12F требуется питание 3.3 В, предусмотрен блок стабилизации напряжения — непосредственно сам стабилизатор AMS1117–3.3, а также входные и выходные сглаживающие конденсаторы для обеспечения стабильности работы платы.

Для корректной работы реле, в отличие от ESP-12f, требуется 5 В, поэтому на плате предусмотрен транзистор MMBT2222A, позволяющий управлять обмоткой реле.

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

Выключатель

8e5e7f8a11a8822ccd3ff5823ad3c85e.jpg

Когда ты находишься внутри дома, не очень удобно пользоваться Телеграмом, нужен обычный выключатель. У него сенсорные кнопки, он довольно тонкий, питается от двух ААА батареек, крепится в любое место на двусторонний скотч, работает очень долго. Выключатель управляет реле и розетками также с помощью ESP-NOW.

3д модель платы3д модель платысхемасхема

На плату подаётся питание 3 В от батарейного отсека, в котором находятся две батарейки типа ААА. Питание микроконтроллера осуществляется с помощью режима Power-Down, при котором потребление самого микроконтроллера составляет 3 мкА. Каждый сенсорный модуль потребляет 2 мкА, в сумме весь выключатель в режиме ожидания потребляет ~7 мкА, чего хватает на долгое время (от нескольких месяцев до нескольких лет в зависимости от используемых батареек и активностью использования).

В режим Power-Down микроконтроллер ESP-12F вводится благодаря отключению питания с пина EN.

Логика работы выключателя следующая: при нажатии на кнопку высокий уровень (HIGH) подается на GPIO0, GPIO2 и на пин EN, что запускает микроконтроллер. При включении в коде прошивки HIGH подаётся на GPIO0:

pinMode(0, OUTPUT);
digitalWrite(0, HIGH);

это нужно для поддержания питания на пине EN даже при незажатой кнопке. Помимо этого, HIGH подаётся также на GPIO14 или GPIO4 в зависимости от нажатой кнопки, для того, чтобы микроконтроллер смог определить какая кнопка была нажата и поднять соответствующий флаг butt1 или butt2:

butt1 = digitalRead(14);
butt2 = !butt1;

Затем, после отработки цикла (отправки запроса на включение или выключение устройства), микроконтроллер переводит пин GPIO0 в LOW, что в результате переводит пин EN также в LOW, а микроконтроллер в режим Power-Down. На случай, если кнопка не была отпущена, в качестве защитной меры микроконтроллер дополнительно вводится в режим Deep-Sleep командой deepSleepInstant.

digitalWrite(0, LOW);
ESP.deepSleepInstant(0);

p.s. (system_deep_sleep () назначает таймер с процедурой system_deep_sleep_instant () через 100 мс, соответственно, используя напрямую данную команду мы экономим 100 мс)

Как всё это сделать?

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

MYEWWT.

Начало рабочего процесса и первые платы выглядели примерно так123bf7468880d59d081025aaa051ba9f.jpg

Корпус состоит из двух частей, напечатанных на 3д принтере: основная часть, куда крепится плата, и подставка, куда крепится датчик температуры и влажности с проводом питания. Свет от светодиодов нужно рассеивать — для этого идеально подходит транслюцентная плёнка Oracal8500. Чтобы всё было красиво с лицевой стороны — закрепляю на болтиках оргстекло 2 мм, вырезанное лазером. Его заказываю на местном производстве, где занимаются фрезеровкой и лазерной резкой.

Розетки

8a28a3976413cf9505723b6f1f89c179.jpg

Корпус печатаю на 3д принтере, наклейки заказываю в местной типографии. УФ-печать на прозрачной пленке, с плоттерной резкой. Изначально корпус проектировал для того, чтобы вставить готовые штепсели и вилки — стоят они недорого, качество и надежность в разы выше, чем если бы вся розетка была готовой.

Реле

c300b46623ea4dd31ef16c7b27139553.jpg

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

Выключатель

15cf5b1345089a00683a7cd8c1eecfd9.jpg

Корпус выключателя тоже выполнен на 3д принтере, передняя часть сделана из акрила (белого оргстекла), на котором лазером выгравированы канавки в виде частей логотипа — шляпок гриба. Эти канавки заполняются акриловой краской. Белое оргстекло заказано на том же местном производстве.

Платы всех устройств заказываются на китайских производствах вроде allpcb, jlcpcb, pcbway и т.д., вместе с частичной сборкой, чтобы не тратить время на запаивание smd компонентов.

Демонстрация работы

Итак, возможности системы:

  •  управление розетками и реле с получением ответа о состоянии,

  •  получение информации о температуре воздуха от MYEWWT,

  •  получение информации о влажности воздуха от MYEWWT,

  •  добавление и удаление из списка розеток и реле,

  •  возможность настраивать (связывать) выключатель с розеткой и реле,

  •  управление цветом сегментов часов,

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

  •  автоматическое обновление прошивки.

Также есть мысли о дополнениях, которые планирую ввести в ближайшее время:

  • сделать возможность каждому устройству быть шлюзом: пользователю не нужно будет покупать MYEWWT, с помощью даже одной розетки будет возможность создать систему и управлять ей, подключая остальные устройства к главному.

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

  • добавить проверку сертификатов, fingerprint и прочие дополнения для более безопасного соединения с Telegram,

  • создать датчик открытия двери (начало уже положено).

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

Скрины — примеры общения с ботом.

Итоги и рефлексия

Опишу основные плюсы и минусы проекта на данном этапе.

Плюсы:

  • проект существует, а не остался идеей на бумаге,

  • реализована большая часть задуманного функционала,

  • реализован интерфейс и возможности, позволяющие обычному человеку, далекому от сферы IT комфортно пользоваться устройствами и всем проектом,

  • используется относительно неплохой протокол связи,

  • применены основы безопасного соединения,

  • приборы стабильно работают, бот стабильно отрабатывает все команды,

  • присутствует ключевая привлекающая особенность — использование Telegram,

  • предусмотрена возможность масштабирования и создания новых устройств,

  • предусмотрена возможность доработки прошивки и участия любого заинтересовавшегося человека путём создания open source репозитория на github,

  • есть возможность добавить поддержку MQTT, поддержку голосового помощника Алиса и осуществить интеграцию с прочими ресурсами,

  • есть первые продажи, есть перспектива коммерческой востребованности,

  • стоимость компонентов позволяет создавать качественные и бюджетные устройства.

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

Минусы и спорные моменты:

  • устройства печатаются на 3д принтере, уступая внешнему виду устройств конкурентов, производящихся на заводах большими партиями,

  • потребление даже в режиме Power-Down выше чем у современных чипов для IoT, например BLE,

  • ESP8266 — устаревший по всем направлениям чип, имеющий множество недостатков.

  • связь с Telegram через http медленнее, чем использование mqtt (но предусмотрена возможность добавления поддержки mqtt),

  • весь мир движется в сторону ZigBee и Matter, лишая смысла использование альтернативных протоколов, тем более такого как ESP-NOW.

Хотя… :)

ab1f9dab54603ed71ad03ab109338632.png

Предполагая некоторые комментарии, напишу некоторые вещи сразу:

  • Miss You Even When We’re Together — название, вдохновлённое платформами SpaceX Илона Маска,

  • название grib technology и логотип — просто ради красоты :) Да и «устройства от Глеб Жуков» звучит не так презентабельно и убедительно.

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

Да и будем смотреть правде в глаза: для действительно серьёзных и больших проектов, скорее всего, нужны большие команды людей, либо целые компании с опытом создания. Я же обычный студент, причём, обучающийся даже не в сфере IT. Закончу писать статью и буду искать хоть какую-то работу :)

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

Буду несказанно благодарен любым комментариям, советам, предложениям, дополнениям.

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

Все исходники, прошивки, схемы, инструкции можете найти на github. Спасибо!

© Habrahabr.ru