From 57452559581bfc0f3ccd940cc0b6273b5365151f Mon Sep 17 00:00:00 2001 From: Ghoz Date: Mon, 4 Dec 2023 21:17:46 +0100 Subject: [PATCH 1/4] Adds calibration offsets for tilt on DJT11LM sensor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit the DJT11LM seems to be very poorly calibrated, * provide raw accelerometer values : raw_x, raw_y and raw_z used for calibration after calibration can be removed from the payload by adding "raw_[xyz]" to "filtered_attributes" of the devices * allows a simple offset based calibration went from 15° to a few degrees off --- src/converters/fromZigbee.ts | 16 +++++++++++++--- src/devices/xiaomi.ts | 5 +++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/converters/fromZigbee.ts b/src/converters/fromZigbee.ts index 13867bc5f3dba..6e274d1cc1eaa 100644 --- a/src/converters/fromZigbee.ts +++ b/src/converters/fromZigbee.ts @@ -4911,10 +4911,20 @@ const converters1 = { // data[1][bit16..bit31]: y // data[0][bit0..bit15] : z // left shift first to preserve sign extension for 'x' - const x = ((data['1'] << 16) >> 16); - const y = (data['1'] >> 16); + let x = ((data['1'] << 16) >> 16); + let y = (data['1'] >> 16); // left shift first to preserve sign extension for 'z' - const z = ((data['0'] << 16) >> 16); + let z = ((data['0'] << 16) >> 16); + + // raw accelrometer values + result.raw_x=x; + result.raw_y=y; + result.raw_z=z; + + // simple offset calibration + x=calibrateAndPrecisionRoundOptions(x, options, 'raw_x'); + y=calibrateAndPrecisionRoundOptions(y, options, 'raw_y'); + z=calibrateAndPrecisionRoundOptions(z, options, 'raw_z'); // calculate angle result.angle_x = Math.round(Math.atan(x/Math.sqrt(y*y+z*z)) * 180 / Math.PI); diff --git a/src/devices/xiaomi.ts b/src/devices/xiaomi.ts index 5056ab46f087e..8b80ed5c14866 100644 --- a/src/devices/xiaomi.ts +++ b/src/devices/xiaomi.ts @@ -2424,6 +2424,11 @@ const definitions: Definition[] = [ vendor: 'Xiaomi', description: 'Aqara vibration sensor', meta: {battery: {voltageToPercentage: '3V_2850_3000'}}, + options: [ + exposes.options.calibration('raw_x'), + exposes.options.calibration('raw_y'), + exposes.options.calibration('raw_z'), + ], fromZigbee: [xiaomi.fromZigbee.xiaomi_basic, fz.DJT11LM_vibration], toZigbee: [tz.DJT11LM_vibration_sensitivity], exposes: [ From 5c63ccc6f8f3038d149b84833a6677fc810cde2c Mon Sep 17 00:00:00 2001 From: Ghoz Date: Tue, 5 Dec 2023 21:34:09 +0100 Subject: [PATCH 2/4] review fixes rename raw_x,y,z options to x,y,z moved options definition to the converter --- src/converters/fromZigbee.ts | 15 ++++++++++----- src/devices/xiaomi.ts | 5 ----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/converters/fromZigbee.ts b/src/converters/fromZigbee.ts index 6e274d1cc1eaa..f5ef00a894c43 100644 --- a/src/converters/fromZigbee.ts +++ b/src/converters/fromZigbee.ts @@ -4860,7 +4860,12 @@ const converters1 = { DJT11LM_vibration: { cluster: 'closuresDoorLock', type: ['attributeReport', 'readResponse'], - options: [exposes.options.vibration_timeout()], + options: [ + exposes.options.vibration_timeout(), + exposes.options.calibration('x'), + exposes.options.calibration('y'), + exposes.options.calibration('z'), + ], convert: (model, msg, publish, options, meta) => { const result: KeyValueAny = {}; @@ -4916,15 +4921,15 @@ const converters1 = { // left shift first to preserve sign extension for 'z' let z = ((data['0'] << 16) >> 16); - // raw accelrometer values + // raw accelerometer values result.raw_x=x; result.raw_y=y; result.raw_z=z; // simple offset calibration - x=calibrateAndPrecisionRoundOptions(x, options, 'raw_x'); - y=calibrateAndPrecisionRoundOptions(y, options, 'raw_y'); - z=calibrateAndPrecisionRoundOptions(z, options, 'raw_z'); + x=calibrateAndPrecisionRoundOptions(x, options, 'x'); + y=calibrateAndPrecisionRoundOptions(y, options, 'y'); + z=calibrateAndPrecisionRoundOptions(z, options, 'z'); // calculate angle result.angle_x = Math.round(Math.atan(x/Math.sqrt(y*y+z*z)) * 180 / Math.PI); diff --git a/src/devices/xiaomi.ts b/src/devices/xiaomi.ts index 8b80ed5c14866..5056ab46f087e 100644 --- a/src/devices/xiaomi.ts +++ b/src/devices/xiaomi.ts @@ -2424,11 +2424,6 @@ const definitions: Definition[] = [ vendor: 'Xiaomi', description: 'Aqara vibration sensor', meta: {battery: {voltageToPercentage: '3V_2850_3000'}}, - options: [ - exposes.options.calibration('raw_x'), - exposes.options.calibration('raw_y'), - exposes.options.calibration('raw_z'), - ], fromZigbee: [xiaomi.fromZigbee.xiaomi_basic, fz.DJT11LM_vibration], toZigbee: [tz.DJT11LM_vibration_sensitivity], exposes: [ From 3fa73ded8af082294c4cd1428d02ce022ba24211 Mon Sep 17 00:00:00 2001 From: Ghoz Date: Tue, 5 Dec 2023 21:48:21 +0100 Subject: [PATCH 3/4] follow other accelerometer based sensors rename raw_x, raw_y, raw_z to x_axis, y_axis, z_axis expose the *calibrated* accelerometer values --- src/converters/fromZigbee.ts | 10 +++++----- src/devices/xiaomi.ts | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/converters/fromZigbee.ts b/src/converters/fromZigbee.ts index f5ef00a894c43..f20ff3f060511 100644 --- a/src/converters/fromZigbee.ts +++ b/src/converters/fromZigbee.ts @@ -4921,16 +4921,16 @@ const converters1 = { // left shift first to preserve sign extension for 'z' let z = ((data['0'] << 16) >> 16); - // raw accelerometer values - result.raw_x=x; - result.raw_y=y; - result.raw_z=z; - // simple offset calibration x=calibrateAndPrecisionRoundOptions(x, options, 'x'); y=calibrateAndPrecisionRoundOptions(y, options, 'y'); z=calibrateAndPrecisionRoundOptions(z, options, 'z'); + // calibrated accelerometer values + result.x_axis=x; + result.y_axis=y; + result.z_axis=z; + // calculate angle result.angle_x = Math.round(Math.atan(x/Math.sqrt(y*y+z*z)) * 180 / Math.PI); result.angle_y = Math.round(Math.atan(y/Math.sqrt(x*x+z*z)) * 180 / Math.PI); diff --git a/src/devices/xiaomi.ts b/src/devices/xiaomi.ts index 5056ab46f087e..6fd57988cab35 100644 --- a/src/devices/xiaomi.ts +++ b/src/devices/xiaomi.ts @@ -2430,6 +2430,7 @@ const definitions: Definition[] = [ e.battery(), e.device_temperature(), e.vibration(), e.action(['vibration', 'tilt', 'drop']), e.numeric('strength', ea.STATE), e.enum('sensitivity', ea.STATE_SET, ['low', 'medium', 'high']), e.angle_axis('angle_x'), e.angle_axis('angle_y'), e.angle_axis('angle_z'), e.battery_voltage(), e.power_outage_count(false), + e.x_axis(), e.y_axis(), e.z_axis(), ], }, { From bbb573b3d524653f9806ac34a44357e0ee0c1bed Mon Sep 17 00:00:00 2001 From: Ghoz Date: Tue, 5 Dec 2023 22:38:08 +0100 Subject: [PATCH 4/4] reorder expose --- src/devices/xiaomi.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/devices/xiaomi.ts b/src/devices/xiaomi.ts index 6fd57988cab35..1c7632f94a545 100644 --- a/src/devices/xiaomi.ts +++ b/src/devices/xiaomi.ts @@ -2429,8 +2429,8 @@ const definitions: Definition[] = [ exposes: [ e.battery(), e.device_temperature(), e.vibration(), e.action(['vibration', 'tilt', 'drop']), e.numeric('strength', ea.STATE), e.enum('sensitivity', ea.STATE_SET, ['low', 'medium', 'high']), - e.angle_axis('angle_x'), e.angle_axis('angle_y'), e.angle_axis('angle_z'), e.battery_voltage(), e.power_outage_count(false), - e.x_axis(), e.y_axis(), e.z_axis(), + e.angle_axis('angle_x'), e.angle_axis('angle_y'), e.angle_axis('angle_z'), + e.x_axis(), e.y_axis(), e.z_axis(), e.battery_voltage(), e.power_outage_count(false), ], }, {