From 45dacb6b0b376da585af458affb82bcfa6b44d75 Mon Sep 17 00:00:00 2001 From: Koen Kanters Date: Sat, 27 Feb 2021 15:58:51 +0100 Subject: [PATCH] Fix not able to set state and brightness at the same time for gq8b1uv. https://github.com/Koenkk/zigbee2mqtt/issues/6366 --- converters/toZigbee.js | 6 ++++-- lib/tuya.js | 38 ++++++++++++++++++++++++-------------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/converters/toZigbee.js b/converters/toZigbee.js index b624fd954a036..9708d22eb39e8 100644 --- a/converters/toZigbee.js +++ b/converters/toZigbee.js @@ -2168,7 +2168,8 @@ const converters = { tuya_dimmer_state: { key: ['state'], convertSet: async (entity, key, value, meta) => { - await tuya.sendDataPointBool(entity, tuya.dataPoints.state, value === 'ON'); + // Always use same transid as tuya_dimmer_level (https://github.com/Koenkk/zigbee2mqtt/issues/6366) + await tuya.sendDataPointBool(entity, tuya.dataPoints.state, value === 'ON', 'setData', 1); }, }, tuya_dimmer_level: { @@ -2206,7 +2207,8 @@ const converters = { throw new Error('Dimmer brightness is out of range 0..255'); } } - await tuya.sendDataPointValue(entity, dp, newValue); + // Always use same transid as tuya_dimmer_state (https://github.com/Koenkk/zigbee2mqtt/issues/6366) + await tuya.sendDataPointValue(entity, dp, newValue, 'setData', 1); }, }, tuya_switch_state: { diff --git a/lib/tuya.js b/lib/tuya.js index 433e26204e9af..61ee274ce4d31 100644 --- a/lib/tuya.js +++ b/lib/tuya.js @@ -386,19 +386,24 @@ const fanModes = { 3: 'auto', }; -async function sendDataPoint(entity, datatype, dp, data, cmd) { - if (sendDataPoint.transId === undefined) { - sendDataPoint.transId = 0; - } else { - sendDataPoint.transId++; - sendDataPoint.transId %= 256; +async function sendDataPoint(entity, datatype, dp, data, cmd, transid) { + if (transid === undefined) { + if (sendDataPoint.transId === undefined) { + sendDataPoint.transId = 0; + } else { + sendDataPoint.transId++; + sendDataPoint.transId %= 256; + } + + transid = sendDataPoint.transId; } + await entity.command( 'manuSpecificTuya', cmd || 'setData', { status: 0, - transid: sendDataPoint.transId, + transid, dp: dp, datatype: datatype, length_hi: (data.length >> 8) & 0xFF, @@ -409,54 +414,59 @@ async function sendDataPoint(entity, datatype, dp, data, cmd) { ); } -async function sendDataPointValue(entity, dp, value, cmd) { +async function sendDataPointValue(entity, dp, value, cmd, transid=undefined) { await sendDataPoint( entity, dataTypes.value, dp, convertDecimalValueTo4ByteHexArray(value), cmd, + transid, ); } -async function sendDataPointBool(entity, dp, value, cmd) { +async function sendDataPointBool(entity, dp, value, cmd, transid=undefined) { await sendDataPoint( entity, dataTypes.bool, dp, [value ? 1 : 0], cmd, + transid, ); } -async function sendDataPointEnum(entity, dp, value, cmd) { +async function sendDataPointEnum(entity, dp, value, cmd, transid=undefined) { await sendDataPoint( entity, dataTypes.enum, dp, [value], cmd, + transid, ); } -async function sendDataPointRaw(entity, dp, value, cmd) { +async function sendDataPointRaw(entity, dp, value, cmd, transid=undefined) { await sendDataPoint( entity, dataTypes.raw, dp, value, cmd, + transid, ); } -async function sendDataPointBitmap(entity, dp, value, cmd) { +async function sendDataPointBitmap(entity, dp, value, cmd, transid=undefined) { await sendDataPoint( entity, dataTypes.bitmap, dp, value, - cmd) - ; + cmd, + transid, + ); } module.exports = {