Skip to content

Commit

Permalink
Metadata changes
Browse files Browse the repository at this point in the history
  • Loading branch information
andylintner committed Oct 13, 2018
1 parent 8ee625d commit 8ede0bc
Show file tree
Hide file tree
Showing 32 changed files with 620 additions and 842 deletions.
43 changes: 19 additions & 24 deletions addons/io/org.openhab.io.homekit/ESH-INF/config/config.xml
Expand Up @@ -15,31 +15,26 @@
<description>Defines the pin, used for pairing, in the form ###-##-###.</description>
<default>031-45-154</default>
</parameter>
<parameter name="useFahrenheitTemperature" type="boolean" required="true">
<label>Use Fahrenheit Temperature</label>
<description>Defines whether or not to direct HomeKit clients to use fahrenheit temperatures instead of celsius.</description>
<default>false</default>
</parameter>
<parameter name="thermostatCoolMode" type="text" required="true">
<label>Thermostat Cool Mode</label>
<description>Defines the string to look for in thermostat heatingCoolingMode characteristics to indicate COOL mode.</description>
<default>CoolOn</default>
</parameter>
<parameter name="thermostatHeatMode" type="text" required="true">
<label>Thermostat Heat Mode</label>
<description>Defines the string to look for in thermostat heatingCoolingMode characteristics to indicate HEAT mode.</description>
<default>HeatOn</default>
</parameter>
<parameter name="thermostatAutoMode" type="text" required="true">
<label>Thermostat Auto Mode</label>
<description>Defines the string to look for in thermostat heatingCoolingMode characteristics to indicate AUTO mode.</description>
<default>Auto</default>
</parameter>
<parameter name="thermostatOffMode" type="text" required="true">
<label>Thermostat Off Mode</label>
<description>Defines the string to look for in thermostat heatingCoolingMode characteristics to indicate OFF mode.</description>
<default>Off</default>
</parameter>
<label>Thermostat Cool Mode</label>
<description>Defines the string to look for in thermostat heatingCoolingMode characteristics to indicate COOL mode.</description>
<default>CoolOn</default>
</parameter>
<parameter name="thermostatHeatMode" type="text" required="true">
<label>Thermostat Heat Mode</label>
<description>Defines the string to look for in thermostat heatingCoolingMode characteristics to indicate HEAT mode.</description>
<default>HeatOn</default>
</parameter>
<parameter name="thermostatAutoMode" type="text" required="true">
<label>Thermostat Auto Mode</label>
<description>Defines the string to look for in thermostat heatingCoolingMode characteristics to indicate AUTO mode.</description>
<default>Auto</default>
</parameter>
<parameter name="thermostatOffMode" type="text" required="true">
<label>Thermostat Off Mode</label>
<description>Defines the string to look for in thermostat heatingCoolingMode characteristics to indicate OFF mode.</description>
<default>Off</default>
</parameter>
<parameter name="networkInterface" type="text" required="false">
<label>Network Interface</label>
<description>Defines the IP address of the network interface to expose the HomeKit integration on.</description>
Expand Down
3 changes: 2 additions & 1 deletion addons/io/org.openhab.io.homekit/OSGI-INF/homekit.xml
Expand Up @@ -11,8 +11,9 @@
-->
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" configuration-policy="optional" immediate="true" modified="modified" name="org.openhab.homekit">
<implementation class="org.openhab.io.homekit.internal.HomekitImpl"/>
<reference bind="setItemRegistry" cardinality="1..1" interface="org.eclipse.smarthome.core.items.ItemRegistry" policy="static" name="ItemRegistry"/>
<reference bind="setMetadataRegistry" cardinality="1..1" interface="org.eclipse.smarthome.core.items.MetadataRegistry" policy="static" name="MetadataRegistry"/>
<reference bind="setStorageService" cardinality="1..1" interface="org.eclipse.smarthome.core.storage.StorageService" policy="static" name="StorageService"/>
<reference bind="setItemRegistry" cardinality="1..1" interface="org.eclipse.smarthome.core.items.ItemRegistry" name="ItemRegistry" policy="static"/>
<service>
<provide interface="org.openhab.io.homekit.Homekit" />
</service>
Expand Down
Binary file not shown.

This file was deleted.

@@ -1,4 +1,4 @@
package org.openhab.io.homekit.accessory;
package org.openhab.io.homekit.accessory.registry;

import java.util.Optional;

Expand Down
@@ -1,4 +1,4 @@
package org.openhab.io.homekit.accessory;
package org.openhab.io.homekit.accessory.registry;

import java.util.Map;
import java.util.Optional;
Expand All @@ -8,6 +8,8 @@
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.smarthome.core.items.Item;
import org.eclipse.smarthome.core.items.Metadata;
import org.eclipse.smarthome.core.items.MetadataKey;
import org.eclipse.smarthome.core.items.MetadataRegistry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -16,20 +18,26 @@ public class AccessoryRegistry {
private final Map<String, Accessory> accessoriesByName = new ConcurrentHashMap<>();
private final BiFunction<Item, Metadata, Accessory> accessoryFactory;
private final Logger logger = LoggerFactory.getLogger(AccessoryRegistry.class);
private final String metadataNamespace;
private final MetadataRegistry metadataRegistry;

public AccessoryRegistry(BiFunction<Item, Metadata, Accessory> accessoryFactory) {
public AccessoryRegistry(BiFunction<Item, Metadata, Accessory> accessoryFactory, String metadataNamespace,
MetadataRegistry metadataRegistry) {
this.accessoryFactory = accessoryFactory;
this.metadataNamespace = metadataNamespace;
this.metadataRegistry = metadataRegistry;
}

synchronized void add(Item item, @Nullable Metadata metadata) {
if (!accessoriesByName.containsKey(item.getName())) {
for (String groupName : item.getGroupNames()) {
if (accessoriesByName.containsKey(groupName)) {
accessoriesByName.get(groupName).addChildItem(item, Optional.ofNullable(metadata));
accessoriesByName.get(groupName).addChildItem(item,
Optional.ofNullable(metadata != null ? metadata : getMetadata(item)));
return;
}
}
Accessory accessory = accessoryFactory.apply(item, metadata);
Accessory accessory = accessoryFactory.apply(item, metadata != null ? metadata : getMetadata(item));
if (accessory != null) {
accessoriesByName.put(item.getName(), accessory);
}
Expand Down Expand Up @@ -63,4 +71,8 @@ synchronized void itemUpdated(Item oldElement, Item element) {
accessory.updatedItem(oldElement, element);
}
}

Metadata getMetadata(Item item) {
return metadataRegistry.get(new MetadataKey(metadataNamespace, item.getName()));
}
}
@@ -0,0 +1,7 @@
package org.openhab.io.homekit.accessory.registry;

public enum DiscoveryType {

METADATA,
TAGS
}
@@ -0,0 +1,86 @@
package org.openhab.io.homekit.accessory.registry;

import java.util.function.Predicate;

import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.smarthome.core.common.registry.RegistryChangeListener;
import org.eclipse.smarthome.core.items.Item;
import org.eclipse.smarthome.core.items.ItemRegistry;
import org.eclipse.smarthome.core.items.Metadata;
import org.eclipse.smarthome.core.items.MetadataKey;
import org.eclipse.smarthome.core.items.MetadataRegistry;

public class ItemDiscovery implements RegistryChangeListener<Item> {

private final Predicate<String> tagFilter;
private final AccessoryRegistry accessoryRegistry;
private final MetadataRegistry metadataRegistry;
private final String metadataNamespace;

public ItemDiscovery(ItemRegistry itemRegistry, String metadataNamespace, MetadataRegistry metadataRegistry,
Predicate<String> tagFilter, AccessoryRegistry accessoryRegistry) {
this.tagFilter = tagFilter;
this.accessoryRegistry = accessoryRegistry;
this.metadataNamespace = metadataNamespace;
this.metadataRegistry = metadataRegistry;
itemRegistry.addRegistryChangeListener(this);
}

@Override
public void added(Item element) {
Metadata metadata = getMetadata(element);
if (metadata != null && isCorrectNamespace(metadata)) {
accessoryRegistry.add(element, metadata);
} else if (tagMatches(element)) {
accessoryRegistry.add(element, metadata);
}
}

@Override
public void removed(Item element) {
Metadata metadata = getMetadata(element);
if (metadata != null && isCorrectNamespace(metadata)) {
accessoryRegistry.remove(element.getName());
} else if (tagMatches(element)) {
accessoryRegistry.remove(element.getName());
}
}

@Override
public void updated(Item oldElement, @Nullable Item element) {
Metadata oldMetadata = getMetadata(oldElement);
Metadata metadata = getMetadata(element);
if (oldMetadata != null && isCorrectNamespace(oldMetadata)) {
if (metadata != null && isCorrectNamespace(metadata)) {
accessoryRegistry.itemUpdated(oldElement, element);
} else {
accessoryRegistry.remove(oldElement.getName());
}
} else if (isCorrectNamespace(metadata)) {
accessoryRegistry.add(element, metadata);
} else if (tagMatches(oldElement)) {
if (tagMatches(element)) {
accessoryRegistry.itemUpdated(oldElement, element);
} else {
accessoryRegistry.remove(oldElement.getName());
}
} else if (tagMatches(element)) {
accessoryRegistry.add(element, metadata);
}
}

private boolean tagMatches(Item item) {
return item.getTags().stream().anyMatch(tagFilter)
&& metadataRegistry.get(new MetadataKey(metadataNamespace, item.getName())) == null;
}

private Metadata getMetadata(Item item) {
return metadataRegistry.get(new MetadataKey(metadataNamespace, item.getName()));
}

private boolean isCorrectNamespace(Metadata element) {
MetadataKey key = element.getUID();
return key.getNamespace().equals(metadataNamespace);
}

}
@@ -1,54 +1,65 @@
package org.openhab.io.homekit.accessory;

import java.util.function.Predicate;
package org.openhab.io.homekit.accessory.registry;

import org.eclipse.smarthome.core.common.registry.RegistryChangeListener;
import org.eclipse.smarthome.core.items.Item;
import org.eclipse.smarthome.core.items.ItemRegistry;
import org.eclipse.smarthome.core.items.Metadata;
import org.eclipse.smarthome.core.items.MetadataKey;
import org.eclipse.smarthome.core.items.MetadataRegistry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MetadataRegistryItemDiscovery implements RegistryChangeListener<Metadata> {

private final ItemRegistry itemRegistry;
private final Predicate<Metadata> metadataFilter;
private final AccessoryRegistry accessoryRegistry;
private final String metadataNamespace;
private final Logger logger = LoggerFactory.getLogger(MetadataRegistryItemDiscovery.class);

public MetadataRegistryItemDiscovery(MetadataRegistry metadataRegistry, ItemRegistry itemRegistry,
Predicate<Metadata> metadataFilter, AccessoryRegistry accessoryRegistry) {
String metadataNamespace, AccessoryRegistry accessoryRegistry) {
this.itemRegistry = itemRegistry;
this.metadataFilter = metadataFilter;
this.metadataNamespace = metadataNamespace;
this.accessoryRegistry = accessoryRegistry;
metadataRegistry.addRegistryChangeListener(this);
}

@Override
public void added(Metadata element) {
if (metadataFilter.test(element)) {
if (isCorrectNamepsace(element)) {
Item item = itemRegistry.get(element.getUID().getItemName());
if (item == null) {
logger.warn("Could not find tagged item: " + element.getUID());
return;
}
accessoryRegistry.add(item, element);
}
}

@Override
public void removed(Metadata element) {
if (metadataFilter.test(element)) {
if (isCorrectNamepsace(element)) {
accessoryRegistry.remove(element.getUID().getItemName());
}
}

@Override
public void updated(Metadata oldElement, Metadata element) {
Item item = itemRegistry.get(element.getUID().getItemName());
if (metadataFilter.test(oldElement)) {
if (metadataFilter.test(element)) {
if (isCorrectNamepsace(oldElement)) {
if (isCorrectNamepsace(element)) {
accessoryRegistry.metadataUpdated(item, oldElement, element);
} else {
accessoryRegistry.remove(oldElement.getUID().getItemName());
}
} else if (metadataFilter.test(element)) {
} else if (isCorrectNamepsace(element)) {
accessoryRegistry.add(item, element);
}
}

private boolean isCorrectNamepsace(Metadata element) {
MetadataKey key = element.getUID();
return key.getNamespace().equals(metadataNamespace);
}

}

0 comments on commit 8ede0bc

Please sign in to comment.