2 * Copyright (c) 2010-2020 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.tesla.internal;
15 import java.lang.reflect.InvocationTargetException;
16 import java.lang.reflect.Method;
17 import java.math.BigDecimal;
18 import java.text.SimpleDateFormat;
19 import java.util.Date;
22 import org.openhab.core.library.types.DateTimeType;
23 import org.openhab.core.library.types.DecimalType;
24 import org.openhab.core.library.types.OnOffType;
25 import org.openhab.core.library.types.OpenClosedType;
26 import org.openhab.core.library.types.PercentType;
27 import org.openhab.core.library.types.PointType;
28 import org.openhab.core.library.types.QuantityType;
29 import org.openhab.core.library.types.StringType;
30 import org.openhab.core.library.unit.ImperialUnits;
31 import org.openhab.core.library.unit.SIUnits;
32 import org.openhab.core.library.unit.SmartHomeUnits;
33 import org.openhab.core.types.State;
34 import org.openhab.core.types.Type;
36 import tec.uom.se.unit.MetricPrefix;
39 * The {@link TeslaChannelSelectorProxy} class is a helper class to instantiate
40 * and parameterize the {@link TeslaChannelSelector} Enum
42 * @author Karel Goderis - Initial contribution
44 public class TeslaChannelSelectorProxy {
46 public enum TeslaChannelSelector {
48 API("api_version", "api", DecimalType.class, true),
49 AUTO_COND("is_auto_conditioning_on", "autoconditioning", OnOffType.class, false) {
51 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
52 if (s.equals("true") || s.equals("1")) {
53 return super.getState("ON");
55 if (s.equals("false") || s.equals("0")) {
56 return super.getState("OFF");
58 return super.getState(s);
61 AUTOPARK_STATE("autopark_state", "autoparkstate", StringType.class, false),
62 AUTOPARK_STATE_V2("autopark_state_v2", "autoparkstate2", StringType.class, false),
63 AUTOPARK_STYLE("autopark_style", "autoparkstyle", StringType.class, false),
64 BATTERY_CURRENT("battery_current", "batterycurrent", DecimalType.class, false),
65 BATTERY_HEATER("battery_heater_on", "batteryheater", OnOffType.class, false) {
67 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
68 if (s.equals("true") || s.equals("1")) {
69 return super.getState("ON");
71 if (s.equals("false") || s.equals("0")) {
72 return super.getState("OFF");
74 return super.getState(s);
77 BATTERY_HEATER_NO_POWER("battery_heater_no_power", "batteryheaternopower", OnOffType.class, false) {
79 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
80 if (s.equals("true") || s.equals("1")) {
81 return super.getState("ON");
83 if (s.equals("false") || s.equals("0")) {
84 return super.getState("OFF");
86 return super.getState(s);
89 BATTERY_LEVEL("battery_level", "batterylevel", DecimalType.class, false),
90 BATTERY_RANGE("battery_range", "batteryrange", DecimalType.class, false) {
92 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
93 State someState = super.getState(s);
94 BigDecimal value = ((DecimalType) someState).toBigDecimal();
95 return new QuantityType<>(value, ImperialUnits.MILE);
98 CALENDAR_SUPPORTED("calendar_supported", "calendarsupported", OnOffType.class, true) {
100 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
101 if (s.equals("true") || s.equals("1")) {
102 return super.getState("ON");
104 if (s.equals("false") || s.equals("0")) {
105 return super.getState("OFF");
107 return super.getState(s);
110 CALENDAR_ENABLED("calendar_enabled", "calendarenabled", OnOffType.class, false) {
112 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
113 if (s.equals("true") || s.equals("1")) {
114 return super.getState("ON");
116 if (s.equals("false") || s.equals("0")) {
117 return super.getState("OFF");
119 return super.getState(s);
122 CAR_VERSION("car_version", "version", StringType.class, true),
123 CENTER_DISPLAY("center_display_state", "centerdisplay", OnOffType.class, false) {
125 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
126 if (s.equals("true") || s.equals("1")) {
127 return super.getState("ON");
129 if (s.equals("false") || s.equals("0")) {
130 return super.getState("OFF");
132 return super.getState(s);
135 CHARGE(null, "charge", OnOffType.class, false) {
137 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
138 if (s.equals("true") || s.equals("1")) {
139 return super.getState("ON");
141 if (s.equals("false") || s.equals("0")) {
142 return super.getState("OFF");
144 return super.getState(s);
147 CHARGE_CABLE("conn_charge_cable", "chargecable", StringType.class, false),
148 CHARGE_CURRENT_REQUEST("charge_current_request", "chargecurrent", DecimalType.class, false),
149 CHARGE_CURRENT_REQUEST_MAX("charge_current_request_max", "chargemaxcurrent", DecimalType.class, false),
150 CHARGE_ENABLE_REQUEST("charge_enable_request", "chargeenablerequest", OnOffType.class, false) {
152 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
153 if (s.equals("true") || s.equals("1")) {
154 return super.getState("ON");
156 if (s.equals("false") || s.equals("0")) {
157 return super.getState("OFF");
159 return super.getState(s);
162 CHARGE_ENERGY_ADDED("charge_energy_added", "chargeenergyadded", DecimalType.class, false),
163 CHARGE_LIMIT_SOC("charge_limit_soc", "chargelimit", PercentType.class, false),
164 CHARGE_LIMIT_SOC_MAX("charge_limit_soc_max", "chargelimitmaximum", PercentType.class, false),
165 CHARGE_LIMIT_SOC_MIN("charge_limit_soc_min", "chargelimitminimum", PercentType.class, false),
166 CHARGE_LIMIT_SOC_STD("charge_limit_soc_std", "chargelimitsocstandard", PercentType.class, false),
167 CHARGE_PORT_LATCH("charge_port_latch", "chargeportlatch", StringType.class, false),
168 CHARGE_MILES_ADDED_IDEAL("charge_miles_added_ideal", "chargeidealdistanceadded", DecimalType.class, false) {
170 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
171 State someState = super.getState(s);
172 BigDecimal value = ((DecimalType) someState).toBigDecimal();
173 return new QuantityType<>(value, ImperialUnits.MILES_PER_HOUR);
176 CHARGE_MILES_ADDED_RANGE("charge_miles_added_rated", "chargerateddistanceadded", DecimalType.class, false) {
178 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
179 State someState = super.getState(s);
180 BigDecimal value = ((DecimalType) someState).toBigDecimal();
181 return new QuantityType<>(value, ImperialUnits.MILES_PER_HOUR);
184 CHARGE_RATE("charge_rate", "chargerate", DecimalType.class, false) {
186 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
187 State someState = super.getState(s);
188 BigDecimal value = ((DecimalType) someState).toBigDecimal();
189 return new QuantityType<>(value, ImperialUnits.MILES_PER_HOUR);
192 CHARGE_STARTING_RANGE("charge_starting_range", "chargestartingrange", StringType.class, false),
193 CHARGE_STARTING_SOC("charge_starting_soc", "chargestartingsoc", StringType.class, false),
194 CHARGE_STATE("charging_state", "chargingstate", StringType.class, false),
195 CHARGE_TO_MAX("charge_to_max_range", "chargetomax", OnOffType.class, false) {
197 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
198 if (s.equals("true") || s.equals("1")) {
199 return super.getState("ON");
201 if (s.equals("false") || s.equals("0")) {
202 return super.getState("OFF");
204 return super.getState(s);
207 CHARGE_TO_MAX_COUNTER("max_range_charge_counter", "maxcharges", DecimalType.class, false),
208 CHARGEPORT("charge_port_door_open", "chargeport", OnOffType.class, false) {
210 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
211 if (s.equals("true") || s.equals("1")) {
212 return super.getState("ON");
214 if (s.equals("false") || s.equals("0")) {
215 return super.getState("OFF");
217 return super.getState(s);
220 CHARGER_ACTUAL_CURRENT("charger_actual_current", "chargercurrent", DecimalType.class, false),
221 CHARGER_PHASES("charger_phases", "chargerphases", DecimalType.class, false),
222 CHARGER_PILOT_CURRENT("charger_pilot_current", "chargermaxcurrent", DecimalType.class, false),
223 CHARGER_POWER("charger_power", "chargerpower", DecimalType.class, false),
224 CHARGER_VOLTAGE("charger_voltage", "chargervoltage", DecimalType.class, false),
225 CLIMATE_ON("is_climate_on", "climate", OnOffType.class, false) {
227 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
228 if (s.equals("true") || s.equals("1")) {
229 return super.getState("ON");
231 if (s.equals("false") || s.equals("0")) {
232 return super.getState("OFF");
234 return super.getState(s);
237 CLIMATE_MAX_TEMP("max_avail_temp", "maxavailabletemp", DecimalType.class, false),
238 CLIMATE_MIN_TEMP("min_avail_temp", "minavailabletemp", DecimalType.class, false),
239 COLOR("exterior_color", "color", StringType.class, true),
240 DARK_RIMS("dark_rims", "darkrims", OnOffType.class, true) {
242 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
243 if (s.equals("true") || s.equals("1")) {
244 return super.getState("ON");
246 if (s.equals("false") || s.equals("0")) {
247 return super.getState("OFF");
249 return super.getState(s);
252 DISPLAY_NAME("display_name", "name", StringType.class, true),
253 DF("df", "driverfrontdoor", OpenClosedType.class, false) {
255 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
256 if (s.equals("true") || s.equals("1")) {
257 return super.getState("OPEN");
259 if (s.equals("false") || s.equals("0")) {
260 return super.getState("CLOSED");
262 return super.getState(s);
265 DOOR_LOCK("locked", "doorlock", OnOffType.class, false) {
267 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
268 if (s.equals("true") || s.equals("1")) {
269 return super.getState("ON");
271 if (s.equals("false") || s.equals("0")) {
272 return super.getState("OFF");
274 return super.getState(s);
277 DR("dr", "driverreardoor", OpenClosedType.class, false) {
279 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
280 if (s.equals("true") || s.equals("1")) {
281 return super.getState("OPEN");
283 if (s.equals("false") || s.equals("0")) {
284 return super.getState("CLOSED");
286 return super.getState(s);
289 DRIVER_TEMP("driver_temp_setting", "drivertemp", DecimalType.class, false) {
291 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
292 State someState = super.getState(s);
293 BigDecimal value = ((DecimalType) someState).toBigDecimal();
294 return new QuantityType<>(value, SIUnits.CELSIUS);
297 ELEVATION("elevation", "location", DecimalType.class, false) {
300 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
302 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
303 new StringType(proxy.elevation));
306 EST_BATTERY_RANGE("est_battery_range", "estimatedbatteryrange", DecimalType.class, false) {
308 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
309 State someState = super.getState(s);
310 BigDecimal value = ((DecimalType) someState).toBigDecimal();
311 return new QuantityType<>(value, ImperialUnits.MILE);
314 EST_HEADING("est_heading", "headingestimation", DecimalType.class, false) {
316 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
317 State someState = super.getState(s);
318 BigDecimal value = ((DecimalType) someState).toBigDecimal();
319 return new QuantityType<>(value, SmartHomeUnits.DEGREE_ANGLE);
322 EST_RANGE("est_range", "estimatedrange", DecimalType.class, false) {
324 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
325 State someState = super.getState(s);
326 BigDecimal value = ((DecimalType) someState).toBigDecimal();
327 return new QuantityType<>(value, ImperialUnits.MILE);
330 EU_VEHICLE("eu_vehicle", "european", OnOffType.class, true) {
332 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
333 if (s.equals("true") || s.equals("1")) {
334 return super.getState("ON");
336 if (s.equals("false") || s.equals("0")) {
337 return super.getState("OFF");
339 return super.getState(s);
342 FAN_STATUS("fan_status", "fan", DecimalType.class, false),
343 FAST_CHARGER("fast_charger_present", "fastcharger", OnOffType.class, true) {
345 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
346 if (s.equals("true") || s.equals("1")) {
347 return super.getState("ON");
349 if (s.equals("false") || s.equals("0")) {
350 return super.getState("OFF");
352 return super.getState(s);
355 FAST_CHARGER_TYPE("fast_charger_type", "fastchargertype", StringType.class, true),
356 FAST_CHARGER_BRAND("fast_charger_brand", "fastchargerbrand", StringType.class, true),
357 FLASH(null, "flashlights", OnOffType.class, false) {
359 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
360 if (s.equals("true") || s.equals("1")) {
361 return super.getState("ON");
363 if (s.equals("false") || s.equals("0")) {
364 return super.getState("OFF");
366 return super.getState(s);
369 FRONT_DEFROSTER("is_front_defroster_on", "frontdefroster", OnOffType.class, false) {
371 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
372 if (s.equals("true") || s.equals("1")) {
373 return super.getState("ON");
375 if (s.equals("false") || s.equals("0")) {
376 return super.getState("OFF");
378 return super.getState(s);
381 FT("ft", "fronttrunk", OnOffType.class, false) {
383 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
384 if (s.equals("true") || s.equals("1")) {
385 return super.getState("ON");
387 if (s.equals("false") || s.equals("0")) {
388 return super.getState("OFF");
390 return super.getState(s);
393 GPS_AS_OF("gps_as_of", "gpstimestamp", DateTimeType.class, false) {
395 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
396 Date date = new Date();
397 SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
399 date.setTime(Long.valueOf(s) * 1000);
400 return super.getState(dateFormatter.format(date));
403 GUI_DISTANCE_UNITS("gui_distance_units", "distanceunits", StringType.class, true),
404 GUI_TEMPERATURE_UNITS("gui_temperature_units", "temperatureunits", StringType.class, true),
405 GUI_CHARGE_RATE_UNITS("gui_charge_rate_units", "chargerateunits", StringType.class, true),
406 GUI_24H_TIME("gui_24_hour_time", "24hourtime", StringType.class, true),
407 GUI_RANGE_DISPLAY("gui_range_display", "rangedisplay", StringType.class, true),
408 HAS_SPOILER("has_spoiler", "spoiler", OnOffType.class, true) {
410 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
411 if (s.equals("true") || s.equals("1")) {
412 return super.getState("ON");
414 if (s.equals("false") || s.equals("0")) {
415 return super.getState("OFF");
417 return super.getState(s);
420 HEADING("heading", "heading", DecimalType.class, false) {
422 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
423 State someState = super.getState(s);
424 BigDecimal value = ((DecimalType) someState).toBigDecimal();
425 return new QuantityType<>(value, SmartHomeUnits.DEGREE_ANGLE);
428 HONK_HORN(null, "honkhorn", OnOffType.class, false) {
430 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
431 if (s.equals("true") || s.equals("1")) {
432 return super.getState("ON");
434 if (s.equals("false") || s.equals("0")) {
435 return super.getState("OFF");
437 return super.getState(s);
440 HOMELINK_NEARBY("homelink_nearby", "homelink", OnOffType.class, false) {
442 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
443 if (s.equals("true") || s.equals("1")) {
444 return super.getState("ON");
446 if (s.equals("false") || s.equals("0")) {
447 return super.getState("OFF");
449 return super.getState(s);
452 IDEAL_BATTERY_RANGE("ideal_battery_range", "idealbatteryrange", DecimalType.class, false) {
454 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
455 State someState = super.getState(s);
456 BigDecimal value = ((DecimalType) someState).toBigDecimal();
457 return new QuantityType<>(value, ImperialUnits.MILE);
460 INSIDE_TEMP("inside_temp", "insidetemp", DecimalType.class, false) {
462 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
463 State someState = super.getState(s);
464 BigDecimal value = ((DecimalType) someState).toBigDecimal();
465 return new QuantityType<>(value, SIUnits.CELSIUS);
468 LAST_AUTOPARK_ERROR("last_autopark_error", "lastautoparkerror", StringType.class, false),
469 LATITUDE("latitude", "location", DecimalType.class, false) {
471 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
473 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
474 new StringType(proxy.elevation));
477 LATITUDE_EVENT("est_lat", "location", DecimalType.class, false) {
479 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
481 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
482 new StringType(proxy.elevation));
485 LEFT_TEMP_DIR("left_temp_direction", "lefttempdirection", DecimalType.class, false),
486 LONGITUDE("longitude", "location", DecimalType.class, false) {
488 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
490 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
491 new StringType(proxy.elevation));
494 LONGITUDE_EVENT("est_lng", "location", DecimalType.class, false) {
496 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
498 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
499 new StringType(proxy.elevation));
502 MANAGED_CHARGING("managed_charging_active", "managedcharging", OnOffType.class, false) {
504 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
505 if (s.equals("true")) {
506 return super.getState("ON");
508 if (s.equals("false")) {
509 return super.getState("OFF");
511 return super.getState(s);
514 MANAGED_CHARGING_CANCELLED("managed_charging_user_canceled", "managedchargingcancelled", OnOffType.class,
517 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
518 if (s.equals("true")) {
519 return super.getState("ON");
521 if (s.equals("false")) {
522 return super.getState("OFF");
524 return super.getState(s);
527 MANAGED_CHARGING_START("managed_charging_start_time", "managedchargingstart", StringType.class, false),
528 MOBILE_ENABLED(TeslaBindingConstants.MOBILE_ENABLED_STATE, "mobileenabled", OnOffType.class, false) {
530 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
531 if (s.equals("true")) {
532 return super.getState("ON");
534 if (s.equals("false")) {
535 return super.getState("OFF");
537 return super.getState(s);
540 MOTORIZED_CHARGE_PORT("motorized_charge_port", "motorizedchargeport", OnOffType.class, true) {
542 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
543 if (s.equals("true") || s.equals("1")) {
544 return super.getState("ON");
546 if (s.equals("false") || s.equals("0")) {
547 return super.getState("OFF");
549 return super.getState(s);
552 NATIVE_LATITUDE("native_latitude", "nativelocation", DecimalType.class, false) {
554 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
555 proxy.nativeLatitude = s;
556 return new PointType(new StringType(proxy.nativeLatitude), new StringType(proxy.nativeLongitude));
559 NATIVE_LONGITUDE("native_longitude", "nativelocation", DecimalType.class, false) {
561 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
562 proxy.nativeLongitude = s;
563 return new PointType(new StringType(proxy.nativeLatitude), new StringType(proxy.nativeLongitude));
566 NATIVE_LOCATION_SUPPORTED("native_location_supported", "nativelocationsupported", OnOffType.class, false) {
568 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
569 if (s.equals("true") || s.equals("1")) {
570 return super.getState("ON");
572 if (s.equals("false") || s.equals("0")) {
573 return super.getState("OFF");
575 return super.getState(s);
578 NATIVE_TYPE("native_type", "nativetype", StringType.class, false),
579 NOT_ENOUGH_POWER_TO_HEAT("not_enough_power_to_heat", "notenoughpower", OnOffType.class, false) {
581 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
582 if (s.equals("true") || s.equals("1")) {
583 return super.getState("ON");
585 if (s.equals("false") || s.equals("0")) {
586 return super.getState("OFF");
588 return super.getState(s);
591 NOTIFICATIONS_ENABLED("notifications_enabled", "notificationsenabled", OnOffType.class, false) {
593 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
594 if (s.equals("true") || s.equals("1")) {
595 return super.getState("ON");
597 if (s.equals("false") || s.equals("0")) {
598 return super.getState("OFF");
600 return super.getState(s);
603 NOTIFICATIONS_SUPPORTED("notifications_supported", "notificationssupported", OnOffType.class, false) {
605 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
606 if (s.equals("true") || s.equals("1")) {
607 return super.getState("ON");
609 if (s.equals("false") || s.equals("0")) {
610 return super.getState("OFF");
612 return super.getState(s);
615 ODOMETER("odometer", "odometer", DecimalType.class, false) {
617 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
618 State someState = super.getState(s);
619 BigDecimal value = ((DecimalType) someState).toBigDecimal();
620 return new QuantityType<>(value, ImperialUnits.MILE);
623 OPEN_FRUNK(null, "openfrunk", OnOffType.class, false) {
625 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
626 if (s.equals("true") || s.equals("1")) {
627 return super.getState("ON");
629 if (s.equals("false") || s.equals("0")) {
630 return super.getState("OFF");
632 return super.getState(s);
635 OPEN_TRUNK(null, "opentrunk", OnOffType.class, false) {
637 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
638 if (s.equals("true") || s.equals("1")) {
639 return super.getState("ON");
641 if (s.equals("false") || s.equals("0")) {
642 return super.getState("OFF");
644 return super.getState(s);
647 OPTION_CODES("option_codes", "options", StringType.class, true),
648 OUTSIDE_TEMP("outside_temp", "outsidetemp", DecimalType.class, false) {
650 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
651 State someState = super.getState(s);
652 BigDecimal value = ((DecimalType) someState).toBigDecimal();
653 return new QuantityType<>(value, SIUnits.CELSIUS);
656 PARSED_CALENDAR("parsed_calendar_supported", "parsedcalendar", OnOffType.class, false) {
658 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
659 if (s.equals("true") || s.equals("1")) {
660 return super.getState("ON");
662 if (s.equals("false") || s.equals("0")) {
663 return super.getState("OFF");
665 return super.getState(s);
668 PASSENGER_TEMP("passenger_temp_setting", "passengertemp", DecimalType.class, false) {
670 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
671 State someState = super.getState(s);
672 BigDecimal value = ((DecimalType) someState).toBigDecimal();
673 return new QuantityType<>(value, SIUnits.CELSIUS);
676 PERF_CONFIG("perf_config", "configuration", StringType.class, true),
677 PF("pf", "passengerfrontdoor", OpenClosedType.class, false) {
679 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
680 if (s.equals("true") || s.equals("1")) {
681 return super.getState("OPEN");
683 if (s.equals("false") || s.equals("0")) {
684 return super.getState("CLOSED");
686 return super.getState(s);
689 POWER("power", "power", DecimalType.class, false),
690 PR("pr", "passengerreardoor", OpenClosedType.class, false) {
692 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
693 if (s.equals("true") || s.equals("1")) {
694 return super.getState("OPEN");
696 if (s.equals("false") || s.equals("0")) {
697 return super.getState("CLOSED");
699 return super.getState(s);
702 PRECONDITIONING("is_preconditioning", "preconditioning", OnOffType.class, false) {
704 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
705 if (s.equals("true") || s.equals("1")) {
706 return super.getState("ON");
708 if (s.equals("false") || s.equals("0")) {
709 return super.getState("OFF");
711 return super.getState(s);
714 RANGE("range", "range", DecimalType.class, false) {
716 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
717 State someState = super.getState(s);
718 BigDecimal value = ((DecimalType) someState).toBigDecimal();
719 if (properties.containsKey("distanceunits") && properties.get("distanceunits").equals("km/hr")) {
720 return new QuantityType<>(value, MetricPrefix.KILO(SIUnits.METRE));
722 return new QuantityType<>(value, ImperialUnits.MILE);
726 REAR_DEFROSTER("is_rear_defroster_on", "reardefroster", OnOffType.class, false) {
728 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
729 if (s.equals("true") || s.equals("1")) {
730 return super.getState("ON");
732 if (s.equals("false") || s.equals("0")) {
733 return super.getState("OFF");
735 return super.getState(s);
738 REAR_SEAT_HEATERS("rear_seat_heaters", "rearseatheaters", OnOffType.class, true) {
740 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
741 if (s.equals("true") || s.equals("1")) {
742 return super.getState("ON");
744 if (s.equals("false") || s.equals("0")) {
745 return super.getState("OFF");
747 return super.getState(s);
750 REMOTE_START("remote_start", "remotestart", OnOffType.class, false) {
752 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
753 if (s.equals("true") || s.equals("1")) {
754 return super.getState("ON");
756 if (s.equals("false") || s.equals("0")) {
757 return super.getState("OFF");
759 return super.getState(s);
762 REMOTE_START_ENABLED("remote_start_enabled", "remotestartenabled", OnOffType.class, false) {
764 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
765 if (s.equals("true") || s.equals("1")) {
766 return super.getState("ON");
768 if (s.equals("false") || s.equals("0")) {
769 return super.getState("OFF");
771 return super.getState(s);
774 REMOTE_START_SUPPORTED("remote_start_supported", "remotestartsupported", OnOffType.class, false) {
776 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
777 if (s.equals("true") || s.equals("1")) {
778 return super.getState("ON");
780 if (s.equals("false") || s.equals("0")) {
781 return super.getState("OFF");
783 return super.getState(s);
786 RESET_VALET_PIN(null, "resetvaletpin", OnOffType.class, false) {
788 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
789 if (s.equals("true") || s.equals("1")) {
790 return super.getState("ON");
792 if (s.equals("false") || s.equals("0")) {
793 return super.getState("OFF");
795 return super.getState(s);
798 RHD("rhd", "rhd", OnOffType.class, true) {
800 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
801 if (s.equals("true") || s.equals("1")) {
802 return super.getState("ON");
804 if (s.equals("false") || s.equals("0")) {
805 return super.getState("OFF");
807 return super.getState(s);
810 RIGHT_TEMP_DIR("right_temp_direction", "righttempdirection", DecimalType.class, false),
811 ROOF_COLOR("roof_color", "roof", StringType.class, true),
812 RT("rt", "reartrunk", OnOffType.class, false) {
814 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
815 if (s.equals("true") || s.equals("1")) {
816 return super.getState("ON");
818 if (s.equals("false") || s.equals("0")) {
819 return super.getState("OFF");
821 return super.getState(s);
824 SEAT_HEATER_LEFT("seat_heater_left", "leftseatheater", DecimalType.class, false),
825 SEAT_HEATER_RIGHT("seat_heater_right", "rightseatheater", DecimalType.class, false),
826 SEAT_HEATER_REAR_LEFT("seat_heater_rear_left", "leftrearseatheater", DecimalType.class, false),
827 SEAT_HEATER_REAR_RIGHT("seat_heater_rear_right", "rightrearseatheater", DecimalType.class, false),
828 SEAT_HEATER_REAR_CENTER("seat_heater_rear_center", "centerrearseatheater", DecimalType.class, false),
829 SEAT_HEATER_REAR_RIGHT_BACK("seat_heater_rear_right_back", "rightrearbackseatheater", DecimalType.class, false),
830 SEAT_HEATER_REAR_RIGHT_LEFT("seat_heater_rear_left_back", "leftrearbackseatheater", DecimalType.class, false),
831 SEAT_TYPE("seat_type", "seattype", DecimalType.class, true),
832 SCHEDULED_CHARGING_PENDING("scheduled_charging_pending", "scheduledchargingpending", OnOffType.class, false) {
834 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
835 if (s.equals("true") || s.equals("1")) {
836 return super.getState("ON");
838 if (s.equals("false") || s.equals("0")) {
839 return super.getState("OFF");
841 return super.getState(s);
844 SCHEDULED_CHARGING_START_TIME("scheduled_charging_start_time", "scheduledchargingstart", DateTimeType.class,
847 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
848 Date date = new Date();
849 SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
851 date.setTime(Long.valueOf(s) * 1000);
852 return super.getState(dateFormatter.format(date));
855 SHIFTSTATE("shift_state", "shiftstate", StringType.class, false),
856 SIDEMIRROR_HEATING("side_mirror_heaters", "sidemirrorheaters", OnOffType.class, false) {
858 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
859 if (s.equals("true") || s.equals("1")) {
860 return super.getState("ON");
862 if (s.equals("false") || s.equals("0")) {
863 return super.getState("OFF");
865 return super.getState(s);
868 SMART_PRECONDITIONING("smart_preconditioning", "smartpreconditioning", OnOffType.class, false) {
870 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
871 if (s.equals("true") || s.equals("1")) {
872 return super.getState("ON");
874 if (s.equals("false") || s.equals("0")) {
875 return super.getState("OFF");
877 return super.getState(s);
880 SOC("soc", "soc", PercentType.class, false),
881 SPEED("speed", "speed", DecimalType.class, false) {
883 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
884 State someState = super.getState(s);
885 if (someState != null) {
886 BigDecimal value = ((DecimalType) someState).toBigDecimal();
887 return new QuantityType<>(value, ImperialUnits.MILES_PER_HOUR);
893 STATE("state", "state", StringType.class, false),
894 STEERINGWHEEL_HEATER("steering_wheel_heater", "steeringwheelheater", OnOffType.class, true) {
896 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
897 if (s.equals("true") || s.equals("1")) {
898 return super.getState("ON");
900 if (s.equals("false") || s.equals("0")) {
901 return super.getState("OFF");
903 return super.getState(s);
906 SUN_ROOF_PRESENT("sun_roof_installed", "sunroofinstalled", OnOffType.class, true) {
908 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
909 if (s.equals("true") || s.equals("1")) {
910 return super.getState("ON");
912 if (s.equals("false") || s.equals("0")) {
913 return super.getState("OFF");
915 return super.getState(s);
918 SUN_ROOF_STATE("sun_roof_state", "sunroofstate", StringType.class, false),
919 SUN_ROOF("sun_roof_percent_open", "sunroof", PercentType.class, false),
920 COMBINED_TEMP(null, "combinedtemp", DecimalType.class, false) {
922 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
923 State someState = super.getState(s);
924 BigDecimal value = ((DecimalType) someState).toBigDecimal();
925 return new QuantityType<>(value, SIUnits.CELSIUS);
928 TIME_TO_FULL_CHARGE("time_to_full_charge", "timetofullcharge", DecimalType.class, false),
929 TIMESTAMP("timestamp", "eventstamp", DateTimeType.class, false) {
931 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
932 Date date = new Date(Long.valueOf(s));
933 SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
934 return super.getState(dateFormatter.format(date));
937 TRIP_CARGING("trip_charging", "tripcharging", OnOffType.class, false) {
939 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
940 if (s.equals("true") || s.equals("1")) {
941 return super.getState("ON");
943 if (s.equals("false") || s.equals("0")) {
944 return super.getState("OFF");
946 return super.getState(s);
949 USABLE_BATTERY_LEVEL("usable_battery_level", "usablebatterylevel", DecimalType.class, false),
950 USER_CHARGE_ENABLE_REQUEST("user_charge_enable_request", "userchargeenablerequest", StringType.class, false),
951 VEHICLE_NAME("vehicle_name", "name", StringType.class, true) {
953 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
954 return super.getState(s.replaceAll("\"", ""));
957 VALET_MODE("valet_mode", "valetmode", OnOffType.class, false) {
959 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
960 if (s.equals("true") || s.equals("1")) {
961 return super.getState("ON");
963 if (s.equals("false") || s.equals("0")) {
964 return super.getState("OFF");
966 return super.getState(s);
969 VALET_PIN("valet_pin_needed", "valetpin", OnOffType.class, false) {
971 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
972 if (s.equals("true") || s.equals("1")) {
973 return super.getState("ON");
975 if (s.equals("false") || s.equals("0")) {
976 return super.getState("OFF");
978 return super.getState(s);
981 VIN("vin", "vin", StringType.class, true),
982 WAKEUP(null, "wakeup", OnOffType.class, false) {
984 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
985 if (s.equals("true") || s.equals("1")) {
986 return super.getState("ON");
988 if (s.equals("false") || s.equals("0")) {
989 return super.getState("OFF");
991 return super.getState(s);
994 WIPERBLADE_HEATER("wiper_blade_heater", "wiperbladeheater", OnOffType.class, false) {
996 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
997 if (s.equals("true") || s.equals("1")) {
998 return super.getState("ON");
1000 if (s.equals("false") || s.equals("0")) {
1001 return super.getState("OFF");
1003 return super.getState(s);
1006 WHEEL_TYPE("wheel_type", "wheeltype", StringType.class, true);
1008 private final String restID;
1009 private final String channelID;
1010 private Class<? extends Type> typeClass;
1011 private final boolean isProperty;
1013 private TeslaChannelSelector(String restID, String channelID, Class<? extends Type> typeClass,
1014 boolean isProperty) {
1015 this.restID = restID;
1016 this.channelID = channelID;
1017 this.typeClass = typeClass;
1018 this.isProperty = isProperty;
1022 public String toString() {
1026 public String getChannelID() {
1030 public Class<? extends Type> getTypeClass() {
1034 public boolean isProperty() {
1038 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
1042 public State getState(String s) {
1044 Method valueOf = typeClass.getMethod("valueOf", String.class);
1045 State state = (State) valueOf.invoke(typeClass, s);
1046 if (state != null) {
1049 } catch (NoSuchMethodException e) {
1050 } catch (IllegalArgumentException e) {
1051 } catch (IllegalAccessException e) {
1052 } catch (InvocationTargetException e) {
1058 public static TeslaChannelSelector getValueSelectorFromChannelID(String valueSelectorText)
1059 throws IllegalArgumentException {
1060 for (TeslaChannelSelector c : TeslaChannelSelector.values()) {
1061 if (c.channelID.equals(valueSelectorText)) {
1066 throw new IllegalArgumentException("Not valid value selector");
1069 public static TeslaChannelSelector getValueSelectorFromRESTID(String valueSelectorText)
1070 throws IllegalArgumentException {
1071 for (TeslaChannelSelector c : TeslaChannelSelector.values()) {
1072 if (c.restID != null && c.restID.equals(valueSelectorText)) {
1077 throw new IllegalArgumentException("Not valid value selector");
1081 public String latitude = "0";
1082 public String longitude = "0";
1083 public String elevation = "0";
1084 public String nativeLatitude = "0";
1085 public String nativeLongitude = "0";
1087 public State getState(String s, TeslaChannelSelector selector, Map<String, String> properties) {
1088 return selector.getState(s, this, properties);