]> git.basschouten.com Git - openhab-addons.git/blob
1dcbb2ee215f65ba68ab11704c95e732cc6d0039
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2024 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.tapocontrol.internal.api;
14
15 import static org.openhab.binding.tapocontrol.internal.constants.TapoBindingSettings.*;
16 import static org.openhab.binding.tapocontrol.internal.constants.TapoComConstants.*;
17 import static org.openhab.binding.tapocontrol.internal.constants.TapoErrorCode.*;
18 import static org.openhab.binding.tapocontrol.internal.helpers.utils.JsonUtils.*;
19
20 import org.eclipse.jdt.annotation.NonNullByDefault;
21 import org.eclipse.jetty.client.HttpClient;
22 import org.eclipse.jetty.client.api.Request;
23 import org.openhab.binding.tapocontrol.internal.api.protocol.passthrough.PassthroughProtocol;
24 import org.openhab.binding.tapocontrol.internal.devices.bridge.TapoBridgeHandler;
25 import org.openhab.binding.tapocontrol.internal.devices.bridge.dto.TapoCloudLoginData;
26 import org.openhab.binding.tapocontrol.internal.devices.bridge.dto.TapoCloudLoginResult;
27 import org.openhab.binding.tapocontrol.internal.discovery.dto.TapoDiscoveryResultList;
28 import org.openhab.binding.tapocontrol.internal.dto.TapoRequest;
29 import org.openhab.binding.tapocontrol.internal.dto.TapoResponse;
30 import org.openhab.binding.tapocontrol.internal.helpers.TapoCredentials;
31 import org.openhab.binding.tapocontrol.internal.helpers.TapoErrorHandler;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35 /**
36  * Handler class for TAPO-Cloud connections.
37  *
38  * @author Christian Wild - Initial contribution
39  */
40 @NonNullByDefault
41 public class TapoCloudConnector implements TapoConnectorInterface {
42     private final Logger logger = LoggerFactory.getLogger(TapoCloudConnector.class);
43     private final TapoBridgeHandler bridge;
44
45     private @NonNullByDefault({}) TapoCloudLoginResult loginResult;
46     private String token = "";
47     private String uid;
48     private PassthroughProtocol passthrough;
49
50     /***********************
51      * Init Class
52      **********************/
53
54     public TapoCloudConnector(TapoBridgeHandler bridge) {
55         this.bridge = bridge;
56         this.uid = bridge.getUID().getAsString();
57         passthrough = new PassthroughProtocol(this);
58     }
59
60     /***********************
61      * Response-Handling
62      **********************/
63
64     /**
65      * handle received reponse-string
66      */
67     @Override
68     public void responsePasstrough(String response, String command) {
69     }
70
71     /**
72      * handle received response
73      */
74     @Override
75     public void handleResponse(TapoResponse tapoResponse, String command) throws TapoErrorHandler {
76         switch (command) {
77             case CLOUD_CMD_LOGIN:
78                 handleLoginResult(tapoResponse);
79                 break;
80             case CLOUD_CMD_GETDEVICES:
81                 bridge.getDiscoveryService().addScanResults(getDeviceListFromResponse(tapoResponse));
82                 break;
83             default:
84                 logger.debug("({}) handleResponse - unknown command: {}", uid, command);
85                 throw new TapoErrorHandler(ERR_BINDING_NOT_IMPLEMENTED);
86         }
87     }
88
89     /**
90      * set bridge error
91      */
92     @Override
93     public void handleError(TapoErrorHandler tapoError) {
94         bridge.setError(tapoError);
95     }
96
97     /***********************
98      * Login Handling
99      **********************/
100     /**
101      * login to cloud
102      */
103     public boolean login(TapoCredentials credentials) throws TapoErrorHandler {
104         logout();
105
106         TapoCloudLoginData loginData = new TapoCloudLoginData(credentials.username(), credentials.password());
107         TapoRequest request = new TapoRequest(CLOUD_CMD_LOGIN, loginData);
108
109         passthrough.sendRequest(request);
110         return isLoggedIn();
111     }
112
113     /*
114      * get response from login and set token
115      */
116     private void handleLoginResult(TapoResponse tapoResponse) throws TapoErrorHandler {
117         logger.trace("({}) received login result: {}", uid, tapoResponse);
118         loginResult = getObjectFromJson(tapoResponse.result(), TapoCloudLoginResult.class);
119         token = loginResult.token();
120         if (!isLoggedIn()) {
121             throw new TapoErrorHandler(ERR_API_LOGIN);
122         }
123     }
124
125     public void logout() {
126         loginResult = new TapoCloudLoginResult();
127         token = "";
128     }
129
130     public boolean isLoggedIn() {
131         return !token.isBlank();
132     }
133
134     /***********************
135      * Cloud Action Handlers
136      **********************/
137     /**
138      * Query DeviceList from cloud
139      */
140     public void getDeviceList() {
141         TapoRequest request = new TapoRequest(CLOUD_CMD_GETDEVICES);
142         logger.trace("({}) sending cloud command: {}", uid, request);
143         try {
144             passthrough.sendRequest(request);
145         } catch (TapoErrorHandler tapoError) {
146             logger.debug("({}) get devicelist failed: {}", uid, tapoError.getCode());
147             handleError(tapoError);
148         }
149     }
150
151     /**
152      * get DeviceList from response
153      */
154     private TapoDiscoveryResultList getDeviceListFromResponse(TapoResponse tapoResponse) throws TapoErrorHandler {
155         logger.trace("({}) received devicelist: {}", uid, tapoResponse);
156         return getObjectFromJson(tapoResponse.result(), TapoDiscoveryResultList.class);
157     }
158
159     /***********************
160      * Get Values
161      **********************/
162
163     @Override
164     public HttpClient getHttpClient() {
165         return bridge.getHttpClient();
166     }
167
168     @Override
169     public String getThingUID() {
170         return bridge.getUID().toString();
171     }
172
173     /************************
174      * Private Helpers
175      ************************/
176
177     /**
178      * Get Cloud-URL
179      */
180     @Override
181     public String getBaseUrl() {
182         String url = TAPO_CLOUD_URL;
183         if (!token.isBlank()) {
184             url = url + "?token=" + token;
185         }
186         return url;
187     }
188
189     /**
190      * Set http-headers
191      */
192     public Request setHeaders(Request httpRequest) {
193         httpRequest.header("content-type", CONTENT_TYPE_JSON);
194         httpRequest.header("Accept", CONTENT_TYPE_JSON);
195         return httpRequest;
196     }
197 }