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 AR_DESTINATION("active_route_destination", "destinationname", StringType.class, false),
49 AR_LATITUDE("active_route_latitude", "destinationlocation", DecimalType.class, false) {
51 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
53 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
54 new StringType(proxy.elevation));
57 AR_LONGITUDE("active_route_longitude", "destinationlocation", DecimalType.class, false) {
59 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
61 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
62 new StringType(proxy.elevation));
65 AR_DISTANCE_TO_ARRIVAL("active_route_miles_to_arrival", "distancetoarrival", DecimalType.class, false) {
67 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
68 State someState = super.getState(s);
69 BigDecimal value = ((DecimalType) someState).toBigDecimal();
70 return new QuantityType<>(value, ImperialUnits.MILE);
73 AR_MINUTES_TO_ARRIVAL("active_route_minutes_to_arrival", "minutestoarrival", DecimalType.class, false) {
75 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
76 State someState = super.getState(s);
77 BigDecimal value = ((DecimalType) someState).toBigDecimal();
78 return new QuantityType<>(value, Units.MINUTE);
81 AR_TRAFFIC_MINUTES_DELAY("active_route_traffic_minutes_delay", "trafficminutesdelay", DecimalType.class,
84 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
85 State someState = super.getState(s);
86 BigDecimal value = ((DecimalType) someState).toBigDecimal();
87 return new QuantityType<>(value, Units.MINUTE);
90 AUTO_COND("is_auto_conditioning_on", "autoconditioning", OnOffType.class, false) {
92 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
93 if ("true".equals(s) || "1".equals(s)) {
94 return super.getState("ON");
96 if ("false".equals(s) || "0".equals(s)) {
97 return super.getState("OFF");
99 return super.getState(s);
102 AUTOPARK_STATE("autopark_state", "autoparkstate", StringType.class, false),
103 AUTOPARK_STATE_V2("autopark_state_v2", "autoparkstate2", StringType.class, false),
104 AUTOPARK_STYLE("autopark_style", "autoparkstyle", StringType.class, false),
105 BATTERY_CURRENT("battery_current", "batterycurrent", DecimalType.class, false),
106 BATTERY_HEATER("battery_heater_on", "batteryheater", OnOffType.class, false) {
108 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
109 if ("true".equals(s) || "1".equals(s)) {
110 return super.getState("ON");
112 if ("false".equals(s) || "0".equals(s)) {
113 return super.getState("OFF");
115 return super.getState(s);
118 BATTERY_HEATER_NO_POWER("battery_heater_no_power", "batteryheaternopower", OnOffType.class, false) {
120 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
121 if ("true".equals(s) || "1".equals(s)) {
122 return super.getState("ON");
124 if ("false".equals(s) || "0".equals(s)) {
125 return super.getState("OFF");
127 return super.getState(s);
130 BATTERY_LEVEL("battery_level", "batterylevel", DecimalType.class, false),
131 BATTERY_RANGE("battery_range", "batteryrange", DecimalType.class, false) {
133 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
134 State someState = super.getState(s);
135 BigDecimal value = ((DecimalType) someState).toBigDecimal();
136 return new QuantityType<>(value, ImperialUnits.MILE);
139 CALENDAR_SUPPORTED("calendar_supported", "calendarsupported", OnOffType.class, true) {
141 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
142 if ("true".equals(s) || "1".equals(s)) {
143 return super.getState("ON");
145 if ("false".equals(s) || "0".equals(s)) {
146 return super.getState("OFF");
148 return super.getState(s);
151 CALENDAR_ENABLED("calendar_enabled", "calendarenabled", OnOffType.class, false) {
153 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
154 if ("true".equals(s) || "1".equals(s)) {
155 return super.getState("ON");
157 if ("false".equals(s) || "0".equals(s)) {
158 return super.getState("OFF");
160 return super.getState(s);
163 CAR_VERSION("car_version", "version", StringType.class, true),
164 CENTER_DISPLAY("center_display_state", "centerdisplay", DecimalType.class, false),
165 CHARGE(null, "charge", OnOffType.class, false) {
167 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
168 if ("true".equals(s) || "1".equals(s)) {
169 return super.getState("ON");
171 if ("false".equals(s) || "0".equals(s)) {
172 return super.getState("OFF");
174 return super.getState(s);
177 CHARGE_CABLE("conn_charge_cable", "chargecable", StringType.class, false),
178 CHARGE_CURRENT_REQUEST("charge_current_request", "chargecurrent", DecimalType.class, false),
179 CHARGE_CURRENT_REQUEST_MAX("charge_current_request_max", "chargemaxcurrent", DecimalType.class, false),
180 CHARGE_ENABLE_REQUEST("charge_enable_request", "chargeenablerequest", OnOffType.class, false) {
182 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
183 if ("true".equals(s) || "1".equals(s)) {
184 return super.getState("ON");
186 if ("false".equals(s) || "0".equals(s)) {
187 return super.getState("OFF");
189 return super.getState(s);
192 CHARGE_ENERGY_ADDED("charge_energy_added", "chargeenergyadded", DecimalType.class, false),
193 CHARGE_LIMIT_SOC("charge_limit_soc", "chargelimit", PercentType.class, false),
194 CHARGE_LIMIT_SOC_MAX("charge_limit_soc_max", "chargelimitmaximum", PercentType.class, false),
195 CHARGE_LIMIT_SOC_MIN("charge_limit_soc_min", "chargelimitminimum", PercentType.class, false),
196 CHARGE_LIMIT_SOC_STD("charge_limit_soc_std", "chargelimitsocstandard", PercentType.class, false),
197 CHARGE_PORT_LATCH("charge_port_latch", "chargeportlatch", StringType.class, false),
198 CHARGE_MILES_ADDED_IDEAL("charge_miles_added_ideal", "chargeidealdistanceadded", DecimalType.class, false) {
200 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
201 State someState = super.getState(s);
202 BigDecimal value = ((DecimalType) someState).toBigDecimal();
203 return new QuantityType<>(value, ImperialUnits.MILES_PER_HOUR);
206 CHARGE_MILES_ADDED_RANGE("charge_miles_added_rated", "chargerateddistanceadded", DecimalType.class, false) {
208 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
209 State someState = super.getState(s);
210 BigDecimal value = ((DecimalType) someState).toBigDecimal();
211 return new QuantityType<>(value, ImperialUnits.MILES_PER_HOUR);
214 CHARGE_RATE("charge_rate", "chargerate", DecimalType.class, false) {
216 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
217 State someState = super.getState(s);
218 BigDecimal value = ((DecimalType) someState).toBigDecimal();
219 return new QuantityType<>(value, ImperialUnits.MILES_PER_HOUR);
222 CHARGE_AMPS("charge_amps", "chargingamps", DecimalType.class, false),
223 CHARGE_STARTING_RANGE("charge_starting_range", "chargestartingrange", StringType.class, false),
224 CHARGE_STARTING_SOC("charge_starting_soc", "chargestartingsoc", StringType.class, false),
225 CHARGE_STATE("charging_state", "chargingstate", StringType.class, false),
226 CHARGE_TO_MAX("charge_to_max_range", "chargetomax", OnOffType.class, false) {
228 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
229 if ("true".equals(s) || "1".equals(s)) {
230 return super.getState("ON");
232 if ("false".equals(s) || "0".equals(s)) {
233 return super.getState("OFF");
235 return super.getState(s);
238 CHARGE_TO_MAX_COUNTER("max_range_charge_counter", "maxcharges", DecimalType.class, false),
239 CHARGEPORT("charge_port_door_open", "chargeport", OnOffType.class, false) {
241 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
242 if ("true".equals(s) || "1".equals(s)) {
243 return super.getState("ON");
245 if ("false".equals(s) || "0".equals(s)) {
246 return super.getState("OFF");
248 return super.getState(s);
251 CHARGER_ACTUAL_CURRENT("charger_actual_current", "chargercurrent", DecimalType.class, false),
252 CHARGER_PHASES("charger_phases", "chargerphases", DecimalType.class, false),
253 CHARGER_PILOT_CURRENT("charger_pilot_current", "chargermaxcurrent", DecimalType.class, false),
254 CHARGER_POWER("charger_power", "chargerpower", DecimalType.class, false),
255 CHARGER_VOLTAGE("charger_voltage", "chargervoltage", DecimalType.class, false),
256 CLIMATE_ON("is_climate_on", "climate", OnOffType.class, false) {
258 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
259 if ("true".equals(s) || "1".equals(s)) {
260 return super.getState("ON");
262 if ("false".equals(s) || "0".equals(s)) {
263 return super.getState("OFF");
265 return super.getState(s);
268 CLIMATE_MAX_TEMP("max_avail_temp", "maxavailabletemp", DecimalType.class, false),
269 CLIMATE_MIN_TEMP("min_avail_temp", "minavailabletemp", DecimalType.class, false),
270 COLOR("exterior_color", "color", StringType.class, true),
271 DARK_RIMS("dark_rims", "darkrims", OnOffType.class, true) {
273 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
274 if ("true".equals(s) || "1".equals(s)) {
275 return super.getState("ON");
277 if ("false".equals(s) || "0".equals(s)) {
278 return super.getState("OFF");
280 return super.getState(s);
283 DISPLAY_NAME("display_name", "name", StringType.class, true),
284 DF("df", "driverfrontdoor", OpenClosedType.class, false) {
286 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
287 if ("true".equals(s) || "1".equals(s)) {
288 return super.getState("OPEN");
290 if ("false".equals(s) || "0".equals(s)) {
291 return super.getState("CLOSED");
293 return super.getState(s);
296 DOOR_LOCK("locked", "doorlock", OnOffType.class, false) {
298 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
299 if ("true".equals(s) || "1".equals(s)) {
300 return super.getState("ON");
302 if ("false".equals(s) || "0".equals(s)) {
303 return super.getState("OFF");
305 return super.getState(s);
308 DR("dr", "driverreardoor", OpenClosedType.class, false) {
310 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
311 if ("true".equals(s) || "1".equals(s)) {
312 return super.getState("OPEN");
314 if ("false".equals(s) || "0".equals(s)) {
315 return super.getState("CLOSED");
317 return super.getState(s);
320 DRIVER_TEMP("driver_temp_setting", "drivertemp", DecimalType.class, false) {
322 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
323 State someState = super.getState(s);
324 BigDecimal value = ((DecimalType) someState).toBigDecimal();
325 return new QuantityType<>(value, SIUnits.CELSIUS);
328 ELEVATION("elevation", "location", DecimalType.class, false) {
331 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
333 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
334 new StringType(proxy.elevation));
337 EST_BATTERY_RANGE("est_battery_range", "estimatedbatteryrange", DecimalType.class, false) {
339 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
340 State someState = super.getState(s);
341 BigDecimal value = ((DecimalType) someState).toBigDecimal();
342 return new QuantityType<>(value, ImperialUnits.MILE);
345 EST_HEADING("est_heading", "headingestimation", DecimalType.class, false) {
347 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
348 State someState = super.getState(s);
349 BigDecimal value = ((DecimalType) someState).toBigDecimal();
350 return new QuantityType<>(value, Units.DEGREE_ANGLE);
353 EST_RANGE("est_range", "estimatedrange", DecimalType.class, false) {
355 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
356 State someState = super.getState(s);
357 BigDecimal value = ((DecimalType) someState).toBigDecimal();
358 return new QuantityType<>(value, ImperialUnits.MILE);
361 EU_VEHICLE("eu_vehicle", "european", OnOffType.class, true) {
363 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
364 if ("true".equals(s) || "1".equals(s)) {
365 return super.getState("ON");
367 if ("false".equals(s) || "0".equals(s)) {
368 return super.getState("OFF");
370 return super.getState(s);
373 FAN_STATUS("fan_status", "fan", DecimalType.class, false),
374 FAST_CHARGER("fast_charger_present", "fastcharger", OnOffType.class, true) {
376 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
377 if ("true".equals(s) || "1".equals(s)) {
378 return super.getState("ON");
380 if ("false".equals(s) || "0".equals(s)) {
381 return super.getState("OFF");
383 return super.getState(s);
386 FAST_CHARGER_TYPE("fast_charger_type", "fastchargertype", StringType.class, true),
387 FAST_CHARGER_BRAND("fast_charger_brand", "fastchargerbrand", StringType.class, true),
388 FLASH(null, "flashlights", OnOffType.class, false) {
390 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
391 if ("true".equals(s) || "1".equals(s)) {
392 return super.getState("ON");
394 if ("false".equals(s) || "0".equals(s)) {
395 return super.getState("OFF");
397 return super.getState(s);
400 FRONT_DEFROSTER("is_front_defroster_on", "frontdefroster", OnOffType.class, false) {
402 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
403 if ("true".equals(s) || "1".equals(s)) {
404 return super.getState("ON");
406 if ("false".equals(s) || "0".equals(s)) {
407 return super.getState("OFF");
409 return super.getState(s);
412 FT("ft", "fronttrunk", OnOffType.class, false) {
414 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
415 if ("true".equals(s) || "1".equals(s)) {
416 return super.getState("ON");
418 if ("false".equals(s) || "0".equals(s)) {
419 return super.getState("OFF");
421 return super.getState(s);
424 GPS_AS_OF("gps_as_of", "gpstimestamp", DateTimeType.class, false) {
426 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
427 Date date = new Date();
428 SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
430 date.setTime(Long.valueOf(s) * 1000);
431 return super.getState(dateFormatter.format(date));
434 GUI_DISTANCE_UNITS("gui_distance_units", "distanceunits", StringType.class, true),
435 GUI_TEMPERATURE_UNITS("gui_temperature_units", "temperatureunits", StringType.class, true),
436 GUI_CHARGE_RATE_UNITS("gui_charge_rate_units", "chargerateunits", StringType.class, true),
437 GUI_24H_TIME("gui_24_hour_time", "24hourtime", StringType.class, true),
438 GUI_RANGE_DISPLAY("gui_range_display", "rangedisplay", StringType.class, true),
439 HAS_SPOILER("has_spoiler", "spoiler", OnOffType.class, true) {
441 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
442 if ("true".equals(s) || "1".equals(s)) {
443 return super.getState("ON");
445 if ("false".equals(s) || "0".equals(s)) {
446 return super.getState("OFF");
448 return super.getState(s);
451 HEADING("heading", "heading", DecimalType.class, false) {
453 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
454 State someState = super.getState(s);
455 BigDecimal value = ((DecimalType) someState).toBigDecimal();
456 return new QuantityType<>(value, Units.DEGREE_ANGLE);
459 HONK_HORN(null, "honkhorn", OnOffType.class, false) {
461 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
462 if ("true".equals(s) || "1".equals(s)) {
463 return super.getState("ON");
465 if ("false".equals(s) || "0".equals(s)) {
466 return super.getState("OFF");
468 return super.getState(s);
471 HOMELINK_NEARBY("homelink_nearby", "homelink", OnOffType.class, false) {
473 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
474 if ("true".equals(s) || "1".equals(s)) {
475 return super.getState("ON");
477 if ("false".equals(s) || "0".equals(s)) {
478 return super.getState("OFF");
480 return super.getState(s);
483 IDEAL_BATTERY_RANGE("ideal_battery_range", "idealbatteryrange", DecimalType.class, false) {
485 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
486 State someState = super.getState(s);
487 BigDecimal value = ((DecimalType) someState).toBigDecimal();
488 return new QuantityType<>(value, ImperialUnits.MILE);
491 INSIDE_TEMP("inside_temp", "insidetemp", DecimalType.class, false) {
493 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
494 State someState = super.getState(s);
495 BigDecimal value = ((DecimalType) someState).toBigDecimal();
496 return new QuantityType<>(value, SIUnits.CELSIUS);
499 LAST_AUTOPARK_ERROR("last_autopark_error", "lastautoparkerror", StringType.class, false),
500 LATITUDE("latitude", "location", DecimalType.class, false) {
502 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
504 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
505 new StringType(proxy.elevation));
508 LATITUDE_EVENT("est_lat", "location", DecimalType.class, false) {
510 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
512 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
513 new StringType(proxy.elevation));
516 LEFT_TEMP_DIR("left_temp_direction", "lefttempdirection", DecimalType.class, false),
517 LONGITUDE("longitude", "location", DecimalType.class, false) {
519 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
521 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
522 new StringType(proxy.elevation));
525 LONGITUDE_EVENT("est_lng", "location", DecimalType.class, false) {
527 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
529 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
530 new StringType(proxy.elevation));
533 MANAGED_CHARGING("managed_charging_active", "managedcharging", OnOffType.class, false) {
535 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
536 if ("true".equals(s)) {
537 return super.getState("ON");
539 if ("false".equals(s)) {
540 return super.getState("OFF");
542 return super.getState(s);
545 MANAGED_CHARGING_CANCELLED("managed_charging_user_canceled", "managedchargingcancelled", OnOffType.class,
548 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
549 if ("true".equals(s)) {
550 return super.getState("ON");
552 if ("false".equals(s)) {
553 return super.getState("OFF");
555 return super.getState(s);
558 MANAGED_CHARGING_START("managed_charging_start_time", "managedchargingstart", StringType.class, false),
559 MOBILE_ENABLED("mobile_enabled", "mobileenabled", OnOffType.class, false) {
561 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
562 if ("true".equals(s)) {
563 return super.getState("ON");
565 if ("false".equals(s)) {
566 return super.getState("OFF");
568 return super.getState(s);
571 MOTORIZED_CHARGE_PORT("motorized_charge_port", "motorizedchargeport", OnOffType.class, true) {
573 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
574 if ("true".equals(s) || "1".equals(s)) {
575 return super.getState("ON");
577 if ("false".equals(s) || "0".equals(s)) {
578 return super.getState("OFF");
580 return super.getState(s);
583 NATIVE_LATITUDE("native_latitude", "nativelocation", DecimalType.class, false) {
585 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
586 proxy.nativeLatitude = s;
587 return new PointType(new StringType(proxy.nativeLatitude), new StringType(proxy.nativeLongitude));
590 NATIVE_LONGITUDE("native_longitude", "nativelocation", DecimalType.class, false) {
592 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
593 proxy.nativeLongitude = s;
594 return new PointType(new StringType(proxy.nativeLatitude), new StringType(proxy.nativeLongitude));
597 NATIVE_LOCATION_SUPPORTED("native_location_supported", "nativelocationsupported", OnOffType.class, false) {
599 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
600 if ("true".equals(s) || "1".equals(s)) {
601 return super.getState("ON");
603 if ("false".equals(s) || "0".equals(s)) {
604 return super.getState("OFF");
606 return super.getState(s);
609 NATIVE_TYPE("native_type", "nativetype", StringType.class, false),
610 NOT_ENOUGH_POWER_TO_HEAT("not_enough_power_to_heat", "notenoughpower", OnOffType.class, false) {
612 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
613 if ("true".equals(s) || "1".equals(s)) {
614 return super.getState("ON");
616 if ("false".equals(s) || "0".equals(s)) {
617 return super.getState("OFF");
619 return super.getState(s);
622 NOTIFICATIONS_ENABLED("notifications_enabled", "notificationsenabled", OnOffType.class, false) {
624 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
625 if ("true".equals(s) || "1".equals(s)) {
626 return super.getState("ON");
628 if ("false".equals(s) || "0".equals(s)) {
629 return super.getState("OFF");
631 return super.getState(s);
634 NOTIFICATIONS_SUPPORTED("notifications_supported", "notificationssupported", OnOffType.class, false) {
636 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
637 if ("true".equals(s) || "1".equals(s)) {
638 return super.getState("ON");
640 if ("false".equals(s) || "0".equals(s)) {
641 return super.getState("OFF");
643 return super.getState(s);
646 ODOMETER("odometer", "odometer", DecimalType.class, false) {
648 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
649 State someState = super.getState(s);
650 BigDecimal value = ((DecimalType) someState).toBigDecimal();
651 return new QuantityType<>(value, ImperialUnits.MILE);
654 OPEN_FRUNK(null, "openfrunk", OnOffType.class, false) {
656 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
657 if ("true".equals(s) || "1".equals(s)) {
658 return super.getState("ON");
660 if ("false".equals(s) || "0".equals(s)) {
661 return super.getState("OFF");
663 return super.getState(s);
666 OPEN_TRUNK(null, "opentrunk", OnOffType.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("ON");
672 if ("false".equals(s) || "0".equals(s)) {
673 return super.getState("OFF");
675 return super.getState(s);
678 OPTION_CODES("option_codes", "options", StringType.class, true),
679 OUTSIDE_TEMP("outside_temp", "outsidetemp", DecimalType.class, false) {
681 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
682 State someState = super.getState(s);
683 BigDecimal value = ((DecimalType) someState).toBigDecimal();
684 return new QuantityType<>(value, SIUnits.CELSIUS);
687 PARSED_CALENDAR("parsed_calendar_supported", "parsedcalendar", OnOffType.class, false) {
689 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
690 if ("true".equals(s) || "1".equals(s)) {
691 return super.getState("ON");
693 if ("false".equals(s) || "0".equals(s)) {
694 return super.getState("OFF");
696 return super.getState(s);
699 PASSENGER_TEMP("passenger_temp_setting", "passengertemp", DecimalType.class, false) {
701 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
702 State someState = super.getState(s);
703 BigDecimal value = ((DecimalType) someState).toBigDecimal();
704 return new QuantityType<>(value, SIUnits.CELSIUS);
707 PERF_CONFIG("perf_config", "configuration", StringType.class, true),
708 PF("pf", "passengerfrontdoor", OpenClosedType.class, false) {
710 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
711 if ("true".equals(s) || "1".equals(s)) {
712 return super.getState("OPEN");
714 if ("false".equals(s) || "0".equals(s)) {
715 return super.getState("CLOSED");
717 return super.getState(s);
720 POWER("power", "power", DecimalType.class, false),
721 PR("pr", "passengerreardoor", OpenClosedType.class, false) {
723 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
724 if ("true".equals(s) || "1".equals(s)) {
725 return super.getState("OPEN");
727 if ("false".equals(s) || "0".equals(s)) {
728 return super.getState("CLOSED");
730 return super.getState(s);
733 PRECONDITIONING("is_preconditioning", "preconditioning", OnOffType.class, false) {
735 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
736 if ("true".equals(s) || "1".equals(s)) {
737 return super.getState("ON");
739 if ("false".equals(s) || "0".equals(s)) {
740 return super.getState("OFF");
742 return super.getState(s);
745 RANGE("range", "range", DecimalType.class, false) {
747 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
748 State someState = super.getState(s);
749 BigDecimal value = ((DecimalType) someState).toBigDecimal();
750 if (properties.containsKey("distanceunits") && "km/hr".equals(properties.get("distanceunits"))) {
751 return new QuantityType<>(value, MetricPrefix.KILO(SIUnits.METRE));
753 return new QuantityType<>(value, ImperialUnits.MILE);
757 REAR_DEFROSTER("is_rear_defroster_on", "reardefroster", OnOffType.class, false) {
759 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
760 if ("true".equals(s) || "1".equals(s)) {
761 return super.getState("ON");
763 if ("false".equals(s) || "0".equals(s)) {
764 return super.getState("OFF");
766 return super.getState(s);
769 REAR_SEAT_HEATERS("rear_seat_heaters", "rearseatheaters", OnOffType.class, true) {
771 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
772 if ("true".equals(s) || "1".equals(s)) {
773 return super.getState("ON");
775 if ("false".equals(s) || "0".equals(s)) {
776 return super.getState("OFF");
778 return super.getState(s);
781 REMOTE_START("remote_start", "remotestart", OnOffType.class, false) {
783 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
784 if ("true".equals(s) || "1".equals(s)) {
785 return super.getState("ON");
787 if ("false".equals(s) || "0".equals(s)) {
788 return super.getState("OFF");
790 return super.getState(s);
793 REMOTE_START_ENABLED("remote_start_enabled", "remotestartenabled", OnOffType.class, false) {
795 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
796 if ("true".equals(s) || "1".equals(s)) {
797 return super.getState("ON");
799 if ("false".equals(s) || "0".equals(s)) {
800 return super.getState("OFF");
802 return super.getState(s);
805 REMOTE_START_SUPPORTED("remote_start_supported", "remotestartsupported", OnOffType.class, false) {
807 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
808 if ("true".equals(s) || "1".equals(s)) {
809 return super.getState("ON");
811 if ("false".equals(s) || "0".equals(s)) {
812 return super.getState("OFF");
814 return super.getState(s);
817 RESET_VALET_PIN(null, "resetvaletpin", OnOffType.class, false) {
819 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
820 if ("true".equals(s) || "1".equals(s)) {
821 return super.getState("ON");
823 if ("false".equals(s) || "0".equals(s)) {
824 return super.getState("OFF");
826 return super.getState(s);
829 RHD("rhd", "rhd", OnOffType.class, true) {
831 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
832 if ("true".equals(s) || "1".equals(s)) {
833 return super.getState("ON");
835 if ("false".equals(s) || "0".equals(s)) {
836 return super.getState("OFF");
838 return super.getState(s);
841 RIGHT_TEMP_DIR("right_temp_direction", "righttempdirection", DecimalType.class, false),
842 ROOF_COLOR("roof_color", "roof", StringType.class, true),
843 RT("rt", "reartrunk", OnOffType.class, false) {
845 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
846 if ("true".equals(s) || "1".equals(s)) {
847 return super.getState("ON");
849 if ("false".equals(s) || "0".equals(s)) {
850 return super.getState("OFF");
852 return super.getState(s);
855 SEAT_HEATER_LEFT("seat_heater_left", "leftseatheater", DecimalType.class, false),
856 SEAT_HEATER_RIGHT("seat_heater_right", "rightseatheater", DecimalType.class, false),
857 SEAT_HEATER_REAR_LEFT("seat_heater_rear_left", "leftrearseatheater", DecimalType.class, false),
858 SEAT_HEATER_REAR_RIGHT("seat_heater_rear_right", "rightrearseatheater", DecimalType.class, false),
859 SEAT_HEATER_REAR_CENTER("seat_heater_rear_center", "centerrearseatheater", DecimalType.class, false),
860 SEAT_HEATER_REAR_RIGHT_BACK("seat_heater_rear_right_back", "rightrearbackseatheater", DecimalType.class, false),
861 SEAT_HEATER_REAR_RIGHT_LEFT("seat_heater_rear_left_back", "leftrearbackseatheater", DecimalType.class, false),
862 SEAT_TYPE("seat_type", "seattype", DecimalType.class, true),
863 SCHEDULED_CHARGING_PENDING("scheduled_charging_pending", "scheduledchargingpending", OnOffType.class, false) {
865 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
866 if ("true".equals(s) || "1".equals(s)) {
867 return super.getState("ON");
869 if ("false".equals(s) || "0".equals(s)) {
870 return super.getState("OFF");
872 return super.getState(s);
875 SCHEDULED_CHARGING_START_TIME("scheduled_charging_start_time", "scheduledchargingstart", DateTimeType.class,
878 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
879 Date date = new Date();
880 SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
882 date.setTime(Long.valueOf(s) * 1000);
883 return super.getState(dateFormatter.format(date));
886 SENTRY_MODE("sentry_mode", "sentrymode", OnOffType.class, false) {
888 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
889 if ("true".equals(s) || "1".equals(s)) {
890 return super.getState("ON");
892 if ("false".equals(s) || "0".equals(s)) {
893 return super.getState("OFF");
895 return super.getState(s);
898 SENTRY_MODE_AVAILABLE("sentry_mode_available", "sentrymodeavailable", OnOffType.class, false) {
900 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
901 if ("true".equals(s) || "1".equals(s)) {
902 return super.getState("ON");
904 if ("false".equals(s) || "0".equals(s)) {
905 return super.getState("OFF");
907 return super.getState(s);
910 SHIFTSTATE("shift_state", "shiftstate", StringType.class, false),
911 SIDEMIRROR_HEATING("side_mirror_heaters", "sidemirrorheaters", OnOffType.class, false) {
913 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
914 if ("true".equals(s) || "1".equals(s)) {
915 return super.getState("ON");
917 if ("false".equals(s) || "0".equals(s)) {
918 return super.getState("OFF");
920 return super.getState(s);
923 SMART_PRECONDITIONING("smart_preconditioning", "smartpreconditioning", OnOffType.class, false) {
925 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
926 if ("true".equals(s) || "1".equals(s)) {
927 return super.getState("ON");
929 if ("false".equals(s) || "0".equals(s)) {
930 return super.getState("OFF");
932 return super.getState(s);
935 SOC("soc", "soc", PercentType.class, false),
936 SPEED("speed", "speed", DecimalType.class, false) {
938 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
939 State someState = super.getState(s);
940 if (someState != null) {
941 BigDecimal value = ((DecimalType) someState).toBigDecimal();
942 return new QuantityType<>(value, ImperialUnits.MILES_PER_HOUR);
948 STATE("state", "state", StringType.class, false),
949 STEERINGWHEEL_HEATER("steering_wheel_heater", "steeringwheelheater", OnOffType.class, true) {
951 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
952 if ("true".equals(s) || "1".equals(s)) {
953 return super.getState("ON");
955 if ("false".equals(s) || "0".equals(s)) {
956 return super.getState("OFF");
958 return super.getState(s);
961 SUN_ROOF_PRESENT("sun_roof_installed", "sunroofinstalled", OnOffType.class, true) {
963 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
964 if ("true".equals(s) || "1".equals(s)) {
965 return super.getState("ON");
967 if ("false".equals(s) || "0".equals(s)) {
968 return super.getState("OFF");
970 return super.getState(s);
973 SUN_ROOF_STATE("sun_roof_state", "sunroofstate", StringType.class, false),
974 SUN_ROOF("sun_roof_percent_open", "sunroof", PercentType.class, false),
975 COMBINED_TEMP(null, "combinedtemp", DecimalType.class, false) {
977 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
978 State someState = super.getState(s);
979 BigDecimal value = ((DecimalType) someState).toBigDecimal();
980 return new QuantityType<>(value, SIUnits.CELSIUS);
983 TIME_TO_FULL_CHARGE("time_to_full_charge", "timetofullcharge", DecimalType.class, false),
984 TIMESTAMP("timestamp", "eventstamp", DateTimeType.class, false) {
986 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
987 Date date = new Date(Long.parseLong(s));
988 SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
989 return super.getState(dateFormatter.format(date));
992 TRIP_CARGING("trip_charging", "tripcharging", OnOffType.class, false) {
994 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
995 if ("true".equals(s) || "1".equals(s)) {
996 return super.getState("ON");
998 if ("false".equals(s) || "0".equals(s)) {
999 return super.getState("OFF");
1001 return super.getState(s);
1004 USABLE_BATTERY_LEVEL("usable_battery_level", "usablebatterylevel", DecimalType.class, false),
1005 USER_CHARGE_ENABLE_REQUEST("user_charge_enable_request", "userchargeenablerequest", StringType.class, false),
1006 VEHICLE_NAME("vehicle_name", "name", StringType.class, true) {
1008 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
1009 return super.getState(s.replace("\"", ""));
1012 VALET_MODE("valet_mode", "valetmode", OnOffType.class, false) {
1014 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
1015 if ("true".equals(s) || "1".equals(s)) {
1016 return super.getState("ON");
1018 if ("false".equals(s) || "0".equals(s)) {
1019 return super.getState("OFF");
1021 return super.getState(s);
1024 VALET_PIN("valet_pin_needed", "valetpin", OnOffType.class, false) {
1026 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
1027 if ("true".equals(s) || "1".equals(s)) {
1028 return super.getState("ON");
1030 if ("false".equals(s) || "0".equals(s)) {
1031 return super.getState("OFF");
1033 return super.getState(s);
1036 VIN("vin", "vin", StringType.class, true),
1037 WAKEUP(null, "wakeup", OnOffType.class, false) {
1039 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
1040 if ("true".equals(s) || "1".equals(s)) {
1041 return super.getState("ON");
1043 if ("false".equals(s) || "0".equals(s)) {
1044 return super.getState("OFF");
1046 return super.getState(s);
1049 WIPERBLADE_HEATER("wiper_blade_heater", "wiperbladeheater", OnOffType.class, false) {
1051 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
1052 if ("true".equals(s) || "1".equals(s)) {
1053 return super.getState("ON");
1055 if ("false".equals(s) || "0".equals(s)) {
1056 return super.getState("OFF");
1058 return super.getState(s);
1061 WHEEL_TYPE("wheel_type", "wheeltype", StringType.class, true);
1063 private final String restID;
1064 private final String channelID;
1065 private Class<? extends Type> typeClass;
1066 private final boolean isProperty;
1068 private TeslaChannelSelector(String restID, String channelID, Class<? extends Type> typeClass,
1069 boolean isProperty) {
1070 this.restID = restID;
1071 this.channelID = channelID;
1072 this.typeClass = typeClass;
1073 this.isProperty = isProperty;
1077 public String toString() {
1081 public String getChannelID() {
1085 public Class<? extends Type> getTypeClass() {
1089 public boolean isProperty() {
1093 public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
1097 public State getState(String s) {
1099 Method valueOf = typeClass.getMethod("valueOf", String.class);
1100 State state = (State) valueOf.invoke(typeClass, s);
1101 if (state != null) {
1104 } catch (NoSuchMethodException | IllegalArgumentException | IllegalAccessException
1105 | InvocationTargetException e) {
1111 public static TeslaChannelSelector getValueSelectorFromChannelID(String valueSelectorText)
1112 throws IllegalArgumentException {
1113 for (TeslaChannelSelector c : TeslaChannelSelector.values()) {
1114 if (c.channelID.equals(valueSelectorText)) {
1119 throw new IllegalArgumentException("Not valid value selector. Received Selector: " + valueSelectorText);
1122 public static TeslaChannelSelector getValueSelectorFromRESTID(String valueSelectorText)
1123 throws IllegalArgumentException {
1124 for (TeslaChannelSelector c : TeslaChannelSelector.values()) {
1125 if (c.restID != null && c.restID.equals(valueSelectorText)) {
1130 throw new IllegalArgumentException("Not valid value selector. Received Selector: " + valueSelectorText);
1134 public String latitude = "0";
1135 public String longitude = "0";
1136 public String elevation = "0";
1137 public String nativeLatitude = "0";
1138 public String nativeLongitude = "0";
1140 public State getState(String s, TeslaChannelSelector selector, Map<String, String> properties) {
1141 return selector.getState(s, this, properties);