[homekit] mark item dirty only if it has homekit metadata (#12293)
* mark item dirty only if it has homekit metadata Signed-off-by: Eugen Freiter <freiter@gmx.de>
This commit is contained in:
parent
bc7e01726f
commit
f29034fe87
@ -32,6 +32,7 @@ import org.openhab.core.items.ItemNotFoundException;
|
|||||||
import org.openhab.core.items.ItemRegistry;
|
import org.openhab.core.items.ItemRegistry;
|
||||||
import org.openhab.core.items.ItemRegistryChangeListener;
|
import org.openhab.core.items.ItemRegistryChangeListener;
|
||||||
import org.openhab.core.items.Metadata;
|
import org.openhab.core.items.Metadata;
|
||||||
|
import org.openhab.core.items.MetadataKey;
|
||||||
import org.openhab.core.items.MetadataRegistry;
|
import org.openhab.core.items.MetadataRegistry;
|
||||||
import org.openhab.core.storage.Storage;
|
import org.openhab.core.storage.Storage;
|
||||||
import org.openhab.core.storage.StorageService;
|
import org.openhab.core.storage.StorageService;
|
||||||
@ -88,31 +89,40 @@ public class HomekitChangeListener implements ItemRegistryChangeListener {
|
|||||||
metadataChangeListener = new RegistryChangeListener<Metadata>() {
|
metadataChangeListener = new RegistryChangeListener<Metadata>() {
|
||||||
@Override
|
@Override
|
||||||
public void added(final Metadata metadata) {
|
public void added(final Metadata metadata) {
|
||||||
|
final MetadataKey uid = metadata.getUID();
|
||||||
|
if (HomekitAccessoryFactory.METADATA_KEY.equalsIgnoreCase(uid.getNamespace())) {
|
||||||
try {
|
try {
|
||||||
markDirty(itemRegistry.getItem(metadata.getUID().getItemName()));
|
markDirty(itemRegistry.getItem(uid.getItemName()));
|
||||||
} catch (ItemNotFoundException e) {
|
} catch (ItemNotFoundException e) {
|
||||||
logger.debug("Could not found item for metadata {}", metadata);
|
logger.debug("Could not find item for metadata {}", metadata);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void removed(final Metadata metadata) {
|
public void removed(final Metadata metadata) {
|
||||||
|
final MetadataKey uid = metadata.getUID();
|
||||||
|
if (HomekitAccessoryFactory.METADATA_KEY.equalsIgnoreCase(uid.getNamespace())) {
|
||||||
try {
|
try {
|
||||||
markDirty(itemRegistry.getItem(metadata.getUID().getItemName()));
|
markDirty(itemRegistry.getItem(uid.getItemName()));
|
||||||
} catch (ItemNotFoundException e) {
|
} catch (ItemNotFoundException e) {
|
||||||
logger.debug("Could not found item for metadata {}", metadata);
|
logger.debug("Could not find item for metadata {}", metadata);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updated(final Metadata metadata, final Metadata e1) {
|
public void updated(final Metadata oldMetadata, final Metadata newMetadata) {
|
||||||
|
final MetadataKey oldUid = oldMetadata.getUID();
|
||||||
|
final MetadataKey newUid = newMetadata.getUID();
|
||||||
|
if (HomekitAccessoryFactory.METADATA_KEY.equalsIgnoreCase(oldUid.getNamespace())
|
||||||
|
|| HomekitAccessoryFactory.METADATA_KEY.equalsIgnoreCase(newUid.getNamespace())) {
|
||||||
try {
|
try {
|
||||||
markDirty(itemRegistry.getItem(metadata.getUID().getItemName()));
|
// the item name is same in old and new metadata, so we can take any.
|
||||||
if (!metadata.getUID().getItemName().equals(e1.getUID().getItemName())) {
|
markDirty(itemRegistry.getItem(oldUid.getItemName()));
|
||||||
markDirty(itemRegistry.getItem(e1.getUID().getItemName()));
|
|
||||||
}
|
|
||||||
} catch (ItemNotFoundException e) {
|
} catch (ItemNotFoundException e) {
|
||||||
logger.debug("Could not found item for metadata {}", metadata);
|
logger.debug("Could not find item for metadata {}", oldMetadata);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -148,10 +158,16 @@ public class HomekitChangeListener implements ItemRegistryChangeListener {
|
|||||||
accessoryRegistry.setConfigurationRevision(revision);
|
accessoryRegistry.setConfigurationRevision(revision);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean hasHomeKitMetadata(Item item) {
|
||||||
|
return metadataRegistry.get(new MetadataKey(HomekitAccessoryFactory.METADATA_KEY, item.getUID())) != null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void added(Item item) {
|
public synchronized void added(Item item) {
|
||||||
|
if (hasHomeKitMetadata(item)) {
|
||||||
markDirty(item);
|
markDirty(item);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void allItemsChanged(Collection<String> oldItemNames) {
|
public void allItemsChanged(Collection<String> oldItemNames) {
|
||||||
@ -179,8 +195,10 @@ public class HomekitChangeListener implements ItemRegistryChangeListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void removed(Item item) {
|
public synchronized void removed(Item item) {
|
||||||
|
if (hasHomeKitMetadata(item)) {
|
||||||
markDirty(item);
|
markDirty(item);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Optional<Item> getItemOptional(String name) {
|
private Optional<Item> getItemOptional(String name) {
|
||||||
try {
|
try {
|
||||||
@ -193,17 +211,17 @@ public class HomekitChangeListener implements ItemRegistryChangeListener {
|
|||||||
public void makeNewConfigurationRevision() {
|
public void makeNewConfigurationRevision() {
|
||||||
final int newRevision = accessoryRegistry.makeNewConfigurationRevision();
|
final int newRevision = accessoryRegistry.makeNewConfigurationRevision();
|
||||||
lastAccessoryCount = accessoryRegistry.getAllAccessories().size();
|
lastAccessoryCount = accessoryRegistry.getAllAccessories().size();
|
||||||
logger.trace("make new configuration revision. new revision number {}, number of accessories {}", newRevision,
|
logger.trace("Make new configuration revision. new revision number {}, number of accessories {}", newRevision,
|
||||||
lastAccessoryCount);
|
lastAccessoryCount);
|
||||||
storage.put(REVISION_CONFIG, "" + newRevision);
|
storage.put(REVISION_CONFIG, "" + newRevision);
|
||||||
storage.put(ACCESSORY_COUNT, "" + lastAccessoryCount);
|
storage.put(ACCESSORY_COUNT, "" + lastAccessoryCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void applyUpdates() {
|
private synchronized void applyUpdates() {
|
||||||
logger.trace("apply updates");
|
logger.trace("Apply updates");
|
||||||
for (final String name : pendingUpdates) {
|
for (final String name : pendingUpdates) {
|
||||||
accessoryRegistry.remove(name);
|
accessoryRegistry.remove(name);
|
||||||
logger.trace(" add items {}", name);
|
logger.trace(" Add items {}", name);
|
||||||
getItemOptional(name).ifPresent(this::createRootAccessories);
|
getItemOptional(name).ifPresent(this::createRootAccessories);
|
||||||
}
|
}
|
||||||
if (!pendingUpdates.isEmpty()) {
|
if (!pendingUpdates.isEmpty()) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user