2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
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
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.digitalstrom.internal.lib.serverconnection.impl;
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;
22 import java.util.Map.Entry;
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;
65 import com.google.gson.JsonArray;
66 import com.google.gson.JsonElement;
67 import com.google.gson.JsonObject;
70 * The {@link DsAPIImpl} is the implementation of the {@link DsAPI}.
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}
79 public class DsAPIImpl implements DsAPI {
81 private final Logger logger = LoggerFactory.getLogger(DsAPIImpl.class);
82 private final HttpTransport transport;
84 public static final String QUERY_GET_METERLIST = "/apartment/dSMeters/*(dSID)";
87 * Contains methods where no login is required.
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);
94 * Create a new {@link DsAPIImpl} with the given {@link HttpTransport}.
96 * @param transport for connection, must not be null
98 public DsAPIImpl(HttpTransport transport) {
99 this.transport = transport;
103 * Creates a new {@link DsAPIImpl} with creating a new {@link HttpTransport}, parameters see
104 * {@link HttpTransportImpl#HttpTransportImpl(String, int, int)}.
106 * @param uri of the digitalSTROM-Server, must not be null
107 * @param connectTimeout to set
108 * @param readTimeout to set
110 public DsAPIImpl(String uri, int connectTimeout, int readTimeout) {
111 this.transport = new HttpTransportImpl(uri, connectTimeout, readTimeout);
115 * Creates a new {@link DsAPIImpl} with creating a new {@link HttpTransport}, parameters see
116 * {@link HttpTransportImpl#HttpTransportImpl(String, int, int, boolean)}.
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)
123 public DsAPIImpl(String uri, int connectTimeout, int readTimeout, boolean aceptAllCerts) {
124 this.transport = new HttpTransportImpl(uri, connectTimeout, readTimeout, aceptAllCerts);
127 private boolean isValidApartmentSceneNumber(int sceneNumber) {
128 return (sceneNumber > -1 && sceneNumber < 256);
131 private boolean checkBlankField(JsonObject obj, String key) {
132 return obj != null && obj.get(key) != null;
135 private boolean checkRequiredZone(Integer zoneID, String zoneName) {
136 return zoneID != null && zoneID > -1 || (zoneName != null && !zoneName.isBlank());
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());
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));
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));
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());
174 JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
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()));
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());
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)));
202 return new LinkedList<>();
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());
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();
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()));
226 return new LinkedList<>();
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());
239 return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
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));
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));
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());
276 return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
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());
293 JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
295 if (JSONResponseHandler.checkResponse(responseObj)) {
296 JsonObject configObject = JSONResponseHandler.getResultJsonObject(responseObj);
298 if (configObject != null) {
299 return new JSONDeviceConfigImpl(configObject);
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());
315 JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
317 if (JSONResponseHandler.checkResponse(responseObj)) {
318 JsonObject valueObject = JSONResponseHandler.getResultJsonObject(responseObj);
320 if (checkBlankField(valueObject, JSONApiResponseKeysEnum.VALUE.getKey())) {
321 return valueObject.get(JSONApiResponseKeysEnum.VALUE.getKey()).getAsInt();
329 public boolean setDeviceOutputValue(String token, DSID dSID, String dSUID, String name, Short offset,
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));
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);
354 if (JSONResponseHandler.checkResponse(responseObj)) {
355 JsonObject sceneSpec = JSONResponseHandler.getResultJsonObject(responseObj);
357 if (sceneSpec != null) {
358 return new JSONDeviceSceneSpecImpl(sceneSpec);
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);
375 if (JSONResponseHandler.checkResponse(responseObj)) {
376 JsonObject valueObject = JSONResponseHandler.getResultJsonObject(responseObj);
378 if (checkBlankField(valueObject, JSONApiResponseKeysEnum.SENSOR_VALUE.getKey())) {
379 return valueObject.get(JSONApiResponseKeysEnum.SENSOR_VALUE.getKey()).getAsShort();
387 public boolean callDeviceScene(String token, DSID dSID, String dSUID, String name, Scene sceneNumber,
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));
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));
412 public boolean subscribeEvent(String token, String name, Integer subscriptionID, int connectionTimeout,
414 if ((name != null && !name.isBlank()) && SimpleRequestBuilder.objectToString(subscriptionID) != null) {
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));
429 public boolean unsubscribeEvent(String token, String name, Integer subscriptionID, int connectionTimeout,
431 if (name != null && !name.isBlank() && SimpleRequestBuilder.objectToString(subscriptionID) != null) {
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));
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());
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);
463 if (JSONResponseHandler.checkResponse(responseObj)) {
464 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
466 if (checkBlankField(obj, JSONApiResponseKeysEnum.TIME.getKey())) {
467 return obj.get(JSONApiResponseKeysEnum.TIME.getKey()).getAsInt();
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());
479 JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
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());
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);
491 if (jObject.get(JSONApiResponseKeysEnum.RESOLUTION.getKey()) != null) {
492 int val = jObject.get(JSONApiResponseKeysEnum.RESOLUTION.getKey()).getAsInt();
494 resolutionList.add(val);
499 return resolutionList;
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 += ",";
520 jsonMeterList += ")";
521 return getLatest(token, type, jsonMeterList, unit);
527 public List<CachedMeteringValue> getLatest(String token, MeteringTypeEnum type, String meterDSIDs,
528 MeteringUnitsEnum unit) {
529 if (type != null && meterDSIDs != null) {
530 String unitstring = null;
532 unitstring = unit.unit;
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());
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());
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));
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));
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());
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);
595 if (JSONResponseHandler.checkResponse(responseObj)) {
596 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
597 String tokenStr = null;
599 if (checkBlankField(obj, JSONApiResponseKeysEnum.TOKEN.getKey())) {
600 tokenStr = obj.get(JSONApiResponseKeysEnum.TOKEN.getKey()).getAsString();
602 if (tokenStr != null) {
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);
617 if (JSONResponseHandler.checkResponse(responseObj)) {
618 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
619 String tokenStr = null;
621 if (checkBlankField(obj, JSONApiResponseKeysEnum.TOKEN.getKey())) {
622 tokenStr = obj.get(JSONApiResponseKeysEnum.TOKEN.getKey()).getAsString();
624 if (tokenStr != null) {
633 public boolean logout() {
635 response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.SYSTEM)
636 .addFunction(FunctionKeys.LOGOUT).buildRequestString());
637 return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
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);
646 if (JSONResponseHandler.checkResponse(responseObj)) {
647 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
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());
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));
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());
674 JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
675 if (JSONResponseHandler.checkResponse(responseObj)) {
676 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
678 return obj.get(JSONApiResponseKeysEnum.APPLICATION_TOKEN.getKey()).getAsString();
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));
693 public int checkConnection(String token) {
694 return transport.checkConnection(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.APARTMENT)
695 .addFunction(FunctionKeys.GET_NAME).addParameter(ParameterKeys.TOKEN, token).buildRequestString());
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);
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())
713 if (obj.get(JSONApiResponseKeysEnum.ANGLE.getKey()) != null) {
714 value[GeneralLibConstance.SCENE_ARRAY_INDEX_ANGLE] = obj
715 .get(JSONApiResponseKeysEnum.ANGLE.getKey()).getAsInt();
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));
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));
747 public String getInstallationName(String sessionToken) {
748 String response = null;
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);
757 JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
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();
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);
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();
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);
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();
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);
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();
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);
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();
844 public TemperatureControlStatus getZoneTemperatureControlStatus(String sessionToken, Integer zoneID,
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);
852 if (JSONResponseHandler.checkResponse(responseObj)) {
853 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
854 return new TemperatureControlStatus(obj, zoneID, zoneName);
861 public TemperatureControlConfig getZoneTemperatureControlConfig(String sessionToken, Integer zoneID,
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);
869 if (JSONResponseHandler.checkResponse(responseObj)) {
870 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
871 return new TemperatureControlConfig(obj, zoneID, zoneName);
878 public TemperatureControlValues getZoneTemperatureControlValues(String sessionToken, Integer zoneID,
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);
886 if (JSONResponseHandler.checkResponse(responseObj)) {
887 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
888 return new TemperatureControlValues(obj, zoneID, zoneName);
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);
902 if (JSONResponseHandler.checkResponse(responseObj)) {
903 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
904 return new AssignedSensors(obj, zoneID, zoneName);
911 public boolean setZoneTemperatureControlState(String sessionToken, Integer zoneID, String controlState,
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());
919 return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
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]));
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.");
943 String response = transport.execute(builder.buildRequestString());
945 return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
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);
960 if (JSONResponseHandler.checkResponse(responseObj)) {
961 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
962 return new SensorValues(obj, zoneID, zoneName);
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());
996 return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
1002 public boolean setZoneSensorSource(String sessionToken, Integer zoneID, String zoneName, SensorEnum sensorType,
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());
1011 return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
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());
1025 return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
1031 public TemperatureControlInternals getZoneTemperatureControlInternals(String sessionToken, Integer zoneID,
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);
1039 if (JSONResponseHandler.checkResponse(responseObj)) {
1040 JsonObject obj = JSONResponseHandler.getResultJsonObject(responseObj);
1041 return new TemperatureControlInternals(obj, zoneID, zoneName);
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);
1059 if (JSONResponseHandler.checkResponse(responseObj)) {
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);
1075 if (JSONResponseHandler.checkResponse(responseObj)) {
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));
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
1221 map.put(GeneralLibConstance.BROADCAST_ZONE_GROUP_ID, weather);
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());
1235 JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1236 if (JSONResponseHandler.checkResponse(responseObj)) {
1237 return JSONResponseHandler.getResultJsonObject(responseObj);
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());
1248 JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1249 if (JSONResponseHandler.checkResponse(responseObj)) {
1250 return JSONResponseHandler.getResultJsonObject(responseObj);
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());
1261 JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1262 if (JSONResponseHandler.checkResponse(responseObj)) {
1263 responseObj = JSONResponseHandler.getResultJsonObject(responseObj);
1264 return responseObj.get(JSONApiResponseKeysEnum.VALUE.getKey()).getAsString();
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());
1276 return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
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());
1285 JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1286 if (JSONResponseHandler.checkResponse(responseObj)) {
1287 return responseObj.get(JSONApiResponseKeysEnum.RESULT.getKey()).getAsJsonArray();
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());
1298 JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1299 if (JSONResponseHandler.checkResponse(responseObj)) {
1300 responseObj = JSONResponseHandler.getResultJsonObject(responseObj);
1301 return responseObj.get(JSONApiResponseKeysEnum.VALUE.getKey()).getAsInt();
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());
1313 return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
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());
1322 JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1323 if (JSONResponseHandler.checkResponse(responseObj)) {
1324 responseObj = JSONResponseHandler.getResultJsonObject(responseObj);
1325 return responseObj.get(JSONApiResponseKeysEnum.VALUE.getKey()).getAsBoolean();
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());
1337 return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
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());
1346 JsonObject responseObj = JSONResponseHandler.toJsonObject(response);
1347 if (JSONResponseHandler.checkResponse(responseObj)) {
1348 responseObj = JSONResponseHandler.getResultJsonObject(responseObj);
1349 return responseObj.get(JSONApiResponseKeysEnum.VALUE.getKey()).getAsString();
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());
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());
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());
1380 return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
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());
1389 return JSONResponseHandler.checkResponse(JSONResponseHandler.toJsonObject(response));
1393 public Map<String, String> getSystemVersion() {
1394 String response = transport.execute(SimpleRequestBuilder.buildNewJsonRequest(ClassKeys.SYSTEM)
1395 .addFunction(FunctionKeys.VERSION).buildRequestString());
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());