From a448ed3d7d09b750c5b515186393495b70ec05ae Mon Sep 17 00:00:00 2001 From: Stanislav Demydiuk Date: Thu, 20 Sep 2018 22:42:50 +0300 Subject: [PATCH] Add ability to send device information in MQTT message payload (#374) --- .eslintrc.json | 2 +- lib/controller.js | 39 ++++++++++++++++++++++++++++++++------- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index a988e4f29..96e45c73f 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -4,7 +4,7 @@ }, "extends": ["eslint:recommended", "google"], "parserOptions": { - "ecmaVersion": 6, + "ecmaVersion": 2018, "sourceType": "module" }, "rules": { diff --git a/lib/controller.js b/lib/controller.js index fc914993a..6daed0d4f 100644 --- a/lib/controller.js +++ b/lib/controller.js @@ -6,7 +6,7 @@ const settings = require('./util/settings'); const ExtensionNetworkMap = require('./extension/networkMap'); const zigbeeShepherdConverters = require('zigbee-shepherd-converters'); const homeassistant = require('./homeassistant'); -const objectAssignDeep = require(`object-assign-deep`); +const objectAssignDeep = require('object-assign-deep'); const mqttConfigRegex = new RegExp(`${settings.get().mqtt.base_topic}/bridge/config/\\w+`, 'g'); const mqttDeviceRegex = new RegExp(`${settings.get().mqtt.base_topic}/[\\w\\s\\d.-]+/set`, 'g'); @@ -108,7 +108,7 @@ class Controller { sendAllCachedStates() { this.zigbee.getAllClients().forEach((device) => { if (this.state.exists(device.ieeeAddr)) { - this.mqttPublishDeviceState(device.ieeeAddr, this.state.get(device.ieeeAddr), false); + this.mqttPublishDeviceState(device, this.state.get(device.ieeeAddr), false); } }); } @@ -217,6 +217,23 @@ class Controller { `${friendlyDevice.vendor} ${friendlyDevice.description} (${type})`; } + getDeviceInfoForMqtt(device) { + const {type, ieeeAddr, nwkAddr, manufId, manufName, powerSource, modelId, status} = device; + const deviceSettings = settings.getDevice(device.ieeeAddr); + + return { + ieeeAddr, + friendlyName: deviceSettings.friendly_name || '', + type, + nwkAddr, + manufId, + manufName, + powerSource, + modelId, + status, + }; + } + handleZigbeeMessage(message) { // Zigbee message receieved, reset soft reset timeout. this.softResetTimeout(true); @@ -338,7 +355,7 @@ class Controller { payload.linkquality = message.linkquality; } - this.mqttPublishDeviceState(device.ieeeAddr, payload, cache); + this.mqttPublishDeviceState(device, payload, cache); }; const payload = converter.convert(mappedModel, message, publish, settings.getDevice(device.ieeeAddr)); @@ -537,7 +554,7 @@ class Controller { const msg = {}; const _key = topicPrefix ? `${key}_${topicPrefix}` : key; msg[_key] = json[key]; - this.mqttPublishDeviceState(deviceID, msg, true); + this.mqttPublishDeviceState(device, msg, true); } }; @@ -576,11 +593,15 @@ class Controller { }); } - mqttPublishDeviceState(deviceID, payload, cache) { + mqttPublishDeviceState(device, payload, cache) { + const deviceID = device.ieeeAddr; + const appSettings = settings.get(); + let messagePayload = {...payload}; + if (cacheState) { // Add cached state to payload if (this.state.exists(deviceID)) { - payload = objectAssignDeep.noMutate(this.state.get(deviceID), payload); + messagePayload = objectAssignDeep.noMutate(this.state.get(deviceID), payload); } // Update state cache with new state. @@ -595,7 +616,11 @@ class Controller { qos: deviceSettings.qos ? deviceSettings.qos : 0, }; - this.mqtt.publish(deviceSettings.friendly_name, JSON.stringify(payload), options); + if (appSettings.mqtt.include_device_information) { + messagePayload.device = this.getDeviceInfoForMqtt(device); + } + + this.mqtt.publish(deviceSettings.friendly_name, JSON.stringify(messagePayload), options); } startupLogVersion(callback) {