]> git.basschouten.com Git - openhab-addons.git/blob
e409f3c695f2afa452afcd9ce04b15e5bcfefcbd
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2020 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
7  * This program and the accompanying materials are made available under the
8  * terms of the Eclipse Public License 2.0 which is available at
9  * http://www.eclipse.org/legal/epl-2.0
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13
14 package org.openhab.binding.touchwand.internal.dto;
15
16 import java.lang.reflect.Type;
17 import java.util.Map.Entry;
18
19 import org.openhab.binding.touchwand.internal.dto.TouchWandAlarmSensorCurrentStatus.Alarm;
20 import org.openhab.binding.touchwand.internal.dto.TouchWandAlarmSensorCurrentStatus.BinarySensor;
21
22 import com.google.gson.Gson;
23 import com.google.gson.GsonBuilder;
24 import com.google.gson.JsonDeserializationContext;
25 import com.google.gson.JsonDeserializer;
26 import com.google.gson.JsonElement;
27 import com.google.gson.JsonObject;
28 import com.google.gson.JsonParseException;
29
30 /**
31  * The {@link AlarmSensorUnitDataDeserializer} implements AlarmSensorUnitData unit
32  * Json De-serializer.
33  *
34  * @author Roie Geron - Initial contribution
35  */
36 public class AlarmSensorUnitDataDeserializer implements JsonDeserializer<TouchWandUnitDataAlarmSensor> {
37
38     static final Gson gson = new Gson();
39     static GsonBuilder builder = new GsonBuilder();
40
41     @Override
42     public TouchWandUnitDataAlarmSensor deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
43             throws JsonParseException {
44
45         TouchWandUnitDataAlarmSensor touchWandUnitDataAlarmSensor = new TouchWandUnitDataAlarmSensor();
46
47         JsonObject jsonObject = json.getAsJsonObject();
48         touchWandUnitDataAlarmSensor.setId(jsonObject.get("id").getAsInt());
49         touchWandUnitDataAlarmSensor.setName(jsonObject.get("name").getAsString());
50         touchWandUnitDataAlarmSensor.setConnectivity(jsonObject.get("connectivity").getAsString());
51         touchWandUnitDataAlarmSensor.setType(jsonObject.get("type").getAsString());
52         touchWandUnitDataAlarmSensor.setHasBattery(jsonObject.get("hasBattery").getAsBoolean());
53         JsonElement powerMeterElement = jsonObject.get("hasPowerMeter");
54         if (powerMeterElement != null && !powerMeterElement.isJsonNull()) {
55             touchWandUnitDataAlarmSensor.setHasPowerMeter(powerMeterElement.getAsBoolean());
56         } else {
57             touchWandUnitDataAlarmSensor.setHasPowerMeter(false);
58         }
59
60         JsonElement status = jsonObject.get("status");
61         if (status != null && !status.isJsonNull()) { // Sometimes status is null
62             touchWandUnitDataAlarmSensor.setStatus(jsonObject.get("status").getAsString());
63         }
64
65         JsonObject currentStatusObj = builder.create().fromJson(jsonObject.get("currStatus").getAsJsonObject(),
66                 JsonObject.class);
67
68         if (currentStatusObj != null) {
69
70             TouchWandAlarmSensorCurrentStatus touchWandUnitDataAlarmSensorCurrentStatus = touchWandUnitDataAlarmSensor
71                     .getCurrStatus();
72
73             for (Entry<String, JsonElement> entry : currentStatusObj.entrySet()) {
74                 String key = entry.getKey();
75                 String splits[] = key.split("_"); // the key is xxxx_n where xxx is sensor type and n is
76                 String keyName = splits[0];
77                 int index = 0;
78
79                 if (splits.length > 1 && !splits[1].isEmpty()) {
80                     try {
81                         index = Integer.parseInt(splits[1]);
82                     } catch (final NumberFormatException e) {
83                         index = 0;
84                     }
85                 }
86
87                 switch (keyName) {
88                     case "batt":
89                         touchWandUnitDataAlarmSensorCurrentStatus.setBatt(entry.getValue().getAsInt());
90                         break;
91                     case "alarm":
92                         Alarm alarm = gson.fromJson(entry.getValue().getAsJsonObject(), Alarm.class);
93                         TouchWandAlarmSensorCurrentStatus.AlarmEvent alarmEvent = new TouchWandAlarmSensorCurrentStatus.AlarmEvent();
94                         if (alarm != null) {
95                             alarmEvent.alarm = alarm;
96                             alarmEvent.alarmType = index;
97                         }
98                         touchWandUnitDataAlarmSensor.getCurrStatus().getAlarmsStatus().add(alarmEvent);
99                         break;
100                     case "sensor":
101                         TouchWandAlarmSensorCurrentStatus.Sensor sensor = new TouchWandAlarmSensorCurrentStatus.Sensor();
102                         sensor.value = entry.getValue().getAsFloat();
103                         sensor.type = index;
104                         touchWandUnitDataAlarmSensor.getCurrStatus().getSensorsStatus().add(sensor);
105                         break;
106                     case "bsensor":
107                         BinarySensor bsensor = gson.fromJson(entry.getValue().getAsJsonObject(), BinarySensor.class);
108                         TouchWandAlarmSensorCurrentStatus.BinarySensorEvent bsensorevent = new TouchWandAlarmSensorCurrentStatus.BinarySensorEvent();
109                         if (bsensor != null) {
110                             bsensorevent.sensor = bsensor;
111                             bsensorevent.sensorType = index;
112                         }
113                         touchWandUnitDataAlarmSensor.getCurrStatus().getbSensorsStatus().add(bsensorevent);
114                         break;
115                     default:
116                         break;
117                 }
118             }
119         }
120         return touchWandUnitDataAlarmSensor;
121     }
122 }