ΠΠΎΡΡ ΠΈΠ· Π―Π½Π΄Π΅ΠΊΡ Π£Π Π² MQTT Π½Π° Node.js
Π€ΠΎΡΠΊ ΠΡΠΎΠ΅ΠΊΡΠ° ΠΈ Π‘ΡΠ°ΡΡΡ Π½Π° Π₯Π°Π±ΡΠ΅ ΠΊ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Ρ.
Π’Π΅, ΠΊΡΠΎ ΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ (ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΡΠΎΡΠΊΠ°ΠΌΠΈ), ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΡΡΡΠΎΠΉΡΡΠ² (Π±Π»ΠΎΠΊ devices
Π² ΡΠ°ΠΉΠ»Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ).
ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½ΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΡ ΠΈ Π²Π»Π°ΠΆΠ½ΠΎΡΡΠΈ Ρ Π΄Π°ΡΡΠΈΠΊΠΎΠ² (Π΄Π°ΡΡΠΈΠΊΠΈ Π΄Π²Π΅ΡΠ΅ΠΉ ΠΈ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΠΊΠ° Π² Π±Π΅ΡΠ°-ΡΠ΅ΡΡΠ΅), ΠΈ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅/Π²ΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ²Π΅ΡΠ° (Π²ΠΊΠ»./Π²ΡΠΊΠ». Π΄ΡΡΠ³ΠΈΡ ΡΡΡΡΠΎΠΉΡΡΠ² ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ ΡΠΎΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ).
ΠΡΠΎΡΠΈΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» (ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π³ΡΠΎΠΌΠΊΠΎΡΡΠΈ, ΠΊΠ°Π½Π°Π»ΠΎΠ², ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π·Π²ΡΠΊΠ°), ΠΏΠΎΠΈΠ΄Π΅Π΅, ΡΠ°ΠΊ ΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ.
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΠ±ΡΡΠΈΠΉ.
ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° API ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ ΡΡΡΡΠΎΠΉΡΡΠ².
ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄ΡΠ΅ΠΆΠΊΠ° ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΊ ΡΡΡΡΠΎΠΉΡΡΠ²Π°ΠΌ.
ΠΡΠΎΠ²Π΅Π΄ΡΠ½ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³ ΠΊΠΎΠ΄Π° ΠΈ, ΠΌΠ΅ΡΡΠ°ΠΌΠΈ, Π²Π½Π΅ΡΠ΅Π½Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΡΠ°Π²ΠΊΠΈ.
ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π΄Π°ΡΡΠΈΠΊΠΎΠ² (ΡΡΡΡΠΎΠΉΡΡΠ² devices.types.sensor
)
- "ΠΠ΅Π»ΡΠΉ" IP Π°Π΄ΡΠ΅Ρ ΠΈ Π΄ΠΎΠΌΠ΅Π½. ΠΡΠ»ΠΈ Π½Π΅Ρ ΡΠ²ΠΎΠ΅Π³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π° ΠΈ Π±Π΅Π»ΠΎΠ³ΠΎ IP Π°Π΄ΡΠ΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Dynamic DNS ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, noip.com).
- SSL ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ (ΡΠ°ΠΌΠΎΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½Π½ΡΠΉ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π½Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡΡ). ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ https://letsencrypt.org.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Node JS
curl -sL https://deb.nodesource.com/setup_10.x | bash -
Π£ΡΡΠ°Π½Π°Π²ΠΊΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²
apt-get install -y nodejs git make g++ gcc build-essential
ΠΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² y2m Ρ git
git clone https://github.com/lasthead0/yandex2mqtt.git /opt/yandex2mqtt
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΡΠ°Π² Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ
chown -R root:root /opt/yandex2mqtt
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ nodejs
cd /opt/yandex2mqtt
npm install
ΠΠ°ΠΏΡΡΠΊ ΠΌΠΎΡΡΠ° (Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ)
npm start
ΠΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΌΠΎΡΡΠ° ΠΏΡΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π² ΡΠ°ΠΉΠ» config.js
. ΠΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΡΠΊΠΎΠΌ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡΡΠ΅Π΄Π°ΠΊΡΠΈΡΡΠΉΡΠ΅ Π΅Π³ΠΎ.
mv config.orig.js config.js
module.exports = {
notification: [
{
...
},
...
]
mqtt: {
...
},
https: {
...
},
clients: [
{
...
},
...
],
users: [
{
...
},
...
],
devices: [
{
...
},
...
]
}
Π£ΠΊΠ°Π·Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΠ°ΡΠ΅Π³ΠΎ MQTT ΡΠ΅ΡΠ²Π΅ΡΠ°
mqtt: {
host: 'localhost',
port: 1883,
user: 'user',
password: 'password',
},
Π£ΠΊΠ°Π·Π°ΡΡ ΠΏΠΎΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΌΠΎΡΡ, Π° ΡΠ°ΠΊ ΠΆΠ΅ ΠΏΡΡΠΈ ΠΊ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ ssl.
https: {
privateKey: '/etc/letsencrypt/live/your.domain.ru/privkey.pem',
certificate: '/etc/letsencrypt/live/your.domain.ru/fullchain.pem',
port: 4433
},
ΠΠ΄Π΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π΄Π°Π»Π΅Π΅ ΠΎΠ½ΠΈ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΡΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ Π£Π Yandex.
clients: [
{
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',
},
],
devices: [
{
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-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',
},
},
],
},
{
id: 'haw-001-motion',
name: 'ΠΠ²ΠΈΠΆΠ΅Π½ΠΈΠ΅',
room: 'ΠΠΎΡΠΈΠ΄ΠΎΡ',
type: 'devices.types.sensor',
allowedUsers: ['2'],
mqtt: [
{
instance: 'motion',
state: '/yandex/sensors/HaW_001_Motion/motion',
},
],
valueMapping: [
{
type: 'event',
mapping: [['not_detected', 'detected'], ['false', 'true']], // [yandex, mqtt]
},
],
properties: [
{
type: 'devices.properties.event',
retrievable: true,
reportable: true,
parameters: {
instance: 'motion',
events: [{
value: 'detected'
},
{
value: 'not_detected'
}]
},
},
],
},
/* --- end */
],
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ id Π² ΠΊΠΎΠ½ΡΠΈΠ³Π΅, ΡΡΠΎΠ±Ρ ΠΈΡΠΊΠ»ΡΡΠΈΡΡ "Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅" Π½ΠΎΠ²ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ² Π½Π° "ΡΡΠ°ΡΡΠ΅", ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π² Π½Π°Π²ΡΠΊ.
Π ΡΠ»ΡΡΠ°Π΅ ΠΎΡΡΡΡΡΠ²ΠΈΡ id Π² ΠΊΠΎΠ½ΡΠΈΠ³Π΅, ΠΎΠ½ Π±ΡΠ΄Π΅Ρ Π½Π°Π·Π½Π°ΡΠ΅Π½ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅.
ΠΠ»Π°ΡΡΠΎΡΠΌΠ° Π£Π Π―Π½Π΄Π΅ΠΊΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ΅ΡΠ²ΠΈΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ ΡΡΡΡΠΎΠΉΡΡΠ². ΠΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π²Π»Π°ΠΆΠ½ΠΎΡΡΠΈ) yandex2mqtt Π±ΡΠ΄Π΅Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ Π·Π°ΠΏΡΠΎΡ Ρ Π½ΠΎΠ²ΡΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ.
Π Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ
ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ Π±Π»ΠΎΠΊ notification
.
notification: [
{
skill_id: '6fca0a54-a505-4420-b774-f01da95e5c31',
oauth_token: 'AQA11AAPv-V2BAT7o_ps6gEtrtNNjlE2ENYt96w',
user_id: '2'
},
]
ΠΡΠ»ΠΈ ΠΊ yandex2mqtt "ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΎ" Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π°Π²ΡΠΊΠΎΠ² Π£Π, ΡΠΎ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Π·Π°ΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½Π°Π²ΡΠΊΠ° Π£Π, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ.
skill_id
(ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ Π½Π°Π²ΡΠΊΠ°, ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½Π½ΡΠΉ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ) ΠΈ oauth_token
(Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠΎΠΊΠ΅Π½ Π²Π»Π°Π΄Π΅Π»ΡΡΠ° Π½Π°Π²ΡΠΊΠ°) ΠΌΠΎΠΆΠ½ΠΎ ΡΠ·Π½Π°ΡΡ ΠΈΠ· Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π½Π° Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ ΡΡΡΡΠΎΠΉΡΡΠ², Π° user_id
- id ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΡΠ°ΠΉΠ»Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ yandex2mqtt.
ΠΠ°ΠΆΠ½ΠΎ. Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π±ΡΠ΄ΡΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π½ΠΈΠΈ mqtt ΡΠΎΠΏΠΈΠΊΠ° Ρ ΡΠ°Π½ΡΡΠ΅Π³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π°. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π΅ΡΠ»ΠΈ Π΄Π»Ρ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π½Π΅ Π·Π°Π΄Π°Π½ ΡΠΎΠΏΠΈΠΊ state, ΡΠΎ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΡΡΡΠΎΠΉΡΠ²Π° ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ.
Π Π±Π»ΠΎΠΊΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ (id ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ), Π΄Π»Ρ ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ.
Π ΠΎΠΏΡΠΈΠΈ allowedUsers
ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΡ ΠΌΠ°ΡΡΠΈΠ² (ΡΡΡΠΎΠΊΠΎΠ²ΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ) id. ΠΡΠ»ΠΈ Π΄Π°Π½Π½Π°Ρ ΠΎΠΏΡΠΈΡ Π½Π΅ ΡΠΊΠ°Π·Π°Π½Π°, ΡΠΎ Π΄Π»Ρ Π½Π΅Ρ Π±ΡΠ΄Π΅Ρ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ['1'];
ΠΠ»ΠΎΠΊ 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]
},
],
Π mapping ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΌΠΈΡΡΠΈΠ² ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ². ΠΠ΅ΡΠ²ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² - Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² yandex, Π²ΡΠΎΡΠΎΠΉ - Π² MQTT.
- Π’ΠΈΠΏΡ ΡΡΡΡΠΎΠΉΡΡΠ²
- Π’ΠΈΠΏΡ ΡΠΌΠ΅Π½ΠΈΠΉ ΡΡΡΡΠΎΠΉΡΡΠ²Π°
- Π’ΠΈΠΏΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ Π΄Π°ΡΡΠΈΠΊΠΎΠ²
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π΄Π²Π΅ "ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ" Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ: ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ
Π² ΡΠ°ΠΉΠ» log/error.log
(Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π·Π°ΠΏΡΡΠΊΠ° --log-error
) ΠΈ Π²ΡΠ΅Ρ
ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ (--log-info
).
ΠΠ»Ρ Π·Π°ΠΏΡΡΠΊΠ° y2m Ρ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π·Π°ΠΏΡΡΠΊΠ° Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π·Π°ΠΏΡΡΠΊΠ° Π² ΡΠ°ΠΉΠ»Π΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠ»ΡΠΆΠ±Π° (ΡΠ°Π·Π΄Π΅Π» Π½ΠΈΠΆΠ΅) ΠΈΠ»ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΈΠ· ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ.
Π ΠΏΠ°ΠΏΠΊΠ΅ /etc/systemd/system/
ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΉΠ» yandex2mqtt.service
ΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π½Π΅ΠΌ:
[Unit]
Description=yandex2mqtt
After=network.target
[Service]
ExecStart=/usr/bin/node app.js --log-error
WorkingDirectory=/opt/yandex2mqtt
StandardOutput=inherit
StandardError=inherit
Restart=always
User=root
[Install]
WantedBy=multi-user.target
ΠΠ»Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ»ΡΠΆΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
systemctl enable yandex2mqtt.service
ΠΠ»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ»ΡΠΆΠ±ΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
service yandex2mqtt start
service yandex2mqtt stop
service yandex2mqtt restart
ΠΠ°Ρ ΠΎΠ΄ΠΈΠΌ Π² Π―Π½Π΄Π΅ΠΊΡ ΠΠΈΠ°Π»ΠΎΠ³ΠΈ => Π‘ΠΎΠ·Π΄Π°ΡΡ Π΄ΠΈΠ°Π»ΠΎΠ³ => Π£ΠΌΠ½ΡΠΉ Π΄ΠΎΠΌ
- ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ ΠΡΠ±ΠΎΠ΅
- Backend Endpoint URL ΠΈ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ https://your.domain.ru:port/provider
- Π’ΠΈΠΏ Π΄ΠΎΡΡΡΠΏΠ° ΠΡΠΈΠ²Π°ΡΠ½ΡΠΉ
- ΠΠΎΠ΄Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΡΠ±ΠΎΠΉ ΡΠ΅ΠΊΡΡ
- ΠΠΌΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΠ°ΡΠ΅ ΠΈΠΌΡ
- ΠΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ Π½Π°Π²ΡΠΊ ΠΠ΅Ρ
- ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΡΠ±ΠΎΠΉ ΡΠ΅ΠΊΡΡ
- ΠΠΊΠΎΠ½ΠΊΠ° Π‘Π²ΠΎΡ ΠΈΠΊΠΎΠ½ΠΊΠ°
- ΠΠ²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ ΠΠ½ΠΎΠΏΠΊΠ° "Π‘ΠΎΠ·Π΄Π°ΡΡ"
- ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π€Π°ΠΉΠ» ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ clients.clientId
- Π‘Π΅ΠΊΡΠ΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π€Π°ΠΉΠ» ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ clients.clientSecret
- URL Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ https://your.domain.ru:port/dialog/authorize
- URL Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½Π° https://your.domain.ru:port/oauth/token
- URL Π΄Π»Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½Π° https://your.domain.ru:port/oauth/token
Π‘ΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ Π½Π°Π²ΡΠΊ. ΠΠ°Π»Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠ΅ΡΠ½ΠΎΠ²ΠΈΠΊΠΎΠΌ (ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π°Π²ΡΠΊ) ΠΈΠ»ΠΈ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ (ΠΊΠ½ΠΎΠΏΠΊΠ° "ΠΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ").
ΠΠ° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (Π΄Π°Π»Π΅Π΅ ΠΊΠ½ΠΎΠΏΠΊΠ° +(ΠΏΠ»ΡΡ)) Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΡΠΈΠ²ΡΠ·Π°ΡΡ ΠΊ Π―Π½Π΄Π΅ΠΊΡΡ Π½Π°Ρ ΠΌΠΎΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ ΠΏΠ°ΡΠΎΠ»Ρ ΠΈΠ· ΡΠ°ΠΉΠ»Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ (Π±Π»ΠΎΠΊ users). ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΡΡΡΠΎΠΉΡΡΠ².
ΠΡΠ»ΠΈ ΡΠ»ΡΡΠ°Π΅ΡΡΡ ΡΠ°ΠΊΠΎΠ΅, ΡΡΠΎ ΠΠ»ΠΈΡΠ° ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π³ΠΎΠ»ΠΎΡΠΎΠ²ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ Π½Π΅ ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠΎΠΏΠΈΠΊ Π½Π΅ ΠΌΠ΅Π½ΡΠ΅Ρ ΡΠ²ΠΎΠ΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ, ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΡΠ΅ΠΉΡΠ° (ΠΎΠ±ΡΠ΅ΠΊΡΠ° iob) MQTT ΡΠΎΠΏΠΈΠΊ Π½Π΅ ΠΏΡΠ±Π»ΠΈΠΊΡΠ΅ΡΡΡ (ΠΠ»ΠΈΡΠ° Π½Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π° ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ ΡΡΠ°ΡΠΎΠ΅) Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΡΡ Π°Π΄Π°ΠΏΡΠ΅Ρ mqtt.
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½Π°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ, Π΅ΡΠ»ΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠΎΠΏΠΈΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ iob ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π²ΡΡΡΠ½ΡΡ. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅Ρ Π°Π΄Π°ΠΏΡΠ΅Ρ mqtt Π½Π΅ Π±ΡΠ΄Π΅Ρ "Π·Π½Π°ΡΡ", ΡΡΠΎ Π΄Π°Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΠΏΠΈΠΊΠΎΠΌ mqtt. ΠΠ»Ρ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ iob: Π·Π°ΠΉΡΠΈ Π² ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ RAW (EXPERTS ONLY) Π² json Π² ΠΏΠΎΠ»Π΅ native Π΄ΠΎΠ±Π°Π²ΠΈΡΡ topic. ΠΡΠΈΠΌΠ΅Ρ:
"native": {
"topic": "/yandex/controls/light_BdR_002/state"
}