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