HTTPS (almost) everywhere.
[metze/wireshark/wip.git] / epan / dissectors / packet-zbee-zcl-hvac.c
1 /* packet-zbee-zcl-hvac.c
2  * Dissector routines for the ZigBee ZCL HVAC clusters
3  * By Aditya Jain <aditya.jain@samsung.com>
4  *
5  * Wireshark - Network traffic analyzer
6  * By Gerald Combs <gerald@wireshark.org>
7  * Copyright 1998 Gerald Combs
8  *
9  * SPDX-License-Identifier: GPL-2.0-or-later
10  */
11
12 /*  Include Files */
13 #include "config.h"
14
15 #include <epan/packet.h>
16 #include <epan/to_str.h>
17
18 #include "packet-zbee.h"
19 #include "packet-zbee-aps.h"
20 #include "packet-zbee-zcl.h"
21
22 /* ########################################################################## */
23 /* #### (0x0200) PUMP CONFIGURATION AND CONTROL CLUSTER ##################### */
24 /* ########################################################################## */
25
26 /*************************/
27 /* Defines               */
28 /*************************/
29
30 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_NUM_ETT                                    3
31
32 /*Attributes*/
33 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_PRESSURE                       0x0000  /* Maximum Pressure */
34 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_SPEED                          0x0001  /* Maximum Speed */
35 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_FLOW                           0x0002  /* Maximum Flow */
36 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MIN_CONST_PRESSURE                 0x0003  /* Minimum Constant Pressure */
37 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_CONST_PRESSURE                 0x0004  /* Maximum Constant Pressure */
38 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MIN_COMP_PRESSURE                  0x0005  /* Minimum Compensated Pressure */
39 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_POWER_MAX_COMP_PRESSURE            0x0006  /* Maximum Compensated Pressure */
40 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MIN_CONST_SPEED                    0x0007  /* Minimum Constant Speed */
41 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_CONST_SPEED                    0x0008  /* Maximum Constant Speed */
42 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MIN_CONST_FLOW                     0x0009  /* Minimum Constant Flow */
43 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_CONST_FLOW                     0x000a  /* Maximum Constant Flow */
44 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MIN_CONST_TEMP                     0x000b  /* Minimum Constant Temperature */
45 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_CONST_TEMP                     0x000c  /* Maximum Constant Temperature */
46 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_PUMP_STATUS                        0x0010  /* Pump Status */
47 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_EFFECTIVE_OPR_MODE                 0x0011  /* Effective Operation Mode */
48 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_EFFECTIVE_CTRL_MODE                0x0012  /* Effective Control Mode */
49 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_CAPACITY                           0x0013  /* Capacity */
50 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_SPEED                              0x0014  /* Speed */
51 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_LIFETIME_RUNNING_HOURS             0x0015  /* Lifetime Running Hours */
52 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_POWER                              0x0016  /* Power */
53 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_LIFETIME_ENERGY_CONS               0x0017  /* Lifetime Energy Consumed */
54 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_OPR_MODE                           0x0020  /* Operation Mode */
55 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_CTRL_MODE                          0x0021  /* Control Mode */
56 #define ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_ALARM_MASK                         0x0022  /* Alarm Mask */
57
58 /*Server commands received - none*/
59
60 /*Server commands generated - none*/
61
62 /*Pump Status Mask Values*/
63 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_STATUS_DEVICE_FAULT                        0x0001    /* Device Fault */
64 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_STATUS_SUPPLY_FAULT                        0x0002    /* Supply Fault */
65 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_STATUS_SPEED_LOW                           0x0004    /* Speed Low */
66 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_STATUS_SPEED_HIGH                          0x0008    /* Speed High */
67 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_STATUS_LOCAL_OVERRIDE                      0x0010    /* Local Override */
68 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_STATUS_RUNNING                             0x0020    /* Running */
69 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_STATUS_REMOTE_PRESSURE                     0x0040    /* Remote Pressure */
70 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_STATUS_REMOTE_FLOW                         0x0080    /* Remote Flow */
71 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_STATUS_REMOTE_TEMP                         0x0100    /* Remote Temperature */
72
73 /*Alarm Mask Values*/
74 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_VOLTAGE_TOO_LOW                      0x0001    /* Supply voltage too low */
75 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_VOLTAGE_TOO_HIGH                     0x0002    /* Supply voltage too high */
76 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_PWR_MISSING_PHASE                    0x0004    /* Power missing phase */
77 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_PRESSURE_TOO_LOW                     0x0008    /* System pressure too low */
78 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_PRESSURE_TOO_HIGH                    0x0010    /* System pressure too high */
79 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_DRY_RUNNING                          0x0020    /* Dry running */
80 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_MTR_TEMP_TOO_HIGH                    0x0040    /* Motor temperature too high */
81 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_PUMP_MTR_FATAL_FAILURE               0x0080    /* Pump motor has fatal failure */
82 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_ELEC_TEMP_TOO_HIGH                   0x0100    /* Electronic temperature too high */
83 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_PUMP_BLOCK                           0x0200    /* Pump blocked */
84 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_SENSOR_FAILURE                       0x0400    /* Sensor failure */
85 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_ELEC_NON_FATAL_FAILURE               0x0800    /* Electronic non-fatal failure */
86 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_ELEC_FATAL_FAILURE                   0x1000    /* Electronic fatal failure */
87 #define ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_GENERAL_FAULT                        0x2000    /* Genral fault */
88
89 /*************************/
90 /* Function Declarations */
91 /*************************/
92
93 void proto_register_zbee_zcl_pump_config_control(void);
94 void proto_reg_handoff_zbee_zcl_pump_config_control(void);
95
96 /* Command Dissector Helpers */
97 static void dissect_zcl_pump_config_control_attr_data      (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr);
98
99 /* Private functions prototype */
100
101 /*************************/
102 /* Global Variables      */
103 /*************************/
104 /* Initialize the protocol and registered fields */
105 static int proto_zbee_zcl_pump_config_control = -1;
106
107 static int hf_zbee_zcl_pump_config_control_attr_id = -1;
108 static int hf_zbee_zcl_pump_config_control_attr_eff_opr_mode = -1;
109 static int hf_zbee_zcl_pump_config_control_attr_opr_mode = -1;
110 static int hf_zbee_zcl_pump_config_control_attr_eff_ctrl_mode = -1;
111 static int hf_zbee_zcl_pump_config_control_attr_ctrl_mode = -1;
112 static int hf_zbee_zcl_pump_config_control_status = -1;
113 static int hf_zbee_zcl_pump_config_control_status_device_fault = -1;
114 static int hf_zbee_zcl_pump_config_control_status_supply_fault = -1;
115 static int hf_zbee_zcl_pump_config_control_status_speed_low = -1;
116 static int hf_zbee_zcl_pump_config_control_status_speed_high = -1;
117 static int hf_zbee_zcl_pump_config_control_status_local_override = -1;
118 static int hf_zbee_zcl_pump_config_control_status_running = -1;
119 static int hf_zbee_zcl_pump_config_control_status_rem_pressure = -1;
120 static int hf_zbee_zcl_pump_config_control_status_rem_flow = -1;
121 static int hf_zbee_zcl_pump_config_control_status_rem_temp = -1;
122 static int hf_zbee_zcl_pump_config_control_alarm = -1;
123 static int hf_zbee_zcl_pump_config_control_alarm_volt_too_low = -1;
124 static int hf_zbee_zcl_pump_config_control_alarm_volt_too_high = -1;
125 static int hf_zbee_zcl_pump_config_control_alarm_pwr_missing_phase = -1;
126 static int hf_zbee_zcl_pump_config_control_alarm_press_too_low = -1;
127 static int hf_zbee_zcl_pump_config_control_alarm_press_too_high = -1;
128 static int hf_zbee_zcl_pump_config_control_alarm_dry_running = -1;
129 static int hf_zbee_zcl_pump_config_control_alarm_mtr_temp_too_high = -1;
130 static int hf_zbee_zcl_pump_config_control_alarm_pump_mtr_fatal_fail = -1;
131 static int hf_zbee_zcl_pump_config_control_alarm_elec_temp_too_high = -1;
132 static int hf_zbee_zcl_pump_config_control_alarm_pump_block = -1;
133 static int hf_zbee_zcl_pump_config_control_alarm_sensor_fail = -1;
134 static int hf_zbee_zcl_pump_config_control_alarm_elec_non_fatal_fail = -1;
135 static int hf_zbee_zcl_pump_config_control_alarm_fatal_fail = -1;
136 static int hf_zbee_zcl_pump_config_control_alarm_gen_fault = -1;
137
138 /* Initialize the subtree pointers */
139 static gint ett_zbee_zcl_pump_config_control = -1;
140 static gint ett_zbee_zcl_pump_config_control_status = -1;
141 static gint ett_zbee_zcl_pump_config_control_alarm = -1;
142
143 /* Attributes */
144 static const value_string zbee_zcl_pump_config_control_attr_names[] = {
145     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_PRESSURE,                            "Maximum Pressure" },
146     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_SPEED,                               "Maximum Speed" },
147     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_FLOW,                                "Maximum Flow" },
148     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MIN_CONST_PRESSURE,                      "Minimum Constant Pressure" },
149     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_CONST_PRESSURE,                      "Maximum Constant Pressure" },
150     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MIN_COMP_PRESSURE,                       "Minimum Compensated Pressure" },
151     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_POWER_MAX_COMP_PRESSURE,                 "Maximum Compensated Pressure" },
152     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MIN_CONST_SPEED,                         "Minimum Constant Speed" },
153     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_CONST_SPEED,                         "Maximum Constant Speed" },
154     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MIN_CONST_FLOW,                          "Minimum Constant Flow" },
155     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_CONST_FLOW,                          "Maximum Constant Flow" },
156     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MIN_CONST_TEMP,                          "Minimum Constant Temperature" },
157     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_CONST_TEMP,                          "Maximum Constant Temperature" },
158     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_PUMP_STATUS,                             "Pump Status" },
159     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_EFFECTIVE_OPR_MODE,                      "Effective Operation Mode" },
160     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_EFFECTIVE_CTRL_MODE,                     "Effective Control Mode" },
161     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_CAPACITY,                                "Capacity" },
162     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_SPEED,                                   "Speed" },
163     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_LIFETIME_RUNNING_HOURS,                  "Lifetime Running Hours" },
164     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_POWER,                                   "Power" },
165     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_LIFETIME_ENERGY_CONS,                    "Lifetime Energy Consumed" },
166     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_OPR_MODE,                                "Operation Mode" },
167     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_CTRL_MODE,                               "Control Mode" },
168     { ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_ALARM_MASK,                              "Alarm Mask" },
169     { 0, NULL }
170 };
171
172 /*Operation Mode Values*/
173 static const value_string zbee_zcl_pump_config_control_operation_mode_names[] = {
174     {0, "Noramal"},
175     {1, "Minimum"},
176     {2, "Maximum"},
177     {3, "Local"},
178     {0, NULL}
179 };
180
181 /*Control Mode Values*/
182 static const value_string zbee_zcl_pump_config_control_control_mode_names[] = {
183     {0, "Constant Speed"},
184     {1, "Constant Pressure"},
185     {2, "proportional Pressure"},
186     {3, "Constant Flow"},
187     {4, "Reserved"},
188     {5, "Constat Temperature"},
189     {6, "Reserved"},
190     {7, "Automatic"},
191     {0, NULL}
192 };
193
194 /*************************/
195 /* Function Bodies       */
196 /*************************/
197
198 /**
199  *ZigBee ZCL Pump Configuration and Control cluster dissector for wireshark.
200  *
201  *@param tvb pointer to buffer containing raw packet.
202  *@param pinfo pointer to packet information fields
203  *@param tree pointer to data tree Wireshark uses to display packet.
204 */
205
206 static int
207 dissect_zbee_zcl_pump_config_control(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void* data _U_)
208 {
209     return tvb_captured_length(tvb);
210 } /*dissect_zbee_zcl_pump_config_control*/
211
212
213 /**
214  *This function is called by ZCL foundation dissector in order to decode
215  *
216  *@param tree pointer to data tree Wireshark uses to display packet.
217  *@param tvb pointer to buffer containing raw packet.
218  *@param offset pointer to buffer offset
219  *@param attr_id attribute identifier
220  *@param data_type attribute data type
221  *@param client_attr ZCL client
222 */
223 void
224 dissect_zcl_pump_config_control_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr)
225 {
226     static const int * pump_status[] = {
227         &hf_zbee_zcl_pump_config_control_status_device_fault,
228         &hf_zbee_zcl_pump_config_control_status_supply_fault,
229         &hf_zbee_zcl_pump_config_control_status_speed_low,
230         &hf_zbee_zcl_pump_config_control_status_speed_high,
231         &hf_zbee_zcl_pump_config_control_status_local_override,
232         &hf_zbee_zcl_pump_config_control_status_running,
233         &hf_zbee_zcl_pump_config_control_status_rem_pressure,
234         &hf_zbee_zcl_pump_config_control_status_rem_flow,
235         &hf_zbee_zcl_pump_config_control_status_rem_temp,
236         NULL
237     };
238
239     static const int * alarm_mask[] = {
240         &hf_zbee_zcl_pump_config_control_alarm_volt_too_low,
241         &hf_zbee_zcl_pump_config_control_alarm_volt_too_high,
242         &hf_zbee_zcl_pump_config_control_alarm_pwr_missing_phase,
243         &hf_zbee_zcl_pump_config_control_alarm_press_too_low,
244         &hf_zbee_zcl_pump_config_control_alarm_press_too_high,
245         &hf_zbee_zcl_pump_config_control_alarm_dry_running,
246         &hf_zbee_zcl_pump_config_control_alarm_mtr_temp_too_high,
247         &hf_zbee_zcl_pump_config_control_alarm_pump_mtr_fatal_fail,
248         &hf_zbee_zcl_pump_config_control_alarm_elec_temp_too_high,
249         &hf_zbee_zcl_pump_config_control_alarm_pump_block,
250         &hf_zbee_zcl_pump_config_control_alarm_sensor_fail,
251         &hf_zbee_zcl_pump_config_control_alarm_elec_non_fatal_fail,
252         &hf_zbee_zcl_pump_config_control_alarm_fatal_fail,
253         &hf_zbee_zcl_pump_config_control_alarm_gen_fault,
254         NULL
255     };
256
257     /* Dissect attribute data type and data */
258     switch (attr_id) {
259
260         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_EFFECTIVE_OPR_MODE:
261             proto_tree_add_item(tree, hf_zbee_zcl_pump_config_control_attr_eff_opr_mode, tvb, *offset, 1, ENC_NA);
262             *offset += 1;
263             break;
264
265         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_OPR_MODE:
266             proto_tree_add_item(tree, hf_zbee_zcl_pump_config_control_attr_opr_mode, tvb, *offset, 1, ENC_NA);
267             *offset += 1;
268             break;
269
270         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_EFFECTIVE_CTRL_MODE:
271             proto_tree_add_item(tree, hf_zbee_zcl_pump_config_control_attr_eff_ctrl_mode, tvb, *offset, 1, ENC_NA);
272             *offset += 1;
273             break;
274
275         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_CTRL_MODE:
276             proto_tree_add_item(tree, hf_zbee_zcl_pump_config_control_attr_ctrl_mode, tvb, *offset, 1, ENC_NA);
277             *offset += 1;
278             break;
279
280         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_PUMP_STATUS:
281             proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_pump_config_control_status, ett_zbee_zcl_pump_config_control_status, pump_status, ENC_LITTLE_ENDIAN);
282             *offset += 2;
283             break;
284
285         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_ALARM_MASK:
286             proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_pump_config_control_alarm, ett_zbee_zcl_pump_config_control_alarm, alarm_mask, ENC_LITTLE_ENDIAN);
287             *offset += 2;
288             break;
289
290         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_PRESSURE:
291         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_SPEED:
292         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_FLOW:
293         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MIN_CONST_PRESSURE:
294         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_CONST_PRESSURE:
295         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MIN_COMP_PRESSURE:
296         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_POWER_MAX_COMP_PRESSURE:
297         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MIN_CONST_SPEED:
298         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_CONST_SPEED:
299         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MIN_CONST_FLOW:
300         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_CONST_FLOW:
301         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MIN_CONST_TEMP:
302         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_MAX_CONST_TEMP:
303         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_CAPACITY:
304         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_SPEED:
305         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_LIFETIME_RUNNING_HOURS:
306         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_POWER:
307         case ZBEE_ZCL_ATTR_ID_PUMP_CONFIG_CONTROL_LIFETIME_ENERGY_CONS:
308         default:
309             dissect_zcl_attr_data(tvb, tree, offset, data_type, client_attr);
310             break;
311     }
312
313 } /*dissect_zcl_pump_config_control_attr_data*/
314
315
316 /**
317  *ZigBee ZCL Pump Configuration and Control cluster protocol registration routine.
318  *
319 */
320 void
321 proto_register_zbee_zcl_pump_config_control(void)
322 {
323     /* Setup list of header fields */
324     static hf_register_info hf[] = {
325
326         { &hf_zbee_zcl_pump_config_control_attr_id,
327             { "Attribute", "zbee_zcl_hvac.pump_config_control.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_pump_config_control_attr_names),
328             0x00, NULL, HFILL } },
329
330         { &hf_zbee_zcl_pump_config_control_attr_eff_opr_mode,
331             { "Effective Operation Mode", "zbee_zcl_hvac.pump_config_control.attr.effective_opr_mode", FT_UINT8, BASE_DEC, VALS(zbee_zcl_pump_config_control_operation_mode_names),
332             0x00, NULL, HFILL } },
333
334         { &hf_zbee_zcl_pump_config_control_attr_opr_mode,
335             { "Operation Mode", "zbee_zcl_hvac.pump_config_control.attr.opr_mode", FT_UINT8, BASE_DEC, VALS(zbee_zcl_pump_config_control_operation_mode_names),
336             0x00, NULL, HFILL } },
337
338         { &hf_zbee_zcl_pump_config_control_attr_eff_ctrl_mode,
339             { "Effective Control Mode", "zbee_zcl_hvac.pump_config_control.attr.ctrl_mode", FT_UINT8, BASE_DEC, VALS(zbee_zcl_pump_config_control_control_mode_names),
340             0x00, NULL, HFILL } },
341
342         { &hf_zbee_zcl_pump_config_control_attr_ctrl_mode,
343             { "Control Mode", "zbee_zcl_hvac.pump_config_control.attr.ctrl_mode", FT_UINT8, BASE_DEC, VALS(zbee_zcl_pump_config_control_control_mode_names),
344             0x00, NULL, HFILL } },
345
346         /* start Pump Status fields */
347         { &hf_zbee_zcl_pump_config_control_status,
348             { "Pump Status", "zbee_zcl_hvac.pump_config_control.attr.status", FT_UINT16, BASE_HEX, NULL,
349             0x00, NULL, HFILL } },
350
351         { &hf_zbee_zcl_pump_config_control_status_device_fault,
352             { "Device Fault", "zbee_zcl_hvac.pump_config_control.attr.status.device_fault", FT_BOOLEAN, 8, TFS(&tfs_no_yes),
353             ZBEE_ZCL_PUMP_CONFIG_CONTROL_STATUS_DEVICE_FAULT, NULL, HFILL } },
354
355         { &hf_zbee_zcl_pump_config_control_status_supply_fault,
356             { "Supply Fault", "zbee_zcl_hvac.pump_config_control.attr.status.supply_fault", FT_BOOLEAN, 8, TFS(&tfs_no_yes),
357             ZBEE_ZCL_PUMP_CONFIG_CONTROL_STATUS_SUPPLY_FAULT, NULL, HFILL } },
358
359         { &hf_zbee_zcl_pump_config_control_status_speed_low,
360             { "Speed Low", "zbee_zcl_hvac.pump_config_control.attr.status.speed_low", FT_BOOLEAN, 8, TFS(&tfs_no_yes),
361             ZBEE_ZCL_PUMP_CONFIG_CONTROL_STATUS_SPEED_LOW, NULL, HFILL } },
362
363         { &hf_zbee_zcl_pump_config_control_status_speed_high,
364             { "Speed High", "zbee_zcl_hvac.pump_config_control.attr.status.speed_high", FT_BOOLEAN, 8, TFS(&tfs_no_yes),
365             ZBEE_ZCL_PUMP_CONFIG_CONTROL_STATUS_SPEED_HIGH, NULL, HFILL } },
366
367         { &hf_zbee_zcl_pump_config_control_status_local_override,
368             { "Local Override", "zbee_zcl_hvac.pump_config_control.attr.status.local_override", FT_BOOLEAN, 8, TFS(&tfs_no_yes),
369             ZBEE_ZCL_PUMP_CONFIG_CONTROL_STATUS_LOCAL_OVERRIDE, NULL, HFILL } },
370
371         { &hf_zbee_zcl_pump_config_control_status_running,
372             { "Running", "zbee_zcl_hvac.pump_config_control.attr.status.running", FT_BOOLEAN, 8, TFS(&tfs_no_yes),
373             ZBEE_ZCL_PUMP_CONFIG_CONTROL_STATUS_RUNNING, NULL, HFILL } },
374
375         { &hf_zbee_zcl_pump_config_control_status_rem_pressure,
376             { "Remote Pressure", "zbee_zcl_hvac.pump_config_control.attr.status.rem_pressure", FT_BOOLEAN, 8, TFS(&tfs_no_yes),
377             ZBEE_ZCL_PUMP_CONFIG_CONTROL_STATUS_REMOTE_PRESSURE, NULL, HFILL } },
378
379         { &hf_zbee_zcl_pump_config_control_status_rem_flow,
380             { "Remote Flow", "zbee_zcl_hvac.pump_config_control.attr.status.rem_flow", FT_BOOLEAN, 8, TFS(&tfs_no_yes),
381             ZBEE_ZCL_PUMP_CONFIG_CONTROL_STATUS_REMOTE_FLOW, NULL, HFILL } },
382
383         { &hf_zbee_zcl_pump_config_control_status_rem_temp,
384             { "Remote Temperature", "zbee_zcl_hvac.pump_config_control.attr.status.rem_temp", FT_BOOLEAN, 8, TFS(&tfs_no_yes),
385             ZBEE_ZCL_PUMP_CONFIG_CONTROL_STATUS_REMOTE_TEMP, NULL, HFILL } },
386         /* end Pump Status fields */
387
388         /*start Alarm Mask fields*/
389         { &hf_zbee_zcl_pump_config_control_alarm,
390             { "Alarm Mask", "zbee_zcl_hvac.pump_config_control.attr.alarm", FT_UINT16, BASE_HEX, NULL,
391             0x00, NULL, HFILL } },
392
393         { &hf_zbee_zcl_pump_config_control_alarm_volt_too_low,
394             { "Supply voltage too low", "zbee_zcl_hvac.pump_config_control.attr.alarm.volt_too_low", FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled),
395             ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_VOLTAGE_TOO_LOW, NULL, HFILL } },
396
397         { &hf_zbee_zcl_pump_config_control_alarm_volt_too_high,
398             { "Supply voltage too high", "zbee_zcl_hvac.pump_config_control.attr.alarm.volt_too_high", FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled),
399             ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_VOLTAGE_TOO_HIGH, NULL, HFILL } },
400
401         { &hf_zbee_zcl_pump_config_control_alarm_pwr_missing_phase,
402             { "Power missing phase", "zbee_zcl_hvac.pump_config_control.attr.alarm.pwr_missing_phase", FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled),
403             ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_PWR_MISSING_PHASE, NULL, HFILL } },
404
405         { &hf_zbee_zcl_pump_config_control_alarm_press_too_low,
406             { "System pressure too low", "zbee_zcl_hvac.pump_config_control.attr.alarm.press_too_low", FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled),
407             ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_PRESSURE_TOO_LOW, NULL, HFILL } },
408
409         { &hf_zbee_zcl_pump_config_control_alarm_press_too_high,
410             { "System pressure too high", "zbee_zcl_hvac.pump_config_control.attr.alarm.press_too_high", FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled),
411             ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_PRESSURE_TOO_HIGH, NULL, HFILL } },
412
413         { &hf_zbee_zcl_pump_config_control_alarm_dry_running,
414             { "Dry running", "zbee_zcl_hvac.pump_config_control.attr.alarm.dry_running", FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled),
415             ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_DRY_RUNNING, NULL, HFILL } },
416
417         { &hf_zbee_zcl_pump_config_control_alarm_mtr_temp_too_high,
418             { "Motor temperature too high", "zbee_zcl_hvac.pump_config_control.attr.alarm.mtr_temp_too_high", FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled),
419             ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_MTR_TEMP_TOO_HIGH, NULL, HFILL } },
420
421         { &hf_zbee_zcl_pump_config_control_alarm_pump_mtr_fatal_fail,
422             { "Pump motor has fatal failure", "zbee_zcl_hvac.pump_config_control.attr.alarm.mtr_fatal_fail", FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled),
423             ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_PUMP_MTR_FATAL_FAILURE, NULL, HFILL } },
424
425         { &hf_zbee_zcl_pump_config_control_alarm_elec_temp_too_high,
426             { "Electronic temperature too high", "zbee_zcl_hvac.pump_config_control.attr.alarm.elec_temp_too_high", FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled),
427             ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_ELEC_TEMP_TOO_HIGH, NULL, HFILL } },
428
429         { &hf_zbee_zcl_pump_config_control_alarm_pump_block,
430             { "Pump blocked", "zbee_zcl_hvac.pump_config_control.attr.alarm.pump_block", FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled),
431             ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_PUMP_BLOCK, NULL, HFILL } },
432
433         { &hf_zbee_zcl_pump_config_control_alarm_sensor_fail,
434             { "Sensor failure", "zbee_zcl_hvac.pump_config_control.attr.alarm.sensor_fail", FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled),
435             ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_SENSOR_FAILURE, NULL, HFILL } },
436
437         { &hf_zbee_zcl_pump_config_control_alarm_elec_non_fatal_fail,
438             { "Electronic non-fatal failure", "zbee_zcl_hvac.pump_config_control.attr.alarm.elec_non_fatal_fail", FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled),
439             ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_ELEC_NON_FATAL_FAILURE, NULL, HFILL } },
440
441         { &hf_zbee_zcl_pump_config_control_alarm_fatal_fail,
442             { "Electronic fatal failure", "zbee_zcl_hvac.pump_config_control.attr.alarm.elec_fatal_fail", FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled),
443             ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_ELEC_FATAL_FAILURE, NULL, HFILL } },
444
445         { &hf_zbee_zcl_pump_config_control_alarm_gen_fault,
446             { "Genral fault", "zbee_zcl_hvac.pump_config_control.attr.alarm.gen_fault", FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled),
447             ZBEE_ZCL_PUMP_CONFIG_CONTROL_ALARM_GENERAL_FAULT, NULL, HFILL } }
448         /* end Alarm Mask fields */
449     };
450
451     /* ZCL Pump Configuration and Control subtrees */
452     static gint *ett[ZBEE_ZCL_PUMP_CONFIG_CONTROL_NUM_ETT];
453
454     ett[0] = &ett_zbee_zcl_pump_config_control;
455     ett[1] = &ett_zbee_zcl_pump_config_control_status;
456     ett[2] = &ett_zbee_zcl_pump_config_control_alarm;
457
458     /* Register the ZigBee ZCL Pump Configuration and Control cluster protocol name and description */
459     proto_zbee_zcl_pump_config_control = proto_register_protocol("ZigBee ZCL Pump Configuration and Control", "ZCL Pump Configuration and Control", ZBEE_PROTOABBREV_ZCL_PUMP_CONFIG_CTRL);
460     proto_register_field_array(proto_zbee_zcl_pump_config_control, hf, array_length(hf));
461     proto_register_subtree_array(ett, array_length(ett));
462
463     /* Register the ZigBee ZCL Pump Configuration and Control dissector. */
464     register_dissector(ZBEE_PROTOABBREV_ZCL_PUMP_CONFIG_CTRL, dissect_zbee_zcl_pump_config_control, proto_zbee_zcl_pump_config_control);
465 } /*proto_register_zbee_zcl_pump_config_control*/
466
467 /**
468  *Hands off the ZCL Pump Configuration and Control dissector.
469  *
470 */
471 void
472 proto_reg_handoff_zbee_zcl_pump_config_control(void)
473 {
474     zbee_zcl_init_cluster(  ZBEE_PROTOABBREV_ZCL_PUMP_CONFIG_CTRL,
475                             proto_zbee_zcl_pump_config_control,
476                             ett_zbee_zcl_pump_config_control,
477                             ZBEE_ZCL_CID_PUMP_CONFIG_CONTROL,
478                             ZBEE_MFG_CODE_NONE,
479                             hf_zbee_zcl_pump_config_control_attr_id,
480                             hf_zbee_zcl_pump_config_control_attr_id,
481                             -1, -1,
482                             (zbee_zcl_fn_attr_data)dissect_zcl_pump_config_control_attr_data
483                          );
484 } /*proto_reg_handoff_zbee_zcl_pump_config_control*/
485
486
487 /* ########################################################################## */
488 /* #### (0x0202) FAN CONTROL CLUSTER ######################################## */
489 /* ########################################################################## */
490
491 /*************************/
492 /* Defines               */
493 /*************************/
494
495 #define ZBEE_ZCL_FAN_CONTROL_NUM_ETT                          1
496
497 /*Attributes*/
498 #define ZBEE_ZCL_ATTR_ID_FAN_CONTROL_FAN_MODE                 0x0000  /* Fan Mode */
499 #define ZBEE_ZCL_ATTR_ID_FAN_CONTROL_FAN_MODE_SEQUENCE        0x0001  /* Fan Mode Sequence */
500
501 /*Server commands received - none*/
502
503 /*Server commands generated - none*/
504
505 /*************************/
506 /* Function Declarations */
507 /*************************/
508
509 void proto_register_zbee_zcl_fan_control(void);
510 void proto_reg_handoff_zbee_zcl_fan_control(void);
511
512 /* Command Dissector Helpers */
513 static void dissect_zcl_fan_control_attr_data      (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr);
514
515 /* Private functions prototype */
516
517 /*************************/
518 /* Global Variables      */
519 /*************************/
520 /* Initialize the protocol and registered fields */
521 static int proto_zbee_zcl_fan_control = -1;
522
523 static int hf_zbee_zcl_fan_control_attr_id = -1;
524 static int hf_zbee_zcl_fan_control_attr_fan_mode = -1;
525 static int hf_zbee_zcl_fan_control_attr_fan_mode_seq = -1;
526
527 /* Initialize the subtree pointers */
528 static gint ett_zbee_zcl_fan_control = -1;
529
530 /* Attributes */
531 static const value_string zbee_zcl_fan_control_attr_names[] = {
532     { ZBEE_ZCL_ATTR_ID_FAN_CONTROL_FAN_MODE,                "Fan Mode" },
533     { ZBEE_ZCL_ATTR_ID_FAN_CONTROL_FAN_MODE_SEQUENCE,       "Fan Mode Sequence" },
534     { 0, NULL }
535 };
536
537 /*Fan Mode Sequence Values*/
538 static const value_string zbee_zcl_fan_control_fan_mode_seq_names[] = {
539     { 0x00,     "Low/Med/High" },
540     { 0x01,     "Low/High" },
541     { 0x02,     "Low/Med/High/Auto" },
542     { 0x03,     "Low/High/Auto" },
543     { 0x04,     "On/Auto" },
544     { 0,        NULL}
545 };
546
547 /*Fan Mode Values*/
548 static const value_string zbee_zcl_fan_control_fan_mode_names[] = {
549     { 0x00,     "Off" },
550     { 0x01,     "Low" },
551     { 0x02,     "Medium" },
552     { 0x03,     "High" },
553     { 0x04,     "On" },
554     { 0x05,     "Auto" },
555     { 0x06,     "Smart" },
556     { 0,        NULL}
557 };
558
559 /*************************/
560 /* Function Bodies       */
561 /*************************/
562
563 /**
564  *ZigBee ZCL Fan Control cluster dissector for wireshark.
565  *
566  *@param tvb pointer to buffer containing raw packet.
567  *@param pinfo pointer to packet information fields
568  *@param tree pointer to data tree Wireshark uses to display packet.
569 */
570
571 static int
572 dissect_zbee_zcl_fan_control(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void* data _U_)
573 {
574     return tvb_captured_length(tvb);
575 } /*dissect_zbee_zcl_fan_control*/
576
577
578 /**
579  *This function is called by ZCL foundation dissector in order to decode
580  *
581  *@param tree pointer to data tree Wireshark uses to display packet.
582  *@param tvb pointer to buffer containing raw packet.
583  *@param offset pointer to buffer offset
584  *@param attr_id attribute identifier
585  *@param data_type attribute data type
586  *@param client_attr ZCL client
587 */
588 void
589 dissect_zcl_fan_control_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr)
590 {
591     /* Dissect attribute data type and data */
592     switch (attr_id) {
593
594         case ZBEE_ZCL_ATTR_ID_FAN_CONTROL_FAN_MODE:
595             proto_tree_add_item(tree, hf_zbee_zcl_fan_control_attr_fan_mode, tvb, *offset, 1, ENC_NA);
596             *offset += 1;
597             break;
598
599         case ZBEE_ZCL_ATTR_ID_FAN_CONTROL_FAN_MODE_SEQUENCE:
600             proto_tree_add_item(tree, hf_zbee_zcl_fan_control_attr_fan_mode_seq, tvb, *offset, 1, ENC_NA);
601             *offset += 1;
602             break;
603
604         default:
605             dissect_zcl_attr_data(tvb, tree, offset, data_type, client_attr);
606             break;
607     }
608
609 } /*dissect_zcl_fan_control_attr_data*/
610
611
612 /**
613  *ZigBee ZCL Fan Control cluster protocol registration routine.
614  *
615 */
616 void
617 proto_register_zbee_zcl_fan_control(void)
618 {
619     /* Setup list of header fields */
620     static hf_register_info hf[] = {
621
622         { &hf_zbee_zcl_fan_control_attr_id,
623             { "Attribute", "zbee_zcl_hvac.fan_control.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_fan_control_attr_names),
624             0x00, NULL, HFILL } },
625
626         { &hf_zbee_zcl_fan_control_attr_fan_mode,
627             { "Fan Mode", "zbee_zcl_hvac.fan_control.attr.fan_mode", FT_UINT8, BASE_HEX, VALS(zbee_zcl_fan_control_fan_mode_names),
628             0x00, NULL, HFILL } },
629
630         { &hf_zbee_zcl_fan_control_attr_fan_mode_seq,
631             { "Fan Mode Sequence", "zbee_zcl_hvac.fan_control.attr.fan_mode_seq", FT_UINT8, BASE_HEX, VALS(zbee_zcl_fan_control_fan_mode_seq_names),
632             0x00, NULL, HFILL } }
633     };
634
635     /* ZCL Fan Control subtrees */
636     static gint *ett[ZBEE_ZCL_FAN_CONTROL_NUM_ETT];
637
638     ett[0] = &ett_zbee_zcl_fan_control;
639
640     /* Register the ZigBee ZCL Fan Control cluster protocol name and description */
641     proto_zbee_zcl_fan_control = proto_register_protocol("ZigBee ZCL Fan Control", "ZCL Fan Control", ZBEE_PROTOABBREV_ZCL_FAN_CONTROL);
642     proto_register_field_array(proto_zbee_zcl_fan_control, hf, array_length(hf));
643     proto_register_subtree_array(ett, array_length(ett));
644
645     /* Register the ZigBee ZCL Fan Control dissector. */
646     register_dissector(ZBEE_PROTOABBREV_ZCL_FAN_CONTROL, dissect_zbee_zcl_fan_control, proto_zbee_zcl_fan_control);
647 } /*proto_register_zbee_zcl_fan_control*/
648
649 /**
650  *Hands off the ZCL Fan Control dissector.
651  *
652 */
653 void
654 proto_reg_handoff_zbee_zcl_fan_control(void)
655 {
656     zbee_zcl_init_cluster(  ZBEE_PROTOABBREV_ZCL_FAN_CONTROL,
657                             proto_zbee_zcl_fan_control,
658                             ett_zbee_zcl_fan_control,
659                             ZBEE_ZCL_CID_FAN_CONTROL,
660                             ZBEE_MFG_CODE_NONE,
661                             hf_zbee_zcl_fan_control_attr_id,
662                             hf_zbee_zcl_fan_control_attr_id,
663                             -1, -1,
664                             (zbee_zcl_fn_attr_data)dissect_zcl_fan_control_attr_data
665                          );
666 } /*proto_reg_handoff_zbee_zcl_fan_control*/
667
668
669 /* ########################################################################## */
670 /* #### (0x0203) DEHUMIDIFICATION CONTROL CLUSTER ########################### */
671 /* ########################################################################## */
672
673 /*************************/
674 /* Defines               */
675 /*************************/
676
677 #define ZBEE_ZCL_DEHUMIDIFICATION_CONTROL_NUM_ETT                          1
678
679 /*Attributes*/
680 #define ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_RELATIVE_HUMIDITY             0x0000  /* Relative Humidity */
681 #define ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_DEHUM_COOLING                 0x0001  /* Dehumidification Cooling */
682 #define ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_RH_DEHUM_SETPOINT             0x0010  /* Relative Humidity Dehumidification Setpoint */
683 #define ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_RELATIVE_HUMIDITY_MODE        0x0011  /* Relative Humidity Mode */
684 #define ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_DEHUM_LOCKOUT                 0x0012  /* Dehumidification Lockout */
685 #define ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_DEHUM_HYSTERESIS              0x0013  /* Dehumidification Hysteresis */
686 #define ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_DEHUM_MAX_COOL                0x0014  /* Dehumidification Max Cool */
687 #define ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_RELATIVE_HUMIDITY_DISPLAY     0x0015  /* Relative Humidity Display */
688
689 /*Server commands received - none*/
690
691 /*Server commands generated - none*/
692
693 /*************************/
694 /* Function Declarations */
695 /*************************/
696
697 void proto_register_zbee_zcl_dehumidification_control(void);
698 void proto_reg_handoff_zbee_zcl_dehumidification_control(void);
699
700 /* Command Dissector Helpers */
701 static void dissect_zcl_dehumidification_control_attr_data      (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr);
702
703 /* Private functions prototype */
704
705 /*************************/
706 /* Global Variables      */
707 /*************************/
708 /* Initialize the protocol and registered fields */
709 static int proto_zbee_zcl_dehumidification_control = -1;
710
711 static int hf_zbee_zcl_dehumidification_control_attr_id = -1;
712 static int hf_zbee_zcl_dehumidification_control_attr_rel_hum_mode = -1;
713 static int hf_zbee_zcl_dehumidification_control_attr_dehum_lockout = -1;
714 static int hf_zbee_zcl_dehumidification_control_attr_rel_hum_display = -1;
715
716 /* Initialize the subtree pointers */
717 static gint ett_zbee_zcl_dehumidification_control = -1;
718
719 /* Attributes */
720 static const value_string zbee_zcl_dehumidification_control_attr_names[] = {
721     { ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_RELATIVE_HUMIDITY,            "Relative Humidity" },
722     { ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_DEHUM_COOLING,                "Dehumidification Cooling" },
723     { ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_RH_DEHUM_SETPOINT,            "Relative Humidity Dehumidification Setpoint" },
724     { ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_RELATIVE_HUMIDITY_MODE,       "Relative Humidity Mode" },
725     { ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_DEHUM_LOCKOUT,                "Dehumidification Lockout" },
726     { ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_DEHUM_HYSTERESIS,             "Dehumidification Hysteresis" },
727     { ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_DEHUM_MAX_COOL,               "Dehumidification Max Cool" },
728     { ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_RELATIVE_HUMIDITY_DISPLAY,    "Relative Humidity Display" },
729     { 0, NULL }
730 };
731
732 /*Relative Humidity Mode Values*/
733 static const value_string zbee_zcl_dehumidification_control_rel_hum_mode_names[] = {
734     { 0x00,     "Relative Humidity measured locally" },
735     { 0x01,     "Relative Humidity updated over network" },
736     { 0,        NULL}
737 };
738
739 /*Dehumidification Lockout Values*/
740 static const value_string zbee_zcl_dehumidification_control_dehum_lockout_names[] = {
741     { 0x00,     "Dehumidification is not allowed" },
742     { 0x01,     "Dehumidification is allowed" },
743     { 0,        NULL}
744 };
745
746 /*Relative Humidity Display Values*/
747 static const value_string zbee_zcl_dehumidification_control_rel_hum_display_names[] = {
748     { 0x00,     "Relative Humidity is not displayed" },
749     { 0x01,     "Relative Humidity is displayed" },
750     { 0,        NULL}
751 };
752
753 /*************************/
754 /* Function Bodies       */
755 /*************************/
756
757 /**
758  *ZigBee ZCL Dehumidification Control cluster dissector for wireshark.
759  *
760  *@param tvb pointer to buffer containing raw packet.
761  *@param pinfo pointer to packet information fields
762  *@param tree pointer to data tree Wireshark uses to display packet.
763 */
764
765 static int
766 dissect_zbee_zcl_dehumidification_control(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void* data _U_)
767 {
768     return tvb_captured_length(tvb);;
769 } /*dissect_zbee_zcl_dehumidification_control*/
770
771
772 /**
773  *This function is called by ZCL foundation dissector in order to decode
774  *
775  *@param tree pointer to data tree Wireshark uses to display packet.
776  *@param tvb pointer to buffer containing raw packet.
777  *@param offset pointer to buffer offset
778  *@param attr_id attribute identifier
779  *@param data_type attribute data type
780  *@param client_attr ZCL client
781 */
782 void
783 dissect_zcl_dehumidification_control_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr)
784 {
785     /* Dissect attribute data type and data */
786     switch (attr_id) {
787
788         case ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_RELATIVE_HUMIDITY_MODE:
789             proto_tree_add_item(tree, hf_zbee_zcl_dehumidification_control_attr_rel_hum_mode, tvb, *offset, 1, ENC_NA);
790             *offset += 1;
791             break;
792
793         case ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_DEHUM_LOCKOUT:
794             proto_tree_add_item(tree, hf_zbee_zcl_dehumidification_control_attr_dehum_lockout, tvb, *offset, 1, ENC_NA);
795             *offset += 1;
796             break;
797
798         case ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_RELATIVE_HUMIDITY_DISPLAY:
799             proto_tree_add_item(tree, hf_zbee_zcl_dehumidification_control_attr_rel_hum_display, tvb, *offset, 1, ENC_NA);
800             *offset += 1;
801             break;
802
803         case ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_RELATIVE_HUMIDITY:
804         case ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_DEHUM_COOLING:
805         case ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_RH_DEHUM_SETPOINT:
806         case ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_DEHUM_HYSTERESIS:
807         case ZBEE_ZCL_ATTR_ID_DEHUMIDIFICATION_CONTROL_DEHUM_MAX_COOL:
808         default:
809             dissect_zcl_attr_data(tvb, tree, offset, data_type, client_attr);
810             break;
811     }
812
813 } /*dissect_zcl_dehumidification_control_attr_data*/
814
815
816 /**
817  *ZigBee ZCL Dehumidification Control cluster protocol registration routine.
818  *
819 */
820 void
821 proto_register_zbee_zcl_dehumidification_control(void)
822 {
823     /* Setup list of header fields */
824     static hf_register_info hf[] = {
825
826         { &hf_zbee_zcl_dehumidification_control_attr_id,
827             { "Attribute", "zbee_zcl_hvac.dehumidification_control.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_dehumidification_control_attr_names),
828             0x00, NULL, HFILL } },
829
830         { &hf_zbee_zcl_dehumidification_control_attr_rel_hum_mode,
831             { "Relative Humidity Mode", "zbee_zcl_hvac.dehumidification_control.attr.rel_humidity_mode", FT_UINT8, BASE_HEX, VALS(zbee_zcl_dehumidification_control_rel_hum_mode_names),
832             0x00, NULL, HFILL } },
833
834         { &hf_zbee_zcl_dehumidification_control_attr_dehum_lockout,
835             { "Dehumidification Lockout", "zbee_zcl_hvac.dehumidification_control.attr.dehumidification_lockout", FT_UINT8, BASE_HEX, VALS(zbee_zcl_dehumidification_control_dehum_lockout_names),
836             0x00, NULL, HFILL } },
837
838         { &hf_zbee_zcl_dehumidification_control_attr_rel_hum_display,
839             { "Relative Humidity Display", "zbee_zcl_hvac.dehumidification_control.attr.rel_humidity_display", FT_UINT8, BASE_HEX, VALS(zbee_zcl_dehumidification_control_rel_hum_display_names),
840             0x00, NULL, HFILL } }
841     };
842
843     /* ZCL Dehumidification Control subtrees */
844     static gint *ett[ZBEE_ZCL_DEHUMIDIFICATION_CONTROL_NUM_ETT];
845
846     ett[0] = &ett_zbee_zcl_dehumidification_control;
847
848     /* Register the ZigBee ZCL Dehumidification Control cluster protocol name and description */
849     proto_zbee_zcl_dehumidification_control = proto_register_protocol("ZigBee ZCL Dehumidification Control", "ZCL Dehumidification Control", ZBEE_PROTOABBREV_ZCL_DEHUMIDIFICATION_CONTROL);
850     proto_register_field_array(proto_zbee_zcl_dehumidification_control, hf, array_length(hf));
851     proto_register_subtree_array(ett, array_length(ett));
852
853     /* Register the ZigBee ZCL Dehumidification Control dissector. */
854     register_dissector(ZBEE_PROTOABBREV_ZCL_DEHUMIDIFICATION_CONTROL, dissect_zbee_zcl_dehumidification_control, proto_zbee_zcl_dehumidification_control);
855 } /*proto_register_zbee_zcl_dehumidification_control*/
856
857 /**
858  *Hands off the ZCL Dehumidification Control dissector.
859  *
860 */
861 void
862 proto_reg_handoff_zbee_zcl_dehumidification_control(void)
863 {
864     zbee_zcl_init_cluster(  ZBEE_PROTOABBREV_ZCL_DEHUMIDIFICATION_CONTROL,
865                             proto_zbee_zcl_dehumidification_control,
866                             ett_zbee_zcl_dehumidification_control,
867                             ZBEE_ZCL_CID_DEHUMIDIFICATION_CONTROL,
868                             ZBEE_MFG_CODE_NONE,
869                             hf_zbee_zcl_dehumidification_control_attr_id,
870                             hf_zbee_zcl_dehumidification_control_attr_id,
871                             -1, -1,
872                             (zbee_zcl_fn_attr_data)dissect_zcl_dehumidification_control_attr_data
873                          );
874 } /*proto_reg_handoff_zbee_zcl_dehumidification_control*/
875
876
877 /* ########################################################################## */
878 /* #### (0x0204) THERMOSTAT USER INTERFACE CONFIGURATION CLUSTER ############ */
879 /* ########################################################################## */
880
881 /*************************/
882 /* Defines               */
883 /*************************/
884
885 #define ZBEE_ZCL_THERMOSTAT_UI_CONFIG_NUM_ETT                          1
886
887 /*Attributes*/
888 #define ZBEE_ZCL_ATTR_ID_THERMOSTAT_UI_CONFIG_TEMP_DISP_MODE           0x0000  /* Temperature Display Mode */
889 #define ZBEE_ZCL_ATTR_ID_THERMOSTAT_UI_CONFIG_KEYPAD_LOCKOUT           0x0001  /* Keypad Lockout */
890
891 /*Server commands received - none*/
892
893 /*Server commands generated - none*/
894
895 /*************************/
896 /* Function Declarations */
897 /*************************/
898
899 void proto_register_zbee_zcl_thermostat_ui_config(void);
900 void proto_reg_handoff_zbee_zcl_thermostat_ui_config(void);
901
902 /* Command Dissector Helpers */
903 static void dissect_zcl_thermostat_ui_config_attr_data      (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr);
904
905 /* Private functions prototype */
906
907 /*************************/
908 /* Global Variables      */
909 /*************************/
910 /* Initialize the protocol and registered fields */
911 static int proto_zbee_zcl_thermostat_ui_config = -1;
912
913 static int hf_zbee_zcl_thermostat_ui_config_attr_id = -1;
914 static int hf_zbee_zcl_thermostat_ui_config_attr_temp_disp_mode = -1;
915 static int hf_zbee_zcl_thermostat_ui_config_attr_keypad_lockout = -1;
916
917 /* Initialize the subtree pointers */
918 static gint ett_zbee_zcl_thermostat_ui_config = -1;
919
920 /* Attributes */
921 static const value_string zbee_zcl_thermostat_ui_config_attr_names[] = {
922     { ZBEE_ZCL_ATTR_ID_THERMOSTAT_UI_CONFIG_TEMP_DISP_MODE,         "Temperature Display Mode" },
923     { ZBEE_ZCL_ATTR_ID_THERMOSTAT_UI_CONFIG_KEYPAD_LOCKOUT,         "Keypad Lockout" },
924     { 0, NULL }
925 };
926
927 /*Temp Display Mode Values*/
928 static const value_string zbee_zcl_thermostat_ui_config_temp_disp_mode_names[] = {
929     { 0x00,     "Temperature in degree Celsius" },
930     { 0x01,     "Temperature in degree Fahrenheit" },
931     { 0,        NULL}
932 };
933
934 /*Keypad Lockout Values*/
935 static const value_string zbee_zcl_thermostat_ui_config_keypad_lockout_names[] = {
936     { 0x00,     "No lockout" },
937     { 0x01,     "Level 1 lockout" },
938     { 0x02,     "Level 2 lockout" },
939     { 0x03,     "Level 3 lockout" },
940     { 0x04,     "Level 4 lockout" },
941     { 0x05,     "Level 5 lockout" },
942     { 0,        NULL}
943 };
944
945 /*************************/
946 /* Function Bodies       */
947 /*************************/
948
949 /**
950  *ZigBee ZCL Thermostat User Interface Configuration cluster dissector for wireshark.
951  *
952  *@param tvb pointer to buffer containing raw packet.
953  *@param pinfo pointer to packet information fields
954  *@param tree pointer to data tree Wireshark uses to display packet.
955 */
956
957 static int
958 dissect_zbee_zcl_thermostat_ui_config(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void* data _U_)
959 {
960     return tvb_captured_length(tvb);
961 } /*dissect_zbee_zcl_thermostat_ui_config*/
962
963
964 /**
965  *This function is called by ZCL foundation dissector in order to decode
966  *
967  *@param tree pointer to data tree Wireshark uses to display packet.
968  *@param tvb pointer to buffer containing raw packet.
969  *@param offset pointer to buffer offset
970  *@param attr_id attribute identifier
971  *@param data_type attribute data type
972  *@param client_attr ZCL client
973 */
974 void
975 dissect_zcl_thermostat_ui_config_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr)
976 {
977     /* Dissect attribute data type and data */
978     switch (attr_id) {
979
980         case ZBEE_ZCL_ATTR_ID_THERMOSTAT_UI_CONFIG_TEMP_DISP_MODE:
981             proto_tree_add_item(tree, hf_zbee_zcl_thermostat_ui_config_attr_temp_disp_mode, tvb, *offset, 1, ENC_NA);
982             *offset += 1;
983             break;
984
985         case ZBEE_ZCL_ATTR_ID_THERMOSTAT_UI_CONFIG_KEYPAD_LOCKOUT:
986             proto_tree_add_item(tree, hf_zbee_zcl_thermostat_ui_config_attr_keypad_lockout, tvb, *offset, 1, ENC_NA);
987             *offset += 1;
988             break;
989
990         default:
991             dissect_zcl_attr_data(tvb, tree, offset, data_type, client_attr);
992             break;
993     }
994
995 } /*dissect_zcl_thermostat_ui_config_attr_data*/
996
997
998 /**
999  *ZigBee ZCL Thermostat User Interface Configuration cluster protocol registration routine.
1000  *
1001 */
1002 void
1003 proto_register_zbee_zcl_thermostat_ui_config(void)
1004 {
1005     /* Setup list of header fields */
1006     static hf_register_info hf[] = {
1007
1008         { &hf_zbee_zcl_thermostat_ui_config_attr_id,
1009             { "Attribute", "zbee_zcl_hvac.thermostat_ui_config.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_thermostat_ui_config_attr_names),
1010             0x00, NULL, HFILL } },
1011
1012         { &hf_zbee_zcl_thermostat_ui_config_attr_temp_disp_mode,
1013             { "Temperature Display Mode", "zbee_zcl_hvac.thermostat_ui_config.attr.temp_disp_mode", FT_UINT8, BASE_HEX, VALS(zbee_zcl_thermostat_ui_config_temp_disp_mode_names),
1014             0x00, NULL, HFILL } },
1015
1016         { &hf_zbee_zcl_thermostat_ui_config_attr_keypad_lockout,
1017             { "Keypad Lockout", "zbee_zcl_hvac.thermostat_ui_config.attr.keypad_lockout", FT_UINT8, BASE_HEX, VALS(zbee_zcl_thermostat_ui_config_keypad_lockout_names),
1018             0x00, NULL, HFILL } }
1019     };
1020
1021     /* ZCL Thermostat User Interface Configuration subtrees */
1022     static gint *ett[ZBEE_ZCL_THERMOSTAT_UI_CONFIG_NUM_ETT];
1023     ett[0] = &ett_zbee_zcl_thermostat_ui_config;
1024
1025     /* Register the ZigBee ZCL Thermostat User Interface Configuration cluster protocol name and description */
1026     proto_zbee_zcl_thermostat_ui_config = proto_register_protocol("ZigBee ZCL Thermostat User Interface Configuration", "ZCL Thermostat User Interface Configuration", ZBEE_PROTOABBREV_ZCL_THERMOSTAT_UI_CONFIG);
1027     proto_register_field_array(proto_zbee_zcl_thermostat_ui_config, hf, array_length(hf));
1028     proto_register_subtree_array(ett, array_length(ett));
1029
1030     /* Register the ZigBee ZCL Thermostat User Interface Configuration dissector. */
1031     register_dissector(ZBEE_PROTOABBREV_ZCL_THERMOSTAT_UI_CONFIG, dissect_zbee_zcl_thermostat_ui_config, proto_zbee_zcl_thermostat_ui_config);
1032 } /*proto_register_zbee_zcl_thermostat_ui_config*/
1033
1034 /**
1035  *Hands off the ZCL Thermostat User Interface Configuration dissector.
1036  *
1037 */
1038 void
1039 proto_reg_handoff_zbee_zcl_thermostat_ui_config(void)
1040 {
1041     zbee_zcl_init_cluster(  ZBEE_PROTOABBREV_ZCL_THERMOSTAT_UI_CONFIG,
1042                             proto_zbee_zcl_thermostat_ui_config,
1043                             ett_zbee_zcl_thermostat_ui_config,
1044                             ZBEE_ZCL_CID_THERMOSTAT_UI_CONFIG,
1045                             ZBEE_MFG_CODE_NONE,
1046                             hf_zbee_zcl_thermostat_ui_config_attr_id,
1047                             hf_zbee_zcl_thermostat_ui_config_attr_id,
1048                             -1, -1,
1049                             (zbee_zcl_fn_attr_data)dissect_zcl_thermostat_ui_config_attr_data
1050                          );
1051 } /*proto_reg_handoff_zbee_zcl_thermostat_ui_config*/
1052
1053 /*
1054  * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
1055  *
1056  * Local variables:
1057  * c-basic-offset: 4
1058  * tab-width: 8
1059  * indent-tabs-mode: nil
1060  * End:
1061  *
1062  * vi: set shiftwidth=4 tabstop=8 expandtab:
1063  * :indentSize=4:tabSize=8:noTabs=true:
1064  */