Подключение увлажнителя Xiaomi Humidifier к Domoticz

Более детальная инструкция. Основа взята здесь. Может кому будет интересно.

1. Предварительная установка необходимых пакетов на Raspberry Pi3

Устанавливаем требуемую версию пакета node v6. Если стоит старая (проверить версию можно выполнив команду: node -v < v6), то удаляем из системы.

pi@raspberry:~ $ sudo curl -sL https://deb.nodesource.com/setup_6.x | bash –
pi@raspberry:~ $ sudo apt-get install -y nodejs
pi@raspberry:~ $ node -v
v6.11.3
pi@raspberry:~ $ nodejs -v
v6.11.3
pi@raspberry:~ $ sudo apt-get install sudo screen jq

2. Создаем отдельную папку для подключаемых внешних устройств (Xiaomi), где будем хранить все их конфигурации и скрипты.

Я для этого создал каталог /devices в /home/pi/domoticz.

pi@raspberry:~ cd /home/pi/domoticz/devices/humidifier

Важно в каждом каталоге устройства (в моем случае это /humidifier) выполнять следующие команды для установки npm модулей.

Miio – это протокол по которому управляются устройства Xiaomi Mijia такие как: Mi Air Purifier, Mi Robot Vacuum, Mi Smart Socket и пр.

pi@raspberry:~/domoticz/devices/humidifier $ npm install –save miio

Результат выполнения команды имеет следующий вид:

pi@raspberry:~/domoticz/devices/humidifier $ npm install -g miio/home/pi/domoticz/devices/humidifier

L-T miio@0.13.0
+– appdirectory@0.1.0
+-T chalk@1.1.3
¦ +– ansi-styles@2.2.1
¦ +– escape-string-regexp@1.0.5
¦ +-T has-ansi@2.0.0
¦ ¦ L– ansi-regex@2.1.1
¦ +– strip-ansi@3.0.1
¦ L– supports-color@2.0.0
+-T debug@2.6.9
¦ L– ms@2.0.0
+– minimist@1.2.0
L-T mkdirp@0.5.1
L– minimist@0.0.8
npm WARN humidifier No description
npm WARN humidifier No repository field.
npm WARN humidifier No README data
npm WARN humidifier No license field.

 

 

/usr/bin/miio -> /usr/lib/node_modules/miio/cli/index.js
/usr/lib
L-T miio@0.13.0
+– appdirectory@0.1.0
+-T chalk@1.1.3
¦ +– ansi-styles@2.2.1
¦ +– escape-string-regexp@1.0.5
¦ +-T has-ansi@2.0.0
¦ ¦ L– ansi-regex@2.1.1
¦ +– strip-ansi@3.0.1
¦ L– supports-color@2.0.0
+-T debug@2.6.9
¦ L– ms@2.0.0
+– minimist@1.2.0
L-T mkdirp@0.5.1
L– minimist@0.0.8

смотрим что появилось:
pi@raspberry:~/domoticz/devices/humidifier

root@rp1>  ls -l
node_modules

3. Проверка работы miio, поиск токен ключей и прочей полезной информации по устройствам Xiaomi в сети. Domoticz и все управляемые устройства должны быть в одной подсети (в моем случае это 192.168.1.0/24).

pi@raspberry:~/domoticz/devices/humidifier $ sudo miio –discover –sync. 

4. Далее в папке …/humidifier создадим несколько скриптов с именами.

– humidifier.js (скрипт управления через cli)
– purupdatedomoticz.sh (скрипт обновления данных с датчиков увлажнителя)
– humidifiercontrol.sh (скрипт работы увлажнителя)
– startup.sh (скрипт запуска для сбора данных температуры и влажности)
– humidifier.lua (cценарий управления событиями Lua Domoticz)

4.1. Скрипт humidifier.js (можно скопировать и вставить в ваш файл)

 

#!/usr/sbin/node
/* eslint-disable */

// Location of miio node lib
const miio = require(‘miio’);

// No need to change any lines in this section
var deviceip = process.argv[2];
var secondarg = process.argv[3];
var thirdarg = process.argv[4];
function exit() {
process.exit(-1);
}

// Power On (on / off specified as on or off)
if ( secondarg === “power” ) {
setTimeout(exit, 7000);
miio.device({
address: deviceip
}).then(device => {
return device.call(‘set_power’, [thirdarg])
.then(console.log)
.catch(console.error);
})}

// Status
if ( secondarg === “status” ) {
setTimeout(exit, 7000);
miio.device({
address: deviceip
}).then(device => {
return device.call(‘get_prop’, [“humidity”,”temp_dec”,”power”,”mode”,”led_b”,”buzzer”,”child_lock”,”limit_hum”,”trans_level”])
.then(console.log)
.catch(console.error);
})}

// Status temperature and humidity only
if ( secondarg === “status2” ) {
setTimeout(exit, 7000);
miio.device({
address: deviceip
}).then(device => {
return device.call(‘get_prop’, [“temp_dec”,”humidity”])
.then(console.log)
.catch(console.error);
})}

// Set mode (silent, medium or high)
if ( secondarg === “mode” ) {
setTimeout(exit, 7000);
miio.device({
address: deviceip
}).then(device => {
return device.call(‘set_mode’, [thirdarg])
.then(console.log)
.catch(console.error);
})}

// Set buzzer (on or off)
if ( secondarg === “buzzer” ) {
setTimeout(exit, 7000);
miio.device({
address: deviceip
}).then(device => {
return device.call(‘set_buzzer’, [thirdarg])
.then(console.log)
.catch(console.error);
})}

// led
if ( secondarg === “led” ) {
setTimeout(exit, 7000);
miio.device({
address: deviceip
}).then(device => {
return device.call(‘set_led_b’, [JSON.parse(thirdarg)])
.then(console.log)
.catch(console.error);
})}

// Humidity limit percent (specified as 40, 50, 60, 70 or 80)
if ( secondarg === “humiditylimit” ) {
setTimeout(exit, 7000);
miio.device({
address: deviceip
}).then(device => {
return device.call(‘set_limit_hum’, [JSON.parse(thirdarg)])
.then(console.log)
.catch(console.error);
})}

PS: ключи по работе со скриптом:

pi@raspberry:~/domoticz/devices/humidifier $ node humidifier.js 192.168.1.54 power off
pi@raspberry:~/domoticz/devices/humidifier $ node humidifier.js 192.168.1.54 status
pi@raspberry:~/domoticz/devices/humidifier $ node humidifier.js 192.168.1.54 status2
pi@raspberry:~/domoticz/devices/humidifier $ node humidifier.js 192.168.1.54 mode medium
pi@raspberry:~/domoticz/devices/humidifier $ node humidifier.js 192.168.1.54 buzzer off
pi@raspberry:~/domoticz/devices/humidifier $ node humidifier.js 192.168.1.54 led 2
pi@raspberry:~/domoticz/devices/humidifier $ node humidifier.js 192.168.1.54 humiditylimit 50

где 192.168.1.54 – IP адрес нашего увлажнителя.

например, получить состояния нашего увлажнителя можно так:

pi@raspberry:~/domoticz/devices/humidifier $ node humidifier.js 192.168.1.54 status
[ 40, 252, ‘off’, ‘silent’, 2, ‘on’, ‘off’, 60, 25 ]

4.2. скрипт purupdatedomoticz.sh (можно скопировать и вставить в ваш файл)

 

#!/bin/bash
cd /home/pi/domoticz/devices/humidifier
while true; do

# Get the data
data=$(node /home/pi/domoticz/devices/humidifier/humidifier.js 192.168.1.54 status2)
# Sort it
temperature=$(echo “$data” | jq ‘.[0]’ | sed ‘s/.\{2\}/&./g’)
humidity=$(echo “$data” | jq ‘.[1]’)

# Load it into Domoticz
curl -s “http://192.168.1.30:8080/json.htm?type=command&param=udevice&idx=134&nvalue=0&svalue=${temperature};${humidity};0”

sleep 60
done

некоторые пояснения по скрипту, где:

cd /home/pi/domoticz/devices/humidifier – указываем файловую папку для устройства со всеми данными
data=$(node /home/pi/domoticz/devices/humidifier/humidifier.js 192.168.1.54 status2) – наши данные по температуре и влажности
curl -s “http://192.168.1.30:80…erature};${humidity};0

где : idx134 – это индексный номер виртуального сенсора Датчика Увлажнителя (см. п. 5.1)
192.168.1.30:8080 – IP адрес сервера domoticz с его портом
admin:password – логин с паролем для входа в domoticz (он необходим, если вы не разрешали в настройках (Setup-Settings-Local Networks (no username/password)-Networks: запись вида 192.168.1.*;127.0.0.*)
sleep 60 – обновление данных каждые 60 секунд

4.3. скрипт humidifiercontrol.sh

 

#!/bin/bash

if [ “$2” == “on” ]; then
node /home/pi/domoticz/devices/humidifier/humidifier.js $1 mode $3
node /home/pi/domoticz/devices/humidifier/humidifier.js $1 power on
fi

if [ “$2” == “off” ]; then
node /home/pi/domoticz/devices/humidifier/humidifier.js $1 power off
fi

4.4. скрипт startup.sh.

 

# Start humidifiermonitor
cd /home/pi/domoticz/devices/humidifier
/usr/bin/screen -S humidifiermonitor -d -m /home/pi/domoticz/devices/humidifier/purupdatedomoticz.sh

Запускается он разово при загрузке системы и сидит “демоном”.

4.5. скрипт humidifier.lua 

 

commandArray = {}

if devicechanged [‘Увлажнитель’] == ‘Silent’ then
os.execute (‘sudo screen -S humidifiertemp -d -m /home/pi/domoticz/devices/humidifier/humidifiercontrol.sh 192.168.1.54 on silent’)
end

if devicechanged [‘Увлажнитель’] == ‘Medium’ then
os.execute (‘sudo screen -S humidifiertemp -d -m /home/pi/domoticz/devices/humidifier/humidifiercontrol.sh 192.168.1.54 on medium’)
end

if devicechanged [‘Увлажнитель’] == ‘High’ then
os.execute (‘sudo screen -S humidifiertemp -d -m /home/pi/domoticz/devices/humidifier/humidifiercontrol.sh 192.168.1.54 on high’)
end

if devicechanged [‘Увлажнитель’] == ‘Off’ then
os.execute (‘sudo screen -S humidifiertemp -d -m /home/pi/domoticz/devices/humidifier/humidifiercontrol.sh 192.168.1.54 off /dev/null’)
end

return commandArray

назначаем права на скрипты 744

pi@raspberry:~/domoticz/devices/humidifier $ chmod 0744 domoticzupdate.sh humidifiercontrol.sh startup.sh

5. Конфигурация в Domoticz.

5.1. Создаем новое виртуальное устройство (Setup-Hardware-Add)

 

 

Создаем новый виртуальный сенсор (Virtual sensor) (кликаем на мышкой на устройстве Humidifier – Create Virtual Sensors) и называем его Увлажнитель

 

 

 

 

Заходим в Switches (Переключатели) и находим устройство Увлажнитель. Редактируем (Edit) его к виду:

 

 

 

 

 

 
 

 

ну и сразу Нотификации приводим к виду: (если кому необходимо)

 

 


Создаем еще один виртуальный сенсор (Virtual sensor) (Датчик) и называем его Датчик Увлажнителя

 

 


Заходим во вкладку Temperature (Температура) и находим устройство Датчик Увлажнителя

 

 


На момент первого подключения у него будет иконка ввиде льда. По мере того, как данные будут поступать она измениться на градусник с солнцем. В моем случае на скрине данные уже есть.
Заходим во вкладку Setup – Devices и находим наши устройства (нас интересуют их индексы, которые мы добавляем в скрипт purupdatedomoticz.sh)

 

5.2. Создаем Lua скрипт для управления нашим устройством.

Заходим в Web интерфейсе Domoticz: Setup – More Settings – Events и создаем новый Lua скрипт Humidifier

 #

 

 
после строки return commandArray не делаем Enter.

6. Приводим в рабочее состояние.

6.1. Пробуем понажимать на режимы Silent (1) / Medium (2) / High (/3) / Off. Если что-то пошло не так, смотрим в Log.
проверку сбора данных можно проверить следующим образом :

pi@raspberry:~/domoticz/devices/humidifier $ node /home/pi/domoticz/devices/humidifier/humidifier.js 192.168.1.54 status2
[ 242, 46 ]

где 242 – значение температуры (F), 46 – влажности. Далее запустив скрипт startup.sh (запускать единожды его) данные должны поступать в Domoticz каждую минуту.

Итого имеем:

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

6 комментариев
Популярные
Новые Старые
Межтекстовые Отзывы
Посмотреть все комментарии
Agamemnen
Agamemnen
27.01.2019 13:02

Все установил, Нода нашла увлажнитель

Но при запуске выдает:
node humidifier.js 192.168.1.30 status
(node:27430) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Could not connect to device, token needs to be specified
(node:27430) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code

Подскажите, где и что упустил?

PS
И можно раскрыть формат как формировать строку для передачи данных на DZ?

Agamemnen
Agamemnen
28.01.2019 22:02
Ответить на  admin

Спасибо, уже нашел в чем причины и устранил. Все работает. Тестирую.

Alexander
03.05.2020 20:47

А пользуешься в результате автоматизацией или управлением и- ha?

Обычно увлажнитель, особенно мойка просто должен быть постоянно включён

только ночью переводиться в тихий режим.

Alexander
03.05.2020 20:48

Какая система централизации в результате у тебя победила?
home assistant? или разбросано по разным?

Александр
Александр
31.08.2020 20:37

Подскажите пожалуйста актуальный способ для Node.js v10.21.0. Малинка v3B. Никак не получается выполнить все как вы написали, постоянно почти на каждом шагу какие то ошибки. Информации найти не могу кроме копипастов с вашей статьи… Необходимо также управлять увлажнителем в домотикз. Хоть с чего начать то надобно мне?… Необходимые дерриктории создал. В процессе все время вылазит npm does not support Node.js v10.21.0.Не понимаю что делать дальше. Пробовал обновлять что то типа “npm i npm@latest -g” , тоже ничего не выходит. Как слепой котенок конечно, но если поэтапно по полочкам расписать то руки прямые вроде…

6
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x