]> git.basschouten.com Git - openhab-addons.git/commitdiff
[homekit] fix optional characteristics (#17038)
authorCody Cutrer <cody@cutrer.us>
Sun, 14 Jul 2024 17:01:36 +0000 (11:01 -0600)
committerGitHub <noreply@github.com>
Sun, 14 Jul 2024 17:01:36 +0000 (19:01 +0200)
* [homekit] fix optional characteristics

Signed-off-by: Cody Cutrer <cody@cutrer.us>
37 files changed:
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/AbstractHomekitAccessoryImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitAirQualitySensorImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitBasicFanImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitBatteryImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCarbonDioxideSensorImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCarbonMonoxideSensorImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitContactSensorImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitDoorImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitFanImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitFaucetImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitFilterMaintenanceImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitGarageDoorOpenerImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitHeaterCoolerImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitHumiditySensorImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitInputSourceImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitIrrigationSystemImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLeakSensorImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLightSensorImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLightbulbImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLockImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitMicrophoneImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitMotionSensorImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitOccupancySensorImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitOutletImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSecuritySystemImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSlatImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSmartSpeakerImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSmokeSensorImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSpeakerImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSwitchImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitTelevisionImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitTelevisionSpeakerImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitTemperatureSensorImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitThermostatImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitValveImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitWindowCoveringImpl.java
bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitWindowImpl.java

index 228de13211e489cb85e888a0711b45c4af1933d4..36836a01b6c023d732fdab9a084ad08947d07d09 100644 (file)
@@ -228,6 +228,25 @@ public abstract class AbstractHomekitAccessoryImpl implements HomekitAccessory {
         return this.services;
     }
 
+    public void addService(Service service) {
+        services.add(service);
+
+        var serviceClass = service.getClass();
+        rawCharacteristics.values().forEach(characteristic -> {
+            // belongs on the accessory information service
+            if (characteristic.getClass() == NameCharacteristic.class) {
+                return;
+            }
+            try {
+                // if the service supports adding this characteristic as optional, add it!
+                serviceClass.getMethod("addOptionalCharacteristic", characteristic.getClass()).invoke(service,
+                        characteristic);
+            } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+                // the service doesn't support this optional characteristic; ignore it
+            }
+        });
+    }
+
     protected HomekitAccessoryUpdater getUpdater() {
         return updater;
     }
index 36607ffd154d939995acb2049d5ea49f3b6ca01e..73b0646d29c8546fa852089a4d3416c199e915ec 100644 (file)
@@ -45,7 +45,7 @@ public class HomekitAirQualitySensorImpl extends AbstractHomekitAccessoryImpl im
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new AirQualityService(this));
+        addService(new AirQualityService(this));
     }
 
     @Override
index a8b33ca0f8ccf16c0123e8e4bd68990768cd4681..5e4066894a6e8573fcbe5102af00c25874c0c8ee 100644 (file)
@@ -45,7 +45,7 @@ class HomekitBasicFanImpl extends AbstractHomekitAccessoryImpl implements BasicF
     @Override
     public void init() throws HomekitException {
         super.init();
-        this.getServices().add(new BasicFanService(this));
+        addService(new BasicFanService(this));
     }
 
     @Override
index 4c9529fd3ce2420e2491d808b59cc044718edc15..3ca666afd3dbe22f7a98eb92d1e3649e8804e5d4 100644 (file)
@@ -62,7 +62,7 @@ public class HomekitBatteryImpl extends AbstractHomekitAccessoryImpl implements
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new BatteryService(this));
+        addService(new BatteryService(this));
     }
 
     @Override
index 44b18ad4c21fc10b64388aab3366a5293e613b74..adfe18314ec992d3071abaeee776ed45564fea86 100644 (file)
@@ -46,7 +46,7 @@ public class HomekitCarbonDioxideSensorImpl extends AbstractHomekitAccessoryImpl
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new CarbonDioxideSensorService(this));
+        addService(new CarbonDioxideSensorService(this));
     }
 
     @Override
index f1235a4c0fecfeb57eadc9a91ae6ef4336b396c1..29693a6baf890071b75a7475ca55a14bef74c966 100644 (file)
@@ -46,7 +46,7 @@ public class HomekitCarbonMonoxideSensorImpl extends AbstractHomekitAccessoryImp
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new CarbonMonoxideSensorService(this));
+        addService(new CarbonMonoxideSensorService(this));
     }
 
     @Override
index 3ff7c9a19169fda93e2363fccc606610b742caf4..bb6cc5f6148beb9747ccd8a8e7c0dc6405b899c9 100644 (file)
@@ -44,7 +44,7 @@ public class HomekitContactSensorImpl extends AbstractHomekitAccessoryImpl imple
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new ContactSensorService(this));
+        addService(new ContactSensorService(this));
     }
 
     @Override
index 021663004efa33d9c0e53d53ff3d428043985a76..7e51d3f7f9f786a89583dafd558d1a4141a061bc 100644 (file)
@@ -41,7 +41,7 @@ public class HomekitDoorImpl extends AbstractHomekitPositionAccessoryImpl implem
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new DoorService(this));
+        addService(new DoorService(this));
     }
 
     @Override
index 8fadfe9d7341b7670146f320c006247f34b7ae43..416fa6e31beeb3c91bb7b6496a0a721bbb42483a 100644 (file)
@@ -43,7 +43,7 @@ class HomekitFanImpl extends AbstractHomekitAccessoryImpl implements FanAccessor
     @Override
     public void init() throws HomekitException {
         super.init();
-        this.getServices().add(new FanService(this));
+        addService(new FanService(this));
     }
 
     @Override
index beeab7618012dcb8b2f4d64c49da7a52d3c3770c..a2fb8248422dbcf5128d5becc68c5af939127377 100644 (file)
@@ -43,7 +43,7 @@ class HomekitFaucetImpl extends AbstractHomekitAccessoryImpl implements FaucetAc
     @Override
     public void init() throws HomekitException {
         super.init();
-        this.getServices().add(new FaucetService(this));
+        addService(new FaucetService(this));
     }
 
     @Override
index 5918da1dca9ec30207d5a3453fce8a4b96372504..792922ee5fff2586bdf664a3b8ed728bdaeab512 100644 (file)
@@ -45,7 +45,7 @@ public class HomekitFilterMaintenanceImpl extends AbstractHomekitAccessoryImpl i
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new FilterMaintenanceService(this));
+        addService(new FilterMaintenanceService(this));
     }
 
     @Override
index 4284cbccd384068583d6ccb9eb0a3572cc0bd6ca..b217f3e1f991541733f1fb467fe2b454a675395c 100644 (file)
@@ -55,7 +55,7 @@ public class HomekitGarageDoorOpenerImpl extends AbstractHomekitAccessoryImpl im
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new GarageDoorOpenerService(this));
+        addService(new GarageDoorOpenerService(this));
     }
 
     @Override
index 840e6ed0bd5bcc4f9fca70773be26e9a9b17e533..c85286ce68d3c33d21c59d9d236720612aebdd9a 100644 (file)
@@ -73,10 +73,10 @@ public class HomekitHeaterCoolerImpl extends AbstractHomekitAccessoryImpl implem
     public void init() throws HomekitException {
         super.init();
         final HeaterCoolerService service = new HeaterCoolerService(this);
+        addService(service);
         service.addOptionalCharacteristic(new TemperatureDisplayUnitCharacteristic(this::getTemperatureDisplayUnit,
                 this::setTemperatureDisplayUnit, this::subscribeTemperatureDisplayUnit,
                 this::unsubscribeTemperatureDisplayUnit));
-        getServices().add(service);
     }
 
     @Override
index abd24f9bd31ebe9e733a44d8d98ec73772604513..cb3c38e6c3d91e84926c194aef9fb379f16d8c0d 100644 (file)
@@ -43,7 +43,7 @@ public class HomekitHumiditySensorImpl extends AbstractHomekitAccessoryImpl impl
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new HumiditySensorService(this));
+        addService(new HumiditySensorService(this));
     }
 
     @Override
index e3895545c8212a043066309831cfaf457b61d3f2..dcca031e0c913aefd186a29fc7f50f7611c8fed1 100644 (file)
@@ -28,10 +28,8 @@ import io.github.hapjava.characteristics.impl.common.IsConfiguredCharacteristic;
 import io.github.hapjava.characteristics.impl.common.IsConfiguredEnum;
 import io.github.hapjava.characteristics.impl.inputsource.CurrentVisibilityStateCharacteristic;
 import io.github.hapjava.characteristics.impl.inputsource.CurrentVisibilityStateEnum;
-import io.github.hapjava.characteristics.impl.inputsource.InputDeviceTypeCharacteristic;
 import io.github.hapjava.characteristics.impl.inputsource.InputSourceTypeCharacteristic;
 import io.github.hapjava.characteristics.impl.inputsource.InputSourceTypeEnum;
-import io.github.hapjava.characteristics.impl.inputsource.TargetVisibilityStateCharacteristic;
 import io.github.hapjava.services.impl.InputSourceService;
 
 /**
@@ -78,18 +76,16 @@ public class HomekitInputSourceImpl extends AbstractHomekitAccessoryImpl {
                         () -> CompletableFuture.completedFuture(CurrentVisibilityStateEnum.SHOWN), v -> {
                         }, () -> {
                         }));
-        var identifierCharacteristic = getCharacteristic(IdentifierCharacteristic.class)
-                .orElseGet(() -> new IdentifierCharacteristic(() -> CompletableFuture.completedFuture(1)));
 
         var service = new InputSourceService(configuredNameCharacteristic, inputSourceTypeCharacteristic,
                 isConfiguredCharacteristic, currentVisibilityStateCharacteristic);
 
-        service.addOptionalCharacteristic(identifierCharacteristic);
-        getCharacteristic(InputDeviceTypeCharacteristic.class).ifPresent(c -> service.addOptionalCharacteristic(c));
-        getCharacteristic(TargetVisibilityStateCharacteristic.class)
-                .ifPresent(c -> service.addOptionalCharacteristic(c));
+        var identifierCharacteristic = getCharacteristic(IdentifierCharacteristic.class);
+        if (identifierCharacteristic.isEmpty()) {
+            service.addOptionalCharacteristic(new IdentifierCharacteristic(() -> CompletableFuture.completedFuture(1)));
+        }
 
-        getServices().add(service);
+        addService(service);
     }
 
     @Override
index efc31cf0e4dbff10f80a38829899bea510fd1593..b24b762ad63ee8843f665d7cd38bde51c8c7ff2e 100644 (file)
@@ -55,7 +55,7 @@ public class HomekitIrrigationSystemImpl extends AbstractHomekitAccessoryImpl im
         inUseMapping = createMapping(HomekitCharacteristicType.INUSE_STATUS, InUseEnum.class);
         programModeMap = HomekitCharacteristicFactory
                 .createMapping(getCharacteristic(HomekitCharacteristicType.PROGRAM_MODE).get(), ProgramModeEnum.class);
-        getServices().add(new IrrigationSystemService(this));
+        addService(new IrrigationSystemService(this));
     }
 
     @Override
@@ -73,7 +73,7 @@ public class HomekitIrrigationSystemImpl extends AbstractHomekitAccessoryImpl im
         final var finalEnum = serviceLabelEnum;
         var serviceLabelNamespace = getCharacteristic(ServiceLabelNamespaceCharacteristic.class).orElseGet(
                 () -> new ServiceLabelNamespaceCharacteristic(() -> CompletableFuture.completedFuture(finalEnum)));
-        getServices().add(new ServiceLabelService(serviceLabelNamespace));
+        addService(new ServiceLabelService(serviceLabelNamespace));
     }
 
     @Override
index 577fa9b577f114e8a676b4960836207254da437b..5f59cd761413db2bbde37a2a39ba8e4553c56ced 100644 (file)
@@ -44,7 +44,7 @@ public class HomekitLeakSensorImpl extends AbstractHomekitAccessoryImpl implemen
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new LeakSensorService(this));
+        addService(new LeakSensorService(this));
     }
 
     @Override
index 491733e78d39b85e52bf4cb7c6c035bdb49a50c1..193970725822f818c54d26f5f7167b35c3ee4078 100644 (file)
@@ -46,7 +46,7 @@ public class HomekitLightSensorImpl extends AbstractHomekitAccessoryImpl impleme
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new LightSensorService(this));
+        addService(new LightSensorService(this));
     }
 
     @Override
index b769c9c018a50a52693d50f754093f2712f97cf6..b1c63c1383bd04eaf727a6e0a45cce67d6eb2480 100644 (file)
@@ -44,7 +44,7 @@ class HomekitLightbulbImpl extends AbstractHomekitAccessoryImpl implements Light
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new LightbulbService(this));
+        addService(new LightbulbService(this));
     }
 
     @Override
index 80736a73c2182c5e7184c9d538dd3f5d8a040ace..bec2026480e43e3f579c73e6d3ab585fdb9ad95b 100644 (file)
@@ -49,7 +49,7 @@ public class HomekitLockImpl extends AbstractHomekitAccessoryImpl implements Loc
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new LockMechanismService(this));
+        addService(new LockMechanismService(this));
     }
 
     @Override
index 81c9ce05dab226443a0559608c8dd4c15f02d03c..d1bcfb65c943833dbbdb23f90be40550b5c83c19 100644 (file)
@@ -42,7 +42,7 @@ public class HomekitMicrophoneImpl extends AbstractHomekitAccessoryImpl implemen
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new MicrophoneService(this));
+        addService(new MicrophoneService(this));
     }
 
     @Override
index 174bb81866ab5fa51d77b43d958f2a77b9b4d34f..9503c29c097140d64845865fafa69f0311a9f099 100644 (file)
@@ -41,7 +41,7 @@ public class HomekitMotionSensorImpl extends AbstractHomekitAccessoryImpl implem
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new MotionSensorService(this));
+        addService(new MotionSensorService(this));
     }
 
     @Override
index 59d3aebbcbb7c01b93959ffbd8958ca3925a547a..ae821158b97eba894071768babfe1a39d2f5e28f 100644 (file)
@@ -44,7 +44,7 @@ public class HomekitOccupancySensorImpl extends AbstractHomekitAccessoryImpl imp
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new OccupancySensorService(this));
+        addService(new OccupancySensorService(this));
     }
 
     @Override
index b7d32a3b01442d66086be83dcf72a6dfcf2b3793..4e8dc1c921276f50fe6f1d3301a32f6eb6ed1310 100644 (file)
@@ -43,7 +43,7 @@ public class HomekitOutletImpl extends AbstractHomekitAccessoryImpl implements O
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new OutletService(this));
+        addService(new OutletService(this));
     }
 
     @Override
index 7b21582cdea6bac8c869943a8f129c7c21a69b5f..23d83b1e84dde206eb7498d169525c5166666a1e 100644 (file)
@@ -59,7 +59,7 @@ public class HomekitSecuritySystemImpl extends AbstractHomekitAccessoryImpl impl
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new SecuritySystemService(this));
+        addService(new SecuritySystemService(this));
     }
 
     @Override
index f39a17b2c5937d288a35602001352116f59a585f..6d5c379039670667328fe0ef212ff8fa7b3fa76b 100644 (file)
@@ -49,7 +49,7 @@ public class HomekitSlatImpl extends AbstractHomekitAccessoryImpl implements Sla
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new SlatService(this));
+        addService(new SlatService(this));
     }
 
     @Override
index ae1704f099b05aa5d7a6dc4bdba6c704c754ae26..8cbbf588e2f03e96e15f004b92dc9aca489d46e5 100644 (file)
@@ -48,7 +48,7 @@ public class HomekitSmartSpeakerImpl extends AbstractHomekitAccessoryImpl implem
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new SmartSpeakerService(this));
+        addService(new SmartSpeakerService(this));
     }
 
     @Override
index bf4a0661c0a49ae967b652c52c15b43efcc6a033..e1295e6e13e0114b018810fd18a51a64219f48ef 100644 (file)
@@ -44,7 +44,7 @@ public class HomekitSmokeSensorImpl extends AbstractHomekitAccessoryImpl impleme
     @Override
     public void init() throws HomekitException {
         super.init();
-        this.getServices().add(new SmokeSensorService(this));
+        addService(new SmokeSensorService(this));
     }
 
     @Override
index 98732de9016d562be2ad1145c152576333e9df43..2a0d9eb95c5e685c6bdf77125ebe9ca690206fb1 100644 (file)
@@ -42,7 +42,7 @@ public class HomekitSpeakerImpl extends AbstractHomekitAccessoryImpl implements
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new SpeakerService(this));
+        addService(new SpeakerService(this));
     }
 
     @Override
index 9e7ab5d157ff02218d62fc227088996dfd60744a..6dbc1f6808442d9ce579e6918272c5592e44d6e5 100644 (file)
@@ -43,7 +43,7 @@ public class HomekitSwitchImpl extends AbstractHomekitAccessoryImpl implements S
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new SwitchService(this));
+        addService(new SwitchService(this));
     }
 
     @Override
index 10ce819421d82eee7725366293d3dfe26e9c1621..433a36f85e8941a4fb75ddeb1ced964a2979517c 100644 (file)
@@ -24,15 +24,9 @@ import org.openhab.io.homekit.internal.HomekitTaggedItem;
 import io.github.hapjava.characteristics.impl.common.ActiveCharacteristic;
 import io.github.hapjava.characteristics.impl.common.ActiveIdentifierCharacteristic;
 import io.github.hapjava.characteristics.impl.common.ConfiguredNameCharacteristic;
-import io.github.hapjava.characteristics.impl.lightbulb.BrightnessCharacteristic;
-import io.github.hapjava.characteristics.impl.television.ClosedCaptionsCharacteristic;
-import io.github.hapjava.characteristics.impl.television.CurrentMediaStateCharacteristic;
-import io.github.hapjava.characteristics.impl.television.PictureModeCharacteristic;
-import io.github.hapjava.characteristics.impl.television.PowerModeCharacteristic;
 import io.github.hapjava.characteristics.impl.television.RemoteKeyCharacteristic;
 import io.github.hapjava.characteristics.impl.television.SleepDiscoveryModeCharacteristic;
 import io.github.hapjava.characteristics.impl.television.SleepDiscoveryModeEnum;
-import io.github.hapjava.characteristics.impl.television.TargetMediaStateCharacteristic;
 import io.github.hapjava.services.impl.TelevisionService;
 
 /**
@@ -81,13 +75,6 @@ public class HomekitTelevisionImpl extends AbstractHomekitAccessoryImpl {
                 activeIdentifierCharacteristic, configuredNameCharacteristic, remoteKeyCharacteristic,
                 sleepDiscoveryModeCharacteristic);
 
-        getCharacteristic(BrightnessCharacteristic.class).ifPresent(c -> service.addOptionalCharacteristic(c));
-        getCharacteristic(PowerModeCharacteristic.class).ifPresent(c -> service.addOptionalCharacteristic(c));
-        getCharacteristic(ClosedCaptionsCharacteristic.class).ifPresent(c -> service.addOptionalCharacteristic(c));
-        getCharacteristic(CurrentMediaStateCharacteristic.class).ifPresent(c -> service.addOptionalCharacteristic(c));
-        getCharacteristic(TargetMediaStateCharacteristic.class).ifPresent(c -> service.addOptionalCharacteristic(c));
-        getCharacteristic(PictureModeCharacteristic.class).ifPresent(c -> service.addOptionalCharacteristic(c));
-
-        getServices().add(service);
+        addService(service);
     }
 }
index 5df1bb3463c543feade303beff475c412a47533f..f3cbd23645f61c921f38adeadc5429ca6cd33afd 100644 (file)
@@ -13,7 +13,6 @@
 package org.openhab.io.homekit.internal.accessories;
 
 import java.util.List;
-import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
@@ -25,7 +24,6 @@ import org.openhab.io.homekit.internal.HomekitTaggedItem;
 
 import io.github.hapjava.characteristics.impl.audio.MuteCharacteristic;
 import io.github.hapjava.characteristics.impl.audio.VolumeCharacteristic;
-import io.github.hapjava.characteristics.impl.common.ActiveCharacteristic;
 import io.github.hapjava.characteristics.impl.televisionspeaker.VolumeControlTypeCharacteristic;
 import io.github.hapjava.characteristics.impl.televisionspeaker.VolumeControlTypeEnum;
 import io.github.hapjava.characteristics.impl.televisionspeaker.VolumeSelectorCharacteristic;
@@ -61,6 +59,8 @@ public class HomekitTelevisionSpeakerImpl extends AbstractHomekitAccessoryImpl {
         var volumeCharacteristic = getCharacteristic(VolumeCharacteristic.class);
         var volumeSelectorCharacteristic = getCharacteristic(VolumeSelectorCharacteristic.class);
 
+        var service = new TelevisionSpeakerService(muteCharacteristic);
+
         if (volumeControlTypeCharacteristic.isEmpty()) {
             VolumeControlTypeEnum type;
             if (volumeCharacteristic.isPresent()) {
@@ -70,18 +70,12 @@ public class HomekitTelevisionSpeakerImpl extends AbstractHomekitAccessoryImpl {
             } else {
                 type = VolumeControlTypeEnum.NONE;
             }
-            volumeControlTypeCharacteristic = Optional
-                    .of(new VolumeControlTypeCharacteristic(() -> CompletableFuture.completedFuture(type), v -> {
+            service.addOptionalCharacteristic(
+                    new VolumeControlTypeCharacteristic(() -> CompletableFuture.completedFuture(type), v -> {
                     }, () -> {
                     }));
         }
 
-        var service = new TelevisionSpeakerService(muteCharacteristic);
-
-        getCharacteristic(ActiveCharacteristic.class).ifPresent(c -> service.addOptionalCharacteristic(c));
-        volumeCharacteristic.ifPresent(c -> service.addOptionalCharacteristic(c));
-        service.addOptionalCharacteristic(volumeControlTypeCharacteristic.get());
-
-        getServices().add(service);
+        addService(service);
     }
 }
index bf024b57e2b57a7b77801ca6c8d838054b25452d..84e0da9428f71dbd484003e04435ed3e2130095d 100644 (file)
@@ -44,7 +44,7 @@ class HomekitTemperatureSensorImpl extends AbstractHomekitAccessoryImpl implemen
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new TemperatureSensorService(this));
+        addService(new TemperatureSensorService(this));
     }
 
     @Override
index c851570316e3e082419a62aa916baeed6ff6a0c6..fab0d0ce5a2107f77bb655d0144763db3bf20c9b 100644 (file)
@@ -73,7 +73,7 @@ class HomekitThermostatImpl extends AbstractHomekitAccessoryImpl implements Ther
     @Override
     public void init() throws HomekitException {
         super.init();
-        this.getServices().add(new ThermostatService(this));
+        addService(new ThermostatService(this));
     }
 
     @Override
index 479f9a12961cd5b77f0453243c51578972c86cc4..aede260fa6a5055da144b3517fe7411ecdb04b66 100644 (file)
@@ -87,8 +87,11 @@ public class HomekitValveImpl extends AbstractHomekitAccessoryImpl implements Va
     public void init() throws HomekitException {
         super.init();
         ValveService service = new ValveService(this);
-        getServices().add(service);
-        if (homekitTimer) {
+        addService(service);
+
+        var remainingDurationCharacteristic = getCharacteristic(RemainingDurationCharacteristic.class);
+
+        if (homekitTimer && remainingDurationCharacteristic.isEmpty()) {
             addRemainingDurationCharacteristic(getRootAccessory(), getUpdater(), service);
         }
         String valveTypeConfig = getAccessoryConfiguration(CONFIG_VALVE_TYPE, "GENERIC");
index dfe1b6ac519900a274d1ad3798e0937c48fa1271..b4a3440819cc9f634efb8030aec905978857613f 100644 (file)
@@ -41,7 +41,7 @@ public class HomekitWindowCoveringImpl extends AbstractHomekitPositionAccessoryI
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new WindowCoveringService(this));
+        addService(new WindowCoveringService(this));
     }
 
     @Override
index 21bf0e44e7ebf8834b63d8c59ca32748bfee657b..87c8d360b454c4044a06a4d42e4ba97cc8652be4 100644 (file)
@@ -41,7 +41,7 @@ public class HomekitWindowImpl extends AbstractHomekitPositionAccessoryImpl impl
     @Override
     public void init() throws HomekitException {
         super.init();
-        getServices().add(new WindowService(this));
+        addService(new WindowService(this));
     }
 
     @Override