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

Многофункциональный навык УДЯ на Zeit Now: различия между версиями

Материал из Wiki yaboard
Нет описания правки
Нет описания правки
 
(не показано 7 промежуточных версий 2 участников)
Строка 7: Строка 7:
Внимание! Навык разрабатывался для себя и опубликован как есть.  
Внимание! Навык разрабатывался для себя и опубликован как есть.  
Буду очень рад обратной связи при тестировании и доработках.  
Буду очень рад обратной связи при тестировании и доработках.  
100%-ная работа "без сучка и задоринки" не гарантируется =)
Работа "без сучка и задоринки" не гарантируется =)
</pre>
</pre>


Строка 29: Строка 29:
** "Лампа",  
** "Лампа",  
** "Другое" (кастомное многофункциональное устройство).
** "Другое" (кастомное многофункциональное устройство).
** "Сцена" - устройство-сцена, выполняющее отправку списка http-запросов при включении
* Принимать статусы состояния устройств.
* Принимать статусы состояния устройств.


Строка 144: Строка 145:




Первоначальная настройка очень проста. В файле '''''config.py''''' нужно указать префикс пользователя и токен для IFTTT (если он будет использоваться).
В файле '''config.py''' указываем префикс пользователя и токен для IFTTT (если он будет использоваться).
Кроме того в файле есть строка '''blynk_ip = "139.59.206.133"''', которую изначально лучше не трогать, но если Blynk не работает, т.е. устройства не реагируют нужно из своего местоположения (где приложение на смартфоне нормально отрабатывает) сделать ping blynk-cloud.com в командной строке ПК и вписать полученный IP-адрес в значение blynk_ip.  
 
'''Если все работает эту строку лучше не трогать!!!'''
{{#spoiler:show=Только, если Blynk не работает! | hide=Мне было просто интересно |
И да на этом по настройке все.
<pre>
Только если устройства, подключенные к Blynk, не реагируют!
 
Из своего местоположения (где приложение на смартфоне работает исправно) запускаем ping blynk-cloud.com в командной строке.
Показанный адрес вписываем в строку
blynk_ip = "полученный.нами.ip.адрес"
</pre>
}}
 
'''Если все работает - строку с blynk_ip лучше не трогать!!!''' Её значение должно оставаться как '''blynk_ip = "139.59.206.133"'''
 
Настройка завершена.
 
 
=== Как редактировать конфиги для добавления устройств ===
=== Как редактировать конфиги для добавления устройств ===
Небольшое отступление.<br>
 
Добавление устройств в навык происходит посредством прямого редактирования файла '''''devices.txt''''', который должен находиться в корне репозитория GitHub.
 
<br>
Устройства добавляются через редактирование файла '''devices.txt''' (должен находиться в корне репозитория GitHub).
Самый простой способ, который я вижу - это прямое редактирование в GitHub. Для этого нужно:
 
* Перейти к своему репозиторию
Самый простой способ - редактирование в GitHub. Для этого:
* Нажать файл для редактирования (в нашем случае '''''devices.txt''''')
* Перейдём к своему репозиторию;
* Нажать иконку с карандашом справа сверху
* Кликнем в файл для редактирования (в нашем случае '''devices.txt''');
* Отредактировать файл
* Жмём иконку с карандашом справа сверху;
* Применить изменения кнопкой '''"Commit changes"'''
* Редактируем файл;
* Подождать ~20-30 сек. Пока изменения применяться в Zeit Now
* Применяем изменения, нажав '''"Commit changes"''';
* Ждём ~20-30 сек (пока изменения применятся в Zeit Now).
 
 
<gallery>
<gallery>
Uya6.jpg|Выбираем файл
Uya6.jpg | Выбираем файл
Uya7.jpg|Редактируем
Uya7.jpg | Редактируем
Uya8.jpg|Сохраняем
Uya8.jpg | Сохраняем
</gallery>
</gallery>
=== Добавляем устройства в device.txt ===
=== Добавляем устройства в device.txt ===
Итак, мы разобрались как редактировать файлы конфига. Теперь отредактируем файл '''''device.txt'''''.<br>
Что нужно знать?
* Одна строка = 1 устройство
* Порядок параметров менять нельзя
* Кавычки - это важно. Если их нет у параметра в примере - это тоже важно!
* Если, что-то не работает - читать с п.1


==== Формат ====
 
Начнем с того, что разберемся, как выглядит одна строка для одного устройства.<br>
Отредактируем '''device.txt'''. Главные правила:
Например устройство blynk без запроса статуса:
# Одна строка = 1 устройство.
<pre>
# Порядок параметров менять нельзя.
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Тип Выключатель","blynk","Номер пина V2","токен Blynk","nostatus"
# Кавычки - это важно. Если их нет у параметра в примере - это тоже важно!
</pre>
 
Где:
Если что-то не работает - читать с пункта 1.
* ''"id-устройства"'' - идентификатор устройства, по которому УДЯ будет их различать. Например, "Blink002"
 
* ''"Имя устройства"'' - Имя, с которым устройство будет отображаться в списке устройств. Например, "Выключатель"
 
* ''"Описание"'' - Описание устройства. Например "Выключатель в комнате через Blynk"
==== Простейшее устройство Blynk без запроса статуса ====
* ''"Комната"'' - Название комнаты, к которой относится устройство. Например, "Коридор"
 
* ''"Разработчик"'' - Имя разработчика или компании. Например, "Домашний хэндмэйд".
 
* ''"Модель"'' - модель устройства. Например, "BlNodemcu10"
"id устройства", "Имя устройства", "Описание", "Комната", "Разработчик", "Модель", "Версия железа", "Версия ПО", "Выключатель", "blynk", "Номер пина V2", "токен Blynk", "nostatus"
* ''"Вер.железа"'' - Версия сборки. Например "1.0"
 
* ''"Вер. софта"'' - Версия прошивки. Например "2.00.15"
Разберём по параметрам:
* ''"Тип"'' - Тип устройства (как устройство будет определено в УДЯ).
* '''"id устройства"''' - идентификатор, по которому УДЯ будет их различать (например, "Blink002").
В навыке есть 4 типа устройства:<br>
* '''"Имя устройства"''' - так устройство будет отображаться в списке устройств (например, "Выключатель").
'''Выключатель''' - устройство которое может быть включено или выключено.<br>
* '''"Описание"''' - например, "Выключатель верхнего света в комнате через Blynk".
'''Розетка''' - устройство которое может быть включено или выключено. Но определится как розетка.<br>
* '''"Комната"''' - комната, к которой относится устройство (например, "Коридор").
'''Лампа''' - устройство-лампочка. Определится как лампа и будет иметь настройку яркости (кроме IFTTT).<br>
* '''"Разработчик"''' - Имя разработчика или компании. Например, "Домашний хэндмэйд".
'''Другое''' - другое многофункциональное устройство. Поддерживает некоторые настройки и расширяет возможности, но об этом чуть ниже.<br>
* '''"Модель"''' - модель устройства. Например, "BlNodemcu10"
* ''"blynk"'' - тип подключения. Есть 3 варианта: "blynk", "ifttt", "any". Где "any" - управление через http-запросы, не подходящие под шаблон blynk и ifttt.
* '''"Вер.железа"''' - Версия сборки. Например "1.0"
'''''Перечисленные выше параметры по порядку идентичны для всех типов подключений.'''''
* '''"Вер. софта"''' - Версия прошивки. Например "2.00.15"
* ''"Номер пина"'' - Номер виртуального пина blynk. Например "V3"
* '''"Тип"''' - Тип устройства (как устройство будет определено в УДЯ).
* ''"токен Blynk"'' - Токен от проекта blynk.
 
* ''"nostatus"'' - Параметр запроса статуса устройства. Если "status" - то будем запрашивать текущее состояние устройства, любое другое значение (например "nostatus") - состояние не будет запрашиваться.
Всего в навыке предусмотрено 4 типа устройства:
<br>
* '''Выключатель''' - устройство которое может быть включено или выключено.<br>
В итоге, заполнив вышеуказанный шаблон мы должны получить что то вроде этого:
* '''Розетка''' - устройство которое может быть включено или выключено. Но определится как розетка.<br>
<pre>
* '''Лампа''' - устройство-лампочка. Определится как лампа и будет иметь настройку яркости (кроме IFTTT).<br>
"UD-001","Выключатель","Выключатель Блинк","Комната","Компания Иванов+","BL100500","2.15","1.12.3","выключатель","blynk","V2","GYgyu7676HoiTig6t76G6t8","nostatus"
* '''Другое''' - другое многофункциональное устройство. Поддерживает некоторые настройки и расширяет возможности, но об этом чуть ниже.<br>
</pre>
* '''"blynk"''' - тип подключения. Есть 3 варианта: "blynk", "ifttt", "any". Где "any" - управление через http-запросы, не подходящие под шаблон blynk и ifttt.
Также, для примера разберем, как будет выглядеть устройство "Лампа" управляемое типом "any", шаблон которого выглядит так:
Перечисленные выше параметры по порядку идентичны для всех типов подключений. Дальше:
<pre>
* '''"Номер пина"''' - Номер виртуального пина blynk. Например "V3"
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Тип Лампа","any","ссылка на вкл","ссылка на выкл","status","ссылка на поиск статуса вкл/выкл","строка для поиска","ссылка на управление яркостью, заменить на --val--","ссылка на статус яркости",начальная строка поиска,конечная строка поиска
* '''"токен Blynk"''' - Токен от проекта blynk.
</pre>
* '''"nostatus"''' - Параметр запроса статуса устройства. Если значение="status" - то будем запрашивать текущее состояние устройства, любое другое значение (например "nostatus") - состояние не будет запрашиваться.
 
 
Заполнив шаблон, получим подобное этой строке:
"UD-001", "Выключатель", "Выключатель Блинк", "Комната", "Компания Иванов+", "BL100500", "2.15", "1.12.3", "выключатель", "blynk", "V2", "GYgyu7676HoiTig6t76G6t8", "nostatus"
 
 
==== Устройство "Лампа", управляемое типом "any" ====
 
 
Разберём более сложный пример:
"id устройства", "Имя устройства", "Описание", "Комната", "Разработчик", "Модель", "Версия железа", "Версия софта", "Лампа", "any", "ссылка на вкл", "ссылка на выкл", "status", "ссылка на поиск статуса вкл/выкл", "строка для поиска", "ссылка на управление яркостью, заменить на --val--", "ссылка на статус яркости", начальная строка поиска, конечная строка поиска, 250
 
Предположим, что у нас есть определенный формат http-запроса, где:
Предположим, что у нас есть определенный формат http-запроса, где:
<br>
* '''http://anuapi.com/value-true''' - ссылка на включение устройства;
http://anuapi.com/value-true - ссылка на включение устройства<br>
* '''http://anuapi.com/value-false''' - ссылка на выключение устройства;
http://anuapi.com/value-false - ссылка на выключение устройства<br>
* '''http://anuapi.com/status''' - ссылка на статус лампочки (включена или нет?), по которому возвращается какой то текст (например: {value:"on"} или {value:"off"});
http://anuapi.com/status - ссылка на статус лампочки (включена или нет?), по которому возвращается какой то текст (например: {value:"on"} или {value:"off"})<br>
* '''http://anyapi.com/brigh/?val=50''' - ссылка на изменение яркости на значение 50;
http://anyapi.com/brigh/?val=50 - ссылка на изменение яркости на значение 50<br>
* '''http://anuapi.com/brigh/status''' - ссылка возвращающая значение яркости (например строку {value:"70"});
http://anuapi.com/brigh/status - ссылка возвращающая значение яркости (например строку {value:"70"})<br>
* '''250''' - максимальный предел уровня яркости на устройстве (для некоторых светодиодных лент удобнее использовать не 100%, а уровень 255)
Строка описания устройства будет следующей:
 
<pre>
Получим строку такого вида:
"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:","
"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:",", 250
</pre>
в которой после ссылки на запрос статуса вкл/выкл устройства, мы указали:
в которой после ссылки на запрос статуса вкл/выкл устройства, мы указали строку включенного устройства, которую стоит искать в ответе. В данном случае '''"on"'''. А в конце нашей строки указаны начальный и конечный шаблон для поиска значения яркости '''value:","'''. Что означает искать значение между value:" и между "<br>
* строку включенного устройства, которую стоит искать в ответе (в данном случае '''"on"''');
Также мы изменили значение 50 в ссылке на тэг --val-- для того, чтобы навык мог понять, в каком месте подставить полученное от УДЯ значение.
* в конце - начальный и конечный шаблон для поиска значения яркости '''value:","''' (искать нужное значение между '''value:"''' и '''"''');
<br>
* заменили значение 50 в ссылке на тэг --val-- (чтобы навык мог понять, куда подставить полученное от УДЯ значение).
 


'''Важно! Эти значения записываются без кавычек, т.к. зачастую кавычка - это крайний символ для поиска. Поэтому формат немного отличается.'''
'''Важно! Эти значения записываются без кавычек, т.к. зачастую кавычка - это крайний символ для поиска. Поэтому формат немного отличается.'''
<br>
 
 
{{#spoiler:show=Все шаблоны можно посмотреть тут | hide=Спрятать |
{{#spoiler:show=Все шаблоны можно посмотреть тут | hide=Спрятать |
<pre>
<pre>
# Без статуса (IFTTT):
Без статуса (IFTTT):
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Выключатель","ifttt","хук вкл","хук выкл","nostatus"
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Розетка","ifttt","хук вкл","хук выкл","nostatus"
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Лампа","ifttt","хук вкл","хук выкл","nostatus"


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


"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Тип Розетка","ifttt","хук вкл","хук выкл","nostatus"
Без статуса (Any):
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Выключатель","any","ссылка на вкл","ссылка на выкл","nostatus"
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Розетка","any","ссылка на вкл","ссылка на выкл","nostatus"
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Лампа","any","ссылка на вкл","ссылка на выкл","nostatus","ссылка на управление яркостью, заменить на --val--",250


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


# Без статуса (Blynk):
Со статусом(IFTTT):
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Выключатель","ifttt","хук вкл","хук выкл","status","ссылка на статус","строка для поиска"
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Розетка","ifttt","хук вкл","хук выкл","status","ссылка на статус","строка для поиска"
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Лампа","ifttt","хук вкл","хук выкл","status","ссылка на статус","строка для поиска"
 
Со статусом (Blynk):
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Выключатель","blynk","Номер пина V2","токен Blynk","status"
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Розетка","blynk","Номер пина V2","токен Blynk","status"
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Лампа","blynk","Номер пина V2","токен Blynk","status","Номер пина яркости V3"
 
Со статусом (Any):
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Выключатель","any","ссылка на вкл","ссылка на выкл","status","ссылка на поиск статуса вкл/выкл","строка для поиска"
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Розетка","any","ссылка на вкл","ссылка на выкл","status","ссылка на поиск статуса вкл/выкл","строка для поиска"
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Лампа","any","ссылка на вкл","ссылка на выкл","status","ссылка на поиск статуса вкл/выкл","строка для поиска","ссылка на управление яркостью, заменить на --val--","ссылка на статус яркости",начальная строка поиска,конечная строка поиска,250
 
Другое устройство:
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Другое","Имя файла с умениями Пр. other.txt"
 
Устройство-сцена:
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Сцена","Имя файла с умениями Пр. sceneone.txt"
</pre>
}}
 
Вот так легко добавляются устройства, главное - разобраться в формате записи =)
В текущей версии запись выглядит "не очень", зато даёт возможность быстро и без труда заполнить список устройств. В будущем, возможно, добавится и web-интерфейс для заполнения.


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


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


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


# Без статуса (Any):


"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Тип Выключатель","any","ссылка на вкл","ссылка на выкл","nostatus"
Это отдельный вид устройств в навыке, который дает большие возможности, а именно - задать одному устройству несколько функций (например: выключатель, кнопки и несколько ползунков - яркость, канал, громкость и т.п.)<br>
Для удобства записи функций шаблон такого устройства выглядит так:


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


"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Тип Лампа","any","ссылка на вкл","ссылка на выкл","nostatus","ссылка на управление яркостью, заменить на --val--"
где после типа устройства ("Другое") мы будем использовать новый файл конфига с умениями, который указываем последним параметром в файле '''''device.txt'''''. В конечном итоге строка для многофункционального устройства может выглядеть так:
"Anylamp-00","Хитрая лампа","Лампа с большими возможностями","Комната","ШизикИнтертейнмент","Alko11","09","03","Другое","anylamp.txt"


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


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


"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Тип Розетка","ifttt","хук вкл","хук выкл","status","ссылка на статус","строка для поиска"
"Другое" имеет 3 вида умений:
* '''"on_off"''' - умение включать/выключать устройство;
* '''"toggle"''' - умение, при действии на которое можно получить одно текущее значение (например это кнопка);
* '''"range"''' - изменение значения от минимального к максимальному и наоборот. Попросту - "ползунок" (например громкости, яркости). - ''Не работает с IFTTT'';
* '''"color_setting"''' - управление RGB. - ''Не работает с IFTTT'', ''для ANY не поддерживается обработка статуса''.


"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Тип Лампа","ifttt","хук вкл","хук выкл","status","ссылка на статус","строка для поиска"
Предположим, мы создали файл конфига "other.txt". В данном файле (каждая строка - одно умение) создаем умение "on_off" для нашего устройства, которое управляется через blynk, и статус этого умения нас не интересует. Наш шаблон:


# Со статусом (Blynk):
"тип умения","тип подключения","номер пина","токен Blynk","nostatus"


"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Тип Выключатель","blynk","Номер пина V2","токен Blynk","status"
Заполним шаблон:
* Тип умения '''"on_off"''',  
* Тип подключения '''"blynk"''',  
* Номер виртуального пина (например '''"V2"'''),  
* Токен проекта blynk (что-то вроде '''"GYUgu678T6g67OIjoijo8677tyg"'''),  
* Отсутствие запроса статуса '''"nostatus"'''.


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


"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Тип Лампа","blynk","Номер пина V2","токен Blynk","status","Номер пина яркости V3"
С умениями '''"toggle"''' и '''"range"''' чуть сложнее, зато они добавляют мощные возможности. Для них Яндекс предлагает целый список "instance" (функций в этом умении).


# Со статусом (Any):
* Функции для "toggle" (что можно переключать):
** '''"backlight"''' - подсветка
** '''"controls_locked"''' - блокировка управления
** '''"ionization"''' - ионизация
** '''"keep_warm"''' - включение поддержания тепла
** '''"mute"''' - режим "без звука"
** '''"oscillation"''' - включение вращения
** '''"pause"''' - пауза


"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Тип Выключатель","any","ссылка на вкл","ссылка на выкл","status","ссылка на поиск статуса вкл/выкл","строка для поиска"
* Функции для "range" (что можно регулировать плавно):
** '''"brightness"''' - яркость (в процентах)
** '''"open"''' - открытие (в процентах)
** '''"humidity"''' - влажность (в процентах)
** '''"temperature"''' - температура (в градусах Цельсия)
** '''"channel"''' - канал (без единиц измерения)
** '''"volume"''' - громкость (без единиц измерения)


"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Тип Розетка","any","ссылка на вкл","ссылка на выкл","status","ссылка на поиск статуса вкл/выкл","строка для поиска"
Для примера создадим умение "range" с функцией "влажность". Наш шаблон:
"умение","функция",0,100,10,"any","ссылка на управление (заменить число на --val--)","status","ссылка на статус",строка поиска начальная,строка поиска конечная,150


"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Тип Лампа","any","ссылка на вкл","ссылка на выкл","status","ссылка на поиск статуса вкл/выкл","строка для поиска","ссылка на управление яркостью, заменить на --val--","ссылка на статус яркости",начальная строка поиска,конечная строка поиска
Расшифруем:
* '''умение''' - "on_off", "range", итд;
* '''функция''' - в нашем случае "Влажность", создастся "ползунок" с единицами в процентах;
* '''0''' (без кавычек) - минимальное значение влажности
* '''100''' (без кавычек) - максимальное значение влажности
* '''10''' (без кавычек) - шаг с которым будут происходить изменения
* '''"any"''' - подключение нетипизированного http-запроса
* '''"ссылка на управление"''' - ссылка типа http://anyapi.com/hum/?val=50, где 50 мы меняем на '''--val--'''
* '''"status"''' - уже знакомое нам указание на то, что мы хотим получать текущее состояние.
* '''"ссылка на статус"''' - ссылка, по которой придет ответ со значением влажности http://anyapi.com/hum/status
* '''строка поиска начальная''' (без кавычек) - строка после которой искать значение влажности, например lue:"
* '''строка поиска конечная''' (без кавычек) - строка до которой искать значение влажности, например "
* '''150''' (без кавычек) - максимальное значение влажности на устройстве (если нужно маппить значения и они разняться с максимальными в УДЯ)
Получим что-то такое:
"range","humidity",0,100,10,"any","http://anyapi.com/hum/?val=--val--","status","http://anyapi.com/hum/status",lue:",",150


# Другое устройство:
Теперь рассмотрим функцию "color_setting" для управления RGB-подсветкой для устройства со сторонним api. Шаблон выглядит так:
"color_setting",255,255,255,"any","ссылка на управление (заменить значение red на --vr-- / green на --vg-- / blue на --vb--)","nostatus"


"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Тип Другое","Имя файла с умениями Пр. other.txt"
Расшифруем:
</pre>
* '''"color_setting"''' - наша функция (instance)
}}
* '''255''' (без кавычек) - максимальное значение красного (на случай, если не 255, а 100. Например, у меня для понижения расхода питания);
Вот так легко можно добавить свои устройства в навык. На самом деле тут нет ничего сложного, главное разобраться в формате записи=)<br>
* '''255''' (без кавычек) - максимальное значение зеленого (на случай, если не 255);
Да, на данный момент это выглядит "не очень", но дает возможность быстро и без труда заполнить список устройств. Возможно в будущем появится web-интерфейс для заполнения. А пока это тестовый вариант.<br>
* '''255''' (без кавычек) - максимальное значение синего (на случай, если не 255);
После того как вы заполнили все строки для всех устройств, можно сохранить device.txt и проверить в навыке, появились ли устройства. Для этого просто попробуйте их добавить в УДЯ.
* '''"any"''' - тип подключения нетипизированного http-запроса;
* '''"ссылка на управление"''' - ссылка типа http://anyapi.com/hum/?val=50&val=150&val=100, где 50 мы меняем на '''--vr--''', 150 мы меняем на '''--vg--''', 100 мы меняем на '''--vb--''' (r,g,b);
* '''"nostatus"''' - указываем, что не хотим получать текущее состояние.
Получим что-то такое:
"color_setting",255,255,255,"any","http://anyapi.com/hum/?val=--vr--&val=--vg--&val=--vb--","nostatus"


=== Многофункциональное устройство "Другое" ===
Многофункциональное устройство с типом "Другое" - это отдельный вид устройств в навыке, который дает большие возможности, а именно - задать одному устройству несколько функций (например: выключатель, кнопки и несколько ползунков - яркость, канал, громкость и т.п.)<br>
Для удобства записи функций шаблон такого устройства выглядит так:
<pre>
"id-устройства","Имя устройства","Описание","Комната","Разработчик","Модель","Вер.железа","Вер.софта","Тип Другое","Имя файла с умениями Пр. other.txt"
</pre>
Где после типа устройства ("Другое") мы будем использовать новый файл конфига с умениями, который указываем последним параметром в файле '''''device.txt'''''.<br>
В конечном итоге строка для многофункционального устройства может выглядеть так:
<pre>
"Anylamp-00","Хитрая лампа","Лампа с большими возможностями","Комната","ШизикИнтертейнмент","Alko11","09","03","Другое","anylamp.txt"
</pre>
Тут мы создаем новый файл конфига для устройства с ID "Anylamp-00" под названием "anylamp.txt", в котором укажем все параметры для нее.<br>
Файл мы также загружаем в корневую директорию репозитория.
==== Настраиваем "Другое" устройство ====
Многофункциональное устройство имеет 3 вида умений:
* '''"on_off"''' - умение включать/выключать устройство
* '''"toggle"''' - умение, при действии на которое можно получить одно текущее значение (например это кнопка)
* '''"range"''' - изменение значения от минимального к максимальному и наоборот. Попросту - "ползунок" (например громкости, яркости). - ''Не работает с IFTTT''
* '''"color_setting"''' - управление RGB. - ''Не работает с IFTTT'', ''для ANY не поддерживается обработка статуса''
<br>
Предположим мы создали устройство с типом "Другое", к которому привязали файл конфига "other.txt". Теперь в данном файле (каждая строка - оно умение) создаем умение "on_off" для нашего устройства, которое управляется через blynk и статус нас не интересует. Шаблон будет таким:
<pre>
"on_off","blynk","Номер пина","токен Blynk","nostatus"
</pre>
Тут мы указываем тип умения '''"on_off"''', тип подключения '''"blynk"''', номер виртуального пина, например '''"V2"''', токен проекта blynk, что то вроде '''"GYUgu678T6g67OIjoijo8677tyg"''', и '''"nostatus"''', чтобы отключить статус, как уже писалось выше. В итоге получаем что-то такое:
<pre>
"on_off","blynk","V2","GYUgu678T6g67OIjoijo8677tyg","nostatus"
</pre>
Если с умением "on_off" все просто, то с умениями "toggle" и "range" чуть посложнее. Но это и прекрасно, т.к. это дает дополнительные возможности нашему устройству. Конкретно для этих умений Яндекс предлагает список "интенсов", т.е. конкретных указателей на параметры, представляемые в УДЯ для данных умений.<br>
'''''Для "toggle" есть следующие интенты:'''''
* "backlight" - подсветка
* "controls_locked" - блокировка управления
* "ionization" - ионизация
* "keep_warm" - включение поддержания тепла
* "mute" - режим "без звука"
* "oscillation" - включение вращения
* "pause" - пауза
'''''Для "range" такие:'''''
* "brightness" - яркость в %
* "open" - открытие в %
* "humidity" - влажность в %
* "temperature" - температура в градусах цельсия
* "channel" - канал без ед. изм.
* "volume" - громкость без ед. изм.
Рассмотрим на примере как создать умение "range" для управления влажностью. Шаблон выглядит так:
<pre>
"range","humidity",0,100,10,"any","ссылка на управление", заменить на --val--","status","ссылка на статус",строка поиска начальная,строка поиска конечная,150
</pre>
Расшифруем:<br>
* "range" - тип умения
* "humidity" - интенс "Влажность" создаст "ползунок" с единицей измерения в %
* 0 - (без кавычек) - минимальное значение влажности
* 100 - (без кавычек) - максимальное значение влажности
* 10 - (без кавычек) - шаг с которым будут происходить изменения
* "any" - тип подключения нетипизированного http-запроса
* "ссылка на управление" - ссылка типа http://anyapi.com/hum/?val=50, где 50 мы меняем на '''--val--'''
* "status" - уже знакомое нам указание на то, что мы хотим получать текущее состояние.
* "ссылка на статус" - ссылка, по которой придет ответ со значением влажности http://anyapi.com/hum/status
* строка поиска начальная - (без кавычек) строка после которой искать значение влажности, например lue:"
* строка поиска конечная - (без кавычек) строка до которой искать значение влажности, например "
* 150 - (без кавычек) - максимальное значение влажности на устройстве (если нужно маппить значения и они разняться с максимальными в УДЯ)
В конечном итоге получим что-то такое:
<pre>
"range","humidity",0,100,10,"any","http://anyapi.com/hum/?val=--val--","status","http://anyapi.com/hum/status",lue:",",150
</pre>
Также рассмотрим, как создать умение "color_setting" для управления RGB-подсветкой для устройства со сторонним api. Шаблон выглядит так:
<pre>
"color_setting",255,255,255,"any","ссылка на управление. заменить значение red на --vr-- значение green на --vg-- значение blue на --vb--","nostatus"
</pre>
Расшифруем:<br>
* "color_setting" - тип умения
* 255 - (без кавычек) - максимальное значение красного цвета (на случай, если не 255, а 100. Вдруг у кого то другие значения, как у меня для понижения расхода питания)
* 255 - (без кавычек) - максимальное значение зеленого цвета (на случай, если не 255)
* 255 - (без кавычек) - максимальное значение синего цвета (на случай, если не 255)
* "any" - тип подключения нетипизированного http-запроса
* "ссылка на управление" - ссылка типа http://anyapi.com/hum/?val=50&val=150&val=100, где 50 мы меняем на '''--vr--''', 150 мы меняем на '''--vg--''', 100 мы меняем на '''--vb--''' (r,g,b)
* "nostatus" - указание на то, что мы не хотим получать текущее состояние.
В конечном итоге получим что-то такое:
<pre>
"color_setting",255,255,255,"any","http://anyapi.com/hum/?val=50&val=150&val=100","nostatus"
</pre>
{{#spoiler:show=Все шаблоны можно посмотреть тут | hide=Спрятать |
{{#spoiler:show=Все шаблоны можно посмотреть тут | hide=Спрятать |
<pre>
<pre>
Строка 374: Строка 394:
"toggle","backlight","blynk","Номер пина","токен Blynk","nostatus"
"toggle","backlight","blynk","Номер пина","токен Blynk","nostatus"
"range","humidity",0,100,10,"blynk","Номер пина V3","токен Blynk","nostatus",255 тут 0 - минимальное значение, 100 - максимальное, 10 - шаг,255 - максимальное значение на устройстве
"range","humidity",0,100,10,"blynk","Номер пина V3","токен Blynk","nostatus",255 тут 0 - минимальное значение, 100 - максимальное, 10 - шаг,255 - максимальное значение на устройстве
"color_setting",100,100,100,"blynk","Номер пина V3","токен Blynk","nostatus"


Без статуса (Any):
Без статуса (Any):
Строка 379: Строка 400:
"toggle","backlight","any","ссылка на вкл","nostatus"
"toggle","backlight","any","ссылка на вкл","nostatus"
"range","brightness",0,100,10,"any","ссылка на управление. заменить на --val--","nostatus",255
"range","brightness",0,100,10,"any","ссылка на управление. заменить на --val--","nostatus",255
"color_setting",255,255,255,"any","http://anyapi.com/hum/?val=--vr--&val=--vg--&val=--vb--","nostatus"


Со статусом(IFTTT):
Со статусом(IFTTT):
Строка 388: Строка 410:
"toggle","backlight","blynk","Номер пина","токен Blynk","status"
"toggle","backlight","blynk","Номер пина","токен Blynk","status"
"range","humidity",0,100,10,"blynk","Номер пина V3","токен Blynk","status",255 тут 0 - минимальное значение, 100 - максимальное, 10 - шаг, 255 - максимальное значение на устройстве
"range","humidity",0,100,10,"blynk","Номер пина V3","токен Blynk","status",255 тут 0 - минимальное значение, 100 - максимальное, 10 - шаг, 255 - максимальное значение на устройстве
"color_setting",100,100,100,"blynk","Номер пина V3","токен Blynk","status"


Со статусом (Any):
Со статусом (Any):
Строка 396: Строка 419:
</pre>
</pre>
}}
}}
Напомним: для каждого вида многофункционального устройства создаётся свой файл с умениями, который нужно загрузить в корень репозитория на GitHub, а его имя указывать в описании в device.txt
==== Устройство-сцена ====
Это специальные решения для выполнения нескольких http-запросов одновременно. При включении "устройства" происходит отправка нескольких запросов из указанного в devices.txt файла (Пример: sceneone.txt)
Для добавления устройства вносим в devices.txt строку типа:
"Noname03", "Сцена", "сцена для проверки", "Сценарии", "User", "Scen1", "001", "003", "Сцена", "sceneone.txt"
В корневой папке создать файл (в примере - sceneone.txt), в котором в несколько строк указать ссылки на вебхуки-действия (одна строка - один вебхук). Пример заполнения файла:
http://anyapi.com/hum/?val=1
http://anyapi.com/hum/?val=2
http://anyapi.com/hum/?val=true
http://anyapi.com/hum/?val=false
== Некоторые вопросы и ответы ==
<pre class="red">
<pre class="red">
Для каждого многофункционального устройства нужно создавать файл с умениями, который необходимо загружать в корень репозитория на GitHub, а его имя указывать  device.txt
ЕЩЁ РАЗ: навык разрабатывался для себя, для проверки себя и главным критерием - сервиса, на котором можно контролировать работу навыка (поэтому Zeit Now); а главным требованием - простота добавления устройств и универсальность.<br>
</pre>
</pre>


== Послесловие ==
Еще раз (не устану))) напомню, что навык разрабатывался для себя, для проверки себя и главными критериями было - сервис, на котором можно контролировать работу навыка (поэтому Zeit Now), простота добавления устройств, универсальность.<br>
'''''Некоторые вопросы, которые возможно возникнут и на них есть ответ:'''''
'''В: Почему IFTTT не поддерживает "range"?'''<br>


''О: Во-первых, потому что у IFTTT другой формат передачи value и он пока не укладывался в голове(возможно потом). Во-вторых, в голову пока не пришло устройств, которые бы поддерживали прием вариативных значений по IFTTT, поэтому не увидел смысла.''<br><br>
=== Почему IFTTT не поддерживает "range"? ===
 
Во-первых, потому что у IFTTT другой формат передачи value и он пока не укладывался в голове(возможно потом). Во-вторых, в голову пока не пришло устройств, которые бы поддерживали прием вариативных значений по IFTTT, поэтому не увидел смысла.
 
=== Почему для IFTTT токен задается в config.py, а для blynk в каждом устройстве/умении? ===
 
 
Потому что аккаунт IFTTT обычно один, а у Blynk проектов с разными токенами может быть много.
 
 
=== Устройства не видны (видны, но УДЯ выдаёт ошибки) ===
 
 
Если навык определился успешно, но устройства не видны - скорее всего, вы их неправильно указали в device.txt или не указали вовсе. Совет: перечитать статью и проверить формат записи строк. Если видны, но есть ошибки, то есть смысл попробовать удалить устройство или отвязать и привязать заново аккаунт. Возможно при ваших последних изменениях параметры не прогрузились в УДЯ.
 
 
=== Как задаются token и code для запросов Яндекса? ===
 
 
Они генерируются при запуске сервера, так сделано для удобства.
 
 
=== Не могу добавить две яркости в одном устройстве ===
 
 
По стандарту УДЯ можно добавить только одно умение с одноименной функцией. То есть, одну "яркость", одну "влажность", один ползунок "громкости".
 
 
=== Формат IFTTT... что такое "хук вкл", "хук выкл" в device.txt? ===
 
 
Это названия вебхуков, которые вы задаете в IFTTT. Например "relayON". В остальном принцип схож с шаблонами any. При этом запрос статуса IFTTT-устройств происходит через сторонний http-запрос (если такой имеется).


'''В: Почему для IFTTT токен задается сразу в config.py, а для blynk в каждом устройстве/умении?'''<br>
Ну и наконец, надеюсь, что у вас все получится при создании собственного навыка, а если нет - буду очень рад обратной связи:
''О: Потому что аккаунт IFTTT обычно один, а у Blynk проектов с разными токенами может быть много.''<br>
* e-mail: [mailto:vkeduardyo@yandex.ru vkeduardyo@yandex.ru]
<br>
* telegram: [//t.me/Xottabb14 @Xottabb14]
'''В: Навык определился, но устройства не видны/видны но УДЯ показывает ошибки.'''<br>
''О: Если устройства не видны, то скорей всего вы их неправильно указали в device.txt или не указали вовсе. Совет: перечитать статью и проверить формат записи строк. Если видны, но есть ошибки, то есть смысл попробовать удалить устройство или отвязать и привязать заново аккаунт. Возможно при ваших последних изменениях параметры не прогрузились в УДЯ.''<br>
<br>
'''В: Как задается token и code для запросов Яндекса?'''<br>
''О: Токен и код генерируются при запуске сервера. Сделано для удобства.''
<br>
<br>
'''В: Пытаюсь добавить два интенса яркости, но они не появляются в устройстве.'''<br>
''О: Яндекс позволяет добавить только одно умение с одноименным интенсом. Т.е. Одну "яркость", одну "влажность", один ползунок "громкости".''
<br>
<br>
'''В: Про формат IFTTT ничего не написал. Что такое "хук вкл","хук выкл" в device.txt?'''<br>
''О: Согласен, упустил. Это названия webhook, которые вы задаете в ifttt. Например "relayON". В остальном принцип схож с шаблонами any. При этом запрос статуса ifttt-устройств происходит через сторонний http-запрос (если таковой имееется)''
<br>
<br>
Ну и наконец, надеюсь, что у вас все получится при создании собственного навыка, а если нет<br>
Буду очень рад обратной связи:
e-mail: [http://mailto:vkeduardyo@yandex.ru vkeduardyo@yandex.ru]
telegram: [https://t.me/Xottabb14 @Xottabb14]




[[Category:Умный дом]]
[[Category:Умный дом]]

Текущая версия от 11:38, 15 марта 2020

Внимание! Навык разрабатывался для себя и опубликован как есть. 
Буду очень рад обратной связи при тестировании и доработках. 
Работа "без сучка и задоринки" не гарантируется =)

Предисловие

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

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

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

Навык умеет:

  • Управлять устройствами через http-запросы.
  • Поддерживать такие типы устройств, как:
    • "Выключатель",
    • "Розетка",
    • "Лампа",
    • "Другое" (кастомное многофункциональное устройство).
    • "Сцена" - устройство-сцена, выполняющее отправку списка http-запросов при включении
  • Принимать статусы состояния устройств.


Поддерживаются варианты подключения:

  • Blynk
  • IFTTT, кроме типа значений "Range" ("ползунок")
  • Any - устройства, которые управляются http-запросами в разных форматах (вариативно) - Требуется тестирование

Наши действия (для нетерпеливых)

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

От слов - к делу!

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

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

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

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

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

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

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

  1. Жмём большую кнопку "Создать навык", выбираем тип навыка "Умный дом".
  2. Заполняем информацию о навыке (см рис 2, 3, 4), где:
    • Endpoint URL - Url из раздела DOMAINS в кабинете ZEIT. При этом обязательно ставим https:// в начале.
    • "Не показывать в каталоге" - ставим галочку (чтобы обойтись без долгой модерации, а сам навык не попал в общий каталог).
  3. Нажав кнопку "Изменить", указываем:
    • Идентификатор приложения - любая строка (можно пару раз упасть головой на клавиатуру);
    • Секрет приложения - поступаем так же;
    • URL авторизации - ссылка, которую указывали в Endpoint URL
    • URL для получения токена - ссылка вида: https://ссылка_навыка/token
    • URL для обновления токена - ссылка вида: https://ссылка_навыка/refresh
    • Идентификатор группы действий - read,home:lights
  4. Нажимаем "Сохранить" в окне "Создание связки аккаунтов" и в настройках нашего навыка.
  5. Подтверждаем указанную нами электронную почту;
  6. Подать навык на модерацию. Если не забыли указать, что навык приватный - она будет мгновенной.
  7. После прохождения модерации нажимаем "Опубликовать".

Теперь наш навык должен появиться в списке навыков при добавлении устройств в Умный дом Яндекса (УДЯ).

Навык создан и работает! Перейти к самому вкусному - настройке.

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

В файле config.py указываем префикс пользователя и токен для IFTTT (если он будет использоваться).

<button type="button" class="spoilers-button" aria-expanded="false">Только, если Blynk не работает!</button>

Если все работает - строку с blynk_ip лучше не трогать!!! Её значение должно оставаться как blynk_ip = "139.59.206.133"

Настройка завершена.

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

Устройства добавляются через редактирование файла devices.txt (должен находиться в корне репозитория GitHub).

Самый простой способ - редактирование в GitHub. Для этого:

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

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

Отредактируем device.txt. Главные правила:

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

Если что-то не работает - читать с пункта 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--", "ссылка на статус яркости", начальная строка поиска, конечная строка поиска, 250

Предположим, что у нас есть определенный формат 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"});
  • 250 - максимальный предел уровня яркости на устройстве (для некоторых светодиодных лент удобнее использовать не 100%, а уровень 255)

Получим строку такого вида:

"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:",", 250

в которой после ссылки на запрос статуса вкл/выкл устройства, мы указали:

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


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

<button type="button" class="spoilers-button" aria-expanded="false">Все шаблоны можно посмотреть тут</button>
Вот так легко добавляются устройства, главное - разобраться в формате записи =)

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

После того, как заполнены все описания, сохраняем device.txt и проверяем, добавились ли наши устройства в УДЯ.

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

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

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

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

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

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


"Другое" имеет 3 вида умений:

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

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

"тип умения","тип подключения","номер пина","токен Blynk","nostatus"

Заполним шаблон:

  • Тип умения "on_off",
  • Тип подключения "blynk",
  • Номер виртуального пина (например "V2"),
  • Токен проекта blynk (что-то вроде "GYUgu678T6g67OIjoijo8677tyg"),
  • Отсутствие запроса статуса "nostatus".

Получим строку вида:

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

С умениями "toggle" и "range" чуть сложнее, зато они добавляют мощные возможности. Для них Яндекс предлагает целый список "instance" (функций в этом умении).

  • Функции для "toggle" (что можно переключать):
    • "backlight" - подсветка
    • "controls_locked" - блокировка управления
    • "ionization" - ионизация
    • "keep_warm" - включение поддержания тепла
    • "mute" - режим "без звука"
    • "oscillation" - включение вращения
    • "pause" - пауза
  • Функции для "range" (что можно регулировать плавно):
    • "brightness" - яркость (в процентах)
    • "open" - открытие (в процентах)
    • "humidity" - влажность (в процентах)
    • "temperature" - температура (в градусах Цельсия)
    • "channel" - канал (без единиц измерения)
    • "volume" - громкость (без единиц измерения)

Для примера создадим умение "range" с функцией "влажность". Наш шаблон:

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

Расшифруем:

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

Получим что-то такое:

"range","humidity",0,100,10,"any","http://anyapi.com/hum/?val=--val--","status","http://anyapi.com/hum/status",lue:",",150

Теперь рассмотрим функцию "color_setting" для управления RGB-подсветкой для устройства со сторонним api. Шаблон выглядит так:

"color_setting",255,255,255,"any","ссылка на управление (заменить значение red на --vr-- / green на --vg-- / blue на --vb--)","nostatus"

Расшифруем:

  • "color_setting" - наша функция (instance)
  • 255 (без кавычек) - максимальное значение красного (на случай, если не 255, а 100. Например, у меня для понижения расхода питания);
  • 255 (без кавычек) - максимальное значение зеленого (на случай, если не 255);
  • 255 (без кавычек) - максимальное значение синего (на случай, если не 255);
  • "any" - тип подключения нетипизированного http-запроса;
  • "ссылка на управление" - ссылка типа http://anyapi.com/hum/?val=50&val=150&val=100, где 50 мы меняем на --vr--, 150 мы меняем на --vg--, 100 мы меняем на --vb-- (r,g,b);
  • "nostatus" - указываем, что не хотим получать текущее состояние.

Получим что-то такое:

"color_setting",255,255,255,"any","http://anyapi.com/hum/?val=--vr--&val=--vg--&val=--vb--","nostatus"
<button type="button" class="spoilers-button" aria-expanded="false">Все шаблоны можно посмотреть тут</button>
Напомним: для каждого вида многофункционального устройства создаётся свой файл с умениями, который нужно загрузить в корень репозитория на GitHub, а его имя указывать в описании в device.txt

Устройство-сцена

Это специальные решения для выполнения нескольких http-запросов одновременно. При включении "устройства" происходит отправка нескольких запросов из указанного в devices.txt файла (Пример: sceneone.txt)

Для добавления устройства вносим в devices.txt строку типа:

"Noname03", "Сцена", "сцена для проверки", "Сценарии", "User", "Scen1", "001", "003", "Сцена", "sceneone.txt"

В корневой папке создать файл (в примере - sceneone.txt), в котором в несколько строк указать ссылки на вебхуки-действия (одна строка - один вебхук). Пример заполнения файла:

http://anyapi.com/hum/?val=1
http://anyapi.com/hum/?val=2
http://anyapi.com/hum/?val=true
http://anyapi.com/hum/?val=false

Некоторые вопросы и ответы

ЕЩЁ РАЗ: навык разрабатывался для себя, для проверки себя и главным критерием - сервиса, на котором можно контролировать работу навыка (поэтому Zeit Now); а главным требованием - простота добавления устройств и универсальность.<br>

Почему IFTTT не поддерживает "range"?

Во-первых, потому что у IFTTT другой формат передачи value и он пока не укладывался в голове(возможно потом). Во-вторых, в голову пока не пришло устройств, которые бы поддерживали прием вариативных значений по IFTTT, поэтому не увидел смысла.

Почему для IFTTT токен задается в config.py, а для blynk в каждом устройстве/умении?

Потому что аккаунт IFTTT обычно один, а у Blynk проектов с разными токенами может быть много.

Устройства не видны (видны, но УДЯ выдаёт ошибки)

Если навык определился успешно, но устройства не видны - скорее всего, вы их неправильно указали в device.txt или не указали вовсе. Совет: перечитать статью и проверить формат записи строк. Если видны, но есть ошибки, то есть смысл попробовать удалить устройство или отвязать и привязать заново аккаунт. Возможно при ваших последних изменениях параметры не прогрузились в УДЯ.

Как задаются token и code для запросов Яндекса?

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

Не могу добавить две яркости в одном устройстве

По стандарту УДЯ можно добавить только одно умение с одноименной функцией. То есть, одну "яркость", одну "влажность", один ползунок "громкости".

Формат IFTTT... что такое "хук вкл", "хук выкл" в device.txt?

Это названия вебхуков, которые вы задаете в IFTTT. Например "relayON". В остальном принцип схож с шаблонами any. При этом запрос статуса IFTTT-устройств происходит через сторонний http-запрос (если такой имеется).

Ну и наконец, надеюсь, что у вас все получится при создании собственного навыка, а если нет - буду очень рад обратной связи: