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

Рассмотрим, как встроить свое собственное устройство с платформой «Умного дома» Samsung SmartThings. Мы реализуем вариант прямого (Direct) подключения для управления устройством «Умного дома» на примере кнопки-выключателя и трехцветной лампочки. 




Зачем вообще нужны платформы «Умного дома»?


Сейчас гаджетов и умных устройств в продаже — сколько хочешь. Не проблема купить чайник с управлением по Bluetooth или лампочку с WiFi. Но делает ли это ваш дом «умным»? Нередка ситуация: лампочка управляется только через мобильное приложение от производителя. Это создает неудобства, если вы пытаетесь сочетать хотя бы несколько разных брендов. Поэтому идеальная платформа – это та, которая дает возможность управлять единообразно устройствами разных производителей.

Более того, хотелось бы видеть «растворенный в повседневности компьютер», как мечтал об этом Марк Вайзер из Xerox PARC: не управлять через специальное приложение, не распылять свой фокус внимания. Хотелось бы естественного взаимодействия с умной средой, не меняющего наших привычек. Как реализовать это технически? Например, это могут быть сценарии, где вовлечены разнородные устройства в доме: вы проснулись – носимое устройство это детектировало и включился чайник; вы пришли домой – датчик на двери это зафиксировал, с учетом времени суток задернулись шторы, лампа включилась, с учетом температуры включился кондиционер.

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

Для всего этого предназначены платформы «Умного дома». Рассмотрим, что умеет платформа Samsung SmartThings.

Предыстория – что такое SmartThings?


SmartThings начинался как стартап. На тот момент, когда он появился, в 2012 году в США, тема «Умного дома» ещё не была на вершине хайпа, не было ещё умных колонок и разнообразия гаджетов в магазинах. Идея пришла основателю стартапа, Алексу Хокинсону, после одного случая: дом его семьи в Колорадо пострадал оттого, что после временного отключения электричества водопроводные трубы сильно замерзли, их прорвало, и весь этаж залило. Тогда он подумал, что мог бы предотвратить проблему, если бы знал о происходящем в доме. 

После безуспешного поиска готового решения Хокинсон и его коллеги сделали прототип устройства и начали кампанию на Kickstarter. Кампания оказалась сверх-успешной, собрали 1 200 000 $ вместо запланированных 250 000$ за 30 дней. Началась продажа хаба-концентратора с небольшим набором устройств в комплекте: умная розетка, датчик открытия двери, датчик движения, датчик присутствия. А в  2019 году, уже под брендом Samsung SmartThings, вышла третья по счету версия хаба.


Залогом успеха на Кикстартере было наличие работающих прототипов железа и софта, и дружественность к мейкерскому сообществу

Создатели стартапа вышли из DIY-среды, поэтому они последовательно развивают концепцию открытого API для гиков-мэйкеров, способных на ранней стадии выступить как early adopters. В кампании на Kickstarter был и шилд для Arduino, и различные облачные модули для беспроблемного подключения вашего стороннего устройства. В Интернете вы сможете найти множество примеров самодельных устройств, совместимых со SmartThings, будь то управляемая дверь курятника (с решением серьезной жизненной задачи – спасти цыплят от хищной норки), или дистанционная установка кода электронного замка для гостей с Airbnb.


Источник фото: https://www.hackster.io/aaronpk/auto-airbnb-entry-745799

В 2012-2013 годах компания SmartThings прошла несколько раундов инвестирования и получила 12,5 миллионов долларов. И наконец, в 2014 году она заинтересовала компанию Samsung и была приобретена за 200 млн $ в рамках стратегии по входу на рынок Интернета вещей.
Облачные возможности платформы остались бесплатными: авторы, теперь уже сотрудники Samsung, не исключая теоретической возможности брать плату за большие объёмы трафика, подчеркивают: для разработчиков устройств всегда будет оставаться бесплатный вариант. Это радует, ведь сейчас почти во всех облачных сервисах предусмотрена монетизация, и зачастую даже на пробный период нужно привязывать банковскую карточку. SmartThings же — полностью бесплатная платформа.

Архитектура SmartThings




Давайте двигаться по схеме слева направо.

Устройства


SmartThings Devices – это могут быть не только устройства из комплекта SmartThings, но и множество сторонних из списка партнёров.



Если устройства нет в списке официально поддерживаемых, вы можете поискать к нему Device Handler — он может быть предоставлен сообществом разработчиков — или написать свой собственный.

Способы подключения


Подключать устройства к платформе вы можете следующими способами:

  • Hub-connected — через хаб-концентратор, актуально для устройств, которые своего выхода в Интернет не имеют, а соединяются через традиционные для такого рода систем беспроводные сети наподобие ZigBee. 
  • Directly-connected — через Интернет напрямую к облаку. Недавно SmartThings выпустили видеокамеру, лампочку и умную розетку, и они работают без хаба – через WiFi. Именно такой вариант мы будем реализовывать в данном руководстве.
  • Cloud-connected — через стороннее облако для тех устройств, у которых уже есть своя облачная экосистема. Это сложнее, поэтому такой вариант рассматривать не будем.

Хаб


Обычно для подключения разнообразной аппаратуры у вас дома должен стоять специальный маленький сервер «Умного дома», поддерживающий различные протоколы. Он же – хаб, концентратор, шлюз – названия бывают разные.


Хаб и комплект устройств к нему. Источник фото: IXBT.

Приложение


SmartThings App – это приложение, которое можно установить на основные мобильные ОС и с его помощью: добавлять новые устройства в систему, контролировать уже добавленные, назначать правила автоматизации, получать уведомления через push и SMS, и многое другое. 



Абстракции


В SmartThings, как и во многих других платформах умного дома, есть следующие абстракции: комнаты, сцены, сценарии. 

Устройства группируются в комнаты (Rooms). Вы просто присоединяете в приложении те или иные гаджеты к одной комнате, и называете её «Кухня», «Ванная», «Прихожая».

Ещё есть сцены (Scenes) – это ситуации: «сон», «отдых», «работа», «просмотр фильма» — каждая из ситуаций характеризуется своим набором состояний устройств.


Сцены и комнаты на экране приложения

И наконец, сценарии (Routines): правила автоматизации «если – то». По умолчанию в программе четыре сценария: «Я вернулся», «Спокойной ночи», «Пока», «Доброе утро». Можно настроить активацию сценария по условию наступления утра, или в случае движения, или в случае открытия двери, и так далее. Нетривиальный пример: когда я вхожу домой — заблокировать сетевой трафик на домашней камере видеонаблюдения, чтобы исключить возможность утечки моих личных видео. Или жестокий воспитательный пример: принудительно отключить планшет от сети, когда наступило 11 часов вечера, чтобы не дать себе залипать в Интернете вместо здорового сна.



Более того, в программе SmartThings на телефоне есть интересная возможность – запоминание типичных действий. Когда часто пользуешься телефоном, он со временем начинает тебе подсказывать, как лучше сконфигурировать сцены, исходя из самых часто запускаемых приложений.

Для добавления в систему новых устройств предусмотрена система плагинов. Разработчик может запрограммировать плагин для своего собственного устройства – пользовательский интерфейс внутри приложения SmartThings и логику работы устройства. По сути, это веб-приложение. С точки зрения разработчика, плагин может подписываться на события или уведомления с устройства, посылать ему сообщение, мониторить статус соединения с устройством. Есть понятная документация о жизненном цикле плагина.

Скачиваются они пользователем из «магазина плагинов» по мере необходимости, чтобы не раздувать приложение на телефоне.



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

Делаем своё устройство совместимым со SmartThings


У вас может возникнуть вопрос: а зачем? В чем смысл делать его совместимым, если вы – разработчик устройства?

  • Основное преимущество – увеличение ценности продукта благодаря автоматической интеграции со всей экосистемой.
  • При условии прохождения функционального тестирования, вы можете наклеить на коробочку продукта лого: «Совместимо со SmartThings»,  тем самым вы гарантируете беспроблемную установку и настройку устройства в экосистеме SmartThings.
  • Как и с любой платформой, ваша задача облегчается: вам уже не нужно стараться и разрабатывать, к примеру, пользовательский интерфейс – вы можете воспользоваться стандартными кнопками и прочими элементами интерфейса SmartThings.
  • Вы получаете пиар и аудиторию пользователей благодаря коммьюнити SmartThings (оно живое и активное).

В нижеприведенном руководстве подключать мы будем своё, полностью кастомное устройство.

Что предлагается сделать


SmartThings Device SDK (STDK) был презентован недавно – на Samsung Developer Conference в октябре 2019 года. Ниже мы предлагаем перевод руководства по этому SDK. И не просто перевод: мы всё то же самое проделали и повторили своими руками, поэтому тут будут некоторые комментарии практического характера, выходящие за пределы изначального руководства.

Как будет выглядеть итоговый результат, показано на видео:


RGB-светильник подключается к платформе SmartThings через WiFi, и вы управляете им через телефон. Сам светильник реализуется максимально дешевым и простым способом – на сверхпопулярной микросхеме ESP8266. Железо не принципиально: можно делать на любом микроконтроллере, ведь SDK написан на языке С, выложен в открытый доступ и его можно портировать при желании. В «продакшн» светильник на ESP вряд ли пойдет (начнем с того, что в «Умном доме» удобнее использовать другие интерфейсы, нежели WiFi), но для модели и иллюстрации вполне сгодится.

Функционал получившейся «умной лампочки» будет такой: управление RGB-светодиодом при помощи цветового круга на телефоне. А также ее выключение и включение посредством кнопки.
Процесс разработки показан на схеме:


Показанный процесс не жесткий, некоторые из шагов можно менять местами, что и покажем в руководстве.

Железо


В оригинальном руководстве показано всё на примере платы WeMos D1 Mini, это отладочная плата на основе ESP8266, которую можно вставлять в макетную плату. В общем-то, ничего хитрого в ней нет, это просто модуль суперпопулярного в среде любителей китайского чипа ESP, напаянный для удобства работы на более широкую плату по размеру макетки. Поэтому вы можете делать всё и на любой другой плате.


Слева: WeMos D1, справа – Troyka WiFi Shield

Софт


Что нужно для сборки примера:

  • Ubuntu Linux версии не ниже 18.04 (можно собирать пример и под Windows, и под MacOS, но мы для определенности выбрали Linux)
  • Телефон с Android версии не ниже 1.7.39, либо iOS версии не ниже 1.6.41-343. Установите из Play Market приложение SmartThings, также нужно зарегистрировать бесплатный Samsung Account. Для этого не нужно обладать телефоном Samsung, привязывается просто к почте.
  • ESP8266 SDK. Как установить, написано в репозитарии, но в общем, всё очень просто:

    git clone https://github.com/espressif/ESP8266_RTOS_SDK.git

    И прописать путь к этому SDK в переменной IDF_PATH:

    nano ~/.bashrc
    export IDF_PATH="~/git/ESP8266_RTOS_SDK:$IDF_PATH"
  • Также понадобится установить библиотеки:

    sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing python-pyelftools

    И инструменты разработки (компилятор):

    sudo mkdir /opt/Espressif
    sudo chown username /opt/Espressif/
    cd /opt/Espressif
    wget https://dl.espressif.com/dl/xtensa-lx106-elf-linux64-1.22.0-100-ge567ec7-5.2.0.tar.gz
    tar -xzf ./xtensa-lx106-elf-linux64-1.22.0-100-ge567ec7-5.2.0.tar.gz
    cd xtensa-lx106-elf
    export PATH="/opt/Espressif/xtensa-lx106-elf/bin:$PATH"

  • Smart Things Device SDK C – библиотека на С. У нее есть свой репозиторий в github, но мы в целях обучения скачаем не саму библиотеку, а справочные материалы к ней, в которых и будут готовые примеры приложений.

    git clone https://github.com/SmartThingsCommunity/st-device-sdk-c-ref.git
    cd st-device-sdk-c-ref
    ./setup.sh esp8266


Руководство


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

Шаг 1. Регистрируем свое устройство.


Работа начинается в SmartThings Developer Workspace, где нужно залогиниться с помощью Samsung Account. Этот аккаунт создается бесплатно, и для его создания не обязательно иметь телефон Samsung. 



В Developer Workspace вам сразу же предлагают создать первый проект. Соглашаемся, после чего из двух вариантов проектов нужно выбрать Device Integration.



На выбор будут даны три варианта интеграции устройства: 

  • SmartThings Cloud Connector — для подключения устройств, имеющих собственное облако, которое будет связано с облаком SmartThings
  • SmartThings Hub — для устройств ZigBee, Z-Wave, Bluetooth, и на момент написания статьи недоступен, так как хаб официально пока не продается в России
  • Directly Connected – самый простой вариант для подключения напрямую, без каких-либо посредников. 

Выбираем третий вариант. Придумайте название проекта, например, для простоты — SmartSwitch.



Добавляем профиль устройства. Если говорить в терминах ООП, то профиль устройства – это такой «класс», а конкретное устройство – «экземпляр класса».

Нам нужно определить функциональные характеристики устройства в терминах SmartThings Capability («способностей»). О том, какие вообще «способности» устройства существуют, можно прочитать в инструкции.



Заполняем поля своими значениями. Для примера, имя профиля можно вписать Test Switch Profile, описание – любой текст, тип устройства – Switch, Vendor ID – любой текст. «Тип устройства» влияет на иконку вашего устройства и на пользовательский интерфейс. В списке не так много возможных типов устройств (хотя есть и экзотические, например WineCellar – винный шкаф), поэтому, если не найдете именно вашего – не расстраивайтесь и просто выберите наиболее близкое и похожее. На последнем экране (Dashboard Control) можно ничего не менять.

После создания профиля, не забудьте нажать на кнопку «Add device profile to project» вверху справа.



  • Важно: способность «Health Check» требуется для всех подключенных напрямую устройств. Добавьте её в профиль устройства. 
  • Для примера «Умный выключатель» понадобятся следующие способности: Switch, Health Check.

Теперь добавляем профиль аутентификации (Onboarding profile). Если вкратце, то в этом профиле вы можете кастомизировать экраны, появляющиеся при первом подключении и логине. Введите любое название и любое трехзначное число. Другие два экрана можно пока пропустить. На последнем экране выберите вариант подтверждения – Button Confirm – по нажатию кнопки на устройстве. В данном руководстве мы предполагаем, что вам досталась плата со встроенной кнопкой. Если вдруг кнопки нет (например, вы используете другой ESP-модуль), то можете выбрать вариант без аутентификации вовсе – он называется Just Works, то есть «просто работает» без лишних вопросов.

И опять же, по аналогии с предыдущим примером, не забудьте нажать кнопку «Add device onboarding to project».



Останется только нажать кнопку Deploy. После этого вы сможете увидеть ваше устройство в приложении SmartThings – но только в режиме разработчика (Developer Mode). Если Deploy не нажимается, и вам пишут «Please add a Model Name» — то это означает, что вы не указали Device Onboarding ID, промотайте страницу ниже и сделайте это – введите любое имя на ваше усмотрение.



Теперь вы можете начать тестирование вашего виртуального устройства на телефоне.

Весь первый шаг подробно показан в видео:


Регистрация устройства в облаке


Прежде, чем приступать к работе с собственно «железом», нужно сделать еще кое-что. После нажатия кнопки Deploy экран будет выглядеть иначе: там появится новое поле Device Identity. 


Для аутентификации вашего устройства в облаке SmartThings нужно ввести его серийный номер и публичный ключ (со схемой подписи ED25519). Это делается достаточно легко.

В этом примере показано, как создать пару ED25519-ключей при помощи инструмента в SDK. Вы получите файл device_info.json как результат работы программы в папке tools/keygen/linux/output_{ serialNumber}

Linux-версия кейгена расположена в st-iot-device-sdk-c-reference/iot-core/tools/keygen/linux либо в st-device-sdk-c/tools/keygen/linux

Серийный номер для тестового устройства будет сгенерирован случайным образом в формате STDK + [MNID] + буквенно-цифровой формат (8 символов). Свой MNID можно узнать в профиле разработчика, в разделе Manage Account. 





Далее, чтобы сгенерировать буквенно-цифровую часть, вам нужно ввести ваш MNID (4 символа) как парамер кейгена. В нижеприведенном примере MNID – это fJ*c.


    cd ~/Workspace/st-iot-device-sdk-c-ref/iot-core/tools/keygen
    ./stdk-keygen -m fJ*c
    Go Device Identity of Developer Workspace.
    
    Serial Number:
    -----------T----------¬
    ¦ STDKfJ*c    ¦ abed**5c   ¦
    L----------+-----------
    
    Public Key:
    waGgyjWIvHhF1LU***FG2hx/4u***ADFHr/ry0j5jbk=

Скопируйте «abed**5c» из выдачи кейгена, и вставьте в поля XXXXXXXX в разделе Device Identity Registration. Появится окно, в котором вас попросят ввести публичный ключ.


Скопируйте публичный ключ из выдачи кейгена («waGgyjWIvHhF1LU***FG2hx/4u***ADFHr/ry0j5jbk=» в этом примере) и вставьте в поле „Device Public Key“.



Шаг 2. Прошивка устройства


Поговорим о коде, который вы будете загружать в устройство.
Примеры прошивки находятся в папке st-device-sdk-c-ref/apps/esp8266/. Нас будет интересовать пример st_switch.

  • Скачайте onboarding_profile.json в окне обзора вашего устройства в кабинете разработчика.


  • Скопируйте скачанный файл onboarding_profile.json в директорию вашего приложения – в нашем случае apps/esp8266/st_switch/main.

    cd ~/Workspace/st-device-sdk-c-ref/apps/esp8266/st_switch/main/
    cp ~/Downloads/onboarding_profile.json .
    

    Там уже есть пример такого файла – просто замените его своим.
  • Аналогично, скопируйте файл device_info.json из папки tools/keygen/linux/output_{serialNumber}, в котором находится специфичная для устройства информация, в ту же папку, заменив существующий файл.

    cd ~/Workspace/st-device-sdk-c-ref/iot-core/tools/keygen/linux/
    cp output_{serialNumber}/device_info.json ~/Workspace/st-device-sdk-c-ref/apps/esp8266/st_switch/main/

    В этом файле помимо ключей и серийного номера есть строка „firmwareVersion“ – её можно заменить на версию вашей программы.
  • Теперь соберите и прошейте программу.

    cd ~/Workspace/st-device-sdk-c-ref
    ./build.sh esp8266 st_switch
    ./build.sh esp8266 st_switch flash
    ./build.sh esp8266 st_switch monitor

    Или то же самое, но покороче:

    cd ~/Workspace/st-device-sdk-c-ref
    ./build.sh esp8266 st_switch flash monitor


! Если у вас никак не получается прошить программу – скорее всего, вы забыли перевести плату ESP8266 в режим программирования. Это делается, как правило, нажатием кнопки на самой плате. Например, Wi-Fi Troyka модуль можно перевести, зажав кнопку PROG, и затем нажав и отпустив кнопку RESET.

После того, как закачается прошивка, не забудьте перезагрузить плату.

Шаг 3. Подключение и управление с телефона


Включите режим разработчика в приложении SmartThings на телефоне. Как это сделать, написано на официальном сайте, но проще объяснить словами: входите в настройки через «шестеренку», и жмете 20 секунд кнопку «Сведения о SmartThings». Внизу появится меню «Режим разработчика».



Наше устройство должно быть видно в списке в приложении SmartThings: запускаем приложение, нажимаем „плюс“ и „Добавить устройство“. Проматываем в конец списка вендоров и видим значок „My Testing Devices“. Нажимаем на него и выбираем своё устройство.



Более того: если вы уже активировали режим разработчика, и включили устройство, то у вас возникнет всплывающее меню, предлагающее добавить именно это устройство!

Начнется подключение:


Управление устройством из приложения SmartThings. 

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

Результат будет такой:



В этом примере (st-switch) вы управляете встроенным на плату светодиодом, нажимая на кнопку на самой плате. Как видите, для этого примера даже не нужно никакой дополнительной периферии, только сама плата ESP8266.

Вы также можете включать/выключать устройство кнопкой на панели управления в мобильном приложении:



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

Пример «Умная лампочка»


После того, как вы сделали пример «Умный выключатель», давайте попробуем всё немного усложнить. Будет RGB-светодиод, и включать/выключать будем внешней кнопкой, а также выбирать цвет через приложение.

Железо


Схема подключения будет простая:

И принципиальная схема тоже не помешает:



Если посмотреть исходник (находится по адресу: st-device-sdk-c-ref/apps/esp8266/st_lamp), то подключение там следующее:

#define GPIO_OUTPUT_NOTIFICATION_LED 2
#define GPIO_INPUT_BUTTON 5
#define GPIO_OUTPUT_COLORLED_R 16
#define GPIO_OUTPUT_COLORLED_G 14
#define GPIO_OUTPUT_COLORLED_B 12
#define GPIO_OUTPUT_COLORLED_0 13 


Вы можете переназначить выводы согласно тому, какая именно модель платы у вас. Обратите внимание, что на плате система обозначений одна (D1, D2…), а в коде другая, но в этом легко разобраться, просто глядя на документацию к вашей плате.

Программная часть


По программной части у нас поменяется несколько шагов:

  • При добавлении Capabilities нужно указать следующие: Switch, Switch Level, Color Control, Health Check. Тип устройства там будет — Light.
  • Пример прошивки берем из той же папки с примерами, называется он st_lamp

Интерфейс в приложении получится такой:



Как это выглядит в действии – еще раз гифка:



Заключение


Итак, вы получили готовый работающий пример. Вы видите, что большая часть кода уже сделана за вас – всё, что касается подключения, аутентификации, интерфейса устройства. Пример SmartThings ценен тем, что он не привязан ни к какому аппаратному устройству, и вы можете смотреть и оценивать, какой функционал платформы нужен в 2k20, если вы разрабатываете «Умный дом».


Татьяна Волкова — Автор учебной программы трека по Интернету вещей IT Академии Samsung, специалист по программам корпоративной социальной ответственности Исследовательского центра Samsung