]> git.basschouten.com Git - openhab-addons.git/commitdiff
[bluetooth.enoceanble] Prevent that channels are triggered multiple times per click...
authorPatrick Fink <mail@pfink.de>
Sun, 24 Oct 2021 09:38:48 +0000 (11:38 +0200)
committerGitHub <noreply@github.com>
Sun, 24 Oct 2021 09:38:48 +0000 (11:38 +0200)
Signed-off-by: Patrick Fink <mail@pfink.de>
bundles/org.openhab.binding.bluetooth.enoceanble/src/main/java/org/openhab/binding/bluetooth/enoceanble/internal/EnoceanBlePtm215Event.java
bundles/org.openhab.binding.bluetooth.enoceanble/src/main/java/org/openhab/binding/bluetooth/enoceanble/internal/EnoceanBleRockerHandler.java

index c1c52d6f941cc77a7b91658e4065055c33e5956d..76b236b842810d57d320e5f8975479828db8d3d3 100644 (file)
@@ -12,6 +12,8 @@
  */
 package org.openhab.binding.bluetooth.enoceanble.internal;
 
+import java.nio.ByteBuffer;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 
 /**
@@ -30,9 +32,15 @@ public class EnoceanBlePtm215Event {
     private static final byte BUTTON2_DIR2 = 0x2;
 
     private final byte byteState;
+    private final int sequence;
 
     public EnoceanBlePtm215Event(byte[] manufacturerData) {
         byteState = manufacturerData[6];
+
+        byte[] sequenceBytes = new byte[] { manufacturerData[5], manufacturerData[4], manufacturerData[3],
+                manufacturerData[2] };
+        ByteBuffer sequenceBytesBuffered = ByteBuffer.wrap(sequenceBytes); // big-endian by default
+        sequence = sequenceBytesBuffered.getInt();
     }
 
     public boolean isPressed() {
@@ -59,9 +67,13 @@ public class EnoceanBlePtm215Event {
         return (byteState & flag) == flag;
     }
 
+    public int getSequence() {
+        return sequence;
+    }
+
     @Override
     public String toString() {
         return "Button " + (isButton1() ? 1 : 2) + " Dir " + (isDir1() ? 1 : 2) + " "
-                + (isPressed() ? "PRESSED" : "RELEASED");
+                + (isPressed() ? "PRESSED" : "RELEASED") + " (seq. " + this.sequence + ")";
     }
 }
index 81bcbff9923dbae30f446ab950fcf7f048a2d1c9..43c4722c3fe01dae92236b5b044129a9570cd7aa 100644 (file)
@@ -30,6 +30,7 @@ import org.slf4j.LoggerFactory;
 public class EnoceanBleRockerHandler extends BeaconBluetoothHandler {
 
     private final Logger logger = LoggerFactory.getLogger(EnoceanBleRockerHandler.class);
+    private int lastSequence = Integer.MIN_VALUE;
 
     public EnoceanBleRockerHandler(Thing thing) {
         super(thing);
@@ -44,7 +45,12 @@ public class EnoceanBleRockerHandler extends BeaconBluetoothHandler {
             if (manufacturerData != null && manufacturerData.length > 0) {
                 EnoceanBlePtm215Event event = new EnoceanBlePtm215Event(manufacturerData);
                 logger.debug("Parsed manufacturer data to PTM215B event: {}", event);
-                triggerChannel(resolveChannel(event), resolveTriggerEvent(event));
+                synchronized (this) {
+                    if (event.getSequence() > lastSequence) {
+                        lastSequence = event.getSequence();
+                        triggerChannel(resolveChannel(event), resolveTriggerEvent(event));
+                    }
+                }
             }
         } catch (IllegalStateException e) {
             logger.warn("PTM215B event could not be parsed correctly, exception occured:", e);