return;
}
- if (msg.getControlWord().isLink() || srcId == dstId) {
+ if (msg.getControlWord().isLink() || dstId == 0 || srcId == dstId) {
thingHnd.onMessageReceived(msg);
}
return;
}
if (logger.isDebugEnabled()) {
- logger.debug("UPB Message: {}", HexUtils.bytesToHex(buf));
+ logger.debug("UPB Message: {}", formatMessage(buf));
}
final UPBMessage msg;
try {
}
}
+ // 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;
*/
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;
private void handleDirectMessage(final UPBMessage msg) {
final State state;
+ byte[] args = msg.getArguments();
switch (msg.getCommand()) {
case ACTIVATE:
state = OnOffType.ON;
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:
*/
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),
/**
* 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) {
/**
* Converts a hex string into a {@link UPBMessage}.
*
- * @param commandString
+ * @param buf
* the string as returned by the modem.
* @return a new UPBMessage.
*/