]> git.basschouten.com Git - openhab-addons.git/blob
63bc0d5cfd80648b38b048d6b65223364ccd03fd
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2020 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.tesla.internal.discovery;
14
15 import java.util.Map;
16
17 import org.eclipse.jdt.annotation.NonNull;
18 import org.eclipse.jdt.annotation.Nullable;
19 import org.openhab.binding.tesla.internal.TeslaBindingConstants;
20 import org.openhab.binding.tesla.internal.TeslaHandlerFactory;
21 import org.openhab.binding.tesla.internal.handler.TeslaAccountHandler;
22 import org.openhab.binding.tesla.internal.handler.VehicleListener;
23 import org.openhab.binding.tesla.internal.protocol.Vehicle;
24 import org.openhab.binding.tesla.internal.protocol.VehicleConfig;
25 import org.openhab.core.config.discovery.AbstractDiscoveryService;
26 import org.openhab.core.config.discovery.DiscoveryResult;
27 import org.openhab.core.config.discovery.DiscoveryResultBuilder;
28 import org.openhab.core.config.discovery.DiscoveryService;
29 import org.openhab.core.thing.ThingTypeUID;
30 import org.openhab.core.thing.ThingUID;
31 import org.openhab.core.thing.binding.ThingHandler;
32 import org.openhab.core.thing.binding.ThingHandlerService;
33 import org.osgi.service.component.annotations.Component;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 /**
38  * This service is used by {@link TeslaAccountHandler} instances in order to
39  * automatically provide vehicle information from the account.
40  *
41  * @author Kai Kreuzer - Initial contribution
42  *
43  */
44 @Component(service = ThingHandlerService.class)
45 public class TeslaVehicleDiscoveryService extends AbstractDiscoveryService
46         implements DiscoveryService, VehicleListener, ThingHandlerService {
47     private final Logger logger = LoggerFactory.getLogger(TeslaVehicleDiscoveryService.class);
48
49     public TeslaVehicleDiscoveryService() throws IllegalArgumentException {
50         super(TeslaHandlerFactory.SUPPORTED_THING_TYPES_UIDS, 10, true);
51     }
52
53     private TeslaAccountHandler handler;
54
55     @Override
56     public void setThingHandler(ThingHandler handler) {
57         this.handler = (TeslaAccountHandler) handler;
58         this.handler.addVehicleListener(this);
59     }
60
61     @Override
62     public ThingHandler getThingHandler() {
63         return handler;
64     }
65
66     @Override
67     protected void startScan() {
68         handler.scanForVehicles();
69     }
70
71     @Override
72     public void activate(@Nullable Map<@NonNull String, @Nullable Object> configProperties) {
73         super.activate(configProperties);
74     }
75
76     @Override
77     public void deactivate() {
78         super.deactivate();
79         if (handler != null) {
80             handler.removeVehicleListener(this);
81         }
82     }
83
84     @Override
85     public void vehicleFound(Vehicle vehicle, VehicleConfig vehicleConfig) {
86         ThingTypeUID type = identifyModel(vehicleConfig);
87         if (type != null) {
88             ThingUID thingUID = new ThingUID(type, handler.getThing().getUID(), vehicle.vin);
89             DiscoveryResult discoveryResult = DiscoveryResultBuilder.create(thingUID).withLabel(vehicle.display_name)
90                     .withBridge(handler.getThing().getUID()).withProperty(TeslaBindingConstants.VIN, vehicle.vin)
91                     .build();
92             thingDiscovered(discoveryResult);
93         }
94     }
95
96     private ThingTypeUID identifyModel(VehicleConfig vehicleConfig) {
97         logger.debug("Found a {} vehicle", vehicleConfig.car_type);
98         switch (vehicleConfig.car_type) {
99             case "models":
100             case "models2":
101                 return TeslaBindingConstants.THING_TYPE_MODELS;
102             case "modelx":
103                 return TeslaBindingConstants.THING_TYPE_MODELX;
104             case "model3":
105                 return TeslaBindingConstants.THING_TYPE_MODEL3;
106             case "modely":
107                 return TeslaBindingConstants.THING_TYPE_MODELY;
108             default:
109                 logger.debug("Found unknown vehicle type '{}' - ignoring it.", vehicleConfig.car_type);
110                 return null;
111         }
112     }
113 }