From 9a1a5a9f936df0ff264ddec6f21cb60439bbadf7 Mon Sep 17 00:00:00 2001 From: Hugo Vacher Date: Mon, 27 Jan 2025 10:22:39 -0500 Subject: [PATCH 1/2] Invert direction for Smartwings shades Inspired by ZHA's approach, and feedback form SmartWings support, I confirmed that this converter works and am now proposing that we merge it to the main codebase. For shades to work well, you still need to invert their Zigbee state (press Up & Down together for 5s, then Press the P button under the battery cover once). --- src/devices/smartwings.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/devices/smartwings.ts b/src/devices/smartwings.ts index c4c01f81bb839..1e23b2d86b719 100644 --- a/src/devices/smartwings.ts +++ b/src/devices/smartwings.ts @@ -2,7 +2,18 @@ import fz from '../converters/fromZigbee'; import tz from '../converters/toZigbee'; import * as exposes from '../lib/exposes'; import * as reporting from '../lib/reporting'; -import {DefinitionWithExtend} from '../lib/types'; +import {DefinitionWithExtend, Tz, Zh} from '../lib/types'; +import {assertString, getFromLookup, getOptions} from '../lib/utils'; + +const backwards_cover_state = { + key: ['state'], + convertSet: async (entity: Zh.Endpoint, key: string, value: number | string, meta: Tz.Meta) => { + const lookup = {open: 'downClose', close: 'upOpen', stop: 'stop', on: 'downClose', off: 'upOpen'}; + assertString(value, key); + value = value.toLowerCase(); + await entity.command('closuresWindowCovering', getFromLookup(value, lookup), {}, getOptions(meta.mapped, entity)); + }, +}; const e = exposes.presets; @@ -13,7 +24,7 @@ const definitions: DefinitionWithExtend[] = [ vendor: 'Smartwings', description: 'Roller shade', fromZigbee: [fz.cover_position_tilt, fz.battery], - toZigbee: [tz.cover_state, tz.cover_position_tilt], + toZigbee: [backwards_cover_state, tz.cover_position_tilt], meta: {battery: {dontDividePercentage: true}, coverInverted: true}, configure: async (device, coordinatorEndpoint) => { const endpoint = device.getEndpoint(1); From 0b29ab3d917b597f1f24d9fb4d861b09d20bd02f Mon Sep 17 00:00:00 2001 From: Koen Kanters Date: Mon, 27 Jan 2025 19:58:22 +0100 Subject: [PATCH 2/2] u --- src/devices/smartwings.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/devices/smartwings.ts b/src/devices/smartwings.ts index 1e23b2d86b719..67d3b2b799b5e 100644 --- a/src/devices/smartwings.ts +++ b/src/devices/smartwings.ts @@ -5,13 +5,15 @@ import * as reporting from '../lib/reporting'; import {DefinitionWithExtend, Tz, Zh} from '../lib/types'; import {assertString, getFromLookup, getOptions} from '../lib/utils'; -const backwards_cover_state = { - key: ['state'], - convertSet: async (entity: Zh.Endpoint, key: string, value: number | string, meta: Tz.Meta) => { - const lookup = {open: 'downClose', close: 'upOpen', stop: 'stop', on: 'downClose', off: 'upOpen'}; - assertString(value, key); - value = value.toLowerCase(); - await entity.command('closuresWindowCovering', getFromLookup(value, lookup), {}, getOptions(meta.mapped, entity)); +const tzLocal = { + backwards_cover_state: { + key: ['state'], + convertSet: async (entity: Zh.Endpoint, key: string, value: number | string, meta: Tz.Meta) => { + const lookup = {open: 'downClose', close: 'upOpen', stop: 'stop', on: 'downClose', off: 'upOpen'}; + assertString(value, key); + value = value.toLowerCase(); + await entity.command('closuresWindowCovering', getFromLookup(value, lookup), {}, getOptions(meta.mapped, entity)); + }, }, }; @@ -24,7 +26,7 @@ const definitions: DefinitionWithExtend[] = [ vendor: 'Smartwings', description: 'Roller shade', fromZigbee: [fz.cover_position_tilt, fz.battery], - toZigbee: [backwards_cover_state, tz.cover_position_tilt], + toZigbee: [tzLocal.backwards_cover_state, tz.cover_position_tilt], meta: {battery: {dontDividePercentage: true}, coverInverted: true}, configure: async (device, coordinatorEndpoint) => { const endpoint = device.getEndpoint(1);