Более детальная инструкция. Основа взята здесь. Может кому будет интересно.
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¶m=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 каждую минуту.
Итого имеем:
Все установил, Нода нашла увлажнитель
Но при запуске выдает:
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?