]> git.basschouten.com Git - openhab-addons.git/blob
87901488d6839ba073db13e4fcbcaa310fafc2da
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
7  * This program and the accompanying materials are made available under the
8  * terms of the Eclipse Public License 2.0 which is available at
9  * http://www.eclipse.org/legal/epl-2.0
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.tesla.internal;
14
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;
20 import java.util.Map;
21
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;
36
37 /**
38  * The {@link TeslaChannelSelectorProxy} class is a helper class to instantiate
39  * and parameterize the {@link TeslaChannelSelector} Enum
40  *
41  * @author Karel Goderis - Initial contribution
42  */
43 public class TeslaChannelSelectorProxy {
44
45     public enum TeslaChannelSelector {
46
47         API("api_version", "api", DecimalType.class, true),
48         AUTO_COND("is_auto_conditioning_on", "autoconditioning", OnOffType.class, false) {
49             @Override
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");
53                 }
54                 if ("false".equals(s) || "0".equals(s)) {
55                     return super.getState("OFF");
56                 }
57                 return super.getState(s);
58             }
59         },
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) {
65             @Override
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");
69                 }
70                 if ("false".equals(s) || "0".equals(s)) {
71                     return super.getState("OFF");
72                 }
73                 return super.getState(s);
74             }
75         },
76         BATTERY_HEATER_NO_POWER("battery_heater_no_power", "batteryheaternopower", OnOffType.class, false) {
77             @Override
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");
81                 }
82                 if ("false".equals(s) || "0".equals(s)) {
83                     return super.getState("OFF");
84                 }
85                 return super.getState(s);
86             }
87         },
88         BATTERY_LEVEL("battery_level", "batterylevel", DecimalType.class, false),
89         BATTERY_RANGE("battery_range", "batteryrange", DecimalType.class, false) {
90             @Override
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);
95             }
96         },
97         CALENDAR_SUPPORTED("calendar_supported", "calendarsupported", OnOffType.class, true) {
98             @Override
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");
102                 }
103                 if ("false".equals(s) || "0".equals(s)) {
104                     return super.getState("OFF");
105                 }
106                 return super.getState(s);
107             }
108         },
109         CALENDAR_ENABLED("calendar_enabled", "calendarenabled", OnOffType.class, false) {
110             @Override
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");
114                 }
115                 if ("false".equals(s) || "0".equals(s)) {
116                     return super.getState("OFF");
117                 }
118                 return super.getState(s);
119             }
120         },
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) {
124             @Override
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");
128                 }
129                 if ("false".equals(s) || "0".equals(s)) {
130                     return super.getState("OFF");
131                 }
132                 return super.getState(s);
133             }
134         },
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) {
139             @Override
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");
143                 }
144                 if ("false".equals(s) || "0".equals(s)) {
145                     return super.getState("OFF");
146                 }
147                 return super.getState(s);
148             }
149         },
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) {
157             @Override
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);
162             }
163         },
164         CHARGE_MILES_ADDED_RANGE("charge_miles_added_rated", "chargerateddistanceadded", DecimalType.class, false) {
165             @Override
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);
170             }
171         },
172         CHARGE_RATE("charge_rate", "chargerate", DecimalType.class, false) {
173             @Override
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);
178             }
179         },
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) {
185             @Override
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");
189                 }
190                 if ("false".equals(s) || "0".equals(s)) {
191                     return super.getState("OFF");
192                 }
193                 return super.getState(s);
194             }
195         },
196         CHARGE_TO_MAX_COUNTER("max_range_charge_counter", "maxcharges", DecimalType.class, false),
197         CHARGEPORT("charge_port_door_open", "chargeport", OnOffType.class, false) {
198             @Override
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");
202                 }
203                 if ("false".equals(s) || "0".equals(s)) {
204                     return super.getState("OFF");
205                 }
206                 return super.getState(s);
207             }
208         },
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) {
215             @Override
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");
219                 }
220                 if ("false".equals(s) || "0".equals(s)) {
221                     return super.getState("OFF");
222                 }
223                 return super.getState(s);
224             }
225         },
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) {
230             @Override
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");
234                 }
235                 if ("false".equals(s) || "0".equals(s)) {
236                     return super.getState("OFF");
237                 }
238                 return super.getState(s);
239             }
240         },
241         DISPLAY_NAME("display_name", "name", StringType.class, true),
242         DF("df", "driverfrontdoor", OpenClosedType.class, false) {
243             @Override
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");
247                 }
248                 if ("false".equals(s) || "0".equals(s)) {
249                     return super.getState("CLOSED");
250                 }
251                 return super.getState(s);
252             }
253         },
254         DOOR_LOCK("locked", "doorlock", OnOffType.class, false) {
255             @Override
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");
259                 }
260                 if ("false".equals(s) || "0".equals(s)) {
261                     return super.getState("OFF");
262                 }
263                 return super.getState(s);
264             }
265         },
266         DR("dr", "driverreardoor", OpenClosedType.class, false) {
267             @Override
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");
271                 }
272                 if ("false".equals(s) || "0".equals(s)) {
273                     return super.getState("CLOSED");
274                 }
275                 return super.getState(s);
276             }
277         },
278         DRIVER_TEMP("driver_temp_setting", "drivertemp", DecimalType.class, false) {
279             @Override
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);
284             }
285         },
286         ELEVATION("elevation", "location", DecimalType.class, false) {
287
288             @Override
289             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
290                 proxy.elevation = s;
291                 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
292                         new StringType(proxy.elevation));
293             }
294         },
295         EST_BATTERY_RANGE("est_battery_range", "estimatedbatteryrange", DecimalType.class, false) {
296             @Override
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);
301             }
302         },
303         EST_HEADING("est_heading", "headingestimation", DecimalType.class, false) {
304             @Override
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);
309             }
310         },
311         EST_RANGE("est_range", "estimatedrange", DecimalType.class, false) {
312             @Override
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);
317             }
318         },
319         EU_VEHICLE("eu_vehicle", "european", OnOffType.class, true) {
320             @Override
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");
324                 }
325                 if ("false".equals(s) || "0".equals(s)) {
326                     return super.getState("OFF");
327                 }
328                 return super.getState(s);
329             }
330         },
331         FAN_STATUS("fan_status", "fan", DecimalType.class, false),
332         FAST_CHARGER("fast_charger_present", "fastcharger", OnOffType.class, true) {
333             @Override
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");
337                 }
338                 if ("false".equals(s) || "0".equals(s)) {
339                     return super.getState("OFF");
340                 }
341                 return super.getState(s);
342             }
343         },
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) {
347             @Override
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");
351                 }
352                 if ("false".equals(s) || "0".equals(s)) {
353                     return super.getState("OFF");
354                 }
355                 return super.getState(s);
356             }
357         },
358         FRONT_DEFROSTER("is_front_defroster_on", "frontdefroster", OnOffType.class, false) {
359             @Override
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");
363                 }
364                 if ("false".equals(s) || "0".equals(s)) {
365                     return super.getState("OFF");
366                 }
367                 return super.getState(s);
368             }
369         },
370         FT("ft", "fronttrunk", OnOffType.class, false) {
371             @Override
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");
375                 }
376                 if ("false".equals(s) || "0".equals(s)) {
377                     return super.getState("OFF");
378                 }
379                 return super.getState(s);
380             }
381         },
382         GPS_AS_OF("gps_as_of", "gpstimestamp", DateTimeType.class, false) {
383             @Override
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");
387
388                 date.setTime(Long.valueOf(s) * 1000);
389                 return super.getState(dateFormatter.format(date));
390             }
391         },
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) {
398             @Override
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");
402                 }
403                 if ("false".equals(s) || "0".equals(s)) {
404                     return super.getState("OFF");
405                 }
406                 return super.getState(s);
407             }
408         },
409         HEADING("heading", "heading", DecimalType.class, false) {
410             @Override
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);
415             }
416         },
417         HONK_HORN(null, "honkhorn", OnOffType.class, false) {
418             @Override
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");
422                 }
423                 if ("false".equals(s) || "0".equals(s)) {
424                     return super.getState("OFF");
425                 }
426                 return super.getState(s);
427             }
428         },
429         HOMELINK_NEARBY("homelink_nearby", "homelink", OnOffType.class, false) {
430             @Override
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");
434                 }
435                 if ("false".equals(s) || "0".equals(s)) {
436                     return super.getState("OFF");
437                 }
438                 return super.getState(s);
439             }
440         },
441         IDEAL_BATTERY_RANGE("ideal_battery_range", "idealbatteryrange", DecimalType.class, false) {
442             @Override
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);
447             }
448         },
449         INSIDE_TEMP("inside_temp", "insidetemp", DecimalType.class, false) {
450             @Override
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);
455             }
456         },
457         LAST_AUTOPARK_ERROR("last_autopark_error", "lastautoparkerror", StringType.class, false),
458         LATITUDE("latitude", "location", DecimalType.class, false) {
459             @Override
460             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
461                 proxy.latitude = s;
462                 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
463                         new StringType(proxy.elevation));
464             }
465         },
466         LATITUDE_EVENT("est_lat", "location", DecimalType.class, false) {
467             @Override
468             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
469                 proxy.latitude = s;
470                 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
471                         new StringType(proxy.elevation));
472             }
473         },
474         LEFT_TEMP_DIR("left_temp_direction", "lefttempdirection", DecimalType.class, false),
475         LONGITUDE("longitude", "location", DecimalType.class, false) {
476             @Override
477             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
478                 proxy.longitude = s;
479                 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
480                         new StringType(proxy.elevation));
481             }
482         },
483         LONGITUDE_EVENT("est_lng", "location", DecimalType.class, false) {
484             @Override
485             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
486                 proxy.longitude = s;
487                 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
488                         new StringType(proxy.elevation));
489             }
490         },
491         MANAGED_CHARGING("managed_charging_active", "managedcharging", OnOffType.class, false) {
492             @Override
493             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
494                 if ("true".equals(s)) {
495                     return super.getState("ON");
496                 }
497                 if ("false".equals(s)) {
498                     return super.getState("OFF");
499                 }
500                 return super.getState(s);
501             }
502         },
503         MANAGED_CHARGING_CANCELLED("managed_charging_user_canceled", "managedchargingcancelled", OnOffType.class,
504                 false) {
505             @Override
506             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
507                 if ("true".equals(s)) {
508                     return super.getState("ON");
509                 }
510                 if ("false".equals(s)) {
511                     return super.getState("OFF");
512                 }
513                 return super.getState(s);
514             }
515         },
516         MANAGED_CHARGING_START("managed_charging_start_time", "managedchargingstart", StringType.class, false),
517         MOBILE_ENABLED(TeslaBindingConstants.MOBILE_ENABLED_STATE, "mobileenabled", OnOffType.class, false) {
518             @Override
519             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
520                 if ("true".equals(s)) {
521                     return super.getState("ON");
522                 }
523                 if ("false".equals(s)) {
524                     return super.getState("OFF");
525                 }
526                 return super.getState(s);
527             }
528         },
529         MOTORIZED_CHARGE_PORT("motorized_charge_port", "motorizedchargeport", OnOffType.class, true) {
530             @Override
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");
534                 }
535                 if ("false".equals(s) || "0".equals(s)) {
536                     return super.getState("OFF");
537                 }
538                 return super.getState(s);
539             }
540         },
541         NATIVE_LATITUDE("native_latitude", "nativelocation", DecimalType.class, false) {
542             @Override
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));
546             }
547         },
548         NATIVE_LONGITUDE("native_longitude", "nativelocation", DecimalType.class, false) {
549             @Override
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));
553             }
554         },
555         NATIVE_LOCATION_SUPPORTED("native_location_supported", "nativelocationsupported", OnOffType.class, false) {
556             @Override
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");
560                 }
561                 if ("false".equals(s) || "0".equals(s)) {
562                     return super.getState("OFF");
563                 }
564                 return super.getState(s);
565             }
566         },
567         NATIVE_TYPE("native_type", "nativetype", StringType.class, false),
568         NOT_ENOUGH_POWER_TO_HEAT("not_enough_power_to_heat", "notenoughpower", OnOffType.class, false) {
569             @Override
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");
573                 }
574                 if ("false".equals(s) || "0".equals(s)) {
575                     return super.getState("OFF");
576                 }
577                 return super.getState(s);
578             }
579         },
580         NOTIFICATIONS_ENABLED("notifications_enabled", "notificationsenabled", OnOffType.class, false) {
581             @Override
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");
585                 }
586                 if ("false".equals(s) || "0".equals(s)) {
587                     return super.getState("OFF");
588                 }
589                 return super.getState(s);
590             }
591         },
592         NOTIFICATIONS_SUPPORTED("notifications_supported", "notificationssupported", OnOffType.class, false) {
593             @Override
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");
597                 }
598                 if ("false".equals(s) || "0".equals(s)) {
599                     return super.getState("OFF");
600                 }
601                 return super.getState(s);
602             }
603         },
604         ODOMETER("odometer", "odometer", DecimalType.class, false) {
605             @Override
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);
610             }
611         },
612         OPEN_FRUNK(null, "openfrunk", OnOffType.class, false) {
613             @Override
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");
617                 }
618                 if ("false".equals(s) || "0".equals(s)) {
619                     return super.getState("OFF");
620                 }
621                 return super.getState(s);
622             }
623         },
624         OPEN_TRUNK(null, "opentrunk", OnOffType.class, false) {
625             @Override
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");
629                 }
630                 if ("false".equals(s) || "0".equals(s)) {
631                     return super.getState("OFF");
632                 }
633                 return super.getState(s);
634             }
635         },
636         OPTION_CODES("option_codes", "options", StringType.class, true),
637         OUTSIDE_TEMP("outside_temp", "outsidetemp", DecimalType.class, false) {
638             @Override
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);
643             }
644         },
645         PARSED_CALENDAR("parsed_calendar_supported", "parsedcalendar", OnOffType.class, false) {
646             @Override
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");
650                 }
651                 if ("false".equals(s) || "0".equals(s)) {
652                     return super.getState("OFF");
653                 }
654                 return super.getState(s);
655             }
656         },
657         PASSENGER_TEMP("passenger_temp_setting", "passengertemp", DecimalType.class, false) {
658             @Override
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);
663             }
664         },
665         PERF_CONFIG("perf_config", "configuration", StringType.class, true),
666         PF("pf", "passengerfrontdoor", OpenClosedType.class, false) {
667             @Override
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");
671                 }
672                 if ("false".equals(s) || "0".equals(s)) {
673                     return super.getState("CLOSED");
674                 }
675                 return super.getState(s);
676             }
677         },
678         POWER("power", "power", DecimalType.class, false),
679         PR("pr", "passengerreardoor", OpenClosedType.class, false) {
680             @Override
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");
684                 }
685                 if ("false".equals(s) || "0".equals(s)) {
686                     return super.getState("CLOSED");
687                 }
688                 return super.getState(s);
689             }
690         },
691         PRECONDITIONING("is_preconditioning", "preconditioning", OnOffType.class, false) {
692             @Override
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");
696                 }
697                 if ("false".equals(s) || "0".equals(s)) {
698                     return super.getState("OFF");
699                 }
700                 return super.getState(s);
701             }
702         },
703         RANGE("range", "range", DecimalType.class, false) {
704             @Override
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));
710                 } else {
711                     return new QuantityType<>(value, ImperialUnits.MILE);
712                 }
713             }
714         },
715         REAR_DEFROSTER("is_rear_defroster_on", "reardefroster", OnOffType.class, false) {
716             @Override
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");
720                 }
721                 if ("false".equals(s) || "0".equals(s)) {
722                     return super.getState("OFF");
723                 }
724                 return super.getState(s);
725             }
726         },
727         REAR_SEAT_HEATERS("rear_seat_heaters", "rearseatheaters", OnOffType.class, true) {
728             @Override
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");
732                 }
733                 if ("false".equals(s) || "0".equals(s)) {
734                     return super.getState("OFF");
735                 }
736                 return super.getState(s);
737             }
738         },
739         REMOTE_START("remote_start", "remotestart", OnOffType.class, false) {
740             @Override
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");
744                 }
745                 if ("false".equals(s) || "0".equals(s)) {
746                     return super.getState("OFF");
747                 }
748                 return super.getState(s);
749             }
750         },
751         REMOTE_START_ENABLED("remote_start_enabled", "remotestartenabled", OnOffType.class, false) {
752             @Override
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");
756                 }
757                 if ("false".equals(s) || "0".equals(s)) {
758                     return super.getState("OFF");
759                 }
760                 return super.getState(s);
761             }
762         },
763         REMOTE_START_SUPPORTED("remote_start_supported", "remotestartsupported", OnOffType.class, false) {
764             @Override
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");
768                 }
769                 if ("false".equals(s) || "0".equals(s)) {
770                     return super.getState("OFF");
771                 }
772                 return super.getState(s);
773             }
774         },
775         RESET_VALET_PIN(null, "resetvaletpin", OnOffType.class, false) {
776             @Override
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");
780                 }
781                 if ("false".equals(s) || "0".equals(s)) {
782                     return super.getState("OFF");
783                 }
784                 return super.getState(s);
785             }
786         },
787         RHD("rhd", "rhd", OnOffType.class, true) {
788             @Override
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");
792                 }
793                 if ("false".equals(s) || "0".equals(s)) {
794                     return super.getState("OFF");
795                 }
796                 return super.getState(s);
797             }
798         },
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) {
802             @Override
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");
806                 }
807                 if ("false".equals(s) || "0".equals(s)) {
808                     return super.getState("OFF");
809                 }
810                 return super.getState(s);
811             }
812         },
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) {
822             @Override
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");
826                 }
827                 if ("false".equals(s) || "0".equals(s)) {
828                     return super.getState("OFF");
829                 }
830                 return super.getState(s);
831             }
832         },
833         SCHEDULED_CHARGING_START_TIME("scheduled_charging_start_time", "scheduledchargingstart", DateTimeType.class,
834                 false) {
835             @Override
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");
839
840                 date.setTime(Long.valueOf(s) * 1000);
841                 return super.getState(dateFormatter.format(date));
842             }
843         },
844         SENTRY_MODE("sentry_mode", "sentrymode", OnOffType.class, false) {
845             @Override
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");
849                 }
850                 if ("false".equals(s) || "0".equals(s)) {
851                     return super.getState("OFF");
852                 }
853                 return super.getState(s);
854             }
855         },
856         SENTRY_MODE_AVAILABLE("sentry_mode_available", "sentrymodeavailable", OnOffType.class, false) {
857             @Override
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");
861                 }
862                 if ("false".equals(s) || "0".equals(s)) {
863                     return super.getState("OFF");
864                 }
865                 return super.getState(s);
866             }
867         },
868         SHIFTSTATE("shift_state", "shiftstate", StringType.class, false),
869         SIDEMIRROR_HEATING("side_mirror_heaters", "sidemirrorheaters", OnOffType.class, false) {
870             @Override
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");
874                 }
875                 if ("false".equals(s) || "0".equals(s)) {
876                     return super.getState("OFF");
877                 }
878                 return super.getState(s);
879             }
880         },
881         SMART_PRECONDITIONING("smart_preconditioning", "smartpreconditioning", OnOffType.class, false) {
882             @Override
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");
886                 }
887                 if ("false".equals(s) || "0".equals(s)) {
888                     return super.getState("OFF");
889                 }
890                 return super.getState(s);
891             }
892         },
893         SOC("soc", "soc", PercentType.class, false),
894         SPEED("speed", "speed", DecimalType.class, false) {
895             @Override
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);
901                 } else {
902                     return null;
903                 }
904             }
905         },
906         STATE("state", "state", StringType.class, false),
907         STEERINGWHEEL_HEATER("steering_wheel_heater", "steeringwheelheater", OnOffType.class, true) {
908             @Override
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");
912                 }
913                 if ("false".equals(s) || "0".equals(s)) {
914                     return super.getState("OFF");
915                 }
916                 return super.getState(s);
917             }
918         },
919         SUN_ROOF_PRESENT("sun_roof_installed", "sunroofinstalled", OnOffType.class, true) {
920             @Override
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");
924                 }
925                 if ("false".equals(s) || "0".equals(s)) {
926                     return super.getState("OFF");
927                 }
928                 return super.getState(s);
929             }
930         },
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) {
934             @Override
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);
939             }
940         },
941         TIME_TO_FULL_CHARGE("time_to_full_charge", "timetofullcharge", DecimalType.class, false),
942         TIMESTAMP("timestamp", "eventstamp", DateTimeType.class, false) {
943             @Override
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));
948             }
949         },
950         TRIP_CARGING("trip_charging", "tripcharging", OnOffType.class, false) {
951             @Override
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");
955                 }
956                 if ("false".equals(s) || "0".equals(s)) {
957                     return super.getState("OFF");
958                 }
959                 return super.getState(s);
960             }
961         },
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) {
965             @Override
966             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
967                 return super.getState(s.replaceAll("\"", ""));
968             }
969         },
970         VALET_MODE("valet_mode", "valetmode", OnOffType.class, false) {
971             @Override
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");
975                 }
976                 if ("false".equals(s) || "0".equals(s)) {
977                     return super.getState("OFF");
978                 }
979                 return super.getState(s);
980             }
981         },
982         VALET_PIN("valet_pin_needed", "valetpin", OnOffType.class, false) {
983             @Override
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");
987                 }
988                 if ("false".equals(s) || "0".equals(s)) {
989                     return super.getState("OFF");
990                 }
991                 return super.getState(s);
992             }
993         },
994         VIN("vin", "vin", StringType.class, true),
995         WAKEUP(null, "wakeup", OnOffType.class, false) {
996             @Override
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");
1000                 }
1001                 if ("false".equals(s) || "0".equals(s)) {
1002                     return super.getState("OFF");
1003                 }
1004                 return super.getState(s);
1005             }
1006         },
1007         WIPERBLADE_HEATER("wiper_blade_heater", "wiperbladeheater", OnOffType.class, false) {
1008             @Override
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");
1012                 }
1013                 if ("false".equals(s) || "0".equals(s)) {
1014                     return super.getState("OFF");
1015                 }
1016                 return super.getState(s);
1017             }
1018         },
1019         WHEEL_TYPE("wheel_type", "wheeltype", StringType.class, true);
1020
1021         private final String restID;
1022         private final String channelID;
1023         private Class<? extends Type> typeClass;
1024         private final boolean isProperty;
1025
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;
1032         }
1033
1034         @Override
1035         public String toString() {
1036             return restID;
1037         }
1038
1039         public String getChannelID() {
1040             return channelID;
1041         }
1042
1043         public Class<? extends Type> getTypeClass() {
1044             return typeClass;
1045         }
1046
1047         public boolean isProperty() {
1048             return isProperty;
1049         }
1050
1051         public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
1052             return getState(s);
1053         }
1054
1055         public State getState(String s) {
1056             try {
1057                 Method valueOf = typeClass.getMethod("valueOf", String.class);
1058                 State state = (State) valueOf.invoke(typeClass, s);
1059                 if (state != null) {
1060                     return state;
1061                 }
1062             } catch (NoSuchMethodException | IllegalArgumentException | IllegalAccessException
1063                     | InvocationTargetException e) {
1064             }
1065
1066             return null;
1067         }
1068
1069         public static TeslaChannelSelector getValueSelectorFromChannelID(String valueSelectorText)
1070                 throws IllegalArgumentException {
1071             for (TeslaChannelSelector c : TeslaChannelSelector.values()) {
1072                 if (c.channelID.equals(valueSelectorText)) {
1073                     return c;
1074                 }
1075             }
1076
1077             throw new IllegalArgumentException("Not valid value selector. Received Selector: " + valueSelectorText);
1078         }
1079
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)) {
1084                     return c;
1085                 }
1086             }
1087
1088             throw new IllegalArgumentException("Not valid value selector. Received Selector: " + valueSelectorText);
1089         }
1090     }
1091
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";
1097
1098     public State getState(String s, TeslaChannelSelector selector, Map<String, String> properties) {
1099         return selector.getState(s, this, properties);
1100     }
1101 }