diff --git a/src/main/java/com/beowulfe/hap/accessories/BatteryAccessory.java b/src/main/java/com/beowulfe/hap/accessories/BatteryAccessory.java
index 1e7914dad..b69bdf7e3 100644
--- a/src/main/java/com/beowulfe/hap/accessories/BatteryAccessory.java
+++ b/src/main/java/com/beowulfe/hap/accessories/BatteryAccessory.java
@@ -1,15 +1,15 @@
package com.beowulfe.hap.accessories;
-import com.beowulfe.hap.HomekitCharacteristicChangeCallback;
-
import java.util.concurrent.CompletableFuture;
+import com.beowulfe.hap.HomekitCharacteristicChangeCallback;
+
/**
- * An accessory that runs on batteries. Accessories that run on batteries are able to report
- * battery level.
+ * Do not use. Devices that have battery levels should implement LowBatteryStatusAccessory.
*
* @author Gaston Dombiak
*/
+@Deprecated
public interface BatteryAccessory {
/**
diff --git a/src/main/java/com/beowulfe/hap/accessories/BatteryStatusAccessory.java b/src/main/java/com/beowulfe/hap/accessories/BatteryStatusAccessory.java
new file mode 100644
index 000000000..2e817a603
--- /dev/null
+++ b/src/main/java/com/beowulfe/hap/accessories/BatteryStatusAccessory.java
@@ -0,0 +1,34 @@
+package com.beowulfe.hap.accessories;
+
+import java.util.concurrent.CompletableFuture;
+
+import com.beowulfe.hap.HomekitCharacteristicChangeCallback;
+
+/**
+ * An accessory that runs on batteries. Accessories that run on batteries are able to report
+ * battery level.
+ *
+ * @author Tim Harper
+ */
+public interface BatteryStatusAccessory {
+
+ /**
+ * Queries if the device battery level is low; returning a value of true
+ * will cause a low-battery status to appear in Home for the device.
+ *
+ * @return a future that will contain the accessory's low battery state
+ */
+ CompletableFuture A carbon monoxide sensor reports whether carbon monoxide has been detected or not. Carbon monoxide sensors that run on batteries will need to implement this interface
- * and also implement {@link BatteryAccessory}.
Contact sensors that run on batteries will need to implement this interface - * and also implement {@link BatteryAccessory}.
+ * and also implement {@link BatteryStatusAccessory}. * * @author Gaston Dombiak */ diff --git a/src/main/java/com/beowulfe/hap/accessories/LockMechanism.java b/src/main/java/com/beowulfe/hap/accessories/LockMechanism.java index c44ebb6ac..320d5dc0b 100644 --- a/src/main/java/com/beowulfe/hap/accessories/LockMechanism.java +++ b/src/main/java/com/beowulfe/hap/accessories/LockMechanism.java @@ -15,7 +15,7 @@ * {@link LockableLockMechanism}. * *Locks that run on batteries will need to implement this interface and also - * implement {@link BatteryAccessory}.
+ * implement {@link BatteryStatusAccessory}. * * @author Andy Lintner */ diff --git a/src/main/java/com/beowulfe/hap/accessories/MotionSensor.java b/src/main/java/com/beowulfe/hap/accessories/MotionSensor.java index afa3b605d..ee13e839c 100644 --- a/src/main/java/com/beowulfe/hap/accessories/MotionSensor.java +++ b/src/main/java/com/beowulfe/hap/accessories/MotionSensor.java @@ -13,7 +13,7 @@ *A motion sensor that reports whether motion has been detected.
* *Motion sensors that run on batteries will need to implement this interface - * and also implement {@link BatteryAccessory}.
+ * and also implement {@link BatteryStatusAccessory}. * * @author Gaston Dombiak */ diff --git a/src/main/java/com/beowulfe/hap/accessories/SmokeSensor.java b/src/main/java/com/beowulfe/hap/accessories/SmokeSensor.java index ff575dec7..431e8ec7a 100644 --- a/src/main/java/com/beowulfe/hap/accessories/SmokeSensor.java +++ b/src/main/java/com/beowulfe/hap/accessories/SmokeSensor.java @@ -14,7 +14,7 @@ *A smoke sensor reports whether smoke has been detected or not.
* *Smoke sensors that run on batteries will need to implement this interface - * and also implement {@link BatteryAccessory}.
+ * and also implement {@link BatteryStatusAccessory}. * * @author Gaston Dombiak */ diff --git a/src/main/java/com/beowulfe/hap/impl/characteristics/common/BatteryLevelCharacteristic.java b/src/main/java/com/beowulfe/hap/impl/characteristics/common/BatteryLevelCharacteristic.java index a6c6eebcf..f0cd9aa4f 100644 --- a/src/main/java/com/beowulfe/hap/impl/characteristics/common/BatteryLevelCharacteristic.java +++ b/src/main/java/com/beowulfe/hap/impl/characteristics/common/BatteryLevelCharacteristic.java @@ -1,13 +1,18 @@ package com.beowulfe.hap.impl.characteristics.common; -import com.beowulfe.hap.HomekitCharacteristicChangeCallback; -import com.beowulfe.hap.characteristics.EventableCharacteristic; -import com.beowulfe.hap.characteristics.IntegerCharacteristic; - import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import java.util.function.Supplier; +import com.beowulfe.hap.HomekitCharacteristicChangeCallback; +import com.beowulfe.hap.characteristics.EventableCharacteristic; +import com.beowulfe.hap.characteristics.IntegerCharacteristic; + +/** + * This characteristic is used by a stand-alone BatteryService, which describes + * a stand-alone battery device, not the battery status of a battery operated + * device such as a motion sensor. + */ public class BatteryLevelCharacteristic extends IntegerCharacteristic implements EventableCharacteristic { private final SupplierCreates a new instance of this class with the specified UUID and {@link HomekitAccessory}. - * Download and install HomeKit Accessory Simulator to discover the corresponding UUID for - * the specific service.
- * - *The new service will automatically add {@link Name} characteristic. If the accessory - * is battery operated then it must implement {@link BatteryAccessory} and {@link BatteryLevelCharacteristic} - * will be added too.
- * - * @param type unique UUID of the service. This information can be obtained from HomeKit Accessory Simulator. - * @param accessory HomeKit accessory exposed as a service. - * @param serviceName name of the service. This information is usually the name of the accessory. + /** + *+ * Creates a new instance of this class with the specified UUID and {@link HomekitAccessory}. + * Download and install HomeKit Accessory Simulator to discover the corresponding UUID for + * the specific service. + *
+ * + *+ * The new service will automatically add {@link Name} characteristic. If the accessory + * is battery operated then it must implement {@link BatteryAccessory} and {@link BatteryLevelCharacteristic} + * will be added too. + *
+ * + * @param type unique UUID of the service. This information can be obtained from HomeKit Accessory Simulator. + * @param accessory HomeKit accessory exposed as a service. + * @param serviceName name of the service. This information is usually the name of the accessory. */ - public AbstractServiceImpl(String type, HomekitAccessory accessory, String serviceName) { - this.type = type; + public AbstractServiceImpl(String type, HomekitAccessory accessory, String serviceName) { + this.type = type; + + if (accessory != null) { + // Add name characteristic + addCharacteristic(new Name(serviceName)); + + // If battery operated accessory then add BatteryLevelCharacteristic + if (accessory instanceof BatteryAccessory) { + logger.warn( + "Accessory {} implements BatteryAccessory, which was incorrectly used to advertise battery state and is not recognized by HomeKit. " + + "Battery-powered devices should report their battery status using LowBatteryStatusAccessory", + accessory.getClass()); + } + + // If battery operated accessory then add LowBatteryStatusAccessory + if (accessory instanceof BatteryStatusAccessory) { + BatteryStatusAccessory batteryStatusAccessory = (BatteryStatusAccessory) accessory; + addCharacteristic(new LowBatteryStatusCharacteristic(batteryStatusAccessory::getLowBatteryState, + batteryStatusAccessory::subscribeLowBatteryState, + batteryStatusAccessory::unsubscribeLowBatteryState)); + + } + } + } - if (accessory != null) { - // Add name characteristic - addCharacteristic(new Name(serviceName)); + @Override + public List