]> git.basschouten.com Git - openhab-addons.git/commitdiff
[upb] Handle device state reports (#11352)
authorMarcus Better <marcusb@users.noreply.github.com>
Thu, 21 Oct 2021 05:30:40 +0000 (01:30 -0400)
committerGitHub <noreply@github.com>
Thu, 21 Oct 2021 05:30:40 +0000 (07:30 +0200)
* [upb] Fix javadoc

Signed-off-by: Marcus Better <marcus@better.se>
* [upb] Handle Device State Report messages

Signed-off-by: Marcus Better <marcus@better.se>
* More useful debug logging of received messages

Signed-off-by: Marcus Better <marcus@better.se>
* Null annotation

Signed-off-by: Marcus Better <marcus@better.se>
bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/UPBController.java
bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/handler/SerialIoThread.java
bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/handler/UPBThingHandler.java
bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/message/Command.java
bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/message/UPBMessage.java

index 0d881644fdaeefc9fa19a8e3e3b2293212614c64..745ab50d768621c8aa7708dbb63ad23890d4914f 100644 (file)
@@ -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);
         }
 
index 24248fdd5052ad68ddb7b5a7eacaeb90c9dcaff4..e8d78d90225b041af6ffea92d22e8455bb1f7281 100644 (file)
@@ -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;
 
index 4288fe40a721076cf7f5b0695435f1284cedf240..25bbaa907bc978bb3d862a87d18dbe74c194fdd1 100644 (file)
  */
 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:
index 8d56a98596a94c28222d5c4cdba4ba24db922b4c..7dee3dbbd0b096f4d4a44359d02aff29e8df4295 100644 (file)
  */
 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),
index f073b264716998feaf938fdfdfbb5cac156867bb..d7353060cc7cbb6e57f45e2e2dfe68efb549d976 100644 (file)
@@ -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.
      */