Skip to content

Commit

Permalink
[tado] Add mDNS discovery (openhab#16861)
Browse files Browse the repository at this point in the history
* [tado] Add mDNS discovery

Signed-off-by: Andrew Fiddian-Green <software@whitebear.ch>
  • Loading branch information
andrewfg authored Jun 14, 2024
1 parent c2d1789 commit fea0212
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 3 deletions.
7 changes: 4 additions & 3 deletions bundles/org.openhab.binding.tado/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ You can then monitor and control all zone types (Heating, AC, Hot Water) as well

## `home` Thing (the Bridge)

The binding supports discovery, but a `home` thing type has to be configured first.
It serves as bridge to the tado° cloud services.
The `home` thing serves as bridge to the tado° cloud services.
The binding will automatically discover this thing and place it in the Inbox.
It has to be manually configured with its `username` and `password` before it will actually go onlime.

Parameter | Required | Description
-|-|-
Expand All @@ -21,7 +22,7 @@ Example `tado.things`
Bridge tado:home:demo [ username="mail@example.com", password="secret" ]
```

Afterwards the discovery will show all zones and mobile devices associated with the user's home.
Once the `home` thing is online, the binding will discover all its respective zones and mobile devices, and place them in the Inbox.

### Channels

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/**
* Copyright (c) 2010-2024 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.tado.internal.discovery;

import static org.openhab.binding.tado.internal.TadoBindingConstants.THING_TYPE_HOME;

import java.util.Set;
import java.util.regex.Pattern;

import javax.jmdns.ServiceInfo;

import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
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.thing.ThingTypeUID;
import org.openhab.core.thing.ThingUID;
import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Discovers Tado Internet Bridges by means of mDNS
*
* @author Andrew Fiddian-Green - Initial contribution
*/
@Component(configurationPid = "discovery.tado")
@NonNullByDefault
public class TadoDiscoveryParticipant implements MDNSDiscoveryParticipant {

private static final String SERVICE_TYPE = "_hap._tcp.local.";
private static final String TADO_INTERNET_BRIDGE = "tado Internet Bridge";
private static final String DISCOVERY_BRIDGE_LABEL_KEY = "discovery.bridge.label";

public static final Pattern VALID_IP_V4_ADDRESS = Pattern
.compile("\\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\.|$)){4}\\b");

private final Logger logger = LoggerFactory.getLogger(TadoDiscoveryParticipant.class);

@Override
public Set<ThingTypeUID> getSupportedThingTypeUIDs() {
return Set.of(THING_TYPE_HOME);
}

@Override
public String getServiceType() {
return SERVICE_TYPE;
}

@Override
public @Nullable DiscoveryResult createResult(ServiceInfo service) {
ThingUID thingUID = getThingUID(service);
if (thingUID != null) {
String ipAddress = thingUID.getId().replace("_", ".");
DiscoveryResult hub = DiscoveryResultBuilder.create(thingUID)
.withLabel(String.format("@text/%s [\"%s\"]", DISCOVERY_BRIDGE_LABEL_KEY, ipAddress)).build();
logger.debug("mDNS discovered tado° internet bridge '{}' on '{}'", thingUID, ipAddress);
return hub;
}
return null;
}

@Override
public @Nullable ThingUID getThingUID(ServiceInfo service) {
if (service.getName().startsWith(TADO_INTERNET_BRIDGE)) {
for (String host : service.getHostAddresses()) {
if (VALID_IP_V4_ADDRESS.matcher(host).matches()) {
return new ThingUID(THING_TYPE_HOME, host.replace('.', '_'));
}
}
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -109,3 +109,7 @@ channel-type.tado.verticalSwing.state.option.MID_DOWN = MID-DOWN
channel-type.tado.verticalSwing.state.option.DOWN = DOWN
channel-type.tado.verticalSwing.state.option.ON = ON
channel-type.tado.verticalSwing.state.option.OFF = OFF

# discovery

discovery.bridge.label = tado° Internet Bridge ({0})

0 comments on commit fea0212

Please sign in to comment.