From 82f790511d5cff2205796d3e2532bdb30dd39fec Mon Sep 17 00:00:00 2001 From: Jonas Hohaus Date: Fri, 12 Nov 2021 01:05:14 +0100 Subject: [PATCH] [phc] Fix OH3 bug and add support for multible commands (#11554) * Remove advanced option in group-type Signed-off-by: Jonas Hohaus * Add support for multiple commands in one message Signed-off-by: Jonas Hohaus Signed-off-by: Michael Schmidt --- .../internal/handler/PHCBridgeHandler.java | 51 ++++++++++++++----- .../resources/OH-INF/thing/channel-types.xml | 2 +- 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/bundles/org.openhab.binding.phc/src/main/java/org/openhab/binding/phc/internal/handler/PHCBridgeHandler.java b/bundles/org.openhab.binding.phc/src/main/java/org/openhab/binding/phc/internal/handler/PHCBridgeHandler.java index d4c0ceb14ee68..d6b16f855964c 100644 --- a/bundles/org.openhab.binding.phc/src/main/java/org/openhab/binding/phc/internal/handler/PHCBridgeHandler.java +++ b/bundles/org.openhab.binding.phc/src/main/java/org/openhab/binding/phc/internal/handler/PHCBridgeHandler.java @@ -210,7 +210,9 @@ private void processReceivedBytes() { byte sizeToggle = buffer.get(); // read length of command and check if makes sense - if ((sizeToggle < 1 || sizeToggle > 3) && ((sizeToggle & 0xFF) < 0x81 || (sizeToggle & 0xFF) > 0x83)) { + int size = (sizeToggle & 0x7F); + + if (!isSizeToggleValid(sizeToggle, module)) { if (logger.isDebugEnabled()) { logger.debug("get invalid sizeToggle: {}", new String(HexUtils.byteToHex(sizeToggle))); } @@ -220,7 +222,6 @@ private void processReceivedBytes() { } // read toggle, size and command - int size = (sizeToggle & 0x7F); boolean toggle = (sizeToggle & 0x80) == 0x80; logger.debug("get toggle: {}", toggle); @@ -270,6 +271,24 @@ private void processReceivedBytes() { } } + private boolean isSizeToggleValid(byte sizeToggle, byte module) { + int unsigned = sizeToggle & 0xFF; + + if (unsigned > 0 && unsigned < 4) { + return true; + } else if (unsigned > 0x80 && unsigned < 0x84) { + return true; + } else if ((module & 0xE0) == 0x00) { + if (unsigned > 0 && unsigned < 16) { + return true; + } else if (unsigned > 0x80 && unsigned < 0x90) { + return true; + } + } + + return false; + } + private int handleCrcFault(int faultCounter) throws InterruptedException { if (faultCounter > 0) { // Normally in this case we read the message repeatedly offset to the real -> skip one to 6 bytes @@ -320,23 +339,31 @@ private void processReceivedMsg(byte module, boolean toggle, byte[] command) { // EM command / update } else { - if (((module & 0xE0) == 0x00)) { + if ((module & 0xE0) == 0x00) { sendEmAcknowledge(module, toggle); logger.debug("send acknowledge (modul, toggle) {} {}", module, toggle); - byte channel = (byte) ((command[0] >>> 4) & 0x0F); + for (byte cmdByte : command) { + byte channel = (byte) ((cmdByte >>> 4) & 0x0F); - OnOffType onOff = OnOffType.OFF; + OnOffType onOff = OnOffType.OFF; - if ((command[0] & 0x0F) == 2) { - onOff = OnOffType.ON; - } + byte cmd = (byte) (cmdByte & 0x0F); + if (cmd % 2 == 0) { + if (cmd == 2) { + onOff = OnOffType.ON; + } else { + logger.debug("Command {} isn't implemented for EM", cmd); + continue; + } + } - QueueObject qo = new QueueObject(PHCBindingConstants.CHANNELS_EM, module, channel, onOff); + QueueObject qo = new QueueObject(PHCBindingConstants.CHANNELS_EM, module, channel, onOff); - // put recognized message into queue - if (!receiveQueue.contains(qo)) { - receiveQueue.offer(qo); + // put recognized message into queue + if (!receiveQueue.contains(qo)) { + receiveQueue.offer(qo); + } } // ignore if message not from EM module diff --git a/bundles/org.openhab.binding.phc/src/main/resources/OH-INF/thing/channel-types.xml b/bundles/org.openhab.binding.phc/src/main/resources/OH-INF/thing/channel-types.xml index b3659783b3382..6c6cf128b6c74 100644 --- a/bundles/org.openhab.binding.phc/src/main/resources/OH-INF/thing/channel-types.xml +++ b/bundles/org.openhab.binding.phc/src/main/resources/OH-INF/thing/channel-types.xml @@ -53,7 +53,7 @@ - + Time for shutter channels in seconds with an accuracy of 1/10 seconds.