From 5417946bd5576e42da3d131d019008ce631cecc7 Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Sat, 14 Sep 2019 23:05:18 +0200 Subject: [PATCH 1/6] add CarbonDioxide sensor --- .../hap/accessories/CarbonDioxideSensor.java | 60 +++++++++++++++++++ .../CarbonDioxideDetectedState.java | 32 ++++++++++ .../CarbonDioxideDetectedCharacteristic.java | 41 +++++++++++++ .../CarbonDioxideLevelCharacteristic.java | 54 +++++++++++++++++ .../services/CarbonDioxideSensorService.java | 18 ++++++ 5 files changed, 205 insertions(+) create mode 100644 src/main/java/com/beowulfe/hap/accessories/CarbonDioxideSensor.java create mode 100644 src/main/java/com/beowulfe/hap/accessories/properties/CarbonDioxideDetectedState.java create mode 100644 src/main/java/com/beowulfe/hap/impl/characteristics/carbondioxide/CarbonDioxideDetectedCharacteristic.java create mode 100644 src/main/java/com/beowulfe/hap/impl/characteristics/carbondioxide/CarbonDioxideLevelCharacteristic.java create mode 100644 src/main/java/com/beowulfe/hap/impl/services/CarbonDioxideSensorService.java diff --git a/src/main/java/com/beowulfe/hap/accessories/CarbonDioxideSensor.java b/src/main/java/com/beowulfe/hap/accessories/CarbonDioxideSensor.java new file mode 100644 index 000000000..4f75f7611 --- /dev/null +++ b/src/main/java/com/beowulfe/hap/accessories/CarbonDioxideSensor.java @@ -0,0 +1,60 @@ +package com.beowulfe.hap.accessories; + +import com.beowulfe.hap.HomekitAccessory; +import com.beowulfe.hap.HomekitCharacteristicChangeCallback; +import com.beowulfe.hap.Service; +import com.beowulfe.hap.accessories.properties.CarbonDioxideDetectedState; +import com.beowulfe.hap.impl.services.CarbonDioxideSensorService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +/** + * A carbon dioxide sensor reports whether carbon dioxide has been detected or not. + * + *

Carbon dioxide sensors that run on batteries will need to implement this interface and also + * implement {@link BatteryStatusAccessory}. + * + * @author Eugen Freiter + */ +public interface CarbonDioxideSensor extends HomekitAccessory { + + /** + * Retrieves the state of the sensor that indicates if carbon dioxide has been detected. + * + * @return a future that will contain the carbon dioxide sensor's state + */ + CompletableFuture getCarbonDioxideDetectedState(); + + @Override + default Collection getServices() { + return Collections.singleton(new CarbonDioxideSensorService(this)); + } + + /** + * Subscribes to changes in the carbon dioxide's state. + * + * @param callback the function to call when the state changes. + */ + void subscribeCarbonDioxideDetectedState(HomekitCharacteristicChangeCallback callback); + + /** + * Retrieves the carbon dioxide level + * + * @return a future that will contain the carbon dioxide level as a value between 0 and 100000 + */ + CompletableFuture getCarbonDioxideLevel(); + + /** Unsubscribes from changes in the carbon dioxide's state. */ + void unsubscribeCarbonDioxideDetectedState(); + + /** + * Subscribes to changes in the carbon dioxide level. + * + * @param callback the function to call when the state changes. + */ + void subscribeCarbonDioxideLevel(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the carbon dioxide level. */ + void unsubscribeCarbonDioxideLevel(); +} diff --git a/src/main/java/com/beowulfe/hap/accessories/properties/CarbonDioxideDetectedState.java b/src/main/java/com/beowulfe/hap/accessories/properties/CarbonDioxideDetectedState.java new file mode 100644 index 000000000..9b636b4ae --- /dev/null +++ b/src/main/java/com/beowulfe/hap/accessories/properties/CarbonDioxideDetectedState.java @@ -0,0 +1,32 @@ +package com.beowulfe.hap.accessories.properties; + +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +public enum CarbonDioxideDetectedState { + NORMAL(0), + ABNORMAL(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(CarbonDioxideDetectedState.values()) + .collect(Collectors.toMap(CarbonDioxideDetectedState::getCode, t -> t)); + } + + public static CarbonDioxideDetectedState fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + CarbonDioxideDetectedState(int code) { + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/src/main/java/com/beowulfe/hap/impl/characteristics/carbondioxide/CarbonDioxideDetectedCharacteristic.java b/src/main/java/com/beowulfe/hap/impl/characteristics/carbondioxide/CarbonDioxideDetectedCharacteristic.java new file mode 100644 index 000000000..e6f2ee7d3 --- /dev/null +++ b/src/main/java/com/beowulfe/hap/impl/characteristics/carbondioxide/CarbonDioxideDetectedCharacteristic.java @@ -0,0 +1,41 @@ +package com.beowulfe.hap.impl.characteristics.carbondioxide; + +import com.beowulfe.hap.HomekitCharacteristicChangeCallback; +import com.beowulfe.hap.accessories.CarbonDioxideSensor; +import com.beowulfe.hap.accessories.properties.CarbonDioxideDetectedState; +import com.beowulfe.hap.characteristics.EnumCharacteristic; +import com.beowulfe.hap.characteristics.EventableCharacteristic; +import java.util.concurrent.CompletableFuture; + +public class CarbonDioxideDetectedCharacteristic extends EnumCharacteristic + implements EventableCharacteristic { + + private final CarbonDioxideSensor carbonDioxideSensor; + + public CarbonDioxideDetectedCharacteristic(CarbonDioxideSensor carbonDioxideSensor) { + super("00000092-0000-1000-8000-0026BB765291", false, true, "Carbon Dioxide Detected", 1); + this.carbonDioxideSensor = carbonDioxideSensor; + } + + @Override + protected CompletableFuture getValue() { + return carbonDioxideSensor + .getCarbonDioxideDetectedState() + .thenApply(CarbonDioxideDetectedState::getCode); + } + + @Override + protected void setValue(Integer value) throws Exception { + // Read Only + } + + @Override + public void subscribe(HomekitCharacteristicChangeCallback callback) { + carbonDioxideSensor.subscribeCarbonDioxideDetectedState(callback); + } + + @Override + public void unsubscribe() { + carbonDioxideSensor.unsubscribeCarbonDioxideDetectedState(); + } +} diff --git a/src/main/java/com/beowulfe/hap/impl/characteristics/carbondioxide/CarbonDioxideLevelCharacteristic.java b/src/main/java/com/beowulfe/hap/impl/characteristics/carbondioxide/CarbonDioxideLevelCharacteristic.java new file mode 100644 index 000000000..0efae9f2b --- /dev/null +++ b/src/main/java/com/beowulfe/hap/impl/characteristics/carbondioxide/CarbonDioxideLevelCharacteristic.java @@ -0,0 +1,54 @@ +package com.beowulfe.hap.impl.characteristics.carbondioxide; + +import com.beowulfe.hap.HomekitCharacteristicChangeCallback; +import com.beowulfe.hap.accessories.CarbonDioxideSensor; +import com.beowulfe.hap.characteristics.EventableCharacteristic; +import com.beowulfe.hap.characteristics.FloatCharacteristic; +import java.util.concurrent.CompletableFuture; + +public class CarbonDioxideLevelCharacteristic extends FloatCharacteristic + implements EventableCharacteristic { + + private final CarbonDioxideSensor sensor; + + public CarbonDioxideLevelCharacteristic(CarbonDioxideSensor sensor) { + super( + "00000093-0000-1000-8000-0026BB765291", + false, + true, + "Carbon Dioxide level", + 0, + 100000, + 0.1, + "%"); + this.sensor = sensor; + } + + @Override + public void subscribe(HomekitCharacteristicChangeCallback callback) { + sensor.subscribeCarbonDioxideLevel(callback); + } + + @Override + public void unsubscribe() { + sensor.unsubscribeCarbonDioxideLevel(); + } + + @Override + protected void setValue(Double value) throws Exception { + // Read Only + } + + @Override + protected CompletableFuture getDoubleValue() { + return sensor.getCarbonDioxideLevel(); + } + + @Override + public String toString() { + return "CarbonDioxideLevelCharacteristic{" + + "sensor level =" + + sensor.getCarbonDioxideLevel() + + '}'; + } +} diff --git a/src/main/java/com/beowulfe/hap/impl/services/CarbonDioxideSensorService.java b/src/main/java/com/beowulfe/hap/impl/services/CarbonDioxideSensorService.java new file mode 100644 index 000000000..6a8a2a5f5 --- /dev/null +++ b/src/main/java/com/beowulfe/hap/impl/services/CarbonDioxideSensorService.java @@ -0,0 +1,18 @@ +package com.beowulfe.hap.impl.services; + +import com.beowulfe.hap.accessories.CarbonDioxideSensor; +import com.beowulfe.hap.impl.characteristics.carbondioxide.CarbonDioxideDetectedCharacteristic; +import com.beowulfe.hap.impl.characteristics.carbondioxide.CarbonDioxideLevelCharacteristic; + +public class CarbonDioxideSensorService extends AbstractServiceImpl { + + public CarbonDioxideSensorService(CarbonDioxideSensor carbonDioxideSensor) { + this(carbonDioxideSensor, carbonDioxideSensor.getLabel()); + } + + public CarbonDioxideSensorService(CarbonDioxideSensor carbonDioxideSensor, String serviceName) { + super("00000097-0000-1000-8000-0026BB765291", carbonDioxideSensor, serviceName); + addCharacteristic(new CarbonDioxideDetectedCharacteristic(carbonDioxideSensor)); + addCharacteristic(new CarbonDioxideLevelCharacteristic(carbonDioxideSensor)); + } +} From 498d79725ce1f5d19ff65223fd8278d9e1ebae27 Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Sat, 14 Sep 2019 23:08:27 +0200 Subject: [PATCH 2/6] fix javadoc --- src/main/java/com/beowulfe/hap/HomekitRoot.java | 2 +- src/main/java/com/beowulfe/hap/accessories/ValveWithTimer.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/beowulfe/hap/HomekitRoot.java b/src/main/java/com/beowulfe/hap/HomekitRoot.java index 324228616..2eac1ad94 100644 --- a/src/main/java/com/beowulfe/hap/HomekitRoot.java +++ b/src/main/java/com/beowulfe/hap/HomekitRoot.java @@ -151,7 +151,7 @@ public void allowUnauthenticatedRequests(boolean allow) { /** * By default, the bridge advertises itself at revision 1. If you make changes to the accessories - * you're including in the bridge after your first call to {@link start()}, you should increment + * you're including in the bridge after your first call to {@link #start()}, you should increment * this number. The behavior of the client if the configuration index were to decrement is * undefined, so this implementation will not manage the configuration index by automatically * incrementing - preserving this state across invocations should be handled externally. diff --git a/src/main/java/com/beowulfe/hap/accessories/ValveWithTimer.java b/src/main/java/com/beowulfe/hap/accessories/ValveWithTimer.java index fdd296120..13794ca72 100644 --- a/src/main/java/com/beowulfe/hap/accessories/ValveWithTimer.java +++ b/src/main/java/com/beowulfe/hap/accessories/ValveWithTimer.java @@ -43,6 +43,7 @@ public interface ValveWithTimer extends Valve { *

If the valve is currently running, then Homekit assumes that changing this value affects the * current remaining duration. * + * @param value duration * @return a future with the value */ CompletableFuture setSetDuration(int value); From d4cdde53f072fe645f832e52e995ea92de80dc6b Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Sat, 14 Sep 2019 23:09:25 +0200 Subject: [PATCH 3/6] preparation for linked services --- src/main/java/com/beowulfe/hap/Service.java | 4 ++++ .../hap/impl/services/AbstractServiceImpl.java | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/main/java/com/beowulfe/hap/Service.java b/src/main/java/com/beowulfe/hap/Service.java index 5bebea7be..6987c3c12 100644 --- a/src/main/java/com/beowulfe/hap/Service.java +++ b/src/main/java/com/beowulfe/hap/Service.java @@ -29,4 +29,8 @@ public interface Service { * ########-####-####-####-############. */ String getType(); + + List getLinkedServices(); + + void addLinkedService(Service service); } diff --git a/src/main/java/com/beowulfe/hap/impl/services/AbstractServiceImpl.java b/src/main/java/com/beowulfe/hap/impl/services/AbstractServiceImpl.java index 83d917cba..18e222d63 100644 --- a/src/main/java/com/beowulfe/hap/impl/services/AbstractServiceImpl.java +++ b/src/main/java/com/beowulfe/hap/impl/services/AbstractServiceImpl.java @@ -18,6 +18,7 @@ abstract class AbstractServiceImpl implements Service { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private final String type; private final List characteristics = new LinkedList<>(); + private final List linkedServices = new LinkedList<>(); /** * This constructor has been deprecated and replaced with {@link #AbstractServiceImpl(String, @@ -86,4 +87,13 @@ public String getType() { protected void addCharacteristic(Characteristic characteristic) { this.characteristics.add(characteristic); } + + @Override + public List getLinkedServices() { + return Collections.unmodifiableList(linkedServices); + } + + @Override + public void addLinkedService(Service service) { linkedServices.add(service); } + } From 5094ebc8d17f816061531ff82f7960ee67fbccce Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Sat, 14 Sep 2019 23:21:54 +0200 Subject: [PATCH 4/6] Carbon dioxide sensor --- .../hapjava/accessories/CarbonDioxideSensor.java | 10 +++++----- .../CarbonDioxideDetectedCharacteristic.java | 10 +++++----- .../CarbonDioxideLevelCharacteristic.java | 10 +++++----- .../impl/services/CarbonDioxideSensorService.java | 8 ++++---- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/main/java/io/github/hapjava/accessories/CarbonDioxideSensor.java b/src/main/java/io/github/hapjava/accessories/CarbonDioxideSensor.java index 4f75f7611..742500479 100644 --- a/src/main/java/io/github/hapjava/accessories/CarbonDioxideSensor.java +++ b/src/main/java/io/github/hapjava/accessories/CarbonDioxideSensor.java @@ -1,10 +1,10 @@ -package com.beowulfe.hap.accessories; +package io.github.hapjava.accessories; -import com.beowulfe.hap.HomekitAccessory; -import com.beowulfe.hap.HomekitCharacteristicChangeCallback; -import com.beowulfe.hap.Service; import com.beowulfe.hap.accessories.properties.CarbonDioxideDetectedState; -import com.beowulfe.hap.impl.services.CarbonDioxideSensorService; +import io.github.hapjava.HomekitAccessory; +import io.github.hapjava.HomekitCharacteristicChangeCallback; +import io.github.hapjava.Service; +import io.github.hapjava.impl.services.CarbonDioxideSensorService; import java.util.Collection; import java.util.Collections; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideDetectedCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideDetectedCharacteristic.java index e6f2ee7d3..923e3bbc6 100644 --- a/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideDetectedCharacteristic.java +++ b/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideDetectedCharacteristic.java @@ -1,10 +1,10 @@ -package com.beowulfe.hap.impl.characteristics.carbondioxide; +package io.github.hapjava.impl.characteristics.carbondioxide; -import com.beowulfe.hap.HomekitCharacteristicChangeCallback; -import com.beowulfe.hap.accessories.CarbonDioxideSensor; import com.beowulfe.hap.accessories.properties.CarbonDioxideDetectedState; -import com.beowulfe.hap.characteristics.EnumCharacteristic; -import com.beowulfe.hap.characteristics.EventableCharacteristic; +import io.github.hapjava.HomekitCharacteristicChangeCallback; +import io.github.hapjava.accessories.CarbonDioxideSensor; +import io.github.hapjava.characteristics.EnumCharacteristic; +import io.github.hapjava.characteristics.EventableCharacteristic; import java.util.concurrent.CompletableFuture; public class CarbonDioxideDetectedCharacteristic extends EnumCharacteristic diff --git a/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideLevelCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideLevelCharacteristic.java index 0efae9f2b..f6f6ecc9e 100644 --- a/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideLevelCharacteristic.java +++ b/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideLevelCharacteristic.java @@ -1,9 +1,9 @@ -package com.beowulfe.hap.impl.characteristics.carbondioxide; +package io.github.hapjava.impl.characteristics.carbondioxide; -import com.beowulfe.hap.HomekitCharacteristicChangeCallback; -import com.beowulfe.hap.accessories.CarbonDioxideSensor; -import com.beowulfe.hap.characteristics.EventableCharacteristic; -import com.beowulfe.hap.characteristics.FloatCharacteristic; +import io.github.hapjava.HomekitCharacteristicChangeCallback; +import io.github.hapjava.accessories.CarbonDioxideSensor; +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.FloatCharacteristic; import java.util.concurrent.CompletableFuture; public class CarbonDioxideLevelCharacteristic extends FloatCharacteristic diff --git a/src/main/java/io/github/hapjava/impl/services/CarbonDioxideSensorService.java b/src/main/java/io/github/hapjava/impl/services/CarbonDioxideSensorService.java index 6a8a2a5f5..f00f04996 100644 --- a/src/main/java/io/github/hapjava/impl/services/CarbonDioxideSensorService.java +++ b/src/main/java/io/github/hapjava/impl/services/CarbonDioxideSensorService.java @@ -1,8 +1,8 @@ -package com.beowulfe.hap.impl.services; +package io.github.hapjava.impl.services; -import com.beowulfe.hap.accessories.CarbonDioxideSensor; -import com.beowulfe.hap.impl.characteristics.carbondioxide.CarbonDioxideDetectedCharacteristic; -import com.beowulfe.hap.impl.characteristics.carbondioxide.CarbonDioxideLevelCharacteristic; +import io.github.hapjava.accessories.CarbonDioxideSensor; +import io.github.hapjava.impl.characteristics.carbondioxide.CarbonDioxideDetectedCharacteristic; +import io.github.hapjava.impl.characteristics.carbondioxide.CarbonDioxideLevelCharacteristic; public class CarbonDioxideSensorService extends AbstractServiceImpl { From 63497d4b480898152cea847ec8685566afd3bf3a Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Sat, 14 Sep 2019 23:34:51 +0200 Subject: [PATCH 5/6] add carbon dioxide sensor --- .../accessories/CarbonDioxideSensor.java | 60 +++++++++++++++++++ .../CarbonDioxideDetectedState.java | 32 ++++++++++ .../CarbonDioxideDetectedCharacteristic.java | 41 +++++++++++++ .../CarbonDioxideLevelCharacteristic.java | 54 +++++++++++++++++ .../services/CarbonDioxideSensorService.java | 18 ++++++ 5 files changed, 205 insertions(+) create mode 100644 src/main/java/io/github/hapjava/accessories/CarbonDioxideSensor.java create mode 100644 src/main/java/io/github/hapjava/accessories/properties/CarbonDioxideDetectedState.java create mode 100644 src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideDetectedCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideLevelCharacteristic.java create mode 100644 src/main/java/io/github/hapjava/impl/services/CarbonDioxideSensorService.java diff --git a/src/main/java/io/github/hapjava/accessories/CarbonDioxideSensor.java b/src/main/java/io/github/hapjava/accessories/CarbonDioxideSensor.java new file mode 100644 index 000000000..27c332471 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/CarbonDioxideSensor.java @@ -0,0 +1,60 @@ +package io.github.hapjava.accessories; + +import io.github.hapjava.HomekitAccessory; +import io.github.hapjava.HomekitCharacteristicChangeCallback; +import io.github.hapjava.Service; +import io.github.hapjava.accessories.properties.CarbonDioxideDetectedState; +import io.github.hapjava.impl.services.CarbonDioxideSensorService; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +/** + * A carbon dioxide sensor reports whether carbon dioxide has been detected or not. + * + *

Carbon dioxide sensors that run on batteries will need to implement this interface and also + * implement {@link BatteryStatusAccessory}. + * + * @author Eugen Freiter + */ +public interface CarbonDioxideSensor extends HomekitAccessory { + + /** + * Retrieves the state of the sensor that indicates if carbon dioxide has been detected. + * + * @return a future that will contain the carbon dioxide sensor's state + */ + CompletableFuture getCarbonDioxideDetectedState(); + + @Override + default Collection getServices() { + return Collections.singleton(new CarbonDioxideSensorService(this)); + } + + /** + * Subscribes to changes in the carbon dioxide's state. + * + * @param callback the function to call when the state changes. + */ + void subscribeCarbonDioxideDetectedState(HomekitCharacteristicChangeCallback callback); + + /** + * Retrieves the carbon dioxide level + * + * @return a future that will contain the carbon dioxide level as a value between 0 and 100000 + */ + CompletableFuture getCarbonDioxideLevel(); + + /** Unsubscribes from changes in the carbon dioxide's state. */ + void unsubscribeCarbonDioxideDetectedState(); + + /** + * Subscribes to changes in the carbon dioxide level. + * + * @param callback the function to call when the state changes. + */ + void subscribeCarbonDioxideLevel(HomekitCharacteristicChangeCallback callback); + + /** Unsubscribes from changes in the carbon dioxide level. */ + void unsubscribeCarbonDioxideLevel(); +} diff --git a/src/main/java/io/github/hapjava/accessories/properties/CarbonDioxideDetectedState.java b/src/main/java/io/github/hapjava/accessories/properties/CarbonDioxideDetectedState.java new file mode 100644 index 000000000..66dabf5b6 --- /dev/null +++ b/src/main/java/io/github/hapjava/accessories/properties/CarbonDioxideDetectedState.java @@ -0,0 +1,32 @@ +package io.github.hapjava.accessories.properties; + +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +public enum CarbonDioxideDetectedState { + NORMAL(0), + ABNORMAL(1); + + private static final Map reverse; + + static { + reverse = + Arrays.stream(CarbonDioxideDetectedState.values()) + .collect(Collectors.toMap(CarbonDioxideDetectedState::getCode, t -> t)); + } + + public static CarbonDioxideDetectedState fromCode(Integer code) { + return reverse.get(code); + } + + private final int code; + + CarbonDioxideDetectedState(int code) { + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideDetectedCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideDetectedCharacteristic.java new file mode 100644 index 000000000..5ce03856a --- /dev/null +++ b/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideDetectedCharacteristic.java @@ -0,0 +1,41 @@ +package io.github.hapjava.impl.characteristics.carbondioxide; + +import io.github.hapjava.HomekitCharacteristicChangeCallback; +import io.github.hapjava.accessories.CarbonDioxideSensor; +import io.github.hapjava.accessories.properties.CarbonDioxideDetectedState; +import io.github.hapjava.characteristics.EnumCharacteristic; +import io.github.hapjava.characteristics.EventableCharacteristic; +import java.util.concurrent.CompletableFuture; + +public class CarbonDioxideDetectedCharacteristic extends EnumCharacteristic + implements EventableCharacteristic { + + private final CarbonDioxideSensor carbonDioxideSensor; + + public CarbonDioxideDetectedCharacteristic(CarbonDioxideSensor carbonDioxideSensor) { + super("00000092-0000-1000-8000-0026BB765291", false, true, "Carbon Dioxide Detected", 1); + this.carbonDioxideSensor = carbonDioxideSensor; + } + + @Override + protected CompletableFuture getValue() { + return carbonDioxideSensor + .getCarbonDioxideDetectedState() + .thenApply(CarbonDioxideDetectedState::getCode); + } + + @Override + protected void setValue(Integer value) throws Exception { + // Read Only + } + + @Override + public void subscribe(HomekitCharacteristicChangeCallback callback) { + carbonDioxideSensor.subscribeCarbonDioxideDetectedState(callback); + } + + @Override + public void unsubscribe() { + carbonDioxideSensor.unsubscribeCarbonDioxideDetectedState(); + } +} diff --git a/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideLevelCharacteristic.java b/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideLevelCharacteristic.java new file mode 100644 index 000000000..f6f6ecc9e --- /dev/null +++ b/src/main/java/io/github/hapjava/impl/characteristics/carbondioxide/CarbonDioxideLevelCharacteristic.java @@ -0,0 +1,54 @@ +package io.github.hapjava.impl.characteristics.carbondioxide; + +import io.github.hapjava.HomekitCharacteristicChangeCallback; +import io.github.hapjava.accessories.CarbonDioxideSensor; +import io.github.hapjava.characteristics.EventableCharacteristic; +import io.github.hapjava.characteristics.FloatCharacteristic; +import java.util.concurrent.CompletableFuture; + +public class CarbonDioxideLevelCharacteristic extends FloatCharacteristic + implements EventableCharacteristic { + + private final CarbonDioxideSensor sensor; + + public CarbonDioxideLevelCharacteristic(CarbonDioxideSensor sensor) { + super( + "00000093-0000-1000-8000-0026BB765291", + false, + true, + "Carbon Dioxide level", + 0, + 100000, + 0.1, + "%"); + this.sensor = sensor; + } + + @Override + public void subscribe(HomekitCharacteristicChangeCallback callback) { + sensor.subscribeCarbonDioxideLevel(callback); + } + + @Override + public void unsubscribe() { + sensor.unsubscribeCarbonDioxideLevel(); + } + + @Override + protected void setValue(Double value) throws Exception { + // Read Only + } + + @Override + protected CompletableFuture getDoubleValue() { + return sensor.getCarbonDioxideLevel(); + } + + @Override + public String toString() { + return "CarbonDioxideLevelCharacteristic{" + + "sensor level =" + + sensor.getCarbonDioxideLevel() + + '}'; + } +} diff --git a/src/main/java/io/github/hapjava/impl/services/CarbonDioxideSensorService.java b/src/main/java/io/github/hapjava/impl/services/CarbonDioxideSensorService.java new file mode 100644 index 000000000..f00f04996 --- /dev/null +++ b/src/main/java/io/github/hapjava/impl/services/CarbonDioxideSensorService.java @@ -0,0 +1,18 @@ +package io.github.hapjava.impl.services; + +import io.github.hapjava.accessories.CarbonDioxideSensor; +import io.github.hapjava.impl.characteristics.carbondioxide.CarbonDioxideDetectedCharacteristic; +import io.github.hapjava.impl.characteristics.carbondioxide.CarbonDioxideLevelCharacteristic; + +public class CarbonDioxideSensorService extends AbstractServiceImpl { + + public CarbonDioxideSensorService(CarbonDioxideSensor carbonDioxideSensor) { + this(carbonDioxideSensor, carbonDioxideSensor.getLabel()); + } + + public CarbonDioxideSensorService(CarbonDioxideSensor carbonDioxideSensor, String serviceName) { + super("00000097-0000-1000-8000-0026BB765291", carbonDioxideSensor, serviceName); + addCharacteristic(new CarbonDioxideDetectedCharacteristic(carbonDioxideSensor)); + addCharacteristic(new CarbonDioxideLevelCharacteristic(carbonDioxideSensor)); + } +} From 4a2b143ad84005a780557d7807eb4842f4f2e09f Mon Sep 17 00:00:00 2001 From: Eugen Freiter Date: Thu, 26 Sep 2019 18:54:28 +0200 Subject: [PATCH 6/6] fix event subscrption. dont send EVENT on subscription --- .../github/hapjava/impl/connections/SubscriptionManager.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/io/github/hapjava/impl/connections/SubscriptionManager.java b/src/main/java/io/github/hapjava/impl/connections/SubscriptionManager.java index 46ef5c518..2a2fc693d 100644 --- a/src/main/java/io/github/hapjava/impl/connections/SubscriptionManager.java +++ b/src/main/java/io/github/hapjava/impl/connections/SubscriptionManager.java @@ -49,11 +49,6 @@ public synchronized void addSubscription( LOGGER.info( "Added subscription to " + characteristic.getClass() + " for " + connection.hashCode()); } - try { - connection.outOfBand(new EventController().getMessage(aid, iid, characteristic)); - } catch (Exception e) { - LOGGER.error("Could not send initial state in response to subscribe event", e); - } } public synchronized void removeSubscription(