From: Marcus Better Date: Thu, 21 Oct 2021 05:30:40 +0000 (-0400) Subject: [upb] Handle device state reports (#11352) X-Git-Url: https://git.basschouten.com/?a=commitdiff_plain;h=daea6481a7f0455dc09ed1d20cf06f097ac81825;p=openhab-addons.git [upb] Handle device state reports (#11352) * [upb] Fix javadoc Signed-off-by: Marcus Better * [upb] Handle Device State Report messages Signed-off-by: Marcus Better * More useful debug logging of received messages Signed-off-by: Marcus Better * Null annotation Signed-off-by: Marcus Better --- diff --git a/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/UPBController.java b/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/UPBController.java index 0d881644fd..745ab50d76 100644 --- a/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/UPBController.java +++ b/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/UPBController.java @@ -67,7 +67,7 @@ public class UPBController { return; } - if (msg.getControlWord().isLink() || srcId == dstId) { + if (msg.getControlWord().isLink() || dstId == 0 || srcId == dstId) { thingHnd.onMessageReceived(msg); } diff --git a/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/handler/SerialIoThread.java b/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/handler/SerialIoThread.java index 24248fdd50..e8d78d9022 100644 --- a/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/handler/SerialIoThread.java +++ b/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/handler/SerialIoThread.java @@ -152,7 +152,7 @@ public class SerialIoThread extends Thread { return; } if (logger.isDebugEnabled()) { - logger.debug("UPB Message: {}", HexUtils.bytesToHex(buf)); + logger.debug("UPB Message: {}", formatMessage(buf)); } final UPBMessage msg; try { @@ -244,6 +244,24 @@ public class SerialIoThread extends Thread { } } + // format a message for debug logging, include only printable characters + private static String formatMessage(byte[] buf) { + final int len; + // omit the final newline + if (buf[buf.length - 1] == '\r') { + len = buf.length - 1; + } else { + len = buf.length; + } + final String s = new String(buf, 0, len, US_ASCII); + if (s.chars().allMatch(c -> c >= 32 && c < 127)) { + return s; + } else { + // presence of non-printable characters is either noise or a misconfiguration, log it in hex + return HexUtils.bytesToHex(buf); + } + } + private class WriteRunnable implements Runnable { private static final int MAX_RETRIES = 3; diff --git a/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/handler/UPBThingHandler.java b/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/handler/UPBThingHandler.java index 4288fe40a7..25bbaa907b 100644 --- a/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/handler/UPBThingHandler.java +++ b/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/handler/UPBThingHandler.java @@ -12,7 +12,11 @@ */ package org.openhab.binding.upb.internal.handler; -import static org.openhab.binding.upb.internal.message.Command.*; +import static org.openhab.binding.upb.internal.message.Command.ACTIVATE; +import static org.openhab.binding.upb.internal.message.Command.DEACTIVATE; +import static org.openhab.binding.upb.internal.message.Command.GOTO; +import static org.openhab.binding.upb.internal.message.Command.NULL; +import static org.openhab.binding.upb.internal.message.Command.REPORT_STATE; import java.math.BigDecimal; @@ -165,6 +169,7 @@ public class UPBThingHandler extends BaseThingHandler { private void handleDirectMessage(final UPBMessage msg) { final State state; + byte[] args = msg.getArguments(); switch (msg.getCommand()) { case ACTIVATE: state = OnOffType.ON; @@ -175,12 +180,12 @@ public class UPBThingHandler extends BaseThingHandler { break; case GOTO: - if (msg.getArguments().length == 0) { - logger.warn("DEV {}: malformed GOTO cmd", unitId); + case DEVICE_STATE: + if (args.length == 0) { + logger.warn("DEV {}: malformed {} cmd", unitId, msg.getCommand()); return; } - final int level = msg.getArguments()[0]; - state = new PercentType(level); + state = new PercentType(args[0]); break; default: diff --git a/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/message/Command.java b/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/message/Command.java index 8d56a98596..7dee3dbbd0 100644 --- a/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/message/Command.java +++ b/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/message/Command.java @@ -12,11 +12,14 @@ */ package org.openhab.binding.upb.internal.message; +import org.eclipse.jdt.annotation.NonNullByDefault; + /** * An enum of possible commands. * * @author cvanorman - Initial contribution */ +@NonNullByDefault public enum Command { NULL(0), ACTIVATE(0x20), diff --git a/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/message/UPBMessage.java b/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/message/UPBMessage.java index f073b26471..d7353060cc 100644 --- a/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/message/UPBMessage.java +++ b/bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/message/UPBMessage.java @@ -48,7 +48,7 @@ public class UPBMessage { /** * Returns the message type for a message buffer. * - * @param prefix the byte array to check for a matching type prefix + * @param buf the byte array to check for a matching type prefix * @return the matching message type, or {@code NONE} */ public static Type forPrefix(final byte[] buf) { @@ -80,7 +80,7 @@ public class UPBMessage { /** * Converts a hex string into a {@link UPBMessage}. * - * @param commandString + * @param buf * the string as returned by the modem. * @return a new UPBMessage. */