From 753e8c3da7aa6f8976a586f5bf16d8b2f91a1303 Mon Sep 17 00:00:00 2001 From: Koen Kanters Date: Fri, 7 Dec 2018 23:17:29 +0100 Subject: [PATCH] Implement Home Assistant device registry. #646 --- lib/extension/homeassistant.js | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/lib/extension/homeassistant.js b/lib/extension/homeassistant.js index 924018a3d..a054917fe 100644 --- a/lib/extension/homeassistant.js +++ b/lib/extension/homeassistant.js @@ -1,6 +1,7 @@ const zigbeeShepherdConverters = require('zigbee-shepherd-converters'); const settings = require('../util/settings'); const logger = require('../util/logger'); +const zigbee2mqttVersion = require('../../package.json').version; const configurations = { // Binary sensor @@ -429,23 +430,23 @@ class HomeAssistant { // MQTT discovery of all paired devices on startup. this.zigbee.getAllClients().forEach((device) => { - const mappedDevice = zigbeeShepherdConverters.findByZigbeeModel(device.modelId); - if (mappedDevice) { - this.discover(device.ieeeAddr, mappedDevice.model, true); + const mappedModel = zigbeeShepherdConverters.findByZigbeeModel(device.modelId); + if (mappedModel) { + this.discover(device.ieeeAddr, mappedModel, true); } }); } - discover(ieeeAddr, model, force=false) { + discover(ieeeAddr, mappedModel, force=false) { // Check if already discoverd and check if there are configs. const discover = force || !this.discovered[ieeeAddr]; - if (!discover || !mapping[model] || !settings.getDevice(ieeeAddr)) { + if (!discover || !mapping[mappedModel.model] || !settings.getDevice(ieeeAddr)) { return; } const friendlyName = settings.getDevice(ieeeAddr).friendly_name; - mapping[model].forEach((config) => { + mapping[mappedModel.model].forEach((config) => { const topic = `${config.type}/${ieeeAddr}/${config.object_id}/config`; const payload = {...config.discovery_payload}; payload.state_topic = `${settings.get().mqtt.base_topic}/${friendlyName}`; @@ -457,6 +458,15 @@ class HomeAssistant { // Set unique_id payload.unique_id = `${ieeeAddr}_${config.object_id}_${settings.get().mqtt.base_topic}`; + // Attributes for device registry + payload.device = { + identifiers: `zigbee2mqtt_${ieeeAddr}`, + name: friendlyName, + sw_version: `Zigbee2mqtt ${zigbee2mqttVersion}`, + model: `${mappedModel.description} (${mappedModel.model})`, + manufacturer: mappedModel.vendor, + }; + if (payload.command_topic) { payload.command_topic = `${settings.get().mqtt.base_topic}/${friendlyName}/`; @@ -494,9 +504,9 @@ class HomeAssistant { return true; } - onZigbeeMessage(message, device, mappedDevice) { - if (device && mappedDevice) { - this.discover(device.ieeeAddr, mappedDevice.model); + onZigbeeMessage(message, device, mappedModel) { + if (device && mappedModel) { + this.discover(device.ieeeAddr, mappedModel); } }