2 * Copyright (c) 2010-2023 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.MetricPrefix;
32 import org.openhab.core.library.unit.SIUnits;
33 import org.openhab.core.library.unit.Units;
34 import org.openhab.core.types.State;
35 import org.openhab.core.types.Type;
38 * The {@link TeslaChannelSelectorProxy} class is a helper class to instantiate
39 * and parameterize the {@link TeslaChannelSelector} Enum
41 * @author Karel Goderis - Initial contribution
43 public class TeslaChannelSelectorProxy {
45 public enum TeslaChannelSelector {
47 API("api_version", "api", DecimalType.class, true),
48 AUTO_COND("is_auto_conditioning_on", "autoconditioning", OnOffType.class, false) {
50 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
51 if ("true".equals(s) || "1".equals(s)) {
52 return super.getState("ON");
54 if ("false".equals(s) || "0".equals(s)) {
55 return super.getState("OFF");
57 return super.getState(s);
60 AUTOPARK_STATE("autopark_state", "autoparkstate", StringType.class, false),
61 AUTOPARK_STATE_V2("autopark_state_v2", "autoparkstate2", StringType.class, false),
62 AUTOPARK_STYLE("autopark_style", "autoparkstyle", StringType.class, false),
63 BATTERY_CURRENT("battery_current", "batterycurrent", DecimalType.class, false),
64 BATTERY_HEATER("battery_heater_on", "batteryheater", OnOffType.class, false) {
66 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
67 if ("true".equals(s) || "1".equals(s)) {
68 return super.getState("ON");
70 if ("false".equals(s) || "0".equals(s)) {
71 return super.getState("OFF");
73 return super.getState(s);
76 BATTERY_HEATER_NO_POWER("battery_heater_no_power", "batteryheaternopower", OnOffType.class, false) {
78 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
79 if ("true".equals(s) || "1".equals(s)) {
80 return super.getState("ON");
82 if ("false".equals(s) || "0".equals(s)) {
83 return super.getState("OFF");
85 return super.getState(s);
88 BATTERY_LEVEL("battery_level", "batterylevel", DecimalType.class, false),
89 BATTERY_RANGE("battery_range", "batteryrange", DecimalType.class, false) {
91 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
92 State someState = super.getState(s);
93 BigDecimal value = ((DecimalType) someState).toBigDecimal();
94 return new QuantityType<>(value, ImperialUnits.MILE);
97 CALENDAR_SUPPORTED("calendar_supported", "calendarsupported", OnOffType.class, true) {
99 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
100 if ("true".equals(s) || "1".equals(s)) {
101 return super.getState("ON");
103 if ("false".equals(s) || "0".equals(s)) {
104 return super.getState("OFF");
106 return super.getState(s);
109 CALENDAR_ENABLED("calendar_enabled", "calendarenabled", OnOffType.class, false) {
111 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
112 if ("true".equals(s) || "1".equals(s)) {
113 return super.getState("ON");
115 if ("false".equals(s) || "0".equals(s)) {
116 return super.getState("OFF");
118 return super.getState(s);
121 CAR_VERSION("car_version", "version", StringType.class, true),
122 CENTER_DISPLAY("center_display_state", "centerdisplay", DecimalType.class, false),
123 CHARGE(null, "charge", OnOffType.class, false) {
125 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
126 if ("true".equals(s) || "1".equals(s)) {
127 return super.getState("ON");
129 if ("false".equals(s) || "0".equals(s)) {
130 return super.getState("OFF");
132 return super.getState(s);
135 CHARGE_CABLE("conn_charge_cable", "chargecable", StringType.class, false),
136 CHARGE_CURRENT_REQUEST("charge_current_request", "chargecurrent", DecimalType.class, false),
137 CHARGE_CURRENT_REQUEST_MAX("charge_current_request_max", "chargemaxcurrent", DecimalType.class, false),
138 CHARGE_ENABLE_REQUEST("charge_enable_request", "chargeenablerequest", OnOffType.class, false) {
140 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
141 if ("true".equals(s) || "1".equals(s)) {
142 return super.getState("ON");
144 if ("false".equals(s) || "0".equals(s)) {
145 return super.getState("OFF");
147 return super.getState(s);
150 CHARGE_ENERGY_ADDED("charge_energy_added", "chargeenergyadded", DecimalType.class, false),
151 CHARGE_LIMIT_SOC("charge_limit_soc", "chargelimit", PercentType.class, false),
152 CHARGE_LIMIT_SOC_MAX("charge_limit_soc_max", "chargelimitmaximum", PercentType.class, false),
153 CHARGE_LIMIT_SOC_MIN("charge_limit_soc_min", "chargelimitminimum", PercentType.class, false),
154 CHARGE_LIMIT_SOC_STD("charge_limit_soc_std", "chargelimitsocstandard", PercentType.class, false),
155 CHARGE_PORT_LATCH("charge_port_latch", "chargeportlatch", StringType.class, false),
156 CHARGE_MILES_ADDED_IDEAL("charge_miles_added_ideal", "chargeidealdistanceadded", DecimalType.class, false) {
158 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
159 State someState = super.getState(s);
160 BigDecimal value = ((DecimalType) someState).toBigDecimal();
161 return new QuantityType<>(value, ImperialUnits.MILES_PER_HOUR);
164 CHARGE_MILES_ADDED_RANGE("charge_miles_added_rated", "chargerateddistanceadded", DecimalType.class, false) {
166 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
167 State someState = super.getState(s);
168 BigDecimal value = ((DecimalType) someState).toBigDecimal();
169 return new QuantityType<>(value, ImperialUnits.MILES_PER_HOUR);
172 CHARGE_RATE("charge_rate", "chargerate", DecimalType.class, false) {
174 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
175 State someState = super.getState(s);
176 BigDecimal value = ((DecimalType) someState).toBigDecimal();
177 return new QuantityType<>(value, ImperialUnits.MILES_PER_HOUR);
180 CHARGE_AMPS("charge_amps", "chargingamps", DecimalType.class, false),
181 CHARGE_STARTING_RANGE("charge_starting_range", "chargestartingrange", StringType.class, false),
182 CHARGE_STARTING_SOC("charge_starting_soc", "chargestartingsoc", StringType.class, false),
183 CHARGE_STATE("charging_state", "chargingstate", StringType.class, false),
184 CHARGE_TO_MAX("charge_to_max_range", "chargetomax", OnOffType.class, false) {
186 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
187 if ("true".equals(s) || "1".equals(s)) {
188 return super.getState("ON");
190 if ("false".equals(s) || "0".equals(s)) {
191 return super.getState("OFF");
193 return super.getState(s);
196 CHARGE_TO_MAX_COUNTER("max_range_charge_counter", "maxcharges", DecimalType.class, false),
197 CHARGEPORT("charge_port_door_open", "chargeport", OnOffType.class, false) {
199 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
200 if ("true".equals(s) || "1".equals(s)) {
201 return super.getState("ON");
203 if ("false".equals(s) || "0".equals(s)) {
204 return super.getState("OFF");
206 return super.getState(s);
209 CHARGER_ACTUAL_CURRENT("charger_actual_current", "chargercurrent", DecimalType.class, false),
210 CHARGER_PHASES("charger_phases", "chargerphases", DecimalType.class, false),
211 CHARGER_PILOT_CURRENT("charger_pilot_current", "chargermaxcurrent", DecimalType.class, false),
212 CHARGER_POWER("charger_power", "chargerpower", DecimalType.class, false),
213 CHARGER_VOLTAGE("charger_voltage", "chargervoltage", DecimalType.class, false),
214 CLIMATE_ON("is_climate_on", "climate", OnOffType.class, false) {
216 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
217 if ("true".equals(s) || "1".equals(s)) {
218 return super.getState("ON");
220 if ("false".equals(s) || "0".equals(s)) {
221 return super.getState("OFF");
223 return super.getState(s);
226 CLIMATE_MAX_TEMP("max_avail_temp", "maxavailabletemp", DecimalType.class, false),
227 CLIMATE_MIN_TEMP("min_avail_temp", "minavailabletemp", DecimalType.class, false),
228 COLOR("exterior_color", "color", StringType.class, true),
229 DARK_RIMS("dark_rims", "darkrims", OnOffType.class, true) {
231 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
232 if ("true".equals(s) || "1".equals(s)) {
233 return super.getState("ON");
235 if ("false".equals(s) || "0".equals(s)) {
236 return super.getState("OFF");
238 return super.getState(s);
241 DISPLAY_NAME("display_name", "name", StringType.class, true),
242 DF("df", "driverfrontdoor", OpenClosedType.class, false) {
244 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
245 if ("true".equals(s) || "1".equals(s)) {
246 return super.getState("OPEN");
248 if ("false".equals(s) || "0".equals(s)) {
249 return super.getState("CLOSED");
251 return super.getState(s);
254 DOOR_LOCK("locked", "doorlock", OnOffType.class, false) {
256 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
257 if ("true".equals(s) || "1".equals(s)) {
258 return super.getState("ON");
260 if ("false".equals(s) || "0".equals(s)) {
261 return super.getState("OFF");
263 return super.getState(s);
266 DR("dr", "driverreardoor", OpenClosedType.class, false) {
268 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
269 if ("true".equals(s) || "1".equals(s)) {
270 return super.getState("OPEN");
272 if ("false".equals(s) || "0".equals(s)) {
273 return super.getState("CLOSED");
275 return super.getState(s);
278 DRIVER_TEMP("driver_temp_setting", "drivertemp", DecimalType.class, false) {
280 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
281 State someState = super.getState(s);
282 BigDecimal value = ((DecimalType) someState).toBigDecimal();
283 return new QuantityType<>(value, SIUnits.CELSIUS);
286 ELEVATION("elevation", "location", DecimalType.class, false) {
289 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
291 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
292 new StringType(proxy.elevation));
295 EST_BATTERY_RANGE("est_battery_range", "estimatedbatteryrange", DecimalType.class, false) {
297 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
298 State someState = super.getState(s);
299 BigDecimal value = ((DecimalType) someState).toBigDecimal();
300 return new QuantityType<>(value, ImperialUnits.MILE);
303 EST_HEADING("est_heading", "headingestimation", DecimalType.class, false) {
305 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
306 State someState = super.getState(s);
307 BigDecimal value = ((DecimalType) someState).toBigDecimal();
308 return new QuantityType<>(value, Units.DEGREE_ANGLE);
311 EST_RANGE("est_range", "estimatedrange", DecimalType.class, false) {
313 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
314 State someState = super.getState(s);
315 BigDecimal value = ((DecimalType) someState).toBigDecimal();
316 return new QuantityType<>(value, ImperialUnits.MILE);
319 EU_VEHICLE("eu_vehicle", "european", OnOffType.class, true) {
321 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
322 if ("true".equals(s) || "1".equals(s)) {
323 return super.getState("ON");
325 if ("false".equals(s) || "0".equals(s)) {
326 return super.getState("OFF");
328 return super.getState(s);
331 FAN_STATUS("fan_status", "fan", DecimalType.class, false),
332 FAST_CHARGER("fast_charger_present", "fastcharger", OnOffType.class, true) {
334 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
335 if ("true".equals(s) || "1".equals(s)) {
336 return super.getState("ON");
338 if ("false".equals(s) || "0".equals(s)) {
339 return super.getState("OFF");
341 return super.getState(s);
344 FAST_CHARGER_TYPE("fast_charger_type", "fastchargertype", StringType.class, true),
345 FAST_CHARGER_BRAND("fast_charger_brand", "fastchargerbrand", StringType.class, true),
346 FLASH(null, "flashlights", OnOffType.class, false) {
348 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
349 if ("true".equals(s) || "1".equals(s)) {
350 return super.getState("ON");
352 if ("false".equals(s) || "0".equals(s)) {
353 return super.getState("OFF");
355 return super.getState(s);
358 FRONT_DEFROSTER("is_front_defroster_on", "frontdefroster", OnOffType.class, false) {
360 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
361 if ("true".equals(s) || "1".equals(s)) {
362 return super.getState("ON");
364 if ("false".equals(s) || "0".equals(s)) {
365 return super.getState("OFF");
367 return super.getState(s);
370 FT("ft", "fronttrunk", OnOffType.class, false) {
372 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
373 if ("true".equals(s) || "1".equals(s)) {
374 return super.getState("ON");
376 if ("false".equals(s) || "0".equals(s)) {
377 return super.getState("OFF");
379 return super.getState(s);
382 GPS_AS_OF("gps_as_of", "gpstimestamp", DateTimeType.class, false) {
384 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
385 Date date = new Date();
386 SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
388 date.setTime(Long.valueOf(s) * 1000);
389 return super.getState(dateFormatter.format(date));
392 GUI_DISTANCE_UNITS("gui_distance_units", "distanceunits", StringType.class, true),
393 GUI_TEMPERATURE_UNITS("gui_temperature_units", "temperatureunits", StringType.class, true),
394 GUI_CHARGE_RATE_UNITS("gui_charge_rate_units", "chargerateunits", StringType.class, true),
395 GUI_24H_TIME("gui_24_hour_time", "24hourtime", StringType.class, true),
396 GUI_RANGE_DISPLAY("gui_range_display", "rangedisplay", StringType.class, true),
397 HAS_SPOILER("has_spoiler", "spoiler", OnOffType.class, true) {
399 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
400 if ("true".equals(s) || "1".equals(s)) {
401 return super.getState("ON");
403 if ("false".equals(s) || "0".equals(s)) {
404 return super.getState("OFF");
406 return super.getState(s);
409 HEADING("heading", "heading", DecimalType.class, false) {
411 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
412 State someState = super.getState(s);
413 BigDecimal value = ((DecimalType) someState).toBigDecimal();
414 return new QuantityType<>(value, Units.DEGREE_ANGLE);
417 HONK_HORN(null, "honkhorn", OnOffType.class, false) {
419 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
420 if ("true".equals(s) || "1".equals(s)) {
421 return super.getState("ON");
423 if ("false".equals(s) || "0".equals(s)) {
424 return super.getState("OFF");
426 return super.getState(s);
429 HOMELINK_NEARBY("homelink_nearby", "homelink", OnOffType.class, false) {
431 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
432 if ("true".equals(s) || "1".equals(s)) {
433 return super.getState("ON");
435 if ("false".equals(s) || "0".equals(s)) {
436 return super.getState("OFF");
438 return super.getState(s);
441 IDEAL_BATTERY_RANGE("ideal_battery_range", "idealbatteryrange", DecimalType.class, false) {
443 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
444 State someState = super.getState(s);
445 BigDecimal value = ((DecimalType) someState).toBigDecimal();
446 return new QuantityType<>(value, ImperialUnits.MILE);
449 INSIDE_TEMP("inside_temp", "insidetemp", DecimalType.class, false) {
451 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
452 State someState = super.getState(s);
453 BigDecimal value = ((DecimalType) someState).toBigDecimal();
454 return new QuantityType<>(value, SIUnits.CELSIUS);
457 LAST_AUTOPARK_ERROR("last_autopark_error", "lastautoparkerror", StringType.class, false),
458 LATITUDE("latitude", "location", DecimalType.class, false) {
460 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
462 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
463 new StringType(proxy.elevation));
466 LATITUDE_EVENT("est_lat", "location", DecimalType.class, false) {
468 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
470 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
471 new StringType(proxy.elevation));
474 LEFT_TEMP_DIR("left_temp_direction", "lefttempdirection", DecimalType.class, false),
475 LONGITUDE("longitude", "location", DecimalType.class, false) {
477 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
479 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
480 new StringType(proxy.elevation));
483 LONGITUDE_EVENT("est_lng", "location", DecimalType.class, false) {
485 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
487 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
488 new StringType(proxy.elevation));
491 MANAGED_CHARGING("managed_charging_active", "managedcharging", OnOffType.class, false) {
493 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
494 if ("true".equals(s)) {
495 return super.getState("ON");
497 if ("false".equals(s)) {
498 return super.getState("OFF");
500 return super.getState(s);
503 MANAGED_CHARGING_CANCELLED("managed_charging_user_canceled", "managedchargingcancelled", OnOffType.class,
506 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
507 if ("true".equals(s)) {
508 return super.getState("ON");
510 if ("false".equals(s)) {
511 return super.getState("OFF");
513 return super.getState(s);
516 MANAGED_CHARGING_START("managed_charging_start_time", "managedchargingstart", StringType.class, false),
517 MOBILE_ENABLED(TeslaBindingConstants.MOBILE_ENABLED_STATE, "mobileenabled", OnOffType.class, false) {
519 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
520 if ("true".equals(s)) {
521 return super.getState("ON");
523 if ("false".equals(s)) {
524 return super.getState("OFF");
526 return super.getState(s);
529 MOTORIZED_CHARGE_PORT("motorized_charge_port", "motorizedchargeport", OnOffType.class, true) {
531 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
532 if ("true".equals(s) || "1".equals(s)) {
533 return super.getState("ON");
535 if ("false".equals(s) || "0".equals(s)) {
536 return super.getState("OFF");
538 return super.getState(s);
541 NATIVE_LATITUDE("native_latitude", "nativelocation", DecimalType.class, false) {
543 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
544 proxy.nativeLatitude = s;
545 return new PointType(new StringType(proxy.nativeLatitude), new StringType(proxy.nativeLongitude));
548 NATIVE_LONGITUDE("native_longitude", "nativelocation", DecimalType.class, false) {
550 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
551 proxy.nativeLongitude = s;
552 return new PointType(new StringType(proxy.nativeLatitude), new StringType(proxy.nativeLongitude));
555 NATIVE_LOCATION_SUPPORTED("native_location_supported", "nativelocationsupported", OnOffType.class, false) {
557 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
558 if ("true".equals(s) || "1".equals(s)) {
559 return super.getState("ON");
561 if ("false".equals(s) || "0".equals(s)) {
562 return super.getState("OFF");
564 return super.getState(s);
567 NATIVE_TYPE("native_type", "nativetype", StringType.class, false),
568 NOT_ENOUGH_POWER_TO_HEAT("not_enough_power_to_heat", "notenoughpower", OnOffType.class, false) {
570 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
571 if ("true".equals(s) || "1".equals(s)) {
572 return super.getState("ON");
574 if ("false".equals(s) || "0".equals(s)) {
575 return super.getState("OFF");
577 return super.getState(s);
580 NOTIFICATIONS_ENABLED("notifications_enabled", "notificationsenabled", OnOffType.class, false) {
582 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
583 if ("true".equals(s) || "1".equals(s)) {
584 return super.getState("ON");
586 if ("false".equals(s) || "0".equals(s)) {
587 return super.getState("OFF");
589 return super.getState(s);
592 NOTIFICATIONS_SUPPORTED("notifications_supported", "notificationssupported", OnOffType.class, false) {
594 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
595 if ("true".equals(s) || "1".equals(s)) {
596 return super.getState("ON");
598 if ("false".equals(s) || "0".equals(s)) {
599 return super.getState("OFF");
601 return super.getState(s);
604 ODOMETER("odometer", "odometer", DecimalType.class, false) {
606 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
607 State someState = super.getState(s);
608 BigDecimal value = ((DecimalType) someState).toBigDecimal();
609 return new QuantityType<>(value, ImperialUnits.MILE);
612 OPEN_FRUNK(null, "openfrunk", OnOffType.class, false) {
614 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
615 if ("true".equals(s) || "1".equals(s)) {
616 return super.getState("ON");
618 if ("false".equals(s) || "0".equals(s)) {
619 return super.getState("OFF");
621 return super.getState(s);
624 OPEN_TRUNK(null, "opentrunk", OnOffType.class, false) {
626 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
627 if ("true".equals(s) || "1".equals(s)) {
628 return super.getState("ON");
630 if ("false".equals(s) || "0".equals(s)) {
631 return super.getState("OFF");
633 return super.getState(s);
636 OPTION_CODES("option_codes", "options", StringType.class, true),
637 OUTSIDE_TEMP("outside_temp", "outsidetemp", DecimalType.class, false) {
639 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
640 State someState = super.getState(s);
641 BigDecimal value = ((DecimalType) someState).toBigDecimal();
642 return new QuantityType<>(value, SIUnits.CELSIUS);
645 PARSED_CALENDAR("parsed_calendar_supported", "parsedcalendar", OnOffType.class, false) {
647 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
648 if ("true".equals(s) || "1".equals(s)) {
649 return super.getState("ON");
651 if ("false".equals(s) || "0".equals(s)) {
652 return super.getState("OFF");
654 return super.getState(s);
657 PASSENGER_TEMP("passenger_temp_setting", "passengertemp", DecimalType.class, false) {
659 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
660 State someState = super.getState(s);
661 BigDecimal value = ((DecimalType) someState).toBigDecimal();
662 return new QuantityType<>(value, SIUnits.CELSIUS);
665 PERF_CONFIG("perf_config", "configuration", StringType.class, true),
666 PF("pf", "passengerfrontdoor", OpenClosedType.class, false) {
668 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
669 if ("true".equals(s) || "1".equals(s)) {
670 return super.getState("OPEN");
672 if ("false".equals(s) || "0".equals(s)) {
673 return super.getState("CLOSED");
675 return super.getState(s);
678 POWER("power", "power", DecimalType.class, false),
679 PR("pr", "passengerreardoor", OpenClosedType.class, false) {
681 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
682 if ("true".equals(s) || "1".equals(s)) {
683 return super.getState("OPEN");
685 if ("false".equals(s) || "0".equals(s)) {
686 return super.getState("CLOSED");
688 return super.getState(s);
691 PRECONDITIONING("is_preconditioning", "preconditioning", OnOffType.class, false) {
693 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
694 if ("true".equals(s) || "1".equals(s)) {
695 return super.getState("ON");
697 if ("false".equals(s) || "0".equals(s)) {
698 return super.getState("OFF");
700 return super.getState(s);
703 RANGE("range", "range", DecimalType.class, false) {
705 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
706 State someState = super.getState(s);
707 BigDecimal value = ((DecimalType) someState).toBigDecimal();
708 if (properties.containsKey("distanceunits") && "km/hr".equals(properties.get("distanceunits"))) {
709 return new QuantityType<>(value, MetricPrefix.KILO(SIUnits.METRE));
711 return new QuantityType<>(value, ImperialUnits.MILE);
715 REAR_DEFROSTER("is_rear_defroster_on", "reardefroster", OnOffType.class, false) {
717 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
718 if ("true".equals(s) || "1".equals(s)) {
719 return super.getState("ON");
721 if ("false".equals(s) || "0".equals(s)) {
722 return super.getState("OFF");
724 return super.getState(s);
727 REAR_SEAT_HEATERS("rear_seat_heaters", "rearseatheaters", OnOffType.class, true) {
729 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
730 if ("true".equals(s) || "1".equals(s)) {
731 return super.getState("ON");
733 if ("false".equals(s) || "0".equals(s)) {
734 return super.getState("OFF");
736 return super.getState(s);
739 REMOTE_START("remote_start", "remotestart", OnOffType.class, false) {
741 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
742 if ("true".equals(s) || "1".equals(s)) {
743 return super.getState("ON");
745 if ("false".equals(s) || "0".equals(s)) {
746 return super.getState("OFF");
748 return super.getState(s);
751 REMOTE_START_ENABLED("remote_start_enabled", "remotestartenabled", OnOffType.class, false) {
753 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
754 if ("true".equals(s) || "1".equals(s)) {
755 return super.getState("ON");
757 if ("false".equals(s) || "0".equals(s)) {
758 return super.getState("OFF");
760 return super.getState(s);
763 REMOTE_START_SUPPORTED("remote_start_supported", "remotestartsupported", OnOffType.class, false) {
765 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
766 if ("true".equals(s) || "1".equals(s)) {
767 return super.getState("ON");
769 if ("false".equals(s) || "0".equals(s)) {
770 return super.getState("OFF");
772 return super.getState(s);
775 RESET_VALET_PIN(null, "resetvaletpin", OnOffType.class, false) {
777 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
778 if ("true".equals(s) || "1".equals(s)) {
779 return super.getState("ON");
781 if ("false".equals(s) || "0".equals(s)) {
782 return super.getState("OFF");
784 return super.getState(s);
787 RHD("rhd", "rhd", OnOffType.class, true) {
789 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
790 if ("true".equals(s) || "1".equals(s)) {
791 return super.getState("ON");
793 if ("false".equals(s) || "0".equals(s)) {
794 return super.getState("OFF");
796 return super.getState(s);
799 RIGHT_TEMP_DIR("right_temp_direction", "righttempdirection", DecimalType.class, false),
800 ROOF_COLOR("roof_color", "roof", StringType.class, true),
801 RT("rt", "reartrunk", OnOffType.class, false) {
803 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
804 if ("true".equals(s) || "1".equals(s)) {
805 return super.getState("ON");
807 if ("false".equals(s) || "0".equals(s)) {
808 return super.getState("OFF");
810 return super.getState(s);
813 SEAT_HEATER_LEFT("seat_heater_left", "leftseatheater", DecimalType.class, false),
814 SEAT_HEATER_RIGHT("seat_heater_right", "rightseatheater", DecimalType.class, false),
815 SEAT_HEATER_REAR_LEFT("seat_heater_rear_left", "leftrearseatheater", DecimalType.class, false),
816 SEAT_HEATER_REAR_RIGHT("seat_heater_rear_right", "rightrearseatheater", DecimalType.class, false),
817 SEAT_HEATER_REAR_CENTER("seat_heater_rear_center", "centerrearseatheater", DecimalType.class, false),
818 SEAT_HEATER_REAR_RIGHT_BACK("seat_heater_rear_right_back", "rightrearbackseatheater", DecimalType.class, false),
819 SEAT_HEATER_REAR_RIGHT_LEFT("seat_heater_rear_left_back", "leftrearbackseatheater", DecimalType.class, false),
820 SEAT_TYPE("seat_type", "seattype", DecimalType.class, true),
821 SCHEDULED_CHARGING_PENDING("scheduled_charging_pending", "scheduledchargingpending", OnOffType.class, false) {
823 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
824 if ("true".equals(s) || "1".equals(s)) {
825 return super.getState("ON");
827 if ("false".equals(s) || "0".equals(s)) {
828 return super.getState("OFF");
830 return super.getState(s);
833 SCHEDULED_CHARGING_START_TIME("scheduled_charging_start_time", "scheduledchargingstart", DateTimeType.class,
836 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
837 Date date = new Date();
838 SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
840 date.setTime(Long.valueOf(s) * 1000);
841 return super.getState(dateFormatter.format(date));
844 SENTRY_MODE("sentry_mode", "sentrymode", OnOffType.class, false) {
846 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
847 if ("true".equals(s) || "1".equals(s)) {
848 return super.getState("ON");
850 if ("false".equals(s) || "0".equals(s)) {
851 return super.getState("OFF");
853 return super.getState(s);
856 SENTRY_MODE_AVAILABLE("sentry_mode_available", "sentrymodeavailable", OnOffType.class, false) {
858 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
859 if ("true".equals(s) || "1".equals(s)) {
860 return super.getState("ON");
862 if ("false".equals(s) || "0".equals(s)) {
863 return super.getState("OFF");
865 return super.getState(s);
868 SHIFTSTATE("shift_state", "shiftstate", StringType.class, false),
869 SIDEMIRROR_HEATING("side_mirror_heaters", "sidemirrorheaters", OnOffType.class, false) {
871 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
872 if ("true".equals(s) || "1".equals(s)) {
873 return super.getState("ON");
875 if ("false".equals(s) || "0".equals(s)) {
876 return super.getState("OFF");
878 return super.getState(s);
881 SMART_PRECONDITIONING("smart_preconditioning", "smartpreconditioning", OnOffType.class, false) {
883 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
884 if ("true".equals(s) || "1".equals(s)) {
885 return super.getState("ON");
887 if ("false".equals(s) || "0".equals(s)) {
888 return super.getState("OFF");
890 return super.getState(s);
893 SOC("soc", "soc", PercentType.class, false),
894 SPEED("speed", "speed", DecimalType.class, false) {
896 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
897 State someState = super.getState(s);
898 if (someState != null) {
899 BigDecimal value = ((DecimalType) someState).toBigDecimal();
900 return new QuantityType<>(value, ImperialUnits.MILES_PER_HOUR);
906 STATE("state", "state", StringType.class, false),
907 STEERINGWHEEL_HEATER("steering_wheel_heater", "steeringwheelheater", OnOffType.class, true) {
909 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
910 if ("true".equals(s) || "1".equals(s)) {
911 return super.getState("ON");
913 if ("false".equals(s) || "0".equals(s)) {
914 return super.getState("OFF");
916 return super.getState(s);
919 SUN_ROOF_PRESENT("sun_roof_installed", "sunroofinstalled", OnOffType.class, true) {
921 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
922 if ("true".equals(s) || "1".equals(s)) {
923 return super.getState("ON");
925 if ("false".equals(s) || "0".equals(s)) {
926 return super.getState("OFF");
928 return super.getState(s);
931 SUN_ROOF_STATE("sun_roof_state", "sunroofstate", StringType.class, false),
932 SUN_ROOF("sun_roof_percent_open", "sunroof", PercentType.class, false),
933 COMBINED_TEMP(null, "combinedtemp", DecimalType.class, false) {
935 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
936 State someState = super.getState(s);
937 BigDecimal value = ((DecimalType) someState).toBigDecimal();
938 return new QuantityType<>(value, SIUnits.CELSIUS);
941 TIME_TO_FULL_CHARGE("time_to_full_charge", "timetofullcharge", DecimalType.class, false),
942 TIMESTAMP("timestamp", "eventstamp", DateTimeType.class, false) {
944 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
945 Date date = new Date(Long.parseLong(s));
946 SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
947 return super.getState(dateFormatter.format(date));
950 TRIP_CARGING("trip_charging", "tripcharging", OnOffType.class, false) {
952 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
953 if ("true".equals(s) || "1".equals(s)) {
954 return super.getState("ON");
956 if ("false".equals(s) || "0".equals(s)) {
957 return super.getState("OFF");
959 return super.getState(s);
962 USABLE_BATTERY_LEVEL("usable_battery_level", "usablebatterylevel", DecimalType.class, false),
963 USER_CHARGE_ENABLE_REQUEST("user_charge_enable_request", "userchargeenablerequest", StringType.class, false),
964 VEHICLE_NAME("vehicle_name", "name", StringType.class, true) {
966 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
967 return super.getState(s.replaceAll("\"", ""));
970 VALET_MODE("valet_mode", "valetmode", OnOffType.class, false) {
972 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
973 if ("true".equals(s) || "1".equals(s)) {
974 return super.getState("ON");
976 if ("false".equals(s) || "0".equals(s)) {
977 return super.getState("OFF");
979 return super.getState(s);
982 VALET_PIN("valet_pin_needed", "valetpin", OnOffType.class, false) {
984 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
985 if ("true".equals(s) || "1".equals(s)) {
986 return super.getState("ON");
988 if ("false".equals(s) || "0".equals(s)) {
989 return super.getState("OFF");
991 return super.getState(s);
994 VIN("vin", "vin", StringType.class, true),
995 WAKEUP(null, "wakeup", OnOffType.class, false) {
997 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
998 if ("true".equals(s) || "1".equals(s)) {
999 return super.getState("ON");
1001 if ("false".equals(s) || "0".equals(s)) {
1002 return super.getState("OFF");
1004 return super.getState(s);
1007 WIPERBLADE_HEATER("wiper_blade_heater", "wiperbladeheater", OnOffType.class, false) {
1009 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
1010 if ("true".equals(s) || "1".equals(s)) {
1011 return super.getState("ON");
1013 if ("false".equals(s) || "0".equals(s)) {
1014 return super.getState("OFF");
1016 return super.getState(s);
1019 WHEEL_TYPE("wheel_type", "wheeltype", StringType.class, true);
1021 private final String restID;
1022 private final String channelID;
1023 private Class<? extends Type> typeClass;
1024 private final boolean isProperty;
1026 private TeslaChannelSelector(String restID, String channelID, Class<? extends Type> typeClass,
1027 boolean isProperty) {
1028 this.restID = restID;
1029 this.channelID = channelID;
1030 this.typeClass = typeClass;
1031 this.isProperty = isProperty;
1035 public String toString() {
1039 public String getChannelID() {
1043 public Class<? extends Type> getTypeClass() {
1047 public boolean isProperty() {
1051 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
1055 public State getState(String s) {
1057 Method valueOf = typeClass.getMethod("valueOf", String.class);
1058 State state = (State) valueOf.invoke(typeClass, s);
1059 if (state != null) {
1062 } catch (NoSuchMethodException | IllegalArgumentException | IllegalAccessException
1063 | InvocationTargetException e) {
1069 public static TeslaChannelSelector getValueSelectorFromChannelID(String valueSelectorText)
1070 throws IllegalArgumentException {
1071 for (TeslaChannelSelector c : TeslaChannelSelector.values()) {
1072 if (c.channelID.equals(valueSelectorText)) {
1077 throw new IllegalArgumentException("Not valid value selector. Received Selector: " + valueSelectorText);
1080 public static TeslaChannelSelector getValueSelectorFromRESTID(String valueSelectorText)
1081 throws IllegalArgumentException {
1082 for (TeslaChannelSelector c : TeslaChannelSelector.values()) {
1083 if (c.restID != null && c.restID.equals(valueSelectorText)) {
1088 throw new IllegalArgumentException("Not valid value selector. Received Selector: " + valueSelectorText);
1092 public String latitude = "0";
1093 public String longitude = "0";
1094 public String elevation = "0";
1095 public String nativeLatitude = "0";
1096 public String nativeLongitude = "0";
1098 public State getState(String s, TeslaChannelSelector selector, Map<String, String> properties) {
1099 return selector.getState(s, this, properties);