[hue] Implementing "[discovery.upnp] Devices may apply a grace period" (#9985)
* [hue] implement PR #2144 in openhab.core * [hue] add binding configuration parameter; return long Signed-off-by: Andrew Fiddian-Green <software@whitebear.ch>pull/10120/head
parent
f8d5ae081b
commit
18e028a632
|
@ -367,3 +367,11 @@ if (receivedEvent == "1000.0")) {
|
|||
//do stuff
|
||||
}
|
||||
```
|
||||
|
||||
### UPnP Discovery: Inbox 'Grace Period'
|
||||
|
||||
The Hue Bridge can sometimes be late in sending its UPnP 'ssdp:alive' notifications even though it has not really gone offline.
|
||||
This means that the Hue Bridge could be repeatedly removed from, and (re)added to, the InBox.
|
||||
Which would lead to confusion in the UI, and repeated logger messages.
|
||||
To prevent this, the binding tells the OpenHAB core to wait for a further period of time ('grace period') before actually removing the Bridge from the Inbox.
|
||||
The 'grace period' has a default value of 50 seconds, but it can be fine tuned in the main UI via Settings | Bindings | Hue | Configure.
|
||||
|
|
|
@ -84,6 +84,9 @@ public class HueBindingConstants {
|
|||
public static final String EVENT_DIMMER_SWITCH = "dimmer_switch_event";
|
||||
public static final String EVENT_TAP_SWITCH = "tap_switch_event";
|
||||
|
||||
// Binding configuration properties
|
||||
public static final String REMOVAL_GRACE_PERIOD = "removalGracePeriod";
|
||||
|
||||
// Bridge config properties
|
||||
public static final String HOST = "ipAddress";
|
||||
public static final String PORT = "port";
|
||||
|
|
|
@ -15,7 +15,9 @@ package org.openhab.binding.hue.internal.discovery;
|
|||
import static org.openhab.binding.hue.internal.HueBindingConstants.*;
|
||||
import static org.openhab.core.thing.Thing.PROPERTY_SERIAL_NUMBER;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
import java.util.Dictionary;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
@ -25,13 +27,20 @@ import org.eclipse.jdt.annotation.Nullable;
|
|||
import org.jupnp.model.meta.DeviceDetails;
|
||||
import org.jupnp.model.meta.ModelDetails;
|
||||
import org.jupnp.model.meta.RemoteDevice;
|
||||
import org.openhab.binding.hue.internal.HueBindingConstants;
|
||||
import org.openhab.core.config.discovery.DiscoveryResult;
|
||||
import org.openhab.core.config.discovery.DiscoveryResultBuilder;
|
||||
import org.openhab.core.config.discovery.upnp.UpnpDiscoveryParticipant;
|
||||
import org.openhab.core.config.discovery.upnp.internal.UpnpDiscoveryService;
|
||||
import org.openhab.core.thing.ThingTypeUID;
|
||||
import org.openhab.core.thing.ThingUID;
|
||||
import org.osgi.service.cm.Configuration;
|
||||
import org.osgi.service.cm.ConfigurationAdmin;
|
||||
import org.osgi.service.component.annotations.Activate;
|
||||
import org.osgi.service.component.annotations.Component;
|
||||
import org.osgi.service.component.annotations.Reference;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* The {@link HueBridgeDiscoveryParticipant} is responsible for discovering new and
|
||||
|
@ -44,6 +53,18 @@ import org.osgi.service.component.annotations.Component;
|
|||
@Component(service = UpnpDiscoveryParticipant.class)
|
||||
public class HueBridgeDiscoveryParticipant implements UpnpDiscoveryParticipant {
|
||||
|
||||
private final Logger logger = LoggerFactory.getLogger(HueBridgeDiscoveryParticipant.class);
|
||||
|
||||
// Hue bridges have maxAge 100 seconds, so set the default grace period to half of that
|
||||
private long removalGracePeriodSeconds = 50;
|
||||
|
||||
private final ConfigurationAdmin configAdmin;
|
||||
|
||||
@Activate
|
||||
public HueBridgeDiscoveryParticipant(final @Reference ConfigurationAdmin configAdmin) {
|
||||
this.configAdmin = configAdmin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<ThingTypeUID> getSupportedThingTypeUIDs() {
|
||||
return Collections.singleton(THING_TYPE_BRIDGE);
|
||||
|
@ -92,4 +113,20 @@ public class HueBridgeDiscoveryParticipant implements UpnpDiscoveryParticipant {
|
|||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getRemovalGracePeriodSeconds(RemoteDevice device) {
|
||||
try {
|
||||
Configuration conf = configAdmin.getConfiguration("binding.hue");
|
||||
Dictionary<String, @Nullable Object> properties = conf.getProperties();
|
||||
Object property = properties.get(HueBindingConstants.REMOVAL_GRACE_PERIOD);
|
||||
if (property != null) {
|
||||
removalGracePeriodSeconds = Long.parseLong(property.toString());
|
||||
}
|
||||
} catch (IOException | IllegalStateException | NumberFormatException e) {
|
||||
// fall through to pre-initialised (default) value
|
||||
}
|
||||
logger.trace("getRemovalGracePeriodSeconds={}", removalGracePeriodSeconds);
|
||||
return removalGracePeriodSeconds;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,8 +3,16 @@
|
|||
xmlns:binding="https://openhab.org/schemas/binding/v1.0.0"
|
||||
xsi:schemaLocation="https://openhab.org/schemas/binding/v1.0.0 https://openhab.org/schemas/binding-1.0.0.xsd">
|
||||
|
||||
<name>hue Binding</name>
|
||||
<description>The hue Binding integrates the Philips hue system. It
|
||||
allows to control hue bulbs.</description>
|
||||
<name>Hue Binding</name>
|
||||
<description>The Hue Binding integrates the Philips Hue system. It allows to control Hue bulbs.</description>
|
||||
|
||||
<config-description>
|
||||
<parameter name="removalGracePeriod" type="integer" min="0" step="1" unit="s">
|
||||
<label>Removal Grace Period</label>
|
||||
<description>Extra grace period (seconds) that UPnP discovery shall wait before removing a lost Bridge from the
|
||||
Inbox. Default is 50 seconds.</description>
|
||||
<default>50</default>
|
||||
</parameter>
|
||||
</config-description>
|
||||
|
||||
</binding:binding>
|
||||
|
|
Loading…
Reference in New Issue