From bc3fca9d68fde02c8da3af955d4a87e1fbcc19e3 Mon Sep 17 00:00:00 2001 From: Koen Kanters Date: Sat, 21 Apr 2018 09:13:14 +0200 Subject: [PATCH] Homeassistant discovery: allow multiple homeassistant sensor/devics per device. #9 --- lib/controller.js | 28 +++++++++------ lib/devices.js | 91 +++++++++++++++++++++++++++++++---------------- 2 files changed, 78 insertions(+), 41 deletions(-) diff --git a/lib/controller.js b/lib/controller.js index e3215e0a..1bdab5cf 100644 --- a/lib/controller.js +++ b/lib/controller.js @@ -72,17 +72,7 @@ class Controller { // Home assistant MQTT discovery if (settings.get().homeassistant_discovery && mappedModel.homeassistant && !this.hassDiscoveryCache[device.ieeeAddr]) { - const topic = `${mappedModel.homeassistant.type}/${device.ieeeAddr}/config`; - const payload = mappedModel.homeassistant.discovery_payload; - payload.state_topic = `${settings.get().mqtt.base_topic}/${friendlyName}`; - payload.availability_topic = `${settings.get().mqtt.base_topic}/bridge/state`; - payload.name = friendlyName; - - if (payload.command_topic) { - payload.command_topic = `${settings.get().mqtt.base_topic}/${friendlyName}/set`; - } - - this.mqtt.publish(topic, JSON.stringify(payload), true, null, 'homeassistant'); + this.homeassistantDiscover(mappedModel, device, friendlyName); this.hassDiscoveryCache[device.ieeeAddr] = true; } @@ -164,6 +154,22 @@ class Controller { this.zigbee.publish(deviceID, message.cId, message.cmd, message.zclData, callback); }); } + + homeassistantDiscover(mappedModel, device, friendlyName) { + mappedModel.homeassistant.forEach((discover) => { + const topic = `${discover.type}/${device.ieeeAddr}/${discover.object_id}/config`; + const payload = discover.discovery_payload; + payload.state_topic = `${settings.get().mqtt.base_topic}/${friendlyName}`; + payload.availability_topic = `${settings.get().mqtt.base_topic}/bridge/state`; + payload.name = friendlyName; + + if (payload.command_topic) { + payload.command_topic = `${settings.get().mqtt.base_topic}/${friendlyName}/set`; + } + + this.mqtt.publish(topic, JSON.stringify(payload), true, null, 'homeassistant'); + }); + } } module.exports = Controller; \ No newline at end of file diff --git a/lib/devices.js b/lib/devices.js index 96014e7d..9b6650f8 100644 --- a/lib/devices.js +++ b/lib/devices.js @@ -1,3 +1,59 @@ +const homeassistant = { + 'binary_sensor_occupancy': { + type: 'binary_sensor', + object_id: 'occupancy', + discovery_payload: { + payload_on: 'motion', + payload_off: 'no_motion', + value_template: '{{ value_json.occupancy }}', + device_class: 'motion', + json_attributes: ['battery'] + } + }, + 'sensor_illuminance': { + type: 'sensor', + object_id: 'illuminance', + discovery_payload: { + unit_of_measurement: 'lx', + icon: 'mdi:theme-light-dark', + value_template: '{{ value_json.illuminance }}', + json_attributes: ['battery'], + } + }, + 'binary_sensor_state': { + type: 'binary_sensor', + object_id: 'state', + discovery_payload: { + payload_on: 'open', + payload_off: 'closed', + value_template: '{{ value_json.state }}', + device_class: 'door', + json_attributes: ['battery'] + } + }, + 'light_brightness_colortemp_xy': { + type: 'light', + object_id: 'light', + discovery_payload: { + brightness: true, + color_temp: true, + xy: true, + platform: 'mqtt_json', + command_topic: true + } + }, + 'light_brightness_colortemp': { + type: 'light', + object_id: 'light', + discovery_payload: { + brightness: true, + color_temp: true, + platform: 'mqtt_json', + command_topic: true + } + }, +}; + const devices = { 'lumi.sensor_switch': { model: 'WXKG01LM', @@ -21,7 +77,8 @@ const devices = { model: 'RTCGQ01LM', vendor: 'Xiaomi', description: 'MiJia human body movement sensor', - supports: 'occupancy, motion and no motion' + supports: 'occupancy', + homeassistant: [homeassistant.binary_sensor_occupancy] }, 'lumi.sensor_magnet': { model: 'MCCGQ01LM', @@ -34,47 +91,21 @@ const devices = { vendor: 'Xiaomi', description: 'Aqara door & window contact sensor', supports: 'open and closed state', - homeassistant: { - type: 'binary_sensor', - discovery_payload: { - payload_on: 'open', - payload_off: 'closed', - value_template: '{{ value_json.state }}', - device_class: 'door', - json_attributes: ['battery'] - } - } + homeassistant: [homeassistant.binary_sensor_state] }, 'TRADFRI bulb E27 WS opal 980lm': { model: 'LED1545G12', vendor: 'IKEA', description: 'TRADFRI LED bulb E27 980 lumen, dimmable, white spectrum, opal white', supports: 'on/off, brightness, color temperature', - homeassistant: { - type: 'light', - discovery_payload: { - brightness: true, - color_temp: true, - platform: 'mqtt_json', - command_topic: true - } - } + homeassistant: [homeassistant.light_brightness_colortemp] }, 'LLC020': { model: '7146060PH', vendor: 'Philips', description: 'Hue Go', supports: 'on/off, brightness, color temperature, color xy', - homeassistant: { - type: 'light', - discovery_payload: { - brightness: true, - color_temp: true, - xy: true, - platform: 'mqtt_json', - command_topic: true - } - } + homeassistant: [homeassistant.light_brightness_colortemp_xy] }, }