//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.
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;
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
@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);
}
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;
+ }
}
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>