Добавление шлюза Xiaomi и подключенных к нему устройств в OpenHAB 2
Сегодня поговорим о том, как прокинуть ZigBee датчики и устройства компании Xiaomi подключенные к Xiaomi Gateway 2 в OpenHAB 2. Преимуществом является то, что после подключения программа Mi Home не нужна, Xiaomi Gateway не обязателен доступ в интернет для связи с облаком, добавление ZigBee устройств, создание автоматизаций и их обработка осуществляется в OpenHAB.
Поддерживаемые устройства в OpenHAB 2
OpenHAB поддерживает следующие устройства и датчики:
- Xiaomi Gateway 2 со светильником и радио. В обновленном варианте он назывался Gateway 3, но в исполнении таком же, как и v.2, и не имеет никакого отношения к Xiaomi Gateway 3 выполненному в виде белой шайбы с ZigBee 3 и BLE шлюзом на борту.
- Датчики открытия Mijia и Aqara.
- Кнопки Mijia, Aqara и Aqara с датчиком ускорения.
- Датчики температуры Mijia и Aqara.
- Датчики движения Mijia и Aqara.
- Датчик вибрации Aqara.
- Датчик протечек Aqara.
- Контроллеры кубики Mi и Aqara.
- Детектор дыма Honeywell.
- Детектор газа Honeywell.
- Беспроводные выключатели Aqara с одной и двумя клавишами.
- Проводные выключатели Aqara с одной и двумя клавишами, с нейтральной линией и без неё.
- Умные розетки Aqara, версии plug и wall.
- Мотор для штор.
- Умный замок Aqara.
Предварительная настройка
Для добавления устройств Xiaomi в OpenHAB 2 первым делом необходимо установить интеграцию, запускаем Paper UI, меню Add-ons -> Bindings -> Xiaomi Mi Smart Home Binding -> Install
.
В шлюзе Xiaomi необходимо включить режим управления LAN, как это сделать подробно написано в статье: Xiaomi Gateway включение режима управления LAN, открытие порта 9898.
Вариант #1. Добавление устройств в интерфейсе OpenHAB 2.
После установки интеграции добавление устройств можно производить непосредственно в интерфейсе Paper UI, меню Inbox -> в правом верхнем углу иконка в виде антенны ->
в появившемся окне, рядом с надписью Xiaomi Mi Smart Home Binding кнопка Refresh
в виде антенны.
В списке Inbox
отобразятся найденные шлюзы, забегая вперед отмечу, что в Inbox
отображаются все найденные устройства. Нажимаем на синюю кнопку "с галочкой" для добавления устройства в систему. В открывшемся окне в поле Name
вводим понятное имя добавляемого устройства -> Add as Thing
.
Переходим в меню Configuration -> Things
, в списке находим добавленный шлюз, нажимает кнопку Edit Thing
оформленной в виде карандаша. В поле Developer Key
вводим ключ, полученный ранее при активации режима управления по сети или как он назывался ранее режим разработчика.
После добавления Develop Key
в списке Inbox
начнут появляться устройства и датчики, подключенные к шлюзу. Переходим в список Inbox
и поочередно добавляем каждое устройство. Обратите внимание, что после добавления шлюза в Inbox появляется устройство Xiaomi Mi Smart Home Gateway
, это устройство включает в себя, светильник, датчик освещенности и звуковое управление, но добавляется оно отдельно от основного шлюза. Функция радио не поддерживается.
После добавления устройства отображаться в меню Configuration -> Things
. Необходимо зайти в каждое добавленное устройство и настроить его свойства, кнопка Edit Thing
. В поле Name
указывается понятное имя устройства, если оно не было указано при добавлении, в поле Location
указывается местоположение устройства. Поле Location
желательно заполнять т.к. устройства сортируются во вкладки с названием место расположений в меню Control
. В меню редактирования нажав на синюю кнопку "с галочкой" открываются свойства устройства - Channels, это датчики и управление, например, для розетки это будут:
- Тумблер управления, включить/отключить розетку
- Текущее состояние розетки
- Потребляемая мощность в текущий момент
- Общее количество потребленного электричества
Эти свойства необходимо заполнить для снятия показаний и управления устройствами и датчиками в OpenHAB. Разворачиваем свойство кнопкой справа в виде стрелок вверх-вниз
. Добавляем Link item
, в выпадающем меню Please select the item to link:
выбираем + Create new Item...
Для каждого устройства все свойства должны быть уникальными в рамках всей системы автоматизации, обычно в названия свойства подставляется имя устройства и тип свойства, например, socketTV_power
. Далее указывается Label
, категория и тип свойства, обычно, если устройство, поддерживаемое системой автоматизации, то эти поля заполняются автоматически, достаточно изменить только поле Name
. Далее кнопка Link
.
Channels
с настроенными свойствами немного меняют значок. Далее необходимо заполнить все необходимые свойства подключенных устройств.
ВНИМАНИЕ! При удалении устройства или датчика в разделе Configuration -> Things
оно удаляется в том числе и со шлюза!
Вариант #2. Добавление устройств через конфигурационные файлы.
Второй способ мне нравится больше, т.к. он более гибок, шлюз и устройства, подключенные к нему, описываются в конфигурационном файле, файл кладется в папку things
, далее в папке items создается конфигурационный файл со свойствами Channels всех ранее описанных устройств. После сохранения вся описанная конфигурация автоматически попадает в OpenHAB. Это удобно, можно отключить одно или несколько устройств закомментировав соответствующие строчки, легко менять имена устройств и их свойств, для резервной копии или переноса на другое железо достаточно только одних файлов конфигурации. Переустановив OpenHAB пару раз, я остановился именно на этом варианте :)
Документация о подключении устройств Xiaomi на официальном сайте OpenHAB.
В сборке openHABian все файлы конфигурации хранятся в папке /etc/openhab2
, папка доступна через сервер Samba по адресу \\openHAB_IP_address\openHAB-conf
, логин по умолчанию openhabian
, пароль openhabian
. В OpenHAB установленном на другие системы, расположение папки конфигурации может отличаться.
Создаем новый файл xiaomi.things
в папке /etc/openhab2/things
.
$ sudo touch /etc/openhab2/things/xiaomi.things
Создать этот файл можно в блокноте и положить потом в эту папку через шару по адресу \\openHAB_IP_address\openHAB-conf\things
.
Заполняем файл xiaomi.things
:
Bridge mihome:bridge:7cXXXXXXXX01 "Xiaomi Gateway v.2 #01" [ serialNumber="7cXXXXXXXX01", ipAddress="192.168.100.211", port=9898, key="xxxxxxxxxxxxxxxx", pollingInterval=6000 ] { Things: gateway xiaomi_gateway_01 "Xiaomi Mi Smart Home Gateway #01" @ "Location" [itemId="7cXXXXXXXX01"] sensor_magnet xiaomi_door_sensor "Датчик открытия" @ "Location" [itemId="158d00XXXXXX01"] sensor_switch xiaomi_button "Кнопка" @ "Location" [itemId="158d00XXXXXX02"] sensor_ht xiaomi_temperature "Датчик температуры и влажности" @ "Location" [itemId="158d00XXXXXX03"] sensor_weather_v1 xiaomi_weather "Датчик температуры, влажности и давления" @ "Location" [itemId="158d00XXXXXX04"] sensor_motion xiaomi_motion_1 "Датчик движения 1" @ "Location" [itemId="158d00XXXXXX05"] sensor_motion_aq2 xiaomi_motion_2 "Датчик движения 2" @ "Location" [itemId="158d00XXXXXX06"] sensor_vibration xiaomi_vibration "Датчик вибрации" @ "Location" [itemId="158d00XXXXXX07"] sensor_wleak_aq1 xiaomi_leak "Датчик протечки" @ "Location" [itemId="158d00XXXXXX08"] sensor_cube xiaomi_cube "Кубик" @ "Location" [itemId="158d00XXXXXX10"] 86sw1 xiaomi_ww_1ch "Беспроводной выкл. 1 кл." @ "Location" [itemId="158d00XXXXXX11"] 86sw2 xiaomi_ww_2ch "Беспроводной выкл. 2 кл." @ "Location" [itemId="158d00XXXXXX12"] ctrl_neutral1 xiaomi_ws_1ch "Настенный выкл. 1 кл." @ "Location" [itemId="158d00XXXXXX13"] ctrl_neutral2 xiaomi_ws_2ch "Настенный выкл. 2 кл." @ "Location" [itemId="158d00XXXXXX14"] sensor_plug xiaomi_wall_socket "Розетка" @ "Location" [itemId="158d00XXXXXX15"] } Bridge mihome:bridge:7cXXXXXXXX02 "Xiaomi Gateway v.2 #02" [ serialNumber="7cXXXXXXXX02", ipAddress="192.168.100.212", port=9898, key="yyyyyyyyyyyyyyy", pollingInterval=6000 ] { Things: gateway xiaomi_gateway_02 "Xiaomi Mi Smart Home Gateway #02" @ "Location" [itemId="7cXXXXXXXX02"] sensor_magnet xiaomi_door_sensor_2 "Датчик открытия 2" @ "Location" [itemId="158d01XXXXXX01"] sensor_ht xiaomi_temperature_2 "Датчик температуры и влажности 2" @ "Location" [itemId="158d01XXXXXX02"] sensor_motion_aq2 xiaomi_motion_3 "Датчик движения 3" @ "Location" [itemId="158d01XXXXXX03"] sensor_cube xiaomi_cube_2 "Кубик 2" @ "Location" [itemId="158d01XXXXXX04"] sensor_plug xiaomi_plug_socket "Розетка 2" @ "Location" [itemId="158d01XXXXXX06"] }
7cXXXXXXXX01 - ID шлюза, обычно это MAC адрес, записанный в нижнем регистре без разделительных символов.
xiaomi_gateway_01 - Frandly name. Любое имя устройства для удобства его идентификации.
158d00XXXXXX01 - ID устройства или датчика, подключенного к шлюзу.
xiaomi_door_sensor - Frandly name. Любое имя устройства или датчика для удобства его идентификации.
Location - Место расположения устройства или датчика.
Возникает вопрос, если с ID шлюза понятно, MAC адрес написан на задней стороне шлюза, то как легко получить ID подключенных устройств? Можно пойти двумя путями:
Способ #1. Заходим в Mi Home, открываем необходимый шлюз, раздел Три точки в правом верхнем углу -> Сведения -> Информация о шлюзе
. В этом разделе описана конфигурация шлюза и перечислены подключенные устройства с их ID и названиями. Скопировав информацию в текстовый файл можно легко разложить всё по полочкам.
Способ #2. В конфигурационный файл /etc/openhab2/things/xiaomi.things
добавляем только шлюз и сохраняем его. Все подключенные устройства появятся в разделе Inbox
.
Bridge mihome:bridge:7cXXXXXXXX01 "Xiaomi Gateway v.2 #01" [ serialNumber="7cXXXXXXXX01", ipAddress="192.168.100.211", port=9898, key="xxxxxxxxxxxxxxxx", pollingInterval=6000 ] { Things: gateway xiaomi_gateway_02 "Xiaomi Mi Smart Home Gateway #02" @ "Location" [itemId="7cXXXXXXXX02"] }
Добавив все шлюзы, подключенные к ним датчики и сохранив файл /etc/openhab2/things/xiaomi.things,
надо описать их свойства items
.
Создаем новый файл xiaomi.items
в папке /etc/openhab2/items
.
$ sudo touch /etc/openhab2/items/xiaomi.items
Создать этот файл можно в блокноте и положить потом в эту папку через шару по адресу \\openHAB_IP_address\openHAB-conf\items
.
Заполняем файл xiaomi.items
:
// Xiaomi Mi Smart Home Gateway #01 - xiaomi_gateway_01 Switch xiaomi_gateway_01_Discovery "Режим обнаружения:" <bool> { channel="mihome:gateway:7cXXXXXXXX01:xiaomi_gateway_01:joinPermission" } Switch xiaomi_gateway_01_LightSwitch "Свет Вкл/Выкл:" <light> { channel="mihome:gateway:7cXXXXXXXX01:xiaomi_gateway_01:brightness" } Dimmer xiaomi_gateway_01_Brightness "Яркость:" <dimmablelight> { channel="mihome:gateway:7cXXXXXXXX01:xiaomi_gateway_01:brightness" } Number xiaomi_gateway_01_AmbientLight "Освещенность:" <sun> { channel="mihome:gateway:7cXXXXXXXX01:xiaomi_gateway_01:illumination" } Color xiaomi_gateway_01_Color "Цвет:" <rgb> { channel="mihome:gateway:7cXXXXXXXX01:xiaomi_gateway_01:color" } Dimmer xiaomi_gateway_01_ColorTemperature "Температура:" <heating> { channel="mihome:gateway:7cXXXXXXXX01:xiaomi_gateway_01:colorTemperature" } Switch xiaomi_gateway_01_SoundSwitch "Откл. звук:" <soundvolume_mute> { channel="mihome:gateway:7cXXXXXXXX01:xiaomi_gateway_01:enableSound" } Number xiaomi_gateway_01_Sound "Мелодия:" <soundvolume-0> { channel="mihome:gateway:7cXXXXXXXX01:xiaomi_gateway_01:sound" } Dimmer xiaomi_gateway_01_SoundVolume "Громкость:" <soundvolume> { channel="mihome:gateway:7cXXXXXXXX01:xiaomi_gateway_01:volume" } // Датчик открытия - xiaomi_door_sensor Contact xiaomi_door_sensor_Status "Состояние:" <window> { channel="mihome:sensor_magnet:7811dce1b8b2:xiaomi_door_sensor:isOpen" } Number xiaomi_door_sensor_AlarmTimer "Время сигнала открытия:" <clock> { channel="mihome:sensor_magnet:7811dce1b8b2:xiaomi_door_sensor:isOpenAlarmTimer" } DateTime xiaomi_door_sensor_LastOpened "Последнее открытие: [%1$td.%1$tm.%1$tY %1$tH:%1$tM:%1$tS]" <clock-on> { channel="mihome:sensor_magnet:7811dce1b8b2:xiaomi_door_sensor:lastOpened" } Number xiaomi_door_sensor_Battery "Батарея:" <battery> { channel="mihome:sensor_magnet:7811dce1b8b2:xiaomi_door_sensor:batteryLevel" } Switch xiaomi_door_sensor_BatteryLow "Низкий заряд:" <energy> { channel="mihome:sensor_magnet:7811dce1b8b2:xiaomi_door_sensor:lowBattery" } // Датчик температуры и влажности - xiaomi_temperature Number:Temperature xiaomi_temperature_Temperature "Температура:" <temperature> { channel="mihome:sensor_ht:7cXXXXXXXX01:xiaomi_temperature:temperature" } Number:Dimensionless xiaomi_temperature_Humidity "Влажность:" <humidity> { channel="mihome:sensor_ht:7cXXXXXXXX01:xiaomi_temperature:humidity" } Number xiaomi_temperature_Battery "Батарея:" <battery> { channel="mihome:sensor_ht:7cXXXXXXXX01:xiaomi_temperature:batteryLevel" } Switch xiaomi_temperature_BatteryLow "Низкий заряд:" <energy> { channel="mihome:sensor_ht:7cXXXXXXXX01:xiaomi_temperature:lowBattery" } // Датчик температуры, влажности и давления - xiaomi_weather Number:Temperature xiaomi_weather_Temperature "Температура:" <temperature> { channel="mihome:sensor_weather_v1:7cXXXXXXXX01:xiaomi_weather:temperature" } Number:Dimensionless xiaomi_weather_Humidity "Влажность:" <humidity> { channel="mihome:sensor_weather_v1:7cXXXXXXXX01:xiaomi_weather:humidity" } Number:Pressure xiaomi_weather_Pressure "Давление:" <pressure> { channel="mihome:sensor_weather_v1:7cXXXXXXXX01:xiaomi_weather:pressure" } Number xiaomi_weather_Battery "Батарея:" <battery> { channel="mihome:sensor_weather_v1:7cXXXXXXXX01:xiaomi_weather:batteryLevel" } Switch xiaomi_weather_BatteryLow "Низкий заряд: "<energy> { channel="mihome:sensor_weather_v1:7cXXXXXXXX01:xiaomi_weather:lowBattery" } // Датчик движения 1 - xiaomi_motion_1 Switch xiaomi_motion_1_MotionStatus "Статус:" <motion> { channel="mihome:sensor_motion:7cXXXXXXXX01:xiaomi_motion_1:motion" } Number xiaomi_motion_1_MotionTimer "Отлипание:" <clock> { channel="mihome:sensor_motion:7cXXXXXXXX01:xiaomi_motion_1:motionOffTimer" } DateTime xiaomi_motion_1_LastMotion "Последняя активность: [%1$td.%1$tm.%1$tY %1$tH:%1$tM:%1$tS]" <clock-on> { channel="mihome:sensor_motion:7cXXXXXXXX01:xiaomi_motion_1:lastMotion" } Number xiaomi_motion_1_Battery "Батарея:" <battery> { channel="mihome:sensor_motion:7cXXXXXXXX01:xiaomi_motion_1:batteryLevel" } Switch xiaomi_motion_1_BatteryLow "Низкий заряд:" <energy> { channel="mihome:sensor_motion:7cXXXXXXXX01:xiaomi_motion_1:lowBattery" } // Датчик движения 2 - xiaomi_motion_2 Switch xiaomi_motion_2_MotionStatus "Статус:" <motion> { channel="mihome:sensor_motion_aq2:7cXXXXXXXX01:xiaomi_motion_2:motion" } Number xiaomi_motion_2_Lux "LUX [%.1f]" <sun> { channel="mihome:sensor_motion_aq2:7cXXXXXXXX01:xiaomi_motion_2:illumination" } // minimum 5 seconds - the sensor only triggers once every minute to save energy Number xiaomi_motion_2_MotionTimer "Отлипание:" <clock> { channel="mihome:sensor_motion_aq2:7cXXXXXXXX01:xiaomi_motion_2:motionOffTimer" } DateTime xiaomi_motion_2_LastMotion "Последняя активность: [%1$td.%1$tm.%1$tY %1$tH:%1$tM:%1$tS]" <clock-on> { channel="mihome:sensor_motion_aq2:7cXXXXXXXX01:xiaomi_motion_2:lastMotion" } Number xiaomi_motion_2_Battery "Батарея:" <battery> { channel="mihome:sensor_motion_aq2:7cXXXXXXXX01:xiaomi_motion_2:batteryLevel" } Switch xiaomi_motion_2_BatteryLow "Низкий заряд:" <energy> { channel="mihome:sensor_motion_aq2:7cXXXXXXXX01:xiaomi_motion_2:lowBattery" } // Датчик вибрации - xiaomi_vibration DateTime xiaomi_vibration_LastAction "[%1$tY-%1$tm-%1$td %1$tH:%1$tM]" <clock-on> { channel="mihome:sensor_vibration:7cXXXXXXXX01:xiaomi_vibration:lastAction" } Number xiaomi_vibration_TiltAngle { channel="mihome:sensor_vibration:7cXXXXXXXX01:xiaomi_vibration:tiltAngle" } Number xiaomi_vibration_CoordinateX { channel="mihome:sensor_vibration:7cXXXXXXXX01:xiaomi_vibration:coordinateX" } Number xiaomi_vibration_CoordinateY { channel="mihome:sensor_vibration:7cXXXXXXXX01:xiaomi_vibration:coordinateY" } Number xiaomi_vibration_CoordinateZ { channel="mihome:sensor_vibration:7cXXXXXXXX01:xiaomi_vibration:coordinateZ" } Number xiaomi_vibration_BedActivity { channel="mihome:sensor_vibration:7cXXXXXXXX01:xiaomi_vibration:bedActivity" } Number xiaomi_vibration_Battery <battery> { channel="mihome:sensor_vibration:7cXXXXXXXX01:xiaomi_vibration:batteryLevel" } Switch xiaomi_vibration_BatteryLow <energy> { channel="mihome:sensor_vibration:7cXXXXXXXX01:xiaomi_vibration:lowBattery" } // Датчик протечки - xiaomi_leak Switch xiaomi_leak_LeakDetected "Протечка:" <leak> { channel="mihome:sensor_wleak_aq1:7cXXXXXXXX01:xiaomi_leak:leak" } Number xiaomi_leak_Battery "Батарея:" <battery> { channel="mihome:sensor_wleak_aq1:7cXXXXXXXX01:xiaomi_leak:batteryLevel" } Switch xiaomi_leak_BatteryLow "Низкий заряд:" <energy> { channel="mihome:sensor_wleak_aq1:7cXXXXXXXX01:xiaomi_leak:lowBattery" } // Кубик - xiaomi_cube DateTime xiaomi_cube_LastAction "Последняя активность: [%1$td.%1$tm.%1$tY %1$tH:%1$tM:%1$tS]" <clock-on> { channel="mihome:sensor_cube:7cXXXXXXXX01:xiaomi_cube:lastAction" } Number:Angle xiaomi_cube_RotationAngle { channel="mihome:sensor_cube:7cXXXXXXXX01:xiaomi_cube:rotationAngle" } Number:Time xiaomi_cube_RotationTime { channel="mihome:sensor_cube:7cXXXXXXXX01:xiaomi_cube:rotationTime" } Number xiaomi_cube_Battery "Батарея:" <battery> { channel="mihome:sensor_cube:7cXXXXXXXX01:xiaomi_cube:batteryLevel" } Switch xiaomi_cube_BatteryLow "Низкий заряд:" <energy> { channel="mihome:sensor_cube:7cXXXXXXXX01:xiaomi_cube:lowBattery" } // Беспроводной выкл. 1 кл. - xiaomi_ww_1ch Number xiaomi_ww_1ch_Battery <battery> { channel="mihome:86sw1:7cXXXXXXXX01:xiaomi_ww_1ch:batteryLevel" } Switch xiaomi_ww_1ch_BatteryLow <energy> { channel="mihome:86sw1:7cXXXXXXXX01:xiaomi_ww_1ch:lowBattery" } // Беспроводной выкл. 2 кл. - xiaomi_ww_2ch Number xiaomi_ww_2ch_Battery "Батарея:" <battery> { channel="mihome:86sw2:7cXXXXXXXX01:xiaomi_ww_2ch:batteryLevel" } Switch xiaomi_ww_2ch_BatteryLow "Низкий заряд:" <energy> { channel="mihome:86sw2:7cXXXXXXXX01:xiaomi_ww_2ch:lowBattery" } // Настенный выкл. 1 кл. - xiaomi_ws_1ch Switch xiaomi_ws_1ch "Вкл/Выкл:" <switch> { channel="mihome:ctrl_neutral1:7cXXXXXXXX01:xiaomi_ws_1ch:ch1" } // Настенный выкл. 2 кл. - xiaomi_ws_2ch Switch xiaomi_ws_2ch_L1 "Левая клавиша" <switch> { channel="mihome:ctrl_neutral2:7811dce1b8b2:xiaomi_ws_2ch:ch1" } Switch xiaomi_ws_2ch_L2 "Правая клавиша" <switch> { channel="mihome:ctrl_neutral2:7811dce1b8b2:xiaomi_ws_2ch:ch2" } // Розетка - xiaomi_wall_socket Switch xiaomi_wall_socket_Switch "Вкл/Выкл:" <switch> { channel="mihome:sensor_plug:7cXXXXXXXX01:xiaomi_wall_socket:power" } Switch xiaomi_wall_socket_Active "Состояние:" <switch> { channel="mihome:sensor_plug:7cXXXXXXXX01:xiaomi_wall_socket:inUse" } Number xiaomi_wall_socket_Power2 "Нагрузка:" <energy> { channel="mihome:sensor_plug:7cXXXXXXXX01:xiaomi_wall_socket:loadPower" } Number xiaomi_wall_socket_Consumption "Потребление:" <line-incline> { channel="mihome:sensor_plug:7cXXXXXXXX01:xiaomi_wall_socket:powerConsumed" }
Сохраняем файл, переходим в Configuration -> Things
проверяем, что все устройства подхватили свойства. Перейдя в раздел меню Control
проверяем что все устройства появились в своих локациях.
При возникновении ошибок читаем логи OpenHAB. Для OpenHABian на стартовой странице есть отличный инструмент OpenHAB Log Viwer
, отображающий записи лог файла в реальном времени.