Перейти к содержанию

Многофункциональный навык УДЯ на Zeit Now

Материал из Wiki yaboard
Внимание! Навык разрабатывался, как проверка своих способностей и опубликован как есть. Поэтому буду очень рад обратной связи при его тестировании. 100%-ная работа "без сучка и задоринки" не гарантируется=)

Предисловие

Сегодня рассмотрим вариант управления устройствами Умного дома Яндекс с помощью http-запросов с помощью собственного приватного навыка.

В данной статье представлено все, что нужно. Поэтому не стоит пугаться данного способа. Он максимально прост.

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

Что умеет навык?

  1. Управление устройствами с помощью http-запросов.
  2. Возможность добавления таких устройств, как "Выключатель", "Розетка", "Лампа", "Другое" (многофункциональное устройство).
  3. Принимать статус состояния устройств.
  4. Поддерживается следующие варианты подключения:
  • Blynk
  • IFTTT (кроме изменения значений Range или "ползунок" по нашему)
  • Any - устройства, управление которыми происходит посредством отправки http-запросов в различных форматах (вариативно) - Требуется тестирование

Что будем делать? (или кратко по шагам для нетерпеливых)

  1. Заливаем архив с навыком в свой репозиторий github
  2. Подключаем учетную запись github к Zeit Now
  3. Создаем навык УДЯ
  4. Настраиваем файл конфига устройств device.txt
В данной статье будет много информации, которая казалось бы на поверхности. Но не будем забывать, что многие сталкиваются с ваше указанными задачами без нужных знаний. Поэтому я постараюсь рассказать процесс как можно подробнее.

От слова к делу...

Регистрируемся на github.com

  1. Для начала скачаем файлы нашего навыка по ссылке
  2. Переходим по ссылке регистрации на github.
  3. Вводим Username (Имя пользователя), Email address (свой e-mail) и password (пароль) и нажимаем кнопку "Create account".
  4. Выбираем бесплатный аккаунт, нажав кнопку Choose Free
  5. На следующей странице можно выбрать для чего вы собираетесь использовать ваш аккаунт (а можно и не выбирать=)). Нажимаем кнопку Complete Setup после чего будет предложено проверить свой почтовый ящик на наличие письма активации.
  6. Переходим в почту и нажимаем на кнопку Verify email address в полученном письме.
  7. После перехода по ссылке будет предложено создать новый репозиторий. Для этого требуется ввести его имя-ссылку, обязательно указать, что репозиторий приватный (нам же не нужно, чтобы кто то видел наши токены и ссылки на устройства) и нажать Create repository
  8. Репозиторий создан, теперь в него требуется загрузить файлы нашего навыка. Это можно сделать установив git на пк, настроить, и заpushить в свой репозиторий. Шучу. Просто выбираем ссылку uploading an existing file, а потом ссылку choose your files
  9. Далее загружаем файлы указанные на скрине 3 ниже

Регистрируемся на Zeit Now и запускаем сервер

Теперь требуется подключить наш репозиторий к серверу Zeit Now.

  1. Для регистрации переходим по ссылке и выбираем Continue with GitHub
  2. Далее подключаем наш репозиторий нажав на кнопку Authorize Now by ZEIT
  3. В следующем окне заполняем требуемые данные и соглашаемся с сервисом, до того момента, пока он не предложит Create a new project (Создать новый проект), где мы выбираем From Git Repository
  4. Далее будет предложено установить модуль для связи с GitHub. Нажимаем Install Now For GitHub и выбираем Only select repositories, где из выпадающего списка выбираем свой репозиторий.
  5. Теперь жмем Install
  6. После подключения модуля нужно создать проект с нашим навыком. Нажимаем New Project From GitHub
  7. Выбираем наш репозиторий кнопкой Select и импортируем кнопкой Import
  8. Задаем имя проекта (посложнее, чтобы оно не пересекалось с другими именами проектов Zeit), корневую папку (ROOT) оставляем как есть.
  9. Если все в порядке, то индикатор проекта засветиться бирюзовым и появится ссылка на наш навык.

Создаем приватный навык УДЯ

Для создания навыка УДЯ требуется перейти в кабинет разработчика по ссылке.

  1. Нажимаем большую кнопку "Создать навык" и выбираем типа навыка "Умный дом"
  2. Заполняем информацию о навыке как указано на рисунках 2, 3, 4, где:
  • Указываем Endpoint URL - Url из раздела DOMAINS в кабинете ZEIT. При этом обязательно ставим https:// в начале.
  • Обязательно ставим галочку "Не показывать в каталоге", чтобы не пришлось проходить долгую модерацию и навык не попал в общий каталог.
  • Нажав кнопку "Изменить" указываем:

- Идентификатор приложения - любая строка (можно пару раз упасть головой на клавиатуру) - Секрет приложения - также как и идентификатор - URL авторизации - ссылка, которую указывали в Endpoint URL - URL для получения токена - ссылка вида: https://ссылка_навыка/token - URL для обновления токена - ссылка вида: https://ссылка_навыка/refresh - Идентификатор группы действий - read,home:lights Нажимаем "Сохранить" в окне "Создание связки аккаунтов" и в настройках нашего навыка.
После этого Диалоги попросят подтвердить указанную электронную почту и после подтверждения можно будет подать навык на модерацию. Модерация для приватных навыков происходит мгновенно. После модерации нажимаем "Опубликовать".
После всех действий навык должен появиться в списке навыков при добавлении устройств в УДЯ.


На данном этапе навык создан и работает. Можно перейти к его настройке.

Настройка навыка и добавление устройств

Первоначальная настройка очень проста. В файле config.py нужно указать префикс пользователя и токен для IFTTT (если он будет использоваться). Кроме того в файле есть строка blink_ip = "139.59.206.133", которую изначально лучше не трогать, но если Blynk не работает, т.е. устройства не реагируют нужно из своего местоположения (где приложение на смартфоне нормально отрабатывает) сделать ping blynk-cloud.com в командной строке ПК и вписать полученный IP-адрес в значение blink_ip. Если все работает эту строку лучше не трогать!!! И да на этом по настройке все.

Как редактировать конфиги для добавления устройств

Небольшое отступление.
Добавление устройств в навык происходит посредством прямого редактирования файла devices.txt, который должен находиться в корне репозитория GitHub.
Самый простой способ, который я вижу - это прямое редактирование в GitHub. Для этого нужно:

  • Перейти к своему репозиторию
  • Нажать файл для редактирования (в нашем случае devices.txt)
  • Нажать иконку с карандашом справа сверху
  • Отредактировать файл
  • Применить изменения кнопкой "Commit changes"
  • Подождать ~20-30 сек. Пока изменения применяться в Zeit Now

Добавляем устройства в device.txt

Итак, мы разобрались как редактировать файлы конфига. Теперь отредактируем файл device.txt.
Что нужно знать?

  • Одна строка = 1 устройство
  • Порядок параметров менять нельзя
  • Кавычки - это важно. Если их нет у параметра в примере - это тоже важно!
  • Если, что-то не работает - читать с п.1

Формат

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

"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Тип Выключатель","blynk","Номер пина V2","токен Blynk","nostatus"

Где:

  • "id-устройства" - идентификатор устройства, по которому УДЯ будет их различать. Например, "Blink002"
  • "Имя устройства" - Имя, с которым устройство будет отображаться в списке устройств. Например, "Выключатель"
  • "Описание" - Описание устройства. Например "Выключатель в комнате через Blynk"
  • "Комната" - Название комнаты, к которой относится устройство. Например, "Коридор"
  • "Разработчик" - Имя разработчика или компании. Например, "Домашний хэндмэйд".
  • "Модель" - модель устройства. Например, "BlNodemcu10"
  • "Вер.железа" - Версия сборки. Например "1.0"
  • "Вер. софта" - Версия прошивки. Например "2.00.15"
  • "Тип" - Тип устройства (как устройство будет определено в УДЯ).

В навыке есть 4 типа устройства:
Выключатель - устройство которое может быть включено или выключено.
Розетка - устройство которое может быть включено или выключено. Но определится как розетка.
Лампа - устройство-лампочка. Определится как лампа и будет иметь настройку яркости (кроме IFTTT).
Другое - другое многофункциональное устройство. Поддерживает некоторые настройки и расширяет возможности, но об этом чуть ниже.

  • "blynk" - тип подключения. Есть 3 варианта: "blynk", "ifttt", "any". Где "any" - управление через http-запросы, не подходящие под шаблон blynk и ifttt.

Перечисленные выше параметры по порядку идентичны для всех типов подключений.

  • "Номер пина" - Номер виртуального пина blynk. Например "V3"
  • "токен Blynk" - Токен от проекта blynk.
  • "nostatus" - Параметр запроса статуса устройства. Если "status" - то будем запрашивать текущее состояние устройства, любое другое значение (например "nostatus") - состояние не будет запрашиваться.


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

"UD-001","Выключатель","Выключатель Блинк","Комната","Компания Иванов+","BL100500","2.15","1.12.3","выключатель","blynk","V2","GYgyu7676HoiTig6t76G6t8","nostatus"

Также, для примера разберем, как будет выглядеть устройство "Лампа" управляемое типом "any", шаблон которого выглядит так:

"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Тип Лампа","any","ссылка на вкл","ссылка на выкл","status","ссылка на поиск статуса вкл/выкл","строка для поиска","ссылка на управление яркостью, заменить на --val--","ссылка на статус яркости",начальная строка поиска,конечная строка поиска

Предположим, что у нас есть определенный формат http-запроса, где:
http://anuapi.com/value-true - ссылка на включение устройства
http://anuapi.com/value-false - ссылка на выключение устройства
http://anuapi.com/status - ссылка на статус лампочки (включена или нет?), по которому возвращается какой то текст (например: {value:"on"} или {value:"off"})
http://anyapi.com/brigh/?val=50 - ссылка на изменение яркости на значение 50
http://anuapi.com/brigh/status - ссылка возвращающая значение яркости (например строку {value:"70"})
Строка описания устройства будет следующей:

"Noname02","Лампочка","Лампочка в туалете","Туалет","Левша","LampTula1","001","003","Лампа","any","http://anuapi.com/value-true","http://anuapi.com/value-false","status","http://anuapi.com/status","on","http://anyapi.com/brigh/?val=--val--","http://anuapi.com/brigh/status",value:","

в которой после ссылки на запрос статуса вкл/выкл устройства, мы указали строку включенного устройства, которую стоит искать в ответе. В данном случае "on". А в конце нашей строки указаны начальный и конечный шаблон для поиска значения яркости value:",". Что означает искать значение между value:" и между "
Также мы изменили значение 50 в ссылке на тэг --val-- для того, чтобы навык мог понять, в каком месте подставить полученное от УДЯ значение.

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

<button type="button" class="spoilers-button" aria-expanded="false">Все шаблоны можно посмотреть тут</button>

Вот так легко можно добавить свои устройства в навык. На самом деле тут нет ничего сложного, главное разобраться в формате записи=)
Да, на данный момент это выглядит "не очень", но дает возможность быстро и без труда заполнить список устройств. Возможно в будущем появится web-интерфейс для заполнения. А пока это тестовый вариант.

Многофункциональное устройство "Другое"

Многофункциональное устройство с типом "Другое" - это отдельный вид устройств в навыке, который дает большие возможности.
Для удобства записи функций шаблон такого устройства выглядит так:

"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Тип Другое","Имя файла с умениями Пр. other.txt"

Где после типа устройства ("Другое") мы будем использовать новый файл конфига с умениями, который указываем последним параметром в файле device.txt.
В конечном итоге строка для многофункционального устройства может выглядеть так:

"Anylamp-00","Хитрая лампа","Лампа с большими возможностями","Комната","ШизикИнтертейнмент","Alko11","09","03","Другое","anylamp.txt"

Тут мы создаем новый файл конфига для устройства с ID "Anylamp-00" под названием "anylamp.txt", в котором укажем все параметры для нее.
Файл мы также загружаем в корневую директорию репозитория.

Настраиваем "Другое" устройство

Многофункциональное устройство имеет 3 вида умений:

  • "on_off" - умение включать/выключать устройство
  • "toggle" - умение, при действии на которое можно получить одно текущее значение (например это кнопка)
  • "range" - изменение значения от минимального к максимальному и наоборот. Попросту - "ползунок" (например громкости, яркости). - Не работает с IFTTT


Предположим мы создали устройство с типом "Другое", к которому привязали файл конфига "other.txt". Теперь в данном файле (каждая строка - оно умение) создаем умение "on_off" для нашего устройства, которое управляется через blynk и статус нас не интересует. Шаблон будет таким:

"on_off","blynk","Номер пина","токен Blynk","nostatus"

Тут мы указываем тип умения "on_off", тип подключения "blynk", номер виртуального пина, например "V2", токен проекта blynk, что то вроде "GYUgu678T6g67OIjoijo8677tyg", и "nostatus", чтобы отключить статус, как уже писалось выше. В итоге получаем что-то такое:

"on_off","blynk","V2","GYUgu678T6g67OIjoijo8677tyg","nostatus"

Если с умением "on_off" все просто, то с умениями "toggle" и "range" чуть посложнее. Но это и прекрасно, т.к. это дает дополнительные возможности нашему устройству. Конкретно для этих умений Яндекс предлагает список "интенсов", т.е. конкретных указателей на параметры, представляемые в УДЯ для данных умений.
Для "toggle" есть следующие интенты:

  • "backlight" - подсветка
  • "controls_locked" - блокировка управления
  • "ionization" - ионизация
  • "keep_warm" - включение поддержания тепла
  • "mute" - режим "без звука"
  • "oscillation" - включение вращения
  • "pause" - пауза

Для "range" такие:

  • "brightness" - яркость в %
  • "open" - открытие в %
  • "humidity" - влажность в %
  • "temperature" - температура в градусах цельсия
  • "channel" - канал без ед. изм.
  • "volume" - громкость без ед. изм.

Рассмотрим на примере как создать умение "range" для управления влажностью. Шаблон выглядит так:

"range","humidity",0,100,10,"any","ссылка на управление", заменить на --val--","status","ссылка на статус",строка поиска начальная,строка поиска конечная

Расшифруем:

  • "range" - тип умения
  • "humidity" - интенс "Влажность" создаст "ползунок" с единицей измерения в %
  • 0 - (без кавычек) - минимальное значение влажности
  • 100 - (без кавычек) - максимальное значение влажности
  • 10 - (без кавычек) - шаг с которым будут происходить изменения
  • "any" - тип подключения нетипизированного http-запроса
  • "ссылка на управление" - ссылка типа http://anyapi.com/hum/?val=50, где 50 мы меняем на --val--
  • "status" - уже знакомое нам указание на то, что мы хотим получать текущее состояние.
  • "ссылка на статус" - ссылка, по которой придет ответ со значением влажности http://anyapi.com/hum/status
  • строка поиска начальная - (без кавычек) строка после которой искать значение влажности, например lue:"
  • строка поиска конечная - (без кавычек) строка до которой искать значение влажности, например "

В конечном итоге получим что-то такое:

"range","humidity",0,100,10,"any","http://anyapi.com/hum/?val=--val--","status","http://anyapi.com/hum/status",lue:","
<button type="button" class="spoilers-button" aria-expanded="false">Все шаблоны можно посмотреть тут</button>
Для каждого многофункционального устройства нужно создавать файл с умениями, который необходимо загружать в корень репозитория на GitHub, а его имя указывать  device.txt