2 * Copyright (c) 2010-2021 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.tado.internal.discovery;
15 import static org.openhab.binding.tado.internal.TadoBindingConstants.*;
17 import java.io.IOException;
18 import java.util.Collections;
19 import java.util.HashMap;
20 import java.util.List;
23 import java.util.concurrent.ScheduledFuture;
24 import java.util.concurrent.TimeUnit;
25 import java.util.stream.Collectors;
26 import java.util.stream.Stream;
28 import org.openhab.binding.tado.internal.TadoBindingConstants;
29 import org.openhab.binding.tado.internal.api.ApiException;
30 import org.openhab.binding.tado.internal.api.model.MobileDevice;
31 import org.openhab.binding.tado.internal.api.model.Zone;
32 import org.openhab.binding.tado.internal.handler.TadoHomeHandler;
33 import org.openhab.core.config.discovery.AbstractDiscoveryService;
34 import org.openhab.core.config.discovery.DiscoveryResult;
35 import org.openhab.core.config.discovery.DiscoveryResultBuilder;
36 import org.openhab.core.thing.ThingTypeUID;
37 import org.openhab.core.thing.ThingUID;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
42 * Discovery service for zones and mobile devices.
44 * @author Dennis Frommknecht - Initial contribution
46 public class TadoDiscoveryService extends AbstractDiscoveryService {
47 private static final int TIMEOUT = 5;
48 private static final long REFRESH = 600;
50 private final Logger logger = LoggerFactory.getLogger(TadoDiscoveryService.class);
52 private ScheduledFuture<?> discoveryFuture;
54 public static final Set<ThingTypeUID> DISCOVERABLE_THING_TYPES_UIDS = Collections
55 .unmodifiableSet(Stream.of(THING_TYPE_ZONE, THING_TYPE_MOBILE_DEVICE).collect(Collectors.toSet()));
57 private TadoHomeHandler homeHandler;
59 public TadoDiscoveryService(TadoHomeHandler tadoHomeHandler) {
60 super(DISCOVERABLE_THING_TYPES_UIDS, TIMEOUT);
61 this.homeHandler = tadoHomeHandler;
64 public void activate() {
69 public void deactivate() {
74 protected void startScan() {
75 if (homeHandler.getHomeId() == null) {
80 discoverMobileDevices();
84 protected void startBackgroundDiscovery() {
85 logger.debug("Start Tado background discovery");
86 if (discoveryFuture == null || discoveryFuture.isCancelled()) {
87 logger.debug("Start Scan");
88 discoveryFuture = scheduler.scheduleWithFixedDelay(this::startScan, 30, REFRESH, TimeUnit.SECONDS);
93 protected void stopBackgroundDiscovery() {
94 logger.debug("Stop Tado background discovery");
95 if (discoveryFuture != null && !discoveryFuture.isCancelled()) {
96 discoveryFuture.cancel(true);
97 discoveryFuture = null;
101 private void discoverZones() {
102 Long homeId = homeHandler.getHomeId();
104 List<Zone> zoneList = homeHandler.getApi().listZones(homeId);
106 if (zoneList != null) {
107 for (Zone zone : zoneList) {
108 notifyZoneDiscovery(homeId, zone);
111 } catch (IOException | ApiException e) {
112 logger.debug("Could not discover tado zones: {}", e.getMessage(), e);
116 private void notifyZoneDiscovery(Long homeId, Zone zone) {
117 Integer zoneId = zone.getId();
119 ThingUID bridgeUID = this.homeHandler.getThing().getUID();
120 ThingUID uid = new ThingUID(TadoBindingConstants.THING_TYPE_ZONE, bridgeUID, zoneId.toString());
122 Map<String, Object> properties = new HashMap<>();
123 properties.put(CONFIG_ZONE_ID, zoneId);
125 DiscoveryResult result = DiscoveryResultBuilder.create(uid).withBridge(bridgeUID).withLabel(zone.getName())
126 .withProperties(properties).withRepresentationProperty(CONFIG_ZONE_ID).build();
128 thingDiscovered(result);
130 logger.debug("Discovered zone '{}' with id {} ({})", zone.getName(), zoneId.toString(), uid);
133 private void discoverMobileDevices() {
134 Long homeId = homeHandler.getHomeId();
136 List<MobileDevice> mobileDeviceList = homeHandler.getApi().listMobileDevices(homeId);
138 if (mobileDeviceList != null) {
139 for (MobileDevice mobileDevice : mobileDeviceList) {
140 if (mobileDevice.getSettings().isGeoTrackingEnabled()) {
141 notifyMobileDeviceDiscovery(homeId, mobileDevice);
145 } catch (IOException | ApiException e) {
146 logger.debug("Could not discover tado zones: {}", e.getMessage(), e);
150 private void notifyMobileDeviceDiscovery(Long homeId, MobileDevice device) {
151 ThingUID bridgeUID = this.homeHandler.getThing().getUID();
152 ThingUID uid = new ThingUID(TadoBindingConstants.THING_TYPE_MOBILE_DEVICE, bridgeUID,
153 device.getId().toString());
155 Map<String, Object> properties = new HashMap<>();
156 properties.put(CONFIG_MOBILE_DEVICE_ID, device.getId());
158 DiscoveryResult result = DiscoveryResultBuilder.create(uid).withBridge(bridgeUID).withLabel(device.getName())
159 .withProperties(properties).withRepresentationProperty(CONFIG_MOBILE_DEVICE_ID).build();
161 thingDiscovered(result);
163 logger.debug("Discovered mobile device '{}' with id {} ({})", device.getName(), device.getId().toString(), uid);