В свободное время (а иногда и в рабочее) я изучаю микроконтроллеры и собираю умный дом у себя в квартире, а так как по профессии я iOS-разработчик, то на умный дом я смотрю через призму iPhone и HomeKit. После сборки более-менее рабочего умного дома и, столкнувшись с кучей проблем, решил рассказать про свой опыт и устройства в цикле из 2 статей. Первая статья будет небольшим ликбезом в теорию микроконтроллеров и протоколов, а во второй уже поделюсь конкретным применением этих протоколов и фреймворков в моем умном доме.
Введение
Есть 3 основных пути, как собрать умный дом у себя в квартире
Построить все на готовой экосистеме от какого-либо производителя (Samsung SmartThings, LG ThinQ...)
Собрать умный дом на готовом фреймворке (HomeAssistant, HomeBridge, Apple HomeKit)
Скомбинировать первые два подхода.
В первом варианте умные устройства уже готовые с готовым приложением, можно не париться с прошивкой микроконтроллеров, но зачастую устройства из разных экосистем не совместимы между собой. Второй подход уже более гибкий и можно подключить устройства от разных производителей в одну экосистему, а также сделать свое умное устройство из не очень умного. Из минусов такого подхода можно отметить сложность первой настройки, а также зоопарк протоколов которые нужно поддержать (ZigBee, ZWave, Thread, WiFi, Bluetooth…). В этой статье как раз поговорим про второй подход и как можно докрутить «умную» часть «тупым» девайсам.
Например, у нас есть светодиодная лента, в которой нет вайфай модуля, и единственный способ ее отключить – это физический выключатель электричества. В такой ситуации можно либо купить умную светодиодную ленту и заменить старую, но такие светодиодные ленты стоят несколько тысяч рублей. А можно всего лишь за 200 рублей докупить микроконтроллер с WiFi, и светодиодная лента будет управляться с телефона. Звучит просто, но встает вопрос какой микроконтроллер выбрать, как написать прошивку для него и как связать микроконтроллер с телефоном.
Микроконтроллеры
Большинство «железячников» начинает свой путь с Arduino. Она отлично подходит для прототипирования, поэтому можно обойтись без пайки, и имеет собственный фреймворк, так что не приходится писать на чистом C. Но, к сожалению, плата довольно большая, не имеет встроенного WiFi и Bluetooth, да и оригинальная плата стоит несколько тысяч рублей. Для Bluetooth и WiFi приходится докупать отдельные модули, такие как ESP8266.
ESP32
В один момент кто-то осознал, что WiFi модуль будет помощнее самой Arduino и спокойно может выступать самостоятельным микроконтроллером со своей прошивкой, а стоит в разы дешевле, после чего модуль стали использовать не совсем по назначению. Но Espressif (компания производитель ESP8266) вовремя опомнилась и, поняв что ее модуль использует не так как планировалось, выпустила более подходящий микроконтроллер на замену Arduino и ESP8266 – ESP32, который можно купить на алиэкспресс рублей за 200 и использовать в своих домашних проектах умного дома.
Другие микроконтроллеры
Несмотря на дешевизну и простоту ESP32, есть и другие интересные варианты. Например, микроконтроллер на Swift’е. Будучи iOS-разработчиком я не мог пройти мимо и не заказать эту плату :)
Для вышеописанных кейсов можно использовать и всем известную Raspberry Pi. Но она стоит слишком дорого, чтобы проводить на ней эксперименты. У нее также есть GPIO, которыми можно управлять через питон, но у нее стоит слабенький трансформатор напряжения, и если подать слишком большое напряжение, она просто сгорит, что и произошло с моей первой Raspberry Pi 4, поэтому ее лучше использовать только как домашний сервер, но об этом в следующей статье.
Фреймворки для ESP32
Для ESP32 также есть Arduino фреймворк, то есть для нее можно писать такой же код как и для Arduino в Arduino IDE, с некоторыми адаптациями функций. Пример кода:
#define LED 2
void setup() {
// Set pin mode
pinMode(LED,OUTPUT);
}
void loop() {
delay(500);
digitalWrite(LED,HIGH);
delay(500);
digitalWrite(LED,LOW);
}
Если хочется больше хардкора, у Espressif есть собственный фрейморк на C - ESP-IDF на базе FreeRTOS. Пример кода:
static void blink_led(void)
{
/* Set the GPIO level according to the state (LOW or HIGH)*/
gpio_set_level(BLINK_GPIO, s_led_state);
}
static void configure_led(void)
{
ESP_LOGI(TAG, "Example configured to blink GPIO LED!");
gpio_reset_pin(BLINK_GPIO);
/* Set the GPIO as a push/pull output */
gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
}
#endif
void app_main(void)
{
/* Configure the peripheral according to the LED type */
configure_led();
while (1) {
ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" : "OFF");
blink_led();
/* Toggle the LED state */
s_led_state = !s_led_state;
vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
}
}
Базовый флоу умного дома
С микроконтроллером определились, теперь надо понять, как написать прошивку для него и связать с телефоном.
Изначально передаем пароль от домашнего WiFi на микроконтроллер (это называется WiFi provisioning), чтобы подключить его к нашей локальной сети, либо же просто зашиваем пароль в коде, но тогда при смене пароля придется перепрошивать микроконтроллер.
Разворачиваем локальный сервер на микроконтроллере и обращаемся к нему по http, как к обычному серверу, либо же подключаемся к нему по MQTT.
Как передать пароль от WiFI
Есть 3 основных способа:
Bluetooth
WiFi
Специальные протоколы
Bluetooth
Про подробности Bluetooth можно отдельную статью написать, но сейчас на этом останавливаться не будем. Скажу только, что нужно подключиться по BLE к мироконтроллеру на телефоне и отправить пароль в приложении через CoreBluetooth. Подробнее можно посмотреть в примерах от Espressif. У них также есть приложения для iOS и Androind с открытым исходным кодом для wifi provisioning.
WiFi
WiFi может работать в 2 режимах (wifi direct и его аналоги в расчет не берем): AP и STA. AP – это когда ESP32 выпускает точкой доступа, как будто это wifi роутер, к которому можно подключиться. STA – это когда ESP32 сама подключается к роутеру.
Соответственно, нужно перевести микроконтроллер в режим AP, подключиться к ней с телефона, отправить пароль от WiFi и затем перевести в режим STA и подключиться к домашнему WiFi. У Espressif также есть для этого примеры и приложения.
Специальные протоколы
Помимо стандартных Bluetooth и WiFi есть специальные протоколы для передачи пароля, такие как SmartConfig и EasyConnect.
Как подключиться к микроконтроллеру
Локальный сервер
Наиболее простой способ это развернуть на микроконтроллере сервер и обращаться к нему по HTTP. Для примера код, который я использую в светодиодной ленте.
MQTT
Есть специальный протокол для умного дома, это что-то вроде сокетов, но я с ним напрямую поработать особо не успел. Знаю только, что он используется в Яндекс.Станции.
HomeKit
Если вы, как и я, «продали душу» эплу и сидите на его экосистеме, проще сделать свое умное устройство на базе HomeKit. HomeKit – это такой же протокол общения между устройствами. Apple не так давно заопенсорсила свою либу для хоббистов. А Espressif адаптировал ее под свои платы. Если разрабатывать Enterprise решение (купить MFi подписку), то не надо даже вручную провижинить пароль от вайфая.
Все сводится к тому, чтобы взять готовый пример от Espressif для HomeKit адаптировать под свои нужды, то есть добавить функции которые будут физически включать/выключать вентилятор, например, и залить на ESP32. Обработка статусов от HomeKit для вентилятора из примеров Espressif:
static int fan_write(hap_write_data_t write_data[], int count,
void *serv_priv, void *write_priv)
{
if (hap_req_get_ctrl_id(write_priv)) {
ESP_LOGI(TAG, "Received write from %s", hap_req_get_ctrl_id(write_priv));
}
ESP_LOGI(TAG, "Fan Write called with %d chars", count);
int i, ret = HAP_SUCCESS;
hap_write_data_t *write;
for (i = 0; i < count; i++) {
write = &write_data[i];
if (!strcmp(hap_char_get_type_uuid(write->hc), HAP_CHAR_UUID_ON)) {
ESP_LOGI(TAG, "Received Write. Fan %s", write->val.b ? "On" : "Off");
/* TODO: Control Actual Hardware */
hap_char_update_val(write->hc, &(write->val));
*(write->status) = HAP_STATUS_SUCCESS;
} else if (!strcmp(hap_char_get_type_uuid(write->hc), HAP_CHAR_UUID_ROTATION_DIRECTION)) {
if (write->val.i > 1) {
*(write->status) = HAP_STATUS_VAL_INVALID;
ret = HAP_FAIL;
} else {
ESP_LOGI(TAG, "Received Write. Fan %s", write->val.i ? "AntiClockwise" : "Clockwise");
hap_char_update_val(write->hc, &(write->val));
*(write->status) = HAP_STATUS_SUCCESS;
}
} else {
*(write->status) = HAP_STATUS_RES_ABSENT;
}
}
return ret;
}
Matter
Бывший Zigbee альянс переименовался и разработал новый стандарт на базе WiFi, Bluetooth и Thread (забавно что без Zigbee). В него входят все крупные игроки: Google, Amazon, Apple. И Apple уже добавила поддержку Matter в HomeKit – устройства на базе Matter теперь будут добавлятьcя так же как и нативно поддерживающие HomeKit. А Espressif уже сделал пару примеров с поддержкой Matter для некоторых версий ESP32.
ESPHome
Чтобы не писать прошивку самому есть так же готовые решения вроде ESPHome.
Микроконтроллер и остальные платы
Все эти манипуляции с подключением к ESP32 нужны были, чтобы можно было физически управлять модулями, к которым подключена ESP32. Для это в ней есть набор GPIO.
Мы можем подавать напряжения на GPIO, тем самым включая или выключая электричество на подсоединенные плата. С помощью широтно-импульсной модуляции так же можно моделировать управление яркость например, если к микроконтроллеру подключен светодиод. Некоторые пины (см. картинку) также поддерживают более сложные протоколы как UART, I2C и SPI. UART используется, например, для GPS модулей, а I2C и SPI для экранов. В рамках статьи останавливаться на этом не будем. Могу посоветовать хороший курс по ESP32.
Заключение
Это было небольшое теоретическое вступление, которое пришлось изучить, чтобы собрать свой умный дом. Но об этом уже в следующей статье.
Комментарии (37)
cck7777
29.11.2021 21:02А "Сервер Xioami" в блок-схеме на КДПВ ошибка, для прикола, или не для малограмотных?
bulava92
29.11.2021 22:42-1Простите, а зачем велосипед изобретать, если уже все придумано и есть куча готовых решений? Спрашиваю из любопытства.
Flatout73 Автор
29.11.2021 22:44А что вы понимаете под готовыми решениями? Есть кучу разных вариантов, как можно собрать умный дом в 2021 году, и вот про один из них я и рассказываю :)
bulava92
29.11.2021 23:05Я проектирую и реализую умные дома разного уровня, от недорогих российских до премиальных европейских, условно с ценниками за оборудование от 100 до 1000 тыс на 100 м². Оттого и вопрос, зачем изобретать, если есть готовые решения, от полноценных контроллеров до полноценных закрытых систем в которых есть все что нужно.
Flatout73 Автор
29.11.2021 23:15А на базе каких производителей вы их реализуете?
bulava92
29.11.2021 23:46Wiren Board, Evо Controls, Loxone и многие другие - основа. Всё очень гибкое, прекрасно можно подключить что угодно с помощью модулей-расширений и т.п. У нас много заказчиков, которые когда-то что-то строили сами, наигрались и в новом доме хотят просто жить и чтобы автоматизации сами работали, а не наоборот. Многие даже не знали о том что есть готовые решения и о том что они не так уж и дорого стоят. Разумеется, к готовому решению мы часто "докладываем" оборудование других производителей, чтобы реализовать максимум возможностей. Потому и спрашиваю, зачем это все.
Flatout73 Автор
29.11.2021 23:25+2все что нужно
Это, конечно, понятие растяжимое :) Зачастую в готовых системах под ключ все максимально топорно: есть планшет/телефон - центр умного дома, и управлять можно только с него, никаких тебе голосовых помощников в виде яндекс.станции и homepod. А так же никакой интеграции с iPhone (хотя бы через Siri Shortcuts): если делать умный дом на базе homekit, то можно сделать сценарии аля я пришел домой (по геопозиции айфона) - включи свет, и не надо ручками/голосом больше ничего делать.
Второй момент - чтобы это не стоило 100к. Для примера, светодиодную ленту с ESP32 можно сделать за 1-2к, а какой-нибудь philips hue стоит 5к+ за ту же ленту.
В-третьих, хочется иметь возможность покупать устройства от разных производителей, и чтобы они могли работать в одной экосистеме, потому что Samsung и LG делают крутые телики, EVE делает крутые терморегуляторы, а Xiaomi крутые датчики.
Если есть примеры крутых закрытых систем с максимальной гибкостью, то я бы про них с удовольствием почитал)bulava92
29.11.2021 23:48Топорно только в системах, бюджет на которые начинается от полумиллиона. И то - лазейки есть. Перечисленные мной выше системы отлично работают и со станцией и с любыми другими устройствами. В России об этом мало пишут, отсюда и неосведомленность. Знаю, так как делаю свой курс по проектированию умных домов и информацию черпаю из англоязычных сайтов - у нас все жадные на информацию почему-то)
N-Cube
30.11.2021 07:35-1Скажем, я зашел сюда почитать, чем еще интересным можно заняться с детьми. Для бытового использования меня вполне устраивают разнообразные светильники филипс (потому что пульт удобный, в основном, можно их разложить и развесить в удобных местах), эппл тиви с колонками маршалл (потому что вообще можно про пульты управления забыть) и так далее. Хочется чему-то детей научить, но просто рассказать, как все оно работает, явно недостаточно - надо вместе сделать, тогда поймут и запомнят. А вы что нам можете рассказать, помимо саморекламы?
akaAzazello
30.11.2021 11:04+1Жаль, что вы лишь вскользь упомянули ESPHome, который интегрируется в HomeAssist (и то, как позволяющий не писать прошивку) - потрясающая вещь с поддержкой для огромного количества различных сенсоров - ну и с открытым кодом, что позволяет дописывать поддержку новых устройств или улучшать для существующих, не изобретая велосипед. Ну и обновление прошивок по воздуху для уже установленных в труднодоступных местах ESP - просто магия :)
same1979
30.11.2021 11:17Думаю с автором в схожем ключе, мой дом разведен скрытой витой парой изначально и вот уже 5 лет "руки не доходят". Ардуинопоморфное абсолютно подходит для начала, затем мысли тянутся к pyton, дабы реализовать голосовой приоритет и связать все это с "ардой". Сразу на pyton, но нужно изучать)
xakepmega
01.12.2021 13:49тоже пытаюсь автоматизировать дом с помощью homekit, но под рукой нет айпада, действительно ли с айпадом расширяются возможности сценариев автоматизации?
Flatout73 Автор
01.12.2021 22:47+1ага, айпед выступает хабом, и можно удаленно управлять устройствами с айфона, если айпед дома.
xakepmega
02.12.2021 20:16Да, а например появятся ли доп сценарии по типу "если нет айфони меня ни жены дома то включить розетку #1 #2 и включить камеру" например?
Flatout73 Автор
02.12.2021 20:37ага, можно настроить сценарии которые будут отрабатывать, когда все ушли из дома. Правда, кажется они не всегда корректно срабатывают, но это уже больше про стабильность подключения умных устройств)
Flatout73 Автор
02.12.2021 20:39Ушли из дома == айфоны тех, кто добавлен в дом отдалились от геопозиции дома
N-Cube
На алиэкспресс ESP32 конечно есть, но можно ли залить прошивку с MicroPython/CircuitPython в китайские платы ESP32? Еще интересно, как такие устройства с питоном подключить к HomeKit - в образовательных целях, например.
igrushkin
Ответ на первый вопрос — да
N-Cube
Спасибо, уже интересно! А работают стабильно, если с теми же raspberry pi (pico) сравнивать?
nochkin
Если уж на то пошло, то RP2040 -- более свежий МК и потенциально MicroPython может быть более сырым если сравнивать с ESP32.
Хотя, для чего-то простого там вообще не должно быть проблем.
N-Cube
MicroBit v1 устройство не новое, а его китайский клон от топового продавца у товарища превратился в тыкву при попытке прошить. У нас же который год оригинальные версии 1 и 2 работают и даже не пищат когда им на вход порой 5v подают вместо 3v. Так что вопрос отнюдь не праздный.
nochkin
При чём тут MicroPython если речь про подачу на вход неправильного напряжения? Некоторые платы ESP8266 имеют ошибку и они получают 5V вместо 3V и вполне работают. К функциональности MicroPython это не имеет отношения, это ведь просто софт.
N-Cube
Вы читать умеете? Ясно написано про превращение китайского клона в тыкву при рядовой прошивке. Вот что тут непонятного?
nochkin
Умею читать. Написано "при попытке прошить" и больше никаких подробностей о том, какой именно прошивкой и как прошивалось.
Я плохо знаком с "MicroBit v1", но разве там есть такая "рядовая прошивка", про которую все должны знать только если назвать это имя? Может, речь про какой-то стандартный bootloader? Я так сходу не нашёл подробностей, к сожалению.
Кстати, не удивлюсь если эта "тыква" без проблем может быть восстановлена банальной перепрошивкой. Но это я просто пальцем в небо, так как очень многие платы МК обычно без проблем можно восстановить после неправильного прошивания.
У меня был больше вопрос -- при чём тут MicroPython? Это тоже просто прошивка, пусть и не "рядовая".
N-Cube
Ну ок, прошивка была с сайта китайского производителя, ссылка прямо в описании товара на али с рекомендацией обновить после покупки для совместимости с оригиналом:) Восстановить не удалось - в ответ на запрос продавец прислал архив с кучей прошивок для разных процессоров, ни одна из которых не заработала, официальная прошивка от микробита не подходит (на китайском аналоге даже процессор другой установлен на плате), после чего товарищ просто спрятал железку с глаз долой. Судя по присланному архиву - продавец вперемешку продает аналоги на разных процессорах и, как видим, вовсе не все из них работоспособны. Если что, у человека опыт с ардуинами и прочими железяками - пару десятков лет плюс собранные и запрограммированные своими руками лазерные резаки и прочее. Не вижу никакого смысла подобную лотерею детям покупать, с другой стороны, если в сообществе железка известна и стабильно работает - можно взять на тест в дополнение к контроллерам от производителей, совместимость с которыми указана на сайте MicroPython. А можно и в виде расширения для rpi pico взять, благо они доступны от производителей, от которых у нас уже куча железок успешно работают. Потому и спрашиваю, кто реально сталкивался и поделится опытом, а не просто слышал или нагуглил.
nochkin
Если на этой плате стоит даже другой процессор, то это тогда совсем не "MicroBit v1" как было указано выше. Тогда это явно не вина MicroBit v1, так как это совсем другая железяка. Это уже точно не "рядовая прошивка", так как это прошивка, видимо, была для другого МК.
Видимо, прошивка была под другой процессор просто. Вот и вернулись к тому, что прошивка была просто неправильная.
То есть, если прошить правильную прошивку MicroPython, то не будет никаких проблем. Если прошить чем-то другим, то проблемы не просто могут, а они будут.
N-Cube
Итого, на али продают железки под видом аналогов, но это не так. К этим железкам продавец предлагает прошивки для совместимости с оригиналом, но они не работают. Как результат - использовать устройство не представляется возможным. Если я вас правильно понял, Вы утверждаете, что лично вы настолько круты, что запросто способны сделать «правильную прошивку» микропитона под никому не ведомый процессор и решить все проблемы? Знаете, такое утверждение требует доказательств. А лично я лучше куплю нормальную железку.
nochkin
Если прошивать плату неправильной прошивкой, то плата превратится в кирпич. Такие вот правила, это не я придумал.
Даже не могу представить откуда может появиться "никому не ведомый процессор" если он никому не ведом, но забавное утверждение, да. Никто не сможет портировать MicroPython на МК, о котором ничего не известно. Тут не надо ничего доказывать. Про ESP8266 сначала что-то изучили-перевели-отревёрсили, нарыли SDK и Espressif что-то открыл в конце-концов, а потом уже стали делать что-то поинтереснее WiFi модема с его дурацкими AT командами.
Стабильность MicroPython'а больше зависит от стабильности самого кода (пусть будет "прошивки"), а не от стабильности МК. Сам факт того, что MicroPython есть на каком-то данном МК уже говорит о том, что МК достоен того, что бы там был MicroPython. Но даже прошивку MicroPython надо прошивать на тот МК, под который она собрана. Иначе, кирпич.
Понятие "рядовая прошивка" немного странное само по себе. Есть совместимая прошивка под данный МК, а есть все остальные. Среди совместимых уже можно решать что прошивать. Какая из совместимых будет "правильная" уже решает сам разработчик.
P.S.: Как по мне, то MicroPython -- это больше как баловство или быстрого PoC. Для чего-то более крупного вдруг резко не хватает ресурсов, но быстро проверить идею на коленке вполне.
N-Cube
Конечно, удалось тогда нагуглить что-то про тот процессор на китайском, но не даташит. Толку-то. Разбираться в присланных бинарных прошивках (там были и под известные процессоры, на которые даташиты есть в сети), чтобы это отреверсить и пытаться портировать на купленный экземпляр непонятно на чем сделанный - это не всегда возможно, но всегда адская работа и кому это нужно. Можно и непосредственно исходники того же микропитона портировать, если ресурсов платы хватит, то это уже сильно попроще, но опять же, не стоит безродная плата того. Вы же зачем-то пытаетесь делать вид, что все нормально, надо было лишь приложить немного усилий, и все получится. Вот я и поинтересовался - вы каждый день такой работой занимаетесь, чтобы утверждать, что это раз плюнуть?
Как я уже писал выше, меня это все интересует с детьми позаниматься. Или вы опять хотите сказать, что в ваши лет 6 микропитон был для вас зашкваром, а для решаемых задач годились только суперкомпьютеры из топ-100? Дело ваше, а я уверен, что микропитона для младшей школы хватит. В rpi pico еще и ассемблер для аппаратных state machines есть, кстати.
nochkin
Это не проблема MicroPython'а. Он тут не при чём. И уже тем более я не могу отвечать за продавца, который зачем-то прислал левую прошивку когда сам явно не шарит в теме.
Пожалуйста, не надо на меня навешивать утверждения, о которых я не говорил. Ни про свои 6 лет, ни про требования суперкомпьютеров, ни про то, что микропитона для младшей школы мало, ни про то, что в RP2040 нет ассемблера для PIO, ни про то, что мне запросто сделать прошивку под неизвестный никому МК и даже про то, что мне на что-то там раз плюнуть.
Изначально я только сказал, что ESP32 на рынке достаточно давно, что бы считать, что MicroPython там достаточно стабильный. Как отсюда был сделан вывод обо всём, что выше?
За такое количество нажатий кнопок можно было уже давно установить MicroPython на ESP32 и самому попробовать. Очень рекомендую. Если проблема в информации, то вот хороший линк что бы начать это удивительное путешествие:
https://docs.micropython.org/en/latest/esp32/tutorial/intro.html
N-Cube
Отличный аргумент, чего уж там. Вот потому я и просил отвечать тех, кто разбирается в теме, а не диванных теоретиков.
nochkin
Потому я и ответил. Но тема была переведена на недобросовестного продавца, который не имеет отношения к MicroPython'у.