]> git.basschouten.com Git - openhab-addons.git/blob
6f769755c2fde6a244b0915a9d38b3f87224ac61
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2022 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.command;
14
15 import java.io.BufferedReader;
16 import java.io.InputStreamReader;
17 import java.util.Arrays;
18 import java.util.List;
19
20 import javax.ws.rs.client.ClientBuilder;
21
22 import org.eclipse.jdt.annotation.NonNullByDefault;
23 import org.eclipse.jdt.annotation.Nullable;
24 import org.openhab.binding.tesla.internal.TeslaBindingConstants;
25 import org.openhab.binding.tesla.internal.discovery.TeslaAccountDiscoveryService;
26 import org.openhab.binding.tesla.internal.handler.TeslaSSOHandler;
27 import org.openhab.core.config.discovery.DiscoveryResult;
28 import org.openhab.core.config.discovery.DiscoveryResultBuilder;
29 import org.openhab.core.io.console.Console;
30 import org.openhab.core.io.console.extensions.AbstractConsoleCommandExtension;
31 import org.openhab.core.io.console.extensions.ConsoleCommandExtension;
32 import org.openhab.core.io.net.http.HttpClientFactory;
33 import org.openhab.core.thing.ThingUID;
34 import org.openhab.core.util.UIDUtils;
35 import org.osgi.service.component.annotations.Activate;
36 import org.osgi.service.component.annotations.Component;
37 import org.osgi.service.component.annotations.Reference;
38 import org.osgi.service.component.annotations.ReferenceCardinality;
39
40 /**
41  * Console commands for interacting with the Tesla integration
42  *
43  * @author Nicolai Grødum - Initial contribution
44  * @author Kai Kreuzer - refactored to use Tesla account thing
45  */
46 @NonNullByDefault
47 @Component(service = ConsoleCommandExtension.class)
48 public class TeslaCommandExtension extends AbstractConsoleCommandExtension {
49
50     private static final String CMD_LOGIN = "login";
51
52     @Reference(cardinality = ReferenceCardinality.OPTIONAL)
53     private @Nullable ClientBuilder injectedClientBuilder;
54
55     private final TeslaAccountDiscoveryService teslaAccountDiscoveryService;
56     private final HttpClientFactory httpClientFactory;
57
58     @Activate
59     public TeslaCommandExtension(@Reference TeslaAccountDiscoveryService teslaAccountDiscoveryService,
60             @Reference HttpClientFactory httpClientFactory) {
61         super("tesla", "Interact with the Tesla integration.");
62         this.teslaAccountDiscoveryService = teslaAccountDiscoveryService;
63         this.httpClientFactory = httpClientFactory;
64     }
65
66     @Override
67     public void execute(String[] args, Console console) {
68         if (args.length > 0) {
69             String subCommand = args[0];
70             switch (subCommand) {
71                 case CMD_LOGIN:
72                     if (args.length == 1) {
73                         try {
74                             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
75                             console.print("Username (email): ");
76                             String username = br.readLine();
77                             console.println(username);
78
79                             console.print("Password: ");
80
81                             String pwd = br.readLine();
82                             console.println("");
83                             console.println("Attempting login...");
84                             login(console, username, pwd);
85                         } catch (Exception e) {
86                             console.println(e.toString());
87                         }
88                     } else if (args.length == 3) {
89                         login(console, args[1], args[2]);
90                     } else {
91                         printUsage(console);
92                     }
93                     break;
94
95                 default:
96                     console.println("Unknown command '" + subCommand + "'");
97                     printUsage(console);
98                     break;
99             }
100         }
101     }
102
103     @Override
104     public List<String> getUsages() {
105         return Arrays.asList(buildCommandUsage(CMD_LOGIN + " [<user email>] [<password>]",
106                 "Authenticates the user and provides a refresh token."));
107     }
108
109     private void login(Console console, String username, String password) {
110         TeslaSSOHandler ssoHandler = new TeslaSSOHandler(httpClientFactory.getCommonHttpClient());
111
112         String refreshToken = ssoHandler.authenticate(username, password);
113         if (refreshToken != null) {
114             console.println("Refresh token: " + refreshToken);
115
116             ThingUID thingUID = new ThingUID(TeslaBindingConstants.THING_TYPE_ACCOUNT, UIDUtils.encode(username));
117             DiscoveryResult result = DiscoveryResultBuilder.create(thingUID).withLabel("Tesla Account")
118                     .withProperty(TeslaBindingConstants.CONFIG_REFRESHTOKEN, refreshToken)
119                     .withProperty(TeslaBindingConstants.CONFIG_USERNAME, username)
120                     .withRepresentationProperty(TeslaBindingConstants.CONFIG_USERNAME).build();
121             teslaAccountDiscoveryService.thingDiscovered(result);
122         } else {
123             console.println("Failed to retrieve refresh token");
124         }
125     }
126 }