Merge branch 'beta'

This commit is contained in:
Eugene Abramov
2021-09-07 19:04:10 +03:00
10 changed files with 394 additions and 180 deletions

332
README.md
View File

@@ -7,16 +7,26 @@
Доступна бета-версия на ветке `beta`. Для установки выполнить команду `git clone -b beta https://github.com/lasthead0/yandex2mqtt.git`. Подробности изменений и документация в `README` ветки `beta`.
## Важно
Те, кто пользуется оригинальным проектом (или его форками), обратите внимание на то, что немного изменились настройки устройств (блок **devices** в файле конфигурации).
Те, кто пользуется оригинальным проектом (или его форками), обратите внимание на то, что немного изменились настройки устройств (блок `devices` в файле конфигурации).
На данный момент проверено получение температуры и влажности с датчиков (датчики дверей и движения пока в бета-тесте), и включение/выключение света (вкл./выкл. других устройств по аналогии тоже должно работать).
Прочий функционал (изменение громкости, каналов, отключение звука), поидее, так же должны работать.
## ChangeLog
###### 16.05.2021
Добавлено логирование некоторых событий.
###### 13.05.2021
Добавлена поддержка API уведомлений об изменении состояний устройств.
###### 31.03.2021
Добавлена поддрежка разделения доступа пользователей к устройствам.
###### Release
Проведён рефакторинг кода и, местами, внесены значительные правки.
Добавлена поддержка датчиков (устройств **devices.types.sensor**)
Добавлена поддержка датчиков (устройств `devices.types.sensor`)
## Требования
- **"Белый" IP адрес и домен**. Если нет своего домена и белого IP адреса можно воспользоваться Dynamic DNS сервисами (например, noip.com).
@@ -55,14 +65,20 @@ npm start
```
## Настройка yandex2mqtt
Все основные настройки моста прописываются в файл config.js. Перед запуском обязательно отредактируйте его.
Все основные настройки моста прописываются в файл `config.js`. Перед запуском обязательно отредактируйте его.
```
mv config.orig.js config.js
```
**Файл конфигурации**
#### Файл конфигурации
```
module.exports = {
notification: [
{
...
},
...
]
mqtt: {
...
},
@@ -75,34 +91,37 @@ module.exports = {
{
...
},
...
],
users: [
{
...
},
...
],
devices: [
{
...
},
...
]
}
```
**Блок настройки mqtt клиента**
###### Блок настройки mqtt клиента
Указать данные Вашего MQTT сервера
```
mqtt: {
host: 'localhost',
port: 1883,
user: 'user',
password: 'password'
host: 'localhost',
port: 1883,
user: 'user',
password: 'password',
},
```
**Блок настройки https сервера**
###### Блок настройки https сервера
Указать порт, на котором будет работать мост, а так же пути к сертификату ssl.
```
https: {
@@ -112,125 +131,204 @@ https: {
},
```
**Блок настройки клиентов**
###### Блок настройки клиентов
Здесь используются произвольные данные, далее они понадобятся для подключения к УД Yandex.
```
clients: [
{
id: '1',
name: 'Yandex',
clientId: 'client',
clientSecret: 'secret',
isTrusted: false
},
{
id: '1',
name: 'Yandex',
clientId: 'client',
clientSecret: 'secret',
isTrusted: false,
},
],
```
**Блок настройки пользователей**
###### Блок настройки пользователей
```
users: [
{
id: "1",
username: "admin",
password: "admin",
name: "Administrator"
},
{
id: "2",
username: "user1",
password: "user1",
name: "User"
},
{
id: '1',
username: 'admin',
password: 'admin',
name: 'Administrator',
},
{
id: '2',
username: 'user1',
password: 'user1',
name: 'User',
},
],
```
**Блок настройки устройств**
###### Блок настройки устройств
```
devices: [
{
id: "lvr-003-switch",
name: "Основной свет",
room: "Гостиная",
type: "devices.types.light",
mqtt: [
{
instance: "on",
set: "/yandex/controls/light_LvR_003/state/on",
state: "/yandex/controls/light_LvR_003/state"
},
],
/* mapping значений между yandex и УД */
valueMapping: [
{
type: "on_off",
mapping: [[false, true], [0, 1]] // [yandex, mqtt]
}
],
capabilities: [
{
type: "devices.capabilities.on_off",
retrievable: true,
},
],
},
{
id: 'haw-002-switch',
name: 'Свет в коридоре',
room: 'Коридор',
type: 'devices.types.light',
allowedUsers: ['2'],
mqtt: [
{
instance: 'on',
set: '/yandex/controls/light_HaW_002/on',
state: '/yandex/controls/light_HaW_002/on/state',
},
],
capabilities: [
{
type: 'devices.capabilities.on_off',
retrievable: true,
},
],
},
{
id: "lvr-001-weather",
name: "В гостиной",
room: "Гостиная",
type: "devices.types.sensor",
mqtt: [
{
instance: "temperature",
state: "/yandex/sensors/LvR_001_Weather/temperature"
},
{
instance: "humidity",
state: "/yandex/sensors/LvR_001_Weather/humidity"
}
],
properties: [
{
type: "devices.properties.float",
retrievable: true,
parameters: {
instance: "temperature",
unit: "unit.temperature.celsius"
},
},
{
type: "devices.properties.float",
retrievable: true,
parameters: {
instance: "humidity",
unit: "unit.percent"
},
/* Блок state указывать не обязательно */
state: {
instance: "humidity",
value: 0
}
}
]
},
/* --- end */
]
{
id: 'lvr-003-switch',
name: 'Основной свет',
room: 'Гостиная',
type: 'devices.types.light',
allowedUsers: ['2'],
mqtt: [
{
instance: 'on',
set: '/yandex/controls/light_LvR_003/on',
state: '/yandex/controls/light_LvR_003/on/state',
},
],
valueMapping: [
{
type: 'on_off',
mapping: [[false, true], [0, 1]], // [yandex, mqtt]
},
],
capabilities: [
{
type: 'devices.capabilities.on_off',
retrievable: true,
},
],
},
{
id: 'lvr-001-weather',
name: 'В гостиной',
room: 'Гостиная',
type: 'devices.types.sensor',
allowedUsers: ['2'],
mqtt: [
{
instance: 'temperature',
state: '/yandex/sensors/LvR_001_Weather/temperature',
},
{
instance: 'humidity',
state: '/yandex/sensors/LvR_001_Weather/humidity',
},
],
properties: [
{
type: 'devices.properties.float',
retrievable: true,
parameters: {
instance: 'temperature',
unit: 'unit.temperature.celsius',
},
},
{
type: 'devices.properties.float',
retrievable: true,
parameters: {
instance: 'humidity',
unit: 'unit.percent',
},
},
],
},
{
id: 'plug-001-flower',
name: 'Розетка для цветка',
room: 'Гостиная',
type: 'devices.types.socket',
allowedUsers: ['2'],
mqtt: [
{
instance: 'on',
set: '/yandex/controls/socket_LvR_002/on',
state: '/yandex/controls/socket_LvR_002/on/state',
},
{
instance: 'power',
state: '/yandex/controls/socket_LvR_002/power',
},
],
capabilities: [
{
type: 'devices.capabilities.on_off',
retrievable: true,
},
],
properties: [
{
type: 'devices.properties.float',
retrievable: true,
parameters: {
instance: 'power',
unit: 'unit.watt',
},
},
],
},
/* --- end */
],
```
*Рекомендую указывать id в конфиге, чтобы исключить "наложение" новых устройств на "старые", которые уже добавлены в yandex.*
*Рекомендую указывать id в конфиге, чтобы исключить "наложение" новых устройств на "старые", которые уже добавлены в навык.*
*В случае отсутсвия id в конфиге, он будет назначен автоматически по индексу в массиве.*
###### Mapping значений
Блок valueMapping позволяет настроить конвертацию значений между yandex api и MQTT. Это может быть актуально для умений типа **devices.capabilities.on_off** и **devices.capabilities.toggle**.
#### Уведомление об изменении состояний устройств
Платформа УД Яндекс предоставляет сервис уведомлений об изменении состояний устройств. При изменении состояния устройства (например, изменение влажности) yandex2mqtt будет отправлять запрос с новым состоянием.
В настройках предусмотрен блок `notification`.
```
notification: [
{
skill_id: '6fca0a54-a505-4420-b774-f01da95e5c31',
oauth_token: 'AQA11AAPv-V2BAT7o_ps6gEtrtNNjlE2ENYt96w',
user_id: '2'
},
]
```
Если к yandex2mqtt "подключено" несколько навыков УД, то в массиве необходимо указать настройки для каждого навыка УД, который должен получать уведомления.
`skill_id` (идентификатор вызываемого навыка, присвоенный при создании) и `oauth_token` (авторизационный токен владельца навыка) можно узнать из документации на [Уведомление об изменении состояний устройств](https://yandex.ru/dev/dialogs/smart-home/doc/reference-alerts/post-skill_id-callback-state.html), а `user_id` - id пользователя в файле конфигурации yandex2mqtt.
*Важно. Уведомления будут отправляться при изменнии mqtt топика хранящего состояние устройства. Соответственно, если для устройства не задан топик state, то уведомление для устройтва отправляться не будет.*
#### Разрешенные пользователи для устройств (allowedUsers)
В блоке конфигурации можно указать пользователей (id пользователей), для которых будет доступно устройство.
В опции `allowedUsers` указыватся массив (строковых значений) id. Если данная опция не указана, то для неё будет назначено значение ['1'];
#### Mapping значений
Блок valueMapping позволяет настроить конвертацию значений между yandex api и MQTT. Это может быть актуально для умений типа `devices.capabilities.on_off` и `devices.capabilities.toggle`.
*Например, если в УД состояние влючено/выключено соответствует значениям 1/0, то Вам понадобиться их конвертировать, т.к. в навыках Yandex значения true/false.*
```
valueMapping: [
{
type: "on_off",
mapping: [[false, true], [0, 1]] // [yandex, mqtt]
}
]
{
type: 'on_off',
mapping: [[false, true], [0, 1]], // [yandex, mqtt]
},
],
```
В mapping указывается миссив массивов. Первый массив - значения в yandex, второй - в MQTT.
@@ -239,15 +337,19 @@ valueMapping: [
- [Типы умений устройства](https://yandex.ru/dev/dialogs/alice/doc/smart-home/concepts/capability-types.html)
- [Типы встроенных датчиков](https://yandex.ru/dev/dialogs/alice/doc/smart-home/concepts/properties-types.html)
## Логирование
Добавлено две "стратегии" логирования: сообщений об ошибках в файл `log/error.log` (аргумент запуска `--log-error`) и всех сообщений в консоль (`--log-info`).
Для запуска y2m с логирование необходимо добавить аргумент запуска в команду запуска в файле настройки служба (**раздел ниже**) или запустить из консоли.
## Создание службы
В папке /etc/systemd/system/ создать файл yandex2mqtt.service со следующим содержанем:
В папке `/etc/systemd/system/` создать файл `yandex2mqtt.service` со следующим содержанем:
```
[Unit]
Description=yandex2mqtt
After=network.target
[Service]
ExecStart=/usr/bin/npm start
ExecStart=/usr/bin/node app.js --log-error
WorkingDirectory=/opt/yandex2mqtt
StandardOutput=inherit
StandardError=inherit
@@ -275,25 +377,24 @@ service yandex2mqtt restart
```
## Создание навыка (в Яндекс Диалоги)
Заходим в [Яндекс Диалоги](https://dialogs.yandex.ru/developer) => Создать диалог => Умный дом
###### Основные настройки
#### Основные настройки
- **Название** *Любое*
- **Backend** *Endpoint URL* и указываем https://your.domain.ru:port/provider
- **Тип доступа** *Приватный*
###### Публикация в каталоге
#### Публикация в каталоге
- **Подзаголовок** *Любой текст*
- **Имя разработчика** *Ваше имя*
- **Официальный навык** *Нет*
- **Описание** *Любой текст*
- **Иконка** *Своя иконка*
###### Связка аккаунтов
#### Связка аккаунтов
- **Авторизация** _Кнопка **"Создать"**_
###### Создание связки аккаунтов
#### Создание связки аккаунтов
- **Идентификатор приложения** *Файл конфигурации clients.clientId*
- **Секрет приложения** *Файл конфигурации clients.clientSecret*
- **URL авторизации** *https://your.domain.ru:port/dialog/authorize*
@@ -306,7 +407,7 @@ service yandex2mqtt restart
## Известные "особенности поведения" ioBroker (iob)
###### Не изменяются и не читаются топики MQTT
#### Не изменяются и не читаются топики MQTT
Если случается такое, что Алиса получает голосовую команду и не сообщает об ошибке, но при этом топик не меняет своего значения или, при изменении стейта (объекта iob) MQTT топик не публикуется (Алиса не получает нового значения, а сообщает старое) **необходимо перезапустить адаптер mqtt**.
@@ -317,4 +418,3 @@ service yandex2mqtt restart
"topic": "/yandex/controls/light_BdR_002/state"
}
```
**Перезапустить адаптер mqtt**