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