]> git.basschouten.com Git - openhab-addons.git/blob
c386097af4209461ff8b0ef451e3ed17b87964d8
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.tado.internal.discovery;
14
15 import static org.openhab.binding.tado.internal.TadoBindingConstants.*;
16
17 import java.io.IOException;
18 import java.util.Collections;
19 import java.util.HashMap;
20 import java.util.List;
21 import java.util.Map;
22 import java.util.Set;
23 import java.util.concurrent.ScheduledFuture;
24 import java.util.concurrent.TimeUnit;
25 import java.util.stream.Collectors;
26 import java.util.stream.Stream;
27
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;
40
41 /**
42  * Discovery service for zones and mobile devices.
43  *
44  * @author Dennis Frommknecht - Initial contribution
45  */
46 public class TadoDiscoveryService extends AbstractDiscoveryService {
47     private static final int TIMEOUT = 5;
48     private static final long REFRESH = 600;
49
50     private final Logger logger = LoggerFactory.getLogger(TadoDiscoveryService.class);
51
52     private ScheduledFuture<?> discoveryFuture;
53
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()));
56
57     private TadoHomeHandler homeHandler;
58
59     public TadoDiscoveryService(TadoHomeHandler tadoHomeHandler) {
60         super(DISCOVERABLE_THING_TYPES_UIDS, TIMEOUT);
61         this.homeHandler = tadoHomeHandler;
62     }
63
64     public void activate() {
65         super.activate(null);
66     }
67
68     @Override
69     public void deactivate() {
70         super.deactivate();
71     }
72
73     @Override
74     protected void startScan() {
75         if (homeHandler.getHomeId() == null) {
76             return;
77         }
78
79         discoverZones();
80         discoverMobileDevices();
81     }
82
83     @Override
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);
89         }
90     }
91
92     @Override
93     protected void stopBackgroundDiscovery() {
94         logger.debug("Stop Tado background discovery");
95         if (discoveryFuture != null && !discoveryFuture.isCancelled()) {
96             discoveryFuture.cancel(true);
97             discoveryFuture = null;
98         }
99     }
100
101     private void discoverZones() {
102         Long homeId = homeHandler.getHomeId();
103         try {
104             List<Zone> zoneList = homeHandler.getApi().listZones(homeId);
105
106             if (zoneList != null) {
107                 for (Zone zone : zoneList) {
108                     notifyZoneDiscovery(homeId, zone);
109                 }
110             }
111         } catch (IOException | ApiException e) {
112             logger.debug("Could not discover tado zones: {}", e.getMessage(), e);
113         }
114     }
115
116     private void notifyZoneDiscovery(Long homeId, Zone zone) {
117         Integer zoneId = zone.getId();
118
119         ThingUID bridgeUID = this.homeHandler.getThing().getUID();
120         ThingUID uid = new ThingUID(TadoBindingConstants.THING_TYPE_ZONE, bridgeUID, zoneId.toString());
121
122         Map<String, Object> properties = new HashMap<>();
123         properties.put(CONFIG_ZONE_ID, zoneId);
124
125         DiscoveryResult result = DiscoveryResultBuilder.create(uid).withBridge(bridgeUID).withLabel(zone.getName())
126                 .withProperties(properties).withRepresentationProperty(CONFIG_ZONE_ID).build();
127
128         thingDiscovered(result);
129
130         logger.debug("Discovered zone '{}' with id {} ({})", zone.getName(), zoneId.toString(), uid);
131     }
132
133     private void discoverMobileDevices() {
134         Long homeId = homeHandler.getHomeId();
135         try {
136             List<MobileDevice> mobileDeviceList = homeHandler.getApi().listMobileDevices(homeId);
137
138             if (mobileDeviceList != null) {
139                 for (MobileDevice mobileDevice : mobileDeviceList) {
140                     if (mobileDevice.getSettings().isGeoTrackingEnabled()) {
141                         notifyMobileDeviceDiscovery(homeId, mobileDevice);
142                     }
143                 }
144             }
145         } catch (IOException | ApiException e) {
146             logger.debug("Could not discover tado zones: {}", e.getMessage(), e);
147         }
148     }
149
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());
154
155         Map<String, Object> properties = new HashMap<>();
156         properties.put(CONFIG_MOBILE_DEVICE_ID, device.getId());
157
158         DiscoveryResult result = DiscoveryResultBuilder.create(uid).withBridge(bridgeUID).withLabel(device.getName())
159                 .withProperties(properties).withRepresentationProperty(CONFIG_MOBILE_DEVICE_ID).build();
160
161         thingDiscovered(result);
162
163         logger.debug("Discovered mobile device '{}' with id {} ({})", device.getName(), device.getId().toString(), uid);
164     }
165 }