From 3604fe1ede44f1eeafc5025a3309c971f3d8ec75 Mon Sep 17 00:00:00 2001 From: Daniel Schall Date: Tue, 8 Dec 2020 09:53:45 -0800 Subject: [PATCH] Add support for Tuya --- .../internal/converter/TuyaToggleCommand.java | 74 +++++++++++++++++++ .../converter/ZigBeeConverterSwitchOnoff.java | 18 ++++- .../config/ZclOnOffSwitchConfig.java | 1 + 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/TuyaToggleCommand.java diff --git a/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/TuyaToggleCommand.java b/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/TuyaToggleCommand.java new file mode 100644 index 0000000..e3e0506 --- /dev/null +++ b/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/TuyaToggleCommand.java @@ -0,0 +1,74 @@ +package org.openhab.binding.zigbee.internal.converter; + +import com.zsmartsystems.zigbee.zcl.ZclFieldDeserializer; +import com.zsmartsystems.zigbee.zcl.ZclFieldSerializer; +import com.zsmartsystems.zigbee.zcl.clusters.onoff.ZclOnOffCommand; +import com.zsmartsystems.zigbee.zcl.protocol.ZclCommandDirection; +import com.zsmartsystems.zigbee.zcl.protocol.ZclDataType; + +public class TuyaToggleCommand extends ZclOnOffCommand +{ + /** + * The cluster ID to which this command belongs. + */ + public static int CLUSTER_ID = 0x0006; + + /** + * The command ID. + */ + public static int COMMAND_ID = 0xFD; + + /** + * Default constructor. + * + */ + public TuyaToggleCommand() + { + clusterId = CLUSTER_ID; + commandId = COMMAND_ID; + genericCommand = false; + commandDirection = ZclCommandDirection.CLIENT_TO_SERVER; + } + + public TuyaToggleCommand( + Integer pressType) + { + this(); + this.pressType = pressType; + } + + /** + * Type of button press. + *

+ * 0 = short press + * 1 = long press + * 2 = double press + */ + private Integer pressType; + + public Integer getPressType() + { + return pressType; + } + + @Override + public void serialize(ZclFieldSerializer serializer) { + serializer.serialize(pressType, ZclDataType.UNSIGNED_8_BIT_INTEGER); + } + + @Override + public void deserialize(final ZclFieldDeserializer deserializer) { + pressType = (Integer) deserializer.deserialize(ZclDataType.UNSIGNED_8_BIT_INTEGER); + } + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(113); + builder.append("TuyaToggleCommand ["); + builder.append(super.toString()); + builder.append(", pressType="); + builder.append(pressType); + builder.append(']'); + return builder.toString(); + } +} diff --git a/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/ZigBeeConverterSwitchOnoff.java b/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/ZigBeeConverterSwitchOnoff.java index 6c9b3c9..47573cc 100644 --- a/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/ZigBeeConverterSwitchOnoff.java +++ b/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/ZigBeeConverterSwitchOnoff.java @@ -14,6 +14,7 @@ package org.openhab.binding.zigbee.internal.converter; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutionException; @@ -118,6 +119,10 @@ public class ZigBeeConverterSwitchOnoff extends ZigBeeBaseChannelConverter } if (clientCluster != null) { + Map> commands = new HashMap>(); + commands.put(0xFD, TuyaToggleCommand.class); + clientCluster.addClientCommands(commands); + try { CommandResult bindResponse = bind(clientCluster).get(); if (!bindResponse.isSuccess()) { @@ -156,6 +161,10 @@ public class ZigBeeConverterSwitchOnoff extends ZigBeeBaseChannelConverter } if (clusterOnOffClient != null) { + Map> commands = new HashMap>(); + commands.put(0xFD, TuyaToggleCommand.class); + clusterOnOffClient.addClientCommands(commands); + // Add the command listener clusterOnOffClient.addCommandListener(this); } @@ -164,7 +173,7 @@ public class ZigBeeConverterSwitchOnoff extends ZigBeeBaseChannelConverter // Add the listener clusterOnOffServer.addAttributeListener(this); attributeServer = clusterOnOffServer.getAttribute(ZclOnOffCluster.ATTR_ONOFF); - } + } return true; } @@ -251,6 +260,7 @@ public class ZigBeeConverterSwitchOnoff extends ZigBeeBaseChannelConverter if (clusterOnOffServer == null) { return; } + if (configReporting.updateConfiguration(currentConfiguration, updatedParameters)) { try { ZclAttribute attribute; @@ -306,6 +316,12 @@ public class ZigBeeConverterSwitchOnoff extends ZigBeeBaseChannelConverter clusterOnOffClient.sendDefaultResponse(command, ZclStatus.SUCCESS); return true; } + if (command instanceof TuyaToggleCommand) { + currentOnOffState.set(!currentOnOffState.get()); + updateChannelState(currentOnOffState.get() ? OnOffType.ON : OnOffType.OFF); + clusterOnOffClient.sendDefaultResponse(command, ZclStatus.SUCCESS); + return true; + } if (command instanceof ToggleCommand) { currentOnOffState.set(!currentOnOffState.get()); updateChannelState(currentOnOffState.get() ? OnOffType.ON : OnOffType.OFF); diff --git a/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/config/ZclOnOffSwitchConfig.java b/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/config/ZclOnOffSwitchConfig.java index b530bbf..3b4268d 100755 --- a/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/config/ZclOnOffSwitchConfig.java +++ b/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/config/ZclOnOffSwitchConfig.java @@ -55,6 +55,7 @@ public class ZclOnOffSwitchConfig implements ZclClusterConfigHandler { @Override public boolean initialize(ZclCluster cluster) { onoffCluster = (ZclOnOffCluster) cluster; + try { Boolean result = onoffCluster.discoverAttributes(false).get(); if (!result) { -- 2.28.0.windows.1