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