diff --git a/bundles/org.openhab.io.homekit/README.md b/bundles/org.openhab.io.homekit/README.md index 552cd6adf0507..8e111423ecdec 100644 --- a/bundles/org.openhab.io.homekit/README.md +++ b/bundles/org.openhab.io.homekit/README.md @@ -439,10 +439,9 @@ The HomeKit valve accessory supports following 2 optional characteristics: - duration: this describes how long the valve should set "InUse" once it is activated. The duration changes will apply to the next operation. If valve is already active then duration changes have no effect. -- remaining duration: this describes the remaining duration on the valve. Notifications on this characteristic must only - be used if the remaining duration increases/decreases from the accessoryʼs usual countdown of remaining duration. +- remaining duration: this describes the remaining duration on the valve. Notifications on this characteristic must only be used if the remaining duration increases/decreases from the accessoryʼs usual countdown of remaining duration. -Upon valve activation in home app, home app starts to count down from the "duration" to "0" without contacting the server. Home app also does not trigger any acion if it remaining duration get 0. +Upon valve activation in home app, home app starts to count down from the "duration" to "0" without contacting the server. Home app also does not trigger any action if it remaining duration get 0. It is up to valve to have an own timer and stop valve once the timer is over. Some valves have such timer, e.g. pretty common for sprinklers. In case the valve has no timer capability, OpenHAB can take care on this - start an internal timer and send "Off" command to the valve once the timer is over. diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/Homekit.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/Homekit.java index 825775ce9edb7..5f87a4a4a0348 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/Homekit.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/Homekit.java @@ -31,9 +31,9 @@ public interface Homekit { * Refreshes the saved authentication info from the underlying storage service. If you * make changes to the saved authentication info, call this. * - * @throws IOException + * @throws IOException exception in case new auth info could not be published via mDNS */ - public void refreshAuthInfo() throws IOException; + void refreshAuthInfo() throws IOException; /** * HomeKit requests normally require authentication via the pairing mechanism. Use this @@ -52,5 +52,5 @@ public interface Homekit { /** * clear all pairings with HomeKit clients */ - public void clearHomekitPairings(); + void clearHomekitPairings(); } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/Debouncer.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/Debouncer.java index 380d539cf6811..d3d99a384a69c 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/Debouncer.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/Debouncer.java @@ -55,7 +55,7 @@ class Debouncer { * @param scheduler The scheduler implementation to use * @param delay The time after which to invoke action; each time [[Debouncer.call]] is invoked, this delay is * reset - * @param Clock The source from which we get the current time. This input should use the same source. Specified + * @param clock The source from which we get the current time. This input should use the same source. Specified * for testing purposes * @param action The action to invoke */ diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitAccessoryRegistry.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitAccessoryRegistry.java index e242a63bcd3ad..cce21e7c57bd5 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitAccessoryRegistry.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitAccessoryRegistry.java @@ -30,7 +30,6 @@ * @author Andy Lintner - Initial contribution */ class HomekitAccessoryRegistry { - private @Nullable HomekitRoot bridge; private final Map createdAccessories = new HashMap<>(); private int configurationRevision = 1; @@ -98,7 +97,6 @@ public synchronized void addRootAccessory(String itemName, HomekitAccessory acce if (bridge != null) { bridge.addAccessory(accessory); } - logger.trace("Added accessory {}", accessory.getId()); } public Map getAllAccessories() { diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitAccessoryUpdater.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitAccessoryUpdater.java index b3a259f04a295..40cf89dd976b5 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitAccessoryUpdater.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitAccessoryUpdater.java @@ -15,6 +15,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.smarthome.core.items.GenericItem; import org.eclipse.smarthome.core.items.Item; import org.eclipse.smarthome.core.items.StateChangeListener; @@ -33,7 +34,7 @@ * @author Andy Lintner - Initial contribution */ public class HomekitAccessoryUpdater { - private Logger logger = LoggerFactory.getLogger(HomekitAccessoryUpdater.class); + private final Logger logger = LoggerFactory.getLogger(HomekitAccessoryUpdater.class); private final ConcurrentMap subscriptionsByName = new ConcurrentHashMap<>(); public void subscribe(GenericItem item, HomekitCharacteristicChangeCallback callback) { @@ -78,7 +79,8 @@ public void unsubscribe(GenericItem item, String key) { } @FunctionalInterface - private static interface Subscription extends StateChangeListener { + @NonNullByDefault + private interface Subscription extends StateChangeListener { @Override void stateChanged(Item item, State oldState, State newState); @@ -90,8 +92,8 @@ default void stateUpdated(Item item, State state) { } private static class ItemKey { - public GenericItem item; - public String key; + public final GenericItem item; + public final String key; public ItemKey(GenericItem item, String key) { this.item = item; diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitAuthInfoImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitAuthInfoImpl.java index b387f7113dee5..ce63d789d27f5 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitAuthInfoImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitAuthInfoImpl.java @@ -34,6 +34,11 @@ */ public class HomekitAuthInfoImpl implements HomekitAuthInfo { private final Logger logger = LoggerFactory.getLogger(HomekitAuthInfoImpl.class); + public static final String STORAGE_KEY = "homekit"; + private static final String STORAGE_MAC = "mac"; + private static final String STORAGE_SALT = "salt"; + private static final String STORAGE_PRIVATE_KEY = "privateKey"; + private static final String STORAGE_USER_PREFIX = "user_"; private final Storage storage; private String mac; @@ -41,7 +46,7 @@ public class HomekitAuthInfoImpl implements HomekitAuthInfo { private byte[] privateKey; private final String pin; - public HomekitAuthInfoImpl(final Storage storage, final String pin) throws InvalidAlgorithmParameterException { + public HomekitAuthInfoImpl(Storage storage, String pin) throws InvalidAlgorithmParameterException { this.storage = storage; this.pin = pin; initializeStorage(); @@ -49,6 +54,7 @@ public HomekitAuthInfoImpl(final Storage storage, final String pin) throws Inval @Override public void createUser(String username, byte[] publicKey) { + logger.trace("Create user {}", username); storage.put(createUserKey(username), Base64.getEncoder().encodeToString(publicKey)); } @@ -84,16 +90,18 @@ public byte[] getUserPublicKey(String username) { @Override public void removeUser(String username) { + logger.trace("Remove user {}", username); storage.remove(createUserKey(username)); } @Override public boolean hasUser() { Collection keys = storage.getKeys(); - return keys.stream().filter(k -> isUserKey(k)).count() > 0; + return keys.stream().anyMatch(this::isUserKey); } public void clear() { + logger.trace("Clear all users"); for (String key : new HashSet<>(storage.getKeys())) { if (isUserKey(key)) { storage.remove(key); @@ -101,37 +109,34 @@ public void clear() { } } - private String createUserKey(final String username) { - return "user_" + username; + private String createUserKey(String username) { + return STORAGE_USER_PREFIX + username; } - private boolean isUserKey(final String key) { - return key.startsWith("user_"); + private boolean isUserKey(String key) { + return key.startsWith(STORAGE_USER_PREFIX); } private void initializeStorage() throws InvalidAlgorithmParameterException { - mac = storage.get("mac"); - @Nullable - Object saltConfig = storage.get("salt"); - @Nullable - Object privateKeyConfig = storage.get("privateKey"); - + mac = storage.get(STORAGE_MAC); + final @Nullable Object saltConfig = storage.get(STORAGE_SALT); + final @Nullable Object privateKeyConfig = storage.get(STORAGE_PRIVATE_KEY); if (mac == null) { logger.warn( "Could not find existing MAC in {}. Generating new MAC. This will require re-pairing of iOS devices.", storage.getClass().getName()); mac = HomekitServer.generateMac(); - storage.put("mac", mac); + storage.put(STORAGE_MAC, mac); } if (saltConfig == null) { salt = HomekitServer.generateSalt(); - storage.put("salt", salt.toString()); + storage.put(STORAGE_SALT, salt.toString()); } else { salt = new BigInteger(saltConfig.toString()); } if (privateKeyConfig == null) { privateKey = HomekitServer.generateKey(); - storage.put("privateKey", Base64.getEncoder().encodeToString(privateKey)); + storage.put(STORAGE_PRIVATE_KEY, Base64.getEncoder().encodeToString(privateKey)); } else { privateKey = Base64.getDecoder().decode(privateKeyConfig.toString()); } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitChangeListener.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitChangeListener.java index 39a944255e7cd..055e8777c5509 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitChangeListener.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitChangeListener.java @@ -16,7 +16,6 @@ import java.time.Duration; import java.util.Collection; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -24,6 +23,7 @@ import java.util.Set; import java.util.concurrent.ScheduledExecutorService; +import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.smarthome.core.common.ThreadPoolManager; import org.eclipse.smarthome.core.items.GroupItem; import org.eclipse.smarthome.core.items.Item; @@ -46,6 +46,7 @@ * * @author Andy Lintner - Initial contribution */ +@NonNullByDefault public class HomekitChangeListener implements ItemRegistryChangeListener { private final Logger logger = LoggerFactory.getLogger(HomekitChangeListener.class); private final static String REVISION_CONFIG = "revision"; @@ -58,7 +59,7 @@ public class HomekitChangeListener implements ItemRegistryChangeListener { private HomekitSettings settings; private int lastAccessoryCount; - private Set pendingUpdates = new HashSet<>(); + private final Set pendingUpdates = new HashSet<>(); private final ScheduledExecutorService scheduler = ThreadPoolManager .getScheduledPool(ThreadPoolManager.THREAD_POOL_NAME_COMMON); @@ -74,16 +75,16 @@ public class HomekitChangeListener implements ItemRegistryChangeListener { private final Debouncer applyUpdatesDebouncer; HomekitChangeListener(ItemRegistry itemRegistry, HomekitSettings settings, MetadataRegistry metadataRegistry, - final StorageService storageService) { + StorageService storageService) { this.itemRegistry = itemRegistry; this.settings = settings; this.metadataRegistry = metadataRegistry; - storage = storageService.getStorage("homekit"); + storage = storageService.getStorage(HomekitAuthInfoImpl.STORAGE_KEY); this.applyUpdatesDebouncer = new Debouncer("update-homekit-devices", scheduler, Duration.ofMillis(1000), Clock.systemUTC(), this::applyUpdates); itemRegistry.addRegistryChangeListener(this); - itemRegistry.getItems().stream().forEach(this::createRootAccessories); + itemRegistry.getItems().forEach(this::createRootAccessories); initialiseRevision(); logger.info("Created {} HomeKit items.", accessoryRegistry.getAllAccessories().size()); } @@ -91,14 +92,14 @@ public class HomekitChangeListener implements ItemRegistryChangeListener { private void initialiseRevision() { int revision; try { - revision = Integer.valueOf(storage.get(REVISION_CONFIG)); - } catch (java.lang.NumberFormatException e) { + revision = Integer.parseInt(storage.get(REVISION_CONFIG)); + } catch (NumberFormatException e) { revision = 1; storage.put(REVISION_CONFIG, "" + revision); } try { - lastAccessoryCount = Integer.valueOf(storage.get(ACCESSORY_COUNT)); - } catch (java.lang.NumberFormatException e) { + lastAccessoryCount = Integer.parseInt(storage.get(ACCESSORY_COUNT)); + } catch (NumberFormatException e) { lastAccessoryCount = 0; storage.put(ACCESSORY_COUNT, "" + accessoryRegistry.getAllAccessories().size()); } @@ -122,7 +123,7 @@ public void allItemsChanged(Collection oldItemNames) { * @param item The item that has been changed or removed. */ private synchronized void markDirty(Item item) { - logger.trace("Mark dirty item {}", item.getLabel()); + logger.trace("Mark dirty item {}", item.getName()); pendingUpdates.add(item.getName()); /* * If findMyAccessoryGroups fails because the accessory group has already been deleted, then we can count on a @@ -131,7 +132,6 @@ private synchronized void markDirty(Item item) { for (Item accessoryGroup : HomekitAccessoryFactory.getAccessoryGroups(item, itemRegistry, metadataRegistry)) { pendingUpdates.add(accessoryGroup.getName()); } - applyUpdatesDebouncer.call(); } @@ -159,10 +159,7 @@ public void makeNewConfigurationRevision() { private synchronized void applyUpdates() { logger.trace("apply updates"); - Iterator iter = pendingUpdates.iterator(); - - while (iter.hasNext()) { - String name = iter.next(); + for (final String name : pendingUpdates) { accessoryRegistry.remove(name); logger.trace(" add items {}", name); getItemOptional(name).ifPresent(this::createRootAccessories); @@ -220,26 +217,23 @@ public int getConfigurationRevision() { * creates one or more HomeKit items for given openhab item. * one openhab item can linked to several HomeKit accessories or characteristics. * - * @param item + * @param item openhab item */ private void createRootAccessories(Item item) { - logger.trace("create root accessory {}", item.getLabel()); final List> accessoryTypes = HomekitAccessoryFactory .getAccessoryTypes(item, metadataRegistry); final List groups = HomekitAccessoryFactory.getAccessoryGroups(item, itemRegistry, metadataRegistry); if (!accessoryTypes.isEmpty() && groups.stream().noneMatch(g -> g.getBaseItem() != null)) { // it has homekit accessory type and is not part of bigger homekit group item without baseItem, i.e. not // Group:Switch - logger.trace("Item {} is a HomeKit accessory of types {}", item.getName(), accessoryTypes); final HomekitOHItemProxy itemProxy = new HomekitOHItemProxy(item); - accessoryTypes.stream().forEach(rootAccessory -> createRootAccessory(new HomekitTaggedItem(itemProxy, + accessoryTypes.forEach(rootAccessory -> createRootAccessory(new HomekitTaggedItem(itemProxy, rootAccessory.getKey(), HomekitAccessoryFactory.getItemConfiguration(item, metadataRegistry)))); } } private void createRootAccessory(HomekitTaggedItem taggedItem) { try { - logger.trace("Adding HomeKit device {}", taggedItem.getItem().getUID()); accessoryRegistry.addRootAccessory(taggedItem.getName(), HomekitAccessoryFactory.create(taggedItem, metadataRegistry, updater, settings)); } catch (HomekitException e) { diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitCommandExtension.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitCommandExtension.java index aca612686324e..4be5f1701771c 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitCommandExtension.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitCommandExtension.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.concurrent.ExecutionException; +import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.smarthome.io.console.Console; import org.eclipse.smarthome.io.console.extensions.AbstractConsoleCommandExtension; import org.eclipse.smarthome.io.console.extensions.ConsoleCommandExtension; @@ -31,6 +32,7 @@ * @author Andy Lintner - Initial contribution */ @Component(service = ConsoleCommandExtension.class) +@NonNullByDefault public class HomekitCommandExtension extends AbstractConsoleCommandExtension { private static final String SUBCMD_CLEAR_PAIRINGS = "clearPairings"; private static final String SUBCMD_LIST_ACCESSORIES = "list"; @@ -42,7 +44,8 @@ public class HomekitCommandExtension extends AbstractConsoleCommandExtension { private static final String LEGACY_SUBCMD_PRINT_ACCESSORY = "printAccessory"; private final Logger logger = LoggerFactory.getLogger(HomekitCommandExtension.class); - private Homekit homekit; + + private @NonNullByDefault({}) Homekit homekit; public HomekitCommandExtension() { super("homekit", "Interact with the HomeKit integration."); @@ -59,7 +62,7 @@ public void execute(String[] args, Console console) { case SUBCMD_ALLOW_UNAUTHENTICATED: if (args.length > 1) { - boolean allow = Boolean.valueOf(args[1]); + boolean allow = Boolean.parseBoolean(args[1]); allowUnauthenticatedHomekitRequests(allow, console); } else { console.println("true/false is required as an argument"); @@ -110,10 +113,6 @@ public void setHomekit(Homekit homekit) { this.homekit = homekit; } - public void unsetHomekit(Homekit homekit) { - this.homekit = null; - } - private void clearHomekitPairings(Console console) { homekit.clearHomekitPairings(); console.println("Cleared HomeKit pairings"); @@ -125,7 +124,7 @@ private void allowUnauthenticatedHomekitRequests(boolean allow, Console console) } private void listAccessories(Console console) { - homekit.getAccessories().stream().forEach(v -> { + homekit.getAccessories().forEach(v -> { try { console.println(v.getId() + " " + v.getName().get()); } catch (InterruptedException | ExecutionException e) { @@ -144,9 +143,7 @@ private void printAccessory(String id, Console console) { v.getServices().forEach(s -> { console.println(" Service Type: " + s.getType()); console.println(" Characteristics: "); - s.getCharacteristics().forEach(c -> { - console.println(" : " + c.getClass()); - }); + s.getCharacteristics().forEach(c -> console.println(" : " + c.getClass())); }); console.println(""); } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitCommandType.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitCommandType.java index 0c48aad8908a2..6b6b4ab72fd4b 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitCommandType.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitCommandType.java @@ -26,5 +26,5 @@ public enum HomekitCommandType { HUE_COMMAND, SATURATION_COMMAND, BRIGHTNESS_COMMAND, - ON_COMMAND; + ON_COMMAND } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitException.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitException.java index 71c722f01f26e..0815bfb03f7b7 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitException.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitException.java @@ -12,11 +12,14 @@ */ package org.openhab.io.homekit.internal; +import org.eclipse.jdt.annotation.NonNullByDefault; + /** * The {@link HomekitException} class defines an exception for handling HomekitException * * @author Jan N. Klug - Initial contribution */ +@NonNullByDefault public class HomekitException extends Exception { private static final long serialVersionUID = -8178227920946730286L; diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitImpl.java index 85478165a95ad..a195bf28efd9e 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitImpl.java @@ -14,7 +14,6 @@ import java.io.IOException; import java.net.InetAddress; -import java.net.UnknownHostException; import java.security.InvalidAlgorithmParameterException; import java.util.ArrayList; import java.util.List; @@ -30,7 +29,6 @@ import org.eclipse.smarthome.core.items.ItemRegistry; import org.eclipse.smarthome.core.items.MetadataRegistry; import org.eclipse.smarthome.core.net.NetworkAddressService; -import org.eclipse.smarthome.core.storage.Storage; import org.eclipse.smarthome.core.storage.StorageService; import org.openhab.io.homekit.Homekit; import org.osgi.framework.Constants; @@ -59,9 +57,7 @@ ConfigurableService.SERVICE_PROPERTY_LABEL + "=HomeKit Integration", "port:Integer=9123" }) @NonNullByDefault public class HomekitImpl implements Homekit { - private final Logger logger = LoggerFactory.getLogger(HomekitImpl.class); - private final Storage storage; private final NetworkAddressService networkAddressService; private final HomekitChangeListener changeListener; @@ -69,7 +65,7 @@ public class HomekitImpl implements Homekit { private @Nullable InetAddress networkInterface; private @Nullable HomekitServer homekitServer; private @Nullable HomekitRoot bridge; - private @Nullable HomekitAuthInfoImpl authInfo; + private final HomekitAuthInfoImpl authInfo; private final ScheduledExecutorService scheduler = ThreadPoolManager .getScheduledPool(ThreadPoolManager.THREAD_POOL_NAME_COMMON); @@ -78,14 +74,14 @@ public class HomekitImpl implements Homekit { public HomekitImpl(@Reference StorageService storageService, @Reference ItemRegistry itemRegistry, @Reference NetworkAddressService networkAddressService, Map config, @Reference MetadataRegistry metadataRegistry) throws IOException, InvalidAlgorithmParameterException { - this.storage = storageService.getStorage("homekit"); this.networkAddressService = networkAddressService; this.settings = processConfig(config); this.changeListener = new HomekitChangeListener(itemRegistry, settings, metadataRegistry, storageService); + authInfo = new HomekitAuthInfoImpl(storageService.getStorage(HomekitAuthInfoImpl.STORAGE_KEY), settings.pin); startHomekitServer(); } - private HomekitSettings processConfig(Map config) throws UnknownHostException { + private HomekitSettings processConfig(Map config) { HomekitSettings settings = (new Configuration(config)).as(HomekitSettings.class); settings.process(); if (settings.networkInterface == null) { @@ -109,14 +105,13 @@ protected synchronized void modified(Map config) { stopBridge(); startBridge(); } - } catch (IOException | InvalidAlgorithmParameterException e) { + } catch (IOException e) { logger.warn("Could not initialize HomeKit connector: {}", e.getMessage()); - return; } } private void stopBridge() { - final HomekitRoot bridge = this.bridge; + final @Nullable HomekitRoot bridge = this.bridge; if (bridge != null) { changeListener.unsetBridge(); bridge.stop(); @@ -124,10 +119,9 @@ private void stopBridge() { } } - private void startBridge() throws InvalidAlgorithmParameterException, IOException { - final HomekitServer homekitServer = this.homekitServer; + private void startBridge() throws IOException { + final @Nullable HomekitServer homekitServer = this.homekitServer; if (homekitServer != null && bridge == null) { - authInfo = new HomekitAuthInfoImpl(storage, settings.pin); final HomekitRoot bridge = homekitServer.createBridge(authInfo, settings.name, HomekitSettings.MANUFACTURER, HomekitSettings.MODEL, HomekitSettings.SERIAL_NUMBER, FrameworkUtil.getBundle(getClass()).getVersion().toString(), HomekitSettings.HARDWARE_REVISION); @@ -158,7 +152,7 @@ private void startBridge() throws InvalidAlgorithmParameterException, IOExceptio } } - private void startHomekitServer() throws InvalidAlgorithmParameterException, IOException { + private void startHomekitServer() throws IOException { if (homekitServer == null) { networkInterface = InetAddress.getByName(settings.networkInterface); homekitServer = new HomekitServer(networkInterface, settings.port); @@ -169,7 +163,7 @@ private void startHomekitServer() throws InvalidAlgorithmParameterException, IOE } private void stopHomekitServer() { - final HomekitServer homekit = this.homekitServer; + final @Nullable HomekitServer homekit = this.homekitServer; if (homekit != null) { if (bridge != null) { stopBridge(); @@ -188,7 +182,7 @@ protected void deactivate() { @Override public void refreshAuthInfo() throws IOException { - final HomekitRoot bridge = this.bridge; + final @Nullable HomekitRoot bridge = this.bridge; if (bridge != null) { bridge.refreshAuthInfo(); } @@ -196,7 +190,7 @@ public void refreshAuthInfo() throws IOException { @Override public void allowUnauthenticatedRequests(boolean allow) { - final HomekitRoot bridge = this.bridge; + final @Nullable HomekitRoot bridge = this.bridge; if (bridge != null) { bridge.allowUnauthenticatedRequests(allow); } @@ -204,16 +198,14 @@ public void allowUnauthenticatedRequests(boolean allow) { @Override public List getAccessories() { - return new ArrayList(this.changeListener.getAccessories().values()); + return new ArrayList<>(this.changeListener.getAccessories().values()); } @Override public void clearHomekitPairings() { try { - if (authInfo != null) { - authInfo.clear(); - refreshAuthInfo(); - } + authInfo.clear(); + refreshAuthInfo(); } catch (Exception e) { logger.warn("Could not clear HomeKit pairings", e); } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitOHItemProxy.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitOHItemProxy.java index 842c2118543a1..b5b46d34de8fc 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitOHItemProxy.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitOHItemProxy.java @@ -53,12 +53,12 @@ public class HomekitOHItemProxy { private final Map commandCache = new ConcurrentHashMap<>(); private final ScheduledExecutorService scheduler = ThreadPoolManager .getScheduledPool(ThreadPoolManager.THREAD_POOL_NAME_COMMON); - private @Nullable ScheduledFuture future; + private @NonNullByDefault({}) ScheduledFuture future; private HomekitDimmerMode dimmerMode = DIMMER_MODE_NORMAL; // delay, how long wait for further commands. in ms. private int delay = DEFAULT_DELAY; - public HomekitOHItemProxy(final Item item) { + public HomekitOHItemProxy(Item item) { this.item = item; } @@ -128,7 +128,7 @@ private void sendCommand() { commandCache.clear(); } - public synchronized void sendCommandProxy(final HomekitCommandType commandType, final State state) { + public synchronized void sendCommandProxy(HomekitCommandType commandType, State state) { commandCache.put(commandType, state); logger.trace("add command to command cache: item {}, command type {}, command state {}. cache state after: {}", this, commandType, state, commandCache); diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitTaggedItem.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitTaggedItem.java index 44f9d2c0fbc48..cf825054af5d3 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitTaggedItem.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitTaggedItem.java @@ -51,10 +51,10 @@ public class HomekitTaggedItem { private final HomekitAccessoryType homekitAccessoryType; // type of HomeKit characteristic, e.g. CurrentTemperature - private @Nullable HomekitCharacteristicType homekitCharacteristicType; + private HomekitCharacteristicType homekitCharacteristicType; // configuration attached to the openHAB Item, e.g. minValue, maxValue, valveType - private @Nullable Map configuration; + private final @Nullable Map configuration; // link to the groupItem if item is part of a group private @Nullable GroupItem parentGroupItem; @@ -78,14 +78,13 @@ public HomekitTaggedItem(HomekitOHItemProxy item, HomekitAccessoryType homekitAc } public HomekitTaggedItem(HomekitOHItemProxy item, HomekitAccessoryType homekitAccessoryType, - @Nullable HomekitCharacteristicType homekitCharacteristicType, - @Nullable Map configuration) { + HomekitCharacteristicType homekitCharacteristicType, @Nullable Map configuration) { this(item, homekitAccessoryType, configuration); this.homekitCharacteristicType = homekitCharacteristicType; } public HomekitTaggedItem(HomekitOHItemProxy item, HomekitAccessoryType homekitAccessoryType, - @Nullable HomekitCharacteristicType homekitCharacteristicType, @Nullable GroupItem parentGroup, + HomekitCharacteristicType homekitCharacteristicType, @Nullable GroupItem parentGroup, @Nullable Map configuration) { this(item, homekitAccessoryType, homekitCharacteristicType, configuration); this.parentGroupItem = parentGroup; @@ -100,7 +99,7 @@ public HomekitAccessoryType getAccessoryType() { return homekitAccessoryType; } - public @Nullable HomekitCharacteristicType getCharacteristicType() { + public HomekitCharacteristicType getCharacteristicType() { return homekitCharacteristicType; } @@ -123,7 +122,7 @@ public boolean isAccessory() { * root deviceGroup. */ public boolean isCharacteristic() { - return homekitCharacteristicType != null && homekitCharacteristicType != HomekitCharacteristicType.EMPTY; + return homekitCharacteristicType != HomekitCharacteristicType.EMPTY; } /** @@ -189,10 +188,10 @@ public boolean isMemberOfAccessoryGroup() { * @param expected class * @return value */ - @SuppressWarnings("unchecked") + @SuppressWarnings({ "null", "unchecked" }) public T getConfiguration(String key, T defaultValue) { if (configuration != null) { - final Object value = configuration.get(key); + final @Nullable Object value = configuration.get(key); if (value != null && value.getClass().equals(defaultValue.getClass())) { return (T) value; } @@ -216,11 +215,11 @@ public double getConfigurationAsDouble(String key, double defaultValue) { */ private void parseConfiguration() { if (configuration != null) { - Object dimmerModeConfig = configuration.get(DIMMER_MODE); + final @Nullable Object dimmerModeConfig = configuration.get(DIMMER_MODE); if (dimmerModeConfig instanceof String) { HomekitDimmerMode.valueOfTag((String) dimmerModeConfig).ifPresent(proxyItem::setDimmerMode); } - Object delayConfig = configuration.get(DELAY); + final @Nullable Object delayConfig = configuration.get(DELAY); if (delayConfig instanceof Number) { proxyItem.setDelay(((Number) delayConfig).intValue()); } @@ -250,7 +249,7 @@ private int calculateId(Item item) { } public String toString() { - return "Item:" + proxyItem + " HomeKit type:" + homekitAccessoryType + " HomeKit characteristic:" + return "Item:" + proxyItem.getItem() + " HomeKit type:" + homekitAccessoryType + " HomeKit characteristic:" + homekitCharacteristicType; } } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/AbstractHomekitAccessoryImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/AbstractHomekitAccessoryImpl.java index 7722d0bc54ad8..c9f75610da641 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/AbstractHomekitAccessoryImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/AbstractHomekitAccessoryImpl.java @@ -25,10 +25,12 @@ import javax.measure.Quantity; import javax.measure.Unit; -import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.smarthome.core.items.GenericItem; import org.eclipse.smarthome.core.items.Item; +import org.eclipse.smarthome.core.library.types.OnOffType; +import org.eclipse.smarthome.core.library.types.OpenClosedType; import org.eclipse.smarthome.core.library.types.StringType; import org.eclipse.smarthome.core.library.unit.ImperialUnits; import org.eclipse.smarthome.core.library.unit.SIUnits; @@ -59,7 +61,7 @@ abstract class AbstractHomekitAccessoryImpl implements HomekitAccessory { private final List services; public AbstractHomekitAccessoryImpl(HomekitTaggedItem accessory, List characteristics, - HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { + HomekitAccessoryUpdater updater, HomekitSettings settings) { this.characteristics = characteristics; this.accessory = accessory; this.updater = updater; @@ -67,6 +69,7 @@ public AbstractHomekitAccessoryImpl(HomekitTaggedItem accessory, List getCharacteristic(HomekitCharacteristicType type) { return characteristics.stream().filter(c -> c.getCharacteristicType() == type).findAny(); } @@ -122,6 +125,7 @@ protected HomekitSettings getSettings() { return settings; } + @NonNullByDefault protected void subscribe(HomekitCharacteristicType characteristicType, HomekitCharacteristicChangeCallback callback) { final Optional characteristic = getCharacteristic(characteristicType); @@ -132,6 +136,7 @@ protected void subscribe(HomekitCharacteristicType characteristicType, } } + @NonNullByDefault protected void unsubscribe(HomekitCharacteristicType characteristicType) { final Optional characteristic = getCharacteristic(characteristicType); if (characteristic.isPresent()) { @@ -146,7 +151,7 @@ protected void unsubscribe(HomekitCharacteristicType characteristicType) { if (taggedItem.isPresent()) { final State state = taggedItem.get().getItem().getStateAs(type); if (state != null) { - return (T) state.as(type); + return state.as(type); } } logger.debug("State for characteristic {} at accessory {} cannot be retrieved.", characteristic, @@ -154,21 +159,23 @@ protected void unsubscribe(HomekitCharacteristicType characteristicType) { return null; } - @SuppressWarnings("unchecked") - protected @Nullable T getItem(HomekitCharacteristicType characteristic, Class type) { + @NonNullByDefault + protected Optional getItem(HomekitCharacteristicType characteristic, Class type) { final Optional taggedItem = getCharacteristic(characteristic); if (taggedItem.isPresent()) { - if (type.isInstance(taggedItem.get().getItem())) - return (T) taggedItem.get().getItem(); - else + final Item item = taggedItem.get().getItem(); + if (type.isInstance(item)) { + return Optional.of((T) item); + } else { logger.warn("Unsupported item type for characteristic {} at accessory {}. Expected {}, got {}", - characteristic, accessory.getItem().getLabel(), type, taggedItem.get().getItem().getClass()); + characteristic, accessory.getItem().getName(), type, taggedItem.get().getItem().getClass()); + } } else { logger.warn("Mandatory characteristic {} not found at accessory {}. ", characteristic, - accessory.getItem().getLabel()); + accessory.getItem().getName()); } - return null; + return Optional.empty(); } /** @@ -181,7 +188,8 @@ protected void unsubscribe(HomekitCharacteristicType characteristicType) { * @param expected type * @return configuration value */ - protected T getAccessoryConfiguration(@NonNull String key, @NonNull T defaultValue) { + @NonNullByDefault + protected T getAccessoryConfiguration(String key, T defaultValue) { return accessory.getConfiguration(key, defaultValue); } @@ -196,10 +204,11 @@ protected T getAccessoryConfiguration(@NonNull String key, @NonNull T defaul * @param expected type * @return configuration value */ - protected T getAccessoryConfiguration(@NonNull HomekitCharacteristicType characteristicType, - @NonNull String key, @NonNull T defaultValue) { - final Optional characteristic = getCharacteristic(characteristicType); - return characteristic.isPresent() ? characteristic.get().getConfiguration(key, defaultValue) : defaultValue; + @NonNullByDefault + protected T getAccessoryConfiguration(HomekitCharacteristicType characteristicType, String key, + T defaultValue) { + return getCharacteristic(characteristicType) + .map(homekitTaggedItem -> homekitTaggedItem.getConfiguration(key, defaultValue)).orElse(defaultValue); } /** @@ -210,6 +219,7 @@ protected T getAccessoryConfiguration(@NonNull HomekitCharacteristicType cha * @param characteristicType characteristicType to identify item * @param map mapping to update */ + @NonNullByDefault protected void updateMapping(HomekitCharacteristicType characteristicType, Map map) { getCharacteristic(characteristicType).ifPresent(c -> { final Map configuration = c.getConfiguration(); @@ -232,8 +242,9 @@ protected void updateMapping(HomekitCharacteristicType characteristicType, Map type of the result derived from * @return key for the value */ - protected T getKeyFromMapping(final HomekitCharacteristicType characteristicType, Map mapping, - final T defaultValue) { + @NonNullByDefault + protected T getKeyFromMapping(HomekitCharacteristicType characteristicType, Map mapping, + T defaultValue) { final Optional c = getCharacteristic(characteristicType); if (c.isPresent()) { final State state = c.get().getItem().getState(); @@ -253,23 +264,36 @@ protected T getKeyFromMapping(final HomekitCharacteristicType characteristic return defaultValue; } + @NonNullByDefault protected void addCharacteristic(HomekitTaggedItem characteristic) { characteristics.add(characteristic); } + @NonNullByDefault private > double convertAndRound(double value, Unit from, Unit to) { double rawValue = from == to ? value : from.getConverterTo(to).convert(value); return new BigDecimal(rawValue).setScale(1, RoundingMode.HALF_UP).doubleValue(); } + @NonNullByDefault protected double convertToCelsius(double degrees) { return convertAndRound(degrees, getSettings().useFahrenheitTemperature ? ImperialUnits.FAHRENHEIT : SIUnits.CELSIUS, SIUnits.CELSIUS); } + @NonNullByDefault protected double convertFromCelsius(double degrees) { return convertAndRound(degrees, getSettings().useFahrenheitTemperature ? SIUnits.CELSIUS : ImperialUnits.FAHRENHEIT, ImperialUnits.FAHRENHEIT); } + + @NonNullByDefault + protected BooleanItemReader createBooleanReader(HomekitCharacteristicType characteristicType, + OnOffType trueOnOffValue, OpenClosedType trueOpenClosedValue) throws IncompleteAccessoryException { + return new BooleanItemReader( + getItem(characteristicType, GenericItem.class) + .orElseThrow(() -> new IncompleteAccessoryException(characteristicType)), + trueOnOffValue, trueOpenClosedValue); + } } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/BooleanItemReader.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/BooleanItemReader.java index 3c64b7b832659..2bdc5cd0a978a 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/BooleanItemReader.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/BooleanItemReader.java @@ -12,6 +12,7 @@ */ package org.openhab.io.homekit.internal.accessories; +import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.smarthome.core.items.GroupItem; import org.eclipse.smarthome.core.items.Item; import org.eclipse.smarthome.core.library.items.ContactItem; @@ -30,11 +31,11 @@ * @author Tim Harper - Initial contribution * */ +@NonNullByDefault public class BooleanItemReader { private final Item item; private final OnOffType trueOnOffValue; private final OpenClosedType trueOpenClosedValue; - private final Logger logger = LoggerFactory.getLogger(BooleanItemReader.class); /** @@ -53,8 +54,8 @@ public class BooleanItemReader { } } - Boolean getValue() { - State state = item.getState(); + boolean getValue() { + final State state = item.getState(); if (state instanceof OnOffType) { return state.equals(trueOnOffValue); } else if (state instanceof OpenClosedType) { @@ -62,15 +63,22 @@ Boolean getValue() { } else if (state instanceof StringType) { return state.toString().equalsIgnoreCase("Open") || state.toString().equalsIgnoreCase("Opened"); } else { - return null; + logger.debug("Unexpected item state, returning false. Item {}, State {}", item.getName(), state); + return false; } } + private OnOffType getOffValue(OnOffType onValue) { + return onValue == OnOffType.ON ? OnOffType.OFF : OnOffType.ON; + } + void setValue(Boolean value) { if (item instanceof SwitchItem) { - ((SwitchItem) item).send(OnOffType.from(value)); + ((SwitchItem) item).send(value ? trueOnOffValue : getOffValue(trueOnOffValue)); } else if (item instanceof GroupItem) { - ((GroupItem) item).send(OnOffType.from(value)); + ((GroupItem) item).send(value ? trueOnOffValue : getOffValue(trueOnOffValue)); + } else { + logger.debug("Cannot set value {} for item {}. Only Switch and Group items are supported.", value, item); } } } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitAccessoryFactory.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitAccessoryFactory.java index 46b294a01f6ba..2d30d8d3fb794 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitAccessoryFactory.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitAccessoryFactory.java @@ -168,7 +168,7 @@ public class HomekitAccessoryFactory { public static HomekitAccessory create(HomekitTaggedItem taggedItem, MetadataRegistry metadataRegistry, HomekitAccessoryUpdater updater, HomekitSettings settings) throws HomekitException { final HomekitAccessoryType accessoryType = taggedItem.getAccessoryType(); - logger.trace("Constructing {} of accessoryType {}", taggedItem.getName(), accessoryType.getTag()); + logger.trace("Constructing {} of accessory type {}", taggedItem.getName(), accessoryType.getTag()); final List requiredCharacteristics = getMandatoryCharacteristics(taggedItem, metadataRegistry); final HomekitCharacteristicType[] mandatoryCharacteristics = MANDATORY_CHARACTERISTICS.get(accessoryType); @@ -178,10 +178,8 @@ public static HomekitAccessory create(HomekitTaggedItem taggedItem, MetadataRegi throw new HomekitException("Missing mandatory characteristics"); } AbstractHomekitAccessoryImpl accessoryImpl; - try { - @Nullable - final Class accessoryImplClass = SERVICE_IMPL_MAP + final @Nullable Class accessoryImplClass = SERVICE_IMPL_MAP .get(accessoryType); if (accessoryImplClass != null) { accessoryImpl = accessoryImplClass @@ -211,11 +209,9 @@ public static HomekitAccessory create(HomekitTaggedItem taggedItem, MetadataRegi public static List> getAccessoryTypes(Item item, MetadataRegistry metadataRegistry) { final List> accessories = new ArrayList<>(); - Metadata metadata = metadataRegistry.get(new MetadataKey(METADATA_KEY, item.getUID())); + final @Nullable Metadata metadata = metadataRegistry.get(new MetadataKey(METADATA_KEY, item.getUID())); boolean legacyMode = metadata == null; String[] tags = !legacyMode ? metadata.getValue().split(",") : item.getTags().toArray(new String[0]); // fallback - - logger.trace("item {} meta data {} tags {} ", item.getName(), metadata, tags); for (String tag : tags) { final String[] meta = tag.split("\\."); Optional accessoryType = HomekitAccessoryType.valueOfTag(meta[0].trim()); @@ -246,7 +242,7 @@ public static List> getAc } public static @Nullable Map getItemConfiguration(Item item, MetadataRegistry metadataRegistry) { - Metadata metadata = metadataRegistry.get(new MetadataKey(METADATA_KEY, item.getUID())); + final @Nullable Metadata metadata = metadataRegistry.get(new MetadataKey(METADATA_KEY, item.getUID())); return metadata != null ? metadata.getConfiguration() : null; } @@ -261,7 +257,7 @@ public static List> getAc public static List getAccessoryGroups(Item item, ItemRegistry itemRegistry, MetadataRegistry metadataRegistry) { return item.getGroupNames().stream().flatMap(name -> { - Item groupItem = itemRegistry.get(name); + final @Nullable Item groupItem = itemRegistry.get(name); if ((groupItem instanceof GroupItem) && ((GroupItem) groupItem).getBaseItem() == null) { return Stream.of((GroupItem) groupItem); } else { @@ -280,8 +276,6 @@ public static List getAccessoryGroups(Item item, ItemRegistry itemReg */ private static List getMandatoryCharacteristics(HomekitTaggedItem taggedItem, MetadataRegistry metadataRegistry) { - logger.trace("get mandatory characteristics for item {}: isGroup? {}, isMember? {}", taggedItem.getName(), - taggedItem.isGroup(), taggedItem.isMemberOfAccessoryGroup()); List collectedCharacteristics = new ArrayList<>(); if (taggedItem.isGroup()) { for (Item item : ((GroupItem) taggedItem.getItem()).getAllMembers()) { @@ -290,6 +284,8 @@ private static List getMandatoryCharacteristics(HomekitTagged } else { addMandatoryCharacteristics(taggedItem, collectedCharacteristics, taggedItem.getItem(), metadataRegistry); } + logger.trace("Mandatory characteristics for item {} characteristics {}", taggedItem.getName(), + collectedCharacteristics); return collectedCharacteristics; } @@ -305,7 +301,6 @@ private static List getMandatoryCharacteristics(HomekitTagged * @param item current item * @param metadataRegistry meta date registry */ - @SuppressWarnings("null") private static void addMandatoryCharacteristics(HomekitTaggedItem mainItem, List characteristics, Item item, MetadataRegistry metadataRegistry) { // get list of mandatory characteristics @@ -353,8 +348,8 @@ private static void addMandatoryCharacteristics(HomekitTaggedItem mainItem, List * @param accessory accessory * @param metadataRegistry metadata registry */ - private static void addOptionalCharacteristics(final HomekitTaggedItem taggedItem, - AbstractHomekitAccessoryImpl accessory, MetadataRegistry metadataRegistry) { + private static void addOptionalCharacteristics(HomekitTaggedItem taggedItem, AbstractHomekitAccessoryImpl accessory, + MetadataRegistry metadataRegistry) { Map characteristics = getOptionalCharacteristics( accessory.getRootAccessory(), metadataRegistry); Service service = accessory.getPrimaryService(); @@ -363,7 +358,6 @@ private static void addOptionalCharacteristics(final HomekitTaggedItem taggedIte // an accessory can have multiple optional characteristics. iterate over them. characteristics.forEach((type, item) -> { try { - logger.trace("adding optional characteristic: {} for item {}", type.getTag(), item.getName()); // check whether a proxyItem already exists, if not create one. final HomekitOHItemProxy proxyItem = proxyItems.computeIfAbsent(item.getUID(), k -> new HomekitOHItemProxy(item)); @@ -376,11 +370,10 @@ private static void addOptionalCharacteristics(final HomekitTaggedItem taggedIte // find the corresponding add method at service and call it. service.getClass().getMethod("addOptionalCharacteristic", characteristic.getClass()).invoke(service, characteristic); - accessory.addCharacteristic(optionalItem); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | HomekitException e) { - logger.warn("Not supported optional HomeKit characteristic. Service type {}, characteristic type {}", - service.getType(), type.getTag(), e); + logger.warn("Unsupported optional HomeKit characteristic: service type {}, characteristic type {}", + service.getType(), type.getTag()); } }); } @@ -392,11 +385,8 @@ private static void addOptionalCharacteristics(final HomekitTaggedItem taggedIte * @param metadataRegistry OH metadata registry * @return a map with characteristics and corresponding OH items */ - @SuppressWarnings("null") private static Map getOptionalCharacteristics(HomekitTaggedItem taggedItem, MetadataRegistry metadataRegistry) { - logger.trace("get optional characteristics for item {}: isGroup? {}, isMember? {}", taggedItem.getName(), - taggedItem.isGroup(), taggedItem.isMemberOfAccessoryGroup()); Map characteristicItems = new HashMap<>(); if (taggedItem.isGroup()) { GroupItem groupItem = (GroupItem) taggedItem.getItem(); @@ -419,7 +409,8 @@ private static Map getOptionalCharacteri (GenericItem) taggedItem.getItem())); } } - logger.trace("characteristics for {} = {}", taggedItem.getName(), characteristicItems); + logger.trace("Optional characteristics for item {} characteristics {}", taggedItem.getName(), + characteristicItems); return Collections.unmodifiableMap(characteristicItems); } @@ -430,10 +421,9 @@ private static Map getOptionalCharacteri * @param characteristic characteristic * @return true if characteristic is mandatory, false if not mandatory */ - @SuppressWarnings("null") private static boolean isMandatoryCharacteristic(HomekitAccessoryType accessory, HomekitCharacteristicType characteristic) { - return MANDATORY_CHARACTERISTICS.get(accessory) != null + return MANDATORY_CHARACTERISTICS.containsKey(accessory) && Arrays.asList(MANDATORY_CHARACTERISTICS.get(accessory)).contains(characteristic); } @@ -443,21 +433,19 @@ private static boolean isMandatoryCharacteristic(HomekitAccessoryType accessory, * @param accessory accessory * @return true if accessory has not characteristic. */ - @SuppressWarnings("null") private static boolean isRootAccessory(Entry accessory) { return ((accessory.getValue() == null) || (accessory.getValue() == EMPTY)); } /** * check whether it is legacy characteristic and return new name in such case. otherwise return the input parameter - * unchangec. + * unchanged. * * @param characteristicType characteristic to check * @return new characteristic type */ - @SuppressWarnings("null") - private static HomekitCharacteristicType legacyCheck(final HomekitCharacteristicType characteristicType) { - if (LEGACY_CHARACTERISTICS_MAPPING.get(characteristicType) != null) + private static HomekitCharacteristicType legacyCheck(HomekitCharacteristicType characteristicType) { + if (LEGACY_CHARACTERISTICS_MAPPING.containsKey(characteristicType)) return LEGACY_CHARACTERISTICS_MAPPING.get(characteristicType); return characteristicType; } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCarbonDioxideSensorImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCarbonDioxideSensorImpl.java index 751612da57cbb..d92ec76a08708 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCarbonDioxideSensorImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCarbonDioxideSensorImpl.java @@ -12,14 +12,14 @@ */ package org.openhab.io.homekit.internal.accessories; +import static org.openhab.io.homekit.internal.HomekitCharacteristicType.CARBON_DIOXIDE_DETECTED_STATE; + import java.util.List; import java.util.concurrent.CompletableFuture; -import org.eclipse.smarthome.core.items.GenericItem; import org.eclipse.smarthome.core.library.types.OnOffType; import org.eclipse.smarthome.core.library.types.OpenClosedType; import org.openhab.io.homekit.internal.HomekitAccessoryUpdater; -import org.openhab.io.homekit.internal.HomekitCharacteristicType; import org.openhab.io.homekit.internal.HomekitSettings; import org.openhab.io.homekit.internal.HomekitTaggedItem; @@ -34,36 +34,31 @@ */ public class HomekitCarbonDioxideSensorImpl extends AbstractHomekitAccessoryImpl implements CarbonDioxideSensorAccessory { - private final BooleanItemReader carbonDioxideDetectedReader; public HomekitCarbonDioxideSensorImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { super(taggedItem, mandatoryCharacteristics, updater, settings); - this.carbonDioxideDetectedReader = new BooleanItemReader( - getItem(HomekitCharacteristicType.CARBON_DIOXIDE_DETECTED_STATE, GenericItem.class), OnOffType.ON, + carbonDioxideDetectedReader = createBooleanReader(CARBON_DIOXIDE_DETECTED_STATE, OnOffType.ON, OpenClosedType.OPEN); getServices().add(new CarbonDioxideSensorService(this)); } @Override public CompletableFuture getCarbonDioxideDetectedState() { - Boolean state = this.carbonDioxideDetectedReader.getValue(); - if (state == null) { - return CompletableFuture.completedFuture(CarbonDioxideDetectedEnum.NORMAL); - } return CompletableFuture - .completedFuture(state ? CarbonDioxideDetectedEnum.ABNORMAL : CarbonDioxideDetectedEnum.NORMAL); + .completedFuture(carbonDioxideDetectedReader.getValue() ? CarbonDioxideDetectedEnum.ABNORMAL + : CarbonDioxideDetectedEnum.NORMAL); } @Override public void subscribeCarbonDioxideDetectedState(HomekitCharacteristicChangeCallback callback) { - subscribe(HomekitCharacteristicType.CARBON_DIOXIDE_DETECTED_STATE, callback); + subscribe(CARBON_DIOXIDE_DETECTED_STATE, callback); } @Override public void unsubscribeCarbonDioxideDetectedState() { - unsubscribe(HomekitCharacteristicType.CARBON_DIOXIDE_DETECTED_STATE); + unsubscribe(CARBON_DIOXIDE_DETECTED_STATE); } } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCarbonMonoxideSensorImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCarbonMonoxideSensorImpl.java index e6b75d8f9dc37..5625161cbd872 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCarbonMonoxideSensorImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCarbonMonoxideSensorImpl.java @@ -12,14 +12,14 @@ */ package org.openhab.io.homekit.internal.accessories; +import static org.openhab.io.homekit.internal.HomekitCharacteristicType.CARBON_MONOXIDE_DETECTED_STATE; + import java.util.List; import java.util.concurrent.CompletableFuture; -import org.eclipse.smarthome.core.items.GenericItem; import org.eclipse.smarthome.core.library.types.OnOffType; import org.eclipse.smarthome.core.library.types.OpenClosedType; import org.openhab.io.homekit.internal.HomekitAccessoryUpdater; -import org.openhab.io.homekit.internal.HomekitCharacteristicType; import org.openhab.io.homekit.internal.HomekitSettings; import org.openhab.io.homekit.internal.HomekitTaggedItem; @@ -34,36 +34,31 @@ */ public class HomekitCarbonMonoxideSensorImpl extends AbstractHomekitAccessoryImpl implements CarbonMonoxideSensorAccessory { - private final BooleanItemReader carbonMonoxideDetectedReader; public HomekitCarbonMonoxideSensorImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { super(taggedItem, mandatoryCharacteristics, updater, settings); - this.carbonMonoxideDetectedReader = new BooleanItemReader( - getItem(HomekitCharacteristicType.CARBON_MONOXIDE_DETECTED_STATE, GenericItem.class), OnOffType.ON, + carbonMonoxideDetectedReader = createBooleanReader(CARBON_MONOXIDE_DETECTED_STATE, OnOffType.ON, OpenClosedType.OPEN); getServices().add(new CarbonMonoxideSensorService(this)); } @Override public CompletableFuture getCarbonMonoxideDetectedState() { - Boolean state = this.carbonMonoxideDetectedReader.getValue(); - if (state == null) { - return CompletableFuture.completedFuture(null); - } return CompletableFuture - .completedFuture(state ? CarbonMonoxideDetectedEnum.ABNORMAL : CarbonMonoxideDetectedEnum.NORMAL); + .completedFuture(carbonMonoxideDetectedReader.getValue() ? CarbonMonoxideDetectedEnum.ABNORMAL + : CarbonMonoxideDetectedEnum.NORMAL); } @Override public void subscribeCarbonMonoxideDetectedState(HomekitCharacteristicChangeCallback callback) { - subscribe(HomekitCharacteristicType.CARBON_MONOXIDE_DETECTED_STATE, callback); + subscribe(CARBON_MONOXIDE_DETECTED_STATE, callback); } @Override public void unsubscribeCarbonMonoxideDetectedState() { - unsubscribe(HomekitCharacteristicType.CARBON_MONOXIDE_DETECTED_STATE); + unsubscribe(CARBON_MONOXIDE_DETECTED_STATE); } } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCharacteristicFactory.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCharacteristicFactory.java index 64c3f946a07f9..d9a7a04bede64 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCharacteristicFactory.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitCharacteristicFactory.java @@ -136,10 +136,10 @@ public class HomekitCharacteristicFactory { * @param updater update to keep OH item and HomeKit characteristic in sync * @return HomeKit characteristic */ - public static Characteristic createCharacteristic(final HomekitTaggedItem item, HomekitAccessoryUpdater updater) + public static Characteristic createCharacteristic(HomekitTaggedItem item, HomekitAccessoryUpdater updater) throws HomekitException { final @Nullable HomekitCharacteristicType type = item.getCharacteristicType(); - logger.trace("createCharacteristic, type {} item {}", type, item); + logger.trace("CreateCharacteristic, type {} item {}", type, item); if (optional.containsKey(type)) { return optional.get(type).apply(item, updater); } @@ -151,8 +151,7 @@ public static Characteristic createCharacteristic(final HomekitTaggedItem item, // METHODS TO CREATE SINGLE CHARACTERISTIC FROM OH ITEM // supporting methods - @SuppressWarnings("null") - private static CompletableFuture getEnumFromItem(final HomekitTaggedItem item, + private static CompletableFuture getEnumFromItem(HomekitTaggedItem item, T offEnum, T onEnum, T defaultEnum) { final State state = item.getItem().getState(); if (state instanceof OnOffType) { @@ -160,7 +159,7 @@ private static CompletableFuture getEnumFromIt } else if (state instanceof OpenClosedType) { return CompletableFuture.completedFuture(state.equals(OpenClosedType.CLOSED) ? offEnum : onEnum); } else if (state instanceof DecimalType) { - return CompletableFuture.completedFuture(state.as(DecimalType.class).intValue() == 0 ? offEnum : onEnum); + return CompletableFuture.completedFuture(((DecimalType) state).intValue() == 0 ? offEnum : onEnum); } else if (state instanceof UnDefType) { return CompletableFuture.completedFuture(defaultEnum); } @@ -170,7 +169,7 @@ private static CompletableFuture getEnumFromIt return CompletableFuture.completedFuture(defaultEnum); } - private static void setValueFromEnum(final HomekitTaggedItem taggedItem, CharacteristicEnum value, + private static void setValueFromEnum(HomekitTaggedItem taggedItem, CharacteristicEnum value, CharacteristicEnum offEnum, CharacteristicEnum onEnum) { if (taggedItem.getItem() instanceof SwitchItem) { if (value.equals(offEnum)) { @@ -189,14 +188,13 @@ private static void setValueFromEnum(final HomekitTaggedItem taggedItem, Charact } } - @SuppressWarnings("null") - private static int getIntFromItem(final HomekitTaggedItem taggedItem) { + private static int getIntFromItem(HomekitTaggedItem taggedItem) { int value = 0; final State state = taggedItem.getItem().getState(); if (state instanceof PercentType) { - value = state.as(PercentType.class).intValue(); + value = ((PercentType) state).intValue(); } else if (state instanceof DecimalType) { - value = state.as(DecimalType.class).intValue(); + value = ((DecimalType) state).intValue(); } else if (state instanceof UnDefType) { logger.debug("Item state {} is UNDEF {}.", state, taggedItem.getName()); } else { @@ -207,11 +205,11 @@ private static int getIntFromItem(final HomekitTaggedItem taggedItem) { return value; } - private static Supplier> getIntSupplier(final HomekitTaggedItem taggedItem) { + private static Supplier> getIntSupplier(HomekitTaggedItem taggedItem) { return () -> CompletableFuture.completedFuture(getIntFromItem(taggedItem)); } - private static ExceptionalConsumer setIntConsumer(final HomekitTaggedItem taggedItem) { + private static ExceptionalConsumer setIntConsumer(HomekitTaggedItem taggedItem) { return (value) -> { if (taggedItem.getItem() instanceof NumberItem) { ((NumberItem) taggedItem.getItem()).send(new DecimalType(value)); @@ -222,7 +220,7 @@ private static ExceptionalConsumer setIntConsumer(final HomekitTaggedIt }; } - private static ExceptionalConsumer setPercentConsumer(final HomekitTaggedItem taggedItem) { + private static ExceptionalConsumer setPercentConsumer(HomekitTaggedItem taggedItem) { return (value) -> { if (taggedItem.getItem() instanceof NumberItem) { ((NumberItem) taggedItem.getItem()).send(new DecimalType(value)); @@ -235,14 +233,14 @@ private static ExceptionalConsumer setPercentConsumer(final HomekitTagg }; } - private static Supplier> getDoubleSupplier(final HomekitTaggedItem taggedItem) { + private static Supplier> getDoubleSupplier(HomekitTaggedItem taggedItem) { return () -> { - final DecimalType value = taggedItem.getItem().getStateAs(DecimalType.class); + final @Nullable DecimalType value = taggedItem.getItem().getStateAs(DecimalType.class); return CompletableFuture.completedFuture(value != null ? value.doubleValue() : 0.0); }; } - private static ExceptionalConsumer setDoubleConsumer(final HomekitTaggedItem taggedItem) { + private static ExceptionalConsumer setDoubleConsumer(HomekitTaggedItem taggedItem) { return (value) -> { if (taggedItem.getItem() instanceof NumberItem) { ((NumberItem) taggedItem.getItem()).send(new DecimalType(value)); @@ -253,19 +251,19 @@ private static ExceptionalConsumer setDoubleConsumer(final HomekitTagged }; } - protected static Consumer getSubscriber(final HomekitTaggedItem taggedItem, - final HomekitCharacteristicType key, final HomekitAccessoryUpdater updater) { + protected static Consumer getSubscriber(HomekitTaggedItem taggedItem, + HomekitCharacteristicType key, HomekitAccessoryUpdater updater) { return (callback) -> updater.subscribe((GenericItem) taggedItem.getItem(), key.getTag(), callback); } - protected static Runnable getUnsubscriber(final HomekitTaggedItem taggedItem, final HomekitCharacteristicType key, - final HomekitAccessoryUpdater updater) { + protected static Runnable getUnsubscriber(HomekitTaggedItem taggedItem, HomekitCharacteristicType key, + HomekitAccessoryUpdater updater) { return () -> updater.unsubscribe((GenericItem) taggedItem.getItem(), key.getTag()); } // create method for characteristic - private static StatusLowBatteryCharacteristic createStatusLowBatteryCharacteristic( - final HomekitTaggedItem taggedItem, final HomekitAccessoryUpdater updater) { + private static StatusLowBatteryCharacteristic createStatusLowBatteryCharacteristic(HomekitTaggedItem taggedItem, + HomekitAccessoryUpdater updater) { return new StatusLowBatteryCharacteristic( () -> getEnumFromItem(taggedItem, StatusLowBatteryEnum.NORMAL, StatusLowBatteryEnum.LOW, StatusLowBatteryEnum.NORMAL), @@ -273,16 +271,16 @@ private static StatusLowBatteryCharacteristic createStatusLowBatteryCharacterist getUnsubscriber(taggedItem, BATTERY_LOW_STATUS, updater)); } - private static StatusFaultCharacteristic createStatusFaultCharacteristic(final HomekitTaggedItem taggedItem, - final HomekitAccessoryUpdater updater) { + private static StatusFaultCharacteristic createStatusFaultCharacteristic(HomekitTaggedItem taggedItem, + HomekitAccessoryUpdater updater) { return new StatusFaultCharacteristic( () -> getEnumFromItem(taggedItem, StatusFaultEnum.NO_FAULT, StatusFaultEnum.GENERAL_FAULT, StatusFaultEnum.NO_FAULT), getSubscriber(taggedItem, FAULT_STATUS, updater), getUnsubscriber(taggedItem, FAULT_STATUS, updater)); } - private static StatusTamperedCharacteristic createStatusTamperedCharacteristic(final HomekitTaggedItem taggedItem, - final HomekitAccessoryUpdater updater) { + private static StatusTamperedCharacteristic createStatusTamperedCharacteristic(HomekitTaggedItem taggedItem, + HomekitAccessoryUpdater updater) { return new StatusTamperedCharacteristic( () -> getEnumFromItem(taggedItem, StatusTamperedEnum.NOT_TAMPERED, StatusTamperedEnum.TAMPERED, StatusTamperedEnum.NOT_TAMPERED), @@ -291,7 +289,7 @@ private static StatusTamperedCharacteristic createStatusTamperedCharacteristic(f } private static ObstructionDetectedCharacteristic createObstructionDetectedCharacteristic( - final HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { + HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new ObstructionDetectedCharacteristic( () -> CompletableFuture.completedFuture(taggedItem.getItem().getState() == OnOffType.ON || taggedItem.getItem().getState() == OpenClosedType.OPEN), @@ -299,7 +297,7 @@ private static ObstructionDetectedCharacteristic createObstructionDetectedCharac getUnsubscriber(taggedItem, OBSTRUCTION_STATUS, updater)); } - private static StatusActiveCharacteristic createStatusActiveCharacteristic(final HomekitTaggedItem taggedItem, + private static StatusActiveCharacteristic createStatusActiveCharacteristic(HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new StatusActiveCharacteristic( () -> CompletableFuture.completedFuture(taggedItem.getItem().getState() == OnOffType.ON @@ -307,7 +305,7 @@ private static StatusActiveCharacteristic createStatusActiveCharacteristic(final getSubscriber(taggedItem, ACTIVE_STATUS, updater), getUnsubscriber(taggedItem, ACTIVE_STATUS, updater)); } - private static NameCharacteristic createNameCharacteristic(final HomekitTaggedItem taggedItem, + private static NameCharacteristic createNameCharacteristic(HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new NameCharacteristic(() -> { final State state = taggedItem.getItem().getState(); @@ -315,71 +313,71 @@ private static NameCharacteristic createNameCharacteristic(final HomekitTaggedIt }); } - private static HoldPositionCharacteristic createHoldPositionCharacteristic(final HomekitTaggedItem taggedItem, + private static HoldPositionCharacteristic createHoldPositionCharacteristic(HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { - return new HoldPositionCharacteristic(OnOffType::from); + return new HoldPositionCharacteristic(value -> ((SwitchItem) taggedItem.getItem()).send(OnOffType.from(value))); } private static CarbonMonoxideLevelCharacteristic createCarbonMonoxideLevelCharacteristic( - final HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { + HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new CarbonMonoxideLevelCharacteristic(getDoubleSupplier(taggedItem), getSubscriber(taggedItem, CARBON_DIOXIDE_LEVEL, updater), getUnsubscriber(taggedItem, CARBON_DIOXIDE_LEVEL, updater)); } private static CarbonMonoxidePeakLevelCharacteristic createCarbonMonoxidePeakLevelCharacteristic( - final HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { + HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new CarbonMonoxidePeakLevelCharacteristic(getDoubleSupplier(taggedItem), getSubscriber(taggedItem, CARBON_DIOXIDE_PEAK_LEVEL, updater), getUnsubscriber(taggedItem, CARBON_DIOXIDE_PEAK_LEVEL, updater)); } - private static CarbonDioxideLevelCharacteristic createCarbonDioxideLevelCharacteristic( - final HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { + private static CarbonDioxideLevelCharacteristic createCarbonDioxideLevelCharacteristic(HomekitTaggedItem taggedItem, + HomekitAccessoryUpdater updater) { return new CarbonDioxideLevelCharacteristic(getDoubleSupplier(taggedItem), getSubscriber(taggedItem, CARBON_MONOXIDE_LEVEL, updater), getUnsubscriber(taggedItem, CARBON_MONOXIDE_LEVEL, updater)); } private static CarbonDioxidePeakLevelCharacteristic createCarbonDioxidePeakLevelCharacteristic( - final HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { + HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new CarbonDioxidePeakLevelCharacteristic(getDoubleSupplier(taggedItem), getSubscriber(taggedItem, CARBON_MONOXIDE_PEAK_LEVEL, updater), getUnsubscriber(taggedItem, CARBON_MONOXIDE_PEAK_LEVEL, updater)); } private static CurrentHorizontalTiltAngleCharacteristic createCurrentHorizontalTiltAngleCharacteristic( - final HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { + HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new CurrentHorizontalTiltAngleCharacteristic(getIntSupplier(taggedItem), getSubscriber(taggedItem, CURRENT_HORIZONTAL_TILT_ANGLE, updater), getUnsubscriber(taggedItem, CURRENT_HORIZONTAL_TILT_ANGLE, updater)); } private static CurrentVerticalTiltAngleCharacteristic createCurrentVerticalTiltAngleCharacteristic( - final HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { + HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new CurrentVerticalTiltAngleCharacteristic(getIntSupplier(taggedItem), getSubscriber(taggedItem, CURRENT_VERTICAL_TILT_ANGLE, updater), getUnsubscriber(taggedItem, CURRENT_VERTICAL_TILT_ANGLE, updater)); } private static TargetHorizontalTiltAngleCharacteristic createTargetHorizontalTiltAngleCharacteristic( - final HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { + HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new TargetHorizontalTiltAngleCharacteristic(getIntSupplier(taggedItem), setIntConsumer(taggedItem), getSubscriber(taggedItem, TARGET_HORIZONTAL_TILT_ANGLE, updater), getUnsubscriber(taggedItem, TARGET_HORIZONTAL_TILT_ANGLE, updater)); } private static TargetVerticalTiltAngleCharacteristic createTargetVerticalTiltAngleCharacteristic( - final HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { + HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new TargetVerticalTiltAngleCharacteristic(getIntSupplier(taggedItem), setIntConsumer(taggedItem), getSubscriber(taggedItem, TARGET_HORIZONTAL_TILT_ANGLE, updater), getUnsubscriber(taggedItem, TARGET_HORIZONTAL_TILT_ANGLE, updater)); } - private static HueCharacteristic createHueCharacteristic(final HomekitTaggedItem taggedItem, + private static HueCharacteristic createHueCharacteristic(HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new HueCharacteristic(() -> { - Double value = 0.0; + double value = 0.0; State state = taggedItem.getItem().getState(); if (state instanceof HSBType) { value = ((HSBType) state).getHue().doubleValue(); @@ -395,7 +393,7 @@ private static HueCharacteristic createHueCharacteristic(final HomekitTaggedItem }, getSubscriber(taggedItem, HUE, updater), getUnsubscriber(taggedItem, HUE, updater)); } - private static BrightnessCharacteristic createBrightnessCharacteristic(final HomekitTaggedItem taggedItem, + private static BrightnessCharacteristic createBrightnessCharacteristic(HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new BrightnessCharacteristic(() -> { int value = 0; @@ -417,10 +415,10 @@ private static BrightnessCharacteristic createBrightnessCharacteristic(final Hom }, getSubscriber(taggedItem, BRIGHTNESS, updater), getUnsubscriber(taggedItem, BRIGHTNESS, updater)); } - private static SaturationCharacteristic createSaturationCharacteristic(final HomekitTaggedItem taggedItem, + private static SaturationCharacteristic createSaturationCharacteristic(HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new SaturationCharacteristic(() -> { - Double value = 0.0; + double value = 0.0; State state = taggedItem.getItem().getState(); if (state instanceof HSBType) { value = ((HSBType) state).getSaturation().doubleValue(); @@ -439,17 +437,18 @@ private static SaturationCharacteristic createSaturationCharacteristic(final Hom }, getSubscriber(taggedItem, SATURATION, updater), getUnsubscriber(taggedItem, SATURATION, updater)); } - private static ColorTemperatureCharacteristic createColorTemperatureCharacteristic( - final HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { + private static ColorTemperatureCharacteristic createColorTemperatureCharacteristic(HomekitTaggedItem taggedItem, + HomekitAccessoryUpdater updater) { return new ColorTemperatureCharacteristic(getIntSupplier(taggedItem), setIntConsumer(taggedItem), getSubscriber(taggedItem, COLOR_TEMPERATURE, updater), getUnsubscriber(taggedItem, COLOR_TEMPERATURE, updater)); } - private static CurrentFanStateCharacteristic createCurrentFanStateCharacteristic(final HomekitTaggedItem taggedItem, + private static CurrentFanStateCharacteristic createCurrentFanStateCharacteristic(HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new CurrentFanStateCharacteristic(() -> { - final DecimalType value = taggedItem.getItem().getStateAs(DecimalType.class); + final @Nullable DecimalType value = taggedItem.getItem().getStateAs(DecimalType.class); + @Nullable CurrentFanStateEnum currentFanStateEnum = value != null ? CurrentFanStateEnum.fromCode(value.intValue()) : null; if (currentFanStateEnum == null) { @@ -460,10 +459,11 @@ private static CurrentFanStateCharacteristic createCurrentFanStateCharacteristic getUnsubscriber(taggedItem, CURRENT_FAN_STATE, updater)); } - private static TargetFanStateCharacteristic createTargetFanStateCharacteristic(final HomekitTaggedItem taggedItem, + private static TargetFanStateCharacteristic createTargetFanStateCharacteristic(HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new TargetFanStateCharacteristic(() -> { - final DecimalType value = taggedItem.getItem().getStateAs(DecimalType.class); + final @Nullable DecimalType value = taggedItem.getItem().getStateAs(DecimalType.class); + @Nullable TargetFanStateEnum targetFanStateEnum = value != null ? TargetFanStateEnum.fromCode(value.intValue()) : null; if (targetFanStateEnum == null) { @@ -481,8 +481,8 @@ private static TargetFanStateCharacteristic createTargetFanStateCharacteristic(f getUnsubscriber(taggedItem, TARGET_FAN_STATE, updater)); } - private static RotationDirectionCharacteristic createRotationDirectionCharacteristic( - final HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { + private static RotationDirectionCharacteristic createRotationDirectionCharacteristic(HomekitTaggedItem taggedItem, + HomekitAccessoryUpdater updater) { return new RotationDirectionCharacteristic( () -> getEnumFromItem(taggedItem, RotationDirectionEnum.CLOCKWISE, RotationDirectionEnum.COUNTER_CLOCKWISE, RotationDirectionEnum.CLOCKWISE), @@ -492,7 +492,7 @@ private static RotationDirectionCharacteristic createRotationDirectionCharacteri getUnsubscriber(taggedItem, ROTATION_DIRECTION, updater)); } - private static SwingModeCharacteristic createSwingModeCharacteristic(final HomekitTaggedItem taggedItem, + private static SwingModeCharacteristic createSwingModeCharacteristic(HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new SwingModeCharacteristic( () -> getEnumFromItem(taggedItem, SwingModeEnum.SWING_DISABLED, SwingModeEnum.SWING_ENABLED, @@ -503,7 +503,7 @@ private static SwingModeCharacteristic createSwingModeCharacteristic(final Homek } private static LockPhysicalControlsCharacteristic createLockPhysicalControlsCharacteristic( - final HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { + HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new LockPhysicalControlsCharacteristic( () -> getEnumFromItem(taggedItem, LockPhysicalControlsEnum.CONTROL_LOCK_DISABLED, LockPhysicalControlsEnum.CONTROL_LOCK_ENABLED, LockPhysicalControlsEnum.CONTROL_LOCK_DISABLED), @@ -512,18 +512,19 @@ private static LockPhysicalControlsCharacteristic createLockPhysicalControlsChar getSubscriber(taggedItem, LOCK_CONTROL, updater), getUnsubscriber(taggedItem, LOCK_CONTROL, updater)); } - private static RotationSpeedCharacteristic createRotationSpeedCharacteristic(final HomekitTaggedItem item, + private static RotationSpeedCharacteristic createRotationSpeedCharacteristic(HomekitTaggedItem item, HomekitAccessoryUpdater updater) { return new RotationSpeedCharacteristic(getIntSupplier(item), setPercentConsumer(item), getSubscriber(item, ROTATION_SPEED, updater), getUnsubscriber(item, ROTATION_SPEED, updater)); } - private static SetDurationCharacteristic createDurationCharacteristic(final HomekitTaggedItem taggedItem, + private static SetDurationCharacteristic createDurationCharacteristic(HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new SetDurationCharacteristic(() -> { int value = getIntFromItem(taggedItem); - if (value == 0) { // check for default duration - final Object duration = taggedItem.getConfiguration().get(HomekitValveImpl.CONFIG_DEFAULT_DURATION); + final @Nullable Map itemConfiguration = taggedItem.getConfiguration(); + if ((value == 0) && (itemConfiguration != null)) { // check for default duration + final Object duration = itemConfiguration.get(HomekitValveImpl.CONFIG_DEFAULT_DURATION); if (duration instanceof BigDecimal) { value = ((BigDecimal) duration).intValue(); if (taggedItem.getItem() instanceof NumberItem) { @@ -536,14 +537,14 @@ private static SetDurationCharacteristic createDurationCharacteristic(final Home getUnsubscriber(taggedItem, DURATION, updater)); } - private static RemainingDurationCharacteristic createRemainingDurationCharacteristic( - final HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { + private static RemainingDurationCharacteristic createRemainingDurationCharacteristic(HomekitTaggedItem taggedItem, + HomekitAccessoryUpdater updater) { return new RemainingDurationCharacteristic(getIntSupplier(taggedItem), getSubscriber(taggedItem, REMAINING_DURATION, updater), getUnsubscriber(taggedItem, REMAINING_DURATION, updater)); } - private static VolumeCharacteristic createVolumeCharacteristic(final HomekitTaggedItem taggedItem, + private static VolumeCharacteristic createVolumeCharacteristic(HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new VolumeCharacteristic(getIntSupplier(taggedItem), (volume) -> ((NumberItem) taggedItem.getItem()).send(new DecimalType(volume)), @@ -551,7 +552,7 @@ private static VolumeCharacteristic createVolumeCharacteristic(final HomekitTagg } private static CoolingThresholdTemperatureCharacteristic createCoolingThresholdCharacteristic( - final HomekitTaggedItem taggedItem, final HomekitAccessoryUpdater updater) { + HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new CoolingThresholdTemperatureCharacteristic( taggedItem.getConfigurationAsDouble(HomekitTaggedItem.MIN_VALUE, CoolingThresholdTemperatureCharacteristic.DEFAULT_MIN_VALUE), @@ -565,7 +566,7 @@ private static CoolingThresholdTemperatureCharacteristic createCoolingThresholdC } private static HeatingThresholdTemperatureCharacteristic createHeatingThresholdCharacteristic( - final HomekitTaggedItem taggedItem, final HomekitAccessoryUpdater updater) { + HomekitTaggedItem taggedItem, HomekitAccessoryUpdater updater) { return new HeatingThresholdTemperatureCharacteristic( taggedItem.getConfigurationAsDouble(HomekitTaggedItem.MIN_VALUE, HeatingThresholdTemperatureCharacteristic.DEFAULT_MIN_VALUE), diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitContactSensorImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitContactSensorImpl.java index 229a77caf5a1f..8ed9132225ca3 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitContactSensorImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitContactSensorImpl.java @@ -12,14 +12,14 @@ */ package org.openhab.io.homekit.internal.accessories; +import static org.openhab.io.homekit.internal.HomekitCharacteristicType.CONTACT_SENSOR_STATE; + import java.util.List; import java.util.concurrent.CompletableFuture; -import org.eclipse.smarthome.core.items.GenericItem; import org.eclipse.smarthome.core.library.types.OnOffType; import org.eclipse.smarthome.core.library.types.OpenClosedType; import org.openhab.io.homekit.internal.HomekitAccessoryUpdater; -import org.openhab.io.homekit.internal.HomekitCharacteristicType; import org.openhab.io.homekit.internal.HomekitSettings; import org.openhab.io.homekit.internal.HomekitTaggedItem; @@ -38,26 +38,23 @@ public class HomekitContactSensorImpl extends AbstractHomekitAccessoryImpl imple public HomekitContactSensorImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { super(taggedItem, mandatoryCharacteristics, updater, settings); - this.contactSensedReader = new BooleanItemReader( - getItem(HomekitCharacteristicType.CONTACT_SENSOR_STATE, GenericItem.class), OnOffType.ON, - OpenClosedType.OPEN); + contactSensedReader = createBooleanReader(CONTACT_SENSOR_STATE, OnOffType.ON, OpenClosedType.OPEN); getServices().add(new ContactSensorService(this)); } @Override public CompletableFuture getCurrentState() { - Boolean isOpen = contactSensedReader.getValue(); - return CompletableFuture - .completedFuture((isOpen == Boolean.TRUE) ? ContactStateEnum.NOT_DETECTED : ContactStateEnum.DETECTED); + return CompletableFuture.completedFuture( + contactSensedReader.getValue() ? ContactStateEnum.NOT_DETECTED : ContactStateEnum.DETECTED); } @Override public void subscribeContactState(HomekitCharacteristicChangeCallback callback) { - subscribe(HomekitCharacteristicType.CONTACT_SENSOR_STATE, callback); + subscribe(CONTACT_SENSOR_STATE, callback); } @Override public void unsubscribeContactState() { - unsubscribe(HomekitCharacteristicType.CONTACT_SENSOR_STATE); + unsubscribe(CONTACT_SENSOR_STATE); } } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitFanImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitFanImpl.java index 985806852c217..7da1dc98db859 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitFanImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitFanImpl.java @@ -12,15 +12,14 @@ */ package org.openhab.io.homekit.internal.accessories; +import static org.openhab.io.homekit.internal.HomekitCharacteristicType.ACTIVE_STATUS; + import java.util.List; import java.util.concurrent.CompletableFuture; -import org.eclipse.jdt.annotation.Nullable; -import org.eclipse.smarthome.core.library.items.SwitchItem; import org.eclipse.smarthome.core.library.types.OnOffType; -import org.eclipse.smarthome.core.types.State; +import org.eclipse.smarthome.core.library.types.OpenClosedType; import org.openhab.io.homekit.internal.HomekitAccessoryUpdater; -import org.openhab.io.homekit.internal.HomekitCharacteristicType; import org.openhab.io.homekit.internal.HomekitSettings; import org.openhab.io.homekit.internal.HomekitTaggedItem; @@ -34,34 +33,33 @@ * @author Eugen Freiter - Initial contribution */ class HomekitFanImpl extends AbstractHomekitAccessoryImpl implements FanAccessory { + private final BooleanItemReader activeReader; + public HomekitFanImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { super(taggedItem, mandatoryCharacteristics, updater, settings); + activeReader = createBooleanReader(ACTIVE_STATUS, OnOffType.ON, OpenClosedType.OPEN); this.getServices().add(new FanService(this)); } @Override public CompletableFuture isActive() { - final @Nullable State state = getStateAs(HomekitCharacteristicType.ACTIVE_STATUS, OnOffType.class); - return CompletableFuture.completedFuture(state == OnOffType.ON); + return CompletableFuture.completedFuture(activeReader.getValue()); } @Override - public CompletableFuture setActive(final boolean state) throws Exception { - final @Nullable SwitchItem item = getItem(HomekitCharacteristicType.ACTIVE_STATUS, SwitchItem.class); - if (item != null) { - item.send(OnOffType.from(state)); - } + public CompletableFuture setActive(boolean state) { + activeReader.setValue(state); return CompletableFuture.completedFuture(null); } @Override - public void subscribeActive(final HomekitCharacteristicChangeCallback callback) { - subscribe(HomekitCharacteristicType.ACTIVE_STATUS, callback); + public void subscribeActive(HomekitCharacteristicChangeCallback callback) { + subscribe(ACTIVE_STATUS, callback); } @Override public void unsubscribeActive() { - unsubscribe(HomekitCharacteristicType.ACTIVE_STATUS); + unsubscribe(ACTIVE_STATUS); } } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitGarageDoorOpenerImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitGarageDoorOpenerImpl.java index bd3ee7d9d9195..680c2da7e84f8 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitGarageDoorOpenerImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitGarageDoorOpenerImpl.java @@ -12,12 +12,14 @@ */ package org.openhab.io.homekit.internal.accessories; +import static org.openhab.io.homekit.internal.HomekitCharacteristicType.CURRENT_DOOR_STATE; +import static org.openhab.io.homekit.internal.HomekitCharacteristicType.OBSTRUCTION_STATUS; +import static org.openhab.io.homekit.internal.HomekitCharacteristicType.TARGET_DOOR_STATE; + import java.util.List; import java.util.Optional; import java.util.concurrent.CompletableFuture; -import org.eclipse.jdt.annotation.Nullable; -import org.eclipse.smarthome.core.items.GenericItem; import org.eclipse.smarthome.core.items.Item; import org.eclipse.smarthome.core.library.items.StringItem; import org.eclipse.smarthome.core.library.items.SwitchItem; @@ -25,7 +27,6 @@ import org.eclipse.smarthome.core.library.types.OpenClosedType; import org.eclipse.smarthome.core.library.types.StringType; import org.openhab.io.homekit.internal.HomekitAccessoryUpdater; -import org.openhab.io.homekit.internal.HomekitCharacteristicType; import org.openhab.io.homekit.internal.HomekitSettings; import org.openhab.io.homekit.internal.HomekitTaggedItem; import org.slf4j.Logger; @@ -43,24 +44,25 @@ * @author Eugen Freiter - Initial contribution */ public class HomekitGarageDoorOpenerImpl extends AbstractHomekitAccessoryImpl implements GarageDoorOpenerAccessory { - private Logger logger = LoggerFactory.getLogger(HomekitGarageDoorOpenerImpl.class); + private final Logger logger = LoggerFactory.getLogger(HomekitGarageDoorOpenerImpl.class); + private final BooleanItemReader obstructionReader; public HomekitGarageDoorOpenerImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { super(taggedItem, mandatoryCharacteristics, updater, settings); - this.getServices().add(new GarageDoorOpenerService(this)); + obstructionReader = createBooleanReader(OBSTRUCTION_STATUS, OnOffType.ON, OpenClosedType.OPEN); + getServices().add(new GarageDoorOpenerService(this)); } @Override public CompletableFuture getCurrentDoorState() { - final Optional characteristic = getCharacteristic( - HomekitCharacteristicType.CURRENT_DOOR_STATE); + final Optional characteristic = getCharacteristic(CURRENT_DOOR_STATE); final HomekitSettings settings = getSettings(); String stringValue = settings.doorCurrentStateClosed; if (characteristic.isPresent()) { stringValue = characteristic.get().getItem().getState().toString(); } else { - logger.warn("Missing mandatory characteristic {}", HomekitCharacteristicType.CURRENT_DOOR_STATE); + logger.warn("Missing mandatory characteristic {}", CURRENT_DOOR_STATE); } CurrentDoorStateEnum mode; @@ -75,7 +77,7 @@ public CompletableFuture getCurrentDoorState() { } else if (stringValue.equalsIgnoreCase(settings.doorCurrentStateStopped)) { mode = CurrentDoorStateEnum.SOPPED; } else if (stringValue.equals("UNDEF") || stringValue.equals("NULL")) { - logger.warn("Current door state not available. Relaying value of CLOSED to Homekit"); + logger.warn("Current door state not available. Relaying value of CLOSED to HomeKit"); mode = CurrentDoorStateEnum.CLOSED; } else { logger.warn("Unrecognized current door state: {}. Expected {}, {}, {}, {} or {} strings in value.", @@ -88,14 +90,13 @@ public CompletableFuture getCurrentDoorState() { @Override public CompletableFuture getTargetDoorState() { - final Optional characteristic = getCharacteristic( - HomekitCharacteristicType.TARGET_DOOR_STATE); + final Optional characteristic = getCharacteristic(TARGET_DOOR_STATE); Item item; if (characteristic.isPresent()) { item = characteristic.get().getItem(); } else { - logger.warn("Missing mandatory characteristic {}", HomekitCharacteristicType.TARGET_DOOR_STATE); + logger.warn("Missing mandatory characteristic {}", TARGET_DOOR_STATE); return CompletableFuture.completedFuture(TargetDoorStateEnum.CLOSED); } TargetDoorStateEnum mode; @@ -109,7 +110,6 @@ public CompletableFuture getTargetDoorState() { mode = TargetDoorStateEnum.CLOSED; } else if (stringValue.equalsIgnoreCase(settings.doorTargetStateOpen)) { mode = TargetDoorStateEnum.OPEN; - ; } else { logger.warn( "Unsupported value {} for {}. Only {} and {} supported. Check HomeKit settings if you want to change the mapping", @@ -126,23 +126,17 @@ public CompletableFuture getTargetDoorState() { @Override public CompletableFuture getObstructionDetected() { - final @Nullable Item item = getItem(HomekitCharacteristicType.OBSTRUCTION_STATUS, GenericItem.class); - if (item == null) { - logger.warn("Missing mandatory characteristic {}", HomekitCharacteristicType.OBSTRUCTION_STATUS); - } - return CompletableFuture - .completedFuture(item.getState() == OnOffType.ON || item.getState() == OpenClosedType.OPEN); + return CompletableFuture.completedFuture(obstructionReader.getValue()); } @Override - public CompletableFuture setTargetDoorState(final TargetDoorStateEnum targetDoorStateEnum) { - final Optional characteristic = getCharacteristic( - HomekitCharacteristicType.TARGET_DOOR_STATE); + public CompletableFuture setTargetDoorState(TargetDoorStateEnum targetDoorStateEnum) { + final Optional characteristic = getCharacteristic(TARGET_DOOR_STATE); Item item; if (characteristic.isPresent()) { item = characteristic.get().getItem(); } else { - logger.warn("Missing mandatory characteristic {}", HomekitCharacteristicType.TARGET_DOOR_STATE); + logger.warn("Missing mandatory characteristic {}", TARGET_DOOR_STATE); return CompletableFuture.completedFuture(null); } @@ -161,32 +155,32 @@ public CompletableFuture setTargetDoorState(final TargetDoorStateEnum targ } @Override - public void subscribeCurrentDoorState(final HomekitCharacteristicChangeCallback callback) { - subscribe(HomekitCharacteristicType.CURRENT_DOOR_STATE, callback); + public void subscribeCurrentDoorState(HomekitCharacteristicChangeCallback callback) { + subscribe(CURRENT_DOOR_STATE, callback); } @Override - public void subscribeTargetDoorState(final HomekitCharacteristicChangeCallback callback) { - subscribe(HomekitCharacteristicType.TARGET_DOOR_STATE, callback); + public void subscribeTargetDoorState(HomekitCharacteristicChangeCallback callback) { + subscribe(TARGET_DOOR_STATE, callback); } @Override - public void subscribeObstructionDetected(final HomekitCharacteristicChangeCallback callback) { - subscribe(HomekitCharacteristicType.OBSTRUCTION_STATUS, callback); + public void subscribeObstructionDetected(HomekitCharacteristicChangeCallback callback) { + subscribe(OBSTRUCTION_STATUS, callback); } @Override public void unsubscribeCurrentDoorState() { - unsubscribe(HomekitCharacteristicType.CURRENT_DOOR_STATE); + unsubscribe(CURRENT_DOOR_STATE); } @Override public void unsubscribeTargetDoorState() { - unsubscribe(HomekitCharacteristicType.TARGET_DOOR_STATE); + unsubscribe(TARGET_DOOR_STATE); } @Override public void unsubscribeObstructionDetected() { - unsubscribe(HomekitCharacteristicType.OBSTRUCTION_STATUS); + unsubscribe(OBSTRUCTION_STATUS); } } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitHeaterCoolerImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitHeaterCoolerImpl.java index 8d67664548ecd..ca315bf018a82 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitHeaterCoolerImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitHeaterCoolerImpl.java @@ -12,6 +12,7 @@ */ package org.openhab.io.homekit.internal.accessories; +import static org.openhab.io.homekit.internal.HomekitCharacteristicType.ACTIVE_STATUS; import static org.openhab.io.homekit.internal.HomekitCharacteristicType.CURRENT_HEATER_COOLER_STATE; import static org.openhab.io.homekit.internal.HomekitCharacteristicType.TARGET_HEATER_COOLER_STATE; @@ -24,12 +25,10 @@ import org.eclipse.jdt.annotation.Nullable; import org.eclipse.smarthome.core.items.GenericItem; import org.eclipse.smarthome.core.library.items.StringItem; -import org.eclipse.smarthome.core.library.items.SwitchItem; import org.eclipse.smarthome.core.library.types.DecimalType; import org.eclipse.smarthome.core.library.types.OnOffType; import org.eclipse.smarthome.core.library.types.OpenClosedType; import org.eclipse.smarthome.core.library.types.StringType; -import org.eclipse.smarthome.core.types.State; import org.openhab.io.homekit.internal.HomekitAccessoryUpdater; import org.openhab.io.homekit.internal.HomekitCharacteristicType; import org.openhab.io.homekit.internal.HomekitSettings; @@ -54,17 +53,16 @@ public class HomekitHeaterCoolerImpl extends AbstractHomekitAccessoryImpl implements HeaterCoolerAccessory { private final Logger logger = LoggerFactory.getLogger(HomekitHeaterCoolerImpl.class); private final BooleanItemReader activeReader; - private final Map currentStateMapping = new EnumMap( + private final Map currentStateMapping = new EnumMap( CurrentHeaterCoolerStateEnum.class) { { put(CurrentHeaterCoolerStateEnum.INACTIVE, "INACTIVE"); put(CurrentHeaterCoolerStateEnum.IDLE, "IDLE"); put(CurrentHeaterCoolerStateEnum.HEATING, "HEATING"); put(CurrentHeaterCoolerStateEnum.COOLING, "COOLING"); - } }; - private final Map targetStateMapping = new EnumMap( + private final Map targetStateMapping = new EnumMap( TargetHeaterCoolerStateEnum.class) { { put(TargetHeaterCoolerStateEnum.AUTO, "AUTO"); @@ -76,36 +74,32 @@ public class HomekitHeaterCoolerImpl extends AbstractHomekitAccessoryImpl implem public HomekitHeaterCoolerImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { super(taggedItem, mandatoryCharacteristics, updater, settings); - activeReader = new BooleanItemReader(getItem(HomekitCharacteristicType.ACTIVE_STATUS, GenericItem.class), - OnOffType.ON, OpenClosedType.OPEN); + activeReader = new BooleanItemReader(getItem(ACTIVE_STATUS, GenericItem.class) + .orElseThrow(() -> new IncompleteAccessoryException(ACTIVE_STATUS)), OnOffType.ON, OpenClosedType.OPEN); updateMapping(CURRENT_HEATER_COOLER_STATE, currentStateMapping); updateMapping(TARGET_HEATER_COOLER_STATE, targetStateMapping); final HeaterCoolerService service = new HeaterCoolerService(this); - service.addOptionalCharacteristic(new TemperatureDisplayUnitCharacteristic(() -> getTemperatureDisplayUnit(), - (value) -> setTemperatureDisplayUnit(value), (callback) -> subscribeTemperatureDisplayUnit(callback), - () -> unsubscribeTemperatureDisplayUnit())); + service.addOptionalCharacteristic(new TemperatureDisplayUnitCharacteristic(this::getTemperatureDisplayUnit, + this::setTemperatureDisplayUnit, this::subscribeTemperatureDisplayUnit, + this::unsubscribeTemperatureDisplayUnit)); getServices().add(service); } @Override public CompletableFuture getCurrentTemperature() { - @Nullable - final DecimalType state = getStateAs(HomekitCharacteristicType.CURRENT_TEMPERATURE, DecimalType.class); + final @Nullable DecimalType state = getStateAs(HomekitCharacteristicType.CURRENT_TEMPERATURE, + DecimalType.class); return CompletableFuture.completedFuture(state != null ? convertToCelsius(state.doubleValue()) : 0.0); } @Override public CompletableFuture isActive() { - final @Nullable State state = getStateAs(HomekitCharacteristicType.ACTIVE_STATUS, OnOffType.class); - return CompletableFuture.completedFuture(state == OnOffType.ON); + return CompletableFuture.completedFuture(activeReader.getValue()); } @Override - public CompletableFuture setActive(final boolean state) { - final @Nullable SwitchItem item = getItem(HomekitCharacteristicType.ACTIVE_STATUS, SwitchItem.class); - if (item != null) { - item.send(OnOffType.from(state)); - } + public CompletableFuture setActive(boolean state) { + activeReader.setValue(state); return CompletableFuture.completedFuture(null); } @@ -122,7 +116,7 @@ public CompletableFuture getTargetHeaterCoolerState } @Override - public CompletableFuture setTargetHeaterCoolerState(final TargetHeaterCoolerStateEnum state) { + public CompletableFuture setTargetHeaterCoolerState(TargetHeaterCoolerStateEnum state) { final Optional characteristic = getCharacteristic( HomekitCharacteristicType.TARGET_HEATER_COOLER_STATE); if (characteristic.isPresent()) { @@ -140,13 +134,13 @@ public CompletableFuture getTemperatureDisplayUnit() : TemperatureDisplayUnitEnum.CELSIUS); } - public void setTemperatureDisplayUnit(final TemperatureDisplayUnitEnum value) throws Exception { + public void setTemperatureDisplayUnit(TemperatureDisplayUnitEnum value) { // temperature unit set globally via binding setting and cannot be changed at item level. // this method is intentionally empty. } @Override - public void subscribeCurrentHeaterCoolerState(final HomekitCharacteristicChangeCallback callback) { + public void subscribeCurrentHeaterCoolerState(HomekitCharacteristicChangeCallback callback) { subscribe(HomekitCharacteristicType.CURRENT_HEATER_COOLER_STATE, callback); } @@ -156,7 +150,7 @@ public void unsubscribeCurrentHeaterCoolerState() { } @Override - public void subscribeTargetHeaterCoolerState(final HomekitCharacteristicChangeCallback callback) { + public void subscribeTargetHeaterCoolerState(HomekitCharacteristicChangeCallback callback) { subscribe(HomekitCharacteristicType.TARGET_HEATER_COOLER_STATE, callback); } @@ -166,17 +160,17 @@ public void unsubscribeTargetHeaterCoolerState() { } @Override - public void subscribeActive(final HomekitCharacteristicChangeCallback callback) { - subscribe(HomekitCharacteristicType.ACTIVE_STATUS, callback); + public void subscribeActive(HomekitCharacteristicChangeCallback callback) { + subscribe(ACTIVE_STATUS, callback); } @Override public void unsubscribeActive() { - unsubscribe(HomekitCharacteristicType.ACTIVE_STATUS); + unsubscribe(ACTIVE_STATUS); } @Override - public void subscribeCurrentTemperature(final HomekitCharacteristicChangeCallback callback) { + public void subscribeCurrentTemperature(HomekitCharacteristicChangeCallback callback) { subscribe(HomekitCharacteristicType.CURRENT_TEMPERATURE, callback); } @@ -185,7 +179,7 @@ public void unsubscribeCurrentTemperature() { unsubscribe(HomekitCharacteristicType.CURRENT_TEMPERATURE); } - public void subscribeTemperatureDisplayUnit(final HomekitCharacteristicChangeCallback callback) { + public void subscribeTemperatureDisplayUnit(HomekitCharacteristicChangeCallback callback) { // temperature unit set globally via binding setting and cannot be changed at item level. // this method is intentionally empty } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitHumiditySensorImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitHumiditySensorImpl.java index e7b1358788156..16e9fbc71a948 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitHumiditySensorImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitHumiditySensorImpl.java @@ -35,15 +35,14 @@ public class HomekitHumiditySensorImpl extends AbstractHomekitAccessoryImpl impl private final static String CONFIG_MULTIPLICATOR = "homekitMultiplicator"; public HomekitHumiditySensorImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, - HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { + HomekitAccessoryUpdater updater, HomekitSettings settings) { super(taggedItem, mandatoryCharacteristics, updater, settings); getServices().add(new HumiditySensorService(this)); } @Override public CompletableFuture getCurrentRelativeHumidity() { - @Nullable - DecimalType state = getStateAs(HomekitCharacteristicType.RELATIVE_HUMIDITY, DecimalType.class); + final @Nullable DecimalType state = getStateAs(HomekitCharacteristicType.RELATIVE_HUMIDITY, DecimalType.class); if (state != null) { BigDecimal multiplicator = getAccessoryConfiguration(CONFIG_MULTIPLICATOR, BigDecimal.valueOf(1.0)); return CompletableFuture.completedFuture((state.toBigDecimal().multiply(multiplicator)).doubleValue()); diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLeakSensorImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLeakSensorImpl.java index 87da6d8aa2b12..33febd3d412dd 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLeakSensorImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLeakSensorImpl.java @@ -12,14 +12,14 @@ */ package org.openhab.io.homekit.internal.accessories; +import static org.openhab.io.homekit.internal.HomekitCharacteristicType.LEAK_DETECTED_STATE; + import java.util.List; import java.util.concurrent.CompletableFuture; -import org.eclipse.smarthome.core.items.GenericItem; import org.eclipse.smarthome.core.library.types.OnOffType; import org.eclipse.smarthome.core.library.types.OpenClosedType; import org.openhab.io.homekit.internal.HomekitAccessoryUpdater; -import org.openhab.io.homekit.internal.HomekitCharacteristicType; import org.openhab.io.homekit.internal.HomekitSettings; import org.openhab.io.homekit.internal.HomekitTaggedItem; @@ -38,27 +38,23 @@ public class HomekitLeakSensorImpl extends AbstractHomekitAccessoryImpl implemen public HomekitLeakSensorImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { super(taggedItem, mandatoryCharacteristics, updater, settings); - this.leakDetectedReader = new BooleanItemReader( - getItem(HomekitCharacteristicType.LEAK_DETECTED_STATE, GenericItem.class), OnOffType.ON, - OpenClosedType.OPEN); + leakDetectedReader = createBooleanReader(LEAK_DETECTED_STATE, OnOffType.ON, OpenClosedType.OPEN); getServices().add(new LeakSensorService(this)); } @Override public CompletableFuture getLeakDetected() { - return CompletableFuture - .completedFuture((this.leakDetectedReader.getValue() != null && this.leakDetectedReader.getValue()) - ? LeakDetectedStateEnum.LEAK_DETECTED - : LeakDetectedStateEnum.LEAK_NOT_DETECTED); + return CompletableFuture.completedFuture(leakDetectedReader.getValue() ? LeakDetectedStateEnum.LEAK_DETECTED + : LeakDetectedStateEnum.LEAK_NOT_DETECTED); } @Override public void subscribeLeakDetected(HomekitCharacteristicChangeCallback callback) { - subscribe(HomekitCharacteristicType.LEAK_DETECTED_STATE, callback); + subscribe(LEAK_DETECTED_STATE, callback); } @Override public void unsubscribeLeakDetected() { - unsubscribe(HomekitCharacteristicType.LEAK_DETECTED_STATE); + unsubscribe(LEAK_DETECTED_STATE); } } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLightbulbImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLightbulbImpl.java index 5bd1782ee5ad5..81c1f11a5b81c 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLightbulbImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLightbulbImpl.java @@ -38,7 +38,7 @@ class HomekitLightbulbImpl extends AbstractHomekitAccessoryImpl implements LightbulbAccessory { public HomekitLightbulbImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, - HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { + HomekitAccessoryUpdater updater, HomekitSettings settings) { super(taggedItem, mandatoryCharacteristics, updater, settings); this.getServices().add(new LightbulbService(this)); } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLockImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLockImpl.java index b4645c84989d1..da4938b4b7057 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLockImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitLockImpl.java @@ -13,11 +13,11 @@ 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.Nullable; import org.eclipse.smarthome.core.items.GenericItem; -import org.eclipse.smarthome.core.items.Item; import org.eclipse.smarthome.core.library.items.SwitchItem; import org.eclipse.smarthome.core.library.types.DecimalType; import org.eclipse.smarthome.core.library.types.OnOffType; @@ -42,65 +42,63 @@ public class HomekitLockImpl extends AbstractHomekitAccessoryImpl implements LockMechanismAccessory { public HomekitLockImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, - HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { + HomekitAccessoryUpdater updater, HomekitSettings settings) { super(taggedItem, mandatoryCharacteristics, updater, settings); getServices().add(new LockMechanismService(this)); } @Override public CompletableFuture getLockCurrentState() { - @Nullable - - final State state = getItem(HomekitCharacteristicType.LOCK_CURRENT_STATE, GenericItem.class).getState(); - if (state instanceof DecimalType) { - return CompletableFuture.completedFuture(LockCurrentStateEnum.fromCode( - state.as(DecimalType.class).intValue())); - } else if (state instanceof OnOffType) { - return CompletableFuture.completedFuture( - state == OnOffType.ON ? LockCurrentStateEnum.SECURED : LockCurrentStateEnum.UNSECURED); + final Optional item = getItem(HomekitCharacteristicType.LOCK_CURRENT_STATE, GenericItem.class); + LockCurrentStateEnum lockState = LockCurrentStateEnum.UNKNOWN; + if (item.isPresent()) { + final State state = item.get().getState(); + if (state instanceof DecimalType) { + lockState = LockCurrentStateEnum.fromCode(((DecimalType) state).intValue()); + } else if (state instanceof OnOffType) { + lockState = state == OnOffType.ON ? LockCurrentStateEnum.SECURED : LockCurrentStateEnum.UNSECURED; + } } - return CompletableFuture.completedFuture(LockCurrentStateEnum.UNKNOWN); + return CompletableFuture.completedFuture(lockState); } @Override public CompletableFuture getLockTargetState() { - @Nullable - OnOffType state = getStateAs(HomekitCharacteristicType.LOCK_TARGET_STATE, OnOffType.class); + final @Nullable OnOffType state = getStateAs(HomekitCharacteristicType.LOCK_TARGET_STATE, OnOffType.class); if (state != null) { return CompletableFuture.completedFuture( state == OnOffType.ON ? LockTargetStateEnum.SECURED : LockTargetStateEnum.UNSECURED); } return CompletableFuture.completedFuture(LockTargetStateEnum.UNSECURED); - // Apple HAP specification has onyl SECURED and UNSECURED values for lock target state. + // Apple HAP specification has only SECURED and UNSECURED values for lock target state. // unknown does not supported for target state. } @Override - public CompletableFuture setLockTargetState(final LockTargetStateEnum state) { - @Nullable - Item item = getItem(HomekitCharacteristicType.LOCK_TARGET_STATE, SwitchItem.class); - if (item != null) + public CompletableFuture setLockTargetState(LockTargetStateEnum state) { + getItem(HomekitCharacteristicType.LOCK_TARGET_STATE, SwitchItem.class).ifPresent(item -> { switch (state) { case SECURED: // Close the door if (item instanceof SwitchItem) { - ((SwitchItem) item).send(OnOffType.ON); + item.send(OnOffType.ON); } break; case UNSECURED: // Open the door if (item instanceof SwitchItem) { - ((SwitchItem) item).send(OnOffType.OFF); + item.send(OnOffType.OFF); } break; default: break; } + }); return CompletableFuture.completedFuture(null); } @Override - public void subscribeLockCurrentState(final HomekitCharacteristicChangeCallback callback) { + public void subscribeLockCurrentState(HomekitCharacteristicChangeCallback callback) { subscribe(HomekitCharacteristicType.LOCK_CURRENT_STATE, callback); } @@ -110,7 +108,7 @@ public void unsubscribeLockCurrentState() { } @Override - public void subscribeLockTargetState(final HomekitCharacteristicChangeCallback callback) { + public void subscribeLockTargetState(HomekitCharacteristicChangeCallback callback) { subscribe(HomekitCharacteristicType.LOCK_TARGET_STATE, callback); } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitMotionSensorImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitMotionSensorImpl.java index 1aaa7b599bb7e..b408879bdcafd 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitMotionSensorImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitMotionSensorImpl.java @@ -15,7 +15,6 @@ import java.util.List; import java.util.concurrent.CompletableFuture; -import org.eclipse.smarthome.core.items.GenericItem; import org.eclipse.smarthome.core.library.types.OnOffType; import org.eclipse.smarthome.core.library.types.OpenClosedType; import org.openhab.io.homekit.internal.HomekitAccessoryUpdater; @@ -37,17 +36,14 @@ public class HomekitMotionSensorImpl extends AbstractHomekitAccessoryImpl implem public HomekitMotionSensorImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { super(taggedItem, mandatoryCharacteristics, updater, settings); - this.motionSensedReader = new BooleanItemReader( - getItem(HomekitCharacteristicType.MOTION_DETECTED_STATE, GenericItem.class), OnOffType.ON, + motionSensedReader = createBooleanReader(HomekitCharacteristicType.MOTION_DETECTED_STATE, OnOffType.ON, OpenClosedType.OPEN); - getServices().add(new MotionSensorService(this)); } @Override public CompletableFuture getMotionDetected() { - return CompletableFuture - .completedFuture((this.motionSensedReader.getValue() != null) ? motionSensedReader.getValue() : false); + return CompletableFuture.completedFuture(motionSensedReader.getValue()); } @Override diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitOccupancySensorImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitOccupancySensorImpl.java index b2b6761c4c496..8966ceff0a45a 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitOccupancySensorImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitOccupancySensorImpl.java @@ -12,14 +12,14 @@ */ package org.openhab.io.homekit.internal.accessories; +import static org.openhab.io.homekit.internal.HomekitCharacteristicType.OCCUPANCY_DETECTED_STATE; + import java.util.List; import java.util.concurrent.CompletableFuture; -import org.eclipse.smarthome.core.items.GenericItem; import org.eclipse.smarthome.core.library.types.OnOffType; import org.eclipse.smarthome.core.library.types.OpenClosedType; import org.openhab.io.homekit.internal.HomekitAccessoryUpdater; -import org.openhab.io.homekit.internal.HomekitCharacteristicType; import org.openhab.io.homekit.internal.HomekitSettings; import org.openhab.io.homekit.internal.HomekitTaggedItem; @@ -38,26 +38,23 @@ public class HomekitOccupancySensorImpl extends AbstractHomekitAccessoryImpl imp public HomekitOccupancySensorImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { super(taggedItem, mandatoryCharacteristics, updater, settings); - this.occupancySensedReader = new BooleanItemReader( - getItem(HomekitCharacteristicType.OCCUPANCY_DETECTED_STATE, GenericItem.class), OnOffType.ON, - OpenClosedType.OPEN); + occupancySensedReader = createBooleanReader(OCCUPANCY_DETECTED_STATE, OnOffType.ON, OpenClosedType.OPEN); getServices().add(new OccupancySensorService(this)); } @Override public CompletableFuture getOccupancyDetected() { - return (this.occupancySensedReader.getValue() != null && this.occupancySensedReader.getValue()) - ? CompletableFuture.completedFuture(OccupancyDetectedEnum.DETECTED) - : CompletableFuture.completedFuture(OccupancyDetectedEnum.NOT_DETECTED); + return CompletableFuture.completedFuture( + occupancySensedReader.getValue() ? OccupancyDetectedEnum.DETECTED : OccupancyDetectedEnum.NOT_DETECTED); } @Override public void subscribeOccupancyDetected(HomekitCharacteristicChangeCallback callback) { - subscribe(HomekitCharacteristicType.OCCUPANCY_DETECTED_STATE, callback); + subscribe(OCCUPANCY_DETECTED_STATE, callback); } @Override public void unsubscribeOccupancyDetected() { - unsubscribe(HomekitCharacteristicType.OCCUPANCY_DETECTED_STATE); + unsubscribe(OCCUPANCY_DETECTED_STATE); } } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitOutletImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitOutletImpl.java index d73cb702c484e..9c6f338280c48 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitOutletImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitOutletImpl.java @@ -15,15 +15,12 @@ import java.util.List; import java.util.concurrent.CompletableFuture; -import org.eclipse.smarthome.core.items.GenericItem; import org.eclipse.smarthome.core.library.types.OnOffType; import org.eclipse.smarthome.core.library.types.OpenClosedType; import org.openhab.io.homekit.internal.HomekitAccessoryUpdater; import org.openhab.io.homekit.internal.HomekitCharacteristicType; import org.openhab.io.homekit.internal.HomekitSettings; import org.openhab.io.homekit.internal.HomekitTaggedItem; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import io.github.hapjava.accessories.OutletAccessory; import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; @@ -34,44 +31,40 @@ * @author Eugen Freiter - Initial contribution */ public class HomekitOutletImpl extends AbstractHomekitAccessoryImpl implements OutletAccessory { - private final Logger logger = LoggerFactory.getLogger(HomekitOutletImpl.class); - private final BooleanItemReader inUseReader; private final BooleanItemReader onReader; public HomekitOutletImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { super(taggedItem, mandatoryCharacteristics, updater, settings); - this.inUseReader = new BooleanItemReader(getItem(HomekitCharacteristicType.INUSE_STATUS, GenericItem.class), - OnOffType.ON, OpenClosedType.OPEN); - this.onReader = new BooleanItemReader(getItem(HomekitCharacteristicType.ON_STATE, GenericItem.class), - OnOffType.ON, OpenClosedType.OPEN); + inUseReader = createBooleanReader(HomekitCharacteristicType.INUSE_STATUS, OnOffType.ON, OpenClosedType.OPEN); + onReader = createBooleanReader(HomekitCharacteristicType.ON_STATE, OnOffType.ON, OpenClosedType.OPEN); getServices().add(new OutletService(this)); } @Override public CompletableFuture getPowerState() { - return CompletableFuture.completedFuture(this.onReader.getValue() != null && this.onReader.getValue()); + return CompletableFuture.completedFuture(onReader.getValue()); } @Override public CompletableFuture getOutletInUse() { - return CompletableFuture.completedFuture(this.inUseReader.getValue() != null && this.onReader.getValue()); + return CompletableFuture.completedFuture(inUseReader.getValue()); } @Override - public CompletableFuture setPowerState(final boolean state) throws Exception { - this.onReader.setValue(state); + public CompletableFuture setPowerState(boolean state) { + onReader.setValue(state); return CompletableFuture.completedFuture(null); } @Override - public void subscribePowerState(final HomekitCharacteristicChangeCallback callback) { + public void subscribePowerState(HomekitCharacteristicChangeCallback callback) { subscribe(HomekitCharacteristicType.ON_STATE, callback); } @Override - public void subscribeOutletInUse(final HomekitCharacteristicChangeCallback callback) { + public void subscribeOutletInUse(HomekitCharacteristicChangeCallback callback) { subscribe(HomekitCharacteristicType.INUSE_STATUS, callback); } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSecuritySystemImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSecuritySystemImpl.java index 766cda2fa7027..53e3c023d5a77 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSecuritySystemImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSecuritySystemImpl.java @@ -18,7 +18,6 @@ import java.util.EnumMap; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.concurrent.CompletableFuture; import org.eclipse.smarthome.core.library.items.StringItem; @@ -27,8 +26,6 @@ import org.openhab.io.homekit.internal.HomekitCharacteristicType; import org.openhab.io.homekit.internal.HomekitSettings; import org.openhab.io.homekit.internal.HomekitTaggedItem; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import io.github.hapjava.accessories.SecuritySystemAccessory; import io.github.hapjava.characteristics.HomekitCharacteristicChangeCallback; @@ -46,7 +43,6 @@ * @author Cody Cutrer - Initial contribution */ public class HomekitSecuritySystemImpl extends AbstractHomekitAccessoryImpl implements SecuritySystemAccessory { - private final Logger logger = LoggerFactory.getLogger(HomekitSecuritySystemImpl.class); private final Map currentStateMapping = new EnumMap( CurrentSecuritySystemStateEnum.class) { { @@ -68,7 +64,7 @@ public class HomekitSecuritySystemImpl extends AbstractHomekitAccessoryImpl impl }; public HomekitSecuritySystemImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, - HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { + HomekitAccessoryUpdater updater, HomekitSettings settings) { super(taggedItem, mandatoryCharacteristics, updater, settings); updateMapping(SECURITY_SYSTEM_CURRENT_STATE, currentStateMapping); updateMapping(SECURITY_SYSTEM_TARGET_STATE, targetStateMapping); @@ -82,15 +78,9 @@ public CompletableFuture getCurrentSecuritySyste } @Override - public void setTargetSecuritySystemState(final TargetSecuritySystemStateEnum state) { - final Optional characteristic = getCharacteristic( - HomekitCharacteristicType.SECURITY_SYSTEM_TARGET_STATE); - if (characteristic.isPresent()) { - ((StringItem) characteristic.get().getItem()).send(new StringType(targetStateMapping.get(state))); - } else { - logger.warn("Missing mandatory characteristic {}", - HomekitCharacteristicType.SECURITY_SYSTEM_TARGET_STATE.getTag()); - } + public void setTargetSecuritySystemState(TargetSecuritySystemStateEnum state) { + getItem(HomekitCharacteristicType.SECURITY_SYSTEM_TARGET_STATE, StringItem.class) + .ifPresent(item -> item.send(new StringType(targetStateMapping.get(state)))); } @Override @@ -100,7 +90,7 @@ public CompletableFuture getTargetSecuritySystemS } @Override - public void subscribeCurrentSecuritySystemState(final HomekitCharacteristicChangeCallback callback) { + public void subscribeCurrentSecuritySystemState(HomekitCharacteristicChangeCallback callback) { subscribe(SECURITY_SYSTEM_CURRENT_STATE, callback); } @@ -110,7 +100,7 @@ public void unsubscribeCurrentSecuritySystemState() { } @Override - public void subscribeTargetSecuritySystemState(final HomekitCharacteristicChangeCallback callback) { + public void subscribeTargetSecuritySystemState(HomekitCharacteristicChangeCallback callback) { subscribe(SECURITY_SYSTEM_TARGET_STATE, callback); } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSmokeSensorImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSmokeSensorImpl.java index 51905acaa2d7d..a0a880ce347dd 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSmokeSensorImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSmokeSensorImpl.java @@ -12,14 +12,14 @@ */ package org.openhab.io.homekit.internal.accessories; +import static org.openhab.io.homekit.internal.HomekitCharacteristicType.SMOKE_DETECTED_STATE; + import java.util.List; import java.util.concurrent.CompletableFuture; -import org.eclipse.smarthome.core.items.GenericItem; import org.eclipse.smarthome.core.library.types.OnOffType; import org.eclipse.smarthome.core.library.types.OpenClosedType; import org.openhab.io.homekit.internal.HomekitAccessoryUpdater; -import org.openhab.io.homekit.internal.HomekitCharacteristicType; import org.openhab.io.homekit.internal.HomekitSettings; import org.openhab.io.homekit.internal.HomekitTaggedItem; @@ -33,32 +33,28 @@ * @author Cody Cutrer - Initial contribution */ public class HomekitSmokeSensorImpl extends AbstractHomekitAccessoryImpl implements SmokeSensorAccessory { - private final BooleanItemReader smokeDetectedReader; public HomekitSmokeSensorImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { super(taggedItem, mandatoryCharacteristics, updater, settings); - this.smokeDetectedReader = new BooleanItemReader( - getItem(HomekitCharacteristicType.SMOKE_DETECTED_STATE, GenericItem.class), OnOffType.ON, - OpenClosedType.OPEN); + smokeDetectedReader = createBooleanReader(SMOKE_DETECTED_STATE, OnOffType.ON, OpenClosedType.OPEN); this.getServices().add(new SmokeSensorService(this)); } @Override public CompletableFuture getSmokeDetectedState() { - Boolean state = this.smokeDetectedReader.getValue(); return CompletableFuture.completedFuture( - (state != null && state) ? SmokeDetectedStateEnum.DETECTED : SmokeDetectedStateEnum.NOT_DETECTED); + smokeDetectedReader.getValue() ? SmokeDetectedStateEnum.DETECTED : SmokeDetectedStateEnum.NOT_DETECTED); } @Override public void subscribeSmokeDetectedState(HomekitCharacteristicChangeCallback callback) { - subscribe(HomekitCharacteristicType.SMOKE_DETECTED_STATE, callback); + subscribe(SMOKE_DETECTED_STATE, callback); } @Override public void unsubscribeSmokeDetectedState() { - unsubscribe(HomekitCharacteristicType.SMOKE_DETECTED_STATE); + unsubscribe(SMOKE_DETECTED_STATE); } } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSpeakerImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSpeakerImpl.java index 8383c9a6129a7..0f4c4027f80d1 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSpeakerImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSpeakerImpl.java @@ -15,7 +15,6 @@ import java.util.List; import java.util.concurrent.CompletableFuture; -import org.eclipse.smarthome.core.items.GenericItem; import org.eclipse.smarthome.core.library.types.OnOffType; import org.eclipse.smarthome.core.library.types.OpenClosedType; import org.openhab.io.homekit.internal.HomekitAccessoryUpdater; @@ -38,24 +37,23 @@ public class HomekitSpeakerImpl extends AbstractHomekitAccessoryImpl implements public HomekitSpeakerImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { super(taggedItem, mandatoryCharacteristics, updater, settings); - this.muteReader = new BooleanItemReader(getItem(HomekitCharacteristicType.MUTE, GenericItem.class), - OnOffType.ON, OpenClosedType.OPEN); + muteReader = createBooleanReader(HomekitCharacteristicType.MUTE, OnOffType.ON, OpenClosedType.OPEN); getServices().add(new SpeakerService(this)); } @Override public CompletableFuture isMuted() { - return CompletableFuture.completedFuture(this.muteReader.getValue() != null && this.muteReader.getValue()); + return CompletableFuture.completedFuture(muteReader.getValue()); } @Override - public CompletableFuture setMute(final boolean state) { - this.muteReader.setValue(state); + public CompletableFuture setMute(boolean state) { + muteReader.setValue(state); return CompletableFuture.completedFuture(null); } @Override - public void subscribeMuteState(final HomekitCharacteristicChangeCallback callback) { + public void subscribeMuteState(HomekitCharacteristicChangeCallback callback) { subscribe(HomekitCharacteristicType.MUTE, callback); } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSwitchImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSwitchImpl.java index d1dd579626bb4..acac6e8c4f117 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSwitchImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitSwitchImpl.java @@ -12,15 +12,14 @@ */ package org.openhab.io.homekit.internal.accessories; +import static org.openhab.io.homekit.internal.HomekitCharacteristicType.ON_STATE; + import java.util.List; import java.util.concurrent.CompletableFuture; -import org.eclipse.smarthome.core.items.GenericItem; -import org.eclipse.smarthome.core.items.GroupItem; -import org.eclipse.smarthome.core.library.items.SwitchItem; import org.eclipse.smarthome.core.library.types.OnOffType; +import org.eclipse.smarthome.core.library.types.OpenClosedType; import org.openhab.io.homekit.internal.HomekitAccessoryUpdater; -import org.openhab.io.homekit.internal.HomekitCharacteristicType; import org.openhab.io.homekit.internal.HomekitSettings; import org.openhab.io.homekit.internal.HomekitTaggedItem; @@ -34,37 +33,33 @@ * @author Andy Lintner - Initial contribution */ public class HomekitSwitchImpl extends AbstractHomekitAccessoryImpl implements SwitchAccessory { + private final BooleanItemReader onReader; public HomekitSwitchImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { super(taggedItem, mandatoryCharacteristics, updater, settings); + onReader = createBooleanReader(ON_STATE, OnOffType.ON, OpenClosedType.OPEN); getServices().add(new SwitchService(this)); } @Override public CompletableFuture getSwitchState() { - OnOffType state = getStateAs(HomekitCharacteristicType.ON_STATE, OnOffType.class); - return CompletableFuture.completedFuture(state == OnOffType.ON); + return CompletableFuture.completedFuture(onReader.getValue()); } @Override public CompletableFuture setSwitchState(boolean state) { - GenericItem item = getItem(HomekitCharacteristicType.ON_STATE, GenericItem.class); - if (item instanceof SwitchItem) { - ((SwitchItem) item).send(OnOffType.from(state)); - } else if (item instanceof GroupItem) { - ((GroupItem) item).send(OnOffType.from(state)); - } + onReader.setValue(state); return CompletableFuture.completedFuture(null); } @Override public void subscribeSwitchState(HomekitCharacteristicChangeCallback callback) { - subscribe(HomekitCharacteristicType.ON_STATE, callback); + subscribe(ON_STATE, callback); } @Override public void unsubscribeSwitchState() { - unsubscribe(HomekitCharacteristicType.ON_STATE); + unsubscribe(ON_STATE); } } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitTemperatureSensorImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitTemperatureSensorImpl.java index c7f459c09989f..fdf8af02e4988 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitTemperatureSensorImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitTemperatureSensorImpl.java @@ -36,15 +36,15 @@ class HomekitTemperatureSensorImpl extends AbstractHomekitAccessoryImpl implements TemperatureSensorAccessory { public HomekitTemperatureSensorImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, - HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { + HomekitAccessoryUpdater updater, HomekitSettings settings) { super(taggedItem, mandatoryCharacteristics, updater, settings); getServices().add(new TemperatureSensorService(this)); } @Override public CompletableFuture getCurrentTemperature() { - @Nullable - DecimalType state = getStateAs(HomekitCharacteristicType.CURRENT_TEMPERATURE, DecimalType.class); + final @Nullable DecimalType state = getStateAs(HomekitCharacteristicType.CURRENT_TEMPERATURE, + DecimalType.class); return CompletableFuture.completedFuture(state != null ? convertToCelsius(state.doubleValue()) : 0.0); } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitThermostatImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitThermostatImpl.java index e681e895de225..caa4bef3e0ab7 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitThermostatImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitThermostatImpl.java @@ -48,10 +48,10 @@ * @author Andy Lintner - Initial contribution */ class HomekitThermostatImpl extends AbstractHomekitAccessoryImpl implements ThermostatAccessory { - private Logger logger = LoggerFactory.getLogger(HomekitThermostatImpl.class); + private final Logger logger = LoggerFactory.getLogger(HomekitThermostatImpl.class); public HomekitThermostatImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, - HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { + HomekitAccessoryUpdater updater, HomekitSettings settings) { super(taggedItem, mandatoryCharacteristics, updater, settings); this.getServices().add(new ThermostatService(this)); } @@ -154,7 +154,7 @@ public CompletableFuture getTemperatureDisplayUnit() } @Override - public void setTemperatureDisplayUnit(final TemperatureDisplayUnitEnum value) throws Exception { + public void setTemperatureDisplayUnit(TemperatureDisplayUnitEnum value) { // TODO: add support for display unit change } @@ -245,7 +245,7 @@ public void subscribeTargetTemperature(HomekitCharacteristicChangeCallback callb } @Override - public void subscribeTemperatureDisplayUnit(final HomekitCharacteristicChangeCallback callback) { + public void subscribeTemperatureDisplayUnit(HomekitCharacteristicChangeCallback callback) { // TODO: add support for display unit change } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitValveImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitValveImpl.java index 4433778241072..d661a0fc730ad 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitValveImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitValveImpl.java @@ -12,6 +12,8 @@ */ package org.openhab.io.homekit.internal.accessories; +import static org.openhab.io.homekit.internal.HomekitCharacteristicType.ACTIVE_STATUS; +import static org.openhab.io.homekit.internal.HomekitCharacteristicType.INUSE_STATUS; import static org.openhab.io.homekit.internal.HomekitCharacteristicType.REMAINING_DURATION; import java.util.HashMap; @@ -73,10 +75,8 @@ public class HomekitValveImpl extends AbstractHomekitAccessoryImpl implements Va public HomekitValveImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { super(taggedItem, mandatoryCharacteristics, updater, settings); - this.inUseReader = new BooleanItemReader(getItem(HomekitCharacteristicType.INUSE_STATUS, GenericItem.class), - OnOffType.ON, OpenClosedType.OPEN); - this.activeReader = new BooleanItemReader(getItem(HomekitCharacteristicType.ACTIVE_STATUS, GenericItem.class), - OnOffType.ON, OpenClosedType.OPEN); + inUseReader = createBooleanReader(INUSE_STATUS, OnOffType.ON, OpenClosedType.OPEN); + activeReader = createBooleanReader(ACTIVE_STATUS, OnOffType.ON, OpenClosedType.OPEN); ValveService service = new ValveService(this); getServices().add(service); final String timerConfig = getAccessoryConfiguration(CONFIG_TIMER, ""); @@ -141,15 +141,13 @@ private void stopTimer() { @Override public CompletableFuture getValveActive() { - return CompletableFuture.completedFuture( - (this.activeReader.getValue() != null && this.activeReader.getValue()) ? ActiveEnum.ACTIVE - : ActiveEnum.INACTIVE); + return CompletableFuture + .completedFuture(this.activeReader.getValue() ? ActiveEnum.ACTIVE : ActiveEnum.INACTIVE); } @Override public CompletableFuture setValveActive(ActiveEnum state) { - SwitchItem item = getItem(HomekitCharacteristicType.ACTIVE_STATUS, SwitchItem.class); - if (item != null) { + getItem(ACTIVE_STATUS, SwitchItem.class).ifPresent(item -> { item.send(OnOffType.from(state == ActiveEnum.ACTIVE)); if (homekitTimer) { if ((state == ActiveEnum.ACTIVE)) { @@ -160,42 +158,37 @@ public CompletableFuture setValveActive(ActiveEnum state) { // let home app refresh the remaining duration ((GenericItem) getRootAccessory().getItem()).send(RefreshType.REFRESH); } - } + }); return CompletableFuture.completedFuture(null); } private void switchOffValve() { - SwitchItem item = getItem(HomekitCharacteristicType.ACTIVE_STATUS, SwitchItem.class); - if (item != null) { - item.send(OnOffType.OFF); - } + getItem(ACTIVE_STATUS, SwitchItem.class).ifPresent(item -> item.send(OnOffType.OFF)); } @Override public void subscribeValveActive(HomekitCharacteristicChangeCallback callback) { - subscribe(HomekitCharacteristicType.ACTIVE_STATUS, callback); + subscribe(ACTIVE_STATUS, callback); } @Override public void unsubscribeValveActive() { - unsubscribe(HomekitCharacteristicType.ACTIVE_STATUS); + unsubscribe(ACTIVE_STATUS); } @Override public CompletableFuture getValveInUse() { - return CompletableFuture - .completedFuture((this.inUseReader.getValue() != null && this.inUseReader.getValue()) ? InUseEnum.IN_USE - : InUseEnum.NOT_IN_USE); + return CompletableFuture.completedFuture(inUseReader.getValue() ? InUseEnum.IN_USE : InUseEnum.NOT_IN_USE); } @Override public void subscribeValveInUse(HomekitCharacteristicChangeCallback callback) { - subscribe(HomekitCharacteristicType.INUSE_STATUS, callback); + subscribe(INUSE_STATUS, callback); } @Override public void unsubscribeValveInUse() { - unsubscribe(HomekitCharacteristicType.INUSE_STATUS); + unsubscribe(INUSE_STATUS); } @Override diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitWindowCoveringImpl.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitWindowCoveringImpl.java index 3cecde71c6dc9..f48b5d665c0d4 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitWindowCoveringImpl.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/HomekitWindowCoveringImpl.java @@ -12,14 +12,15 @@ */ package org.openhab.io.homekit.internal.accessories; +import static org.openhab.io.homekit.internal.HomekitCharacteristicType.CURRENT_POSITION; +import static org.openhab.io.homekit.internal.HomekitCharacteristicType.TARGET_POSITION; + import java.util.List; import java.util.concurrent.CompletableFuture; -import org.eclipse.jdt.annotation.Nullable; import org.eclipse.smarthome.core.library.items.RollershutterItem; import org.eclipse.smarthome.core.library.types.PercentType; import org.openhab.io.homekit.internal.HomekitAccessoryUpdater; -import org.openhab.io.homekit.internal.HomekitCharacteristicType; import org.openhab.io.homekit.internal.HomekitSettings; import org.openhab.io.homekit.internal.HomekitTaggedItem; @@ -35,14 +36,14 @@ public class HomekitWindowCoveringImpl extends AbstractHomekitAccessoryImpl implements WindowCoveringAccessory { public HomekitWindowCoveringImpl(HomekitTaggedItem taggedItem, List mandatoryCharacteristics, - HomekitAccessoryUpdater updater, HomekitSettings settings) throws IncompleteAccessoryException { + HomekitAccessoryUpdater updater, HomekitSettings settings) { super(taggedItem, mandatoryCharacteristics, updater, settings); this.getServices().add(new WindowCoveringService(this)); } @Override public CompletableFuture getCurrentPosition() { - PercentType value = getStateAs(HomekitCharacteristicType.CURRENT_POSITION, PercentType.class); + PercentType value = getStateAs(CURRENT_POSITION, PercentType.class); return CompletableFuture.completedFuture(value != null ? 100 - value.intValue() : 100); } @@ -57,18 +58,14 @@ public CompletableFuture getTargetPosition() { } @Override - public CompletableFuture setTargetPosition(int value) throws Exception { - final @Nullable RollershutterItem item = getItem(HomekitCharacteristicType.TARGET_POSITION, - RollershutterItem.class); - if (item != null) { - item.send(new PercentType(100 - value)); - } + public CompletableFuture setTargetPosition(int value) { + getItem(TARGET_POSITION, RollershutterItem.class).ifPresent(item -> item.send(new PercentType(100 - value))); return CompletableFuture.completedFuture(null); } @Override public void subscribeCurrentPosition(HomekitCharacteristicChangeCallback callback) { - subscribe(HomekitCharacteristicType.CURRENT_POSITION, callback); + subscribe(CURRENT_POSITION, callback); } @Override @@ -78,12 +75,12 @@ public void subscribePositionState(HomekitCharacteristicChangeCallback callback) @Override public void subscribeTargetPosition(HomekitCharacteristicChangeCallback callback) { - subscribe(HomekitCharacteristicType.TARGET_POSITION, callback); + subscribe(TARGET_POSITION, callback); } @Override public void unsubscribeCurrentPosition() { - unsubscribe(HomekitCharacteristicType.CURRENT_POSITION); + unsubscribe(CURRENT_POSITION); } @Override @@ -93,6 +90,6 @@ public void unsubscribePositionState() { @Override public void unsubscribeTargetPosition() { - unsubscribe(HomekitCharacteristicType.CURRENT_POSITION); + unsubscribe(CURRENT_POSITION); } } diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/IncompleteAccessoryException.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/IncompleteAccessoryException.java index 184f735d6ba2e..15fb272759b9f 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/IncompleteAccessoryException.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/accessories/IncompleteAccessoryException.java @@ -12,12 +12,14 @@ */ package org.openhab.io.homekit.internal.accessories; +import org.eclipse.jdt.annotation.NonNullByDefault; import org.openhab.io.homekit.internal.HomekitCharacteristicType; /** * * @author Tim Harper - Initial contribution */ +@NonNullByDefault public class IncompleteAccessoryException extends Exception { private static final long serialVersionUID = 8595808359805444177L;