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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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, пароль и токен созданного бота в предложенную форму.

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

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

На картинке представлена схема. Именно так происходит управление всей системой: отправленное боту сообщение обрабатывается устройством 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;
}

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

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

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

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

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

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

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

Выключатель

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

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

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

Розетки

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

Реле

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

Выключатель

Корпус выключателя тоже выполнен на 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.

Хотя... :)

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

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

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

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

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

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

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

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

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

Комментарии (18)


  1. Phoen
    11.03.2022 11:45
    +3

    Слушайте, какие нафиг "минусы"? Оно ж мало того что на бумаге не осталось, так ещё и кажется чем-то большим чем PoC. Переделываем "минусы" в "roadmap" и вот уже проект)

    Я б встал в очередь даже просто после появления поддержки mqtt и ZigBee, как раз сейчас ремонт in progress.


  1. gudvinr
    11.03.2022 13:02
    +3

    Какая может быть масштабируемость в условиях привязки к единственному API, который базируется на сторонних серверах?


  1. GeorgeIV
    11.03.2022 15:43
    +1

    В моем "Умном доме" Wi-Fi оказался самым слабым звеном, может отвалиться совсем. При этом Zigbee работает и работает отлично. Я больше склонен создавать на Zigbee функциональные независимые наборы, не связанные с вайфай, интернетом (например, чтобы включить ночник при движении ночью по коридору вай-фай не нужен). Телеграм будет прикручен только к функциональному набору сигнализации ( на сегодня это системы защиты от протечек и датчик задымления), причем сама сигнализация сохраняет возможность полноценной автономной работы даже без сети и электричества.


  1. ank1965
    11.03.2022 15:46

    IMHO более целесообразно было бы использовать следующую архитектуру: MQTT сервер (устанавливается на домашний роутер) + к роутеру через Wi-Fi подключаются периферийные устройства ESP8266. Таким образом объединяются не только устройства внутри дома, но и снаружи - дача/загородный дом, гараж (через LoRa)...
    MQTT позволяет легко визуализировать полученные временные данные (Grafana).
    Целесообразность использования ESP-NOW перед MQTT для связи устройств весьма сомнительна...


    1. gleb_zhukov Автор
      11.03.2022 17:58
      +1

      Вы, безусловно, правы, но в вашем описании не учитывается один важный фактор: мой имеет стремление быть коммерческим и реализовываться как готовое решение, и в целом позволяет потенциальному пользователю настроить всю систему за несколько максимально простых шагов и сразу начать управление умным домом из мессенджера. Если выйти за пределы IT-комьюнити, обнаружится, что, например, рядовой учитель истории из города N не понимает от слова совсем как накатить на Wi-Fi роутер MQTT сервер, а умный дом этот человек иметь хочет. С одной стороны и "эх, жаль что не все могут всё", а с другой стороны это и толкает разработчиков придумывать более изящные решения.


      1. ank1965
        11.03.2022 23:12

        ну, есть две крайности: либо ты тратишь свое время и делаешь почти бесплатно почти все сам, либо покупаешь чьи-то знания и/или чей-то "продукт" за деньги :)
        Истина у каждого находится где-то между этими двумя точками ...
        В целом - потенциальных пользователей "умного дома" в пределах IT-комьюнити на 2 или даже 3 порядка больше, чем в нише "рядовой учитель истории из города N".
        Лучшие практики "коммерциализации" показывают, что сначала надо создать свое комьюнити, и затем уже в нем продвигать свой продукт :) Собственно, ваша статья это и есть шаг в этом направлении :) Главное - не ошибиться с выбором целевой аудитории/потребителя продукта.


  1. utya
    11.03.2022 18:58
    -1

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

    сейчас делаю враппер который заворачивает mqtt в telegram


    1. ank1965
      12.03.2022 18:21

      "заворачивает mqtt в telegram "
      а зачем его заворачивать???


  1. Erop22
    12.03.2022 01:03

    1. Имхо, имеет место быть некоторая путаница в понятиях. У вас нет системы умного дома (УД). Ну или во всяком случае, вы не показали, что она есть. Максимум это можно назвать автоматизированной системой (АСУ). На Хабре была отличная статья по этому вопросу (поищите, мне с телефона неудобно).

    2. Любая подобная система (УД или АСУ) должна полностью контролироваться локально. Лично мне больше импонирует ZigBee, но тут вариабельно. Любые внешние системы доступа — это прикольные фишки, не более. То же распознавание голоса и даже "компьютерное зрение" можно прикрутить локально, а вот с проблемами у "большого дяди" сделать нельзя ничего.

    3. WiFi в IoT и домашний роутер — очень, очень плохая затея. Это всё очень забавно, пока у вас пара (десятков) устройств, но не все роутеры могут нормально обслужить даже сотню устройств (даже если они почти не генерят трафик). Пока у вас только лампочки и розетки, сотня устройств может показаться чем-то запредельным. Но если мы говорим про систему действительно умного дома, то там и датчики температуры/влажности/движения/потребления, газоанализаторы и что там ещё (которые в общем случае могут быть отделены от управляемых устройств). + сигнализация, + медиасистемы, свет, тепло, климат... В общем, как только дом начинает становиться действительно умным, количество устройств существенно увеличивается. Этим всё ещё можно рулить по WiFi, но не каждый дешманский роутер это осилит. А заключаться это всё будет в тормозах в управлении и периодических отвалах. Не говоря уже про сильно захламлённый эфир 2.ГГц в человейниках..

      Движение ваше правильное и перспективное, но есть о чём серьёзно задуматься.. Имхо, если вся ваша фишка — возможность использовать Телегу, то на этом вы долго не удержитесь..


    1. gleb_zhukov Автор
      12.03.2022 13:53

      Пока в моём проекте нет сценариев, управление с голосовым помощником и интеграции с другими сервисами, пусть будет АСУ, я не против :) Просто "умный дом" более привычное понятие, хоть это и может быть неточностью для знающих людей. Но вообще, как мне кажется смысл словосочетания "умный дом" по мере развития технологий, да и от источника к источнику становится разным. Кому-то это и тыкнуть на пульте и выключить лампочку, а кому-то сценарии автоматизации на все случаи жизни.

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

      ESP-NOW и является аналогом zigbee. С большим количеством минусов, недоделок со стороны производителя, но аналогом. Как я написал в конце статьи — проект предусматривает развитие, и даже с использованием того же микроконтроллера esp8266 можно создать любую топологию сети: дерево, звезда, и даже создать что-то вроде mesh, путём изменения кода и структур для связи нод. Таким образом добавить локальное управление будет не большой проблемой, делая управление с Телеграма одной из фишек. Например, можно повесить модуль в прихожую: esp8266 + сенсорный экран для управления, если esp потянет.

      Скорее всего, всё это имеет мало смысла для преобразование во что-то действительно большое, с сотнями устройств, как вы описали. Под первым катом я рассказал как и почему родился этот проект, огромных целей изначально не было. Тем не менее, проект работает, причем работает очень неплохо на моих масштабах, где на данный момент в моём представлении предел пара десятков устройств.

      Естественно, когда я буду задумываться о сотнях устройств, обеспечении максимальной надежности, стабильности и отказоустойчивости, я буду обходить esp стороной. Но как упомянули в комментариях, целевая аудитория разная и потребности у них тоже разные. Например я и мои знакомые пользующиеся описанными в статье устройствами вполне довольны :)


    1. ank1965
      12.03.2022 18:16

      ZigBee - это, конечно, хорошо, если его рассматривать только как "транспорт" (энергопотребление, "соты"...), а не как "черный ящик" шлюза, который заточен под конкретного производителя и в который не добавить ничего в случае чего.
      Соответственно, если говорить о "транспорте", то самостоятельное изготовление ZigBee устройства - намного сложнее, чем Wi-Fi устройства, т.е. порог вхождения - намного выше. А если говорить об интеграции разных ZigBee устройств, то тут уже и MQTT в качестве интегратора понадобится.
      Получается, что если в приоритете "разное, быстро и не дорого" - WiFi, а если "энергопотребление и площадь покрытия" - ZigBee


  1. GeorgeIV
    12.03.2022 12:24

     В свете последних событий телеграм тоже может стать ненадежным средством. Я собираюсь прикрутить в свою систему прием/отправку смс. Модуль уже пришел из Китая.


  1. VladGTN
    12.03.2022 12:27

    Какой-то умный дом не очень умный....


  1. oblachnii_boy
    12.03.2022 12:27

    Просто заткнись и возьми мои деньги


  1. hooperer
    12.03.2022 17:36

    Здравствуйте.

    есть у нас такой прибор, называется М3000-ВВ-1020 .

    и к нему мы делали прошивку для управления с телеграмма, да. https://youtu.be/nys4DrW1gRs

    И да, прошивку потихоньку доделывает разработчик, там ещё не всё что хотелось бы.

    (и даже как то делал бота, работающего на ПК с тем чтобы начали пользователи устройств нашей компании начали потихоньку понимать - зачем это и примерно как.

    https://youtu.be/GWNryHOylDE

    )


    1. gleb_zhukov Автор
      12.03.2022 20:44

      похоже на какую-то рекламу.


      1. hooperer
        12.03.2022 21:21

        надо же.

        ну нам на этой площадке врят-ли нужна реклама - весьма специфический и рынок под определённых инсталляторов который тут почти наверняка не бывает.

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

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

        а вполне себе с некоторым количеством применений и весьма интересна. с демонстрацией своих применений.

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


  1. Divisi0n
    13.03.2022 00:54

    Картинка в последнем спойлере идеально описывает сегодняшний рынок умного дома. К сожалению, по-настоящему умный дом - это не только розетки и лампочки. И он не поумнеет до тех пор, пока производители не договорятся о едином открытом локальном API управления и мониторинга. Сейчас же большинство вендоров, у которых есть хотя бы несколько устройств (а есть и такие, вроде Сбера, которые вообще далеко не производитель электроники), пытаются "подсадить" покупателя на свою экосистему, но полнофункциональной системы так ни у кого и не получилось.

    Есть, к примеру, умный дом от Samsung, где можно включить стиралку и переключить канал телевизора, но Самсунг не делает контроллеров для откатных ворот. Есть Xiaomi, у которых много разных датчиков и релюшек, но кондиционер Xiaomi достать вряд ли получится. Есть подвижки в виде подключения чужих API через чужой сервер (например, залогиниться в умном доме LG через Алису), но это только подтверждает, что каждый производитель считает свою экосистему идеальной, а остальные имеют "фатальный недостаток" (с). На практике надёжность этой реализации зависит от настроения админа роскомнадзора, помноженного на удвоенный пинг между Китаем и Европой, и доверять что-либо серьёзное ей нельзя.

    А у Tuya есть автономный привод для батарей отопления, у которого вообще нет аналогов. И хоть он и работает на Zigbee, отдаёт он туда тоже не всё, поэтому реализовать простую и очевидную задачу управления батареей от внешнего датчика температуры через Home Assistant всё равно нельзя.

    В итоге все самоделки на текущий момент - это куча костылей, вроде заказать старую версию RF трансмиттера, чтобы перешить в кастом и отправлять сигнал на открытие ворот, заснифить трафик и через wireshark вытащить токен управления очистителем воздуха, направить ИК диод на блок приточной вентиляции, чтобы эмулировать кнопки пульта, хотя у него есть полноценное мобильное приложение, и прочее.

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