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.km200.internal.handler;
15 import static org.openhab.binding.km200.internal.KM200BindingConstants.*;
17 import java.util.ArrayList;
18 import java.util.List;
20 import org.eclipse.jdt.annotation.NonNullByDefault;
21 import org.eclipse.jdt.annotation.Nullable;
22 import org.openhab.binding.km200.internal.KM200Device;
23 import org.openhab.binding.km200.internal.KM200ServiceObject;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
27 import com.google.gson.JsonArray;
28 import com.google.gson.JsonObject;
31 * The KM200DataHandler is representing one service on the device
33 * @author Markus Eckhardt - Initial contribution
36 public class KM200ServiceHandler {
38 private final Logger logger = LoggerFactory.getLogger(KM200ServiceHandler.class);
40 private final String service;
41 private final @Nullable KM200ServiceObject parent;
42 private final KM200Device remoteDevice;
44 public KM200ServiceHandler(String service, @Nullable KM200ServiceObject parent, KM200Device remoteDevice) {
45 this.service = service;
47 this.remoteDevice = remoteDevice;
51 * This function starts the object's initialization
53 public void initObject() {
55 if (remoteDevice.getBlacklistMap().contains(service)) {
56 logger.debug("Blacklisted: {}", service);
59 if (null == remoteDevice.getServiceNode(service)) {
60 logger.debug("initDevice: nodeRoot == null for service: {}", service);
63 nodeRoot = remoteDevice.getServiceNode(service);
64 if (null != nodeRoot) {
65 determineServiceObject(createServiceObject(nodeRoot), nodeRoot);
70 * This function checks the flags of a service on the device and creates a KM200CommObject
72 public KM200ServiceObject createServiceObject(JsonObject nodeRoot) {
73 KM200ServiceObject serviceObject;
74 String id = null, type = null;
75 Integer writeable = 0;
76 Integer recordable = 0;
78 /* check whether the node is an empty one */
79 if (nodeRoot.toString().length() == 2) {
82 type = DATA_TYPE_PROTECTED;
84 type = nodeRoot.get("type").getAsString();
85 id = nodeRoot.get("id").getAsString();
87 /* Check the service features and set the flags */
88 if (nodeRoot.has("writeable")) {
89 Integer val = nodeRoot.get("writeable").getAsInt();
90 logger.trace("writable: {}", val);
93 if (nodeRoot.has("recordable")) {
94 Integer val = nodeRoot.get("recordable").getAsInt();
95 logger.trace("recordable: {}", val);
98 logger.trace("Typ: {}", type);
99 serviceObject = new KM200ServiceObject(id, type, readable, writeable, recordable, 0, null);
100 serviceObject.setJSONData(nodeRoot);
101 return serviceObject;
105 * This function determines the service's capabilities
107 public void determineServiceObject(KM200ServiceObject serviceObject, JsonObject nodeRoot) {
108 /* Check the service features and set the flags */
110 Object valObject = null;
111 JsonObject dataObject = serviceObject.getJSONData();
112 if (null != dataObject) {
113 switch (serviceObject.getServiceType()) {
114 case DATA_TYPE_STRING_VALUE: /*
115 * Check whether the type is a single value containing a
118 logger.trace("initDevice: type string value: {}", dataObject);
119 valObject = new String(nodeRoot.get("value").getAsString());
120 serviceObject.setValue(valObject);
121 if (nodeRoot.has("allowedValues")) {
122 List<String> valParas = new ArrayList<>();
123 JsonArray paras = nodeRoot.get("allowedValues").getAsJsonArray();
124 for (int i = 0; i < paras.size(); i++) {
125 String subJSON = paras.get(i).getAsString();
126 valParas.add(subJSON);
128 serviceObject.setValueParameter(valParas);
131 case DATA_TYPE_FLOAT_VALUE: /* Check whether the type is a single value containing a float value */
132 logger.trace("initDevice: type float value: {}", dataObject);
133 valObject = nodeRoot.get("value");
135 valObject = nodeRoot.get("value").getAsBigDecimal();
136 serviceObject.setValue(valObject);
137 } catch (NumberFormatException e) {
138 Double tmpObj = Double.NaN;
139 serviceObject.setValue(tmpObj);
141 if (nodeRoot.has("minValue") && nodeRoot.has("maxValue")) {
142 List<Object> valParas = new ArrayList<>();
143 valParas.add(nodeRoot.get("minValue").getAsBigDecimal());
144 valParas.add(nodeRoot.get("maxValue").getAsBigDecimal());
145 if (nodeRoot.has("unitOfMeasure")) {
146 valParas.add(nodeRoot.get("unitOfMeasure").getAsString());
148 serviceObject.setValueParameter(valParas);
151 case DATA_TYPE_SWITCH_PROGRAM: /* Check whether the type is a switchProgram */
152 logger.trace("initDevice: type switchProgram {}", dataObject);
153 KM200SwitchProgramServiceHandler sPService = new KM200SwitchProgramServiceHandler();
154 sPService.setMaxNbOfSwitchPoints(nodeRoot.get("maxNbOfSwitchPoints").getAsInt());
155 sPService.setMaxNbOfSwitchPointsPerDay(nodeRoot.get("maxNbOfSwitchPointsPerDay").getAsInt());
156 sPService.setSwitchPointTimeRaster(nodeRoot.get("switchPointTimeRaster").getAsInt());
157 JsonObject propObject = nodeRoot.get("setpointProperty").getAsJsonObject();
158 sPService.setSetpointProperty(propObject.get("id").getAsString());
159 serviceObject.setValueParameter(sPService);
160 serviceObject.setJSONData(dataObject);
161 remoteDevice.virtualList.add(serviceObject);
163 case DATA_TYPE_ERROR_LIST: /* Check whether the type is an errorList */
164 logger.trace("initDevice: type errorList: {}", dataObject);
165 KM200ErrorServiceHandler eService = new KM200ErrorServiceHandler();
166 eService.updateErrors(nodeRoot);
167 serviceObject.setValueParameter(eService);
168 serviceObject.setJSONData(dataObject);
169 remoteDevice.virtualList.add(serviceObject);
171 case DATA_TYPE_REF_ENUM: /* Check whether the type is a refEnum */
172 logger.trace("initDevice: type refEnum: {}", dataObject);
173 JsonArray refers = nodeRoot.get("references").getAsJsonArray();
174 for (int i = 0; i < refers.size(); i++) {
175 JsonObject subJSON = refers.get(i).getAsJsonObject();
176 id = subJSON.get("id").getAsString();
177 KM200ServiceHandler serviceHandler = new KM200ServiceHandler(id, serviceObject, remoteDevice);
178 serviceHandler.initObject();
181 case DATA_TYPE_MODULE_LIST: /* Check whether the type is a moduleList */
182 logger.trace("initDevice: type moduleList: {}", dataObject);
183 JsonArray vals = nodeRoot.get("values").getAsJsonArray();
184 for (int i = 0; i < vals.size(); i++) {
185 JsonObject subJSON = vals.get(i).getAsJsonObject();
186 id = subJSON.get("id").getAsString();
187 KM200ServiceHandler serviceHandler = new KM200ServiceHandler(id, serviceObject, remoteDevice);
188 serviceHandler.initObject();
191 case DATA_TYPE_Y_RECORDING: /* Check whether the type is a yRecording */
192 logger.trace("initDevice: type yRecording: {}", dataObject);
193 /* have to be completed */
195 case DATA_TYPE_SYSTEM_INFO: /* Check whether the type is a systeminfo */
196 logger.trace("initDevice: type systeminfo: {}", dataObject);
197 JsonArray sInfo = nodeRoot.get("values").getAsJsonArray();
198 serviceObject.setValue(sInfo);
199 /* have to be completed */
201 case DATA_TYPE_ARRAY_DATA:
202 logger.trace("initDevice: type arrayData: {}", dataObject);
203 serviceObject.setJSONData(dataObject);
204 /* have to be completed */
207 case DATA_TYPE_E_MONITORING_LIST:
208 logger.trace("initDevice: type eMonitoringList: {}", dataObject);
209 serviceObject.setJSONData(dataObject);
210 /* have to be completed */
212 case DATA_TYPE_PROTECTED:
213 logger.trace("initDevice: readonly");
214 serviceObject.setJSONData(dataObject);
216 default: /* Unknown type */
217 logger.info("initDevice: type: {} unknown for service: {} Data: {}", serviceObject.getServiceType(),
218 service, dataObject);
221 String[] servicePath = service.split("/");
222 if (null != parent) {
223 parent.serviceTreeMap.put(servicePath[servicePath.length - 1], serviceObject);
225 remoteDevice.serviceTreeMap.put(servicePath[servicePath.length - 1], serviceObject);