]> git.basschouten.com Git - openhab-addons.git/blob
5e31069b6bb1ec2cebcb66c11e40da5a96bbbabd
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2020 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.SIUnits;
32 import org.openhab.core.library.unit.SmartHomeUnits;
33 import org.openhab.core.types.State;
34 import org.openhab.core.types.Type;
35
36 import tec.uom.se.unit.MetricPrefix;
37
38 /**
39  * The {@link TeslaChannelSelectorProxy} class is a helper class to instantiate
40  * and parameterize the {@link TeslaChannelSelector} Enum
41  *
42  * @author Karel Goderis - Initial contribution
43  */
44 public class TeslaChannelSelectorProxy {
45
46     public enum TeslaChannelSelector {
47
48         API("api_version", "api", DecimalType.class, true),
49         AUTO_COND("is_auto_conditioning_on", "autoconditioning", OnOffType.class, false) {
50             @Override
51             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
52                 if (s.equals("true") || s.equals("1")) {
53                     return super.getState("ON");
54                 }
55                 if (s.equals("false") || s.equals("0")) {
56                     return super.getState("OFF");
57                 }
58                 return super.getState(s);
59             }
60         },
61         AUTOPARK_STATE("autopark_state", "autoparkstate", StringType.class, false),
62         AUTOPARK_STATE_V2("autopark_state_v2", "autoparkstate2", StringType.class, false),
63         AUTOPARK_STYLE("autopark_style", "autoparkstyle", StringType.class, false),
64         BATTERY_CURRENT("battery_current", "batterycurrent", DecimalType.class, false),
65         BATTERY_HEATER("battery_heater_on", "batteryheater", OnOffType.class, false) {
66             @Override
67             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
68                 if (s.equals("true") || s.equals("1")) {
69                     return super.getState("ON");
70                 }
71                 if (s.equals("false") || s.equals("0")) {
72                     return super.getState("OFF");
73                 }
74                 return super.getState(s);
75             }
76         },
77         BATTERY_HEATER_NO_POWER("battery_heater_no_power", "batteryheaternopower", OnOffType.class, false) {
78             @Override
79             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
80                 if (s.equals("true") || s.equals("1")) {
81                     return super.getState("ON");
82                 }
83                 if (s.equals("false") || s.equals("0")) {
84                     return super.getState("OFF");
85                 }
86                 return super.getState(s);
87             }
88         },
89         BATTERY_LEVEL("battery_level", "batterylevel", DecimalType.class, false),
90         BATTERY_RANGE("battery_range", "batteryrange", DecimalType.class, false) {
91             @Override
92             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
93                 State someState = super.getState(s);
94                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
95                 return new QuantityType<>(value, ImperialUnits.MILE);
96             }
97         },
98         CALENDAR_SUPPORTED("calendar_supported", "calendarsupported", OnOffType.class, true) {
99             @Override
100             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
101                 if (s.equals("true") || s.equals("1")) {
102                     return super.getState("ON");
103                 }
104                 if (s.equals("false") || s.equals("0")) {
105                     return super.getState("OFF");
106                 }
107                 return super.getState(s);
108             }
109         },
110         CALENDAR_ENABLED("calendar_enabled", "calendarenabled", OnOffType.class, false) {
111             @Override
112             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
113                 if (s.equals("true") || s.equals("1")) {
114                     return super.getState("ON");
115                 }
116                 if (s.equals("false") || s.equals("0")) {
117                     return super.getState("OFF");
118                 }
119                 return super.getState(s);
120             }
121         },
122         CAR_VERSION("car_version", "version", StringType.class, true),
123         CENTER_DISPLAY("center_display_state", "centerdisplay", 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(null, "charge", OnOffType.class, false) {
136             @Override
137             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
138                 if (s.equals("true") || s.equals("1")) {
139                     return super.getState("ON");
140                 }
141                 if (s.equals("false") || s.equals("0")) {
142                     return super.getState("OFF");
143                 }
144                 return super.getState(s);
145             }
146         },
147         CHARGE_CABLE("conn_charge_cable", "chargecable", StringType.class, false),
148         CHARGE_CURRENT_REQUEST("charge_current_request", "chargecurrent", DecimalType.class, false),
149         CHARGE_CURRENT_REQUEST_MAX("charge_current_request_max", "chargemaxcurrent", DecimalType.class, false),
150         CHARGE_ENABLE_REQUEST("charge_enable_request", "chargeenablerequest", OnOffType.class, false) {
151             @Override
152             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
153                 if (s.equals("true") || s.equals("1")) {
154                     return super.getState("ON");
155                 }
156                 if (s.equals("false") || s.equals("0")) {
157                     return super.getState("OFF");
158                 }
159                 return super.getState(s);
160             }
161         },
162         CHARGE_ENERGY_ADDED("charge_energy_added", "chargeenergyadded", DecimalType.class, false),
163         CHARGE_LIMIT_SOC("charge_limit_soc", "chargelimit", PercentType.class, false),
164         CHARGE_LIMIT_SOC_MAX("charge_limit_soc_max", "chargelimitmaximum", PercentType.class, false),
165         CHARGE_LIMIT_SOC_MIN("charge_limit_soc_min", "chargelimitminimum", PercentType.class, false),
166         CHARGE_LIMIT_SOC_STD("charge_limit_soc_std", "chargelimitsocstandard", PercentType.class, false),
167         CHARGE_PORT_LATCH("charge_port_latch", "chargeportlatch", StringType.class, false),
168         CHARGE_MILES_ADDED_IDEAL("charge_miles_added_ideal", "chargeidealdistanceadded", DecimalType.class, false) {
169             @Override
170             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
171                 State someState = super.getState(s);
172                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
173                 return new QuantityType<>(value, ImperialUnits.MILES_PER_HOUR);
174             }
175         },
176         CHARGE_MILES_ADDED_RANGE("charge_miles_added_rated", "chargerateddistanceadded", DecimalType.class, false) {
177             @Override
178             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
179                 State someState = super.getState(s);
180                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
181                 return new QuantityType<>(value, ImperialUnits.MILES_PER_HOUR);
182             }
183         },
184         CHARGE_RATE("charge_rate", "chargerate", DecimalType.class, false) {
185             @Override
186             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
187                 State someState = super.getState(s);
188                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
189                 return new QuantityType<>(value, ImperialUnits.MILES_PER_HOUR);
190             }
191         },
192         CHARGE_STARTING_RANGE("charge_starting_range", "chargestartingrange", StringType.class, false),
193         CHARGE_STARTING_SOC("charge_starting_soc", "chargestartingsoc", StringType.class, false),
194         CHARGE_STATE("charging_state", "chargingstate", StringType.class, false),
195         CHARGE_TO_MAX("charge_to_max_range", "chargetomax", OnOffType.class, false) {
196             @Override
197             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
198                 if (s.equals("true") || s.equals("1")) {
199                     return super.getState("ON");
200                 }
201                 if (s.equals("false") || s.equals("0")) {
202                     return super.getState("OFF");
203                 }
204                 return super.getState(s);
205             }
206         },
207         CHARGE_TO_MAX_COUNTER("max_range_charge_counter", "maxcharges", DecimalType.class, false),
208         CHARGEPORT("charge_port_door_open", "chargeport", OnOffType.class, false) {
209             @Override
210             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
211                 if (s.equals("true") || s.equals("1")) {
212                     return super.getState("ON");
213                 }
214                 if (s.equals("false") || s.equals("0")) {
215                     return super.getState("OFF");
216                 }
217                 return super.getState(s);
218             }
219         },
220         CHARGER_ACTUAL_CURRENT("charger_actual_current", "chargercurrent", DecimalType.class, false),
221         CHARGER_PHASES("charger_phases", "chargerphases", DecimalType.class, false),
222         CHARGER_PILOT_CURRENT("charger_pilot_current", "chargermaxcurrent", DecimalType.class, false),
223         CHARGER_POWER("charger_power", "chargerpower", DecimalType.class, false),
224         CHARGER_VOLTAGE("charger_voltage", "chargervoltage", DecimalType.class, false),
225         CLIMATE_ON("is_climate_on", "climate", OnOffType.class, false) {
226             @Override
227             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
228                 if (s.equals("true") || s.equals("1")) {
229                     return super.getState("ON");
230                 }
231                 if (s.equals("false") || s.equals("0")) {
232                     return super.getState("OFF");
233                 }
234                 return super.getState(s);
235             }
236         },
237         CLIMATE_MAX_TEMP("max_avail_temp", "maxavailabletemp", DecimalType.class, false),
238         CLIMATE_MIN_TEMP("min_avail_temp", "minavailabletemp", DecimalType.class, false),
239         COLOR("exterior_color", "color", StringType.class, true),
240         DARK_RIMS("dark_rims", "darkrims", OnOffType.class, true) {
241             @Override
242             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
243                 if (s.equals("true") || s.equals("1")) {
244                     return super.getState("ON");
245                 }
246                 if (s.equals("false") || s.equals("0")) {
247                     return super.getState("OFF");
248                 }
249                 return super.getState(s);
250             }
251         },
252         DISPLAY_NAME("display_name", "name", StringType.class, true),
253         DF("df", "driverfrontdoor", OpenClosedType.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("OPEN");
258                 }
259                 if (s.equals("false") || s.equals("0")) {
260                     return super.getState("CLOSED");
261                 }
262                 return super.getState(s);
263             }
264         },
265         DOOR_LOCK("locked", "doorlock", OnOffType.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("ON");
270                 }
271                 if (s.equals("false") || s.equals("0")) {
272                     return super.getState("OFF");
273                 }
274                 return super.getState(s);
275             }
276         },
277         DR("dr", "driverreardoor", OpenClosedType.class, false) {
278             @Override
279             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
280                 if (s.equals("true") || s.equals("1")) {
281                     return super.getState("OPEN");
282                 }
283                 if (s.equals("false") || s.equals("0")) {
284                     return super.getState("CLOSED");
285                 }
286                 return super.getState(s);
287             }
288         },
289         DRIVER_TEMP("driver_temp_setting", "drivertemp", DecimalType.class, false) {
290             @Override
291             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
292                 State someState = super.getState(s);
293                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
294                 return new QuantityType<>(value, SIUnits.CELSIUS);
295             }
296         },
297         ELEVATION("elevation", "location", DecimalType.class, false) {
298
299             @Override
300             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
301                 proxy.elevation = s;
302                 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
303                         new StringType(proxy.elevation));
304             }
305         },
306         EST_BATTERY_RANGE("est_battery_range", "estimatedbatteryrange", DecimalType.class, false) {
307             @Override
308             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
309                 State someState = super.getState(s);
310                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
311                 return new QuantityType<>(value, ImperialUnits.MILE);
312             }
313         },
314         EST_HEADING("est_heading", "headingestimation", DecimalType.class, false) {
315             @Override
316             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
317                 State someState = super.getState(s);
318                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
319                 return new QuantityType<>(value, SmartHomeUnits.DEGREE_ANGLE);
320             }
321         },
322         EST_RANGE("est_range", "estimatedrange", DecimalType.class, false) {
323             @Override
324             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
325                 State someState = super.getState(s);
326                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
327                 return new QuantityType<>(value, ImperialUnits.MILE);
328             }
329         },
330         EU_VEHICLE("eu_vehicle", "european", OnOffType.class, true) {
331             @Override
332             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
333                 if (s.equals("true") || s.equals("1")) {
334                     return super.getState("ON");
335                 }
336                 if (s.equals("false") || s.equals("0")) {
337                     return super.getState("OFF");
338                 }
339                 return super.getState(s);
340             }
341         },
342         FAN_STATUS("fan_status", "fan", DecimalType.class, false),
343         FAST_CHARGER("fast_charger_present", "fastcharger", OnOffType.class, true) {
344             @Override
345             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
346                 if (s.equals("true") || s.equals("1")) {
347                     return super.getState("ON");
348                 }
349                 if (s.equals("false") || s.equals("0")) {
350                     return super.getState("OFF");
351                 }
352                 return super.getState(s);
353             }
354         },
355         FAST_CHARGER_TYPE("fast_charger_type", "fastchargertype", StringType.class, true),
356         FAST_CHARGER_BRAND("fast_charger_brand", "fastchargerbrand", StringType.class, true),
357         FLASH(null, "flashlights", 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         FRONT_DEFROSTER("is_front_defroster_on", "frontdefroster", 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         FT("ft", "fronttrunk", OnOffType.class, false) {
382             @Override
383             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
384                 if (s.equals("true") || s.equals("1")) {
385                     return super.getState("ON");
386                 }
387                 if (s.equals("false") || s.equals("0")) {
388                     return super.getState("OFF");
389                 }
390                 return super.getState(s);
391             }
392         },
393         GPS_AS_OF("gps_as_of", "gpstimestamp", DateTimeType.class, false) {
394             @Override
395             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
396                 Date date = new Date();
397                 SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
398
399                 date.setTime(Long.valueOf(s) * 1000);
400                 return super.getState(dateFormatter.format(date));
401             }
402         },
403         GUI_DISTANCE_UNITS("gui_distance_units", "distanceunits", StringType.class, true),
404         GUI_TEMPERATURE_UNITS("gui_temperature_units", "temperatureunits", StringType.class, true),
405         GUI_CHARGE_RATE_UNITS("gui_charge_rate_units", "chargerateunits", StringType.class, true),
406         GUI_24H_TIME("gui_24_hour_time", "24hourtime", StringType.class, true),
407         GUI_RANGE_DISPLAY("gui_range_display", "rangedisplay", StringType.class, true),
408         HAS_SPOILER("has_spoiler", "spoiler", OnOffType.class, true) {
409             @Override
410             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
411                 if (s.equals("true") || s.equals("1")) {
412                     return super.getState("ON");
413                 }
414                 if (s.equals("false") || s.equals("0")) {
415                     return super.getState("OFF");
416                 }
417                 return super.getState(s);
418             }
419         },
420         HEADING("heading", "heading", DecimalType.class, false) {
421             @Override
422             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
423                 State someState = super.getState(s);
424                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
425                 return new QuantityType<>(value, SmartHomeUnits.DEGREE_ANGLE);
426             }
427         },
428         HONK_HORN(null, "honkhorn", 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         HOMELINK_NEARBY("homelink_nearby", "homelink", OnOffType.class, false) {
441             @Override
442             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
443                 if (s.equals("true") || s.equals("1")) {
444                     return super.getState("ON");
445                 }
446                 if (s.equals("false") || s.equals("0")) {
447                     return super.getState("OFF");
448                 }
449                 return super.getState(s);
450             }
451         },
452         IDEAL_BATTERY_RANGE("ideal_battery_range", "idealbatteryrange", DecimalType.class, false) {
453             @Override
454             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
455                 State someState = super.getState(s);
456                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
457                 return new QuantityType<>(value, ImperialUnits.MILE);
458             }
459         },
460         INSIDE_TEMP("inside_temp", "insidetemp", DecimalType.class, false) {
461             @Override
462             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
463                 State someState = super.getState(s);
464                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
465                 return new QuantityType<>(value, SIUnits.CELSIUS);
466             }
467         },
468         LAST_AUTOPARK_ERROR("last_autopark_error", "lastautoparkerror", StringType.class, false),
469         LATITUDE("latitude", "location", DecimalType.class, false) {
470             @Override
471             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
472                 proxy.latitude = s;
473                 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
474                         new StringType(proxy.elevation));
475             }
476         },
477         LATITUDE_EVENT("est_lat", "location", DecimalType.class, false) {
478             @Override
479             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
480                 proxy.latitude = s;
481                 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
482                         new StringType(proxy.elevation));
483             }
484         },
485         LEFT_TEMP_DIR("left_temp_direction", "lefttempdirection", DecimalType.class, false),
486         LONGITUDE("longitude", "location", DecimalType.class, false) {
487             @Override
488             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
489                 proxy.longitude = s;
490                 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
491                         new StringType(proxy.elevation));
492             }
493         },
494         LONGITUDE_EVENT("est_lng", "location", DecimalType.class, false) {
495             @Override
496             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
497                 proxy.longitude = s;
498                 return new PointType(new StringType(proxy.latitude), new StringType(proxy.longitude),
499                         new StringType(proxy.elevation));
500             }
501         },
502         MANAGED_CHARGING("managed_charging_active", "managedcharging", OnOffType.class, false) {
503             @Override
504             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
505                 if (s.equals("true")) {
506                     return super.getState("ON");
507                 }
508                 if (s.equals("false")) {
509                     return super.getState("OFF");
510                 }
511                 return super.getState(s);
512             }
513         },
514         MANAGED_CHARGING_CANCELLED("managed_charging_user_canceled", "managedchargingcancelled", OnOffType.class,
515                 false) {
516             @Override
517             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
518                 if (s.equals("true")) {
519                     return super.getState("ON");
520                 }
521                 if (s.equals("false")) {
522                     return super.getState("OFF");
523                 }
524                 return super.getState(s);
525             }
526         },
527         MANAGED_CHARGING_START("managed_charging_start_time", "managedchargingstart", StringType.class, false),
528         MOBILE_ENABLED(TeslaBindingConstants.MOBILE_ENABLED_STATE, "mobileenabled", OnOffType.class, false) {
529             @Override
530             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
531                 if (s.equals("true")) {
532                     return super.getState("ON");
533                 }
534                 if (s.equals("false")) {
535                     return super.getState("OFF");
536                 }
537                 return super.getState(s);
538             }
539         },
540         MOTORIZED_CHARGE_PORT("motorized_charge_port", "motorizedchargeport", OnOffType.class, true) {
541             @Override
542             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
543                 if (s.equals("true") || s.equals("1")) {
544                     return super.getState("ON");
545                 }
546                 if (s.equals("false") || s.equals("0")) {
547                     return super.getState("OFF");
548                 }
549                 return super.getState(s);
550             }
551         },
552         NATIVE_LATITUDE("native_latitude", "nativelocation", DecimalType.class, false) {
553             @Override
554             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
555                 proxy.nativeLatitude = s;
556                 return new PointType(new StringType(proxy.nativeLatitude), new StringType(proxy.nativeLongitude));
557             }
558         },
559         NATIVE_LONGITUDE("native_longitude", "nativelocation", DecimalType.class, false) {
560             @Override
561             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
562                 proxy.nativeLongitude = s;
563                 return new PointType(new StringType(proxy.nativeLatitude), new StringType(proxy.nativeLongitude));
564             }
565         },
566         NATIVE_LOCATION_SUPPORTED("native_location_supported", "nativelocationsupported", OnOffType.class, false) {
567             @Override
568             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
569                 if (s.equals("true") || s.equals("1")) {
570                     return super.getState("ON");
571                 }
572                 if (s.equals("false") || s.equals("0")) {
573                     return super.getState("OFF");
574                 }
575                 return super.getState(s);
576             }
577         },
578         NATIVE_TYPE("native_type", "nativetype", StringType.class, false),
579         NOT_ENOUGH_POWER_TO_HEAT("not_enough_power_to_heat", "notenoughpower", 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_ENABLED("notifications_enabled", "notificationsenabled", 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         NOTIFICATIONS_SUPPORTED("notifications_supported", "notificationssupported", OnOffType.class, false) {
604             @Override
605             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
606                 if (s.equals("true") || s.equals("1")) {
607                     return super.getState("ON");
608                 }
609                 if (s.equals("false") || s.equals("0")) {
610                     return super.getState("OFF");
611                 }
612                 return super.getState(s);
613             }
614         },
615         ODOMETER("odometer", "odometer", DecimalType.class, false) {
616             @Override
617             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
618                 State someState = super.getState(s);
619                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
620                 return new QuantityType<>(value, ImperialUnits.MILE);
621             }
622         },
623         OPEN_FRUNK(null, "openfrunk", 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         OPEN_TRUNK(null, "opentrunk", OnOffType.class, false) {
636             @Override
637             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
638                 if (s.equals("true") || s.equals("1")) {
639                     return super.getState("ON");
640                 }
641                 if (s.equals("false") || s.equals("0")) {
642                     return super.getState("OFF");
643                 }
644                 return super.getState(s);
645             }
646         },
647         OPTION_CODES("option_codes", "options", StringType.class, true),
648         OUTSIDE_TEMP("outside_temp", "outsidetemp", DecimalType.class, false) {
649             @Override
650             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
651                 State someState = super.getState(s);
652                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
653                 return new QuantityType<>(value, SIUnits.CELSIUS);
654             }
655         },
656         PARSED_CALENDAR("parsed_calendar_supported", "parsedcalendar", OnOffType.class, false) {
657             @Override
658             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
659                 if (s.equals("true") || s.equals("1")) {
660                     return super.getState("ON");
661                 }
662                 if (s.equals("false") || s.equals("0")) {
663                     return super.getState("OFF");
664                 }
665                 return super.getState(s);
666             }
667         },
668         PASSENGER_TEMP("passenger_temp_setting", "passengertemp", DecimalType.class, false) {
669             @Override
670             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
671                 State someState = super.getState(s);
672                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
673                 return new QuantityType<>(value, SIUnits.CELSIUS);
674             }
675         },
676         PERF_CONFIG("perf_config", "configuration", StringType.class, true),
677         PF("pf", "passengerfrontdoor", OpenClosedType.class, false) {
678             @Override
679             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
680                 if (s.equals("true") || s.equals("1")) {
681                     return super.getState("OPEN");
682                 }
683                 if (s.equals("false") || s.equals("0")) {
684                     return super.getState("CLOSED");
685                 }
686                 return super.getState(s);
687             }
688         },
689         POWER("power", "power", DecimalType.class, false),
690         PR("pr", "passengerreardoor", OpenClosedType.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("OPEN");
695                 }
696                 if (s.equals("false") || s.equals("0")) {
697                     return super.getState("CLOSED");
698                 }
699                 return super.getState(s);
700             }
701         },
702         PRECONDITIONING("is_preconditioning", "preconditioning", OnOffType.class, false) {
703             @Override
704             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
705                 if (s.equals("true") || s.equals("1")) {
706                     return super.getState("ON");
707                 }
708                 if (s.equals("false") || s.equals("0")) {
709                     return super.getState("OFF");
710                 }
711                 return super.getState(s);
712             }
713         },
714         RANGE("range", "range", DecimalType.class, false) {
715             @Override
716             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
717                 State someState = super.getState(s);
718                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
719                 if (properties.containsKey("distanceunits") && properties.get("distanceunits").equals("km/hr")) {
720                     return new QuantityType<>(value, MetricPrefix.KILO(SIUnits.METRE));
721                 } else {
722                     return new QuantityType<>(value, ImperialUnits.MILE);
723                 }
724             }
725         },
726         REAR_DEFROSTER("is_rear_defroster_on", "reardefroster", OnOffType.class, false) {
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         REAR_SEAT_HEATERS("rear_seat_heaters", "rearseatheaters", OnOffType.class, true) {
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("remote_start", "remotestart", 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_ENABLED("remote_start_enabled", "remotestartenabled", 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         REMOTE_START_SUPPORTED("remote_start_supported", "remotestartsupported", 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         RESET_VALET_PIN(null, "resetvaletpin", OnOffType.class, false) {
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         RHD("rhd", "rhd", OnOffType.class, true) {
799             @Override
800             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
801                 if (s.equals("true") || s.equals("1")) {
802                     return super.getState("ON");
803                 }
804                 if (s.equals("false") || s.equals("0")) {
805                     return super.getState("OFF");
806                 }
807                 return super.getState(s);
808             }
809         },
810         RIGHT_TEMP_DIR("right_temp_direction", "righttempdirection", DecimalType.class, false),
811         ROOF_COLOR("roof_color", "roof", StringType.class, true),
812         RT("rt", "reartrunk", OnOffType.class, false) {
813             @Override
814             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
815                 if (s.equals("true") || s.equals("1")) {
816                     return super.getState("ON");
817                 }
818                 if (s.equals("false") || s.equals("0")) {
819                     return super.getState("OFF");
820                 }
821                 return super.getState(s);
822             }
823         },
824         SEAT_HEATER_LEFT("seat_heater_left", "leftseatheater", DecimalType.class, false),
825         SEAT_HEATER_RIGHT("seat_heater_right", "rightseatheater", DecimalType.class, false),
826         SEAT_HEATER_REAR_LEFT("seat_heater_rear_left", "leftrearseatheater", DecimalType.class, false),
827         SEAT_HEATER_REAR_RIGHT("seat_heater_rear_right", "rightrearseatheater", DecimalType.class, false),
828         SEAT_HEATER_REAR_CENTER("seat_heater_rear_center", "centerrearseatheater", DecimalType.class, false),
829         SEAT_HEATER_REAR_RIGHT_BACK("seat_heater_rear_right_back", "rightrearbackseatheater", DecimalType.class, false),
830         SEAT_HEATER_REAR_RIGHT_LEFT("seat_heater_rear_left_back", "leftrearbackseatheater", DecimalType.class, false),
831         SEAT_TYPE("seat_type", "seattype", DecimalType.class, true),
832         SCHEDULED_CHARGING_PENDING("scheduled_charging_pending", "scheduledchargingpending", OnOffType.class, false) {
833             @Override
834             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
835                 if (s.equals("true") || s.equals("1")) {
836                     return super.getState("ON");
837                 }
838                 if (s.equals("false") || s.equals("0")) {
839                     return super.getState("OFF");
840                 }
841                 return super.getState(s);
842             }
843         },
844         SCHEDULED_CHARGING_START_TIME("scheduled_charging_start_time", "scheduledchargingstart", DateTimeType.class,
845                 false) {
846             @Override
847             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
848                 Date date = new Date();
849                 SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
850
851                 date.setTime(Long.valueOf(s) * 1000);
852                 return super.getState(dateFormatter.format(date));
853             }
854         },
855         SHIFTSTATE("shift_state", "shiftstate", StringType.class, false),
856         SIDEMIRROR_HEATING("side_mirror_heaters", "sidemirrorheaters", 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         SMART_PRECONDITIONING("smart_preconditioning", "smartpreconditioning", OnOffType.class, false) {
869             @Override
870             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
871                 if (s.equals("true") || s.equals("1")) {
872                     return super.getState("ON");
873                 }
874                 if (s.equals("false") || s.equals("0")) {
875                     return super.getState("OFF");
876                 }
877                 return super.getState(s);
878             }
879         },
880         SOC("soc", "soc", PercentType.class, false),
881         SPEED("speed", "speed", DecimalType.class, false) {
882             @Override
883             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
884                 State someState = super.getState(s);
885                 if (someState != null) {
886                     BigDecimal value = ((DecimalType) someState).toBigDecimal();
887                     return new QuantityType<>(value, ImperialUnits.MILES_PER_HOUR);
888                 } else {
889                     return null;
890                 }
891             }
892         },
893         STATE("state", "state", StringType.class, false),
894         STEERINGWHEEL_HEATER("steering_wheel_heater", "steeringwheelheater", 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_PRESENT("sun_roof_installed", "sunroofinstalled", OnOffType.class, true) {
907             @Override
908             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
909                 if (s.equals("true") || s.equals("1")) {
910                     return super.getState("ON");
911                 }
912                 if (s.equals("false") || s.equals("0")) {
913                     return super.getState("OFF");
914                 }
915                 return super.getState(s);
916             }
917         },
918         SUN_ROOF_STATE("sun_roof_state", "sunroofstate", StringType.class, false),
919         SUN_ROOF("sun_roof_percent_open", "sunroof", PercentType.class, false),
920         COMBINED_TEMP(null, "combinedtemp", DecimalType.class, false) {
921             @Override
922             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
923                 State someState = super.getState(s);
924                 BigDecimal value = ((DecimalType) someState).toBigDecimal();
925                 return new QuantityType<>(value, SIUnits.CELSIUS);
926             }
927         },
928         TIME_TO_FULL_CHARGE("time_to_full_charge", "timetofullcharge", DecimalType.class, false),
929         TIMESTAMP("timestamp", "eventstamp", DateTimeType.class, false) {
930             @Override
931             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
932                 Date date = new Date(Long.valueOf(s));
933                 SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
934                 return super.getState(dateFormatter.format(date));
935             }
936         },
937         TRIP_CARGING("trip_charging", "tripcharging", OnOffType.class, false) {
938             @Override
939             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
940                 if (s.equals("true") || s.equals("1")) {
941                     return super.getState("ON");
942                 }
943                 if (s.equals("false") || s.equals("0")) {
944                     return super.getState("OFF");
945                 }
946                 return super.getState(s);
947             }
948         },
949         USABLE_BATTERY_LEVEL("usable_battery_level", "usablebatterylevel", DecimalType.class, false),
950         USER_CHARGE_ENABLE_REQUEST("user_charge_enable_request", "userchargeenablerequest", StringType.class, false),
951         VEHICLE_NAME("vehicle_name", "name", StringType.class, true) {
952             @Override
953             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
954                 return super.getState(s.replaceAll("\"", ""));
955             }
956         },
957         VALET_MODE("valet_mode", "valetmode", 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         VALET_PIN("valet_pin_needed", "valetpin", OnOffType.class, false) {
970             @Override
971             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
972                 if (s.equals("true") || s.equals("1")) {
973                     return super.getState("ON");
974                 }
975                 if (s.equals("false") || s.equals("0")) {
976                     return super.getState("OFF");
977                 }
978                 return super.getState(s);
979             }
980         },
981         VIN("vin", "vin", StringType.class, true),
982         WAKEUP(null, "wakeup", 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         WIPERBLADE_HEATER("wiper_blade_heater", "wiperbladeheater", OnOffType.class, false) {
995             @Override
996             public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
997                 if (s.equals("true") || s.equals("1")) {
998                     return super.getState("ON");
999                 }
1000                 if (s.equals("false") || s.equals("0")) {
1001                     return super.getState("OFF");
1002                 }
1003                 return super.getState(s);
1004             }
1005         },
1006         WHEEL_TYPE("wheel_type", "wheeltype", StringType.class, true);
1007
1008         private final String restID;
1009         private final String channelID;
1010         private Class<? extends Type> typeClass;
1011         private final boolean isProperty;
1012
1013         private TeslaChannelSelector(String restID, String channelID, Class<? extends Type> typeClass,
1014                 boolean isProperty) {
1015             this.restID = restID;
1016             this.channelID = channelID;
1017             this.typeClass = typeClass;
1018             this.isProperty = isProperty;
1019         }
1020
1021         @Override
1022         public String toString() {
1023             return restID;
1024         }
1025
1026         public String getChannelID() {
1027             return channelID;
1028         }
1029
1030         public Class<? extends Type> getTypeClass() {
1031             return typeClass;
1032         }
1033
1034         public boolean isProperty() {
1035             return isProperty;
1036         }
1037
1038         public State getState(String s, TeslaChannelSelectorProxy proxy, Map<String, String> properties) {
1039             return getState(s);
1040         }
1041
1042         public State getState(String s) {
1043             try {
1044                 Method valueOf = typeClass.getMethod("valueOf", String.class);
1045                 State state = (State) valueOf.invoke(typeClass, s);
1046                 if (state != null) {
1047                     return state;
1048                 }
1049             } catch (NoSuchMethodException e) {
1050             } catch (IllegalArgumentException e) {
1051             } catch (IllegalAccessException e) {
1052             } catch (InvocationTargetException e) {
1053             }
1054
1055             return null;
1056         }
1057
1058         public static TeslaChannelSelector getValueSelectorFromChannelID(String valueSelectorText)
1059                 throws IllegalArgumentException {
1060             for (TeslaChannelSelector c : TeslaChannelSelector.values()) {
1061                 if (c.channelID.equals(valueSelectorText)) {
1062                     return c;
1063                 }
1064             }
1065
1066             throw new IllegalArgumentException("Not valid value selector");
1067         }
1068
1069         public static TeslaChannelSelector getValueSelectorFromRESTID(String valueSelectorText)
1070                 throws IllegalArgumentException {
1071             for (TeslaChannelSelector c : TeslaChannelSelector.values()) {
1072                 if (c.restID != null && c.restID.equals(valueSelectorText)) {
1073                     return c;
1074                 }
1075             }
1076
1077             throw new IllegalArgumentException("Not valid value selector");
1078         }
1079     }
1080
1081     public String latitude = "0";
1082     public String longitude = "0";
1083     public String elevation = "0";
1084     public String nativeLatitude = "0";
1085     public String nativeLongitude = "0";
1086
1087     public State getState(String s, TeslaChannelSelector selector, Map<String, String> properties) {
1088         return selector.getState(s, this, properties);
1089     }
1090 }