![](https://habrastorage.org/files/744/190/a32/744190a3276d4215b251d7b2b42e8e4a.jpg)
В ассортименте компании «Мастер Кит» появилось заметное количество беспроводных устройств для домашней автоматизации, но вот собрать их в какую-то оптимальную систему управления домом часто бывает трудно из-за отсутствия необходимого, а главное удобного программного обеспечения. Для решения этой проблемы попробуем воспользоваться уже существующими популярными системами домашней автоматизации. Это реально! Например, система домашней автоматизации OpenHAB – это открытый проект, про который написано уже достаточно много даже в русскоязычной части Интернета.
Одна из таких публикаций: «OpenHAB – стань программистом собственного жилища» (рекомендую прочитать, если не сделали этого раньше).
Дистрибутив для совсем несложной установки OpenHAB можно взять абсолютно бесплатно здесь.
Будет логично, если я опущу описание OpenHAB и способа его установки на компьютер. Цель статьи – разобраться самому и показать вам несколько примеров подключения модулей «Мастер Кит» к OpenHAB.
Прежде всего, вам потребуется скачать и установить Runtime core – основной модуль OpenHAB, который не зависит от операционной системы.
![](https://habrastorage.org/files/a37/0d7/4f3/a370d74f35ea49eb946e711198e84762.jpg)
Для простоты я буду пользоваться обычным текстовым редактором Notepad, поскольку все файлы, с которыми придется иметь дело – текстовые. Просто в дальнейшем, мы будем сохранять их не в формате .txt, а с нужными расширениями; с какими именно – разберемся по ходу дела…
Установив демоверсию, я начал пробовать различные настройки, а когда стало получаться, убрал все «лишнее», чтобы не мешало. В итоге получилась небольшая конфигурация под названием «Тест-драйв МК». Ее можно скачать и установить себе на компьютер, чтобы не набирать вручную.
Еще одно необходимое подготовительное действие состояло в том, что я подключил все испытуемые устройства к той же локальной сети, что и компьютер с установленным OpenHAB.
![](https://habrastorage.org/files/172/b39/917/172b3991779d42788ad52f71398d899c.jpg)
Итак…
Тест-драйв устройства № 1
Wi-Fi-реле MP3500, 2 канала (на базе ESP8266).
Это первый модуль в линейке устройств на базе столь популярного сегодня Wi-Fi-чипа ESP8266. Он позволяет с помощью простенького приложения для Android (типа DEMO) щелкать двумя релюшками, считать время работы каждой нагрузки. Для этого надо либо подключиться к его собственной беспроводной сети, либо подключить его к домашней Wi-Fi сети.
![](https://habrastorage.org/files/aa1/e7e/c7f/aa1e7ec7f4da4efcbd910237ae5693a9.jpg)
Я выбрал второе, и с помощью прилагаемого Конфигуратора подключил модуль к той же локальной сети, что и OpenHAB. Сам модуль управляется AT-командами типа !SetR0_1, и присылает ответ формата !LEDOFF1. Подробно команды описаны здесь в разделе ПРИНЦИП РАБОТЫ.
Теперь непосредственно о настройке OpenHAB. Все файлы, которые мы будем менять, находятся в папке C:\OpenHab\configurations. Именно эту папку следует сохранять в качестве резервной копии.
1. Общие настройки. Находим в папке C:\OpenHab\configurations файл openhab.cfg. Это основные настройки системы. Далее, из DEMO-конфигурации OpenHAB, убираем лишние комментарии (строки, начинающиеся со знака #). Для нас здесь важно правильно запустить нужный нам «TCP — UDP Binding» – драйвер связи с устройствами по протоколам TCP/UDP, который будет обеспечивать связь с модулем MP3500 по протоколу UDP. Все настройки делаем именно для UDP (оставлены только нужные нам строки с пояснениями):
########### TCP — UDP Binding #######################
# Порт прослушивания для входящих соединений модулей семейства МР3500, 3502
udp:port=7777
# Максимальный размер буфера для считываемых данных и другие тонкие настройки
udp:buffersize=1024
udp:itemsharedconnections=true
udp:bindingsharedconnections=true
udp:directionssharedconnections=true
udp:selecttimeout=1000
udp:charset=ASCII
# Разрешить маску при адресации ip:port, например 192.168.0.1:*
udp:addressmask=true
# Без этого параметра биндинг вообще не запустится: интервал обновления
udp:refreshinterval=250
2. Интерфейс системы. После того как разобрались с настройками системы, займемся WEB-интерфейсом. Во многом (но не полностью) за него отвечает файл с расширением .sitemaps. Само название файла определяет адрес сайта в сети, который вы будете набирать в командной строке браузера.
![](https://habrastorage.org/files/b0f/901/d36/b0f901d36fe740c29f51f57d7919bad1.jpg)
Находится файл в папке C:\OpenHab\configurations\sitemaps. Чтобы получилась такая вот картинка главного экрана:
![](https://habrastorage.org/files/4f8/385/a57/4f8385a574d54d8dabdf13a942618fae.jpg)
Необходимо такое содержание файла testdrive.sitemap:
// Здесь описан заголовок
sitemap testdrive label=«Мастер Кит — OpenHAB»
{
Frame label=«Тест-драйв модулей Мастер Кит для домашней автоматизации» {
//Создаем группу для Wi-Fi модулей
Group item=gFF label=«Wi-Fi-модули» icon=«cellar»
}
// Оставим для подтверждения того что система «жива» вывод времени и даты. В //файле конфигурации для этого я оставил ссылку на сайт времени и период его обновления:
Frame label=«Дата и время» {
Text item=Date
Text item=Time
}
Не теряем фигурные скобки {} – они важны!
3. Описание в системе модуля MP3500 и способов управления им. Все элементы управления описываются в файле с расширением .items, который находится в папке C:\OpenHab\configurations\items.
Group gFF (All) //Создает страницу интерфейса для Wi-Fi-модулей
Group WIFI_3500 «MP3500 Wi-Fi реле, 2 канала» (gFF)
/* Страница для работы с MP3500 WiFi-реле, 2 канала */
Switch MP3500_R1 «MP3500_Реле 1» (WIFI_3500) { udp=">[ON:192.168.2.109:7777:MAP(MP3500_R1.map)], >[OFF:192.168.2.109:7777:MAP(MP3500_R1.map)]" }
Switch MP3500_R2 «MP3500_Реле 2» (WIFI_3500) { udp=">[ON:192.168.2.109:7777:MAP(MP3500_R2.map)], >[OFF:192.168.2.109:7777:MAP(MP3500_R2.map)]" }
Switch MP3500_R2_Button «MP3500_Реле 2 Импульс» (WIFI_3500) { udp=">[ON:192.168.2.109:7777:MAP(MP3500_R2_Pulse.map)]" }
Switch MP3500_Request «MP3500 Запросить состояние» (WIFI_3500) { udp=">[ON:192.168.2.109:7777:MAP(MP3500_Info.map)]" }
String MP3500_Stat «Получен ответ:[:%s]» (WIFI_3500) { udp="<[192.168.2.109:*:'REGEX((.*))])']" }
/* NTP binding demo item */
DateTime Date «Сегодня: [%1$tA, %1$td.%1$tm.%1$tY]» {ntp=«Europe/Moscow:en_EN»}
DateTime Time «Московское время: [%tT]» { ntp=«Europe/Moscow:en_EN» }
Файл с таким содержимым формирует на экране приведенную ниже страницу.
Внимание! В файле текст, относящийся к одному элементу (Item), должен быть написан в одну строчку. На странице данной публикации этот текст в одну строчку не умещается; смотрите исходный файл testdrive.items.
Элементы Group отвечают за группировку элементов управления и за переходы к ним по странице. Элементы DateTime обеспечивают отображение даты и времени на главной странице. За страницу управления самим модулем МР3500 отвечают 4 элемента типа Switch и один типа String.
Для примера я сделал выключатели для каждого из выходов. Это MP3500_Реле 1 и MP3500_Реле 2. Включенная лампочка и синий цвет движка выключателя говорят о включенном состоянии реле и, соответственно, наоборот. Это самый распространенный способ управления реле.
Третий сверху элемент MP3500_Реле 2 Импульс демонстрирует возможности WiFi-реле работать в импульсном режиме, то есть по нажатию на кнопку реле включается на заданный вами в программе промежуток времени, например, 2 секунды. После этого реле возвращается в выключенное состояние, а выключатель на экране вместе с лампочкой переходят так же в выключенное состояние.
![](https://habrastorage.org/files/80c/355/cdd/80c355cdd49b4e8aa730bf4f68b1f9f8.jpg)
Я не нашел в описании OpenHAB элемента типа КНОПКА, поэтому сброс выключателя в выключенное состояние пришлось делать самому с помощью инструмента ПРАВИЛА (Rules), но об этом ниже.
Кнопка MP3500 Запросить состояние позволяет считать информацию с модуля о его состоянии, а именно: включено или выключено каждое реле и время работы каждого реле в минутах – счетчик мото-часов. Иногда это полезно, например, для анализа расходов на отопление. Можно узнать сколько часов в день работает нагреватель для поддержания заданной температуры.
И строка Получен ответ, собственно говоря, отображается ответ модуля. На рисунке выше видно, что включен канал 1.
Теперь разберем структуру команды, которая управляет реле через запущенный нами TCP/UDP Binding. Общий шаблон команды выглядит так:
udp="[:::], [:::], ..."
(еще раз напомню – текст пишется в одну строку). Подробнее здесь.
Из шаблона видно:
• можно выбрать протокол, в нашем случае это udp;
• можно указать направление передачи, входящее или исходящее;
• привязаться к событию – команде OpenHAB;
• указать IP-адрес и порт;
• и… самое интересное, указать правило трансформации или преобразования, поскольку в явном виде передать в порт команду – сочетание символов типа !SetR0_1 не получится.
Подробнее о правилах трансформации (это важно)! Для хранения правил трансформации используются файлы с расширением .map. Они хранятся в папке C:\OpenHab\configurations\transform. Как обычно это простые текстовые файлы с содержимым вида:
ON=!StartPulseR2,2\r
OFF=!SetR0_2\r
То есть, вы описываете соответствие между командой OpenHAB и командой самого модуля. В первой строке, например, по команде ON, которая сгенерируется внутри OpenHAB при нажатии на изображение выключателя, в сам порт передается символьная строка !StartPulseR2,2\r, которая и заставит модуль МР3500 отработать. У такого подхода есть некоторое неудобство в том, что для каждого элемента управления приходится создавать свой файл, но если им дать понятные наименование, то жить можно. У меня папка с файлами получилась такая:
![](https://habrastorage.org/files/e44/960/990/e44960990b9a4077a046f83bfa258d45.jpg)
Теперь рассмотрим конкретную строку, например:
Switch MP3500_R1 «MP3500_Реле 1» (WIFI_3500) { udp=">[ON:192.168.2.109:7777:MAP(MP3500_R1.map)], >[OFF:192.168.2.109:7777:MAP(MP3500_R1.map)]" }
На человеческий язык она переводится так:
— Switch MP3500_R1 – элемент типа Switch с наименованием по системе MP3500_R1;
— «MP3500_Реле 1» – наименование, которое мы видим на экране;
— (WIFI_3500) – принадлежит группе WIFI_3500;
— udp=">[ON:192.168.2.109:7777:MAP(MP3500_R1.map)] – читается так: в случае появления команды ON установить исходящее соединение с адресом в сети 192.168.2.109* и через порт 7777 по протоколу UDP передать символы, которые находятся в файле MP3500_R1.map;
— >[OFF:192.168.2.109:7777:MAP(MP3500_R1.map)]"} – аналогично для команды OFF. Если были бы другие команды, то их можно было написать аналогично, через запятую.
*конкретный адрес, который присвоил именно мой роутер именно моему модулю, у вас будет свой адрес. Если будут трудности – обратитесь в службу техподдержки Мастер Кит.
Весь текст пишется все в одну строку. Нельзя забывать или пропускать круглые, квадратные и просто скобки, кавычки и запятые – все имеет значение. Часто именно по этой причине устройство и не работает.
Вот эта команда считывает ответ модуля и отображает его в строке «Получен ответ».
String MP3500_Stat «Получен ответ:[:%s]» (WIFI_3500) { udp="<[192.168.2.109:*:'REGEX((.*))']" }
Обратите внимание – здесь уже входящее соединение и я использовал маску (*) для того, чтобы сигнал считывался с любого порта. Если указать порт 7777, то ничего читаться не будет. Об это я «убил» пару вечеров. Но вам это теперь не грозит. Рассмотрим новые и непонятные части команды:
'REGEX((.*))' – это функция «Регулярное выражение», с помощью которой в считанной строке можно найти и выделить нужные части текста. Применяется во многих языках программирования. Подробнее здесь.
Я буду объяснять, как пользоваться этим механизмом по мере необходимости при подключении следующих модулей (еще та заморочка!), а данный, самый простой случай, расшифровывается так: считать (захватить) любое количество любых символов во входящей строке кроме знака окончания .
[:%s] – эта часть команды выводит считанное значение на экран.
4. Работа. Это минимум, который необходим для того чтобы начать управлять Wi-Fi-реле MP3500. Подаем питание, ждем регистрации в сети и начинаем нажимать кнопки.
Предварительно можно посмотреть небольшой видеоролик:
5. И в заключение, несколько слов о том, как на экране заставить выключатель автоматически перейти в состоянии OFF в режиме КНОПКА. Для этого находим в папке C:\OpenHab\configurations\rules файл testdrive.rules. Используем возможности внутреннего таймера системы.
Если не рассматривать стандартное подключение нужных библиотек и объявление переменных, то основной элемент кода вот этот:
if(receivedCommand==ON) {
if(timer==null) {
timer = createTimer(now.plusSeconds(2)) [|
sendCommand(MP3500_R2_Button, OFF)
Если полученная команда равна ON и таймер сброшен, запускаем новый цикл таймера до момента «от сейчас» до «плюс N» секунд и после этого шлем команду OFF нужному элементу. 2 – это как раз количество секунд, которое я использую для управления реле в команде ON=!StartPulseR2,2\r, то есть включить реле 2 на 2 секунды.
Это была вступительная часть, дальше будет короче и интересней, поскольку не придется говорить о базовых вещах, таких как расположение папок. Зима не за горами, будем подключать WiFi – термостат MP3502 к OpenHAB.
Надеюсь, что вы установите OpenHAB на свой компьютер и тоже начнете эксперименты по управлению своим жилищем.
п.с. Кстати, у OpenHAB есть и мобильное приложение!
Автор: Miklebor