From 8f6968f70ba528a5cf4ee6fcfca521a065f40037 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Wed, 24 Mar 2021 23:49:35 +0300 Subject: [PATCH 001/105] test --- app.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/app.js b/app.js index e572a0e..abd7fec 100644 --- a/app.js +++ b/app.js @@ -110,6 +110,35 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { const {deviceId, instance} = subscription; const ldevice = global.devices.find(d => d.data.id == deviceId); ldevice.updateState(`${message}`, instance); + + /* */ + const noticeRequest = https.request({ + hostname: 'https://dialogs.yandex.net/api/v1/skills/6bc30a74-a505-4420-b274-f00da95e5a31/callback/state', + port: 443, + path: '/', + method: 'POST', + headers: { + 'Authorization': 'Py9xaYZMeXNAizdjA4eWZ5RhYKQd6AtTSn3FXsmiUU9aHFuz9Q0Z925K9OglDjwBw42h2SiPl71Cyg8kTHIdTyV7yO5btnSoFwmu8wBdCfSh7DXOJ9U2hkRuEtyk47nOdOqzB98PxtWDoaENRFL5yH6w7YZSDpQnM7XN9op1A3Zg9U4mVBFL4SGWZNSSoHAi0CcV36H6QgRpUFZ2bwsGsZFWrHtpsR1J28lFJ8mIhAjaxo3WFj7o9c7MCer9XBUe', + 'Content-Type': 'application/json' + } + }, res => { + + }); + const st = ldevice.getState(); + noticeRequest.write(JSON.stringify({ + ts: Math.floor(Date.now() / 1000), + payload: { + user_id: "1", + devices: [{ + id: deviceId, + capabilities: st.capabilities, + properties: st.properties + }] + } + })); + noticeRequest.end(); + /* */ + }); module.exports = app; From 8655abb1f8bdba0984ef67e6f864bc1ae992d860 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Wed, 24 Mar 2021 23:51:26 +0300 Subject: [PATCH 002/105] test --- app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index abd7fec..79f6273 100644 --- a/app.js +++ b/app.js @@ -113,9 +113,9 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { /* */ const noticeRequest = https.request({ - hostname: 'https://dialogs.yandex.net/api/v1/skills/6bc30a74-a505-4420-b274-f00da95e5a31/callback/state', + hostname: 'dialogs.yandex.net', port: 443, - path: '/', + path: '/api/v1/skills/6bc30a74-a505-4420-b274-f00da95e5a31/callback/state', method: 'POST', headers: { 'Authorization': 'Py9xaYZMeXNAizdjA4eWZ5RhYKQd6AtTSn3FXsmiUU9aHFuz9Q0Z925K9OglDjwBw42h2SiPl71Cyg8kTHIdTyV7yO5btnSoFwmu8wBdCfSh7DXOJ9U2hkRuEtyk47nOdOqzB98PxtWDoaENRFL5yH6w7YZSDpQnM7XN9op1A3Zg9U4mVBFL4SGWZNSSoHAi0CcV36H6QgRpUFZ2bwsGsZFWrHtpsR1J28lFJ8mIhAjaxo3WFj7o9c7MCer9XBUe', From 33b27f1ff16dba131ac920cf7186a091cfcfacfd Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Thu, 25 Mar 2021 00:16:10 +0300 Subject: [PATCH 003/105] test --- app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index 79f6273..8a4d8c3 100644 --- a/app.js +++ b/app.js @@ -115,10 +115,10 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { const noticeRequest = https.request({ hostname: 'dialogs.yandex.net', port: 443, - path: '/api/v1/skills/6bc30a74-a505-4420-b274-f00da95e5a31/callback/state', + path: `/api/v1/skills/${config.yandex.skillId}/callback/state`, method: 'POST', headers: { - 'Authorization': 'Py9xaYZMeXNAizdjA4eWZ5RhYKQd6AtTSn3FXsmiUU9aHFuz9Q0Z925K9OglDjwBw42h2SiPl71Cyg8kTHIdTyV7yO5btnSoFwmu8wBdCfSh7DXOJ9U2hkRuEtyk47nOdOqzB98PxtWDoaENRFL5yH6w7YZSDpQnM7XN9op1A3Zg9U4mVBFL4SGWZNSSoHAi0CcV36H6QgRpUFZ2bwsGsZFWrHtpsR1J28lFJ8mIhAjaxo3WFj7o9c7MCer9XBUe', + 'Authorization': 'AQAAAAAPv-V2AAT7o_ps6gEtgkNNjlE2ENZt96w', 'Content-Type': 'application/json' } }, res => { From 197b7c5de80b958d2184da30cb76068f63a720b1 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 29 Mar 2021 21:16:46 +0300 Subject: [PATCH 004/105] Add yandex notification config block --- config.orig.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/config.orig.js b/config.orig.js index 141e15c..1aea6f8 100644 --- a/config.orig.js +++ b/config.orig.js @@ -1,4 +1,9 @@ module.exports = { + yandex: { + skillId: 'skill_id', + token: 'token' + }, + mqtt: { host: 'localhost', port: 1883, From 1742407600d530f93bee47e20999dd07ee6a93ef Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 29 Mar 2021 21:18:23 +0300 Subject: [PATCH 005/105] Code improvement --- device.js | 61 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/device.js b/device.js index 1bd7210..9dd0242 100644 --- a/device.js +++ b/device.js @@ -42,7 +42,7 @@ class Device { } } - /* Create init state on device object create */ + /* Create init state (for capabilities and properties) on device object create */ initState(cp) { const {type, parameters} = cp; const actType = String(type).split('.')[2]; @@ -60,10 +60,24 @@ class Device { value: false } } - case 'toggle': { + // case 'color_setting': { + // return { + // instance: (p => { + // if (p.temperature_k != undefined) return 'temperature_k'; + // if (p.color_model != undefined) return p.color_model; + // else return undefined; + // })(parameters), + // value: (p => { + // if (p.temperature_k != undefined) return p.temperature_k.min || 4500; + // if (p.color_model == 'rgb') return 16777215; + // if (p.color_model == 'hsv') return {h: 0, s: 0, v: 100}; + // })(parameters) + // } + // } + case 'mode': { return { instance: parameters.instance, - value: false + value: parameters.modes[0].value } } case 'range': { @@ -72,10 +86,10 @@ class Device { value: parameters.range.min } } - case 'mode': { + case 'toggle': { return { instance: parameters.instance, - value: parameters.modes[0].value + value: false } } default: { @@ -86,6 +100,26 @@ class Device { } + /* Find capability by type (and instance) */ + findCapability(type, instance) { + const {capabilities} = this.data; + if (instance != undefined) { + return capabilities.find(c => c.type === type && c.state.instance === instance); + } else { + return capabilities.find(c => c.type === type); + } + } + + /* Unused for now */ + // findProperty(type) { + // return this.data.properties.find(p => p.type === type); + // } + + /* Find 'set' topic by instance*/ + findTopicByInstance(instance) { + return this.data.custom_data.mqtt.find(i => i.instance === instance).set; + } + /* Get mapped value (if exist) for capability type */ /** * @@ -105,21 +139,6 @@ class Device { return (mappedValue != undefined) ? mappedValue : val; } - /* Find capability by type */ - findCapability(type) { - return this.data.capabilities.find(c => c.type === type); - } - - /* Unused for now */ - findProperty(type) { - return this.data.properties.find(p => p.type === type); - } - - /* Find 'set' topic by instance*/ - findTopicByInstance(instance) { - return this.data.custom_data.mqtt.find(i => i.instance === instance).set; - } - getInfo() { const {id, name, description, room, type, capabilities, properties} = this.data; return {id, name, description, room, type, capabilities, properties}; @@ -160,7 +179,7 @@ class Device { let message; let topic; try { - const capability = this.findCapability(type); + const capability = this.findCapability(type, instance); if (capability == undefined) throw new Error(`Can't find capability '${type}' in device '${id}'`); capability.state.value = value; topic = this.findTopicByInstance(instance); From a120181bc58b0bbb69a2d9f74a9448c8c3346584 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 29 Mar 2021 21:19:21 +0300 Subject: [PATCH 006/105] test --- app.js | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/app.js b/app.js index 8a4d8c3..63ddb52 100644 --- a/app.js +++ b/app.js @@ -94,6 +94,23 @@ global.devices.forEach(device => { }); }); +/* */ +var noticeRequest; +if ((yc = config.yandex) != undefined) { + noticeRequest = https.request({ + hostname: 'dialogs.yandex.net', + port: 443, + path: `/api/v1/skills/${yc.skillId}/callback/state`, + method: 'POST', + headers: { + 'Authorization': yc.token, + 'Content-Type': 'application/json' + } + }, res => { + + }); +}; + /* Create MQTT client (variable) in global */ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { port: config.mqtt.port, @@ -112,18 +129,19 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { ldevice.updateState(`${message}`, instance); /* */ - const noticeRequest = https.request({ - hostname: 'dialogs.yandex.net', - port: 443, - path: `/api/v1/skills/${config.yandex.skillId}/callback/state`, - method: 'POST', - headers: { - 'Authorization': 'AQAAAAAPv-V2AAT7o_ps6gEtgkNNjlE2ENZt96w', - 'Content-Type': 'application/json' - } - }, res => { + // if ((yc = config.yandex) != undefined) { + // const noticeRequest = https.request({ + // hostname: 'dialogs.yandex.net', + // port: 443, + // path: `/api/v1/skills/${yc.skillId}/callback/state`, + // method: 'POST', + // headers: { + // 'Authorization': yc.token, + // 'Content-Type': 'application/json' + // } + // }, res => { - }); + // }); const st = ldevice.getState(); noticeRequest.write(JSON.stringify({ ts: Math.floor(Date.now() / 1000), @@ -137,6 +155,7 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { } })); noticeRequest.end(); + // } /* */ }); From 028790aacc0d667c2f97cc5e64c87ef03386dc1a Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 29 Mar 2021 21:25:13 +0300 Subject: [PATCH 007/105] Documentation improvement --- README.md | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 431ba7b..b9098e0 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,10 @@ Прочий функционал (изменение громкости, каналов, отключение звука), поидее, так же должны работать. ## ChangeLog +**01.04.2021** +Добавлена поддержка [уведомлений навыка об изменении состояния устройств](https://yandex.ru/dev/dialogs/alice/doc/smart-home/reference-alerts/post-skill_id-callback-state.html). + +**Release** Проведён рефакторинг кода и, местами, внесены значительные правки. Добавлена поддержка датчиков (устройств **devices.types.sensor**) @@ -60,6 +64,10 @@ mv config.orig.js config.js **Файл конфигурации** ``` module.exports = { + yandex: { + ... + }, + mqtt: { ... }, @@ -87,6 +95,14 @@ module.exports = { ] } ``` +**Блок настройки навыка Yandex (необязательный блок, необходим для уведомлений)** +Указать id навыка (навык должен быть опубликован) и токен пользователя ([информация по получению токена](https://yandex.ru/dev/dialogs/alice/doc/smart-home/reference-alerts/resources-alerts.html#resources-alerts__oauth)). +``` +yandex: { + skillId: '4cc31a75-a20d-422a-b2f6-f10ca93e5b32', + token: 'AQABCDAPv-V233T7o_ps7gESgkNNjlE3EfZt96w' +}, +``` **Блок настройки mqtt клиента** Указать данные Вашего MQTT сервера @@ -213,7 +229,7 @@ devices: [ /* --- end */ ] ``` -*Рекомендую указывать id в конфиге, чтобы исключить "наложение" новых устройств на "старые", которые уже добавлены в yandex.* +*Рекомендую указывать id в конфиге, чтобы исключить "наложение" новых устройств на "старые", которые уже добавлены в навык.* *В случае отсутсвия id в конфиге, он будет назначен автоматически по индексу в массиве.* @@ -231,6 +247,11 @@ valueMapping: [ ``` В mapping указывается миссив массивов. Первый массив - значения в yandex, второй - в MQTT. +###### Уведомление об изменении состояний устройств +Для работы уведомлений необходимо у устройства задать mqtt топик state. При изменении этого топика y2m будет отправлять навыку уведомление об изменении состояния устройтсва. + +Рекомендую для set и state использовать разные топики, а "синхронизацию" этих топиков организовать средствами "умного дома". + ## Документация Яндекс - [Типы устройств](https://yandex.ru/dev/dialogs/alice/doc/smart-home/concepts/device-types.html) - [Типы умений устройства](https://yandex.ru/dev/dialogs/alice/doc/smart-home/concepts/capability-types.html) @@ -314,4 +335,3 @@ service yandex2mqtt restart "topic": "/yandex/controls/light_BdR_002/state" } ``` -**Перезапустить адаптер mqtt** \ No newline at end of file From 439f55df0089f2863ead9fc4f8a8eae6df042635 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 29 Mar 2021 21:30:40 +0300 Subject: [PATCH 008/105] Documentation improvement --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b9098e0..412d487 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,11 @@ ## ChangeLog **01.04.2021** + Добавлена поддержка [уведомлений навыка об изменении состояния устройств](https://yandex.ru/dev/dialogs/alice/doc/smart-home/reference-alerts/post-skill_id-callback-state.html). **Release** + Проведён рефакторинг кода и, местами, внесены значительные правки. Добавлена поддержка датчиков (устройств **devices.types.sensor**) @@ -96,6 +98,7 @@ module.exports = { } ``` **Блок настройки навыка Yandex (необязательный блок, необходим для уведомлений)** + Указать id навыка (навык должен быть опубликован) и токен пользователя ([информация по получению токена](https://yandex.ru/dev/dialogs/alice/doc/smart-home/reference-alerts/resources-alerts.html#resources-alerts__oauth)). ``` yandex: { @@ -105,6 +108,7 @@ yandex: { ``` **Блок настройки mqtt клиента** + Указать данные Вашего MQTT сервера ``` mqtt: { @@ -116,6 +120,7 @@ mqtt: { ``` **Блок настройки https сервера** + Указать порт, на котором будет работать мост, а так же пути к сертификату ssl. ``` https: { @@ -126,6 +131,7 @@ https: { ``` **Блок настройки клиентов** + Здесь используются произвольные данные, далее они понадобятся для подключения к УД Yandex. ``` clients: [ @@ -233,7 +239,7 @@ devices: [ *В случае отсутсвия id в конфиге, он будет назначен автоматически по индексу в массиве.* -###### Mapping значений +#### Mapping значений Блок valueMapping позволяет настроить конвертацию значений между yandex api и MQTT. Это может быть актуально для умений типа **devices.capabilities.on_off** и **devices.capabilities.toggle**. *Например, если в УД состояние влючено/выключено соответствует значениям 1/0, то Вам понадобиться их конвертировать, т.к. в навыках Yandex значения true/false.* @@ -248,6 +254,7 @@ valueMapping: [ В mapping указывается миссив массивов. Первый массив - значения в yandex, второй - в MQTT. ###### Уведомление об изменении состояний устройств + Для работы уведомлений необходимо у устройства задать mqtt топик state. При изменении этого топика y2m будет отправлять навыку уведомление об изменении состояния устройтсва. Рекомендую для set и state использовать разные топики, а "синхронизацию" этих топиков организовать средствами "умного дома". From 7ae570ee8db1c1f9ce1ca15173cc06a742a7d6d1 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 29 Mar 2021 21:37:35 +0300 Subject: [PATCH 009/105] Documentation improvement --- README.md | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 412d487..8bc8310 100644 --- a/README.md +++ b/README.md @@ -11,12 +11,10 @@ Прочий функционал (изменение громкости, каналов, отключение звука), поидее, так же должны работать. ## ChangeLog -**01.04.2021** - +###### 01.04.2021 Добавлена поддержка [уведомлений навыка об изменении состояния устройств](https://yandex.ru/dev/dialogs/alice/doc/smart-home/reference-alerts/post-skill_id-callback-state.html). -**Release** - +###### Release Проведён рефакторинг кода и, местами, внесены значительные правки. Добавлена поддержка датчиков (устройств **devices.types.sensor**) @@ -63,7 +61,7 @@ npm start mv config.orig.js config.js ``` -**Файл конфигурации** +#### Файл конфигурации ``` module.exports = { yandex: { @@ -97,8 +95,7 @@ module.exports = { ] } ``` -**Блок настройки навыка Yandex (необязательный блок, необходим для уведомлений)** - +###### Блок настройки навыка Yandex (необязательный блок, необходим для уведомлений) Указать id навыка (навык должен быть опубликован) и токен пользователя ([информация по получению токена](https://yandex.ru/dev/dialogs/alice/doc/smart-home/reference-alerts/resources-alerts.html#resources-alerts__oauth)). ``` yandex: { @@ -107,8 +104,7 @@ yandex: { }, ``` -**Блок настройки mqtt клиента** - +###### Блок настройки mqtt клиента Указать данные Вашего MQTT сервера ``` mqtt: { @@ -119,8 +115,7 @@ mqtt: { }, ``` -**Блок настройки https сервера** - +###### Блок настройки https сервера Указать порт, на котором будет работать мост, а так же пути к сертификату ssl. ``` https: { @@ -130,8 +125,7 @@ https: { }, ``` -**Блок настройки клиентов** - +###### Блок настройки клиентов Здесь используются произвольные данные, далее они понадобятся для подключения к УД Yandex. ``` clients: [ @@ -145,7 +139,7 @@ clients: [ ], ``` -**Блок настройки пользователей** +###### Блок настройки пользователей ``` users: [ { @@ -163,7 +157,7 @@ users: [ ], ``` -**Блок настройки устройств** +###### Блок настройки устройств ``` devices: [ { @@ -253,7 +247,7 @@ valueMapping: [ ``` В mapping указывается миссив массивов. Первый массив - значения в yandex, второй - в MQTT. -###### Уведомление об изменении состояний устройств +#### Уведомление об изменении состояний устройств Для работы уведомлений необходимо у устройства задать mqtt топик state. При изменении этого топика y2m будет отправлять навыку уведомление об изменении состояния устройтсва. @@ -331,7 +325,7 @@ service yandex2mqtt restart ## Известные "особенности поведения" ioBroker (iob) -###### Не изменяются и не читаются топики MQTT +#### Не изменяются и не читаются топики MQTT Если случается такое, что Алиса получает голосовую команду и не сообщает об ошибке, но при этом топик не меняет своего значения или, при изменении стейта (объекта iob) MQTT топик не публикуется (Алиса не получает нового значения, а сообщает старое) **необходимо перезапустить адаптер mqtt**. From b81480e0d46ccafc793e552bfb8c15778c375d99 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 29 Mar 2021 21:44:35 +0300 Subject: [PATCH 010/105] test --- app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app.js b/app.js index 63ddb52..2f08e10 100644 --- a/app.js +++ b/app.js @@ -96,7 +96,8 @@ global.devices.forEach(device => { /* */ var noticeRequest; -if ((yc = config.yandex) != undefined) { +const yc = config.yandex; +if (yc != undefined) { noticeRequest = https.request({ hostname: 'dialogs.yandex.net', port: 443, From b504261d340b97a98f6d51aaef6945bce1f00bbe Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 29 Mar 2021 21:47:40 +0300 Subject: [PATCH 011/105] test --- app.js | 70 ++++++++++++++++++++++------------------------------------ 1 file changed, 26 insertions(+), 44 deletions(-) diff --git a/app.js b/app.js index 2f08e10..33304f4 100644 --- a/app.js +++ b/app.js @@ -94,24 +94,6 @@ global.devices.forEach(device => { }); }); -/* */ -var noticeRequest; -const yc = config.yandex; -if (yc != undefined) { - noticeRequest = https.request({ - hostname: 'dialogs.yandex.net', - port: 443, - path: `/api/v1/skills/${yc.skillId}/callback/state`, - method: 'POST', - headers: { - 'Authorization': yc.token, - 'Content-Type': 'application/json' - } - }, res => { - - }); -}; - /* Create MQTT client (variable) in global */ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { port: config.mqtt.port, @@ -130,33 +112,33 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { ldevice.updateState(`${message}`, instance); /* */ - // if ((yc = config.yandex) != undefined) { - // const noticeRequest = https.request({ - // hostname: 'dialogs.yandex.net', - // port: 443, - // path: `/api/v1/skills/${yc.skillId}/callback/state`, - // method: 'POST', - // headers: { - // 'Authorization': yc.token, - // 'Content-Type': 'application/json' - // } - // }, res => { + if ((yc = config.yandex) != undefined) { + const noticeRequest = https.request({ + hostname: 'dialogs.yandex.net', + port: 443, + path: `/api/v1/skills/${yc.skillId}/callback/state`, + method: 'POST', + headers: { + 'Authorization': yc.token, + 'Content-Type': 'application/json' + } + }, res => { - // }); - const st = ldevice.getState(); - noticeRequest.write(JSON.stringify({ - ts: Math.floor(Date.now() / 1000), - payload: { - user_id: "1", - devices: [{ - id: deviceId, - capabilities: st.capabilities, - properties: st.properties - }] - } - })); - noticeRequest.end(); - // } + }); + const st = ldevice.getState(); + noticeRequest.write(JSON.stringify({ + ts: Math.floor(Date.now() / 1000), + payload: { + user_id: "1", + devices: [{ + id: deviceId, + capabilities: st.capabilities, + properties: st.properties + }] + } + })); + noticeRequest.end(); + } /* */ }); From 04a68ac490d770549f5147f567578d33f4d293ab Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 29 Mar 2021 21:49:37 +0300 Subject: [PATCH 012/105] test --- app.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app.js b/app.js index 33304f4..2753d6c 100644 --- a/app.js +++ b/app.js @@ -112,14 +112,15 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { ldevice.updateState(`${message}`, instance); /* */ - if ((yc = config.yandex) != undefined) { + if (config.yandex != undefined) { + const {skillId, token} = config.yandex; const noticeRequest = https.request({ hostname: 'dialogs.yandex.net', port: 443, - path: `/api/v1/skills/${yc.skillId}/callback/state`, + path: `/api/v1/skills/${skillId}/callback/state`, method: 'POST', headers: { - 'Authorization': yc.token, + 'Authorization': token, 'Content-Type': 'application/json' } }, res => { From 6d50e7983e89b88950fd8cb89279e03f5d42582a Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 29 Mar 2021 22:05:02 +0300 Subject: [PATCH 013/105] test --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index 2753d6c..fd98f29 100644 --- a/app.js +++ b/app.js @@ -124,7 +124,7 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { 'Content-Type': 'application/json' } }, res => { - + console.log(res); }); const st = ldevice.getState(); noticeRequest.write(JSON.stringify({ From dd32876a5caaa1c94ca60fad03a11f9c264180ed Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 29 Mar 2021 23:46:04 +0300 Subject: [PATCH 014/105] Documentation improvement --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8bc8310..76f9b1d 100644 --- a/README.md +++ b/README.md @@ -297,22 +297,22 @@ 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* From 16d950e794ec5eac473b37ab6b4a9e763fc980f6 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 29 Mar 2021 23:58:37 +0300 Subject: [PATCH 015/105] test --- app.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app.js b/app.js index fd98f29..5414bd5 100644 --- a/app.js +++ b/app.js @@ -124,7 +124,9 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { 'Content-Type': 'application/json' } }, res => { - console.log(res); + res.on('data', d => { + console.log(d); + }); }); const st = ldevice.getState(); noticeRequest.write(JSON.stringify({ From 8014e6124521cb9d260ff70f9a40d957d7267f18 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 00:35:16 +0300 Subject: [PATCH 016/105] test --- app.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app.js b/app.js index 5414bd5..8f3600c 100644 --- a/app.js +++ b/app.js @@ -127,6 +127,9 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { res.on('data', d => { console.log(d); }); + res.on('error', err => { + console.log(err); + }) }); const st = ldevice.getState(); noticeRequest.write(JSON.stringify({ From dec96a9a4e671057a13efd27ef1349275f2c37c5 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 00:41:52 +0300 Subject: [PATCH 017/105] test --- app.js | 59 ++++++++++++++++++++++++++-------------------------------- 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/app.js b/app.js index 8f3600c..ca5b8de 100644 --- a/app.js +++ b/app.js @@ -112,39 +112,32 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { ldevice.updateState(`${message}`, instance); /* */ - if (config.yandex != undefined) { - const {skillId, token} = config.yandex; - const noticeRequest = https.request({ - hostname: 'dialogs.yandex.net', - port: 443, - path: `/api/v1/skills/${skillId}/callback/state`, - method: 'POST', - headers: { - 'Authorization': token, - 'Content-Type': 'application/json' - } - }, res => { - res.on('data', d => { - console.log(d); - }); - res.on('error', err => { - console.log(err); - }) - }); - const st = ldevice.getState(); - noticeRequest.write(JSON.stringify({ - ts: Math.floor(Date.now() / 1000), - payload: { - user_id: "1", - devices: [{ - id: deviceId, - capabilities: st.capabilities, - properties: st.properties - }] - } - })); - noticeRequest.end(); - } + // if (config.yandex != undefined) { + // const {skillId, token} = config.yandex; + // const noticeRequest = https.request({ + // hostname: 'dialogs.yandex.net', + // port: 443, + // path: `/api/v1/skills/${skillId}/callback/state`, + // method: 'POST', + // headers: { + // 'Authorization': token, + // 'Content-Type': 'application/json' + // } + // }); + // const st = ldevice.getState(); + // noticeRequest.write(JSON.stringify({ + // ts: Math.floor(Date.now() / 1000), + // payload: { + // user_id: "1", + // devices: [{ + // id: deviceId, + // capabilities: st.capabilities, + // properties: st.properties + // }] + // } + // })); + // noticeRequest.end(); + // } /* */ }); From 1d68d695a03837a04bc60183bbe8a8fb1571b565 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 18:50:54 +0300 Subject: [PATCH 018/105] Documentation style improvement --- README.md | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/README.md b/README.md index 76f9b1d..6a61105 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,6 @@ Прочий функционал (изменение громкости, каналов, отключение звука), поидее, так же должны работать. ## ChangeLog -###### 01.04.2021 -Добавлена поддержка [уведомлений навыка об изменении состояния устройств](https://yandex.ru/dev/dialogs/alice/doc/smart-home/reference-alerts/post-skill_id-callback-state.html). ###### Release Проведён рефакторинг кода и, местами, внесены значительные правки. @@ -64,10 +62,6 @@ mv config.orig.js config.js #### Файл конфигурации ``` module.exports = { - yandex: { - ... - }, - mqtt: { ... }, @@ -95,14 +89,6 @@ module.exports = { ] } ``` -###### Блок настройки навыка Yandex (необязательный блок, необходим для уведомлений) -Указать id навыка (навык должен быть опубликован) и токен пользователя ([информация по получению токена](https://yandex.ru/dev/dialogs/alice/doc/smart-home/reference-alerts/resources-alerts.html#resources-alerts__oauth)). -``` -yandex: { - skillId: '4cc31a75-a20d-422a-b2f6-f10ca93e5b32', - token: 'AQABCDAPv-V233T7o_ps7gESgkNNjlE3EfZt96w' -}, -``` ###### Блок настройки mqtt клиента Указать данные Вашего MQTT сервера @@ -247,12 +233,6 @@ valueMapping: [ ``` В mapping указывается миссив массивов. Первый массив - значения в yandex, второй - в MQTT. -#### Уведомление об изменении состояний устройств - -Для работы уведомлений необходимо у устройства задать mqtt топик state. При изменении этого топика y2m будет отправлять навыку уведомление об изменении состояния устройтсва. - -Рекомендую для set и state использовать разные топики, а "синхронизацию" этих топиков организовать средствами "умного дома". - ## Документация Яндекс - [Типы устройств](https://yandex.ru/dev/dialogs/alice/doc/smart-home/concepts/device-types.html) - [Типы умений устройства](https://yandex.ru/dev/dialogs/alice/doc/smart-home/concepts/capability-types.html) From e7d63fc126bc7e64af44f710d8b74690d0ba8465 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 18:51:08 +0300 Subject: [PATCH 019/105] Some refactoring --- app.js | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/app.js b/app.js index ca5b8de..91481f8 100644 --- a/app.js +++ b/app.js @@ -112,34 +112,6 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { ldevice.updateState(`${message}`, instance); /* */ - // if (config.yandex != undefined) { - // const {skillId, token} = config.yandex; - // const noticeRequest = https.request({ - // hostname: 'dialogs.yandex.net', - // port: 443, - // path: `/api/v1/skills/${skillId}/callback/state`, - // method: 'POST', - // headers: { - // 'Authorization': token, - // 'Content-Type': 'application/json' - // } - // }); - // const st = ldevice.getState(); - // noticeRequest.write(JSON.stringify({ - // ts: Math.floor(Date.now() / 1000), - // payload: { - // user_id: "1", - // devices: [{ - // id: deviceId, - // capabilities: st.capabilities, - // properties: st.properties - // }] - // } - // })); - // noticeRequest.end(); - // } - /* */ - }); module.exports = app; From 4e4bc36201ac28482e6cf79e1ed85afc9f74673c Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 19:31:42 +0300 Subject: [PATCH 020/105] test --- config.orig.js | 5 ----- routes/user.js | 7 ++++++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/config.orig.js b/config.orig.js index 1aea6f8..141e15c 100644 --- a/config.orig.js +++ b/config.orig.js @@ -1,9 +1,4 @@ module.exports = { - yandex: { - skillId: 'skill_id', - token: 'token' - }, - mqtt: { host: 'localhost', port: 1883, diff --git a/routes/user.js b/routes/user.js index 16009ed..e21df51 100644 --- a/routes/user.js +++ b/routes/user.js @@ -20,7 +20,12 @@ module.exports.ping = [ module.exports.devices = [ passport.authenticate('bearer', {session: true}), (req, res) => { - const reqId = req.get('X-Request-Id'); + const [reqId, authToken] = [req.get('X-Request-Id'), req.get('Authorization')]; + + const ltoken = global.authl.findOne({'token': authToken}); + const {userId} = ltoken; + console.log(userId); + const r = { request_id: reqId, payload: { From 9d1cbac0bd4f32c17970fd6447de338570d06873 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 19:33:21 +0300 Subject: [PATCH 021/105] test --- routes/user.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/routes/user.js b/routes/user.js index e21df51..9b019d1 100644 --- a/routes/user.js +++ b/routes/user.js @@ -22,9 +22,9 @@ module.exports.devices = [ (req, res) => { const [reqId, authToken] = [req.get('X-Request-Id'), req.get('Authorization')]; - const ltoken = global.authl.findOne({'token': authToken}); - const {userId} = ltoken; - console.log(userId); + //const ltoken = global.authl.findOne({'token': authToken}); + //const {userId} = ltoken; + console.log(authToken); const r = { request_id: reqId, From beec66c61641459cb60d106077e6f189a62bce44 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 20:33:29 +0300 Subject: [PATCH 022/105] test --- routes/user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/user.js b/routes/user.js index 9b019d1..a249183 100644 --- a/routes/user.js +++ b/routes/user.js @@ -20,7 +20,7 @@ module.exports.ping = [ module.exports.devices = [ passport.authenticate('bearer', {session: true}), (req, res) => { - const [reqId, authToken] = [req.get('X-Request-Id'), req.get('Authorization')]; + const [reqId, authToken] = [req.get('X-Request-Id'), String(req.get('Authorization')).split(' ')[1]]; //const ltoken = global.authl.findOne({'token': authToken}); //const {userId} = ltoken; From eb70dda14883fa001ac734d67d4024c425172310 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 20:40:41 +0300 Subject: [PATCH 023/105] test --- routes/user.js | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/routes/user.js b/routes/user.js index a249183..ac3622a 100644 --- a/routes/user.js +++ b/routes/user.js @@ -22,23 +22,28 @@ module.exports.devices = [ (req, res) => { const [reqId, authToken] = [req.get('X-Request-Id'), String(req.get('Authorization')).split(' ')[1]]; - //const ltoken = global.authl.findOne({'token': authToken}); - //const {userId} = ltoken; - console.log(authToken); + try { + const ltoken = global.authl.findOne({'token': authToken}); + const {userId} = ltoken; + console.log(userId); - const r = { - request_id: reqId, - payload: { - user_id: "1", - devices: [] - } - }; + const r = { + request_id: reqId, + payload: { + user_id: "1", + devices: [] + } + }; - for (const d of global.devices) { - r.payload.devices.push(d.getInfo()); - }; - - res.status(200).send(r); + for (const d of global.devices) { + r.payload.devices.push(d.getInfo()); + }; + + res.status(200).send(r); + } catch (e) { + console.error(e); + res.status(404).send(undefined); + } } ]; From de334f3d734a155269edc2cb07932a1a40aed76e Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 21:08:14 +0300 Subject: [PATCH 024/105] test --- routes/user.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/routes/user.js b/routes/user.js index ac3622a..758036c 100644 --- a/routes/user.js +++ b/routes/user.js @@ -25,18 +25,20 @@ module.exports.devices = [ try { const ltoken = global.authl.findOne({'token': authToken}); const {userId} = ltoken; - console.log(userId); const r = { request_id: reqId, payload: { - user_id: "1", + user_id: userId, devices: [] } }; for (const d of global.devices) { - r.payload.devices.push(d.getInfo()); + if (Array.isArray(d.users) && d.users.indexOf(userId)) { + console.log(d.getInfo()); + r.payload.devices.push(d.getInfo()); + } }; res.status(200).send(r); From 6dab440adb09861559cf76a1dba84da737d025b9 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 21:15:52 +0300 Subject: [PATCH 025/105] test --- routes/user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/user.js b/routes/user.js index 758036c..0bcd5cf 100644 --- a/routes/user.js +++ b/routes/user.js @@ -35,7 +35,7 @@ module.exports.devices = [ }; for (const d of global.devices) { - if (Array.isArray(d.users) && d.users.indexOf(userId)) { + if (Array.isArray(d.allowedUsers) && d.allowedUsers.indexOf(userId)) { console.log(d.getInfo()); r.payload.devices.push(d.getInfo()); } From 8366028550176ef0bcddae1e52b3c772ef6c279d Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 21:27:16 +0300 Subject: [PATCH 026/105] test --- device.js | 1 + 1 file changed, 1 insertion(+) diff --git a/device.js b/device.js index 9dd0242..1015a9c 100644 --- a/device.js +++ b/device.js @@ -34,6 +34,7 @@ class Device { room: options.room || '', type: options.type || 'devices.types.light', custom_data: { + allowedUsers: options.allowedUsers || [1], mqtt: options.mqtt || [], valueMapping: options.valueMapping || [], }, From be9acc37e4bd8099eb62268778d676468fb3a3aa Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 21:28:48 +0300 Subject: [PATCH 027/105] test --- routes/user.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/routes/user.js b/routes/user.js index 0bcd5cf..f0d5b92 100644 --- a/routes/user.js +++ b/routes/user.js @@ -35,7 +35,8 @@ module.exports.devices = [ }; for (const d of global.devices) { - if (Array.isArray(d.allowedUsers) && d.allowedUsers.indexOf(userId)) { + const {allowedUsers} = d.custom_data; + if (Array.isArray(allowedUsers) && allowedUsers.indexOf(userId)) { console.log(d.getInfo()); r.payload.devices.push(d.getInfo()); } From cc3b0779a0c1c4a467eb8c10fff30179dd6438ec Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 21:30:28 +0300 Subject: [PATCH 028/105] test --- routes/user.js | 1 + 1 file changed, 1 insertion(+) diff --git a/routes/user.js b/routes/user.js index f0d5b92..24d4b84 100644 --- a/routes/user.js +++ b/routes/user.js @@ -35,6 +35,7 @@ module.exports.devices = [ }; for (const d of global.devices) { + console.log(d); const {allowedUsers} = d.custom_data; if (Array.isArray(allowedUsers) && allowedUsers.indexOf(userId)) { console.log(d.getInfo()); From 736529aa4a64a55049ad9a0984eb1fb240a30675 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 21:39:23 +0300 Subject: [PATCH 029/105] test --- device.js | 8 +++++--- routes/user.js | 3 +-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/device.js b/device.js index 1015a9c..c275203 100644 --- a/device.js +++ b/device.js @@ -34,13 +34,15 @@ class Device { room: options.room || '', type: options.type || 'devices.types.light', custom_data: { - allowedUsers: options.allowedUsers || [1], mqtt: options.mqtt || [], valueMapping: options.valueMapping || [], }, capabilities: (options.capabilities || []).map(c => Object.assign({}, c, {state: (c.state == undefined) ? this.initState(c) : c.state})), - properties: (options.properties || []).map(p => Object.assign({}, p, {state: (p.state == undefined) ? this.initState(p) : p.state})) - } + properties: (options.properties || []).map(p => Object.assign({}, p, {state: (p.state == undefined) ? this.initState(p) : p.state})), + }; + this.meta = { + allowedUsers: options.allowedUsers || [1], + }; } /* Create init state (for capabilities and properties) on device object create */ diff --git a/routes/user.js b/routes/user.js index 24d4b84..7c5c5a7 100644 --- a/routes/user.js +++ b/routes/user.js @@ -35,8 +35,7 @@ module.exports.devices = [ }; for (const d of global.devices) { - console.log(d); - const {allowedUsers} = d.custom_data; + const {allowedUsers} = d.meta; if (Array.isArray(allowedUsers) && allowedUsers.indexOf(userId)) { console.log(d.getInfo()); r.payload.devices.push(d.getInfo()); From 2d56aa7eed456f3c23e05bb5f8163b55e7b0e3b3 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 21:41:28 +0300 Subject: [PATCH 030/105] test --- routes/user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/user.js b/routes/user.js index 7c5c5a7..6813383 100644 --- a/routes/user.js +++ b/routes/user.js @@ -36,7 +36,7 @@ module.exports.devices = [ for (const d of global.devices) { const {allowedUsers} = d.meta; - if (Array.isArray(allowedUsers) && allowedUsers.indexOf(userId)) { + if (Array.isArray(allowedUsers) && allowedUsers.indexOf(userId) > -1) { console.log(d.getInfo()); r.payload.devices.push(d.getInfo()); } From 147af06b56f96c18fc4541ae6d847cd1b8741814 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 21:43:58 +0300 Subject: [PATCH 031/105] test --- routes/user.js | 1 + 1 file changed, 1 insertion(+) diff --git a/routes/user.js b/routes/user.js index 6813383..4b46083 100644 --- a/routes/user.js +++ b/routes/user.js @@ -36,6 +36,7 @@ module.exports.devices = [ for (const d of global.devices) { const {allowedUsers} = d.meta; + console.log(allowedUsers); if (Array.isArray(allowedUsers) && allowedUsers.indexOf(userId) > -1) { console.log(d.getInfo()); r.payload.devices.push(d.getInfo()); From 85fc3526762c1e28404658d0ccd7c55e90aa74b6 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 21:46:25 +0300 Subject: [PATCH 032/105] test --- routes/user.js | 1 - 1 file changed, 1 deletion(-) diff --git a/routes/user.js b/routes/user.js index 4b46083..6813383 100644 --- a/routes/user.js +++ b/routes/user.js @@ -36,7 +36,6 @@ module.exports.devices = [ for (const d of global.devices) { const {allowedUsers} = d.meta; - console.log(allowedUsers); if (Array.isArray(allowedUsers) && allowedUsers.indexOf(userId) > -1) { console.log(d.getInfo()); r.payload.devices.push(d.getInfo()); From 78680c09f170357d58ad88cc28e77baf2ecf548d Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 23:09:08 +0300 Subject: [PATCH 033/105] Filter devices by allowed users --- routes/user.js | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/routes/user.js b/routes/user.js index 6813383..d3f230c 100644 --- a/routes/user.js +++ b/routes/user.js @@ -20,11 +20,10 @@ module.exports.ping = [ module.exports.devices = [ passport.authenticate('bearer', {session: true}), (req, res) => { - const [reqId, authToken] = [req.get('X-Request-Id'), String(req.get('Authorization')).split(' ')[1]]; + const [reqId, authToken] = [req.get('X-Request-Id'), req.get('Authorization').split(' ')[1]]; try { - const ltoken = global.authl.findOne({'token': authToken}); - const {userId} = ltoken; + const {userId} = global.authl.findOne({'token': authToken}); const r = { request_id: reqId, @@ -34,12 +33,8 @@ module.exports.devices = [ } }; - for (const d of global.devices) { - const {allowedUsers} = d.meta; - if (Array.isArray(allowedUsers) && allowedUsers.indexOf(userId) > -1) { - console.log(d.getInfo()); - r.payload.devices.push(d.getInfo()); - } + for (const d of global.devices.filter(d => Array.isArray(d.meta.allowedUsers) && d.meta.allowedUsers.indexOf(userId) > -1)) { + r.payload.devices.push(d.getInfo()); }; res.status(200).send(r); From 99785ca8cc7a808e2c7b807b9082011669019e20 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 23:37:11 +0300 Subject: [PATCH 034/105] Add allowed users support --- device.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/device.js b/device.js index c275203..3dc9aae 100644 --- a/device.js +++ b/device.js @@ -113,10 +113,15 @@ class Device { } } - /* Unused for now */ - // findProperty(type) { - // return this.data.properties.find(p => p.type === type); - // } + /* Find property by type (and instance) */ + findProperty(type, instance) { + const {properties} = this.data; + if (instance != undefined) { + return properties.find(p => p.type === type && p.state.instance === instance); + } else { + return properties.find(p => p.type === type); + } + } /* Find 'set' topic by instance*/ findTopicByInstance(instance) { From 91eaf86b836aa6633317ba58dd24dd2cdebe59fb Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 23:41:07 +0300 Subject: [PATCH 035/105] Add allowed users configuration --- config.orig.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config.orig.js b/config.orig.js index 141e15c..9078fc4 100644 --- a/config.orig.js +++ b/config.orig.js @@ -43,6 +43,7 @@ module.exports = { name: 'Свет в коридоре', room: 'Коридор', type: 'devices.types.light', + allowedUsers: ['2'], mqtt: [ { instance: 'on', @@ -63,6 +64,7 @@ module.exports = { name: 'Основной свет', room: 'Гостиная', type: 'devices.types.light', + allowedUsers: ['2'], mqtt: [ { instance: 'on', @@ -89,6 +91,7 @@ module.exports = { name: 'В гостиной', room: 'Гостиная', type: 'devices.types.sensor', + allowedUsers: ['2'], mqtt: [ { instance: 'temperature', @@ -124,6 +127,7 @@ module.exports = { name: 'Розетка для цветка', room: 'Гостиная', type: 'devices.types.socket', + allowedUsers: ['2'], mqtt: [ { instance: 'on', From 976d997c20b9c2f23f58c7d349500e02c8167609 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 23:53:57 +0300 Subject: [PATCH 036/105] Some configuration improvements --- README.md | 232 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 142 insertions(+), 90 deletions(-) diff --git a/README.md b/README.md index 6a61105..38dc5b8 100644 --- a/README.md +++ b/README.md @@ -94,10 +94,10 @@ module.exports = { Указать данные Вашего MQTT сервера ``` mqtt: { - host: 'localhost', - port: 1883, - user: 'user', - password: 'password' + host: 'localhost', + port: 1883, + user: 'user', + password: 'password', }, ``` @@ -115,105 +115,157 @@ 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 в конфиге, чтобы исключить "наложение" новых устройств на "старые", которые уже добавлены в навык.* From 431b5874200fd3b104ac583f5f17e0d68e5ca537 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 30 Mar 2021 23:54:31 +0300 Subject: [PATCH 037/105] Some configuration improvements --- config.orig.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config.orig.js b/config.orig.js index 9078fc4..de277f8 100644 --- a/config.orig.js +++ b/config.orig.js @@ -47,8 +47,8 @@ module.exports = { mqtt: [ { instance: 'on', - set: '/yandex/controls/light_HaW_002/state/on', - state: '/yandex/controls/light_HaW_002/state', + set: '/yandex/controls/light_HaW_002/on', + state: '/yandex/controls/light_HaW_002/on/state', }, ], capabilities: [ @@ -68,8 +68,8 @@ module.exports = { mqtt: [ { instance: 'on', - set: '/yandex/controls/light_LvR_003/state/on', - state: '/yandex/controls/light_LvR_003/state', + set: '/yandex/controls/light_LvR_003/on', + state: '/yandex/controls/light_LvR_003/on/state', }, ], valueMapping: [ @@ -131,8 +131,8 @@ module.exports = { mqtt: [ { instance: 'on', - set: '/yandex/controls/socket_LvR_002/state/on', - state: '/yandex/controls/socket_LvR_002/state/on', + set: '/yandex/controls/socket_LvR_002/on', + state: '/yandex/controls/socket_LvR_002/on/state', }, { instance: 'power', From 53646d6e04734e5f5c97c92762d0eb87b3e8569c Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Wed, 31 Mar 2021 00:15:22 +0300 Subject: [PATCH 038/105] Documentation improvement --- README.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 38dc5b8..e86de37 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ Прочий функционал (изменение громкости, каналов, отключение звука), поидее, так же должны работать. ## ChangeLog +###### 31.03.2021 +Добавлена поддрежка разделения доступа пользователей к устройствам. ###### Release Проведён рефакторинг кода и, местами, внесены значительные правки. @@ -271,17 +273,22 @@ devices: [ *В случае отсутсвия id в конфиге, он будет назначен автоматически по индексу в массиве.* +#### Разрешенные пользователи для устройств (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. @@ -326,7 +333,6 @@ service yandex2mqtt restart ``` ## Создание навыка (в Яндекс Диалоги) - Заходим в [Яндекс Диалоги](https://dialogs.yandex.ru/developer) => Создать диалог => Умный дом #### Основные настройки From 759f187e1d6fdb451a553e4e599b7bea21a342fd Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Wed, 31 Mar 2021 00:26:32 +0300 Subject: [PATCH 039/105] Clean code from commented code --- device.js | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/device.js b/device.js index 3dc9aae..7745afe 100644 --- a/device.js +++ b/device.js @@ -63,20 +63,6 @@ class Device { value: false } } - // case 'color_setting': { - // return { - // instance: (p => { - // if (p.temperature_k != undefined) return 'temperature_k'; - // if (p.color_model != undefined) return p.color_model; - // else return undefined; - // })(parameters), - // value: (p => { - // if (p.temperature_k != undefined) return p.temperature_k.min || 4500; - // if (p.color_model == 'rgb') return 16777215; - // if (p.color_model == 'hsv') return {h: 0, s: 0, v: 100}; - // })(parameters) - // } - // } case 'mode': { return { instance: parameters.instance, From 9ea490222fea8e2879153c412343cfb3277ee38c Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 10 May 2021 21:46:06 +0300 Subject: [PATCH 040/105] c --- app.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/app.js b/app.js index 91481f8..372f25b 100644 --- a/app.js +++ b/app.js @@ -112,6 +112,30 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { ldevice.updateState(`${message}`, instance); /* */ + const req = https.request({ + hostname: 'dialogs.yandex.net', + port: 443, + path: `/api/v1/skills/${config.notification.skill_id}/callback/state`, + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': config.notification.oauth_token + } + }, res => { + console.log(`statusCode: ${res.statusCode}`) + + res.on('data', d => { + process.stdout.write(d); + }); + }); + + req.on('error', error => { + console.error(error) + }); + + req.write(data); + req.end(); + }); module.exports = app; From 022455f8ca1969b0c27fe5f39f70e3dac9d065d7 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 10 May 2021 21:47:47 +0300 Subject: [PATCH 041/105] c --- app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app.js b/app.js index 372f25b..5bc2833 100644 --- a/app.js +++ b/app.js @@ -125,6 +125,7 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { console.log(`statusCode: ${res.statusCode}`) res.on('data', d => { + console.log(d); process.stdout.write(d); }); }); @@ -133,7 +134,7 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { console.error(error) }); - req.write(data); + // req.write(data); req.end(); }); From df7eef9c12481b78290c8309209555daa907525c Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 10 May 2021 22:01:33 +0300 Subject: [PATCH 042/105] c --- app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index 5bc2833..a2a63e5 100644 --- a/app.js +++ b/app.js @@ -118,8 +118,8 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { path: `/api/v1/skills/${config.notification.skill_id}/callback/state`, method: 'POST', headers: { - 'Content-Type': 'application/json', - 'Authorization': config.notification.oauth_token + 'Content-Type': `application/json`, + 'Authorization': `OAuth ${config.notification.oauth_token}` } }, res => { console.log(`statusCode: ${res.statusCode}`) From 52655f3a514bb8887bf73a56555be3adc28eb45a Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 11 May 2021 00:53:25 +0300 Subject: [PATCH 043/105] c --- app.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app.js b/app.js index a2a63e5..cf55b4e 100644 --- a/app.js +++ b/app.js @@ -134,7 +134,13 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { console.error(error) }); - // req.write(data); + req.write({ + "ts": Math.floor(Date.now() / 1000), + "payload": { + "user_id": '2', + "devices": [] + } + }); req.end(); }); From 76d63223fce33cff8ce65838fff63192bb1cad48 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 11 May 2021 00:55:00 +0300 Subject: [PATCH 044/105] c --- app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index cf55b4e..1b5c5c1 100644 --- a/app.js +++ b/app.js @@ -134,13 +134,13 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { console.error(error) }); - req.write({ + req.write(JSON.stringify({ "ts": Math.floor(Date.now() / 1000), "payload": { "user_id": '2', "devices": [] } - }); + })); req.end(); }); From 9928eec0ddb86293534b93e93b3400b50a17aab3 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 11 May 2021 01:03:43 +0300 Subject: [PATCH 045/105] c --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index 1b5c5c1..298f68c 100644 --- a/app.js +++ b/app.js @@ -138,7 +138,7 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { "ts": Math.floor(Date.now() / 1000), "payload": { "user_id": '2', - "devices": [] + "devices": ldevice.getState(), } })); req.end(); From 5a0ea1e0816d4a4820a28ee475fd4a71a06f5813 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 11 May 2021 01:11:13 +0300 Subject: [PATCH 046/105] c --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index 298f68c..d6ebea8 100644 --- a/app.js +++ b/app.js @@ -138,7 +138,7 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { "ts": Math.floor(Date.now() / 1000), "payload": { "user_id": '2', - "devices": ldevice.getState(), + "devices": [ldevice.getState()], } })); req.end(); From d1cf3c90beb1ad42387c12e36cd0335d566f1595 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 11 May 2021 01:13:13 +0300 Subject: [PATCH 047/105] c --- app.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app.js b/app.js index d6ebea8..10b3580 100644 --- a/app.js +++ b/app.js @@ -137,7 +137,6 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { req.write(JSON.stringify({ "ts": Math.floor(Date.now() / 1000), "payload": { - "user_id": '2', "devices": [ldevice.getState()], } })); From 3cdddcfae1172d6185d084dd02ff36bc4285d0cd Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Tue, 11 May 2021 01:13:58 +0300 Subject: [PATCH 048/105] c --- app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app.js b/app.js index 10b3580..75e9cb5 100644 --- a/app.js +++ b/app.js @@ -137,6 +137,7 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { req.write(JSON.stringify({ "ts": Math.floor(Date.now() / 1000), "payload": { + "user_id": '1', "devices": [ldevice.getState()], } })); From 0f0832041103d92a54390c22e1dd680ccfa2165e Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Wed, 12 May 2021 22:17:01 +0300 Subject: [PATCH 049/105] c --- app.js | 67 ++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/app.js b/app.js index 75e9cb5..0772337 100644 --- a/app.js +++ b/app.js @@ -112,36 +112,47 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { ldevice.updateState(`${message}`, instance); /* */ - const req = https.request({ - hostname: 'dialogs.yandex.net', - port: 443, - path: `/api/v1/skills/${config.notification.skill_id}/callback/state`, - method: 'POST', - headers: { - 'Content-Type': `application/json`, - 'Authorization': `OAuth ${config.notification.oauth_token}` - } - }, res => { - console.log(`statusCode: ${res.statusCode}`) - - res.on('data', d => { - console.log(d); - process.stdout.write(d); + Promise.all(config.notification.map(el => { + const [skill_id, oauth_token, user_id] = el; + + return new Promise((resolve, reject) => { + const req = https.request({ + hostname: 'dialogs.yandex.net', + port: 443, + path: `/api/v1/skills/${skill_id}/callback/state`, + method: 'POST', + headers: { + 'Content-Type': `application/json`, + 'Authorization': `OAuth ${oauth_token}` + } + }, res => { + console.log(`statusCode: ${res.statusCode}`); + + res.on('data', d => { + console.log(d); + process.stdout.write(d); + }); + }); + + req.on('error', error => { + console.error(error) + }); + + req.write(JSON.stringify({ + "ts": Math.floor(Date.now() / 1000), + "payload": { + "user_id": `${user_id}`, + "devices": [ldevice.getState()], + } + })); + + req.end(); + + resolve(true); }); - }); - - req.on('error', error => { - console.error(error) - }); - - req.write(JSON.stringify({ - "ts": Math.floor(Date.now() / 1000), - "payload": { - "user_id": '1', - "devices": [ldevice.getState()], - } })); - req.end(); + + /* */ }); From e537003082719680eac042dc74ba2c38b910c205 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Wed, 12 May 2021 22:23:44 +0300 Subject: [PATCH 050/105] c --- app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index 0772337..76777f8 100644 --- a/app.js +++ b/app.js @@ -112,7 +112,7 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { ldevice.updateState(`${message}`, instance); /* */ - Promise.all(config.notification.map(el => { + Promise.all([].concat(config.notification).map(el => { const [skill_id, oauth_token, user_id] = el; return new Promise((resolve, reject) => { @@ -147,7 +147,7 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { })); req.end(); - + resolve(true); }); })); From 712ec40202577642d3df14b3dc7d0ccf848955f5 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Wed, 12 May 2021 22:27:15 +0300 Subject: [PATCH 051/105] c --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index 76777f8..713fc75 100644 --- a/app.js +++ b/app.js @@ -112,7 +112,7 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { ldevice.updateState(`${message}`, instance); /* */ - Promise.all([].concat(config.notification).map(el => { + Promise.all(config.notification.map(el => { const [skill_id, oauth_token, user_id] = el; return new Promise((resolve, reject) => { From 6210cd99b75f360dc8d3360b042b3a9105a3b1dc Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Thu, 13 May 2021 00:47:55 +0300 Subject: [PATCH 052/105] c --- app.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/app.js b/app.js index 713fc75..1c446d9 100644 --- a/app.js +++ b/app.js @@ -113,10 +113,10 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { /* */ Promise.all(config.notification.map(el => { - const [skill_id, oauth_token, user_id] = el; + let {skill_id, oauth_token, user_id} = el; return new Promise((resolve, reject) => { - const req = https.request({ + let req = https.request({ hostname: 'dialogs.yandex.net', port: 443, path: `/api/v1/skills/${skill_id}/callback/state`, @@ -129,7 +129,6 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { console.log(`statusCode: ${res.statusCode}`); res.on('data', d => { - console.log(d); process.stdout.write(d); }); }); @@ -138,13 +137,20 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { console.error(error) }); - req.write(JSON.stringify({ + let {id, capabilities, properties} = ldevice.getState(); + const a = { "ts": Math.floor(Date.now() / 1000), "payload": { "user_id": `${user_id}`, - "devices": [ldevice.getState()], + "devices": [{ + id, + capabilities: capabilities.filter(c => c.state.instance == instance), + properties: properties.filter(p => p.state.instance == instance) + }], } - })); + }; + console.log(a); + req.write(JSON.stringify(a)); req.end(); From 23fab5fde915ad835f68ecf27dae8130831a03a3 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Thu, 13 May 2021 00:48:42 +0300 Subject: [PATCH 053/105] c --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index 1c446d9..6bd4e83 100644 --- a/app.js +++ b/app.js @@ -149,7 +149,7 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { }], } }; - console.log(a); + console.dir(a, {depth: 10}); req.write(JSON.stringify(a)); req.end(); From 2808c2c2a30151f997fcb13341470ace2a3216cf Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Thu, 13 May 2021 00:53:02 +0300 Subject: [PATCH 054/105] test version notification api --- app.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/app.js b/app.js index 6bd4e83..763c54d 100644 --- a/app.js +++ b/app.js @@ -129,16 +129,16 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { console.log(`statusCode: ${res.statusCode}`); res.on('data', d => { - process.stdout.write(d); + // process.stdout.write(d); }); }); req.on('error', error => { - console.error(error) + // console.error(error) }); let {id, capabilities, properties} = ldevice.getState(); - const a = { + req.write(JSON.stringify({ "ts": Math.floor(Date.now() / 1000), "payload": { "user_id": `${user_id}`, @@ -148,9 +148,7 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { properties: properties.filter(p => p.state.instance == instance) }], } - }; - console.dir(a, {depth: 10}); - req.write(JSON.stringify(a)); + })); req.end(); From 053877774a193e8954bccc3d3201184ad3e913a5 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Thu, 13 May 2021 00:53:46 +0300 Subject: [PATCH 055/105] Update documentation --- README.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/README.md b/README.md index e86de37..3d6f00e 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,9 @@ Прочий функционал (изменение громкости, каналов, отключение звука), поидее, так же должны работать. ## ChangeLog +###### 13.05.2021 +Добавлена поддержка API уведомлений об изменении состояний устройств. + ###### 31.03.2021 Добавлена поддрежка разделения доступа пользователей к устройствам. @@ -64,6 +67,12 @@ mv config.orig.js config.js #### Файл конфигурации ``` module.exports = { + notification: [ + { + ... + }, + ... + ] mqtt: { ... }, @@ -76,18 +85,21 @@ module.exports = { { ... }, + ... ], users: [ { ... }, + ... ], devices: [ { ... }, + ... ] } ``` @@ -273,6 +285,28 @@ devices: [ *В случае отсутсвия id в конфиге, он будет назначен автоматически по индексу в массиве.* +#### Уведомление об изменении состояний устройств +Платформа УД Яндекс предоставляет сервис уведомлений об изменении состояний устройств. При изменении состояния устройства (например, изменение влажности) 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 пользователей), для которых будет доступно устройство. From f8537046a1fe1bd16ed8d3461f1d5df417fab453 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 01:26:05 +0300 Subject: [PATCH 056/105] add winston --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index a3ec69c..6150dfe 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,8 @@ "passport-http": "^0.3.0", "passport-http-bearer": "^1.0.1", "passport-local": "^1.0.0", - "passport-oauth2-client-password": "^0.1.2" + "passport-oauth2-client-password": "^0.1.2", + "winston": "^3.3.3" }, "devDependencies": { "eslint": "^7.21.0", From 9e83f8ea2174310938ddf4d439d8dc04d5923adb Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 01:26:10 +0300 Subject: [PATCH 057/105] c --- app.js | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index 763c54d..15a56df 100644 --- a/app.js +++ b/app.js @@ -2,6 +2,9 @@ const fs = require('fs'); const path = require('path'); +/* */ +const { createLogger, format, transports } = require('winston'); +const { combine, timestamp, printf } = format; /* express and https */ const ejs = require('ejs'); const express = require('express'); @@ -20,6 +23,23 @@ const mqtt = require('mqtt'); const config = require('./config'); const Device = require('./device'); +/* Logging */ +global.logger = createLogger({ + level: 'info', + // format: winston.format.json(), + format: combine( + timestamp(), + printf(({ level, message, timestamp }) => { + return `${timestamp} ${level}: ${message}`; + }) + ), + transports: [ + new transports.File({filename: 'yandex2mqtt.log'}), + new transports.Console(), + ], +}); + +/* */ app.engine('ejs', ejs.__express); app.set('view engine', 'ejs'); app.set('views', path.join(__dirname, './views')); @@ -126,9 +146,11 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { 'Authorization': `OAuth ${oauth_token}` } }, res => { - console.log(`statusCode: ${res.statusCode}`); - res.on('data', d => { + global.logger.log({ + level: 'info', + message: `${d}` + }); // process.stdout.write(d); }); }); From 925256fdbd548fbad07b35d7a3e71aa4a03aa790 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 02:28:29 +0300 Subject: [PATCH 058/105] c --- app.js | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/app.js b/app.js index 15a56df..3e7a4f6 100644 --- a/app.js +++ b/app.js @@ -3,8 +3,8 @@ const fs = require('fs'); const path = require('path'); /* */ -const { createLogger, format, transports } = require('winston'); -const { combine, timestamp, printf } = format; +const {createLogger, format, transports} = require('winston'); +const {combine, timestamp, label, printf} = format; /* express and https */ const ejs = require('ejs'); const express = require('express'); @@ -26,16 +26,17 @@ const Device = require('./device'); /* Logging */ global.logger = createLogger({ level: 'info', - // format: winston.format.json(), format: combine( + label(), timestamp(), - printf(({ level, message, timestamp }) => { - return `${timestamp} ${level}: ${message}`; + printf(({level, message, timestamp, label}) => { + return `${timestamp} [${label}] ${level}: ${message}`; }) ), transports: [ - new transports.File({filename: 'yandex2mqtt.log'}), new transports.Console(), + new transports.File({filename: 'log/info.log'}), + new transports.File({filename: 'log/error.log', level: 'error'}), ], }); @@ -147,16 +148,13 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { } }, res => { res.on('data', d => { - global.logger.log({ - level: 'info', - message: `${d}` - }); + global.logger.log('info', 'notification', {message: `${d}`}); // process.stdout.write(d); }); }); req.on('error', error => { - // console.error(error) + global.logger.log('error', 'notification', {message: `${error}`}); }); let {id, capabilities, properties} = ldevice.getState(); From 0f79098f4476f45bca429d0c2cd4366e68a76940 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 02:36:56 +0300 Subject: [PATCH 059/105] c --- app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app.js b/app.js index 3e7a4f6..46906be 100644 --- a/app.js +++ b/app.js @@ -4,7 +4,7 @@ const fs = require('fs'); const path = require('path'); /* */ const {createLogger, format, transports} = require('winston'); -const {combine, timestamp, label, printf} = format; +const {combine, timestamp, printf} = format; /* express and https */ const ejs = require('ejs'); const express = require('express'); @@ -29,7 +29,7 @@ global.logger = createLogger({ format: combine( label(), timestamp(), - printf(({level, message, timestamp, label}) => { + printf(({level, message, label, timestamp}) => { return `${timestamp} [${label}] ${level}: ${message}`; }) ), @@ -148,7 +148,7 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { } }, res => { res.on('data', d => { - global.logger.log('info', 'notification', {message: `${d}`}); + global.logger.log('info', {message: `${d}`, label: 'notification'}); // process.stdout.write(d); }); }); From 5184680a6f3317d294615a91f125ec281d2dce09 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 02:54:41 +0300 Subject: [PATCH 060/105] c --- app.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app.js b/app.js index 46906be..a409723 100644 --- a/app.js +++ b/app.js @@ -29,8 +29,8 @@ global.logger = createLogger({ format: combine( label(), timestamp(), - printf(({level, message, label, timestamp}) => { - return `${timestamp} [${label}] ${level}: ${message}`; + printf(({level, message, timestamp}) => { + return `${timestamp} ${level}: ${message}`; }) ), transports: [ @@ -148,13 +148,13 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { } }, res => { res.on('data', d => { - global.logger.log('info', {message: `${d}`, label: 'notification'}); + global.logger.log('info', {message: `${d}`}); // process.stdout.write(d); }); }); req.on('error', error => { - global.logger.log('error', 'notification', {message: `${error}`}); + global.logger.log('error', {message: `${error}`}); }); let {id, capabilities, properties} = ldevice.getState(); From 29cfbaa470e8da7affbd012bf815dd266271afe6 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 18:20:53 +0300 Subject: [PATCH 061/105] c --- app.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app.js b/app.js index a409723..09406b5 100644 --- a/app.js +++ b/app.js @@ -23,6 +23,10 @@ const mqtt = require('mqtt'); const config = require('./config'); const Device = require('./device'); +/* */ +const clArgv = process.argv.slice(2); +console.log(clArgv); + /* Logging */ global.logger = createLogger({ level: 'info', @@ -33,13 +37,12 @@ global.logger = createLogger({ return `${timestamp} ${level}: ${message}`; }) ), - transports: [ - new transports.Console(), - new transports.File({filename: 'log/info.log'}), - new transports.File({filename: 'log/error.log', level: 'error'}), - ], + transports: [], }); +if (clArgv.indexOf('--log-info')) global.logger.add(new transports.Console()); +if (clArgv.indexOf('--log-error')) global.logger.add(new transports.File({filename: 'log/error.log', level: 'error'})); + /* */ app.engine('ejs', ejs.__express); app.set('view engine', 'ejs'); From 3af34bdac0a2ab19d2f0bf891a12e5c038e5881f Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 18:24:10 +0300 Subject: [PATCH 062/105] c --- app.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app.js b/app.js index 09406b5..945cc21 100644 --- a/app.js +++ b/app.js @@ -31,7 +31,6 @@ console.log(clArgv); global.logger = createLogger({ level: 'info', format: combine( - label(), timestamp(), printf(({level, message, timestamp}) => { return `${timestamp} ${level}: ${message}`; @@ -40,8 +39,8 @@ global.logger = createLogger({ transports: [], }); -if (clArgv.indexOf('--log-info')) global.logger.add(new transports.Console()); -if (clArgv.indexOf('--log-error')) global.logger.add(new transports.File({filename: 'log/error.log', level: 'error'})); +if (clArgv.indexOf('--log-info') > -1) global.logger.add(new transports.Console()); +if (clArgv.indexOf('--log-error') > -1) global.logger.add(new transports.File({filename: 'log/error.log', level: 'error'})); /* */ app.engine('ejs', ejs.__express); From d51e04ecc5d077d3d58e85f36c8b223a634d517c Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 18:57:32 +0300 Subject: [PATCH 063/105] Add winston-null --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 6150dfe..d825282 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,8 @@ "passport-http-bearer": "^1.0.1", "passport-local": "^1.0.0", "passport-oauth2-client-password": "^0.1.2", - "winston": "^3.3.3" + "winston": "^3.3.3", + "winston-null": "^2.0.0" }, "devDependencies": { "eslint": "^7.21.0", From ce696da495e3d7d3d91c7a6ed4ee72d464a37083 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 18:57:35 +0300 Subject: [PATCH 064/105] c --- app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app.js b/app.js index 945cc21..d52a987 100644 --- a/app.js +++ b/app.js @@ -5,6 +5,7 @@ const path = require('path'); /* */ const {createLogger, format, transports} = require('winston'); const {combine, timestamp, printf} = format; +var nullTransport = require('winston-null'); /* express and https */ const ejs = require('ejs'); const express = require('express'); @@ -36,7 +37,7 @@ global.logger = createLogger({ return `${timestamp} ${level}: ${message}`; }) ), - transports: [], + transports: [nullTransport], }); if (clArgv.indexOf('--log-info') > -1) global.logger.add(new transports.Console()); From a580eaa66672856ae2263a15858acae2de4e1462 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 19:02:01 +0300 Subject: [PATCH 065/105] c --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index d52a987..72f4c2c 100644 --- a/app.js +++ b/app.js @@ -5,7 +5,7 @@ const path = require('path'); /* */ const {createLogger, format, transports} = require('winston'); const {combine, timestamp, printf} = format; -var nullTransport = require('winston-null'); +const {NullTransport: nullTransport} = require('winston-null'); /* express and https */ const ejs = require('ejs'); const express = require('express'); From b3e06b2b61190da8f80b19c84d21682d98ecff3c Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 19:02:56 +0300 Subject: [PATCH 066/105] c --- app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index 72f4c2c..04e9d33 100644 --- a/app.js +++ b/app.js @@ -5,7 +5,7 @@ const path = require('path'); /* */ const {createLogger, format, transports} = require('winston'); const {combine, timestamp, printf} = format; -const {NullTransport: nullTransport} = require('winston-null'); +const NullTransport = require('winston-null'); /* express and https */ const ejs = require('ejs'); const express = require('express'); @@ -37,7 +37,7 @@ global.logger = createLogger({ return `${timestamp} ${level}: ${message}`; }) ), - transports: [nullTransport], + transports: [NullTransport], }); if (clArgv.indexOf('--log-info') > -1) global.logger.add(new transports.Console()); From 7d0b5794b7d528359a165350d318ca4a5a322189 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 19:04:58 +0300 Subject: [PATCH 067/105] c --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index 04e9d33..9aaecf7 100644 --- a/app.js +++ b/app.js @@ -37,7 +37,7 @@ global.logger = createLogger({ return `${timestamp} ${level}: ${message}`; }) ), - transports: [NullTransport], + transports: [new NullTransport()], }); if (clArgv.indexOf('--log-info') > -1) global.logger.add(new transports.Console()); From c887ef423659e3daa8c3b8cd5980f9dc0570934b Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 20:03:01 +0300 Subject: [PATCH 068/105] c --- app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app.js b/app.js index 9aaecf7..b8a0b9d 100644 --- a/app.js +++ b/app.js @@ -37,9 +37,10 @@ global.logger = createLogger({ return `${timestamp} ${level}: ${message}`; }) ), - transports: [new NullTransport()], + transports: [], }); +if (clArgv.length == 0) global.logger.add(NullTransport); if (clArgv.indexOf('--log-info') > -1) global.logger.add(new transports.Console()); if (clArgv.indexOf('--log-error') > -1) global.logger.add(new transports.File({filename: 'log/error.log', level: 'error'})); From b28d6a99c0c7a9b8740e68e62058fb9186e0656e Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 20:09:30 +0300 Subject: [PATCH 069/105] c --- app.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app.js b/app.js index b8a0b9d..3a44512 100644 --- a/app.js +++ b/app.js @@ -37,11 +37,13 @@ global.logger = createLogger({ return `${timestamp} ${level}: ${message}`; }) ), - transports: [], + transports: [ + new transports.Console({ + silent: clArgv.indexOf('--log-info') == -1 + }) + ], }); -if (clArgv.length == 0) global.logger.add(NullTransport); -if (clArgv.indexOf('--log-info') > -1) global.logger.add(new transports.Console()); if (clArgv.indexOf('--log-error') > -1) global.logger.add(new transports.File({filename: 'log/error.log', level: 'error'})); /* */ From d5dab865288823beccb3110085f3b43cc340f2eb Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 20:19:27 +0300 Subject: [PATCH 070/105] Remove winston-null --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index d825282..6150dfe 100644 --- a/package.json +++ b/package.json @@ -31,8 +31,7 @@ "passport-http-bearer": "^1.0.1", "passport-local": "^1.0.0", "passport-oauth2-client-password": "^0.1.2", - "winston": "^3.3.3", - "winston-null": "^2.0.0" + "winston": "^3.3.3" }, "devDependencies": { "eslint": "^7.21.0", From 7d423ae0d145fab160e1fc93378ee0e2619e31c7 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 20:27:32 +0300 Subject: [PATCH 071/105] Add logging and some code improvement --- app.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app.js b/app.js index 3a44512..5f77a44 100644 --- a/app.js +++ b/app.js @@ -5,7 +5,6 @@ const path = require('path'); /* */ const {createLogger, format, transports} = require('winston'); const {combine, timestamp, printf} = format; -const NullTransport = require('winston-null'); /* express and https */ const ejs = require('ejs'); const express = require('express'); @@ -26,7 +25,6 @@ const Device = require('./device'); /* */ const clArgv = process.argv.slice(2); -console.log(clArgv); /* Logging */ global.logger = createLogger({ @@ -138,7 +136,7 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { const ldevice = global.devices.find(d => d.data.id == deviceId); ldevice.updateState(`${message}`, instance); - /* */ + /* Make Request to Yandex Dialog notification API */ Promise.all(config.notification.map(el => { let {skill_id, oauth_token, user_id} = el; @@ -155,7 +153,6 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { }, res => { res.on('data', d => { global.logger.log('info', {message: `${d}`}); - // process.stdout.write(d); }); }); @@ -183,7 +180,6 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { })); /* */ - }); module.exports = app; From 03fe4e0d8db510281ef0992c4cdff3dcea71fcfd Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 20:27:41 +0300 Subject: [PATCH 072/105] Add logging --- routes/user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/user.js b/routes/user.js index d3f230c..96224a1 100644 --- a/routes/user.js +++ b/routes/user.js @@ -39,7 +39,7 @@ module.exports.devices = [ res.status(200).send(r); } catch (e) { - console.error(e); + global.logger.log('error', {message: `${e}`}); res.status(404).send(undefined); } } From 4e108d3e570e0d0fe0afceea6dd892198a1bae87 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 20:33:00 +0300 Subject: [PATCH 073/105] Add logging and some code improvement --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index 5f77a44..9824aa4 100644 --- a/app.js +++ b/app.js @@ -152,7 +152,7 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { } }, res => { res.on('data', d => { - global.logger.log('info', {message: `${d}`}); + global.logger.log('error', {message: `${d}`}); }); }); From f774b5e7c444c8b9f9f6baf0162f6d745b02a3f5 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 20:39:08 +0300 Subject: [PATCH 074/105] Add logging and some code improvement --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index 9824aa4..5f77a44 100644 --- a/app.js +++ b/app.js @@ -152,7 +152,7 @@ global.mqttClient = mqtt.connect(`mqtt://${config.mqtt.host}`, { } }, res => { res.on('data', d => { - global.logger.log('error', {message: `${d}`}); + global.logger.log('info', {message: `${d}`}); }); }); From b00068710cc1018721ebf56eeb648508cde24130 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 20:40:24 +0300 Subject: [PATCH 075/105] Add logging and some code improvement --- device.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device.js b/device.js index 3dc9aae..25e47ab 100644 --- a/device.js +++ b/device.js @@ -195,7 +195,7 @@ class Device { message = `${value}`; } catch(e) { topic = false; - console.log(e); + global.logger.log('error', {message: `${e}`}); } if (topic) { From 1661aeac9addfaa6fc18c1a00167d0cde208d7d5 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 20:44:38 +0300 Subject: [PATCH 076/105] Add logging and some code improvement --- device.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device.js b/device.js index 25e47ab..5b0168f 100644 --- a/device.js +++ b/device.js @@ -225,7 +225,7 @@ class Device { const value = this.getMappedValue(val, actType, false); cp.state = {instance, value: convertToYandexValue(value, actType)}; } catch(e) { - console.error(e); + global.logger.log('error', {message: `${e}`}); } } } From 5370f50b1540b4a21f3bc72a02507fdd03279c6a Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 21:20:09 +0300 Subject: [PATCH 077/105] Add logging and some code improvement --- db/access_tokens.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/db/access_tokens.js b/db/access_tokens.js index 0a43256..07f9a66 100644 --- a/db/access_tokens.js +++ b/db/access_tokens.js @@ -17,18 +17,18 @@ global.dbl = new loki('./loki.json', { module.exports.find = (key, done) => { const ltoken = global.authl.findOne({'token': key}); if (ltoken){ - console.log('Token found'); const {userId, clientId} = ltoken; return done(null, {userId, clientId}) } else { - return done(new Error('Token Not Found')); + global.logger.log('error', {message: `${new Error('Token Not Found')}`}); + return done(); } }; module.exports.findByUserIdAndClientId = (userId, clientId, done) => { const ltoken = global.authl.findOne({'userId': userId}); if (ltoken){ - console.log('Load token by userId: User found'); + global.logger.log('info', {message: `Load token by userId (${userId}): User found`}); const {token, userId: uid, clientId: cid} = ltoken; if (uid === userId && cid === clientId) return done(null, token); else return done(new Error('Token Not Found')); @@ -39,13 +39,13 @@ module.exports.findByUserIdAndClientId = (userId, clientId, done) => { }; module.exports.save = (token, userId, clientId, done) => { - console.log('Start saving token'); + global.logger.log('info', {message: `Start saving token`}); const ltoken = global.authl.findOne({'userId': userId}); if (ltoken){ - console.log('User Updated'); + global.logger.log('info', {message: `User Updated`}); global.authl.update(Object.assign({}, ltoken, {token, userId, clientId})); } else { - console.log('User not Found. Create new...'); + global.logger.log('info', {message: `User not Found. Create new...`}); global.authl.insert({'type': 'token', token, userId, clientId}); } done(); From 1761af28645b7099e2d27adefc62103578add959 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 21:24:10 +0300 Subject: [PATCH 078/105] Add logging and some code improvement --- app.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app.js b/app.js index 5f77a44..b4d3c06 100644 --- a/app.js +++ b/app.js @@ -4,7 +4,7 @@ const fs = require('fs'); const path = require('path'); /* */ const {createLogger, format, transports} = require('winston'); -const {combine, timestamp, printf} = format; +const {combine, timestamp, printf, errors, prettyPrint} = format; /* express and https */ const ejs = require('ejs'); const express = require('express'); @@ -30,10 +30,12 @@ const clArgv = process.argv.slice(2); global.logger = createLogger({ level: 'info', format: combine( + errors({stack: true}), timestamp(), - printf(({level, message, timestamp}) => { - return `${timestamp} ${level}: ${message}`; - }) + // printf(({level, message, timestamp}) => { + // return `${timestamp} ${level}: ${message}`; + // }), + prettyPrint() ), transports: [ new transports.Console({ From bc2410719a21dcc04ad5030717710416aec46167 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 21:32:42 +0300 Subject: [PATCH 079/105] c --- app.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app.js b/app.js index b4d3c06..69b0ee7 100644 --- a/app.js +++ b/app.js @@ -32,10 +32,9 @@ global.logger = createLogger({ format: combine( errors({stack: true}), timestamp(), - // printf(({level, message, timestamp}) => { - // return `${timestamp} ${level}: ${message}`; - // }), - prettyPrint() + printf(({level, message, timestamp, stack}) => { + return `${timestamp} ${level}: ${message} ${stack}`; + }) ), transports: [ new transports.Console({ From 63af2b267d941c18d62b1fbdad7513efd1c364e9 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 21:34:22 +0300 Subject: [PATCH 080/105] c --- app.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index 69b0ee7..a6b6807 100644 --- a/app.js +++ b/app.js @@ -32,8 +32,9 @@ global.logger = createLogger({ format: combine( errors({stack: true}), timestamp(), - printf(({level, message, timestamp, stack}) => { - return `${timestamp} ${level}: ${message} ${stack}`; + printf((a/* {level, message, timestamp, stack} */) => { + // return `${timestamp} ${level}: ${message} ${stack}`; + return `${a}`; }) ), transports: [ From f72f3ccdae581986403027a4a0a0d685b6aa7ae1 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 21:35:13 +0300 Subject: [PATCH 081/105] c --- app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app.js b/app.js index a6b6807..b3b2a22 100644 --- a/app.js +++ b/app.js @@ -34,6 +34,7 @@ global.logger = createLogger({ timestamp(), printf((a/* {level, message, timestamp, stack} */) => { // return `${timestamp} ${level}: ${message} ${stack}`; + console.dir(a, {depth: 9}); return `${a}`; }) ), From b7fc5d4990e3b27aa50c5b310992255346168e9c Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 21:41:35 +0300 Subject: [PATCH 082/105] c --- db/access_tokens.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/access_tokens.js b/db/access_tokens.js index 07f9a66..23321f2 100644 --- a/db/access_tokens.js +++ b/db/access_tokens.js @@ -20,7 +20,7 @@ module.exports.find = (key, done) => { const {userId, clientId} = ltoken; return done(null, {userId, clientId}) } else { - global.logger.log('error', {message: `${new Error('Token Not Found')}`}); + global.logger.log('error', new Error('Token Not Found')); return done(); } }; From ce50a5d1c828eef2cb2358c888cfbdcb8c467d5a Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 21:44:49 +0300 Subject: [PATCH 083/105] c --- app.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app.js b/app.js index b3b2a22..207dfee 100644 --- a/app.js +++ b/app.js @@ -32,11 +32,11 @@ global.logger = createLogger({ format: combine( errors({stack: true}), timestamp(), - printf((a/* {level, message, timestamp, stack} */) => { - // return `${timestamp} ${level}: ${message} ${stack}`; - console.dir(a, {depth: 9}); - return `${a}`; - }) + // printf((a/* {level, message, timestamp, stack} */) => { + // //console.dir(a, {depth: 9}); + // return `${timestamp} ${level}: ${message}`; + // }) + prettyPrint() ), transports: [ new transports.Console({ From ab64a6a94d1705a950294175240b2197611254a5 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 21:49:08 +0300 Subject: [PATCH 084/105] c --- app.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app.js b/app.js index 207dfee..f61ee49 100644 --- a/app.js +++ b/app.js @@ -32,11 +32,11 @@ global.logger = createLogger({ format: combine( errors({stack: true}), timestamp(), - // printf((a/* {level, message, timestamp, stack} */) => { - // //console.dir(a, {depth: 9}); - // return `${timestamp} ${level}: ${message}`; - // }) - prettyPrint() + printf(({level, message, timestamp, stack}) => { + //console.dir(a, {depth: 9}); + return `${timestamp} ${level}: ${message} \n ${stack != undefinde ? stack : ''}`; + }) + // prettyPrint() ), transports: [ new transports.Console({ From bc000f717aef95f46a79ee68df977cbe09db912b Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 21:49:42 +0300 Subject: [PATCH 085/105] c --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index f61ee49..ddffedd 100644 --- a/app.js +++ b/app.js @@ -34,7 +34,7 @@ global.logger = createLogger({ timestamp(), printf(({level, message, timestamp, stack}) => { //console.dir(a, {depth: 9}); - return `${timestamp} ${level}: ${message} \n ${stack != undefinde ? stack : ''}`; + return `${timestamp} ${level}: ${message} \n ${stack != undefined ? stack : ''}`; }) // prettyPrint() ), From 3df4d029345237e79aefdfe1739a279b3191a7c2 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 21:52:27 +0300 Subject: [PATCH 086/105] c --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index ddffedd..30309cd 100644 --- a/app.js +++ b/app.js @@ -34,7 +34,7 @@ global.logger = createLogger({ timestamp(), printf(({level, message, timestamp, stack}) => { //console.dir(a, {depth: 9}); - return `${timestamp} ${level}: ${message} \n ${stack != undefined ? stack : ''}`; + return `${timestamp} ${level}: ${stack != undefined ? stack : message}`; }) // prettyPrint() ), From efcff178b6127ca8550ff0f296f8531c567429de Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 22:11:46 +0300 Subject: [PATCH 087/105] Add logging and some code improvement --- app.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app.js b/app.js index 30309cd..669fe23 100644 --- a/app.js +++ b/app.js @@ -4,7 +4,7 @@ const fs = require('fs'); const path = require('path'); /* */ const {createLogger, format, transports} = require('winston'); -const {combine, timestamp, printf, errors, prettyPrint} = format; +const {combine, timestamp, printf, errors} = format; /* express and https */ const ejs = require('ejs'); const express = require('express'); @@ -33,10 +33,8 @@ global.logger = createLogger({ errors({stack: true}), timestamp(), printf(({level, message, timestamp, stack}) => { - //console.dir(a, {depth: 9}); return `${timestamp} ${level}: ${stack != undefined ? stack : message}`; - }) - // prettyPrint() + }), ), transports: [ new transports.Console({ From 4d2f87be6a98d4fe491e0d58f892fddaa0587ce6 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 22:35:17 +0300 Subject: [PATCH 088/105] Add logging and some code improvement --- app.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app.js b/app.js index 669fe23..f231134 100644 --- a/app.js +++ b/app.js @@ -4,7 +4,6 @@ const fs = require('fs'); const path = require('path'); /* */ const {createLogger, format, transports} = require('winston'); -const {combine, timestamp, printf, errors} = format; /* express and https */ const ejs = require('ejs'); const express = require('express'); @@ -29,10 +28,10 @@ const clArgv = process.argv.slice(2); /* Logging */ global.logger = createLogger({ level: 'info', - format: combine( - errors({stack: true}), - timestamp(), - printf(({level, message, timestamp, stack}) => { + format: format.combine( + format.errors({stack: true}), + format.timestamp(), + format.printf(({level, message, timestamp, stack}) => { return `${timestamp} ${level}: ${stack != undefined ? stack : message}`; }), ), From 07bff61978041f2d55936494ad4a92493100afd8 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 16 May 2021 23:53:55 +0300 Subject: [PATCH 089/105] Add logging --- db/access_tokens.js | 39 ++++++++++++++++++++++----------------- db/authorization_codes.js | 9 +++++++-- db/clients.js | 7 +++++-- db/users.js | 7 +++++-- device.js | 10 ++++++---- 5 files changed, 45 insertions(+), 27 deletions(-) diff --git a/db/access_tokens.js b/db/access_tokens.js index 23321f2..dacc2c4 100644 --- a/db/access_tokens.js +++ b/db/access_tokens.js @@ -1,5 +1,6 @@ 'use strict'; +const {logger, authl} = global; const loki = require('lokijs'); global.dbl = new loki('./loki.json', { @@ -7,46 +8,50 @@ global.dbl = new loki('./loki.json', { autosave: true, autosaveInterval: 5000, autoloadCallback() { - global.authl = global.dbl.getCollection('tokens'); - if (global.authl === null) { - global.authl = global.dbl.addCollection('tokens'); + authl = global.dbl.getCollection('tokens'); + if (authl === null) { + authl = global.dbl.addCollection('tokens'); } } }); module.exports.find = (key, done) => { - const ltoken = global.authl.findOne({'token': key}); + const ltoken = authl.findOne({'token': key}); if (ltoken){ const {userId, clientId} = ltoken; return done(null, {userId, clientId}) } else { - global.logger.log('error', new Error('Token Not Found')); + logger.log('error', new Error('Token Not Found')); return done(); } }; module.exports.findByUserIdAndClientId = (userId, clientId, done) => { - const ltoken = global.authl.findOne({'userId': userId}); + const ltoken = authl.findOne({'userId': userId}); if (ltoken){ - global.logger.log('info', {message: `Load token by userId (${userId}): User found`}); + logger.log('info', {message: `Load token by userId (${userId}): User found`}); const {token, userId: uid, clientId: cid} = ltoken; - if (uid === userId && cid === clientId) return done(null, token); - else return done(new Error('Token Not Found')); + if (uid === userId && cid === clientId) { + return done(null, token); + } else { + logger.log('error', new Error('Token Not Found')); + return done(); + } } else { - console.log('User not found'); - return done(new Error('User Not Found')); + logger.log('error', new Error('User Not Found')); + return done(); } }; module.exports.save = (token, userId, clientId, done) => { - global.logger.log('info', {message: `Start saving token`}); - const ltoken = global.authl.findOne({'userId': userId}); + logger.log('info', {message: `Start saving token`}); + const ltoken = authl.findOne({'userId': userId}); if (ltoken){ - global.logger.log('info', {message: `User Updated`}); - global.authl.update(Object.assign({}, ltoken, {token, userId, clientId})); + logger.log('info', {message: `User Updated`}); + authl.update(Object.assign({}, ltoken, {token, userId, clientId})); } else { - global.logger.log('info', {message: `User not Found. Create new...`}); - global.authl.insert({'type': 'token', token, userId, clientId}); + logger.log('info', {message: `User not Found. Create new...`}); + authl.insert({'type': 'token', token, userId, clientId}); } done(); }; diff --git a/db/authorization_codes.js b/db/authorization_codes.js index ae37649..c716cf2 100644 --- a/db/authorization_codes.js +++ b/db/authorization_codes.js @@ -1,10 +1,15 @@ 'use strict'; +const {logger} = global; const codes = {}; module.exports.find = (key, done) => { - if (codes[key]) return done(null, codes[key]); - return done(new Error('Code Not Found')); + if (codes[key]) { + return done(null, codes[key]); + } else { + logger.log('error', new Error('Code Not Found')); + return done(); + } }; module.exports.save = (code, clientId, redirectUri, userId, userName, done) => { diff --git a/db/clients.js b/db/clients.js index e49069f..4308a4b 100644 --- a/db/clients.js +++ b/db/clients.js @@ -1,17 +1,20 @@ 'use strict'; +const {logger} = global; const {clients} = require('../config'); module.exports.findById = (id, done) => { for (const client of clients) { if (client.id === id) return done(null, client); } - return done(new Error('Client Not Found')); + logger.log('error', new Error('Client Not Found')); + return done(); }; module.exports.findByClientId = (clientId, done) => { for (const client of clients) { if (client.clientId === clientId) return done(null, client); } - return done(new Error('Client Not Found')); + logger.log('error', new Error('Client Not Found')); + return done(); }; diff --git a/db/users.js b/db/users.js index 906954d..e2bf6a6 100644 --- a/db/users.js +++ b/db/users.js @@ -1,17 +1,20 @@ 'use strict'; +const {logger} = global; const {users} = require('../config'); module.exports.findById = (id, done) => { for (const user of users) { if (user.id === id) return done(null, user); } - return done(new Error('User Not Found')); + logger.log('error', new Error('User Not Found')); + return done(); }; module.exports.findByUsername = (username, done) => { for (const user of users) { if (user.username === username) return done(null, user); } - return done(new Error('User Not Found')); + logger.log('error', new Error('User Not Found')); + return done(); }; diff --git a/device.js b/device.js index 5b0168f..0f3c069 100644 --- a/device.js +++ b/device.js @@ -1,3 +1,5 @@ +const {logger} = global; + /* function for convert system values to Yandex (depends of capability or property type) */ function convertToYandexValue(val, actType) { switch(actType) { @@ -8,7 +10,7 @@ function convertToYandexValue(val, actType) { const value = parseFloat(val); return isNaN(value) ? 0.0 : value; } catch(e) { - console.error(`Can't parse to float: ${val}`); + logger.log('error', {message: `Can't parse to float: ${val}`}); return 0.0; } } @@ -96,7 +98,7 @@ class Device { } } default: { - console.error(`Unsupported capability type: ${type}`) + logger.log('error', {message: `Unsupported capability type: ${type}`}); return undefined; } } @@ -195,7 +197,7 @@ class Device { message = `${value}`; } catch(e) { topic = false; - global.logger.log('error', {message: `${e}`}); + logger.log('error', {message: `${e}`}); } if (topic) { @@ -225,7 +227,7 @@ class Device { const value = this.getMappedValue(val, actType, false); cp.state = {instance, value: convertToYandexValue(value, actType)}; } catch(e) { - global.logger.log('error', {message: `${e}`}); + logger.log('error', {message: `${e}`}); } } } From 198de695280d8dfca28ffea3476b11e480026e63 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 17 May 2021 00:03:25 +0300 Subject: [PATCH 090/105] Update readme --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3d6f00e..3130a5e 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,9 @@ Прочий функционал (изменение громкости, каналов, отключение звука), поидее, так же должны работать. ## ChangeLog +###### 16.05.2021 +Добавлено логирование некоторых событий. + ###### 13.05.2021 Добавлена поддержка API уведомлений об изменении состояний устройств. @@ -59,7 +62,7 @@ npm start ``` ## Настройка yandex2mqtt -Все основные настройки моста прописываются в файл config.js. Перед запуском обязательно отредактируйте его. +Все основные настройки моста прописываются в файл ~~config.js~~. Перед запуском обязательно отредактируйте его. ``` mv config.orig.js config.js ``` @@ -331,6 +334,9 @@ 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) +## Логирование + + ## Создание службы В папке /etc/systemd/system/ создать файл yandex2mqtt.service со следующим содержанем: ``` @@ -339,7 +345,7 @@ Description=yandex2mqtt After=network.target [Service] -ExecStart=/usr/bin/npm start +ExecStart=/usr/bin/node app.js WorkingDirectory=/opt/yandex2mqtt StandardOutput=inherit StandardError=inherit From 5a70512d8fa3e73d56f0cf1943b18715bd8b3d72 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 17 May 2021 00:05:14 +0300 Subject: [PATCH 091/105] Update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3130a5e..281d21d 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ npm start ``` ## Настройка yandex2mqtt -Все основные настройки моста прописываются в файл ~~config.js~~. Перед запуском обязательно отредактируйте его. +Все основные настройки моста прописываются в файл . Перед запуском обязательно отредактируйте его. ``` mv config.orig.js config.js ``` From 5b48706153f4fbb6550727db14c0f5594d129a65 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 17 May 2021 00:06:04 +0300 Subject: [PATCH 092/105] Update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 281d21d..1e59608 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ npm start ``` ## Настройка yandex2mqtt -Все основные настройки моста прописываются в файл . Перед запуском обязательно отредактируйте его. +Все основные настройки моста прописываются в файл `config.js`. Перед запуском обязательно отредактируйте его. ``` mv config.orig.js config.js ``` From 6c07dd726ddcccdf5fab2ceac1a0a90d39496efe Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 17 May 2021 00:21:13 +0300 Subject: [PATCH 093/105] Add logging and some code improvement --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index f231134..94e9496 100644 --- a/app.js +++ b/app.js @@ -42,7 +42,7 @@ global.logger = createLogger({ ], }); -if (clArgv.indexOf('--log-error') > -1) global.logger.add(new transports.File({filename: 'log/error.log', level: 'error'})); +if (clArgv.indexOf('--log-errors') > -1) global.logger.add(new transports.File({filename: 'log/error.log', level: 'error'})); /* */ app.engine('ejs', ejs.__express); From f375a0b75516e3b43c53776c42e48834334a94bd Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 17 May 2021 00:22:39 +0300 Subject: [PATCH 094/105] Add logging and some code improvement --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 1e59608..67bfc32 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Форк [Проекта](https://github.com/munrexio/yandex2mqtt) и [Статья на Хабре](https://habr.com/ru/post/465537/) к оригиналу. ## Важно -Те, кто пользуется оригинальным проектом (или его форками), обратите внимание на то, что немного изменились настройки устройств (блок **devices** в файле конфигурации). +Те, кто пользуется оригинальным проектом (или его форками), обратите внимание на то, что немного изменились настройки устройств (блок `devices` в файле конфигурации). На данный момент проверено получение температуры и влажности с датчиков (датчики дверей и движения пока в бета-тесте), и включение/выключение света (вкл./выкл. других устройств по аналогии тоже должно работать). @@ -23,7 +23,7 @@ ###### Release Проведён рефакторинг кода и, местами, внесены значительные правки. -Добавлена поддержка датчиков (устройств **devices.types.sensor**) +Добавлена поддержка датчиков (устройств `devices.types.sensor`) ## Требования - **"Белый" IP адрес и домен**. Если нет своего домена и белого IP адреса можно воспользоваться Dynamic DNS сервисами (например, noip.com). @@ -305,7 +305,7 @@ notification: [ Если к 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. +`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, то уведомление для устройтва отправляться не будет.* @@ -313,10 +313,10 @@ skill_id (идентификатор вызываемого навыка, при #### Разрешенные пользователи для устройств (allowedUsers) В блоке конфигурации можно указать пользователей (id пользователей), для которых будет доступно устройство. -В опции allowedUsers указыватся массив (строковых значений) id. Если данная опция не указана, то для неё будет назначено значение ['1']; +В опции `allowedUsers` указыватся массив (строковых значений) id. Если данная опция не указана, то для неё будет назначено значение ['1']; #### Mapping значений -Блок valueMapping позволяет настроить конвертацию значений между yandex api и MQTT. Это может быть актуально для умений типа **devices.capabilities.on_off** и **devices.capabilities.toggle**. +Блок valueMapping позволяет настроить конвертацию значений между yandex api и MQTT. Это может быть актуально для умений типа `devices.capabilities.on_off` и `devices.capabilities.toggle`. *Например, если в УД состояние влючено/выключено соответствует значениям 1/0, то Вам понадобиться их конвертировать, т.к. в навыках Yandex значения true/false.* ``` @@ -335,10 +335,10 @@ valueMapping: [ - [Типы встроенных датчиков](https://yandex.ru/dev/dialogs/alice/doc/smart-home/concepts/properties-types.html) ## Логирование - +Добавлено две "стратегии" логирования: логироване сообщений об ощибках в файл `log/errors.log` (аргумент запуска `--log-errors`) и логирование всех сообщений в консоль (`--log-info`). ## Создание службы -В папке /etc/systemd/system/ создать файл yandex2mqtt.service со следующим содержанем: +В папке `/etc/systemd/system/` создать файл `yandex2mqtt.service` со следующим содержанем: ``` [Unit] Description=yandex2mqtt From 0cbb90ba1e8f5fa5c8186b24e87e739414626301 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 17 May 2021 00:22:51 +0300 Subject: [PATCH 095/105] Add logging and some code improvement --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index 94e9496..f74acd6 100644 --- a/app.js +++ b/app.js @@ -42,7 +42,7 @@ global.logger = createLogger({ ], }); -if (clArgv.indexOf('--log-errors') > -1) global.logger.add(new transports.File({filename: 'log/error.log', level: 'error'})); +if (clArgv.indexOf('--log-errors') > -1) global.logger.add(new transports.File({filename: 'log/errors.log', level: 'error'})); /* */ app.engine('ejs', ejs.__express); From 6471a0d6aaf2df9af2b98329dc1ed21235af84fb Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 17 May 2021 00:26:02 +0300 Subject: [PATCH 096/105] Add logging and some code improvement --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 67bfc32..82814ef 100644 --- a/README.md +++ b/README.md @@ -335,7 +335,8 @@ valueMapping: [ - [Типы встроенных датчиков](https://yandex.ru/dev/dialogs/alice/doc/smart-home/concepts/properties-types.html) ## Логирование -Добавлено две "стратегии" логирования: логироване сообщений об ощибках в файл `log/errors.log` (аргумент запуска `--log-errors`) и логирование всех сообщений в консоль (`--log-info`). +Добавлено две "стратегии" логирования: логироване сообщений об ощибках в файл `log/error.log` (аргумент запуска `--log-error`) и логирование всех сообщений в консоль (`--log-info`). +Для запуска y2m с логирование нужно добавить аргумент запуска в команду запуска в файле настройки служба (**раздел ниже**) или запускать из консоли. ## Создание службы В папке `/etc/systemd/system/` создать файл `yandex2mqtt.service` со следующим содержанем: @@ -345,7 +346,7 @@ Description=yandex2mqtt After=network.target [Service] -ExecStart=/usr/bin/node app.js +ExecStart=/usr/bin/node app.js --log-error WorkingDirectory=/opt/yandex2mqtt StandardOutput=inherit StandardError=inherit From 28226e490427f06c2bb206d99d19a16fcea11807 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 17 May 2021 00:26:08 +0300 Subject: [PATCH 097/105] Add logging and some code improvement --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index f74acd6..f231134 100644 --- a/app.js +++ b/app.js @@ -42,7 +42,7 @@ global.logger = createLogger({ ], }); -if (clArgv.indexOf('--log-errors') > -1) global.logger.add(new transports.File({filename: 'log/errors.log', level: 'error'})); +if (clArgv.indexOf('--log-error') > -1) global.logger.add(new transports.File({filename: 'log/error.log', level: 'error'})); /* */ app.engine('ejs', ejs.__express); From 23152a9d38ba7aa19c974249e80ef1d18d41b179 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 17 May 2021 00:27:17 +0300 Subject: [PATCH 098/105] Update documentation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 82814ef..73f5dfe 100644 --- a/README.md +++ b/README.md @@ -335,7 +335,7 @@ valueMapping: [ - [Типы встроенных датчиков](https://yandex.ru/dev/dialogs/alice/doc/smart-home/concepts/properties-types.html) ## Логирование -Добавлено две "стратегии" логирования: логироване сообщений об ощибках в файл `log/error.log` (аргумент запуска `--log-error`) и логирование всех сообщений в консоль (`--log-info`). +Добавлено две "стратегии" логирования: сообщений об ощибках в файл `log/error.log` (аргумент запуска `--log-error`) и всех сообщений в консоль (`--log-info`). Для запуска y2m с логирование нужно добавить аргумент запуска в команду запуска в файле настройки служба (**раздел ниже**) или запускать из консоли. ## Создание службы From a9a1621ac9e95f5fc8e69db26b8e9cdf51d2829a Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 17 May 2021 00:31:28 +0300 Subject: [PATCH 099/105] Update documentation --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 73f5dfe..f73c318 100644 --- a/README.md +++ b/README.md @@ -335,8 +335,8 @@ valueMapping: [ - [Типы встроенных датчиков](https://yandex.ru/dev/dialogs/alice/doc/smart-home/concepts/properties-types.html) ## Логирование -Добавлено две "стратегии" логирования: сообщений об ощибках в файл `log/error.log` (аргумент запуска `--log-error`) и всех сообщений в консоль (`--log-info`). -Для запуска y2m с логирование нужно добавить аргумент запуска в команду запуска в файле настройки служба (**раздел ниже**) или запускать из консоли. +Добавлено две "стратегии" логирования: сообщений об ошибках в файл `log/error.log` (аргумент запуска `--log-error`) и всех сообщений в консоль (`--log-info`). +Для запуска y2m с логирование необходимо добавить аргумент запуска в команду запуска в файле настройки служба (**раздел ниже**) или запустить из консоли. ## Создание службы В папке `/etc/systemd/system/` создать файл `yandex2mqtt.service` со следующим содержанем: From bfdce6970b58ddb0bc0184f418435e26f1200c9e Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 17 May 2021 00:31:55 +0300 Subject: [PATCH 100/105] Update documentation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f73c318..e09d1bd 100644 --- a/README.md +++ b/README.md @@ -291,7 +291,7 @@ devices: [ #### Уведомление об изменении состояний устройств Платформа УД Яндекс предоставляет сервис уведомлений об изменении состояний устройств. При изменении состояния устройства (например, изменение влажности) yandex2mqtt будет отправлять запрос с новым состоянием. -В настройках предусмотрен блок **notification**. +В настройках предусмотрен блок `notification`. ``` notification: [ From 1ee7e31fa7b72a1a5459d14a40b280b2f0076617 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 17 May 2021 01:00:15 +0300 Subject: [PATCH 101/105] const error improvement --- db/access_tokens.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/db/access_tokens.js b/db/access_tokens.js index dacc2c4..91f6fa2 100644 --- a/db/access_tokens.js +++ b/db/access_tokens.js @@ -1,6 +1,6 @@ 'use strict'; -const {logger, authl} = global; +const {logger} = global; const loki = require('lokijs'); global.dbl = new loki('./loki.json', { @@ -8,15 +8,15 @@ global.dbl = new loki('./loki.json', { autosave: true, autosaveInterval: 5000, autoloadCallback() { - authl = global.dbl.getCollection('tokens'); - if (authl === null) { - authl = global.dbl.addCollection('tokens'); + global.authl = global.dbl.getCollection('tokens'); + if (global.authl === null) { + global.authl = global.dbl.addCollection('tokens'); } } }); module.exports.find = (key, done) => { - const ltoken = authl.findOne({'token': key}); + const ltoken = global.authl.findOne({'token': key}); if (ltoken){ const {userId, clientId} = ltoken; return done(null, {userId, clientId}) @@ -27,7 +27,7 @@ module.exports.find = (key, done) => { }; module.exports.findByUserIdAndClientId = (userId, clientId, done) => { - const ltoken = authl.findOne({'userId': userId}); + const ltoken = global.authl.findOne({'userId': userId}); if (ltoken){ logger.log('info', {message: `Load token by userId (${userId}): User found`}); const {token, userId: uid, clientId: cid} = ltoken; @@ -45,13 +45,13 @@ module.exports.findByUserIdAndClientId = (userId, clientId, done) => { module.exports.save = (token, userId, clientId, done) => { logger.log('info', {message: `Start saving token`}); - const ltoken = authl.findOne({'userId': userId}); + const ltoken = global.authl.findOne({'userId': userId}); if (ltoken){ logger.log('info', {message: `User Updated`}); - authl.update(Object.assign({}, ltoken, {token, userId, clientId})); + global.authl.update(Object.assign({}, ltoken, {token, userId, clientId})); } else { logger.log('info', {message: `User not Found. Create new...`}); - authl.insert({'type': 'token', token, userId, clientId}); + global.authl.insert({'type': 'token', token, userId, clientId}); } done(); }; From 0543944838d3987406244d876b1effd9d63b43a4 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 17 May 2021 01:03:05 +0300 Subject: [PATCH 102/105] some code improvement --- db/access_tokens.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/db/access_tokens.js b/db/access_tokens.js index 91f6fa2..67604a6 100644 --- a/db/access_tokens.js +++ b/db/access_tokens.js @@ -17,7 +17,8 @@ global.dbl = new loki('./loki.json', { module.exports.find = (key, done) => { const ltoken = global.authl.findOne({'token': key}); - if (ltoken){ + console.log(ltoken); + if (ltoken != undefined){ const {userId, clientId} = ltoken; return done(null, {userId, clientId}) } else { From 98e2a7ca1d3d3537d3a18596b7baf3b6db6c422c Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 17 May 2021 01:04:59 +0300 Subject: [PATCH 103/105] const error improvement --- db/access_tokens.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/db/access_tokens.js b/db/access_tokens.js index 67604a6..91f6fa2 100644 --- a/db/access_tokens.js +++ b/db/access_tokens.js @@ -17,8 +17,7 @@ global.dbl = new loki('./loki.json', { module.exports.find = (key, done) => { const ltoken = global.authl.findOne({'token': key}); - console.log(ltoken); - if (ltoken != undefined){ + if (ltoken){ const {userId, clientId} = ltoken; return done(null, {userId, clientId}) } else { From 38c51ef04764438de570a8f546ccfc0bed2e69ba Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Mon, 17 May 2021 01:05:21 +0300 Subject: [PATCH 104/105] const error fix --- db/access_tokens.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/access_tokens.js b/db/access_tokens.js index 91f6fa2..4c864a0 100644 --- a/db/access_tokens.js +++ b/db/access_tokens.js @@ -17,7 +17,7 @@ global.dbl = new loki('./loki.json', { module.exports.find = (key, done) => { const ltoken = global.authl.findOne({'token': key}); - if (ltoken){ + if (ltoken) { const {userId, clientId} = ltoken; return done(null, {userId, clientId}) } else { From acf78097e90e64a3f696ff2d08c41d2baff54f06 Mon Sep 17 00:00:00 2001 From: Evgenii Abramov Date: Sun, 23 May 2021 18:27:49 +0300 Subject: [PATCH 105/105] fix default 'allowedUsers' option --- device.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device.js b/device.js index b3e6fc2..12c71e3 100644 --- a/device.js +++ b/device.js @@ -43,7 +43,7 @@ class Device { properties: (options.properties || []).map(p => Object.assign({}, p, {state: (p.state == undefined) ? this.initState(p) : p.state})), }; this.meta = { - allowedUsers: options.allowedUsers || [1], + allowedUsers: options.allowedUsers || ['1'], }; }