]> git.basschouten.com Git - openhab-addons.git/blob
40840abdf927caca5b88446dbab9f9b1467eee26
[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.digitalstrom.internal.lib.serverconnection.impl;
14
15 import java.util.ArrayList;
16 import java.util.Arrays;
17 import java.util.HashMap;
18 import java.util.Iterator;
19 import java.util.LinkedList;
20 import java.util.List;
21 import java.util.Map;
22 import java.util.Map.Entry;
23 import java.util.Set;
24
25 import org.openhab.binding.digitalstrom.internal.lib.GeneralLibConstance;
26 import org.openhab.binding.digitalstrom.internal.lib.climate.jsonresponsecontainer.BaseSensorValues;
27 import org.openhab.binding.digitalstrom.internal.lib.climate.jsonresponsecontainer.impl.AssignedSensors;
28 import org.openhab.binding.digitalstrom.internal.lib.climate.jsonresponsecontainer.impl.SensorValues;
29 import org.openhab.binding.digitalstrom.internal.lib.climate.jsonresponsecontainer.impl.TemperatureControlConfig;
30 import org.openhab.binding.digitalstrom.internal.lib.climate.jsonresponsecontainer.impl.TemperatureControlInternals;
31 import org.openhab.binding.digitalstrom.internal.lib.climate.jsonresponsecontainer.impl.TemperatureControlStatus;
32 import org.openhab.binding.digitalstrom.internal.lib.climate.jsonresponsecontainer.impl.TemperatureControlValues;
33 import org.openhab.binding.digitalstrom.internal.lib.climate.jsonresponsecontainer.impl.WeatherSensorData;
34 import org.openhab.binding.digitalstrom.internal.lib.config.Config;
35 import org.openhab.binding.digitalstrom.internal.lib.serverconnection.DsAPI;
36 import org.openhab.binding.digitalstrom.internal.lib.serverconnection.HttpTransport;
37 import org.openhab.binding.digitalstrom.internal.lib.serverconnection.constants.JSONApiResponseKeysEnum;
38 import org.openhab.binding.digitalstrom.internal.lib.serverconnection.simpledsrequestbuilder.SimpleRequestBuilder;
39 import org.openhab.binding.digitalstrom.internal.lib.serverconnection.simpledsrequestbuilder.constants.ClassKeys;
40 import org.openhab.binding.digitalstrom.internal.lib.serverconnection.simpledsrequestbuilder.constants.FunctionKeys;
41 import org.openhab.binding.digitalstrom.internal.lib.serverconnection.simpledsrequestbuilder.constants.InterfaceKeys;
42 import org.openhab.binding.digitalstrom.internal.lib.serverconnection.simpledsrequestbuilder.constants.ParameterKeys;
43 import org.openhab.binding.digitalstrom.internal.lib.structure.Apartment;
44 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.Circuit;
45 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.Device;
46 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.CachedMeteringValue;
47 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.DeviceConfig;
48 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.DeviceSceneSpec;
49 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.constants.DeviceParameterClassEnum;
50 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.constants.MeteringTypeEnum;
51 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.constants.MeteringUnitsEnum;
52 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.constants.SensorEnum;
53 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.impl.DSID;
54 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.impl.JSONCachedMeteringValueImpl;
55 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.impl.JSONDeviceConfigImpl;
56 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.impl.JSONDeviceSceneSpecImpl;
57 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.impl.CircuitImpl;
58 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.impl.DeviceImpl;
59 import org.openhab.binding.digitalstrom.internal.lib.structure.impl.JSONApartmentImpl;
60 import org.openhab.binding.digitalstrom.internal.lib.structure.scene.constants.Scene;
61 import org.openhab.binding.digitalstrom.internal.lib.structure.scene.constants.SceneEnum;
62 import org.slf4j.Logger;
63 import org.slf4j.LoggerFactory;
64
65 import com.google.gson.JsonArray;
66 import com.google.gson.JsonElement;
67 import com.google.gson.JsonObject;
68
69 /**
70  * The {@link DsAPIImpl} is the implementation of the {@link DsAPI}.
71  *
72  * @author Alexander Betker - Initial contribution
73  * @author Alex Maier - Initial contribution
74  * @author Michael Ochel - implements new methods, API updates and change SimpleJSON to GSON, add helper methods and
75  *         requests building with constants to {@link SimpleRequestBuilder}
76  * @author Matthias Siegele - implements new methods, API updates and change SimpleJSON to GSON, add helper methods and
77  *         requests building with constants to {@link SimpleRequestBuilder}
78  */
79 public class DsAPIImpl implements DsAPI {
80
81     private final Logger logger = LoggerFactory.getLogger(DsAPIImpl.class);
82     private final HttpTransport transport;
83
84     public static final String QUERY_GET_METERLIST = "/apartment/dSMeters/*(dSID)";
85
86     /**
87      * Contains methods where no login is required.
88      */
89     public static final List<String> METHODS_MUST_NOT_BE_LOGGED_IN = Arrays.asList(FunctionKeys.LOGIN,
90             FunctionKeys.REQUEST_APPLICATION_TOKEN, FunctionKeys.VERSION, FunctionKeys.TIME, FunctionKeys.GET_DSID,
91             FunctionKeys.LOGOUT, FunctionKeys.LOGIN_APPLICATION);
92
93     /**
94      * Create a new {@link DsAPIImpl} with the given {@link HttpTransport}.
95      *
96      * @param transport for connection, must not be null
97      */
98     public DsAPIImpl(HttpTransport transport) {
99         this.transport = transport;
100     }
101
102     /**
103      * Creates a new {@link DsAPIImpl} with creating a new {@link HttpTransport}, parameters see
104      * {@link HttpTransportImpl#HttpTransportImpl(String, int, int)}.
105      *
106      * @param uri of the digitalSTROM-Server, must not be null
107      * @param connectTimeout to set
108      * @param readTimeout to set
109      */
110     public DsAPIImpl(String uri, int connectTimeout, int readTimeout) {
111         this.transport = new HttpTransportImpl(uri, connectTimeout, readTimeout);
112     }
113
114     /**
115      * Creates a new {@link DsAPIImpl} with creating a new {@link HttpTransport}, parameters see
116      * {@link HttpTransportImpl#HttpTransportImpl(String, int, int, boolean)}.
117      *
118      * @param uri of the digitalSTROM-Server, must not be null
119      * @param connectTimeout to set
120      * @param readTimeout to set
121      * @param aceptAllCerts yes/no (true/false)
122      */
123     public DsAPIImpl(String uri, int connectTimeout, int readTimeout, boolean aceptAllCerts) {
124         this.transport = new HttpTransportImpl(uri, connectTimeout, readTimeout, aceptAllCerts);
125     }
126
127     private boolean isValidApartmentSceneNumber(int sceneNumber) {
128         return (sceneNumber > -1 && sceneNumber < 256);
129     }
130
131     private boolean checkBlankField(JsonObject obj, String key) {
132         return obj != null && obj.get(key) != null;
133     }
134
135     private boolean checkRequiredZone(Integer zoneID, String zoneName) {
136         return zoneID != null && zoneID > -1 || (zoneName != null && !zoneName.isBlank());
137     }
138
139     private boolean checkRequiredDevice(DSID dsid, String dSUID, String name) {
140         String objectString = SimpleRequestBuilder.objectToString(dsid);
141         return (objectString != null && !objectString.isBlank()) || (name != null && !name.isBlank())
142                 || (dSUID != null && !dSUID.isBlank());
143     }
144
145     @Override
146     public boolean callApartmentScene(String token, Short groupID, String groupName, Scene sceneNumber, Boolean force) {
147         if (sceneNumber != null && isValidApartmentSceneNumber(sceneNumber.getSceneNumber())) {
148             String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.APARTMENT)
149                     .addFunction(FunctionKeys.CALL_SCENE).addDefaultGroupParameter(token, groupID, groupName)
150                     .addParameter(ParameterKeys.SCENENUMBER, sceneNumber.getSceneNumber().toString())
151                     .addParameter(ParameterKeys.FORCE, force.toString()).buildRequestString());
152             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
153         }
154         return false;
155     }
156
157     @Override
158     public boolean undoApartmentScene(String token, Short groupID, String groupName, Scene sceneNumber) {
159         if (sceneNumber != null && isValidApartmentSceneNumber(sceneNumber.getSceneNumber())) {
160             String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.APARTMENT)
161                     .addFunction(FunctionKeys.UNDO_SCENE).addDefaultGroupParameter(token, groupID, groupName)
162                     .addParameter(ParameterKeys.SCENENUMBER, sceneNumber.getSceneNumber().toString())
163                     .buildRequestString());
164             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
165         }
166         return false;
167     }
168
169     @Override
170     public Apartment getApartmentStructure(String token) {
171         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.APARTMENT)
172                 .addFunction(FunctionKeys.GET_STRUCTURE).addParameter(ParameterKeys.TOKEN, token).buildRequestString());
173
174         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
175
176         if (JSONResponseHandler.checkResponse(responseObj)) {
177             JsonObject apartObj = JSONResponseHandler.getResultJsonObject(responseObj);
178             if (checkBlankField(apartObj, JSONApiResponseKeysEnum.APARTMENT.getKey())) {
179                 return new JSONApartmentImpl((JsonObject) apartObj.get(JSONApiResponseKeysEnum.APARTMENT.getKey()));
180             }
181         }
182         return null;
183     }
184
185     @Override
186     public List<Device> getApartmentDevices(String token) {
187         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.APARTMENT)
188                 .addFunction(FunctionKeys.GET_DEVICES).addParameter(ParameterKeys.TOKEN, token).buildRequestString());
189         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
190         if (JSONResponseHandler.checkResponse(responseObj)
191                 && responseObj.get(JSONApiResponseKeysEnum.RESULT.getKey()) instanceof JsonArray) {
192             JsonArray array = (JsonArray) responseObj.get(JSONApiResponseKeysEnum.RESULT.getKey());
193
194             List<Device> deviceList = new LinkedList<>();
195             for (int i = 0; i < array.size(); i++) {
196                 if (array.get(i) instanceof JsonObject) {
197                     deviceList.add(new DeviceImpl((JsonObject) array.get(i)));
198                 }
199             }
200             return deviceList;
201         }
202         return new LinkedList<>();
203     }
204
205     @Override
206     public List<Circuit> getApartmentCircuits(String sessionToken) {
207         String response = transport.execute(
208                 SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.APARTMENT).addFunction(FunctionKeys.GET_CIRCUITS)
209                         .addParameter(ParameterKeys.TOKEN, sessionToken).buildRequestString());
210
211         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
212         if (JSONResponseHandler.checkResponse(responseObj)) {
213             responseObj = JSONResponseHandler.getResultJsonObject(responseObj);
214             if (responseObj.get(JSONApiResponseKeysEnum.CIRCUITS.getKey()).isJsonArray()) {
215                 JsonArray array = responseObj.get(JSONApiResponseKeysEnum.CIRCUITS.getKey()).getAsJsonArray();
216
217                 List<Circuit> circuitList = new LinkedList<>();
218                 for (int i = 0; i < array.size(); i++) {
219                     if (array.get(i).isJsonObject()) {
220                         circuitList.add(new CircuitImpl(array.get(i).getAsJsonObject()));
221                     }
222                 }
223                 return circuitList;
224             }
225         }
226         return new LinkedList<>();
227     }
228
229     @Override
230     public boolean callZoneScene(String token, Integer zoneID, String zoneName, Short groupID, String groupName,
231             SceneEnum sceneNumber, Boolean force) {
232         if (checkRequiredZone(zoneID, zoneName)) {
233             String response = transport.execute(
234                     SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.ZONE).addFunction(FunctionKeys.CALL_SCENE)
235                             .addDefaultZoneGroupParameter(token, zoneID, zoneName, groupID, groupName)
236                             .addParameter(ParameterKeys.SCENENUMBER, sceneNumber.getSceneNumber().toString())
237                             .addParameter(ParameterKeys.FORCE, force.toString()).buildRequestString());
238
239             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
240         }
241         return false;
242     }
243
244     @Override
245     public boolean undoZoneScene(String token, Integer zoneID, String zoneName, Short groupID, String groupName,
246             SceneEnum sceneNumber) {
247         if (checkRequiredZone(zoneID, zoneName)) {
248             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
249                     .addRequestClass(ClassKeys.ZONE).addFunction(FunctionKeys.UNDO_SCENE)
250                     .addDefaultZoneGroupParameter(token, zoneID, zoneName, groupID, groupName)
251                     .addParameter(ParameterKeys.SCENENUMBER, sceneNumber.getSceneNumber().toString())
252                     .buildRequestString());
253             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
254         }
255         return false;
256     }
257
258     @Override
259     public boolean turnDeviceOn(String token, DSID dsid, String dSUID, String name) {
260         if (checkRequiredDevice(dsid, dSUID, name)) {
261             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
262                     .addRequestClass(ClassKeys.DEVICE).addFunction(FunctionKeys.TURN_ON)
263                     .addDefaultDeviceParameter(token, dsid, dSUID, name).buildRequestString());
264             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
265         }
266         return false;
267     }
268
269     @Override
270     public boolean turnDeviceOff(String token, DSID dSID, String dSUID, String name) {
271         if (checkRequiredDevice(dSID, dSUID, name)) {
272             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
273                     .addRequestClass(ClassKeys.DEVICE).addFunction(FunctionKeys.TURN_OFF)
274                     .addDefaultDeviceParameter(token, dSID, dSUID, name).buildRequestString());
275
276             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
277
278         }
279         return false;
280     }
281
282     @Override
283     public DeviceConfig getDeviceConfig(String token, DSID dSID, String dSUID, String name,
284             DeviceParameterClassEnum classEnum, Integer index) {
285         if (checkRequiredDevice(dSID, dSUID, name) && classEnum != null
286                 && SimpleRequestBuilder.objectToString(index) != null) {
287             String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.DEVICE)
288                     .addFunction(FunctionKeys.GET_CONFIG).addDefaultDeviceParameter(token, dSID, dSUID, name)
289                     .addParameter(ParameterKeys.CLASS, classEnum.getClassIndex().toString())
290                     .addParameter(ParameterKeys.INDEX, SimpleRequestBuilder.objectToString(index))
291                     .buildRequestString());
292
293             JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
294
295             if (JSONResponseHandler.checkResponse(responseObj)) {
296                 JsonObject configObject = JSONResponseHandler.getResultJsonObject(responseObj);
297
298                 if (configObject != null) {
299                     return new JSONDeviceConfigImpl(configObject);
300                 }
301             }
302         }
303         return null;
304     }
305
306     @Override
307     public int getDeviceOutputValue(String token, DSID dSID, String dSUID, String name, Short offset) {
308         if (checkRequiredDevice(dSID, dSUID, name) && SimpleRequestBuilder.objectToString(offset) != null) {
309             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
310                     .addRequestClass(ClassKeys.DEVICE).addFunction(FunctionKeys.GET_OUTPUT_VALUE)
311                     .addDefaultDeviceParameter(token, dSID, dSUID, name)
312                     .addParameter(ParameterKeys.OFFSET, SimpleRequestBuilder.objectToString(offset))
313                     .buildRequestString());
314
315             JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
316
317             if (JSONResponseHandler.checkResponse(responseObj)) {
318                 JsonObject valueObject = JSONResponseHandler.getResultJsonObject(responseObj);
319
320                 if (checkBlankField(valueObject, JSONApiResponseKeysEnum.VALUE.getKey())) {
321                     return valueObject.get(JSONApiResponseKeysEnum.VALUE.getKey()).getAsInt();
322                 }
323             }
324         }
325         return -1;
326     }
327
328     @Override
329     public boolean setDeviceOutputValue(String token, DSID dSID, String dSUID, String name, Short offset,
330             Integer value) {
331         if (checkRequiredDevice(dSID, dSUID, name) && SimpleRequestBuilder.objectToString(offset) != null
332                 && SimpleRequestBuilder.objectToString(value) != null) {
333             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
334                     .addRequestClass(ClassKeys.DEVICE).addFunction(FunctionKeys.SET_OUTPUT_VALUE)
335                     .addDefaultDeviceParameter(token, dSID, dSUID, name)
336                     .addParameter(ParameterKeys.OFFSET, SimpleRequestBuilder.objectToString(offset))
337                     .addParameter(ParameterKeys.VALUE, SimpleRequestBuilder.objectToString(value))
338                     .buildRequestString());
339             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
340         }
341         return false;
342     }
343
344     @Override
345     public DeviceSceneSpec getDeviceSceneMode(String token, DSID dSID, String dSUID, String name, Short sceneID) {
346         if (checkRequiredDevice(dSID, dSUID, name) && SimpleRequestBuilder.objectToString(sceneID) != null) {
347             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
348                     .addRequestClass(ClassKeys.DEVICE).addFunction(FunctionKeys.GET_SCENE_MODE)
349                     .addDefaultDeviceParameter(token, dSID, dSUID, name)
350                     .addParameter(ParameterKeys.SCENE_ID, SimpleRequestBuilder.objectToString(sceneID))
351                     .buildRequestString());
352             JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
353
354             if (JSONResponseHandler.checkResponse(responseObj)) {
355                 JsonObject sceneSpec = JSONResponseHandler.getResultJsonObject(responseObj);
356
357                 if (sceneSpec != null) {
358                     return new JSONDeviceSceneSpecImpl(sceneSpec);
359                 }
360             }
361         }
362         return null;
363     }
364
365     @Override
366     public short getDeviceSensorValue(String token, DSID dSID, String dSUID, String name, Short sensorIndex) {
367         if (checkRequiredDevice(dSID, dSUID, dSUID) && sensorIndex != null) {
368             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
369                     .addRequestClass(ClassKeys.DEVICE).addFunction(FunctionKeys.GET_SENSOR_VALUE)
370                     .addDefaultDeviceParameter(token, dSID, dSUID, name)
371                     .addParameter(ParameterKeys.SENSOR_INDEX, SimpleRequestBuilder.objectToString(sensorIndex))
372                     .buildRequestString());
373             JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
374
375             if (JSONResponseHandler.checkResponse(responseObj)) {
376                 JsonObject valueObject = JSONResponseHandler.getResultJsonObject(responseObj);
377
378                 if (checkBlankField(valueObject, JSONApiResponseKeysEnum.SENSOR_VALUE.getKey())) {
379                     return valueObject.get(JSONApiResponseKeysEnum.SENSOR_VALUE.getKey()).getAsShort();
380                 }
381             }
382         }
383         return -1;
384     }
385
386     @Override
387     public boolean callDeviceScene(String token, DSID dSID, String dSUID, String name, Scene sceneNumber,
388             Boolean force) {
389         if (checkRequiredDevice(dSID, dSUID, name) && sceneNumber != null) {
390             String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.DEVICE)
391                     .addFunction(FunctionKeys.CALL_SCENE).addDefaultDeviceParameter(token, dSID, dSUID, name)
392                     .addParameter(ParameterKeys.SCENENUMBER, sceneNumber.getSceneNumber().toString())
393                     .addParameter(ParameterKeys.FORCE, force.toString()).buildRequestString());
394             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
395         }
396         return false;
397     }
398
399     @Override
400     public boolean undoDeviceScene(String token, DSID dSID, String dSUID, String name, Scene sceneNumber) {
401         if (checkRequiredDevice(dSID, dSUID, name) && sceneNumber != null) {
402             String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.DEVICE)
403                     .addFunction(FunctionKeys.UNDO_SCENE).addDefaultDeviceParameter(token, dSID, dSUID, name)
404                     .addParameter(ParameterKeys.SCENENUMBER, sceneNumber.getSceneNumber().toString())
405                     .buildRequestString());
406             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
407         }
408         return false;
409     }
410
411     @Override
412     public boolean subscribeEvent(String token, String name, Integer subscriptionID, int connectionTimeout,
413             int readTimeout) {
414         if ((name != null && !name.isBlank()) && SimpleRequestBuilder.objectToString(subscriptionID) != null) {
415             String response;
416             response = transport.execute(
417                     SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.EVENT).addFunction(FunctionKeys.SUBSCRIBE)
418                             .addParameter(ParameterKeys.TOKEN, token).addParameter(ParameterKeys.NAME, name)
419                             .addParameter(ParameterKeys.SUBSCRIPTIONID,
420                                     SimpleRequestBuilder.objectToString(subscriptionID))
421                             .buildRequestString(),
422                     connectionTimeout, readTimeout);
423             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
424         }
425         return false;
426     }
427
428     @Override
429     public boolean unsubscribeEvent(String token, String name, Integer subscriptionID, int connectionTimeout,
430             int readTimeout) {
431         if (name != null && !name.isBlank() && SimpleRequestBuilder.objectToString(subscriptionID) != null) {
432             String response;
433             response = transport.execute(
434                     SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.EVENT).addFunction(FunctionKeys.UNSUBSCRIBE)
435                             .addParameter(ParameterKeys.TOKEN, token).addParameter(ParameterKeys.NAME, name)
436                             .addParameter(ParameterKeys.SUBSCRIPTIONID,
437                                     SimpleRequestBuilder.objectToString(subscriptionID))
438                             .buildRequestString(),
439                     connectionTimeout, readTimeout);
440             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
441         }
442         return false;
443     }
444
445     @Override
446     public String getEvent(String token, Integer subscriptionID, Integer timeout) {
447         if (SimpleRequestBuilder.objectToString(subscriptionID) != null) {
448             return transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.EVENT)
449                     .addFunction(FunctionKeys.GET).addParameter(ParameterKeys.TOKEN, token)
450                     .addParameter(ParameterKeys.SUBSCRIPTIONID, SimpleRequestBuilder.objectToString(subscriptionID))
451                     .addParameter(ParameterKeys.TIMEOUT, SimpleRequestBuilder.objectToString(timeout))
452                     .buildRequestString());
453         }
454         return null;
455     }
456
457     @Override
458     public int getTime(String token) {
459         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.SYSTEM)
460                 .addFunction(FunctionKeys.TIME).addParameter(ParameterKeys.TOKEN, token).buildRequestString());
461         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
462
463         if (JSONResponseHandler.checkResponse(responseObj)) {
464             JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
465
466             if (checkBlankField(obj, JSONApiResponseKeysEnum.TIME.getKey())) {
467                 return obj.get(JSONApiResponseKeysEnum.TIME.getKey()).getAsInt();
468             }
469         }
470         return -1;
471     }
472
473     @Override
474     public List<Integer> getResolutions(String token) {
475         String response = transport.execute(
476                 SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.METERING).addFunction(FunctionKeys.GET_RESOLUTIONS)
477                         .addParameter(ParameterKeys.TOKEN, token).buildRequestString());
478
479         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
480
481         if (JSONResponseHandler.checkResponse(responseObj)) {
482             JsonObject resObj = JSONResponseHandler.getResultJsonObject(responseObj);
483             if (resObj != null && resObj.get(JSONApiResponseKeysEnum.RESOLUTIONS.getKey()) instanceof JsonArray) {
484                 JsonArray array = (JsonArray) resObj.get(JSONApiResponseKeysEnum.RESOLUTIONS.getKey());
485
486                 List<Integer> resolutionList = new LinkedList<>();
487                 for (int i = 0; i < array.size(); i++) {
488                     if (array.get(i) instanceof JsonObject) {
489                         JsonObject jObject = (JsonObject) array.get(i);
490
491                         if (jObject.get(JSONApiResponseKeysEnum.RESOLUTION.getKey()) != null) {
492                             int val = jObject.get(JSONApiResponseKeysEnum.RESOLUTION.getKey()).getAsInt();
493                             if (val != -1) {
494                                 resolutionList.add(val);
495                             }
496                         }
497                     }
498                 }
499                 return resolutionList;
500             }
501         }
502         return null;
503     }
504
505     @Override
506     public List<CachedMeteringValue> getLatest(String token, MeteringTypeEnum type, List<String> meterDSIDs,
507             MeteringUnitsEnum unit) {
508         if (meterDSIDs != null) {
509             String jsonMeterList = ".meters(";
510             for (int i = 0; i < meterDSIDs.size(); i++) {
511                 if (!meterDSIDs.get(i).isEmpty()) {
512                     jsonMeterList += meterDSIDs.get(i);
513                     if (i < meterDSIDs.size() - 1 && !meterDSIDs.get(i + 1).isEmpty()) {
514                         jsonMeterList += ",";
515                     } else {
516                         break;
517                     }
518                 }
519             }
520             jsonMeterList += ")";
521             return getLatest(token, type, jsonMeterList, unit);
522         }
523         return null;
524     }
525
526     @Override
527     public List<CachedMeteringValue> getLatest(String token, MeteringTypeEnum type, String meterDSIDs,
528             MeteringUnitsEnum unit) {
529         if (type != null && meterDSIDs != null) {
530             String unitstring = null;
531             if (unit != null) {
532                 unitstring = unit.unit;
533             }
534             String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.METERING)
535                     .addFunction(FunctionKeys.GET_LATEST).addParameter(ParameterKeys.TOKEN, token)
536                     .addParameter(ParameterKeys.TYPE, SimpleRequestBuilder.objectToString(type).toLowerCase())
537                     .addParameter(ParameterKeys.FROM, meterDSIDs).addParameter(ParameterKeys.UNIT, unitstring)
538                     .buildRequestString());
539
540             JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
541             if (JSONResponseHandler.checkResponse(responseObj)) {
542                 JsonObject latestObj = JSONResponseHandler.getResultJsonObject(responseObj);
543                 if (latestObj != null && latestObj.get(JSONApiResponseKeysEnum.VALUES.getKey()) instanceof JsonArray) {
544                     JsonArray array = (JsonArray) latestObj.get(JSONApiResponseKeysEnum.VALUES.getKey());
545
546                     List<CachedMeteringValue> list = new LinkedList<>();
547                     for (int i = 0; i < array.size(); i++) {
548                         if (array.get(i) instanceof JsonObject) {
549                             list.add(new JSONCachedMeteringValueImpl((JsonObject) array.get(i), type, unit));
550                         }
551                     }
552                     return list;
553                 }
554             }
555         }
556         return null;
557     }
558
559     @Override
560     public boolean setDeviceValue(String token, DSID dSID, String dSUID, String name, Integer value) {
561         if (checkRequiredDevice(dSID, dSUID, name)) {
562             String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.DEVICE)
563                     .addFunction(FunctionKeys.SET_VALUE).addParameter(ParameterKeys.TOKEN, token)
564                     .addParameter(ParameterKeys.DSID, SimpleRequestBuilder.objectToString(dSID))
565                     .addParameter(ParameterKeys.DSUID, dSUID).addParameter(ParameterKeys.NAME, name)
566                     .addParameter(ParameterKeys.VALUE, value.toString()).buildRequestString());
567             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
568         }
569         return false;
570     }
571
572     @Override
573     public List<String> getMeterList(String token) {
574         List<String> meterList = new LinkedList<>();
575         JsonObject responseObj = query(token, QUERY_GET_METERLIST);
576         if (responseObj != null && responseObj.get(JSONApiResponseKeysEnum.DS_METERS.getKey()).isJsonArray()) {
577             JsonArray array = responseObj.get(JSONApiResponseKeysEnum.DS_METERS.getKey()).getAsJsonArray();
578             for (int i = 0; i < array.size(); i++) {
579                 if (array.get(i) instanceof JsonObject) {
580                     meterList.add(array.get(i).getAsJsonObject().get("dSID").getAsString());
581                 }
582             }
583         }
584         return meterList;
585     }
586
587     @Override
588     public String loginApplication(String loginToken) {
589         if (loginToken != null && !loginToken.isBlank()) {
590             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
591                     .addRequestClass(ClassKeys.SYSTEM).addFunction(FunctionKeys.LOGIN_APPLICATION)
592                     .addParameter(ParameterKeys.LOGIN_TOKEN, loginToken).buildRequestString());
593             JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
594
595             if (JSONResponseHandler.checkResponse(responseObj)) {
596                 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
597                 String tokenStr = null;
598
599                 if (checkBlankField(obj, JSONApiResponseKeysEnum.TOKEN.getKey())) {
600                     tokenStr = obj.get(JSONApiResponseKeysEnum.TOKEN.getKey()).getAsString();
601                 }
602                 if (tokenStr != null) {
603                     return tokenStr;
604                 }
605             }
606         }
607         return null;
608     }
609
610     @Override
611     public String login(String user, String password) {
612         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.SYSTEM)
613                 .addFunction(FunctionKeys.LOGIN).addParameter(ParameterKeys.USER, user)
614                 .addParameter(ParameterKeys.PASSWORD, password).buildRequestString());
615         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
616
617         if (JSONResponseHandler.checkResponse(responseObj)) {
618             JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
619             String tokenStr = null;
620
621             if (checkBlankField(obj, JSONApiResponseKeysEnum.TOKEN.getKey())) {
622                 tokenStr = obj.get(JSONApiResponseKeysEnum.TOKEN.getKey()).getAsString();
623             }
624             if (tokenStr != null) {
625                 return tokenStr;
626             }
627         }
628
629         return null;
630     }
631
632     @Override
633     public boolean logout() {
634         String response;
635         response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.SYSTEM)
636                 .addFunction(FunctionKeys.LOGOUT).buildRequestString());
637         return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
638     }
639
640     @Override
641     public Map<String, String> getDSID(String token) {
642         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.SYSTEM)
643                 .addFunction(FunctionKeys.GET_DSID).addParameter(ParameterKeys.TOKEN, token).buildRequestString());
644         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
645
646         if (JSONResponseHandler.checkResponse(responseObj)) {
647             JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
648             if (obj != null) {
649                 Map<String, String> dsidMap = new HashMap<>(obj.entrySet().size());
650                 for (Entry<String, JsonElement> entry : obj.entrySet()) {
651                     dsidMap.put(entry.getKey(), entry.getValue().getAsString());
652                 }
653                 return dsidMap;
654             }
655         }
656         return null;
657     }
658
659     @Override
660     public boolean enableApplicationToken(String applicationToken, String sessionToken) {
661         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.SYSTEM)
662                 .addFunction(FunctionKeys.ENABLE_APPLICATION_TOKEN).addParameter(ParameterKeys.TOKEN, sessionToken)
663                 .addParameter(ParameterKeys.APPLICATION_TOKEN, applicationToken).buildRequestString(),
664                 Config.HIGH_CONNECTION_TIMEOUT, Config.HIGH_READ_TIMEOUT);
665         return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
666     }
667
668     @Override
669     public String requestAppplicationToken(String applicationName) {
670         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.SYSTEM)
671                 .addFunction(FunctionKeys.REQUEST_APPLICATION_TOKEN)
672                 .addParameter(ParameterKeys.APPLICATION_NAME, applicationName).buildRequestString());
673
674         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
675         if (JSONResponseHandler.checkResponse(responseObj)) {
676             JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
677             if (obj != null) {
678                 return obj.get(JSONApiResponseKeysEnum.APPLICATION_TOKEN.getKey()).getAsString();
679             }
680         }
681         return null;
682     }
683
684     @Override
685     public boolean revokeToken(String applicationToken, String sessionToken) {
686         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.SYSTEM)
687                 .addFunction(FunctionKeys.REVOKE_TOKEN).addParameter(ParameterKeys.APPLICATION_TOKEN, applicationToken)
688                 .addParameter(ParameterKeys.TOKEN, sessionToken).buildRequestString());
689         return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
690     }
691
692     @Override
693     public int checkConnection(String token) {
694         return transport.checkConnection(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.APARTMENT)
695                 .addFunction(FunctionKeys.GET_NAME).addParameter(ParameterKeys.TOKEN, token).buildRequestString());
696     }
697
698     @Override
699     public int[] getSceneValue(String token, DSID dSID, String dSUID, String name, Short sceneId) {
700         int[] value = { -1, -1 };
701         if (checkRequiredDevice(dSID, dSUID, name)) {
702             String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.DEVICE)
703                     .addFunction(FunctionKeys.GET_SCENE_VALUE).addDefaultDeviceParameter(token, dSID, dSUID, name)
704                     .addParameter(ParameterKeys.SCENE_ID, SimpleRequestBuilder.objectToString(sceneId))
705                     .buildRequestString(), Config.DEFAULT_CONNECTION_TIMEOUT, Config.HIGH_READ_TIMEOUT);
706             JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
707
708             if (JSONResponseHandler.checkResponse(responseObj)) {
709                 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
710                 if (obj != null && obj.get(JSONApiResponseKeysEnum.VALUE.getKey()) != null) {
711                     value[GeneralLibConstance.SCENE_ARRAY_INDEX_VALUE] = obj.get(JSONApiResponseKeysEnum.VALUE.getKey())
712                             .getAsInt();
713                     if (obj.get(JSONApiResponseKeysEnum.ANGLE.getKey()) != null) {
714                         value[GeneralLibConstance.SCENE_ARRAY_INDEX_ANGLE] = obj
715                                 .get(JSONApiResponseKeysEnum.ANGLE.getKey()).getAsInt();
716                     }
717                     return value;
718                 }
719             }
720         }
721         return value;
722     }
723
724     @Override
725     public boolean increaseValue(String sessionToken, DSID dSID, String dSUID, String name) {
726         if (checkRequiredDevice(dSID, dSUID, name)) {
727             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
728                     .addRequestClass(ClassKeys.DEVICE).addFunction(FunctionKeys.INCREASE_VALUE)
729                     .addDefaultDeviceParameter(sessionToken, dSID, dSUID, name).buildRequestString());
730             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
731         }
732         return false;
733     }
734
735     @Override
736     public boolean decreaseValue(String sessionToken, DSID dSID, String dSUID, String name) {
737         if (checkRequiredDevice(dSID, dSUID, name)) {
738             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
739                     .addRequestClass(ClassKeys.DEVICE).addFunction(FunctionKeys.DECREASE_VALUE)
740                     .addDefaultDeviceParameter(sessionToken, dSID, dSUID, name).buildRequestString());
741             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
742         }
743         return false;
744     }
745
746     @Override
747     public String getInstallationName(String sessionToken) {
748         String response = null;
749         try {
750             response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
751                     .addRequestClass(ClassKeys.APARTMENT).addFunction(FunctionKeys.GET_NAME)
752                     .addParameter(ParameterKeys.TOKEN, sessionToken).buildRequestString());
753         } catch (Exception e) {
754             logger.debug("An exception occurred", e);
755
756         }
757         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
758
759         if (JSONResponseHandler.checkResponse(responseObj)) {
760             JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
761             if (checkBlankField(obj, JSONApiResponseKeysEnum.NAME.getKey())) {
762                 return obj.get(JSONApiResponseKeysEnum.NAME.getKey()).getAsString();
763             }
764         }
765         return null;
766     }
767
768     @Override
769     public String getZoneName(String sessionToken, Integer zoneID) {
770         if (checkRequiredZone(zoneID, null)) {
771             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
772                     .addRequestClass(ClassKeys.ZONE).addFunction(FunctionKeys.GET_NAME)
773                     .addParameter(ParameterKeys.ID, SimpleRequestBuilder.objectToString(zoneID))
774                     .addParameter(ParameterKeys.TOKEN, sessionToken).buildRequestString());
775             JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
776
777             if (JSONResponseHandler.checkResponse(responseObj)) {
778                 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
779                 if (checkBlankField(obj, JSONApiResponseKeysEnum.NAME.getKey())) {
780                     return obj.get(JSONApiResponseKeysEnum.NAME.getKey()).getAsString();
781                 }
782             }
783         }
784         return null;
785     }
786
787     @Override
788     public String getDeviceName(String sessionToken, DSID dSID, String dSUID) {
789         if (checkRequiredDevice(dSID, dSUID, null)) {
790             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
791                     .addRequestClass(ClassKeys.DEVICE).addFunction(FunctionKeys.GET_NAME)
792                     .addDefaultDeviceParameter(sessionToken, dSID, dSUID, null).buildRequestString());
793             JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
794
795             if (JSONResponseHandler.checkResponse(responseObj)) {
796                 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
797                 if (checkBlankField(obj, JSONApiResponseKeysEnum.NAME.getKey())) {
798                     return obj.get(JSONApiResponseKeysEnum.NAME.getKey()).getAsString();
799                 }
800             }
801         }
802         return null;
803     }
804
805     @Override
806     public String getCircuitName(String sessionToken, DSID dSID) {
807         String response = transport
808                 .execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.CIRCUIT).addFunction(FunctionKeys.GET_NAME)
809                         .addParameter(ParameterKeys.DSID, SimpleRequestBuilder.objectToString(dSID))
810                         .addParameter(ParameterKeys.TOKEN, sessionToken).buildRequestString());
811         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
812
813         if (JSONResponseHandler.checkResponse(responseObj)) {
814             JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
815             if (checkBlankField(obj, JSONApiResponseKeysEnum.NAME.getKey())) {
816                 return obj.get(JSONApiResponseKeysEnum.NAME.getKey()).getAsString();
817             }
818         }
819
820         return null;
821     }
822
823     @Override
824     public String getSceneName(String sessionToken, Integer zoneID, String zoneName, Short groupID, Short sceneID) {
825         if (checkRequiredZone(zoneID, zoneName)) {
826             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
827                     .addRequestClass(ClassKeys.ZONE).addFunction(FunctionKeys.SCENE_GET_NAME)
828                     .addDefaultZoneGroupParameter(sessionToken, zoneID, zoneName, groupID, null)
829                     .addParameter(ParameterKeys.SCENENUMBER, SimpleRequestBuilder.objectToString(sceneID))
830                     .buildRequestString());
831             JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
832
833             if (JSONResponseHandler.checkResponse(responseObj)) {
834                 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
835                 if (checkBlankField(obj, JSONApiResponseKeysEnum.NAME.getKey())) {
836                     return obj.get(JSONApiResponseKeysEnum.NAME.getKey()).getAsString();
837                 }
838             }
839         }
840         return null;
841     }
842
843     @Override
844     public TemperatureControlStatus getZoneTemperatureControlStatus(String sessionToken, Integer zoneID,
845             String zoneName) {
846         if (checkRequiredZone(zoneID, zoneName)) {
847             String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.ZONE)
848                     .addFunction(FunctionKeys.GET_TEMPERATURE_CONTROL_STATUS)
849                     .addDefaultZoneParameter(sessionToken, zoneID, zoneName).buildRequestString());
850             JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
851
852             if (JSONResponseHandler.checkResponse(responseObj)) {
853                 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
854                 return new TemperatureControlStatus(obj, zoneID, zoneName);
855             }
856         }
857         return null;
858     }
859
860     @Override
861     public TemperatureControlConfig getZoneTemperatureControlConfig(String sessionToken, Integer zoneID,
862             String zoneName) {
863         if (checkRequiredZone(zoneID, zoneName)) {
864             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
865                     .addRequestClass(ClassKeys.ZONE).addFunction(FunctionKeys.GET_TEMPERATURE_CONTROL_CONFIG)
866                     .addDefaultZoneParameter(sessionToken, zoneID, zoneName).buildRequestString());
867             JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
868
869             if (JSONResponseHandler.checkResponse(responseObj)) {
870                 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
871                 return new TemperatureControlConfig(obj, zoneID, zoneName);
872             }
873         }
874         return null;
875     }
876
877     @Override
878     public TemperatureControlValues getZoneTemperatureControlValues(String sessionToken, Integer zoneID,
879             String zoneName) {
880         if (checkRequiredZone(zoneID, zoneName)) {
881             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
882                     .addRequestClass(ClassKeys.ZONE).addFunction(FunctionKeys.GET_TEMPERATURE_CONTROL_VALUES)
883                     .addDefaultZoneParameter(sessionToken, zoneID, zoneName).buildRequestString());
884             JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
885
886             if (JSONResponseHandler.checkResponse(responseObj)) {
887                 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
888                 return new TemperatureControlValues(obj, zoneID, zoneName);
889             }
890         }
891         return null;
892     }
893
894     @Override
895     public AssignedSensors getZoneAssignedSensors(String sessionToken, Integer zoneID, String zoneName) {
896         if (checkRequiredZone(zoneID, zoneName)) {
897             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
898                     .addRequestClass(ClassKeys.ZONE).addFunction(FunctionKeys.GET_ASSIGNED_SENSORS)
899                     .addDefaultZoneParameter(sessionToken, zoneID, zoneName).buildRequestString());
900             JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
901
902             if (JSONResponseHandler.checkResponse(responseObj)) {
903                 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
904                 return new AssignedSensors(obj, zoneID, zoneName);
905             }
906         }
907         return null;
908     }
909
910     @Override
911     public boolean setZoneTemperatureControlState(String sessionToken, Integer zoneID, String controlState,
912             String zoneName) {
913         if (checkRequiredZone(zoneID, zoneName)) {
914             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
915                     .addRequestClass(ClassKeys.ZONE).addFunction(FunctionKeys.SET_TEMEPERATURE_CONTROL_STATE)
916                     .addDefaultZoneParameter(sessionToken, zoneID, zoneName)
917                     .addParameter(ParameterKeys.CONTROL_STATE, controlState).buildRequestString());
918
919             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
920         }
921         return false;
922     }
923
924     @Override
925     public boolean setZoneTemperatureControlValues(String sessionToken, Integer zoneID, String zoneName,
926             List<Object[]> controlValues) {
927         if (checkRequiredZone(zoneID, zoneName)) {
928             if (checkRequiredZone(zoneID, zoneName)) {
929                 if (controlValues != null) {
930                     SimpleRequestBuilder builder = SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
931                             .addRequestClass(ClassKeys.ZONE).addFunction(FunctionKeys.SET_TEMEPERATURE_CONTROL_VALUE)
932                             .addDefaultZoneParameter(sessionToken, zoneID, zoneName);
933                     for (Object[] objAry : controlValues) {
934                         if (objAry.length == 2 && objAry[0] instanceof String stringValue
935                                 && objAry[1] instanceof Integer) {
936                             builder.addParameter(stringValue, SimpleRequestBuilder.objectToString(objAry[1]));
937                         } else {
938                             builder.buildRequestString();
939                             throw new IllegalArgumentException(
940                                     "The first field of the object array have to be a String and the second have to be an Integer.");
941                         }
942                     }
943                     String response = transport.execute(builder.buildRequestString());
944
945                     return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
946                 }
947             }
948         }
949         return false;
950     }
951
952     @Override
953     public SensorValues getZoneSensorValues(String sessionToken, Integer zoneID, String zoneName) {
954         if (checkRequiredZone(zoneID, zoneName)) {
955             String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.ZONE)
956                     .addFunction(FunctionKeys.GET_SENSOR_VALUES).addParameter(ParameterKeys.TOKEN, sessionToken)
957                     .addDefaultZoneParameter(sessionToken, zoneID, zoneName).buildRequestString());
958             JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
959
960             if (JSONResponseHandler.checkResponse(responseObj)) {
961                 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
962                 return new SensorValues(obj, zoneID, zoneName);
963             }
964         }
965         return null;
966     }
967
968     @Override
969     public boolean setZoneTemperatureControlConfig(String sessionToken, Integer zoneID, String zoneName,
970             String controlDSUID, Short controlMode, Integer referenceZone, Float ctrlOffset, Float emergencyValue,
971             Float manualValue, Float ctrlKp, Float ctrlTs, Float ctrlTi, Float ctrlKd, Float ctrlImin, Float ctrlImax,
972             Float ctrlYmin, Float ctrlYmax, Boolean ctrlAntiWindUp, Boolean ctrlKeepFloorWarm) {
973         if (checkRequiredZone(zoneID, zoneName)) {
974             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
975                     .addRequestClass(ClassKeys.ZONE).addFunction(FunctionKeys.SET_TEMPERATION_CONTROL_CONFIG)
976                     .addDefaultZoneParameter(sessionToken, zoneID, zoneName)
977                     .addParameter(ParameterKeys.CONTROL_MODE, SimpleRequestBuilder.objectToString(controlMode))
978                     .addParameter(ParameterKeys.CONTROL_DSUID, controlDSUID)
979                     .addParameter(ParameterKeys.REFERENCE_ZONE, SimpleRequestBuilder.objectToString(referenceZone))
980                     .addParameter(ParameterKeys.CTRL_OFFSET, SimpleRequestBuilder.objectToString(ctrlOffset))
981                     .addParameter(ParameterKeys.EMERGENCY_VALUE, SimpleRequestBuilder.objectToString(emergencyValue))
982                     .addParameter(ParameterKeys.MANUAL_VALUE, SimpleRequestBuilder.objectToString(manualValue))
983                     .addParameter(ParameterKeys.CTRL_KP, SimpleRequestBuilder.objectToString(ctrlKp))
984                     .addParameter(ParameterKeys.CTRL_TS, SimpleRequestBuilder.objectToString(ctrlTs))
985                     .addParameter(ParameterKeys.CTRL_TI, SimpleRequestBuilder.objectToString(ctrlTi))
986                     .addParameter(ParameterKeys.CTRL_KD, SimpleRequestBuilder.objectToString(ctrlKd))
987                     .addParameter(ParameterKeys.CTRL_I_MIN, SimpleRequestBuilder.objectToString(ctrlImin))
988                     .addParameter(ParameterKeys.CTRL_I_MAX, SimpleRequestBuilder.objectToString(ctrlImax))
989                     .addParameter(ParameterKeys.CTRL_Y_MIN, SimpleRequestBuilder.objectToString(ctrlYmin))
990                     .addParameter(ParameterKeys.CTRL_Y_MAX, SimpleRequestBuilder.objectToString(ctrlYmax))
991                     .addParameter(ParameterKeys.CTRL_ANTI_WIND_UP, SimpleRequestBuilder.objectToString(ctrlAntiWindUp))
992                     .addParameter(ParameterKeys.CTRL_KEEP_FLOOR_WARM,
993                             SimpleRequestBuilder.objectToString(ctrlKeepFloorWarm))
994                     .buildRequestString());
995
996             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
997         }
998         return false;
999     }
1000
1001     @Override
1002     public boolean setZoneSensorSource(String sessionToken, Integer zoneID, String zoneName, SensorEnum sensorType,
1003             DSID dSID) {
1004         if (checkRequiredZone(zoneID, zoneName)) {
1005             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
1006                     .addRequestClass(ClassKeys.ZONE).addFunction(FunctionKeys.SET_SENSOR_SOURCE)
1007                     .addDefaultZoneParameter(sessionToken, zoneID, zoneName)
1008                     .addParameter(ParameterKeys.SENSOR_TYPE, sensorType.getSensorType().toString())
1009                     .addParameter(ParameterKeys.DSID, SimpleRequestBuilder.objectToString(dSID)).buildRequestString());
1010
1011             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
1012         }
1013         return false;
1014     }
1015
1016     @Override
1017     public boolean clearZoneSensorSource(String sessionToken, Integer zoneID, String zoneName, SensorEnum sensorType) {
1018         if (checkRequiredZone(zoneID, zoneName)) {
1019             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
1020                     .addRequestClass(ClassKeys.ZONE).addFunction(FunctionKeys.SET_TEMEPERATURE_CONTROL_VALUE)
1021                     .addDefaultZoneParameter(sessionToken, zoneID, zoneName)
1022                     .addParameter(ParameterKeys.SENSOR_TYPE, sensorType.getSensorType().toString())
1023                     .buildRequestString());
1024
1025             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
1026         }
1027         return false;
1028     }
1029
1030     @Override
1031     public TemperatureControlInternals getZoneTemperatureControlInternals(String sessionToken, Integer zoneID,
1032             String zoneName) {
1033         if (checkRequiredZone(zoneID, zoneName)) {
1034             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
1035                     .addRequestClass(ClassKeys.ZONE).addFunction(FunctionKeys.GET_TEMPERATURE_CONTROL_INTERNALS)
1036                     .addDefaultZoneParameter(sessionToken, zoneID, zoneName).buildRequestString());
1037             JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1038
1039             if (JSONResponseHandler.checkResponse(responseObj)) {
1040                 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
1041                 return new TemperatureControlInternals(obj, zoneID, zoneName);
1042             }
1043         }
1044         return null;
1045     }
1046
1047     @Override
1048     public boolean setZoneOutputValue(String sessionToken, Integer zoneID, String zoneName, Short groupID,
1049             String groupName, Integer value) {
1050         if (value != null && checkRequiredZone(zoneID, zoneName)) {
1051             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
1052                     .addRequestClass(ClassKeys.ZONE).addFunction(FunctionKeys.SET_OUTPUT_VALUE)
1053                     .addParameter(ParameterKeys.TOKEN, sessionToken).addParameter(ParameterKeys.NAME, zoneName)
1054                     .addDefaultZoneGroupParameter(sessionToken, zoneID, zoneName, groupID, groupName)
1055                     .addParameter(ParameterKeys.VALUE, SimpleRequestBuilder.objectToString(value))
1056                     .buildRequestString());
1057             JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1058
1059             if (JSONResponseHandler.checkResponse(responseObj)) {
1060                 return true;
1061             }
1062         }
1063         return false;
1064     }
1065
1066     @Override
1067     public boolean zoneBlink(String sessionToken, Integer zoneID, String zoneName, Short groupID, String groupName) {
1068         if (checkRequiredZone(zoneID, zoneName)) {
1069             String response = transport.execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON)
1070                     .addRequestClass(ClassKeys.ZONE).addFunction(FunctionKeys.BLINK)
1071                     .addDefaultZoneGroupParameter(sessionToken, zoneID, zoneName, groupID, groupName)
1072                     .buildRequestString());
1073             JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1074
1075             if (JSONResponseHandler.checkResponse(responseObj)) {
1076                 return true;
1077             }
1078         }
1079         return false;
1080     }
1081
1082     @Override
1083     public boolean pushZoneSensorValue(String sessionToken, Integer zoneID, String zoneName, Short groupID,
1084             String sourceDSUID, Float sensorValue, SensorEnum sensorType) {
1085         if (checkRequiredZone(zoneID, zoneName) && sensorType != null && sensorValue != null) {
1086             String response = transport
1087                     .execute(SimpleRequestBuilder.buildNewRequest(InterfaceKeys.JSON).addRequestClass(ClassKeys.ZONE)
1088                             .addFunction(FunctionKeys.PUSH_SENSOR_VALUE)
1089                             .addDefaultZoneGroupParameter(sessionToken, zoneID, zoneName, groupID, null)
1090                             .addParameter(ParameterKeys.SOURCE_DSUID, sourceDSUID)
1091                             .addParameter(ParameterKeys.SENSOR_VALUE, SimpleRequestBuilder.objectToString(sensorValue))
1092                             .addParameter(ParameterKeys.SENSOR_TYPE,
1093                                     SimpleRequestBuilder.objectToString(sensorType.getSensorType()))
1094                             .buildRequestString());
1095             return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
1096         }
1097         return false;
1098     }
1099
1100     @Override
1101     public List<TemperatureControlStatus> getApartmentTemperatureControlStatus(String sessionToken) {
1102         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.APARTMENT)
1103                 .addFunction(FunctionKeys.GET_TEMPERATURE_CONTROL_STATUS)
1104                 .addParameter(ParameterKeys.TOKEN, sessionToken).buildRequestString());
1105         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1106
1107         if (JSONResponseHandler.checkResponse(responseObj)) {
1108             JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
1109             if (obj.get(JSONApiResponseKeysEnum.ZONES.getKey()).isJsonArray()) {
1110                 JsonArray jArray = obj.get(JSONApiResponseKeysEnum.ZONES.getKey()).getAsJsonArray();
1111                 if (jArray.size() != 0) {
1112                     List<TemperatureControlStatus> list = new ArrayList<>(jArray.size());
1113                     Iterator<JsonElement> iter = jArray.iterator();
1114                     while (iter.hasNext()) {
1115                         TemperatureControlStatus tContStat = new TemperatureControlStatus(
1116                                 iter.next().getAsJsonObject());
1117                         list.add(tContStat);
1118                     }
1119                     return list;
1120                 }
1121             }
1122         }
1123         return null;
1124     }
1125
1126     @Override
1127     public Map<Integer, TemperatureControlConfig> getApartmentTemperatureControlConfig(String sessionToken) {
1128         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.APARTMENT)
1129                 .addFunction(FunctionKeys.GET_TEMPERATURE_CONTROL_CONFIG)
1130                 .addParameter(ParameterKeys.TOKEN, sessionToken).buildRequestString());
1131         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1132
1133         if (JSONResponseHandler.checkResponse(responseObj)) {
1134             JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
1135             if (obj.get(JSONApiResponseKeysEnum.ZONES.getKey()).isJsonArray()) {
1136                 JsonArray jArray = obj.get(JSONApiResponseKeysEnum.ZONES.getKey()).getAsJsonArray();
1137                 if (jArray.size() != 0) {
1138                     Map<Integer, TemperatureControlConfig> map = new HashMap<>(jArray.size());
1139                     Iterator<JsonElement> iter = jArray.iterator();
1140                     while (iter.hasNext()) {
1141                         TemperatureControlConfig tContConf = new TemperatureControlConfig(
1142                                 iter.next().getAsJsonObject());
1143                         map.put(tContConf.getZoneID(), tContConf);
1144                     }
1145                     return map;
1146                 }
1147             }
1148         }
1149         return null;
1150     }
1151
1152     @Override
1153     public Map<Integer, TemperatureControlValues> getApartmentTemperatureControlValues(String sessionToken) {
1154         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.APARTMENT)
1155                 .addFunction(FunctionKeys.GET_TEMPERATURE_CONTROL_VALUES)
1156                 .addParameter(ParameterKeys.TOKEN, sessionToken).buildRequestString());
1157         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1158
1159         if (JSONResponseHandler.checkResponse(responseObj)) {
1160             JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
1161             if (obj.get(JSONApiResponseKeysEnum.ZONES.getKey()).isJsonArray()) {
1162                 JsonArray jArray = obj.get(JSONApiResponseKeysEnum.ZONES.getKey()).getAsJsonArray();
1163                 if (jArray.size() != 0) {
1164                     Map<Integer, TemperatureControlValues> map = new HashMap<>(jArray.size());
1165                     Iterator<JsonElement> iter = jArray.iterator();
1166                     while (iter.hasNext()) {
1167                         TemperatureControlValues tContVal = new TemperatureControlValues(iter.next().getAsJsonObject());
1168                         map.put(tContVal.getZoneID(), tContVal);
1169                     }
1170                     return map;
1171                 }
1172             }
1173         }
1174         return null;
1175     }
1176
1177     @Override
1178     public Map<Integer, AssignedSensors> getApartmentAssignedSensors(String sessionToken) {
1179         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.APARTMENT)
1180                 .addFunction(FunctionKeys.GET_ASSIGNED_SENSORS).addParameter(ParameterKeys.TOKEN, sessionToken)
1181                 .buildRequestString());
1182         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1183
1184         if (JSONResponseHandler.checkResponse(responseObj)) {
1185             JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
1186             if (obj.get(JSONApiResponseKeysEnum.ZONES.getKey()).isJsonArray()) {
1187                 JsonArray jArray = obj.get(JSONApiResponseKeysEnum.ZONES.getKey()).getAsJsonArray();
1188                 if (jArray.size() != 0) {
1189                     HashMap<Integer, AssignedSensors> map = new HashMap<>(jArray.size());
1190                     Iterator<JsonElement> iter = jArray.iterator();
1191                     while (iter.hasNext()) {
1192                         AssignedSensors assignedSensors = new AssignedSensors(iter.next().getAsJsonObject());
1193                         map.put(assignedSensors.getZoneID(), assignedSensors);
1194                     }
1195                     return map;
1196                 }
1197             }
1198         }
1199         return null;
1200     }
1201
1202     @Override
1203     public Map<Integer, BaseSensorValues> getApartmentSensorValues(String sessionToken) {
1204         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.APARTMENT)
1205                 .addFunction(FunctionKeys.GET_SENSOR_VALUES).addParameter(ParameterKeys.TOKEN, sessionToken)
1206                 .buildRequestString());
1207         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1208
1209         if (JSONResponseHandler.checkResponse(responseObj)) {
1210             JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
1211             if (obj.get(JSONApiResponseKeysEnum.ZONES.getKey()).isJsonArray()) {
1212                 JsonArray jArray = obj.get(JSONApiResponseKeysEnum.ZONES.getKey()).getAsJsonArray();
1213                 WeatherSensorData weather = new WeatherSensorData(obj);
1214                 if (jArray.size() != 0) {
1215                     HashMap<Integer, BaseSensorValues> map = new HashMap<>(jArray.size() + 1);
1216                     Iterator<JsonElement> iter = jArray.iterator();
1217                     while (iter.hasNext()) {
1218                         SensorValues sensorValues = new SensorValues(iter.next().getAsJsonObject());
1219                         map.put(sensorValues.getZoneID(), sensorValues);
1220                     }
1221                     map.put(GeneralLibConstance.BROADCAST_ZONE_GROUP_ID, weather);
1222                     return map;
1223                 }
1224             }
1225         }
1226         return null;
1227     }
1228
1229     @Override
1230     public JsonObject query(String sessionToken, String query) {
1231         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.PROPERTY_TREE)
1232                 .addFunction(FunctionKeys.QUERY).addParameter(ParameterKeys.QUERY, query)
1233                 .addParameter(ParameterKeys.TOKEN, sessionToken).buildRequestString());
1234
1235         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1236         if (JSONResponseHandler.checkResponse(responseObj)) {
1237             return JSONResponseHandler.getResultJsonObject(responseObj);
1238         }
1239         return null;
1240     }
1241
1242     @Override
1243     public JsonObject query2(String sessionToken, String query) {
1244         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.PROPERTY_TREE)
1245                 .addFunction(FunctionKeys.QUERY2).addParameter(ParameterKeys.QUERY, query)
1246                 .addParameter(ParameterKeys.TOKEN, sessionToken).buildRequestString());
1247
1248         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1249         if (JSONResponseHandler.checkResponse(responseObj)) {
1250             return JSONResponseHandler.getResultJsonObject(responseObj);
1251         }
1252         return null;
1253     }
1254
1255     @Override
1256     public String propertyTreeGetString(String sessionToken, String path) {
1257         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.PROPERTY_TREE)
1258                 .addFunction(FunctionKeys.GET_STRING).addParameter(ParameterKeys.PATH, path)
1259                 .addParameter(ParameterKeys.TOKEN, sessionToken).buildRequestString());
1260
1261         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1262         if (JSONResponseHandler.checkResponse(responseObj)) {
1263             responseObj = JSONResponseHandler.getResultJsonObject(responseObj);
1264             return responseObj.get(JSONApiResponseKeysEnum.VALUE.getKey()).getAsString();
1265         }
1266         return null;
1267     }
1268
1269     @Override
1270     public Boolean propertyTreeSetString(String token, String path, String value) {
1271         String response = transport.execute(
1272                 SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.PROPERTY_TREE).addFunction(FunctionKeys.SET_STRING)
1273                         .addParameter(ParameterKeys.PATH, path).addParameter(ParameterKeys.TOKEN, token)
1274                         .addParameter(ParameterKeys.VALUE, value).buildRequestString());
1275
1276         return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
1277     }
1278
1279     @Override
1280     public JsonArray propertyTreeGetChildren(String sessionToken, String path) {
1281         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.PROPERTY_TREE)
1282                 .addFunction(FunctionKeys.GET_CHILDREN).addParameter(ParameterKeys.PATH, path)
1283                 .addParameter(ParameterKeys.TOKEN, sessionToken).buildRequestString());
1284
1285         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1286         if (JSONResponseHandler.checkResponse(responseObj)) {
1287             return responseObj.get(JSONApiResponseKeysEnum.RESULT.getKey()).getAsJsonArray();
1288         }
1289         return null;
1290     }
1291
1292     @Override
1293     public Integer propertyTreeGetInteger(String sessionToken, String path) {
1294         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.PROPERTY_TREE)
1295                 .addFunction(FunctionKeys.GET_INTEGER).addParameter(ParameterKeys.PATH, path)
1296                 .addParameter(ParameterKeys.TOKEN, sessionToken).buildRequestString());
1297
1298         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1299         if (JSONResponseHandler.checkResponse(responseObj)) {
1300             responseObj = JSONResponseHandler.getResultJsonObject(responseObj);
1301             return responseObj.get(JSONApiResponseKeysEnum.VALUE.getKey()).getAsInt();
1302         }
1303         return null;
1304     }
1305
1306     @Override
1307     public Boolean propertyTreeSetInteger(String sessionToken, String path, Integer value) {
1308         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.PROPERTY_TREE)
1309                 .addFunction(FunctionKeys.SET_INTEGER).addParameter(ParameterKeys.PATH, path)
1310                 .addParameter(ParameterKeys.TOKEN, sessionToken)
1311                 .addParameter(ParameterKeys.VALUE, SimpleRequestBuilder.objectToString(value)).buildRequestString());
1312
1313         return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
1314     }
1315
1316     @Override
1317     public Boolean propertyTreeGetBoolean(String sessionToken, String path) {
1318         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.PROPERTY_TREE)
1319                 .addFunction(FunctionKeys.GET_BOOLEAN).addParameter(ParameterKeys.PATH, path)
1320                 .addParameter(ParameterKeys.TOKEN, sessionToken).buildRequestString());
1321
1322         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1323         if (JSONResponseHandler.checkResponse(responseObj)) {
1324             responseObj = JSONResponseHandler.getResultJsonObject(responseObj);
1325             return responseObj.get(JSONApiResponseKeysEnum.VALUE.getKey()).getAsBoolean();
1326         }
1327         return null;
1328     }
1329
1330     @Override
1331     public Boolean propertyTreeSetBoolean(String sessionToken, String path, Boolean value) {
1332         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.PROPERTY_TREE)
1333                 .addFunction(FunctionKeys.SET_BOOLEAN).addParameter(ParameterKeys.PATH, path)
1334                 .addParameter(ParameterKeys.TOKEN, sessionToken)
1335                 .addParameter(ParameterKeys.VALUE, SimpleRequestBuilder.objectToString(value)).buildRequestString());
1336
1337         return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
1338     }
1339
1340     @Override
1341     public String propertyTreeGetType(String sessionToken, String path) {
1342         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.PROPERTY_TREE)
1343                 .addFunction(FunctionKeys.GET_TYPE).addParameter(ParameterKeys.PATH, path)
1344                 .addParameter(ParameterKeys.TOKEN, sessionToken).buildRequestString());
1345
1346         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1347         if (JSONResponseHandler.checkResponse(responseObj)) {
1348             responseObj = JSONResponseHandler.getResultJsonObject(responseObj);
1349             return responseObj.get(JSONApiResponseKeysEnum.VALUE.getKey()).getAsString();
1350         }
1351         return null;
1352     }
1353
1354     @Override
1355     public Map<String, Boolean> propertyTreeGetFlages(String sessionToken, String path) {
1356         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.PROPERTY_TREE)
1357                 .addFunction(FunctionKeys.GET_FLAGS).addParameter(ParameterKeys.PATH, path)
1358                 .addParameter(ParameterKeys.TOKEN, sessionToken).buildRequestString());
1359
1360         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1361         if (JSONResponseHandler.checkResponse(responseObj)) {
1362             responseObj = JSONResponseHandler.getResultJsonObject(responseObj);
1363             Set<Entry<String, JsonElement>> flagEntries = responseObj.entrySet();
1364             Map<String, Boolean> flags = new HashMap<>(flagEntries.size());
1365             for (Entry<String, JsonElement> flag : flagEntries) {
1366                 flags.put(flag.getKey(), flag.getValue().getAsBoolean());
1367             }
1368             return flags;
1369         }
1370         return null;
1371     }
1372
1373     @Override
1374     public Boolean propertyTreeSetFlag(String sessionToken, String path, String flag, Boolean value) {
1375         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.PROPERTY_TREE)
1376                 .addFunction(FunctionKeys.SET_FLAG).addParameter(ParameterKeys.PATH, path)
1377                 .addParameter(ParameterKeys.TOKEN, sessionToken).addParameter(ParameterKeys.FLAG, flag)
1378                 .addParameter(ParameterKeys.VALUE, SimpleRequestBuilder.objectToString(value)).buildRequestString());
1379
1380         return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
1381     }
1382
1383     @Override
1384     public Boolean propertyTreeRemove(String sessionToken, String path) {
1385         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.PROPERTY_TREE)
1386                 .addFunction(FunctionKeys.REMOVE).addParameter(ParameterKeys.PATH, path)
1387                 .addParameter(ParameterKeys.TOKEN, sessionToken).buildRequestString());
1388
1389         return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
1390     }
1391
1392     @Override
1393     public Map<String, String> getSystemVersion() {
1394         String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.SYSTEM)
1395                 .addFunction(FunctionKeys.VERSION).buildRequestString());
1396
1397         JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1398         if (JSONResponseHandler.checkResponse(responseObj)) {
1399             Set<Entry<String, JsonElement>> entries = JSONResponseHandler.getResultJsonObject(responseObj).entrySet();
1400             Map<String, String> versions = new HashMap<>(entries.size());
1401             for (Entry<String, JsonElement> entry : entries) {
1402                 versions.put(entry.getKey(), entry.getValue().getAsString());
1403             }
1404             return versions;
1405         }
1406         return null;
1407     }
1408 }