- PVSM.RU - https://www.pvsm.ru -
В этой статье я хочу рассказать про свой опыт разработки так называемого Device Handler для умного дома SmartThings. Задача состояла в добавлении универсального устройства на базе протокола Z-Wave — Z-Uno [1], а так же обработка подключаемых к нему дочерних устройств.

Введение в разработку заняло у меня достаточно много времени, однако после просветления внимательного изучения большей части документации дальнейшая разработка уже не требовала особых усилий. В следствии этого было решено написать данную статью, дабы облегчить работу русскоязычному пользователю.
Весь процесс разработки происходит в веб-приложении SmartThings IDE на языке Groovy. Тестирование удобнее проводить с мобильного устройства, однако есть возможность создавать симуляторы устройств в той же среде разработки. В случае тестирования графической оболочки уже появляется необходимость использования мобильного приложения SmartThings Classic (Android [2], iOS [3]).
Подключаемое устройство — это плата, которая позволяет добавить управление практически любым устройством в Z-Wave. Причём подключаемых устройств может быть разное количество (до 32шт.). Соответственно на программном уровне все типы подключаемых устройств необходимо также обработать и вывести управление в приложение.
Список обрабатываемых типов:
Можно выделить два логических блока:
metadata().
Отдельно можно выделить метод parse(), который занимается интерпретацией полученных команд с устройства.
Более подробно описывать назначение и содержание каждого блока я буду в ходе цикла статей.
Как можно заметить из названия метода — здесь содержится метаинформация.
Рассмотрим по порядку что входит в этот блок:
В этом методе аргументами указываются три вещи, соответственно: название обработчика, пространство имен и имя автора.
definition(name: "Your device", namespace: "yournamespace", author: "your name") {}
В теле метода могут объявляться следующие переменные: attribute, capability, command, fingerprint. Далее мы более подробно рассмотрим что это и когда применяется.
Подключаем наше устройство. В нашем случае будут использоваться SmartThings V2 Hub и Z-Uno [1].
В момент добавления нового устройства Z-Wave или ZigBee, хаб будет пытаться распознать, какой тип устройства к нему пытаются подключить и начнет искать наиболее релевантный хендлер. Выбирать он его будет по ”Fingerprints”. Если хаб не найдет соответствий в пользовательских обработчиках, он попытается использовать один из наиболее близких стандартных шаблонов.
“Fingerprints” задаются в самом обработчике для указания, какие типы устройств он поддерживает. В официальной документации сообщается, что они будут разные для устройств Z-Wave и устройств ZigBee, мы будем рассматривать реализацию для Z-Wave.
Устройства протокола Z-Wave хранят в себе информацию об их производителе, типе устройства, его возможностях и т.п. Во время так называемого “интервью” с устройством, ST собирает эту информацию в Z-Wave raw description. Пример такой строки:
zw:Ss type:2101 mfr:0086 prod:0102 model:0064 ver:1.04 zwv:4.05 lib:03 cc:5E,86,72,98,84 ccOut:5A sec:59,85,73,71,80,30,31,70,7A role:06 ff:8C07 ui:8C07
Значение каждого ключа, как раз и используется для заполнения “Fingerprint”. Подробное описание каждого элемента можно найти здесь [4]. Мы рассмотрим те, которые будут использоваться в нашем обработчике.
Для того чтобы найти эту строку с информацией, необходимо зайти во вкладку ‘My Devices’ и нажать на интересующее нас устройство (перед этим устройство необходимо добавить в сеть).

mfr — 16-битное значение содержащее ID производителя (Manufacturer ID). Список производителей и их ID можно найти здесь [5].
prod — 16-битное значение содержащее Product Type ID — уникальный ID типа устройства.
model — 16-битное значение содержащее Product ID.
inClusters — 8-битное значение, устанавливающее необходимость в том или ном Command Class. Например, если нам нужно указать что наш обработчик будет работать с MultiChannel CC необходимо написать его код 0x60. Список доступных для SmartThings CC
можно найти здесь [6].
Этих четырех ключей достаточно, что бы хаб точно понимал, к какому устройству относиться этот обработчик. Пример, как они используются у меня:
fingerprint mfr: "0115", prod: "0110", model: "0001", inClusters: "0x60"
fingerprint mfr: "0115", prod: "0111", inClusters: "0x60"
Устройство может иметь большее количество параметров, в таком случае оно может успешно подключится с этим хэндлером, однако, если хотя бы один из них не совпадает с объявленным fingerprint — устройство проигнорирует этот обработчик.
Smartthings рекомендует добавлять в fingerprint информацию о производителе (mfr) и модели (prod, model), чтобы исключить случаи, когда выбор обработчика будет не очевиден. Например, когда fingerprints одного из шаблонов или примеров, используемых по умолчанию будет совпадать с вашим.
Расположение в коде
metadata {
definition(...) {
...
fingerprint mfr: "0115", prod: "0110", model: "0001", inClusters: "0x60"
fingerprint mfr: "0115", prod: "0111", inClusters: "0x60"
}
...
}
Планируется полный цикл статей, вплоть до релиза. Надеюсь данная информация поможет вам в разработке.
Автор: baadev
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/tutorial/297185
Ссылки в тексте:
[1] Z-Uno: https://z-uno.z-wave.me/technical/
[2] Android: https://play.google.com/store/apps/details?id=com.smartthings..
[3] iOS: https://itunes.apple.com/app/samsung-connect/id1222822904?mt=8
[4] здесь: https://docs.smartthings.com/en/latest/device-type-developers-guide/definition-metadata.html#z-wave-raw-description
[5] здесь: https://www.silabs.com/documents/login/miscellaneous/SDS13425-Z-Wave-Plus-Assigned-Manufacturer-IDs.xlsx
[6] здесь: https://graph.api.smartthings.com/ide/doc/zwave-utils.html
[7] Источник: https://habr.com/post/427923/?utm_campaign=427923
Нажмите здесь для печати.