]> git.basschouten.com Git - openhab-addons.git/blob
0e2bb8884e296c0da2cf100acb46fa118fed34e6
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2022 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
7  * This program and the accompanying materials are made available under the
8  * terms of the Eclipse Public License 2.0 which is available at
9  * http://www.eclipse.org/legal/epl-2.0
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.tesla.internal;
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 (s.equals("true") || s.equals("1")) {
52                     return super.getState("ON");
53                 }
54                 if (s.equals("false") || s.equals("0")) {
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 (s.equals("true") || s.equals("1")) {
68                     return super.getState("ON");
69                 }
70                 if (s.equals("false") || s.equals("0")) {
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 (s.equals("true") || s.equals("1")) {
80                     return super.getState("ON");
81                 }
82                 if (s.equals("false") || s.equals("0")) {
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 (s.equals("true") || s.equals("1")) {
101                     return super.getState("ON");
102                 }
103                 if (s.equals("false") || s.equals("0")) {
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 (s.equals("true") || s.equals("1")) {
113                     return super.getState("ON");
114                 }
115                 if (s.equals("false") || s.equals("0")) {
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 (s.equals("true") || s.equals("1")) {
127                     return super.getState("ON");
128                 }
129                 if (s.equals("false") || s.equals("0")) {
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 (s.equals("true") || s.equals("1")) {
142                     return super.getState("ON");
143                 }
144                 if (s.equals("false") || s.equals("0")) {
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_STARTING_RANGE("charge_starting_range", "chargestartingrange", StringType.class, false),
181         CHARGE_STARTING_SOC("charge_starting_soc", "chargestartingsoc", StringType.class, false),
182         CHARGE_STATE("charging_state", "chargingstate", StringType.class, false),
183         CHARGE_TO_MAX("charge_to_max_range", "chargetomax", OnOffType.class, false) {
184             @Override
185             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
186                 if (s.equals("true") || s.equals("1")) {
187                     return super.getState("ON");
188                 }
189                 if (s.equals("false") || s.equals("0")) {
190                     return super.getState("OFF");
191                 }
192                 return super.getState(s);
193             }
194         },
195         CHARGE_TO_MAX_COUNTER("max_range_charge_counter", "maxcharges", DecimalType.class, false),
196         CHARGEPORT("charge_port_door_open", "chargeport", OnOffType.class, false) {
197             @Override
198             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
199                 if (s.equals("true") || s.equals("1")) {
200                     return super.getState("ON");
201                 }
202                 if (s.equals("false") || s.equals("0")) {
203                     return super.getState("OFF");
204                 }
205                 return super.getState(s);
206             }
207         },
208         CHARGER_ACTUAL_CURRENT("charger_actual_current", "chargercurrent", DecimalType.class, false),
209         CHARGER_PHASES("charger_phases", "chargerphases", DecimalType.class, false),
210         CHARGER_PILOT_CURRENT("charger_pilot_current", "chargermaxcurrent", DecimalType.class, false),
211         CHARGER_POWER("charger_power", "chargerpower", DecimalType.class, false),
212         CHARGER_VOLTAGE("charger_voltage", "chargervoltage", DecimalType.class, false),
213         CLIMATE_ON("is_climate_on", "climate", OnOffType.class, false) {
214             @Override
215             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
216                 if (s.equals("true") || s.equals("1")) {
217                     return super.getState("ON");
218                 }
219                 if (s.equals("false") || s.equals("0")) {
220                     return super.getState("OFF");
221                 }
222                 return super.getState(s);
223             }
224         },
225         CLIMATE_MAX_TEMP("max_avail_temp", "maxavailabletemp", DecimalType.class, false),
226         CLIMATE_MIN_TEMP("min_avail_temp", "minavailabletemp", DecimalType.class, false),
227         COLOR("exterior_color", "color", StringType.class, true),
228         DARK_RIMS("dark_rims", "darkrims", OnOffType.class, true) {
229             @Override
230             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
231                 if (s.equals("true") || s.equals("1")) {
232                     return super.getState("ON");
233                 }
234                 if (s.equals("false") || s.equals("0")) {
235                     return super.getState("OFF");
236                 }
237                 return super.getState(s);
238             }
239         },
240         DISPLAY_NAME("display_name", "name", StringType.class, true),
241         DF("df", "driverfrontdoor", OpenClosedType.class, false) {
242             @Override
243             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
244                 if (s.equals("true") || s.equals("1")) {
245                     return super.getState("OPEN");
246                 }
247                 if (s.equals("false") || s.equals("0")) {
248                     return super.getState("CLOSED");
249                 }
250                 return super.getState(s);
251             }
252         },
253         DOOR_LOCK("locked", "doorlock", OnOffType.class, false) {
254             @Override
255             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
256                 if (s.equals("true") || s.equals("1")) {
257                     return super.getState("ON");
258                 }
259                 if (s.equals("false") || s.equals("0")) {
260                     return super.getState("OFF");
261                 }
262                 return super.getState(s);
263             }
264         },
265         DR("dr", "driverreardoor", OpenClosedType.class, false) {
266             @Override
267             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
268                 if (s.equals("true") || s.equals("1")) {
269                     return super.getState("OPEN");
270                 }
271                 if (s.equals("false") || s.equals("0")) {
272                     return super.getState("CLOSED");
273                 }
274                 return super.getState(s);
275             }
276         },
277         DRIVER_TEMP("driver_temp_setting", "drivertemp", DecimalType.class, false) {
278             @Override
279             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
280                 State someState = super.getState(s);
281                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
282                 return new QuantityType<>(value, SIUnits.CELSIUS);
283             }
284         },
285         ELEVATION("elevation", "location", DecimalType.class, false) {
286
287             @Override
288             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
289                 proxy.elevation = s;
290                 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
291                         new StringType(proxy.elevation));
292             }
293         },
294         EST_BATTERY_RANGE("est_battery_range", "estimatedbatteryrange", DecimalType.class, false) {
295             @Override
296             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
297                 State someState = super.getState(s);
298                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
299                 return new QuantityType<>(value, ImperialUnits.MILE);
300             }
301         },
302         EST_HEADING("est_heading", "headingestimation", DecimalType.class, false) {
303             @Override
304             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
305                 State someState = super.getState(s);
306                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
307                 return new QuantityType<>(value, Units.DEGREE_ANGLE);
308             }
309         },
310         EST_RANGE("est_range", "estimatedrange", DecimalType.class, false) {
311             @Override
312             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
313                 State someState = super.getState(s);
314                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
315                 return new QuantityType<>(value, ImperialUnits.MILE);
316             }
317         },
318         EU_VEHICLE("eu_vehicle", "european", OnOffType.class, true) {
319             @Override
320             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
321                 if (s.equals("true") || s.equals("1")) {
322                     return super.getState("ON");
323                 }
324                 if (s.equals("false") || s.equals("0")) {
325                     return super.getState("OFF");
326                 }
327                 return super.getState(s);
328             }
329         },
330         FAN_STATUS("fan_status", "fan", DecimalType.class, false),
331         FAST_CHARGER("fast_charger_present", "fastcharger", OnOffType.class, true) {
332             @Override
333             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
334                 if (s.equals("true") || s.equals("1")) {
335                     return super.getState("ON");
336                 }
337                 if (s.equals("false") || s.equals("0")) {
338                     return super.getState("OFF");
339                 }
340                 return super.getState(s);
341             }
342         },
343         FAST_CHARGER_TYPE("fast_charger_type", "fastchargertype", StringType.class, true),
344         FAST_CHARGER_BRAND("fast_charger_brand", "fastchargerbrand", StringType.class, true),
345         FLASH(null, "flashlights", OnOffType.class, false) {
346             @Override
347             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
348                 if (s.equals("true") || s.equals("1")) {
349                     return super.getState("ON");
350                 }
351                 if (s.equals("false") || s.equals("0")) {
352                     return super.getState("OFF");
353                 }
354                 return super.getState(s);
355             }
356         },
357         FRONT_DEFROSTER("is_front_defroster_on", "frontdefroster", OnOffType.class, false) {
358             @Override
359             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
360                 if (s.equals("true") || s.equals("1")) {
361                     return super.getState("ON");
362                 }
363                 if (s.equals("false") || s.equals("0")) {
364                     return super.getState("OFF");
365                 }
366                 return super.getState(s);
367             }
368         },
369         FT("ft", "fronttrunk", OnOffType.class, false) {
370             @Override
371             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
372                 if (s.equals("true") || s.equals("1")) {
373                     return super.getState("ON");
374                 }
375                 if (s.equals("false") || s.equals("0")) {
376                     return super.getState("OFF");
377                 }
378                 return super.getState(s);
379             }
380         },
381         GPS_AS_OF("gps_as_of", "gpstimestamp", DateTimeType.class, false) {
382             @Override
383             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
384                 Date date = new Date();
385                 SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
386
387                 date.setTime(Long.valueOf(s) * 1000);
388                 return super.getState(dateFormatter.format(date));
389             }
390         },
391         GUI_DISTANCE_UNITS("gui_distance_units", "distanceunits", StringType.class, true),
392         GUI_TEMPERATURE_UNITS("gui_temperature_units", "temperatureunits", StringType.class, true),
393         GUI_CHARGE_RATE_UNITS("gui_charge_rate_units", "chargerateunits", StringType.class, true),
394         GUI_24H_TIME("gui_24_hour_time", "24hourtime", StringType.class, true),
395         GUI_RANGE_DISPLAY("gui_range_display", "rangedisplay", StringType.class, true),
396         HAS_SPOILER("has_spoiler", "spoiler", OnOffType.class, true) {
397             @Override
398             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
399                 if (s.equals("true") || s.equals("1")) {
400                     return super.getState("ON");
401                 }
402                 if (s.equals("false") || s.equals("0")) {
403                     return super.getState("OFF");
404                 }
405                 return super.getState(s);
406             }
407         },
408         HEADING("heading", "heading", DecimalType.class, false) {
409             @Override
410             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
411                 State someState = super.getState(s);
412                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
413                 return new QuantityType<>(value, Units.DEGREE_ANGLE);
414             }
415         },
416         HONK_HORN(null, "honkhorn", OnOffType.class, false) {
417             @Override
418             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
419                 if (s.equals("true") || s.equals("1")) {
420                     return super.getState("ON");
421                 }
422                 if (s.equals("false") || s.equals("0")) {
423                     return super.getState("OFF");
424                 }
425                 return super.getState(s);
426             }
427         },
428         HOMELINK_NEARBY("homelink_nearby", "homelink", OnOffType.class, false) {
429             @Override
430             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
431                 if (s.equals("true") || s.equals("1")) {
432                     return super.getState("ON");
433                 }
434                 if (s.equals("false") || s.equals("0")) {
435                     return super.getState("OFF");
436                 }
437                 return super.getState(s);
438             }
439         },
440         IDEAL_BATTERY_RANGE("ideal_battery_range", "idealbatteryrange", DecimalType.class, false) {
441             @Override
442             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
443                 State someState = super.getState(s);
444                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
445                 return new QuantityType<>(value, ImperialUnits.MILE);
446             }
447         },
448         INSIDE_TEMP("inside_temp", "insidetemp", DecimalType.class, false) {
449             @Override
450             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
451                 State someState = super.getState(s);
452                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
453                 return new QuantityType<>(value, SIUnits.CELSIUS);
454             }
455         },
456         LAST_AUTOPARK_ERROR("last_autopark_error", "lastautoparkerror", StringType.class, false),
457         LATITUDE("latitude", "location", DecimalType.class, false) {
458             @Override
459             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
460                 proxy.latitude = s;
461                 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
462                         new StringType(proxy.elevation));
463             }
464         },
465         LATITUDE_EVENT("est_lat", "location", DecimalType.class, false) {
466             @Override
467             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
468                 proxy.latitude = s;
469                 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
470                         new StringType(proxy.elevation));
471             }
472         },
473         LEFT_TEMP_DIR("left_temp_direction", "lefttempdirection", DecimalType.class, false),
474         LONGITUDE("longitude", "location", DecimalType.class, false) {
475             @Override
476             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
477                 proxy.longitude = s;
478                 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
479                         new StringType(proxy.elevation));
480             }
481         },
482         LONGITUDE_EVENT("est_lng", "location", DecimalType.class, false) {
483             @Override
484             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
485                 proxy.longitude = s;
486                 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
487                         new StringType(proxy.elevation));
488             }
489         },
490         MANAGED_CHARGING("managed_charging_active", "managedcharging", OnOffType.class, false) {
491             @Override
492             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
493                 if (s.equals("true")) {
494                     return super.getState("ON");
495                 }
496                 if (s.equals("false")) {
497                     return super.getState("OFF");
498                 }
499                 return super.getState(s);
500             }
501         },
502         MANAGED_CHARGING_CANCELLED("managed_charging_user_canceled", "managedchargingcancelled", OnOffType.class,
503                 false) {
504             @Override
505             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
506                 if (s.equals("true")) {
507                     return super.getState("ON");
508                 }
509                 if (s.equals("false")) {
510                     return super.getState("OFF");
511                 }
512                 return super.getState(s);
513             }
514         },
515         MANAGED_CHARGING_START("managed_charging_start_time", "managedchargingstart", StringType.class, false),
516         MOBILE_ENABLED(TeslaBindingConstants.MOBILE_ENABLED_STATE, "mobileenabled", OnOffType.class, false) {
517             @Override
518             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
519                 if (s.equals("true")) {
520                     return super.getState("ON");
521                 }
522                 if (s.equals("false")) {
523                     return super.getState("OFF");
524                 }
525                 return super.getState(s);
526             }
527         },
528         MOTORIZED_CHARGE_PORT("motorized_charge_port", "motorizedchargeport", OnOffType.class, true) {
529             @Override
530             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
531                 if (s.equals("true") || s.equals("1")) {
532                     return super.getState("ON");
533                 }
534                 if (s.equals("false") || s.equals("0")) {
535                     return super.getState("OFF");
536                 }
537                 return super.getState(s);
538             }
539         },
540         NATIVE_LATITUDE("native_latitude", "nativelocation", DecimalType.class, false) {
541             @Override
542             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
543                 proxy.nativeLatitude = s;
544                 return new PointType(new StringType(proxy.nativeLatitude), new StringType(proxy.nativeLongitude));
545             }
546         },
547         NATIVE_LONGITUDE("native_longitude", "nativelocation", DecimalType.class, false) {
548             @Override
549             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
550                 proxy.nativeLongitude = s;
551                 return new PointType(new StringType(proxy.nativeLatitude), new StringType(proxy.nativeLongitude));
552             }
553         },
554         NATIVE_LOCATION_SUPPORTED("native_location_supported", "nativelocationsupported", OnOffType.class, false) {
555             @Override
556             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
557                 if (s.equals("true") || s.equals("1")) {
558                     return super.getState("ON");
559                 }
560                 if (s.equals("false") || s.equals("0")) {
561                     return super.getState("OFF");
562                 }
563                 return super.getState(s);
564             }
565         },
566         NATIVE_TYPE("native_type", "nativetype", StringType.class, false),
567         NOT_ENOUGH_POWER_TO_HEAT("not_enough_power_to_heat", "notenoughpower", OnOffType.class, false) {
568             @Override
569             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
570                 if (s.equals("true") || s.equals("1")) {
571                     return super.getState("ON");
572                 }
573                 if (s.equals("false") || s.equals("0")) {
574                     return super.getState("OFF");
575                 }
576                 return super.getState(s);
577             }
578         },
579         NOTIFICATIONS_ENABLED("notifications_enabled", "notificationsenabled", OnOffType.class, false) {
580             @Override
581             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
582                 if (s.equals("true") || s.equals("1")) {
583                     return super.getState("ON");
584                 }
585                 if (s.equals("false") || s.equals("0")) {
586                     return super.getState("OFF");
587                 }
588                 return super.getState(s);
589             }
590         },
591         NOTIFICATIONS_SUPPORTED("notifications_supported", "notificationssupported", OnOffType.class, false) {
592             @Override
593             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
594                 if (s.equals("true") || s.equals("1")) {
595                     return super.getState("ON");
596                 }
597                 if (s.equals("false") || s.equals("0")) {
598                     return super.getState("OFF");
599                 }
600                 return super.getState(s);
601             }
602         },
603         ODOMETER("odometer", "odometer", DecimalType.class, false) {
604             @Override
605             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
606                 State someState = super.getState(s);
607                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
608                 return new QuantityType<>(value, ImperialUnits.MILE);
609             }
610         },
611         OPEN_FRUNK(null, "openfrunk", OnOffType.class, false) {
612             @Override
613             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
614                 if (s.equals("true") || s.equals("1")) {
615                     return super.getState("ON");
616                 }
617                 if (s.equals("false") || s.equals("0")) {
618                     return super.getState("OFF");
619                 }
620                 return super.getState(s);
621             }
622         },
623         OPEN_TRUNK(null, "opentrunk", OnOffType.class, false) {
624             @Override
625             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
626                 if (s.equals("true") || s.equals("1")) {
627                     return super.getState("ON");
628                 }
629                 if (s.equals("false") || s.equals("0")) {
630                     return super.getState("OFF");
631                 }
632                 return super.getState(s);
633             }
634         },
635         OPTION_CODES("option_codes", "options", StringType.class, true),
636         OUTSIDE_TEMP("outside_temp", "outsidetemp", DecimalType.class, false) {
637             @Override
638             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
639                 State someState = super.getState(s);
640                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
641                 return new QuantityType<>(value, SIUnits.CELSIUS);
642             }
643         },
644         PARSED_CALENDAR("parsed_calendar_supported", "parsedcalendar", OnOffType.class, false) {
645             @Override
646             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
647                 if (s.equals("true") || s.equals("1")) {
648                     return super.getState("ON");
649                 }
650                 if (s.equals("false") || s.equals("0")) {
651                     return super.getState("OFF");
652                 }
653                 return super.getState(s);
654             }
655         },
656         PASSENGER_TEMP("passenger_temp_setting", "passengertemp", DecimalType.class, false) {
657             @Override
658             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
659                 State someState = super.getState(s);
660                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
661                 return new QuantityType<>(value, SIUnits.CELSIUS);
662             }
663         },
664         PERF_CONFIG("perf_config", "configuration", StringType.class, true),
665         PF("pf", "passengerfrontdoor", OpenClosedType.class, false) {
666             @Override
667             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
668                 if (s.equals("true") || s.equals("1")) {
669                     return super.getState("OPEN");
670                 }
671                 if (s.equals("false") || s.equals("0")) {
672                     return super.getState("CLOSED");
673                 }
674                 return super.getState(s);
675             }
676         },
677         POWER("power", "power", DecimalType.class, false),
678         PR("pr", "passengerreardoor", OpenClosedType.class, false) {
679             @Override
680             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
681                 if (s.equals("true") || s.equals("1")) {
682                     return super.getState("OPEN");
683                 }
684                 if (s.equals("false") || s.equals("0")) {
685                     return super.getState("CLOSED");
686                 }
687                 return super.getState(s);
688             }
689         },
690         PRECONDITIONING("is_preconditioning", "preconditioning", OnOffType.class, false) {
691             @Override
692             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
693                 if (s.equals("true") || s.equals("1")) {
694                     return super.getState("ON");
695                 }
696                 if (s.equals("false") || s.equals("0")) {
697                     return super.getState("OFF");
698                 }
699                 return super.getState(s);
700             }
701         },
702         RANGE("range", "range", DecimalType.class, false) {
703             @Override
704             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
705                 State someState = super.getState(s);
706                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
707                 if (properties.containsKey("distanceunits") && properties.get("distanceunits").equals("km/hr")) {
708                     return new QuantityType<>(value, MetricPrefix.KILO(SIUnits.METRE));
709                 } else {
710                     return new QuantityType<>(value, ImperialUnits.MILE);
711                 }
712             }
713         },
714         REAR_DEFROSTER("is_rear_defroster_on", "reardefroster", OnOffType.class, false) {
715             @Override
716             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
717                 if (s.equals("true") || s.equals("1")) {
718                     return super.getState("ON");
719                 }
720                 if (s.equals("false") || s.equals("0")) {
721                     return super.getState("OFF");
722                 }
723                 return super.getState(s);
724             }
725         },
726         REAR_SEAT_HEATERS("rear_seat_heaters", "rearseatheaters", OnOffType.class, true) {
727             @Override
728             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
729                 if (s.equals("true") || s.equals("1")) {
730                     return super.getState("ON");
731                 }
732                 if (s.equals("false") || s.equals("0")) {
733                     return super.getState("OFF");
734                 }
735                 return super.getState(s);
736             }
737         },
738         REMOTE_START("remote_start", "remotestart", OnOffType.class, false) {
739             @Override
740             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
741                 if (s.equals("true") || s.equals("1")) {
742                     return super.getState("ON");
743                 }
744                 if (s.equals("false") || s.equals("0")) {
745                     return super.getState("OFF");
746                 }
747                 return super.getState(s);
748             }
749         },
750         REMOTE_START_ENABLED("remote_start_enabled", "remotestartenabled", OnOffType.class, false) {
751             @Override
752             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
753                 if (s.equals("true") || s.equals("1")) {
754                     return super.getState("ON");
755                 }
756                 if (s.equals("false") || s.equals("0")) {
757                     return super.getState("OFF");
758                 }
759                 return super.getState(s);
760             }
761         },
762         REMOTE_START_SUPPORTED("remote_start_supported", "remotestartsupported", OnOffType.class, false) {
763             @Override
764             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
765                 if (s.equals("true") || s.equals("1")) {
766                     return super.getState("ON");
767                 }
768                 if (s.equals("false") || s.equals("0")) {
769                     return super.getState("OFF");
770                 }
771                 return super.getState(s);
772             }
773         },
774         RESET_VALET_PIN(null, "resetvaletpin", OnOffType.class, false) {
775             @Override
776             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
777                 if (s.equals("true") || s.equals("1")) {
778                     return super.getState("ON");
779                 }
780                 if (s.equals("false") || s.equals("0")) {
781                     return super.getState("OFF");
782                 }
783                 return super.getState(s);
784             }
785         },
786         RHD("rhd", "rhd", OnOffType.class, true) {
787             @Override
788             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
789                 if (s.equals("true") || s.equals("1")) {
790                     return super.getState("ON");
791                 }
792                 if (s.equals("false") || s.equals("0")) {
793                     return super.getState("OFF");
794                 }
795                 return super.getState(s);
796             }
797         },
798         RIGHT_TEMP_DIR("right_temp_direction", "righttempdirection", DecimalType.class, false),
799         ROOF_COLOR("roof_color", "roof", StringType.class, true),
800         RT("rt", "reartrunk", OnOffType.class, false) {
801             @Override
802             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
803                 if (s.equals("true") || s.equals("1")) {
804                     return super.getState("ON");
805                 }
806                 if (s.equals("false") || s.equals("0")) {
807                     return super.getState("OFF");
808                 }
809                 return super.getState(s);
810             }
811         },
812         SEAT_HEATER_LEFT("seat_heater_left", "leftseatheater", DecimalType.class, false),
813         SEAT_HEATER_RIGHT("seat_heater_right", "rightseatheater", DecimalType.class, false),
814         SEAT_HEATER_REAR_LEFT("seat_heater_rear_left", "leftrearseatheater", DecimalType.class, false),
815         SEAT_HEATER_REAR_RIGHT("seat_heater_rear_right", "rightrearseatheater", DecimalType.class, false),
816         SEAT_HEATER_REAR_CENTER("seat_heater_rear_center", "centerrearseatheater", DecimalType.class, false),
817         SEAT_HEATER_REAR_RIGHT_BACK("seat_heater_rear_right_back", "rightrearbackseatheater", DecimalType.class, false),
818         SEAT_HEATER_REAR_RIGHT_LEFT("seat_heater_rear_left_back", "leftrearbackseatheater", DecimalType.class, false),
819         SEAT_TYPE("seat_type", "seattype", DecimalType.class, true),
820         SCHEDULED_CHARGING_PENDING("scheduled_charging_pending", "scheduledchargingpending", OnOffType.class, false) {
821             @Override
822             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
823                 if (s.equals("true") || s.equals("1")) {
824                     return super.getState("ON");
825                 }
826                 if (s.equals("false") || s.equals("0")) {
827                     return super.getState("OFF");
828                 }
829                 return super.getState(s);
830             }
831         },
832         SCHEDULED_CHARGING_START_TIME("scheduled_charging_start_time", "scheduledchargingstart", DateTimeType.class,
833                 false) {
834             @Override
835             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
836                 Date date = new Date();
837                 SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
838
839                 date.setTime(Long.valueOf(s) * 1000);
840                 return super.getState(dateFormatter.format(date));
841             }
842         },
843         SHIFTSTATE("shift_state", "shiftstate", StringType.class, false),
844         SIDEMIRROR_HEATING("side_mirror_heaters", "sidemirrorheaters", OnOffType.class, false) {
845             @Override
846             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
847                 if (s.equals("true") || s.equals("1")) {
848                     return super.getState("ON");
849                 }
850                 if (s.equals("false") || s.equals("0")) {
851                     return super.getState("OFF");
852                 }
853                 return super.getState(s);
854             }
855         },
856         SMART_PRECONDITIONING("smart_preconditioning", "smartpreconditioning", OnOffType.class, false) {
857             @Override
858             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
859                 if (s.equals("true") || s.equals("1")) {
860                     return super.getState("ON");
861                 }
862                 if (s.equals("false") || s.equals("0")) {
863                     return super.getState("OFF");
864                 }
865                 return super.getState(s);
866             }
867         },
868         SOC("soc", "soc", PercentType.class, false),
869         SPEED("speed", "speed", DecimalType.class, false) {
870             @Override
871             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
872                 State someState = super.getState(s);
873                 if (someState != null) {
874                     BigDecimal value = ((DecimalType) someState).toBigDecimal();
875                     return new QuantityType<>(value, ImperialUnits.MILES_PER_HOUR);
876                 } else {
877                     return null;
878                 }
879             }
880         },
881         STATE("state", "state", StringType.class, false),
882         STEERINGWHEEL_HEATER("steering_wheel_heater", "steeringwheelheater", OnOffType.class, true) {
883             @Override
884             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
885                 if (s.equals("true") || s.equals("1")) {
886                     return super.getState("ON");
887                 }
888                 if (s.equals("false") || s.equals("0")) {
889                     return super.getState("OFF");
890                 }
891                 return super.getState(s);
892             }
893         },
894         SUN_ROOF_PRESENT("sun_roof_installed", "sunroofinstalled", OnOffType.class, true) {
895             @Override
896             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
897                 if (s.equals("true") || s.equals("1")) {
898                     return super.getState("ON");
899                 }
900                 if (s.equals("false") || s.equals("0")) {
901                     return super.getState("OFF");
902                 }
903                 return super.getState(s);
904             }
905         },
906         SUN_ROOF_STATE("sun_roof_state", "sunroofstate", StringType.class, false),
907         SUN_ROOF("sun_roof_percent_open", "sunroof", PercentType.class, false),
908         COMBINED_TEMP(null, "combinedtemp", DecimalType.class, false) {
909             @Override
910             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
911                 State someState = super.getState(s);
912                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
913                 return new QuantityType<>(value, SIUnits.CELSIUS);
914             }
915         },
916         TIME_TO_FULL_CHARGE("time_to_full_charge", "timetofullcharge", DecimalType.class, false),
917         TIMESTAMP("timestamp", "eventstamp", DateTimeType.class, false) {
918             @Override
919             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
920                 Date date = new Date(Long.valueOf(s));
921                 SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
922                 return super.getState(dateFormatter.format(date));
923             }
924         },
925         TRIP_CARGING("trip_charging", "tripcharging", OnOffType.class, false) {
926             @Override
927             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
928                 if (s.equals("true") || s.equals("1")) {
929                     return super.getState("ON");
930                 }
931                 if (s.equals("false") || s.equals("0")) {
932                     return super.getState("OFF");
933                 }
934                 return super.getState(s);
935             }
936         },
937         USABLE_BATTERY_LEVEL("usable_battery_level", "usablebatterylevel", DecimalType.class, false),
938         USER_CHARGE_ENABLE_REQUEST("user_charge_enable_request", "userchargeenablerequest", StringType.class, false),
939         VEHICLE_NAME("vehicle_name", "name", StringType.class, true) {
940             @Override
941             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
942                 return super.getState(s.replaceAll("\"", ""));
943             }
944         },
945         VALET_MODE("valet_mode", "valetmode", OnOffType.class, false) {
946             @Override
947             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
948                 if (s.equals("true") || s.equals("1")) {
949                     return super.getState("ON");
950                 }
951                 if (s.equals("false") || s.equals("0")) {
952                     return super.getState("OFF");
953                 }
954                 return super.getState(s);
955             }
956         },
957         VALET_PIN("valet_pin_needed", "valetpin", OnOffType.class, false) {
958             @Override
959             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
960                 if (s.equals("true") || s.equals("1")) {
961                     return super.getState("ON");
962                 }
963                 if (s.equals("false") || s.equals("0")) {
964                     return super.getState("OFF");
965                 }
966                 return super.getState(s);
967             }
968         },
969         VIN("vin", "vin", StringType.class, true),
970         WAKEUP(null, "wakeup", OnOffType.class, false) {
971             @Override
972             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
973                 if (s.equals("true") || s.equals("1")) {
974                     return super.getState("ON");
975                 }
976                 if (s.equals("false") || s.equals("0")) {
977                     return super.getState("OFF");
978                 }
979                 return super.getState(s);
980             }
981         },
982         WIPERBLADE_HEATER("wiper_blade_heater", "wiperbladeheater", OnOffType.class, false) {
983             @Override
984             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
985                 if (s.equals("true") || s.equals("1")) {
986                     return super.getState("ON");
987                 }
988                 if (s.equals("false") || s.equals("0")) {
989                     return super.getState("OFF");
990                 }
991                 return super.getState(s);
992             }
993         },
994         WHEEL_TYPE("wheel_type", "wheeltype", StringType.class, true);
995
996         private final String restID;
997         private final String channelID;
998         private Class<? extends Type> typeClass;
999         private final boolean isProperty;
1000
1001         private TeslaChannelSelector(String restID, String channelID, Class<? extends Type> typeClass,
1002                 boolean isProperty) {
1003             this.restID = restID;
1004             this.channelID = channelID;
1005             this.typeClass = typeClass;
1006             this.isProperty = isProperty;
1007         }
1008
1009         @Override
1010         public String toString() {
1011             return restID;
1012         }
1013
1014         public String getChannelID() {
1015             return channelID;
1016         }
1017
1018         public Class<? extends Type> getTypeClass() {
1019             return typeClass;
1020         }
1021
1022         public boolean isProperty() {
1023             return isProperty;
1024         }
1025
1026         public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
1027             return getState(s);
1028         }
1029
1030         public State getState(String s) {
1031             try {
1032                 Method valueOf = typeClass.getMethod("valueOf", String.class);
1033                 State state = (State) valueOf.invoke(typeClass, s);
1034                 if (state != null) {
1035                     return state;
1036                 }
1037             } catch (NoSuchMethodException e) {
1038             } catch (IllegalArgumentException e) {
1039             } catch (IllegalAccessException e) {
1040             } catch (InvocationTargetException e) {
1041             }
1042
1043             return null;
1044         }
1045
1046         public static TeslaChannelSelector getValueSelectorFromChannelID(String valueSelectorText)
1047                 throws IllegalArgumentException {
1048             for (TeslaChannelSelector c : TeslaChannelSelector.values()) {
1049                 if (c.channelID.equals(valueSelectorText)) {
1050                     return c;
1051                 }
1052             }
1053
1054             throw new IllegalArgumentException("Not valid value selector");
1055         }
1056
1057         public static TeslaChannelSelector getValueSelectorFromRESTID(String valueSelectorText)
1058                 throws IllegalArgumentException {
1059             for (TeslaChannelSelector c : TeslaChannelSelector.values()) {
1060                 if (c.restID != null && c.restID.equals(valueSelectorText)) {
1061                     return c;
1062                 }
1063             }
1064
1065             throw new IllegalArgumentException("Not valid value selector");
1066         }
1067     }
1068
1069     public String latitude = "0";
1070     public String longitude = "0";
1071     public String elevation = "0";
1072     public String nativeLatitude = "0";
1073     public String nativeLongitude = "0";
1074
1075     public State getState(String s, TeslaChannelSelector selector, Map<String, String> properties) {
1076         return selector.getState(s, this, properties);
1077     }
1078 }