[miele] Fix mDNS issue where hub repeatedly disappears from, resp. reappears in, the Inbox. (#11834)

Signed-off-by: Andrew Fiddian-Green <software@whitebear.ch>
This commit is contained in:
Andrew Fiddian-Green 2021-12-28 08:49:05 +00:00 committed by GitHub
parent 8d15e0ae7b
commit e9060c462b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 58 additions and 1 deletions

View File

@ -29,6 +29,17 @@ The types of appliances that are supported by this binding are:
The binding is able to auto-discover the Miele XGW3000 gateway.
When an XGW3000 gateway is discovered, all appliances can be subsequently discovered.
### Note on Discovery
The XGW3000 gateway is sometimes a few seconds late in re-announcing itself on the network.
This means that it might repeatedly disappear from, and re-appear in, the Inbox.
To avoid this, there is a discovery configuration parameter `removalGracePeriod` which delays such Inbox disappearances.
The default value is 15 seconds.
If you want to change this value just add the following line to your `$OPENHAB_CONF/services/runtime.cfg` file.
```
discovery.miele:removalGracePeriod=30
```
## Thing Configuration

View File

@ -114,4 +114,5 @@ public class MieleBindingConstants {
public static final String USER_NAME = "userName";
public static final String PASSWORD = "password";
public static final String LANGUAGE = "language";
public static final String REMOVAL_GRACE_PERIOD = "removalGracePeriod";
}

View File

@ -22,13 +22,17 @@ import java.util.Set;
import javax.jmdns.ServiceInfo;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.miele.internal.MieleBindingConstants;
import org.openhab.core.config.discovery.DiscoveryResult;
import org.openhab.core.config.discovery.DiscoveryResultBuilder;
import org.openhab.core.config.discovery.mdns.MDNSDiscoveryParticipant;
import org.openhab.core.config.discovery.mdns.internal.MDNSDiscoveryService;
import org.openhab.core.thing.ThingTypeUID;
import org.openhab.core.thing.ThingUID;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Modified;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -40,7 +44,7 @@ import org.slf4j.LoggerFactory;
* @author Martin Lepsy - Added check for Miele gateway for cleaner discovery
* @author Jacob Laursen - Fixed multicast and protocol support (ZigBee/LAN)
*/
@Component
@Component(configurationPid = "discovery.miele")
public class MieleMDNSDiscoveryParticipant implements MDNSDiscoveryParticipant {
private final Logger logger = LoggerFactory.getLogger(MieleMDNSDiscoveryParticipant.class);
@ -48,6 +52,37 @@ public class MieleMDNSDiscoveryParticipant implements MDNSDiscoveryParticipant {
private static final String SERVICE_NAME = "mieleathome";
private static final String PATH_PROPERTY_NAME = "path";
private long removalGracePeriodSeconds = 15;
@Activate
public void activate(@Nullable Map<String, Object> configProperties) {
updateRemovalGracePeriod(configProperties);
}
@Modified
public void modified(@Nullable Map<String, Object> configProperties) {
updateRemovalGracePeriod(configProperties);
}
/**
* Update the removalGracePeriodSeconds when the component is activates or modified.
*
* @param configProperties the passed configuration parameters.
*/
private void updateRemovalGracePeriod(Map<String, Object> configProperties) {
if (configProperties != null) {
Object value = configProperties.get(MieleBindingConstants.REMOVAL_GRACE_PERIOD);
if (value != null) {
try {
removalGracePeriodSeconds = Integer.parseInt(value.toString());
} catch (NumberFormatException e) {
logger.warn("Configuration property '{}' has invalid value: {}",
MieleBindingConstants.REMOVAL_GRACE_PERIOD, value);
}
}
}
}
@Override
public Set<ThingTypeUID> getSupportedThingTypeUIDs() {
return Collections.singleton(MieleBindingConstants.THING_TYPE_XGW3000);
@ -113,4 +148,14 @@ public class MieleMDNSDiscoveryParticipant implements MDNSDiscoveryParticipant {
return service.getApplication().contains(SERVICE_NAME) && service.getPropertyString(PATH_PROPERTY_NAME) != null
&& service.getPropertyString(PATH_PROPERTY_NAME).equalsIgnoreCase(PATH_TO_CHECK_FOR_XGW3000);
}
/**
* Miele devices are sometimes a few seconds late in updating their mDNS announcements, which means that they are
* repeatedly removed from, and (re)added to, the Inbox. To prevent this, we override this method to specify an
* additional delay period (grace period) to wait before the device is removed from the Inbox.
*/
@Override
public long getRemovalGracePeriodSeconds(ServiceInfo serviceInfo) {
return removalGracePeriodSeconds;
}
}