Как реализовать рабочую IoT систему на API Telegram, создавать устройства, предусмотрев масштабируемость и развитие проекта.
Привет, Хабр! Около года назад я доводил до ума настольные часы на лампах ИН-14. Работая над ними, мне хотелось привнести что-то новое в подобную классику: светодиодная RGB подсветка ламп, красивые эффекты для неё, управление подсветкой с телефона, создание приложения, Bluetooth, Wi-Fi, синхронизация времени…
Тут я и задумался, как я вообще пришёл к тому, что часам нужен Wi-Fi? Для чего вообще устройствам выход в сеть, беспроводные соединения? Все эти вопросы открыли для меня огромный мир IoT и я с невероятным интересом начал туда погружаться, изучая как теорию, так и предложения на рынке.
Рассуждения об IoT и как я пришёл к своему кейсу.
На мой взгляд, существует несколько подходов к планированию своего умного дома:
Вам нужно просто включать-выключать пару розеток. Вы покупаете умную розетку любого производителя, настраиваете приложение, профит.
У вас есть бюджет и вам нужен полноценный умный дом с огромными возможностями, различными датчиками, охраной, обладающий отказоустойчивостью, резервным питанием и т.д. Вы обращаетесь в контору, вам создают всё под ключ, профит.
У вас нет бюджета, но есть углубленные знания в сфере IoT, вы ищете компоненты, микроконтроллеры, создаете код, платы, делаете нереально крутую систему, которая подходит именно вам, профит.
У вас нет бюджета и углублённых знаний о построении сложных систем, и вы хотите такие же широкие возможности.
Так сложилось, что мои желания и бюджет как раз относились к последнему пункту. Виделось два решения:
купить устройства от одного производителя, настроив одну экосистему,
покупать устройства от разных производителей, лишая себя удобства управления, устанавливая несколько приложений, проходя этапы регистрации, но, более бюджетно.
Из-за незнания всех тонкостей я выбрал второй вариант, и столкнулся с очень существенной, и как мне сейчас кажется весьма очевидной проблемой: несколько разных приложений, регистрация в каждом, настройка под себя, невозможность объединить в один интерфейс, сложность взаимодействия.
Сейчас я понимаю, что можно было купить устройства одной экосистемы, и спокойно себе пользоваться, докупая новые решения того же производителя, не испытывая неудобств. Но сложилось как сложилось — я был недоволен имеющимися у меня решениями и мне захотелось создать своё. А бросить начатое — как-то это не по мне.
В самом начале я просто делал устройства для собственного пользования, без чётко сформулированной задачи, без определения к чему это движется. Когда дело дошло до более-менее рабочих прототипов, заинтересовались друзья: «мне это нравится», «это удобно», «было бы здорово такое иметь у себя дома», «это удобнее других решений». На этом моменте как раз начало вырисовываться понимание к каким целям стоит идти.
Итак, основные задачи кейса:
попробовать создать свою IoT экосистему,
предусмотреть масштабируемость и добавление новых устройств,
сделать управление максимально удобным,
устройства должны быть бюджетнее, чем готовые решения,
создать максимально интуитивную настройку всей системы.
Хотелось сделать такой проект, чтобы не только мне было понятно и удобно пользоваться, а чтобы я мог предложить её как минимум своим друзьям и знакомым, а как максимум — предлагать готовое решение на рынке.
О системе умного дома
Первая важная задача — определить, с помощью чего будет происходить управление. Выбор пал на использование API Telegram, это даёт возможность управлять устройствами просто из чата. Конечно, можно было создать очередное приложение, что вышло бы в разы сложнее, дольше, ненадёжнее. Пользователям приходилось бы скачивать его, регистрироваться, запоминать пароли. Вот некоторые из преимуществ использования мессенджера:
Безопасность. Аккаунт под надеждой защитой Telegram.
Удобство. Очень просто переключиться с любого диалога на бота.
Кроссплатформенность. Одно приложение для любых устройств: поддерживается Android, iOS, Windows, Linux и другие.
Доступность. Управлять умным домом можно из любой точки мира, где доступен интернет.
Вторая важная задача — определить «мозг» всех устройств. Здесь мой выбор пал на чип ESP8266 на плате ESP-12F. Важный плюс — возможность писать код в простейшей Arduino IDE и наличие протокола ESP-NOW для связи устройств между собой внутри дома. Как я выяснил позже, решение оказалось вполне рабочим, но спорным. Обо всех минусах расскажу в конце статьи.
Для удобства, сначала расскажу об устройствах, как они работают, как работает вся система, а затем подробнее погружусь в процесс создания устройств и расскажу о нюансах кода.
На данный момент разработано несколько устройств:
Шлюз в виде часов Miss You Even When We're Together (MYEWWT).
Умная розетка.
Умное реле.
Беспроводной сенсорный выключатель.
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.
Для этого необходимо:
Открыть диалог с BotFather. Это главный бот - он создаёт ботов. Нажать старт, а после его ответа ввести команду /newbot.
Придумать любое название (name) для бота, например «Мой дом» или «Квартира_50».
Придумать имя бота (username). Оно должно оканчиваться на «_bot». Стоит обратить внимание, имя должно быть уникальное и написано на латинице.
После завершения процедуры создания бота, необходимо сохранить выделенные на скрине данные — ссылку на бота и токен. Токен обязательно нужно хранить в тайне, так как с помощью него предоставляется доступ к боту. (На скрине недействительный, зафотошопленный токен).
После этого остается сделать следующее:
Включить MYWWT. Все сегменты загорятся переливающейся радугой. Нужно подключиться с телефона, планшета или компьютера к Wi-Fi сети MYEWWT с паролем iloveyou.
Зайти в браузер по адресу http://10.10.10.10 и ввести точку доступа своего домашнего Wi-Fi, пароль и токен созданного бота в предложенную форму.
После всех процедур в течении нескольких секунд MYEWWT соединится с сетью, время синхронизируется по NTP серверу и станет доступен весь функционал MYEWWT.
На плату подаётся питание 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,
блок с прочими системными функциями: отсчёт времени, обновление прошивки, синхронизация времени и т.д.
В моей системе умного дома используются два типа соединений:
От сервера Telegram к шлюзу MYEWWT.
От шлюза 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 А.
На плату подаётся питание 5 В от блока питания, подключенного через изоляционную прокладку. Так как микроконтроллеру ESP-12F требуется питание 3.3 В, предусмотрен блок стабилизации напряжения — непосредственно сам стабилизатор AMS1117-3.3, а также входные и выходные сглаживающие конденсаторы для обеспечения стабильности работы платы.
Для корректной работы реле, в отличие от ESP-12f, требуется 5 В, поэтому на плате предусмотрен транзистор MMBT2222A, позволяющий управлять обмоткой реле.
Также в схему включена тактовая кнопка для удобства аналогового управления а также поддержки возможности управления реле или розеткой при отсутствии соединения с интернетом.
Выключатель
Когда ты находишься внутри дома, не очень удобно пользоваться Телеграмом, нужен обычный выключатель. У него сенсорные кнопки, он довольно тонкий, питается от двух ААА батареек, крепится в любое место на двусторонний скотч, работает очень долго. Выключатель управляет реле и розетками также с помощью ESP-NOW.
На плату подаётся питание 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. Спасибо!