]> git.basschouten.com Git - openhab-addons.git/blob
f9d7c757ef14154b5192849084d6f7ad0cbfc972
[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         TouchWandUnitDataAlarmSensor touchWandUnitDataAlarmSensor = new TouchWandUnitDataAlarmSensor();
44
45         JsonObject jsonObject = json.getAsJsonObject();
46         touchWandUnitDataAlarmSensor.setId(jsonObject.get("id").getAsInt());
47         touchWandUnitDataAlarmSensor.setName(jsonObject.get("name").getAsString());
48         touchWandUnitDataAlarmSensor.setConnectivity(jsonObject.get("connectivity").getAsString());
49         touchWandUnitDataAlarmSensor.setType(jsonObject.get("type").getAsString());
50         touchWandUnitDataAlarmSensor.setHasBattery(jsonObject.get("hasBattery").getAsBoolean());
51         JsonElement powerMeterElement = jsonObject.get("hasPowerMeter");
52         if (powerMeterElement != null && !powerMeterElement.isJsonNull()) {
53             touchWandUnitDataAlarmSensor.setHasPowerMeter(powerMeterElement.getAsBoolean());
54         } else {
55             touchWandUnitDataAlarmSensor.setHasPowerMeter(false);
56         }
57
58         JsonElement status = jsonObject.get("status");
59         if (status != null && !status.isJsonNull()) { // Sometimes status is null
60             touchWandUnitDataAlarmSensor.setStatus(jsonObject.get("status").getAsString());
61         }
62
63         JsonObject currentStatusObj = builder.create().fromJson(jsonObject.get("currStatus").getAsJsonObject(),
64                 JsonObject.class);
65
66         if (currentStatusObj != null) {
67             TouchWandAlarmSensorCurrentStatus touchWandUnitDataAlarmSensorCurrentStatus = touchWandUnitDataAlarmSensor
68                     .getCurrStatus();
69
70             for (Entry<String, JsonElement> entry : currentStatusObj.entrySet()) {
71                 String key = entry.getKey();
72                 String[] splits = key.split("_"); // the key is xxxx_n where xxx is sensor type and n is
73                 String keyName = splits[0];
74                 int index = 0;
75
76                 if (splits.length > 1 && !splits[1].isEmpty()) {
77                     try {
78                         index = Integer.parseInt(splits[1]);
79                     } catch (final NumberFormatException e) {
80                         index = 0;
81                     }
82                 }
83
84                 switch (keyName) {
85                     case "batt":
86                         touchWandUnitDataAlarmSensorCurrentStatus.setBatt(entry.getValue().getAsInt());
87                         break;
88                     case "alarm":
89                         Alarm alarm = gson.fromJson(entry.getValue().getAsJsonObject(), Alarm.class);
90                         TouchWandAlarmSensorCurrentStatus.AlarmEvent alarmEvent = new TouchWandAlarmSensorCurrentStatus.AlarmEvent();
91                         if (alarm != null) {
92                             alarmEvent.alarm = alarm;
93                             alarmEvent.alarmType = index;
94                         }
95                         touchWandUnitDataAlarmSensor.getCurrStatus().getAlarmsStatus().add(alarmEvent);
96                         break;
97                     case "sensor":
98                         TouchWandAlarmSensorCurrentStatus.Sensor sensor = new TouchWandAlarmSensorCurrentStatus.Sensor();
99                         sensor.value = entry.getValue().getAsFloat();
100                         sensor.type = index;
101                         touchWandUnitDataAlarmSensor.getCurrStatus().getSensorsStatus().add(sensor);
102                         break;
103                     case "bsensor":
104                         BinarySensor bsensor = gson.fromJson(entry.getValue().getAsJsonObject(), BinarySensor.class);
105                         TouchWandAlarmSensorCurrentStatus.BinarySensorEvent bsensorevent = new TouchWandAlarmSensorCurrentStatus.BinarySensorEvent();
106                         if (bsensor != null) {
107                             bsensorevent.sensor = bsensor;
108                             bsensorevent.sensorType = index;
109                         }
110                         touchWandUnitDataAlarmSensor.getCurrStatus().getbSensorsStatus().add(bsensorevent);
111                         break;
112                     default:
113                         break;
114                 }
115             }
116         }
117         return touchWandUnitDataAlarmSensor;
118     }
119 }