From 104c6886740fe88376f3638a14daf39203b373be Mon Sep 17 00:00:00 2001 From: Joe Lu Date: Mon, 11 Feb 2019 19:28:11 -0800 Subject: [PATCH 01/13] - added support for Keen Home smart vent --- converters/fromZigbee.js | 2 +- devices.js | 48 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/converters/fromZigbee.js b/converters/fromZigbee.js index a5b65a3cd059d..6d46e34a090e6 100644 --- a/converters/fromZigbee.js +++ b/converters/fromZigbee.js @@ -666,7 +666,7 @@ const converters = { return {illuminance: msg.data.data['measuredValue']}; }, }, - xiaomi_pressure: { + generic_pressure: { cid: 'msPressureMeasurement', type: 'attReport', convert: (model, msg, publish, options) => { diff --git a/devices.js b/devices.js index 61897bcc7b5ad..1f86a1abd7635 100644 --- a/devices.js +++ b/devices.js @@ -277,7 +277,7 @@ const devices = [ description: 'Aqara temperature, humidity and pressure sensor', supports: 'temperature, humidity and pressure', fromZigbee: [ - fz.xiaomi_battery_3v, fz.xiaomi_temperature, fz.xiaomi_humidity, fz.xiaomi_pressure, + fz.xiaomi_battery_3v, fz.xiaomi_temperature, fz.xiaomi_humidity, fz.generic_pressure, fz.ignore_basic_change, fz.ignore_temperature_change, fz.ignore_humidity_change, fz.ignore_pressure_change, fz.WSDCGQ01LM_WSDCGQ11LM_interval, ], @@ -2527,6 +2527,52 @@ const devices = [ execute(device, actions, callback); }, }, + + // Keen Home + { + zigbeeModel: ['SV01-410-MP-1.4'], + model: 'SV01-410-MP-1.4', + vendor: 'Keen Home Inc.', + description: 'Smart Vent', + supports: 'open, close, position, temperature, pressure', + fromZigbee: [ + fz.brightness, + fz.state_change, + fz.state, + fz.brightness_report, + fz.generic_temperature, + fz.generic_pressure, + fz.generic_battery, + ], + toZigbee: [ + tz.on_off, + tz.light_brightness, + tz.ignore_transition, + ], + configure: (ieeeAddr, shepherd, coordinator, callback) => { + const device = shepherd.find(ieeeAddr, 1); + const actions = [ + (cb) => device.write('ssIasZone', 'iasCieAddr', coordinator.device.getIeeeAddr(), cb), + (cb) => device.functional('ssIasZone', 'enrollRsp', {enrollrspcode: 0, zoneid: 23}, cb), + + (cb) => device.bind('genBasic', coordinator, cb), + (cb) => device.bind('genIdentify', coordinator, cb), + (cb) => device.bind('genOnOff', coordinator, cb), + (cb) => device.bind('genLevelCtrl', coordinator, cb), + (cb) => device.bind('genPollCtrl', coordinator, cb), + (cb) => device.bind('genPowerCfg', coordinator, cb), + (cb) => device.bind('msPressureMeasurement', coordinator, cb), + (cb) => device.bind('msTemperatureMeasurement', coordinator, cb), + (cb) => device.report('msTemperatureMeasurement', 'measuredValue', 30, 600, 1, cb), + (cb) => device.report('msPressureMeasurement', 'measuredValue', 30, 600, 1, cb), + (cb) => device.report('genPowerCfg', 'batteryPercentageRemaining', 0, 1000, 0, cb), + (cb) => device.report('genLevelCtrl', 'currentLevel', 0, 600, 0, cb), + (cb) => device.report('genOnOff', 'onOff', 0, 600, 0, cb), + ]; + + execute(device, actions, callback); + }, + }, ]; module.exports = devices.map((device) => From a893d030f38846da279e06d5c4049134f4a6fe2d Mon Sep 17 00:00:00 2001 From: Joe Lu Date: Fri, 15 Feb 2019 11:52:22 -0800 Subject: [PATCH 02/13] - added more from-zigbee handler for keen vent - added more model# for keen vent --- converters/fromZigbee.js | 26 ++++++++++++++++++++++++++ devices.js | 23 ++++++++++------------- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/converters/fromZigbee.js b/converters/fromZigbee.js index 6d46e34a090e6..fa6a6a9e9188e 100644 --- a/converters/fromZigbee.js +++ b/converters/fromZigbee.js @@ -1673,6 +1673,32 @@ const converters = { return {action: `${direction}`}; }, }, + keen_home_smart_vent_temperature_dev_change: { + cid: 'msTemperatureMeasurement', + type: 'devChange', + convert: (model, msg, publish, options) => { + // '{"cid":"msTemperatureMeasurement","data":{"measuredValue":2498}}' + const temperature = parseFloat(msg.data.data['measuredValue']) / 100.0; + return {temperature: precisionRoundOptions(temperature, options, 'temperature')}; + }, + }, + keen_home_smart_vent_pressure_dev_change: { + cid: 'msPressureMeasurement', + type: 'devChange', + convert: (model, msg, publish, options) => { + // '{"cid":"msPressureMeasurement","data":{"32":990494}}' + const pressure = parseFloat(msg.data.data['32']) / 1000.0; + return {pressure: precisionRoundOptions(pressure, options, 'pressure')}; + }, + }, + keen_home_smart_vent_pressure_attr_report: { + cid: 'msPressureMeasurement', + type: 'attReport', + convert: (model, msg, publish, options) => { + const pressure = parseFloat(msg.data.data['32']) / 1000.0; + return {pressure: precisionRoundOptions(pressure, options, 'pressure')}; + }, + }, // Ignore converters (these message dont need parsing). ignore_doorlock_change: { diff --git a/devices.js b/devices.js index 1f86a1abd7635..4e1e0402282b3 100644 --- a/devices.js +++ b/devices.js @@ -2530,19 +2530,21 @@ const devices = [ // Keen Home { - zigbeeModel: ['SV01-410-MP-1.4'], - model: 'SV01-410-MP-1.4', + zigbeeModel: ['SV01-410-MP-1.0', 'SV01-410-MP-1.4', 'SV01-410-MP-1.5'], + model: 'Smart Vent SV01', vendor: 'Keen Home Inc.', description: 'Smart Vent', - supports: 'open, close, position, temperature, pressure', + supports: 'open, close, position, temperature, pressure, battery', fromZigbee: [ fz.brightness, fz.state_change, fz.state, fz.brightness_report, fz.generic_temperature, - fz.generic_pressure, fz.generic_battery, + fz.keen_home_smart_vent_pressure_dev_change, + fz.keen_home_smart_vent_temperature_dev_change, + fz.keen_home_smart_vent_pressure_attr_report, ], toZigbee: [ tz.on_off, @@ -2552,22 +2554,17 @@ const devices = [ configure: (ieeeAddr, shepherd, coordinator, callback) => { const device = shepherd.find(ieeeAddr, 1); const actions = [ - (cb) => device.write('ssIasZone', 'iasCieAddr', coordinator.device.getIeeeAddr(), cb), - (cb) => device.functional('ssIasZone', 'enrollRsp', {enrollrspcode: 0, zoneid: 23}, cb), - - (cb) => device.bind('genBasic', coordinator, cb), - (cb) => device.bind('genIdentify', coordinator, cb), (cb) => device.bind('genOnOff', coordinator, cb), (cb) => device.bind('genLevelCtrl', coordinator, cb), - (cb) => device.bind('genPollCtrl', coordinator, cb), (cb) => device.bind('genPowerCfg', coordinator, cb), (cb) => device.bind('msPressureMeasurement', coordinator, cb), (cb) => device.bind('msTemperatureMeasurement', coordinator, cb), + + (cb) => device.report('genOnOff', 'onOff', 0, 600, 0, cb), + (cb) => device.report('genLevelCtrl', 'currentLevel', 0, 600, 0, cb), + (cb) => device.report('genPowerCfg', 'batteryPercentageRemaining', 0, 1000, 0, cb), (cb) => device.report('msTemperatureMeasurement', 'measuredValue', 30, 600, 1, cb), (cb) => device.report('msPressureMeasurement', 'measuredValue', 30, 600, 1, cb), - (cb) => device.report('genPowerCfg', 'batteryPercentageRemaining', 0, 1000, 0, cb), - (cb) => device.report('genLevelCtrl', 'currentLevel', 0, 600, 0, cb), - (cb) => device.report('genOnOff', 'onOff', 0, 600, 0, cb), ]; execute(device, actions, callback); From 095d5895938a80cecc2f29daab1a360b19af9cdc Mon Sep 17 00:00:00 2001 From: Koen Kanters Date: Fri, 15 Feb 2019 22:35:24 +0100 Subject: [PATCH 03/13] Update devices.js --- devices.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/devices.js b/devices.js index 4e1e0402282b3..56f6db731a81a 100644 --- a/devices.js +++ b/devices.js @@ -2531,9 +2531,9 @@ const devices = [ // Keen Home { zigbeeModel: ['SV01-410-MP-1.0', 'SV01-410-MP-1.4', 'SV01-410-MP-1.5'], - model: 'Smart Vent SV01', - vendor: 'Keen Home Inc.', - description: 'Smart Vent', + model: 'SV01', + vendor: 'Keen Home', + description: 'Smart vent', supports: 'open, close, position, temperature, pressure, battery', fromZigbee: [ fz.brightness, From 09a9cac4a77c2d25d25f0e9f100c34659cac1fc0 Mon Sep 17 00:00:00 2001 From: Joe Lu Date: Sat, 16 Feb 2019 16:11:16 -0800 Subject: [PATCH 04/13] - updated reporting interval and only handle attReport and ignore devChange on temperature and pressure --- converters/fromZigbee.js | 19 +------------------ devices.js | 15 ++++++++------- 2 files changed, 9 insertions(+), 25 deletions(-) diff --git a/converters/fromZigbee.js b/converters/fromZigbee.js index fa6a6a9e9188e..e9e1b3a9adc8b 100644 --- a/converters/fromZigbee.js +++ b/converters/fromZigbee.js @@ -1673,28 +1673,11 @@ const converters = { return {action: `${direction}`}; }, }, - keen_home_smart_vent_temperature_dev_change: { - cid: 'msTemperatureMeasurement', - type: 'devChange', - convert: (model, msg, publish, options) => { - // '{"cid":"msTemperatureMeasurement","data":{"measuredValue":2498}}' - const temperature = parseFloat(msg.data.data['measuredValue']) / 100.0; - return {temperature: precisionRoundOptions(temperature, options, 'temperature')}; - }, - }, - keen_home_smart_vent_pressure_dev_change: { - cid: 'msPressureMeasurement', - type: 'devChange', - convert: (model, msg, publish, options) => { - // '{"cid":"msPressureMeasurement","data":{"32":990494}}' - const pressure = parseFloat(msg.data.data['32']) / 1000.0; - return {pressure: precisionRoundOptions(pressure, options, 'pressure')}; - }, - }, keen_home_smart_vent_pressure_attr_report: { cid: 'msPressureMeasurement', type: 'attReport', convert: (model, msg, publish, options) => { + // '{"cid":"msPressureMeasurement","data":{"32":990494}}' const pressure = parseFloat(msg.data.data['32']) / 1000.0; return {pressure: precisionRoundOptions(pressure, options, 'pressure')}; }, diff --git a/devices.js b/devices.js index 4e1e0402282b3..ec6209f325517 100644 --- a/devices.js +++ b/devices.js @@ -2542,9 +2542,9 @@ const devices = [ fz.brightness_report, fz.generic_temperature, fz.generic_battery, - fz.keen_home_smart_vent_pressure_dev_change, - fz.keen_home_smart_vent_temperature_dev_change, fz.keen_home_smart_vent_pressure_attr_report, + fz.ignore_temperature_change, + fz.ignore_pressure_change, ], toZigbee: [ tz.on_off, @@ -2560,11 +2560,12 @@ const devices = [ (cb) => device.bind('msPressureMeasurement', coordinator, cb), (cb) => device.bind('msTemperatureMeasurement', coordinator, cb), - (cb) => device.report('genOnOff', 'onOff', 0, 600, 0, cb), - (cb) => device.report('genLevelCtrl', 'currentLevel', 0, 600, 0, cb), - (cb) => device.report('genPowerCfg', 'batteryPercentageRemaining', 0, 1000, 0, cb), - (cb) => device.report('msTemperatureMeasurement', 'measuredValue', 30, 600, 1, cb), - (cb) => device.report('msPressureMeasurement', 'measuredValue', 30, 600, 1, cb), + (cb) => device.report('genOnOff', 'onOff', 0, repInterval.MAX, 0, cb), + (cb) => device.report('genLevelCtrl', 'currentLevel', 0, repInterval.MAX, 0, cb), + (cb) => device.report('genPowerCfg', 'batteryPercentageRemaining', 0, repInterval.MAX, 0, cb), + (cb) => device.report('msTemperatureMeasurement', 'measuredValue', 60, repInterval.MAX, 10, cb), + (cb) => device.report('msPressureMeasurement', 'measuredValue', 600, repInterval.MAX, 1, cb), + (cb) => device.report('msPressureMeasurement', '32', 600, repInterval.MAX, 100, cb), ]; execute(device, actions, callback); From bed25be89d24935d693c6ad563e2b643d7e0c089 Mon Sep 17 00:00:00 2001 From: Joe Lu Date: Sat, 16 Feb 2019 16:49:02 -0800 Subject: [PATCH 05/13] - added cover_position handler --- converters/toZigbee.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/converters/toZigbee.js b/converters/toZigbee.js index bffd192ee50b0..38436b121a68c 100644 --- a/converters/toZigbee.js +++ b/converters/toZigbee.js @@ -1170,6 +1170,35 @@ const converters = { return converters.light_colortemp.convert(key, value, message, type, postfix); }, }, + cover_position: { + key: ['position'], + convert: (key, value, message, type, postfix) => { + const cid = 'genLevelCtrl'; + const attrId = 'currentLevel'; + + if (type === 'set') { + value = Math.round(Number(value) * 2.55).toString(); + return { + cid: cid, + cmd: 'moveToLevelWithOnOff', + cmdType: 'functional', + zclData: { + level: value, + }, + cfg: cfg.default, + readAfterWriteTime: 0, + }; + } else if (type === 'get') { + return { + cid: cid, + cmd: 'read', + cmdType: 'foundation', + zclData: [{attrId: zclId.attr(cid, attrId).value}], + cfg: cfg.default, + }; + } + }, + }, // Ignore converters ignore_transition: { From c8bd43ebf6a3bd37eedada2c6d3cdb652e0d022c Mon Sep 17 00:00:00 2001 From: Joe Lu Date: Sat, 16 Feb 2019 16:49:53 -0800 Subject: [PATCH 06/13] - added cover_position to keen home toZigbee --- devices.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devices.js b/devices.js index 848c43d01c57c..fca8f4bbb0857 100644 --- a/devices.js +++ b/devices.js @@ -2548,7 +2548,7 @@ const devices = [ ], toZigbee: [ tz.on_off, - tz.light_brightness, + tz.cover_position, tz.ignore_transition, ], configure: (ieeeAddr, shepherd, coordinator, callback) => { From d7846a6349de284674d957cd8ba528e4589fc4bf Mon Sep 17 00:00:00 2001 From: Joe Lu Date: Sun, 17 Feb 2019 22:54:06 -0800 Subject: [PATCH 07/13] - added transtime to cover_position.set - changed key to state for cover_position --- converters/toZigbee.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/converters/toZigbee.js b/converters/toZigbee.js index 38436b121a68c..d95357e90174c 100644 --- a/converters/toZigbee.js +++ b/converters/toZigbee.js @@ -1171,7 +1171,7 @@ const converters = { }, }, cover_position: { - key: ['position'], + key: ['state'], convert: (key, value, message, type, postfix) => { const cid = 'genLevelCtrl'; const attrId = 'currentLevel'; @@ -1184,6 +1184,7 @@ const converters = { cmdType: 'functional', zclData: { level: value, + transtime: 0, }, cfg: cfg.default, readAfterWriteTime: 0, From 10ac10d598a12b1b5df6a04496f87c151398c73f Mon Sep 17 00:00:00 2001 From: Koen Kanters Date: Mon, 18 Feb 2019 18:48:07 +0100 Subject: [PATCH 08/13] Update toZigbee.js --- converters/toZigbee.js | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/converters/toZigbee.js b/converters/toZigbee.js index 38436b121a68c..dcd76460fbd44 100644 --- a/converters/toZigbee.js +++ b/converters/toZigbee.js @@ -1170,6 +1170,40 @@ const converters = { return converters.light_colortemp.convert(key, value, message, type, postfix); }, }, + cover_open_close: { + key: ['state'], + convert: (key, value, message, type, postfix) => { + const cid = 'genOnOff'; + const attrId = 'onOff'; + + if (type === 'set') { + const lookup = { + 'open': 'on', + 'close': 'off', + }; + + if (typeof value !== 'string' || !lookup[value]) { + return; + } + + return { + cid: cid, + cmd: lookup[value.toLowerCase()], + cmdType: 'functional', + zclData: {}, + cfg: cfg.default, + }; + } else if (type === 'get') { + return { + cid: cid, + cmd: 'read', + cmdType: 'foundation', + zclData: [{attrId: zclId.attr(cid, attrId).value}], + cfg: cfg.default, + }; + } + }, + }, cover_position: { key: ['position'], convert: (key, value, message, type, postfix) => { From d3a1f86c65c6708de7107b11b69ba7686d96d621 Mon Sep 17 00:00:00 2001 From: Koen Kanters Date: Mon, 18 Feb 2019 18:49:34 +0100 Subject: [PATCH 09/13] Update devices.js --- devices.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/devices.js b/devices.js index fca8f4bbb0857..4f5495f15b75d 100644 --- a/devices.js +++ b/devices.js @@ -2536,9 +2536,9 @@ const devices = [ description: 'Smart vent', supports: 'open, close, position, temperature, pressure, battery', fromZigbee: [ - fz.brightness, - fz.state_change, - fz.state, + fz.brightness, // TODO refactor to position + fz.state_change, // TODO refactor to open/close + fz.state, // TODO refactor to open/close fz.brightness_report, fz.generic_temperature, fz.generic_battery, @@ -2547,7 +2547,7 @@ const devices = [ fz.ignore_pressure_change, ], toZigbee: [ - tz.on_off, + tz.cover_open_close, tz.cover_position, tz.ignore_transition, ], From a50867dfb44c6eabc8fce2553009a3380a820d29 Mon Sep 17 00:00:00 2001 From: Joe Lu Date: Tue, 19 Feb 2019 17:38:53 -0800 Subject: [PATCH 10/13] - added cover_state and cover_position fromZigbee handler - made changes to cover_open_close toZigbee handler so it'd work correctly --- converters/fromZigbee.js | 36 ++++++++++++++++++++++++++++++++++++ converters/toZigbee.js | 11 ++++++++--- devices.js | 8 ++++---- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/converters/fromZigbee.js b/converters/fromZigbee.js index 7131d7d5cf01f..0a9ef8aeb40c0 100644 --- a/converters/fromZigbee.js +++ b/converters/fromZigbee.js @@ -1701,6 +1701,42 @@ const converters = { return {action: `${direction}`}; }, }, + generic_cover_state: { + cid: 'genOnOff', + type: 'devChange', + convert: (model, msg, publish, options) => { + return {state: msg.data.data['onOff'] === 1 ? 'OPEN' : 'CLOSE'}; + }, + }, + generic_cover_state_report: { + cid: 'genOnOff', + type: 'attReport', + convert: (model, msg, publish, options) => { + return {state: msg.data.data['onOff'] === 1 ? 'OPEN' : 'CLOSE'}; + }, + }, + generic_cover_position: { + cid: 'genLevelCtrl', + type: 'devChange', + convert: (model, msg, publish, options) => { + let position = msg.data.data['currentLevel']; + if (position) { + position = Math.round(Number(position) / 2.55).toString(); + } + return {position: position}; + }, + }, + generic_cover_position_report: { + cid: 'genLevelCtrl', + type: 'attReport', + convert: (model, msg, publish, options) => { + let position = msg.data.data['currentLevel']; + if (position) { + position = Math.round(Number(position) / 2.55).toString(); + } + return {position: position}; + }, + }, keen_home_smart_vent_pressure_attr_report: { cid: 'msPressureMeasurement', type: 'attReport', diff --git a/converters/toZigbee.js b/converters/toZigbee.js index 9ba10dca807ca..b4609ffb3ef2f 100644 --- a/converters/toZigbee.js +++ b/converters/toZigbee.js @@ -1228,13 +1228,18 @@ const converters = { 'close': 'off', }; - if (typeof value !== 'string' || !lookup[value]) { + if (typeof value !== 'string') { + return; + } + + const cmdValue = lookup[value.toLowerCase()]; + if (!cmdValue) { return; } return { cid: cid, - cmd: lookup[value.toLowerCase()], + cmd: cmdValue, cmdType: 'functional', zclData: {}, cfg: cfg.default, @@ -1251,7 +1256,7 @@ const converters = { }, }, cover_position: { - key: ['state'], + key: ['position'], convert: (key, value, message, type, postfix) => { const cid = 'genLevelCtrl'; const attrId = 'currentLevel'; diff --git a/devices.js b/devices.js index 170dcfa465939..5154a0f0587f9 100644 --- a/devices.js +++ b/devices.js @@ -2567,10 +2567,10 @@ const devices = [ description: 'Smart vent', supports: 'open, close, position, temperature, pressure, battery', fromZigbee: [ - fz.brightness, // TODO refactor to position - fz.state_change, // TODO refactor to open/close - fz.state, // TODO refactor to open/close - fz.brightness_report, + fz.generic_cover_position, + fz.generic_cover_position_report, + fz.generic_cover_state, + fz.generic_cover_state_report, fz.generic_temperature, fz.generic_battery, fz.keen_home_smart_vent_pressure_attr_report, From 16d1c5dc48db3a8095f7e7564c60231c7348a5ff Mon Sep 17 00:00:00 2001 From: Joe Lu Date: Thu, 21 Feb 2019 20:48:07 -0800 Subject: [PATCH 11/13] - added devChange fromZigbee handler for keen home pressure, temperature and battery - updated cover_position and cover_position_report fromZigbee handler to return both position and state (state is determined by position now) - updated cover_open_close to only change currentLevel - adjusted attReport interval for kee home vent --- converters/fromZigbee.js | 60 +++++++++++++++++++++++----------------- converters/toZigbee.js | 34 +++++------------------ devices.js | 33 +++++++++++----------- 3 files changed, 59 insertions(+), 68 deletions(-) diff --git a/converters/fromZigbee.js b/converters/fromZigbee.js index 23b3cb8df3db9..cc28846048ad9 100644 --- a/converters/fromZigbee.js +++ b/converters/fromZigbee.js @@ -373,6 +373,14 @@ const converters = { return {temperature: precisionRoundOptions(temperature, options, 'temperature')}; }, }, + generic_temperature_change: { + cid: 'msTemperatureMeasurement', + type: 'devChange', + convert: (model, msg, publish, options) => { + const temperature = parseFloat(msg.data.data['measuredValue']) / 100.0; + return {temperature: precisionRoundOptions(temperature, options, 'temperature')}; + }, + }, xiaomi_temperature: { cid: 'msTemperatureMeasurement', type: 'attReport', @@ -1267,6 +1275,15 @@ const converters = { } }, }, + generic_battery_change: { + cid: 'genPowerCfg', + type: 'devChange', + convert: (model, msg, publish, options) => { + if (msg.data.data.hasOwnProperty('batteryPercentageRemaining')) { + return {battery: msg.data.data['batteryPercentageRemaining']}; + } + }, + }, hue_battery: { cid: 'genPowerCfg', type: 'attReport', @@ -1735,43 +1752,36 @@ const converters = { return {action: `${direction}`}; }, }, - generic_cover_state: { - cid: 'genOnOff', + cover_position: { + cid: 'genLevelCtrl', type: 'devChange', convert: (model, msg, publish, options) => { - return {state: msg.data.data['onOff'] === 1 ? 'OPEN' : 'CLOSE'}; + const currentLevel = msg.data.data['currentLevel']; + let position = Math.round(Number(currentLevel) / 2.55).toString(); + let state = position > 0 ? 'OPEN' : 'CLOSE'; + return {state: state, position: position}; }, }, - generic_cover_state_report: { - cid: 'genOnOff', + cover_position_report: { + cid: 'genLevelCtrl', type: 'attReport', convert: (model, msg, publish, options) => { - return {state: msg.data.data['onOff'] === 1 ? 'OPEN' : 'CLOSE'}; + const currentLevel = msg.data.data['currentLevel']; + let position = Math.round(Number(currentLevel) / 2.55).toString(); + let state = position > 0 ? 'OPEN' : 'CLOSE'; + return {state: state, position: position}; }, }, - generic_cover_position: { - cid: 'genLevelCtrl', + keen_home_smart_vent_pressure: { + cid: 'msPressureMeasurement', type: 'devChange', convert: (model, msg, publish, options) => { - let position = msg.data.data['currentLevel']; - if (position) { - position = Math.round(Number(position) / 2.55).toString(); - } - return {position: position}; - }, - }, - generic_cover_position_report: { - cid: 'genLevelCtrl', - type: 'attReport', - convert: (model, msg, publish, options) => { - let position = msg.data.data['currentLevel']; - if (position) { - position = Math.round(Number(position) / 2.55).toString(); - } - return {position: position}; + // '{"cid":"msPressureMeasurement","data":{"32":990494}}' + const pressure = parseFloat(msg.data.data['32']) / 1000.0; + return {pressure: precisionRoundOptions(pressure, options, 'pressure')}; }, }, - keen_home_smart_vent_pressure_attr_report: { + keen_home_smart_vent_pressure_report: { cid: 'msPressureMeasurement', type: 'attReport', convert: (model, msg, publish, options) => { diff --git a/converters/toZigbee.js b/converters/toZigbee.js index b4609ffb3ef2f..47da3d1690eb1 100644 --- a/converters/toZigbee.js +++ b/converters/toZigbee.js @@ -1219,40 +1219,20 @@ const converters = { cover_open_close: { key: ['state'], convert: (key, value, message, type, postfix) => { - const cid = 'genOnOff'; - const attrId = 'onOff'; - if (type === 'set') { - const lookup = { - 'open': 'on', - 'close': 'off', - }; - if (typeof value !== 'string') { return; } - const cmdValue = lookup[value.toLowerCase()]; - if (!cmdValue) { - return; - } - - return { - cid: cid, - cmd: cmdValue, - cmdType: 'functional', - zclData: {}, - cfg: cfg.default, - }; - } else if (type === 'get') { - return { - cid: cid, - cmd: 'read', - cmdType: 'foundation', - zclData: [{attrId: zclId.attr(cid, attrId).value}], - cfg: cfg.default, + const positionByState = { + 'open': 100, + 'close': 0, }; + + value = positionByState[value.toLowerCase()] } + + return converters.cover_position.convert(key, value, message, type, postfix); }, }, cover_position: { diff --git a/devices.js b/devices.js index 99ac56d5db647..a717d01d8efa5 100644 --- a/devices.js +++ b/devices.js @@ -2587,36 +2587,37 @@ const devices = [ description: 'Smart vent', supports: 'open, close, position, temperature, pressure, battery', fromZigbee: [ - fz.generic_cover_position, - fz.generic_cover_position_report, - fz.generic_cover_state, - fz.generic_cover_state_report, + fz.cover_position, + fz.cover_position_report, fz.generic_temperature, + fz.generic_temperature_change, fz.generic_battery, - fz.keen_home_smart_vent_pressure_attr_report, - fz.ignore_temperature_change, - fz.ignore_pressure_change, + fz.generic_battery_change, + fz.keen_home_smart_vent_pressure, + fz.keen_home_smart_vent_pressure_report, + fz.ignore_onoff_change, + fz.ignore_onoff_report, ], toZigbee: [ tz.cover_open_close, tz.cover_position, - tz.ignore_transition, ], configure: (ieeeAddr, shepherd, coordinator, callback) => { const device = shepherd.find(ieeeAddr, 1); + const cfg = {direction: 0, attrId: 32, dataType: 43, minRepIntval: 600, maxRepIntval: repInterval.MAX, repChange: 100}; const actions = [ - (cb) => device.bind('genOnOff', coordinator, cb), (cb) => device.bind('genLevelCtrl', coordinator, cb), (cb) => device.bind('genPowerCfg', coordinator, cb), - (cb) => device.bind('msPressureMeasurement', coordinator, cb), (cb) => device.bind('msTemperatureMeasurement', coordinator, cb), + (cb) => device.bind('msPressureMeasurement', coordinator, cb), - (cb) => device.report('genOnOff', 'onOff', 0, repInterval.MAX, 0, cb), - (cb) => device.report('genLevelCtrl', 'currentLevel', 0, repInterval.MAX, 0, cb), - (cb) => device.report('genPowerCfg', 'batteryPercentageRemaining', 0, repInterval.MAX, 0, cb), - (cb) => device.report('msTemperatureMeasurement', 'measuredValue', 60, repInterval.MAX, 10, cb), - (cb) => device.report('msPressureMeasurement', 'measuredValue', 600, repInterval.MAX, 1, cb), - (cb) => device.report('msPressureMeasurement', '32', 600, repInterval.MAX, 100, cb), + (cb) => device.report('msTemperatureMeasurement', 'measuredValue', 300, repInterval.MAX, 10, cb), + (cb) => device.report('msPressureMeasurement', 'measuredValue', 600, repInterval.MAX, 100, cb), + (cb) => device.foundation('msPressureMeasurement', 'configReport', [cfg], foundationCfg, cb), + + (cb) => device.read('genPowerCfg', 'batteryPercentageRemaining', cb), + (cb) => device.read('genLevelCtrl', 'currentLevel', cb), + (cb) => device.read('msTemperatureMeasurement', 'measuredValue', cb), ]; execute(device, actions, callback); From 024698114061fe029acaa0c60d2e442c7c2aa83e Mon Sep 17 00:00:00 2001 From: Joe Lu Date: Sat, 23 Feb 2019 06:25:02 -0800 Subject: [PATCH 12/13] - removed reporting config --- devices.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/devices.js b/devices.js index a717d01d8efa5..e4c33639e466f 100644 --- a/devices.js +++ b/devices.js @@ -2610,14 +2610,6 @@ const devices = [ (cb) => device.bind('genPowerCfg', coordinator, cb), (cb) => device.bind('msTemperatureMeasurement', coordinator, cb), (cb) => device.bind('msPressureMeasurement', coordinator, cb), - - (cb) => device.report('msTemperatureMeasurement', 'measuredValue', 300, repInterval.MAX, 10, cb), - (cb) => device.report('msPressureMeasurement', 'measuredValue', 600, repInterval.MAX, 100, cb), - (cb) => device.foundation('msPressureMeasurement', 'configReport', [cfg], foundationCfg, cb), - - (cb) => device.read('genPowerCfg', 'batteryPercentageRemaining', cb), - (cb) => device.read('genLevelCtrl', 'currentLevel', cb), - (cb) => device.read('msTemperatureMeasurement', 'measuredValue', cb), ]; execute(device, actions, callback); From daab3dd8077054e8170b83cbb01307d0e9b7a7d4 Mon Sep 17 00:00:00 2001 From: Joe Lu Date: Sat, 23 Feb 2019 06:36:36 -0800 Subject: [PATCH 13/13] - fixed lint errors --- converters/fromZigbee.js | 8 ++++---- converters/toZigbee.js | 2 +- devices.js | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/converters/fromZigbee.js b/converters/fromZigbee.js index cc28846048ad9..cad32dfecfb4f 100644 --- a/converters/fromZigbee.js +++ b/converters/fromZigbee.js @@ -1757,8 +1757,8 @@ const converters = { type: 'devChange', convert: (model, msg, publish, options) => { const currentLevel = msg.data.data['currentLevel']; - let position = Math.round(Number(currentLevel) / 2.55).toString(); - let state = position > 0 ? 'OPEN' : 'CLOSE'; + const position = Math.round(Number(currentLevel) / 2.55).toString(); + const state = position > 0 ? 'OPEN' : 'CLOSE'; return {state: state, position: position}; }, }, @@ -1767,8 +1767,8 @@ const converters = { type: 'attReport', convert: (model, msg, publish, options) => { const currentLevel = msg.data.data['currentLevel']; - let position = Math.round(Number(currentLevel) / 2.55).toString(); - let state = position > 0 ? 'OPEN' : 'CLOSE'; + const position = Math.round(Number(currentLevel) / 2.55).toString(); + const state = position > 0 ? 'OPEN' : 'CLOSE'; return {state: state, position: position}; }, }, diff --git a/converters/toZigbee.js b/converters/toZigbee.js index 47da3d1690eb1..fbbf496fbde0d 100644 --- a/converters/toZigbee.js +++ b/converters/toZigbee.js @@ -1229,7 +1229,7 @@ const converters = { 'close': 0, }; - value = positionByState[value.toLowerCase()] + value = positionByState[value.toLowerCase()]; } return converters.cover_position.convert(key, value, message, type, postfix); diff --git a/devices.js b/devices.js index e4c33639e466f..ffb6992e025c9 100644 --- a/devices.js +++ b/devices.js @@ -2604,7 +2604,6 @@ const devices = [ ], configure: (ieeeAddr, shepherd, coordinator, callback) => { const device = shepherd.find(ieeeAddr, 1); - const cfg = {direction: 0, attrId: 32, dataType: 43, minRepIntval: 600, maxRepIntval: repInterval.MAX, repChange: 100}; const actions = [ (cb) => device.bind('genLevelCtrl', coordinator, cb), (cb) => device.bind('genPowerCfg', coordinator, cb),