Протокол Z-Wave весьма популярен, и существует огромное множество совместимых устройств. Однако все, кто когда либо автоматизировал своё жилище, сталкивались с тем, что чего-то таки не хватает.
Кому-то не хватает датчика давления, кому-то датчика дождя, кому-то хочется устройство на 6 реле в одном корпусе, да ещё и на батарейках. А кому-то просто нужно управлять через Z-Wave пылесосом iRobot Roomba.
Но всего этого нет в Z-Wave (да и в других протоколах тоже), и производители не торопятся осуществлять все ваши мечты.
Мы услышали вашу боль и создали идеальный комбайн. Встречайте Z-Uno, которая сочетает простоту и универсальность. Z-Uno — это Arduino в мире Z-Wave. На этой плате вы можете собрать все ваши устройства мечты и многое другое.
![](https://habrastorage.org/r/w1560/files/623/c2f/3dc/623c2f3dcf77484eaabca667e946a739.png)
Про создание устройства Z-Wave и сложности с этим связанные я писал совсем недавно. Очевидно, для себя никто разрабатывать собственное устройство не будет — слишком уж это сложно и дорого. Но представьте, если вам дадут доступ к периферии чипа Z-Wave, open source компилятор, простую IDE, лёгкий доступ к сети Z-Wave, сертифицированный функционал и возможность работы с любым другим устройством Z-Wave.
И вот мы сделали это доступным в нашем новом устройстве Z-Uno (более правильно назвать Z-Uno платформой, а не устройством, т.к. устройств на этой маленькой плате можно сделать много). Идея Z-Uno проста:
Вы пишете код на языке C в стиле Arduino прямо в среде Arduino IDE. Эта же среда используется для загрузки вашего кода по USB (есть также возможность залить новый код по радио через контроллеры Z-Wave — так называемая перепрошивка OTA). Ваш код управляет всеми ножками как в Arduino. Привычный набор функций Arduino дополнен специфическими для работы с сетью Z-Wave — получения и отправки команд. Все сложности Z-Wave скрыты «под капотом» Z-Uno.
Приведём пример необычного устройства. Например, вы хотите удалённо поливать ваш любимый цветок, а также включать ему освещение. Ну, очень вам он дорог, и включать полив вы хотите сами, а не автоматически, дабы чувствовать свою причастность к уходу за растением. Для этого вы возьмете датчик влажности почвы, а также реле для включения полива и светодиодную ленту для освещение. Но тянуть провода к цветочку не хочется. Как же быть? Подключим к одному из АЦП Z-Uno наш датчик влажности, реле к цифровым выходам, а освещение к ШИМ. Значение с АЦП мы будем передавать по Z-Wave в виде «многоуровневого датчика» (Sensor Multilevel), реле представим через «бинарный выключатель» (Switch Binary), а регулятор светодиодной ленты через «многоуровневый выключатель» (Switch Multilevel). Контроллеры Z-Wave сразу подхватывают предоставленные в таком виде данные, отображают их в интерфейсе и позволяют удалённо управлять.
Вот как будет выглядеть схема подключения датчика, реле и регулятора освещения к Z-Uno (для простоты я не стал рисовать ни детали подключения реле полива, ни схему управления диммируемой светодиодной ленты — предполагается, что эту часть схемотехники вы уже имеете, собрав прототип на Arduino). Питаться данное устройство будет от micro-USB порта Z-Uno, а 3.3 В для самой Z-Uno и датчика влажности почвы получаются благодаря встроенному преобразователю DC-DC.
![](https://habrastorage.org/r/w1560/files/53f/d9e/050/53fd9e050e3142aaafa0507e7f66ff95.png)
Таким образом, мы всего лишь написали код аналогичный тому, что вы имели для Arduino, для чтения значения влажности и для изменения состояния ног, управляющих реле, а также описали каналы для Z-Wave и привязали их к полученным значениям. Всю остальную работу по передаче данных Z-Uno сделает за вас. Мобильные приложения и удалённый доступ, предоставляемые центральными контроллерами Z-Wave позволят управлять поливом из любой точки мира из того же интерфейса, в котором управляется остальные элементы вашего умного дома.
Вид нашего устройства полива в интерфейсе Z-Way/RaZberry:
![](https://habrastorage.org/r/w1560/files/380/e6e/7ba/380e6e7ba14a4f9b95e0399ca9987c46.png)
Вид нашего устройства полива в интерфейсе Fibaro Home Center 2 и Home Center Lite:
![](https://habrastorage.org/r/w1560/files/823/65a/3dd/82365a3dd82d4bdd942e7e2eeff64c6f.png)
Вид нашего устройства полива в интерфейсе Vera Edge (видно, что экзотический датчик влажности почвы не показывается, но замена на относительную влажность решает проблему в данном случае):
![](https://habrastorage.org/r/w1560/files/6bb/829/18e/6bb82918ed7a42efa76ed67986a54032.png)
Вид нашего устройства полива в интерфейсе Zipato ZipaBox:
![](https://habrastorage.org/r/w1560/files/73f/afe/bd6/73fafebd6f7843b0bc35aa6545f01987.png)
Z-Uno основана на модуле Mitsumi WML-C85 (также могут встречаться версии с WML-C84 или ZM5101). Почти все ноги и функции мы предоставляем пользователю через удобное API максимально похожее на язык Arduino. Поэтому характеристики Z-Uno очень похожи на характеристики SD3502, ZM5101 и WML-C84.
Отметим, что Z-Uno — бурно развивающийся проект. Курсивом отмечены заявленные цели. По мере реализации и тестирования мы будем их помечать обычным шрифтом. Символом * отмечен частично реализованные функции (наведите мышкой для отображения комментария).
![](https://habrastorage.org/r/w1560/files/348/d76/60c/348d7660c4b544b89dc637fae802e5bc.png)
«Распиновка» Z-Uno (нажмите, чтобы открыть большую картинку):
![](https://habrastorage.org/files/697/991/4ed/6979914edee84c729ba64a4a3f0084b8.gif)
Каждый пользовательский канал может содержать один из следующих классов команд Z-Wave:
Пользовательские скетчи заливаются в Z-Uno прямо из Arduino IDE. Для работы с Z-Uno необходимо установить соответствующий пакет, который содержит компилятор, загрузчик, библиотеки и .h-файлы проекта Z-Uno. Это делается из появившейся недавно в Arduino IDE менеджера плат (Board Manager). Для появления пакета Z-Uno в списке в менеджере плат, требуется зайти в настройки и прописать в поле Additional Boards Manager URLs ссылку на описание пакетов Z-Uno: http://z-uno.z-wave.me/files/z-uno/package_z-wave.me_index.json. Далее зайдите в Tools -> Board -> Boards manager и установите пакет для Z-Uno.
Важно! На данный момент поддерживается только предпоследняя Arduino IDE 1.6.5.
После установки пакета Z-Uno в списке плат в меню Tools появится пункт Z-Wave>Me Z-Uno, а в списке программаторов Z-Uno Programmer. Выберите нужный порт (COM-порт под Windows, ttyACM-порт на Linux и cu.usbmodem под OS X). Пункт Burn Bootloader позволяет обновить загрузчик скетча Z-Uno и стек Z-Wave (см. архитектуру Z-Uno ниже) до самой последней версии, входящей в пакет Z-Uno.
Также в меню появится галочка для включения шифрования (класс команд Security) и компактной отправки пакетов (класс команд MultiCommand). Эти функции не поддерживаются некоторыми контроллерами. Кроме того, в этом же списке можно выбрать частоту работы Z-Uno (обратите внимание, что SAW-фильтр в любом случае настроен на один из трёх диапазонов частот, т.е. при выборе несоответствующей частоты дальность радио связи будет существенно ниже!).
В меню File->Examples также появятся примеры, специфичные для Z-Uno. С них можно начать изучение возможностей Z-Uno.
Подробная инструкция по установке представлена на сайте проекта Z-Uno.
Тут нужно пускать в ход вашу фантазию. Вот несколько идей:
Создавая свои устройства на базе Z-Uno вам не нужно изучать всю документацию протокола Z-Wave и микроконтроллеров ZM5101. Однако какие-то минимальные знания о Z-Wave вам понадобятся, чтобы правильно описать в скетче нужные вам функции.
Чтобы представить несколько функций в одном устройстве, в протоколе Z-Wave описаны каналы (изредка называемые «экземплярами»). В Z-Uno мы используем это понятие для создания сложных устройств. Каждый канал Z-Uno предоставляет одну из заявленных пользователем функций. Сколько функций описано, столько каналов будет. Используйте макрос ZUNO_SETUP_CHANNELS для описания количества и типов каналов.
Z-Uno сама будет отправлять отчёты об изменениях состояний на каналах на контроллер (при вызове zunoSendReport(номер канала)). Однако Z-Uno также может управлять другими устройствами Z-Wave. Для упрощения настройки в протоколе Z-Wave описано понятие группы ассоциаций (или просто ассоциации). Группа ассоциаций — это список устройств сети, которым будет отправлена определённая команда при наступлении определённого события. Вид команды и события программируются в устройстве, в то время как список получателей можно легко менять из интерфейса контроллеров Z-Wave.
Макрос ZUNO_SETUP_ASSOCIATIONS позволяет определить количество доступных в устройстве групп и вид отправляемой команды для каждой группы (управление реле, диммером или запуск сцен).
Протокол Z-Wave спроектирован так, чтобы было возможно создавать устройства с очень низким потреблением энергии и питать их от батареек. Большинство датчиков Z-Wave работают на комплекте батареек более года. Однако для этого устройство должно пребывать в состоянии «сна» большую часть времени, изредка просыпаясь для измерений значений датчиков и отправки отчётов. Такие устройства называются «спящими».
Чтобы с одной стороны сделать устройство работающим от батареек, а с другой — иметь возможность управлять им в режиме реального времени (не дожидаясь пробуждения), в Z-Wave введён ещё один тип управления питанием: «часто слушающие» устройства или FLiRS. Эти устройства просыпаются раз в секунду для проверки эфира на предмет «пробуждающего пакета» и сразу уходят спать дальше, если для них ничего нет. Связь с такими устройствами потребует чуть больше времени — перед отправкой нужной команды необходимо в течение одной секунды отправлять специальный «пробуждающий пакет». В течение этого времени сеть будет заглушена, однако после пробуждения устройство будет оперативно отвечать на команды до ухода в сон. В этом режиме устройство способно прожить на комплекте батареек около года. Типичные устройства, требующие данного режима — это реле на батарейках, сирены, дверные замки.
Все постоянно запитанные устройства, такие как диммеры, реле и другие исполнители, являются «постоянно слушающими». Это означает, что они всегда доступны, всегда слушают эфир и выполняют роль ретрансляторов для других устройств, формируя ячеистую сеть.
Z-Uno поддерживает все три режима питания. Режим питания можно определить макросом ZUNO_SETUP_SLEEPING_MODE.
Важно! При изменении параметров или количества каналов, групп ассоциаций или режима питания необходимо исключить Z-Uno из сети и заново её включить в сеть. Это вызвано требованием протокола Z-Wave не менять свои характеристики «на лету».
Упомянутой здесь информации должно быть достаточно для создания своего устройства Z-Wave, однако более глубокое понимание никогда не помешает. Почитать подробней можно в этой статье, а также в книге «Основы Z-Wave» Кристиана Петц.
Мы делаем Z-Uno полностью соответствующей самому свежему стандарту Z-Wave Plus. Однако, увы, это не гарантирует полной работоспособности во всех контроллерах. Увы, многие контроллеры требуют «шаблонов» для поддержки конкретных устройств. Писать такие шаблоны сложно или даже невозможно (производитель контроллера может не давать возможности загрузить свой шаблон). А некоторые контроллеры и вовсе ограничивают отображаемые функции устройства тремя или четырьмя элементами управления. Это сильно ограничивает возможность использования Z-Uno.
Сразу отметим, что наш собственный контроллер Z-Way поддерживает любые варианты устройств на базе Z-Uno прямо «из коробки». Нет, мы не делали специальную поддержку для Z-Uno и не писали никаких шаблонов. Просто Z-Way так написан, и ему лишь достаточно того, что устройство сертифицировано и соответствует протоколу Z-Wave.
Пока мы тестировали Z-Uno с Z-Way (полная совместимость), Fibaro (до четырёх функций), Vera Edge (не поддерживаются экзотические датчики), Zipato (мало тестировали, но пока проблем не замечено). Мы надеемся, что производители контроллеров будут улучшать работу контроллеров и поддержку входящих в стандарт Z-Wave функций.
Хотелось бы упомянуть о том, как устроена Z-Uno внутри. Исполняемый код Z-Uno состоит из четырёх частей:
Пользовательский код, он же «скетч» — это ваш код, написанный на упрощённом языке C и загруженный в Z-Uno посредством Arduino IDE. Пользовательский код управляет всеми «ногами» и логикой работы устройства. Вы сами решаете, как подключить ту или иную периферию!
Загрузчик пользовательского кода реализует уровень приложения Z-Wave в соответствии с пользовательскими настройками, определяет каналы и группы ассоциаций, задаёт режим сна. Он также управляет сервисными светодиодами и обрабатывает сервисные кнопки, необходимые для включения устройства в сеть, сброса и перевода в режим «восстановления» (режим, в котором пользовательский код не грузится). Но главная роль загрузчика состоит в том, чтобы вызывать Пользовательский код при получении пакетов Set (установка значения) и Get (запрос значения) из сети Z-Wave, а также вызов функции loop всё время, пока более низкие уровни не заняты. Данный уровень является основной частью «ядра» прошивки Z-Uno.
Уровень приложения Z-Wave отображает объявленные пользователем каналы, функции и ассоциации Z-Uno на классы команд Z-Wave, обеспечивая соответствие стандарту Z-Wave Plus. Данный уровень также предоставляет такие функции, как обновление прошивки, по USB и по радио (OTW и OTA), AES шифрование всех радио пакетов, мониторинг мощности радио сигнала, измерение заряда батарейки, периодические пробуждения, а также анонсирует в сеть базовую информацию об устройстве.
Сетевой уровень Z-Wave основан на SDK Sigma Designs (версии 6.5x), которая реализует сетевой и радио уровни протокола Z-Wave, устанавливая надёжную двухстороннюю связь в mesh-сети умного дома. Этот уровень занимается вычислением маршрутов, обеспечивая доставку пакетов получателям даже вне зоны прямой видимости, осуществляет пересылку (маршрутизацию) и приём пакетов.
Пользовательский код (скетч) компилируется в Arduino IDE с библиотеками Z-Uno Core Libraries, которые необходимо установить через Arduino Board Manager. Как и скетчи Arduino, скетчи Z-Uno являются обычными прошивками, скомпилированными для соответствующего микроконтроллера. Однако по сравнению с Arduino, основанной на микроконтроллерах Atmel, Z-Uno основана на чипе Z-Wave, т.е. архитектуре 8051. Потому вместо avg-gcc при сборке скетчей Z-Uno используется компилятор sdcc.
Есть ещё одно отличие от скетчей Arduino: скетчи Z-Uno должны взаимодействовать с уровнями ниже. Данное взаимодействие осуществляется через Z-Uno Core Libraries, с которыми компилируются скетчи Z-Uno.
Как уже упоминалось, Пользовательский код можно загрузить через Arduino IDE по USB (используя кнопку «Upload»), а также по радио через контроллер Z-Wave, поддерживающий обновление прошивок в устройствах.
Все нижние уровни (Загрузчик пользовательского кода, Уровень приложения Z-Wave и Сетевой уровень Z-Wave — все вместе) можно также обновить по USB из Arduino IDE (используя пункт меню «Upload Bootloader») или также по радио через контроллер Z-Wave.
Замечу, что эти нижние уровни скомпилированы с библиотеками Z-Wave SDK при помощи компилятора Keil C51, в то время как пользовательский код собран при помощи sdcc. Думаю, мы напишем отдельную статью о том, как мы скрещивали ежа с ужом. Ведь эти компиляторы даже имеют немного разные конвенции и ABI вызова функций.
Мы старались сделать идеальный продукт, но не всегда получается все гладко ;)
Увы первая выпущенная версия не помещается на одну макетную плату (из-за размера батарейки мы не смогли уменьшить плату). Но следующая версия будет у́же и поместится на одну стандартную макетку.
Также в текущей версии мы прогадали с выбором батарейки — текущая не способна нормально питать устройство в режиме FLiRS. Следующая не будет иметь батарейки на борту, а только кабель для подключения внешней батарейки.
Также текущая плата не имеет защиты от подключения одновременно батарейки и внешнего питания. Об этом напоминает защитная бумажка в отсеке для батареек. Но и это исправится.
Как видно, эти недостатки важны, но не критичны для большинства функций. В остальном устройство получилось весьма универсальным и подходит для создания множества датчиков и исполнительных устройств.
Также стоит отметить, что в отличии от Arduino, Z-Uno имеет на ногах 3 В, а не 5 В. Это следует учитывать, чтобы не спалить входы.
После нескольких workshop мы поняли, что продукт всё-таки получился сложным: те, кто знаком с Ардуино, должны познакомиться с экосистемой устройств Z-Wave и интерфейсом контроллеров Z-Wave, а те, кто знаком с Z-Wave, должны иметь базовые знания С. К счастью пересечение подмножеств этих людей весьма велико.
Как я уже упоминал, Z-Uno — быстро развивающийся проект. Мы поставили себе очень амбициозную цель, и уверенно шагаем к ней. Вот краткий план проекта на ближайшие месяцы:
Вся информация о ходе проекта публикуется на сайте z-uno.z-wave.me. Там же находится описание функций языка программирования C и примеры кода (на английском).
Также у нас есть англоязычный форум, посвященный Z-Uno.
Код Z-Uno Core Libraries доступен на github.
Информацию об ошибках и предложениях мы принимаем через github: вы можете создать тикет и доложить о проблеме.
Z-Uno уже доступна (пока только в России) у наших партнёров 5 smart, которые в течение недели после данной публикации дарят 5% на все устройства Z-Wave по скидочному купону GT_ZUNO. Надеемся, скоро Z-Uno появится и в других магазинах.
Рекомендованная розничная цена 3500 руб.
Подробности проекта на сайте z-uno.z-wave.me.
![](https://habrastorage.org/r/w1560/files/411/4a5/0b9/4114a50b96ac43f799c7c8bbdfeed878.png)
Кому-то не хватает датчика давления, кому-то датчика дождя, кому-то хочется устройство на 6 реле в одном корпусе, да ещё и на батарейках. А кому-то просто нужно управлять через Z-Wave пылесосом iRobot Roomba.
Но всего этого нет в Z-Wave (да и в других протоколах тоже), и производители не торопятся осуществлять все ваши мечты.
Мы услышали вашу боль и создали идеальный комбайн. Встречайте Z-Uno, которая сочетает простоту и универсальность. Z-Uno — это Arduino в мире Z-Wave. На этой плате вы можете собрать все ваши устройства мечты и многое другое.
![](https://habrastorage.org/files/623/c2f/3dc/623c2f3dcf77484eaabca667e946a739.png)
Про создание устройства Z-Wave и сложности с этим связанные я писал совсем недавно. Очевидно, для себя никто разрабатывать собственное устройство не будет — слишком уж это сложно и дорого. Но представьте, если вам дадут доступ к периферии чипа Z-Wave, open source компилятор, простую IDE, лёгкий доступ к сети Z-Wave, сертифицированный функционал и возможность работы с любым другим устройством Z-Wave.
И вот мы сделали это доступным в нашем новом устройстве Z-Uno (более правильно назвать Z-Uno платформой, а не устройством, т.к. устройств на этой маленькой плате можно сделать много). Идея Z-Uno проста:
Вы пишете код на языке C в стиле Arduino прямо в среде Arduino IDE. Эта же среда используется для загрузки вашего кода по USB (есть также возможность залить новый код по радио через контроллеры Z-Wave — так называемая перепрошивка OTA). Ваш код управляет всеми ножками как в Arduino. Привычный набор функций Arduino дополнен специфическими для работы с сетью Z-Wave — получения и отправки команд. Все сложности Z-Wave скрыты «под капотом» Z-Uno.
Приведём пример необычного устройства. Например, вы хотите удалённо поливать ваш любимый цветок, а также включать ему освещение. Ну, очень вам он дорог, и включать полив вы хотите сами, а не автоматически, дабы чувствовать свою причастность к уходу за растением. Для этого вы возьмете датчик влажности почвы, а также реле для включения полива и светодиодную ленту для освещение. Но тянуть провода к цветочку не хочется. Как же быть? Подключим к одному из АЦП Z-Uno наш датчик влажности, реле к цифровым выходам, а освещение к ШИМ. Значение с АЦП мы будем передавать по Z-Wave в виде «многоуровневого датчика» (Sensor Multilevel), реле представим через «бинарный выключатель» (Switch Binary), а регулятор светодиодной ленты через «многоуровневый выключатель» (Switch Multilevel). Контроллеры Z-Wave сразу подхватывают предоставленные в таком виде данные, отображают их в интерфейсе и позволяют удалённо управлять.
Вот как будет выглядеть схема подключения датчика, реле и регулятора освещения к Z-Uno (для простоты я не стал рисовать ни детали подключения реле полива, ни схему управления диммируемой светодиодной ленты — предполагается, что эту часть схемотехники вы уже имеете, собрав прототип на Arduino). Питаться данное устройство будет от micro-USB порта Z-Uno, а 3.3 В для самой Z-Uno и датчика влажности почвы получаются благодаря встроенному преобразователю DC-DC.
![](https://habrastorage.org/files/53f/d9e/050/53fd9e050e3142aaafa0507e7f66ff95.png)
Код нашей программы для Z-Uno будет выглядеть так
Код неплохо прокомментирован. Ниже будет чуть подробней расписан смысл некоторых строк.
int moistPin = A1; // нога для чтения значений влажности почвы с АЦП
int feedPin = 14; // нога для включения реле полива
int lightPin = PWM2; // нога для управления освещением
int dimLevel = 0; // тут мы храним значение диммера
int moistLevel = 0; // тут мы храним измеренное значение влажности
int moistLevelHist = 50; // константа для гистерезиса влажности (чтоб избавится от шума АЦП и реагировать только на сильные изменения)
int moistLevelCritical = 300; // пороговый уровень, при котором мы отправляем внешнему устройству команду включить реле
ZUNO_SETUP_CHANNELS(
ZUNO_SENSOR_MULTILEVEL_MOISTURE(moistureGetter), // канал для влажности почвы и ф-цию, возвращающую значение
ZUNO_SWITCH_BINARY(feedGetter, feedSetter), // канал для реле полива с ф-циями выставления и получения значений
ZUNO_SWITCH_MULTILEVEL(lightGetter, lightSetter) // канал для диммирования с ф-циями выставления и получения значений
);
ZUNO_SETUP_ASSOCIATIONS(
ZUNO_ASSOCIATION_GROUP_SET_VALUE // включаем какое-нибудь устройство Z-Wave при критичном высыхании почвы
);
void setup() {
// выставим режимы ног
pinMode(feedPin, OUTPUT);
// при подаче питания выключим полив и свет
digitalWrite(feedPin, LOW);
analogWrite(lightPin, dimLevel);
}
void loop() {
int moistLevelNew = analogRead(moistPin);
if (moistLevelNew < moistLevel - moistLevelHist || moistLevelNew > moistLevel + moistLevelHist) {
// значение влажности сильно изменилось
if (((moistLevel > moistLevelCritical) && (moistLevelNew < moistLevelCritical)) ||
((moistLevel < moistLevelCritical) && (moistLevelNew > moistLevelCritical))) {
zunoSendToGroupSetValueCommand(CTRL_GROUP_1, moistLevel < moistLevelCritical); // включить устройство, если сухо
}
moistLevel = moistLevelNew;
zunoSendReport(CHANNEL_1); // отправим отчёт на контроллер (отчёт по каналу 1)
}
delay(60*1000);
}
byte moistureGetter(void) {
byte tmpLevel = moistLevel / 9; // приведём значения 0 (сухо) - 900 (в воде) к 0-100% (АЦП 10-бит)
if (tmpLevel > 100) tmpLevel = 100;
return tmpLevel;
}
void feedSetter(byte value) {
digitalWrite(feedPin, value ? HIGH : LOW);
}
byte feedGetter() {
return digitalRead(feedPin);
}
void lightSetter(byte value) {
dimLevel = (value > 99) ? 99 : value; // по умолчанию включать сразу на максимум (тут можно было бы включать на уровень последнего значения)
analogWrite(lightPin, dimLevel*255/99);
}
byte lightGetter() {
return dimLevel;
}
Код неплохо прокомментирован. Ниже будет чуть подробней расписан смысл некоторых строк.
Таким образом, мы всего лишь написали код аналогичный тому, что вы имели для Arduino, для чтения значения влажности и для изменения состояния ног, управляющих реле, а также описали каналы для Z-Wave и привязали их к полученным значениям. Всю остальную работу по передаче данных Z-Uno сделает за вас. Мобильные приложения и удалённый доступ, предоставляемые центральными контроллерами Z-Wave позволят управлять поливом из любой точки мира из того же интерфейса, в котором управляется остальные элементы вашего умного дома.
Вид нашего устройства полива в интерфейсе Z-Way/RaZberry:
![](https://habrastorage.org/files/380/e6e/7ba/380e6e7ba14a4f9b95e0399ca9987c46.png)
Вид нашего устройства полива в интерфейсе Fibaro Home Center 2 и Home Center Lite:
![](https://habrastorage.org/files/823/65a/3dd/82365a3dd82d4bdd942e7e2eeff64c6f.png)
Вид нашего устройства полива в интерфейсе Vera Edge (видно, что экзотический датчик влажности почвы не показывается, но замена на относительную влажность решает проблему в данном случае):
![](https://habrastorage.org/files/6bb/829/18e/6bb82918ed7a42efa76ed67986a54032.png)
Вид нашего устройства полива в интерфейсе Zipato ZipaBox:
![](https://habrastorage.org/files/73f/afe/bd6/73fafebd6f7843b0bc35aa6545f01987.png)
Немного голых фактов о Z-Uno
Z-Uno основана на модуле Mitsumi WML-C85 (также могут встречаться версии с WML-C84 или ZM5101). Почти все ноги и функции мы предоставляем пользователю через удобное API максимально похожее на язык Arduino. Поэтому характеристики Z-Uno очень похожи на характеристики SD3502, ZM5101 и WML-C84.
Отметим, что Z-Uno — бурно развивающийся проект. Курсивом отмечены заявленные цели. По мере реализации и тестирования мы будем их помечать обычным шрифтом. Символом * отмечен частично реализованные функции (наведите мышкой для отображения комментария).
![](https://habrastorage.org/files/348/d76/60c/348d7660c4b544b89dc637fae802e5bc.png)
Технические характеристики:
- 28 кБайт FLASH-памяти для ваших скетчей,
- 4 кБайта RAM,
- Z-Wave радио-трансивер на каналах 9.6, 40 и 100 кбит/с,
- 22 GPIO (некоторые перекрываются с другими функциями),
- 4 АЦП,
- 5 ШИМ*,
- 2 UART*,
- 1 USB (в режиме serial),
- 64 кБайта EEPROM,
- 1 SPI (master или slave режимы)
- 4 ИК-контроллера и 1 ИК-приёмник с функцией обучения,
- 1 TRIAC/ZEROX контроллеры для диммирования,
- 1 прерывание*,
- 2 таймера (16 MHz или от внешнего источника),
- I2C (программный на ногах GPIO),
- 1-wire (программный на ногах GPIO),
- 8x6 сканер кнопок (в том числе в режиме глубокого сна),
- 2 сервисных светодиода, 1 сервисная кнопка,
- 1 пользовательский LED (как pin 13 у Arduino).
«Распиновка» Z-Uno (нажмите, чтобы открыть большую картинку):
![](https://habrastorage.org/files/697/991/4ed/6979914edee84c729ba64a4a3f0084b8.gif)
Режимы питания:
- USB 5 В, внешнее 3 В, внешнее 4-15 В или батарейка 3 В,
- всегда в сети, спящее или FLiRS,
Функции Z-Wave:
- Соответствие Z-Wave Plus,
- Все частоты Z-Wave (из-за разных SAW-фильтров будет 3 вида Z-Uno),
- Поддержка из коробки шифрования AES 128 бит, описанного в протоколе Z-Wave,
- Обновление прошивки и бутлоадера через USB или по радио (Z-Wave OTA),
- MultiChannel (10 пользовательских каналов — каждый канал предоставляет одну функцию, см. ниже),
- 10 групп ассоциаций для управления другими устройствами,
- Возможность управлять по радио Z-Wave реле, диммерами, замками, запуском сцен,
Каждый пользовательский канал может содержать один из следующих классов команд Z-Wave:
- Binary Switch (для реле),
- Multilevel Switch (для диммеров, жалюзи),
- Color Switch (для цветных ламп),
- Binary Sensor и Notification (для детекторов и сигнализаций),
- Multilevel Sensor (для датчиков, возвращающих числовое значение),
- Meter (для счётчиков).
Установка и настройка среды для программирования Z-Uno
Пользовательские скетчи заливаются в Z-Uno прямо из Arduino IDE. Для работы с Z-Uno необходимо установить соответствующий пакет, который содержит компилятор, загрузчик, библиотеки и .h-файлы проекта Z-Uno. Это делается из появившейся недавно в Arduino IDE менеджера плат (Board Manager). Для появления пакета Z-Uno в списке в менеджере плат, требуется зайти в настройки и прописать в поле Additional Boards Manager URLs ссылку на описание пакетов Z-Uno: http://z-uno.z-wave.me/files/z-uno/package_z-wave.me_index.json. Далее зайдите в Tools -> Board -> Boards manager и установите пакет для Z-Uno.
Важно! На данный момент поддерживается только предпоследняя Arduino IDE 1.6.5.
После установки пакета Z-Uno в списке плат в меню Tools появится пункт Z-Wave>Me Z-Uno, а в списке программаторов Z-Uno Programmer. Выберите нужный порт (COM-порт под Windows, ttyACM-порт на Linux и cu.usbmodem под OS X). Пункт Burn Bootloader позволяет обновить загрузчик скетча Z-Uno и стек Z-Wave (см. архитектуру Z-Uno ниже) до самой последней версии, входящей в пакет Z-Uno.
Также в меню появится галочка для включения шифрования (класс команд Security) и компактной отправки пакетов (класс команд MultiCommand). Эти функции не поддерживаются некоторыми контроллерами. Кроме того, в этом же списке можно выбрать частоту работы Z-Uno (обратите внимание, что SAW-фильтр в любом случае настроен на один из трёх диапазонов частот, т.е. при выборе несоответствующей частоты дальность радио связи будет существенно ниже!).
В меню File->Examples также появятся примеры, специфичные для Z-Uno. С них можно начать изучение возможностей Z-Uno.
Весь процесс в картинках![](https://habrastorage.org/r/w1560/files/653/ce0/4c4/653ce04c42ae42cb96f937b15513175d.png)
![](https://habrastorage.org/r/w1560/files/ed4/436/8c2/ed44368c27514cb991d535e8a0daf01b.png)
![](https://habrastorage.org/r/w1560/files/356/b91/ed0/356b91ed00484bb08dd36152fbc979a6.png)
![](https://habrastorage.org/r/w1560/files/b44/62c/290/b4462c290b064d09b860eb9224686cce.png)
![](https://habrastorage.org/files/653/ce0/4c4/653ce04c42ae42cb96f937b15513175d.png)
![](https://habrastorage.org/files/ed4/436/8c2/ed44368c27514cb991d535e8a0daf01b.png)
![](https://habrastorage.org/files/356/b91/ed0/356b91ed00484bb08dd36152fbc979a6.png)
![](https://habrastorage.org/files/b44/62c/290/b4462c290b064d09b860eb9224686cce.png)
Подробная инструкция по установке представлена на сайте проекта Z-Uno.
Что ещё можно сделать на Z-Uno?
Тут нужно пускать в ход вашу фантазию. Вот несколько идей:
- Выключатель на батарейках,
- Диммер-крутилку (роторный диммер),
- Датчик температуры, влажности, освещённости, напряжения, расстояния, давления, дождя,...
- Счётчик, датчик сухих контактов, низковольтное реле,
- ИК-пульт,
- LED-драйвер,
- Управление двигателем,
- Панель кнопок (клавиатуру) на батарейках,
- Преобразователь из Z-Wave в другие протоколы (любые датчики, подключенные по SPI/UART/I2C/1-wire шинам).
Z-Uno и Z-Wave
Создавая свои устройства на базе Z-Uno вам не нужно изучать всю документацию протокола Z-Wave и микроконтроллеров ZM5101. Однако какие-то минимальные знания о Z-Wave вам понадобятся, чтобы правильно описать в скетче нужные вам функции.
Каналы
Чтобы представить несколько функций в одном устройстве, в протоколе Z-Wave описаны каналы (изредка называемые «экземплярами»). В Z-Uno мы используем это понятие для создания сложных устройств. Каждый канал Z-Uno предоставляет одну из заявленных пользователем функций. Сколько функций описано, столько каналов будет. Используйте макрос ZUNO_SETUP_CHANNELS для описания количества и типов каналов.
Например, вот так мы опишем устройство измерения влажности и включения полива и освещения.
Данный код описывает три канал. Первый будет содержать класс команд Sensor Multilevel и передавать значение влажности почвы, второй — управление поливом, третий — выключатель освещения.
ZUNO_SETUP_CHANNELS(
ZUNO_SENSOR_MULTILEVEL_MOISTURE(moistureGetter),
ZUNO_SWITCH_BINARY(feedGetter, feedSetter),
ZUNO_SWITCH_MULTILEVEL(lightGetter, lightSetter)
);
Данный код описывает три канал. Первый будет содержать класс команд Sensor Multilevel и передавать значение влажности почвы, второй — управление поливом, третий — выключатель освещения.
Ассоциации
Z-Uno сама будет отправлять отчёты об изменениях состояний на каналах на контроллер (при вызове zunoSendReport(номер канала)). Однако Z-Uno также может управлять другими устройствами Z-Wave. Для упрощения настройки в протоколе Z-Wave описано понятие группы ассоциаций (или просто ассоциации). Группа ассоциаций — это список устройств сети, которым будет отправлена определённая команда при наступлении определённого события. Вид команды и события программируются в устройстве, в то время как список получателей можно легко менять из интерфейса контроллеров Z-Wave.
Макрос ZUNO_SETUP_ASSOCIATIONS позволяет определить количество доступных в устройстве групп и вид отправляемой команды для каждой группы (управление реле, диммером или запуск сцен).
Например, вот так мы опишем группу для управления другим устройством типа реле.
Вверху файла проекта:
и в нужном месте в коде:
ZUNO_SETUP_ASSOCIATIONS(ZUNO_ASSOCIATION_GROUP_SET_VALUE);
и в нужном месте в коде:
zunoSendToGroupSetValueCommand(CTRL_GROUP_1, значение);
Управление питанием
Протокол Z-Wave спроектирован так, чтобы было возможно создавать устройства с очень низким потреблением энергии и питать их от батареек. Большинство датчиков Z-Wave работают на комплекте батареек более года. Однако для этого устройство должно пребывать в состоянии «сна» большую часть времени, изредка просыпаясь для измерений значений датчиков и отправки отчётов. Такие устройства называются «спящими».
Чтобы с одной стороны сделать устройство работающим от батареек, а с другой — иметь возможность управлять им в режиме реального времени (не дожидаясь пробуждения), в Z-Wave введён ещё один тип управления питанием: «часто слушающие» устройства или FLiRS. Эти устройства просыпаются раз в секунду для проверки эфира на предмет «пробуждающего пакета» и сразу уходят спать дальше, если для них ничего нет. Связь с такими устройствами потребует чуть больше времени — перед отправкой нужной команды необходимо в течение одной секунды отправлять специальный «пробуждающий пакет». В течение этого времени сеть будет заглушена, однако после пробуждения устройство будет оперативно отвечать на команды до ухода в сон. В этом режиме устройство способно прожить на комплекте батареек около года. Типичные устройства, требующие данного режима — это реле на батарейках, сирены, дверные замки.
Все постоянно запитанные устройства, такие как диммеры, реле и другие исполнители, являются «постоянно слушающими». Это означает, что они всегда доступны, всегда слушают эфир и выполняют роль ретрансляторов для других устройств, формируя ячеистую сеть.
Z-Uno поддерживает все три режима питания. Режим питания можно определить макросом ZUNO_SETUP_SLEEPING_MODE.
Важно! При изменении параметров или количества каналов, групп ассоциаций или режима питания необходимо исключить Z-Uno из сети и заново её включить в сеть. Это вызвано требованием протокола Z-Wave не менять свои характеристики «на лету».
Узнать больше о Z-Wave
Упомянутой здесь информации должно быть достаточно для создания своего устройства Z-Wave, однако более глубокое понимание никогда не помешает. Почитать подробней можно в этой статье, а также в книге «Основы Z-Wave» Кристиана Петц.
Совместимость с контроллерами
Мы делаем Z-Uno полностью соответствующей самому свежему стандарту Z-Wave Plus. Однако, увы, это не гарантирует полной работоспособности во всех контроллерах. Увы, многие контроллеры требуют «шаблонов» для поддержки конкретных устройств. Писать такие шаблоны сложно или даже невозможно (производитель контроллера может не давать возможности загрузить свой шаблон). А некоторые контроллеры и вовсе ограничивают отображаемые функции устройства тремя или четырьмя элементами управления. Это сильно ограничивает возможность использования Z-Uno.
Сразу отметим, что наш собственный контроллер Z-Way поддерживает любые варианты устройств на базе Z-Uno прямо «из коробки». Нет, мы не делали специальную поддержку для Z-Uno и не писали никаких шаблонов. Просто Z-Way так написан, и ему лишь достаточно того, что устройство сертифицировано и соответствует протоколу Z-Wave.
Пока мы тестировали Z-Uno с Z-Way (полная совместимость), Fibaro (до четырёх функций), Vera Edge (не поддерживаются экзотические датчики), Zipato (мало тестировали, но пока проблем не замечено). Мы надеемся, что производители контроллеров будут улучшать работу контроллеров и поддержку входящих в стандарт Z-Wave функций.
Внутреннее устройство Z-Uno
![](https://habrastorage.org/files/60b/586/efe/60b586efe12147bba19ea5a936da2080.png)
Пользовательский код, он же «скетч» — это ваш код, написанный на упрощённом языке C и загруженный в Z-Uno посредством Arduino IDE. Пользовательский код управляет всеми «ногами» и логикой работы устройства. Вы сами решаете, как подключить ту или иную периферию!
Загрузчик пользовательского кода реализует уровень приложения Z-Wave в соответствии с пользовательскими настройками, определяет каналы и группы ассоциаций, задаёт режим сна. Он также управляет сервисными светодиодами и обрабатывает сервисные кнопки, необходимые для включения устройства в сеть, сброса и перевода в режим «восстановления» (режим, в котором пользовательский код не грузится). Но главная роль загрузчика состоит в том, чтобы вызывать Пользовательский код при получении пакетов Set (установка значения) и Get (запрос значения) из сети Z-Wave, а также вызов функции loop всё время, пока более низкие уровни не заняты. Данный уровень является основной частью «ядра» прошивки Z-Uno.
Уровень приложения Z-Wave отображает объявленные пользователем каналы, функции и ассоциации Z-Uno на классы команд Z-Wave, обеспечивая соответствие стандарту Z-Wave Plus. Данный уровень также предоставляет такие функции, как обновление прошивки, по USB и по радио (OTW и OTA), AES шифрование всех радио пакетов, мониторинг мощности радио сигнала, измерение заряда батарейки, периодические пробуждения, а также анонсирует в сеть базовую информацию об устройстве.
Сетевой уровень Z-Wave основан на SDK Sigma Designs (версии 6.5x), которая реализует сетевой и радио уровни протокола Z-Wave, устанавливая надёжную двухстороннюю связь в mesh-сети умного дома. Этот уровень занимается вычислением маршрутов, обеспечивая доставку пакетов получателям даже вне зоны прямой видимости, осуществляет пересылку (маршрутизацию) и приём пакетов.
Пользовательский код (скетч) компилируется в Arduino IDE с библиотеками Z-Uno Core Libraries, которые необходимо установить через Arduino Board Manager. Как и скетчи Arduino, скетчи Z-Uno являются обычными прошивками, скомпилированными для соответствующего микроконтроллера. Однако по сравнению с Arduino, основанной на микроконтроллерах Atmel, Z-Uno основана на чипе Z-Wave, т.е. архитектуре 8051. Потому вместо avg-gcc при сборке скетчей Z-Uno используется компилятор sdcc.
Есть ещё одно отличие от скетчей Arduino: скетчи Z-Uno должны взаимодействовать с уровнями ниже. Данное взаимодействие осуществляется через Z-Uno Core Libraries, с которыми компилируются скетчи Z-Uno.
Как уже упоминалось, Пользовательский код можно загрузить через Arduino IDE по USB (используя кнопку «Upload»), а также по радио через контроллер Z-Wave, поддерживающий обновление прошивок в устройствах.
Все нижние уровни (Загрузчик пользовательского кода, Уровень приложения Z-Wave и Сетевой уровень Z-Wave — все вместе) можно также обновить по USB из Arduino IDE (используя пункт меню «Upload Bootloader») или также по радио через контроллер Z-Wave.
Замечу, что эти нижние уровни скомпилированы с библиотеками Z-Wave SDK при помощи компилятора Keil C51, в то время как пользовательский код собран при помощи sdcc. Думаю, мы напишем отдельную статью о том, как мы скрещивали ежа с ужом. Ведь эти компиляторы даже имеют немного разные конвенции и ABI вызова функций.
Недостатки Z-Uno
Мы старались сделать идеальный продукт, но не всегда получается все гладко ;)
Увы первая выпущенная версия не помещается на одну макетную плату (из-за размера батарейки мы не смогли уменьшить плату). Но следующая версия будет у́же и поместится на одну стандартную макетку.
Также в текущей версии мы прогадали с выбором батарейки — текущая не способна нормально питать устройство в режиме FLiRS. Следующая не будет иметь батарейки на борту, а только кабель для подключения внешней батарейки.
Также текущая плата не имеет защиты от подключения одновременно батарейки и внешнего питания. Об этом напоминает защитная бумажка в отсеке для батареек. Но и это исправится.
Как видно, эти недостатки важны, но не критичны для большинства функций. В остальном устройство получилось весьма универсальным и подходит для создания множества датчиков и исполнительных устройств.
Также стоит отметить, что в отличии от Arduino, Z-Uno имеет на ногах 3 В, а не 5 В. Это следует учитывать, чтобы не спалить входы.
После нескольких workshop мы поняли, что продукт всё-таки получился сложным: те, кто знаком с Ардуино, должны познакомиться с экосистемой устройств Z-Wave и интерфейсом контроллеров Z-Wave, а те, кто знаком с Z-Wave, должны иметь базовые знания С. К счастью пересечение подмножеств этих людей весьма велико.
Чем Z-Uno не является
- Z-Uno представляет одно устройство (с несколькими каналами). Т.е. полноценным шлюзом между Z-Wave и другой технологией Z-Uno быть не сможет (для этого в Z-Wave есть Bridge Controller).
- Z-Uno — дочернее Z-Wave устройство и не может быть контроллером (т.е. строить и администрировать сеть). Однако через ассоциации Z-Uno может управлять другими устройствами.
- Z-Uno не является законченным устройством — вам потребуется подключить датчики (например, из списка совместимых с Arduino) и запрограммировать работу с ними.
Развитие проекта и планы
Как я уже упоминал, Z-Uno — быстро развивающийся проект. Мы поставили себе очень амбициозную цель, и уверенно шагаем к ней. Вот краткий план проекта на ближайшие месяцы:
- Январь — чистка синтаксиса, подготовка к сертификации Z-Wave Plus.
- Февраль — сертификация Z-Wave Plus, добавление функций работы с EEPROM, с памятью NZ XRAM.
- Март — добавление протоколов SPI, I2C, 1-wire.
- Апрель — выпуск обновлённой версии платы (для диапазона 865-870 МГц — частоты Z-Wave для России, Европы, Малайзии, Индии,...)
- Май и далее — добавление новых функций в порядке приоритета (на основе пожеланий пользователей).
- где-то к осени — выпуск версий платы для других регионов.
Следите за новостями!
Вся информация о ходе проекта публикуется на сайте z-uno.z-wave.me. Там же находится описание функций языка программирования C и примеры кода (на английском).
Также у нас есть англоязычный форум, посвященный Z-Uno.
Код Z-Uno Core Libraries доступен на github.
Информацию об ошибках и предложениях мы принимаем через github: вы можете создать тикет и доложить о проблеме.
Ну а купить-то где?
Z-Uno уже доступна (пока только в России) у наших партнёров 5 smart, которые в течение недели после данной публикации дарят 5% на все устройства Z-Wave по скидочному купону GT_ZUNO. Надеемся, скоро Z-Uno появится и в других магазинах.
Рекомендованная розничная цена 3500 руб.
Подробности проекта на сайте z-uno.z-wave.me.
![](https://habrastorage.org/files/411/4a5/0b9/4114a50b96ac43f799c7c8bbdfeed878.png)