wireshark/epan/dissectors/packet-zbee-zcl-se.c

15695 lines
873 KiB
C

/* packet-zbee-zcl-se.c
* Dissector routines for the ZigBee ZCL SE clusters like
* Messaging
* By Fabio Tarabelloni <fabio.tarabelloni@reloc.it>
* Copyright 2013 RELOC s.r.l.
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
/* Include Files */
#include "config.h"
#include <epan/packet.h>
#include <epan/prefs.h>
#include <epan/expert.h>
#include <epan/to_str.h>
#include "packet-zbee.h"
#include "packet-zbee-aps.h"
#include "packet-zbee-zcl.h"
#include "packet-zbee-security.h"
/* ########################################################################## */
/* #### common to all SE clusters ########################################### */
/* ########################################################################## */
#define ZBEE_ZCL_SE_ATTR_REPORT_PENDING 0x00
#define ZBEE_ZCL_SE_ATTR_REPORT_COMPLETE 0x01
static const value_string zbee_zcl_se_reporting_status_names[] = {
{ ZBEE_ZCL_SE_ATTR_REPORT_PENDING, "Pending" },
{ ZBEE_ZCL_SE_ATTR_REPORT_COMPLETE, "Complete" },
{ 0, NULL }
};
/**
*Dissect a ZigBee Date
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to buffer offset
*@param subtree_name name for the subtree
*@param idx one of the ett_ array elements registered with proto_register_subtree_array()
*@param hfindex_yy year field
*@param hfindex_mm month field
*@param hfindex_md month day field
*@param hfindex_wd week day field
*/
static void dissect_zcl_date(tvbuff_t *tvb, proto_tree *tree, guint *offset,
gint idx, const char* subtree_name, int hfindex_yy, int hfindex_mm, int hfindex_md,
int hfindex_wd)
{
guint8 yy;
proto_tree* subtree;
/* Add subtree */
subtree = proto_tree_add_subtree(tree, tvb, *offset, 4, idx, NULL, subtree_name);
/* Year */
yy = tvb_get_guint8(tvb, *offset);
proto_tree_add_uint(subtree, hfindex_yy, tvb, *offset, 1, yy + 1900);
*offset += 1;
/* Month */
proto_tree_add_item(subtree, hfindex_mm, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Month Day */
proto_tree_add_item(subtree, hfindex_md, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Week Day */
proto_tree_add_item(subtree, hfindex_wd, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_date*/
/*************************/
/* Global Variables */
/*************************/
/* ########################################################################## */
/* #### (0x0025) KEEP-ALIVE CLUSTER ######################################### */
/* ########################################################################## */
/* Attributes */
#define zbee_zcl_keep_alive_attr_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_ATTR_ID_KEEP_ALIVE_BASE, 0x0000, "Keep-Alive Base" ) \
XXX(ZBEE_ZCL_ATTR_ID_KEEP_ALIVE_JITTER, 0x0001, "Keep-Alive Jitter" ) \
XXX(ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_KEEP_ALIVE, 0xFFFE, "Attribute Reporting Status" )
VALUE_STRING_ENUM(zbee_zcl_keep_alive_attr_names);
VALUE_STRING_ARRAY(zbee_zcl_keep_alive_attr_names);
/*************************/
/* Function Declarations */
/*************************/
void proto_register_zbee_zcl_keep_alive(void);
void proto_reg_handoff_zbee_zcl_keep_alive(void);
/* Attribute Dissector Helpers */
static void dissect_zcl_keep_alive_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr);
/*************************/
/* Global Variables */
/*************************/
/* Initialize the protocol and registered fields */
static int proto_zbee_zcl_keep_alive = -1;
static int hf_zbee_zcl_keep_alive_attr_id = -1;
static int hf_zbee_zcl_keep_alive_attr_reporting_status = -1;
static int hf_zbee_zcl_keep_alive_base = -1;
static int hf_zbee_zcl_keep_alive_jitter = -1;
/* Initialize the subtree pointers */
static gint ett_zbee_zcl_keep_alive = -1;
/*************************/
/* Function Bodies */
/*************************/
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*@param attr_id attribute identifier
*@param data_type attribute data type
*@param client_attr ZCL client
*/
static void
dissect_zcl_keep_alive_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr)
{
/* Dissect attribute data type and data */
switch (attr_id) {
/* applies to all SE clusters */
case ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_KEEP_ALIVE:
proto_tree_add_item(tree, hf_zbee_zcl_keep_alive_attr_reporting_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
break;
case ZBEE_ZCL_ATTR_ID_KEEP_ALIVE_BASE:
proto_tree_add_item(tree, hf_zbee_zcl_keep_alive_base, tvb, *offset, 1, ENC_NA);
*offset += 1;
break;
case ZBEE_ZCL_ATTR_ID_KEEP_ALIVE_JITTER:
proto_tree_add_item(tree, hf_zbee_zcl_keep_alive_jitter, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
break;
default: /* Catch all */
dissect_zcl_attr_data(tvb, tree, offset, data_type, client_attr);
break;
}
} /*dissect_zcl_keep_alive_attr_data*/
/**
*ZigBee ZCL Keep-Alive cluster dissector for wireshark.
*
*@param tvb pointer to buffer containing raw packet.
*@param pinfo pointer to packet information fields
*@param tree pointer to data tree Wireshark uses to display packet.
*/
static int
dissect_zbee_zcl_keep_alive(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void* data _U_)
{
return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_keep_alive*/
/**
*This function registers the ZCL Keep-Alive dissector
*
*/
void
proto_register_zbee_zcl_keep_alive(void)
{
static hf_register_info hf[] = {
{ &hf_zbee_zcl_keep_alive_attr_id,
{ "Attribute", "zbee_zcl_se.keep_alive.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_keep_alive_attr_names),
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_keep_alive_attr_reporting_status, /* common to all SE clusters */
{ "Attribute Reporting Status", "zbee_zcl_se.keep_alive.attr.attr_reporting_status",
FT_UINT8, BASE_HEX, VALS(zbee_zcl_se_reporting_status_names), 0x00, NULL, HFILL } },
{ &hf_zbee_zcl_keep_alive_base,
{ "Keep-Alive Base", "zbee_zcl_se.keep_alive.attr.base", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_keep_alive_jitter,
{ "Keep-Alive Jitter", "zbee_zcl_se.keep_alive.attr.jitter", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
};
/* ZCL Keep-Alive subtrees */
gint *ett[] = {
&ett_zbee_zcl_keep_alive
};
/* Register the ZigBee ZCL Keep-Alive cluster protocol name and description */
proto_zbee_zcl_keep_alive = proto_register_protocol("ZigBee ZCL Keep-Alive", "ZCL Keep-Alive", ZBEE_PROTOABBREV_ZCL_KEEP_ALIVE);
proto_register_field_array(proto_zbee_zcl_keep_alive, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
/* Register the ZigBee ZCL Keep-Alive dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_KEEP_ALIVE, dissect_zbee_zcl_keep_alive, proto_zbee_zcl_keep_alive);
} /*proto_register_zbee_zcl_keep_alive*/
/**
*Hands off the ZCL Keep-Alive dissector.
*
*/
void
proto_reg_handoff_zbee_zcl_keep_alive(void)
{
zbee_zcl_init_cluster( ZBEE_PROTOABBREV_ZCL_KEEP_ALIVE,
proto_zbee_zcl_keep_alive,
ett_zbee_zcl_keep_alive,
ZBEE_ZCL_CID_KEEP_ALIVE,
ZBEE_MFG_CODE_NONE,
hf_zbee_zcl_keep_alive_attr_id,
-1,
-1, -1,
(zbee_zcl_fn_attr_data)dissect_zcl_keep_alive_attr_data
);
} /*proto_reg_handoff_zbee_zcl_keep_alive*/
/* ########################################################################## */
/* #### (0x0700) PRICE CLUSTER ############################################## */
/* ########################################################################## */
/* Attributes */
#define zbee_zcl_price_attr_server_names_VALUE_STRING_LIST(XXX) \
/* Tier Label (Delivered) Set */ \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_PRICE_LABEL, 0x0000, "Tier 1 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_PRICE_LABEL, 0x0001, "Tier 2 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_PRICE_LABEL, 0x0002, "Tier 3 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_PRICE_LABEL, 0x0003, "Tier 4 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_PRICE_LABEL, 0x0004, "Tier 5 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_PRICE_LABEL, 0x0005, "Tier 6 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_PRICE_LABEL, 0x0006, "Tier 7 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_PRICE_LABEL, 0x0007, "Tier 8 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_PRICE_LABEL, 0x0008, "Tier 9 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_PRICE_LABEL, 0x0009, "Tier 10 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_PRICE_LABEL, 0x000A, "Tier 11 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_PRICE_LABEL, 0x000B, "Tier 12 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_PRICE_LABEL, 0x000C, "Tier 13 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_PRICE_LABEL, 0x000D, "Tier 14 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_PRICE_LABEL, 0x000E, "Tier 15 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_16_PRICE_LABEL, 0x000F, "Tier 16 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_17_PRICE_LABEL, 0x0010, "Tier 17 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_18_PRICE_LABEL, 0x0011, "Tier 18 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_19_PRICE_LABEL, 0x0012, "Tier 19 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_20_PRICE_LABEL, 0x0013, "Tier 20 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_21_PRICE_LABEL, 0x0014, "Tier 21 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_22_PRICE_LABEL, 0x0015, "Tier 22 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_23_PRICE_LABEL, 0x0016, "Tier 23 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_24_PRICE_LABEL, 0x0017, "Tier 24 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_25_PRICE_LABEL, 0x0018, "Tier 25 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_26_PRICE_LABEL, 0x0019, "Tier 26 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_27_PRICE_LABEL, 0x001A, "Tier 27 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_28_PRICE_LABEL, 0x001B, "Tier 28 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_29_PRICE_LABEL, 0x001C, "Tier 29 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_30_PRICE_LABEL, 0x001D, "Tier 30 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_31_PRICE_LABEL, 0x001E, "Tier 31 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_32_PRICE_LABEL, 0x001F, "Tier 32 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_33_PRICE_LABEL, 0x0020, "Tier 33 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_34_PRICE_LABEL, 0x0021, "Tier 34 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_35_PRICE_LABEL, 0x0022, "Tier 35 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_36_PRICE_LABEL, 0x0023, "Tier 36 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_37_PRICE_LABEL, 0x0024, "Tier 37 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_38_PRICE_LABEL, 0x0025, "Tier 38 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_39_PRICE_LABEL, 0x0026, "Tier 39 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_40_PRICE_LABEL, 0x0027, "Tier 40 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_41_PRICE_LABEL, 0x0028, "Tier 41 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_42_PRICE_LABEL, 0x0029, "Tier 42 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_43_PRICE_LABEL, 0x002A, "Tier 43 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_44_PRICE_LABEL, 0x002B, "Tier 44 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_45_PRICE_LABEL, 0x002C, "Tier 45 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_46_PRICE_LABEL, 0x002D, "Tier 46 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_47_PRICE_LABEL, 0x002E, "Tier 47 Price Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_48_PRICE_LABEL, 0x002F, "Tier 48 Price Label" ) \
/* Block Threshold (Delivered) Set */ \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_BLOCK_1_THRESHOLD, 0x0100, "Block 1 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_BLOCK_2_THRESHOLD, 0x0101, "Block 2 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_BLOCK_3_THRESHOLD, 0x0102, "Block 3 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_BLOCK_4_THRESHOLD, 0x0103, "Block 4 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_BLOCK_5_THRESHOLD, 0x0104, "Block 5 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_BLOCK_6_THRESHOLD, 0x0105, "Block 6 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_BLOCK_7_THRESHOLD, 0x0106, "Block 7 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_BLOCK_8_THRESHOLD, 0x0107, "Block 8 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_BLOCK_9_THRESHOLD, 0x0108, "Block 9 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_BLOCK_10_THRESHOLD, 0x0109, "Block 10 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_BLOCK_11_THRESHOLD, 0x010A, "Block 11 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_BLOCK_12_THRESHOLD, 0x010B, "Block 12 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_BLOCK_13_THRESHOLD, 0x010C, "Block 13 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_BLOCK_14_THRESHOLD, 0x010D, "Block 14 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_BLOCK_15_THRESHOLD, 0x010E, "Block 15 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_BLOCK_THRESHOLD_COUNT, 0x010F, "Block Threshold Count" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_1_THRESHOLD, 0x0110, "Tier 1 Block 1 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_2_THRESHOLD, 0x0111, "Tier 1 Block 2 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_3_THRESHOLD, 0x0112, "Tier 1 Block 3 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_4_THRESHOLD, 0x0113, "Tier 1 Block 4 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_5_THRESHOLD, 0x0114, "Tier 1 Block 5 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_6_THRESHOLD, 0x0115, "Tier 1 Block 6 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_7_THRESHOLD, 0x0116, "Tier 1 Block 7 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_8_THRESHOLD, 0x0117, "Tier 1 Block 8 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_9_THRESHOLD, 0x0118, "Tier 1 Block 9 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_10_THRESHOLD, 0x0119, "Tier 1 Block 10 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_11_THRESHOLD, 0x011A, "Tier 1 Block 11 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_12_THRESHOLD, 0x011B, "Tier 1 Block 12 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_13_THRESHOLD, 0x011C, "Tier 1 Block 13 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_14_THRESHOLD, 0x011D, "Tier 1 Block 14 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_15_THRESHOLD, 0x011E, "Tier 1 Block 15 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_THRESHOLD_COUNT, 0x011F, "Tier 1 Block Threshold Count" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_1_THRESHOLD, 0x0120, "Tier 2 Block 1 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_2_THRESHOLD, 0x0121, "Tier 2 Block 2 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_3_THRESHOLD, 0x0122, "Tier 2 Block 3 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_4_THRESHOLD, 0x0123, "Tier 2 Block 4 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_5_THRESHOLD, 0x0124, "Tier 2 Block 5 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_6_THRESHOLD, 0x0125, "Tier 2 Block 6 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_7_THRESHOLD, 0x0126, "Tier 2 Block 7 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_8_THRESHOLD, 0x0127, "Tier 2 Block 8 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_9_THRESHOLD, 0x0128, "Tier 2 Block 9 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_10_THRESHOLD, 0x0129, "Tier 2 Block 10 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_11_THRESHOLD, 0x012A, "Tier 2 Block 11 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_12_THRESHOLD, 0x012B, "Tier 2 Block 12 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_13_THRESHOLD, 0x012C, "Tier 2 Block 13 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_14_THRESHOLD, 0x012D, "Tier 2 Block 14 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_15_THRESHOLD, 0x012E, "Tier 2 Block 15 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_THRESHOLD_COUNT, 0x012F, "Tier 2 Block Threshold Count" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_1_THRESHOLD, 0x0130, "Tier 3 Block 1 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_2_THRESHOLD, 0x0131, "Tier 3 Block 2 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_3_THRESHOLD, 0x0132, "Tier 3 Block 3 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_4_THRESHOLD, 0x0133, "Tier 3 Block 4 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_5_THRESHOLD, 0x0134, "Tier 3 Block 5 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_6_THRESHOLD, 0x0135, "Tier 3 Block 6 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_7_THRESHOLD, 0x0136, "Tier 3 Block 7 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_8_THRESHOLD, 0x0137, "Tier 3 Block 8 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_9_THRESHOLD, 0x0138, "Tier 3 Block 9 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_10_THRESHOLD, 0x0139, "Tier 3 Block 10 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_11_THRESHOLD, 0x013A, "Tier 3 Block 11 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_12_THRESHOLD, 0x013B, "Tier 3 Block 12 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_13_THRESHOLD, 0x013C, "Tier 3 Block 13 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_14_THRESHOLD, 0x013D, "Tier 3 Block 14 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_15_THRESHOLD, 0x013E, "Tier 3 Block 15 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_THRESHOLD_COUNT, 0x013F, "Tier 3 Block Threshold Count" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_1_THRESHOLD, 0x0140, "Tier 4 Block 1 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_2_THRESHOLD, 0x0141, "Tier 4 Block 2 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_3_THRESHOLD, 0x0142, "Tier 4 Block 3 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_4_THRESHOLD, 0x0143, "Tier 4 Block 4 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_5_THRESHOLD, 0x0144, "Tier 4 Block 5 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_6_THRESHOLD, 0x0145, "Tier 4 Block 6 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_7_THRESHOLD, 0x0146, "Tier 4 Block 7 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_8_THRESHOLD, 0x0147, "Tier 4 Block 8 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_9_THRESHOLD, 0x0148, "Tier 4 Block 9 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_10_THRESHOLD, 0x0149, "Tier 4 Block 10 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_11_THRESHOLD, 0x014A, "Tier 4 Block 11 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_12_THRESHOLD, 0x014B, "Tier 4 Block 12 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_13_THRESHOLD, 0x014C, "Tier 4 Block 13 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_14_THRESHOLD, 0x014D, "Tier 4 Block 14 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_15_THRESHOLD, 0x014E, "Tier 4 Block 15 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_THRESHOLD_COUNT, 0x014F, "Tier 4 Block Threshold Count" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_1_THRESHOLD, 0x0150, "Tier 5 Block 1 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_2_THRESHOLD, 0x0151, "Tier 5 Block 2 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_3_THRESHOLD, 0x0152, "Tier 5 Block 3 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_4_THRESHOLD, 0x0153, "Tier 5 Block 4 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_5_THRESHOLD, 0x0154, "Tier 5 Block 5 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_6_THRESHOLD, 0x0155, "Tier 5 Block 6 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_7_THRESHOLD, 0x0156, "Tier 5 Block 7 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_8_THRESHOLD, 0x0157, "Tier 5 Block 8 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_9_THRESHOLD, 0x0158, "Tier 5 Block 9 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_10_THRESHOLD, 0x0159, "Tier 5 Block 10 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_11_THRESHOLD, 0x015A, "Tier 5 Block 11 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_12_THRESHOLD, 0x015B, "Tier 5 Block 12 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_13_THRESHOLD, 0x015C, "Tier 5 Block 13 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_14_THRESHOLD, 0x015D, "Tier 5 Block 14 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_15_THRESHOLD, 0x015E, "Tier 5 Block 15 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_THRESHOLD_COUNT, 0x015F, "Tier 5 Block Threshold Count" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_1_THRESHOLD, 0x0160, "Tier 6 Block 1 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_2_THRESHOLD, 0x0161, "Tier 6 Block 2 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_3_THRESHOLD, 0x0162, "Tier 6 Block 3 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_4_THRESHOLD, 0x0163, "Tier 6 Block 4 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_5_THRESHOLD, 0x0164, "Tier 6 Block 5 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_6_THRESHOLD, 0x0165, "Tier 6 Block 6 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_7_THRESHOLD, 0x0166, "Tier 6 Block 7 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_8_THRESHOLD, 0x0167, "Tier 6 Block 8 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_9_THRESHOLD, 0x0168, "Tier 6 Block 9 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_10_THRESHOLD, 0x0169, "Tier 6 Block 10 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_11_THRESHOLD, 0x016A, "Tier 6 Block 11 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_12_THRESHOLD, 0x016B, "Tier 6 Block 12 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_13_THRESHOLD, 0x016C, "Tier 6 Block 13 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_14_THRESHOLD, 0x016D, "Tier 6 Block 14 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_15_THRESHOLD, 0x016E, "Tier 6 Block 15 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_THRESHOLD_COUNT, 0x016F, "Tier 6 Block Threshold Count" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_1_THRESHOLD, 0x0170, "Tier 7 Block 1 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_2_THRESHOLD, 0x0171, "Tier 7 Block 2 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_3_THRESHOLD, 0x0172, "Tier 7 Block 3 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_4_THRESHOLD, 0x0173, "Tier 7 Block 4 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_5_THRESHOLD, 0x0174, "Tier 7 Block 5 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_6_THRESHOLD, 0x0175, "Tier 7 Block 6 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_7_THRESHOLD, 0x0176, "Tier 7 Block 7 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_8_THRESHOLD, 0x0177, "Tier 7 Block 8 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_9_THRESHOLD, 0x0178, "Tier 7 Block 9 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_10_THRESHOLD, 0x0179, "Tier 7 Block 10 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_11_THRESHOLD, 0x017A, "Tier 7 Block 11 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_12_THRESHOLD, 0x017B, "Tier 7 Block 12 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_13_THRESHOLD, 0x017C, "Tier 7 Block 13 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_14_THRESHOLD, 0x017D, "Tier 7 Block 14 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_15_THRESHOLD, 0x017E, "Tier 7 Block 15 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_THRESHOLD_COUNT, 0x017F, "Tier 7 Block Threshold Count" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_1_THRESHOLD, 0x0180, "Tier 8 Block 1 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_2_THRESHOLD, 0x0181, "Tier 8 Block 2 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_3_THRESHOLD, 0x0182, "Tier 8 Block 3 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_4_THRESHOLD, 0x0183, "Tier 8 Block 4 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_5_THRESHOLD, 0x0184, "Tier 8 Block 5 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_6_THRESHOLD, 0x0185, "Tier 8 Block 6 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_7_THRESHOLD, 0x0186, "Tier 8 Block 7 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_8_THRESHOLD, 0x0187, "Tier 8 Block 8 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_9_THRESHOLD, 0x0188, "Tier 8 Block 9 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_10_THRESHOLD, 0x0189, "Tier 8 Block 10 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_11_THRESHOLD, 0x018A, "Tier 8 Block 11 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_12_THRESHOLD, 0x018B, "Tier 8 Block 12 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_13_THRESHOLD, 0x018C, "Tier 8 Block 13 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_14_THRESHOLD, 0x018D, "Tier 8 Block 14 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_15_THRESHOLD, 0x018E, "Tier 8 Block 15 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_THRESHOLD_COUNT, 0x018F, "Tier 8 Block Threshold Count" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_1_THRESHOLD, 0x0190, "Tier 9 Block 1 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_2_THRESHOLD, 0x0191, "Tier 9 Block 2 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_3_THRESHOLD, 0x0192, "Tier 9 Block 3 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_4_THRESHOLD, 0x0193, "Tier 9 Block 4 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_5_THRESHOLD, 0x0194, "Tier 9 Block 5 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_6_THRESHOLD, 0x0195, "Tier 9 Block 6 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_7_THRESHOLD, 0x0196, "Tier 9 Block 7 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_8_THRESHOLD, 0x0197, "Tier 9 Block 8 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_9_THRESHOLD, 0x0198, "Tier 9 Block 9 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_10_THRESHOLD, 0x0199, "Tier 9 Block 10 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_11_THRESHOLD, 0x019A, "Tier 9 Block 11 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_12_THRESHOLD, 0x019B, "Tier 9 Block 12 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_13_THRESHOLD, 0x019C, "Tier 9 Block 13 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_14_THRESHOLD, 0x019D, "Tier 9 Block 14 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_15_THRESHOLD, 0x019E, "Tier 9 Block 15 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_THRESHOLD_COUNT, 0x019F, "Tier 9 Block Threshold Count" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_1_THRESHOLD, 0x01A0, "Tier 10 Block 1 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_2_THRESHOLD, 0x01A1, "Tier 10 Block 2 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_3_THRESHOLD, 0x01A2, "Tier 10 Block 3 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_4_THRESHOLD, 0x01A3, "Tier 10 Block 4 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_5_THRESHOLD, 0x01A4, "Tier 10 Block 5 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_6_THRESHOLD, 0x01A5, "Tier 10 Block 6 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_7_THRESHOLD, 0x01A6, "Tier 10 Block 7 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_8_THRESHOLD, 0x01A7, "Tier 10 Block 8 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_9_THRESHOLD, 0x01A8, "Tier 10 Block 9 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_10_THRESHOLD, 0x01A9, "Tier 10 Block 10 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_11_THRESHOLD, 0x01AA, "Tier 10 Block 11 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_12_THRESHOLD, 0x01AB, "Tier 10 Block 12 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_13_THRESHOLD, 0x01AC, "Tier 10 Block 13 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_14_THRESHOLD, 0x01AD, "Tier 10 Block 14 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_15_THRESHOLD, 0x01AE, "Tier 10 Block 15 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_THRESHOLD_COUNT, 0x01AF, "Tier 10 Block Threshold Count" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_1_THRESHOLD, 0x01B0, "Tier 11 Block 1 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_2_THRESHOLD, 0x01B1, "Tier 11 Block 2 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_3_THRESHOLD, 0x01B2, "Tier 11 Block 3 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_4_THRESHOLD, 0x01B3, "Tier 11 Block 4 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_5_THRESHOLD, 0x01B4, "Tier 11 Block 5 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_6_THRESHOLD, 0x01B5, "Tier 11 Block 6 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_7_THRESHOLD, 0x01B6, "Tier 11 Block 7 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_8_THRESHOLD, 0x01B7, "Tier 11 Block 8 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_9_THRESHOLD, 0x01B8, "Tier 11 Block 9 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_10_THRESHOLD, 0x01B9, "Tier 11 Block 10 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_11_THRESHOLD, 0x01BA, "Tier 11 Block 11 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_12_THRESHOLD, 0x01BB, "Tier 11 Block 12 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_13_THRESHOLD, 0x01BC, "Tier 11 Block 13 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_14_THRESHOLD, 0x01BD, "Tier 11 Block 14 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_15_THRESHOLD, 0x01BE, "Tier 11 Block 15 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_THRESHOLD_COUNT, 0x01BF, "Tier 11 Block Threshold Count" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_1_THRESHOLD, 0x01C0, "Tier 12 Block 1 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_2_THRESHOLD, 0x01C1, "Tier 12 Block 2 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_3_THRESHOLD, 0x01C2, "Tier 12 Block 3 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_4_THRESHOLD, 0x01C3, "Tier 12 Block 4 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_5_THRESHOLD, 0x01C4, "Tier 12 Block 5 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_6_THRESHOLD, 0x01C5, "Tier 12 Block 6 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_7_THRESHOLD, 0x01C6, "Tier 12 Block 7 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_8_THRESHOLD, 0x01C7, "Tier 12 Block 8 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_9_THRESHOLD, 0x01C8, "Tier 12 Block 9 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_10_THRESHOLD, 0x01C9, "Tier 12 Block 10 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_11_THRESHOLD, 0x01CA, "Tier 12 Block 11 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_12_THRESHOLD, 0x01CB, "Tier 12 Block 12 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_13_THRESHOLD, 0x01CC, "Tier 12 Block 13 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_14_THRESHOLD, 0x01CD, "Tier 12 Block 14 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_15_THRESHOLD, 0x01CE, "Tier 12 Block 15 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_THRESHOLD_COUNT, 0x01CF, "Tier 12 Block Threshold Count" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_1_THRESHOLD, 0x01D0, "Tier 13 Block 1 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_2_THRESHOLD, 0x01D1, "Tier 13 Block 2 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_3_THRESHOLD, 0x01D2, "Tier 13 Block 3 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_4_THRESHOLD, 0x01D3, "Tier 13 Block 4 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_5_THRESHOLD, 0x01D4, "Tier 13 Block 5 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_6_THRESHOLD, 0x01D5, "Tier 13 Block 6 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_7_THRESHOLD, 0x01D6, "Tier 13 Block 7 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_8_THRESHOLD, 0x01D7, "Tier 13 Block 8 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_9_THRESHOLD, 0x01D8, "Tier 13 Block 9 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_10_THRESHOLD, 0x01D9, "Tier 13 Block 10 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_11_THRESHOLD, 0x01DA, "Tier 13 Block 11 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_12_THRESHOLD, 0x01DB, "Tier 13 Block 12 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_13_THRESHOLD, 0x01DC, "Tier 13 Block 13 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_14_THRESHOLD, 0x01DD, "Tier 13 Block 14 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_15_THRESHOLD, 0x01DE, "Tier 13 Block 15 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_THRESHOLD_COUNT, 0x01DF, "Tier 13 Block Threshold Count" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_1_THRESHOLD, 0x01E0, "Tier 14 Block 1 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_2_THRESHOLD, 0x01E1, "Tier 14 Block 2 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_3_THRESHOLD, 0x01E2, "Tier 14 Block 3 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_4_THRESHOLD, 0x01E3, "Tier 14 Block 4 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_5_THRESHOLD, 0x01E4, "Tier 14 Block 5 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_6_THRESHOLD, 0x01E5, "Tier 14 Block 6 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_7_THRESHOLD, 0x01E6, "Tier 14 Block 7 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_8_THRESHOLD, 0x01E7, "Tier 14 Block 8 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_9_THRESHOLD, 0x01E8, "Tier 14 Block 9 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_10_THRESHOLD, 0x01E9, "Tier 14 Block 10 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_11_THRESHOLD, 0x01EA, "Tier 14 Block 11 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_12_THRESHOLD, 0x01EB, "Tier 14 Block 12 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_13_THRESHOLD, 0x01EC, "Tier 14 Block 13 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_14_THRESHOLD, 0x01ED, "Tier 14 Block 14 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_15_THRESHOLD, 0x01EE, "Tier 14 Block 15 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_THRESHOLD_COUNT, 0x01EF, "Tier 14 Block Threshold Count" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_1_THRESHOLD, 0x01F0, "Tier 15 Block 1 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_2_THRESHOLD, 0x01F1, "Tier 15 Block 2 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_3_THRESHOLD, 0x01F2, "Tier 15 Block 3 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_4_THRESHOLD, 0x01F3, "Tier 15 Block 4 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_5_THRESHOLD, 0x01F4, "Tier 15 Block 5 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_6_THRESHOLD, 0x01F5, "Tier 15 Block 6 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_7_THRESHOLD, 0x01F6, "Tier 15 Block 7 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_8_THRESHOLD, 0x01F7, "Tier 15 Block 8 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_9_THRESHOLD, 0x01F8, "Tier 15 Block 9 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_10_THRESHOLD, 0x01F9, "Tier 15 Block 10 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_11_THRESHOLD, 0x01FA, "Tier 15 Block 11 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_12_THRESHOLD, 0x01FB, "Tier 15 Block 12 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_13_THRESHOLD, 0x01FC, "Tier 15 Block 13 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_14_THRESHOLD, 0x01FD, "Tier 15 Block 14 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_15_THRESHOLD, 0x01FE, "Tier 15 Block 15 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_THRESHOLD_COUNT, 0x01FF, "Tier 15 Block Threshold Count" ) \
/* Block Period (Delivered) Set */ \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_START_OF_BLOCK_PERIOD, 0x0200, "Start of Block Period" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_BLOCK_PERIOD_DURATION, 0x0201, "Block Period Duration" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_THRESHOLD_MULTIPLIER, 0x0202, "Threshold Multiplier" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_THRESHOLD_DIVISOR, 0x0203, "Threshold Divisor" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_BLOCK_PERIOD_DURATION_TYPE, 0x0204, "Block Period Duration Type" ) \
/* Commodity */ \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_COMMODITY_TYPE, 0x0300, "Commodity Type" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_STANDING_CHARGE, 0x0301, "Standing Charge" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CONVERSION_FACTOR, 0x0302, "Conversion Factor" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CONVERSION_FACTOR_TRAILING_DIGIT,0x0303, "Conversion Factor TrailingDigit" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CALORIFIC_VALUE, 0x0304, "Calorific Value" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CALORIFIC_VALUE_UNIT, 0x0305, "Calorific Value Unit" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CALORIFIC_VALUE_TRAILING_DIGIT, 0x0306, "Calorific Value Trailing Digit" ) \
/* Block Price Information (Delivered) */ \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_NO_TIER_BLOCK_1_PRICE, 0x0400, "No Tier Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_NO_TIER_BLOCK_2_PRICE, 0x0401, "No Tier Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_NO_TIER_BLOCK_3_PRICE, 0x0402, "No Tier Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_NO_TIER_BLOCK_4_PRICE, 0x0403, "No Tier Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_NO_TIER_BLOCK_5_PRICE, 0x0404, "No Tier Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_NO_TIER_BLOCK_6_PRICE, 0x0405, "No Tier Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_NO_TIER_BLOCK_7_PRICE, 0x0406, "No Tier Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_NO_TIER_BLOCK_8_PRICE, 0x0407, "No Tier Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_NO_TIER_BLOCK_9_PRICE, 0x0408, "No Tier Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_NO_TIER_BLOCK_10_PRICE, 0x0409, "No Tier Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_NO_TIER_BLOCK_11_PRICE, 0x040A, "No Tier Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_NO_TIER_BLOCK_12_PRICE, 0x040B, "No Tier Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_NO_TIER_BLOCK_13_PRICE, 0x040C, "No Tier Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_NO_TIER_BLOCK_14_PRICE, 0x040D, "No Tier Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_NO_TIER_BLOCK_15_PRICE, 0x040E, "No Tier Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_NO_TIER_BLOCK_16_PRICE, 0x040F, "No Tier Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_1_PRICE, 0x0410, "Tier 1 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_2_PRICE, 0x0411, "Tier 1 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_3_PRICE, 0x0412, "Tier 1 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_4_PRICE, 0x0413, "Tier 1 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_5_PRICE, 0x0414, "Tier 1 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_6_PRICE, 0x0415, "Tier 1 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_7_PRICE, 0x0416, "Tier 1 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_8_PRICE, 0x0417, "Tier 1 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_9_PRICE, 0x0418, "Tier 1 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_10_PRICE, 0x0419, "Tier 1 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_11_PRICE, 0x041A, "Tier 1 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_12_PRICE, 0x041B, "Tier 1 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_13_PRICE, 0x041C, "Tier 1 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_14_PRICE, 0x041D, "Tier 1 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_15_PRICE, 0x041E, "Tier 1 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_1_BLOCK_16_PRICE, 0x041F, "Tier 1 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_1_PRICE, 0x0420, "Tier 2 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_2_PRICE, 0x0421, "Tier 2 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_3_PRICE, 0x0422, "Tier 2 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_4_PRICE, 0x0423, "Tier 2 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_5_PRICE, 0x0424, "Tier 2 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_6_PRICE, 0x0425, "Tier 2 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_7_PRICE, 0x0426, "Tier 2 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_8_PRICE, 0x0427, "Tier 2 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_9_PRICE, 0x0428, "Tier 2 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_10_PRICE, 0x0429, "Tier 2 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_11_PRICE, 0x042A, "Tier 2 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_12_PRICE, 0x042B, "Tier 2 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_13_PRICE, 0x042C, "Tier 2 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_14_PRICE, 0x042D, "Tier 2 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_15_PRICE, 0x042E, "Tier 2 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_2_BLOCK_16_PRICE, 0x042F, "Tier 2 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_1_PRICE, 0x0430, "Tier 3 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_2_PRICE, 0x0431, "Tier 3 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_3_PRICE, 0x0432, "Tier 3 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_4_PRICE, 0x0433, "Tier 3 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_5_PRICE, 0x0434, "Tier 3 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_6_PRICE, 0x0435, "Tier 3 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_7_PRICE, 0x0436, "Tier 3 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_8_PRICE, 0x0437, "Tier 3 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_9_PRICE, 0x0438, "Tier 3 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_10_PRICE, 0x0439, "Tier 3 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_11_PRICE, 0x043A, "Tier 3 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_12_PRICE, 0x043B, "Tier 3 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_13_PRICE, 0x043C, "Tier 3 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_14_PRICE, 0x043D, "Tier 3 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_15_PRICE, 0x043E, "Tier 3 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_3_BLOCK_16_PRICE, 0x043F, "Tier 3 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_1_PRICE, 0x0440, "Tier 4 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_2_PRICE, 0x0441, "Tier 4 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_3_PRICE, 0x0442, "Tier 4 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_4_PRICE, 0x0443, "Tier 4 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_5_PRICE, 0x0444, "Tier 4 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_6_PRICE, 0x0445, "Tier 4 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_7_PRICE, 0x0446, "Tier 4 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_8_PRICE, 0x0447, "Tier 4 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_9_PRICE, 0x0448, "Tier 4 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_10_PRICE, 0x0449, "Tier 4 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_11_PRICE, 0x044A, "Tier 4 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_12_PRICE, 0x044B, "Tier 4 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_13_PRICE, 0x044C, "Tier 4 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_14_PRICE, 0x044D, "Tier 4 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_15_PRICE, 0x044E, "Tier 4 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_4_BLOCK_16_PRICE, 0x044F, "Tier 4 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_1_PRICE, 0x0450, "Tier 5 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_2_PRICE, 0x0451, "Tier 5 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_3_PRICE, 0x0452, "Tier 5 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_4_PRICE, 0x0453, "Tier 5 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_5_PRICE, 0x0454, "Tier 5 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_6_PRICE, 0x0455, "Tier 5 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_7_PRICE, 0x0456, "Tier 5 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_8_PRICE, 0x0457, "Tier 5 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_9_PRICE, 0x0458, "Tier 5 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_10_PRICE, 0x0459, "Tier 5 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_11_PRICE, 0x045A, "Tier 5 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_12_PRICE, 0x045B, "Tier 5 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_13_PRICE, 0x045C, "Tier 5 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_14_PRICE, 0x045D, "Tier 5 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_15_PRICE, 0x045E, "Tier 5 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_5_BLOCK_16_PRICE, 0x045F, "Tier 5 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_1_PRICE, 0x0460, "Tier 6 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_2_PRICE, 0x0461, "Tier 6 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_3_PRICE, 0x0462, "Tier 6 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_4_PRICE, 0x0463, "Tier 6 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_5_PRICE, 0x0464, "Tier 6 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_6_PRICE, 0x0465, "Tier 6 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_7_PRICE, 0x0466, "Tier 6 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_8_PRICE, 0x0467, "Tier 6 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_9_PRICE, 0x0468, "Tier 6 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_10_PRICE, 0x0469, "Tier 6 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_11_PRICE, 0x046A, "Tier 6 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_12_PRICE, 0x046B, "Tier 6 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_13_PRICE, 0x046C, "Tier 6 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_14_PRICE, 0x046D, "Tier 6 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_15_PRICE, 0x046E, "Tier 6 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_6_BLOCK_16_PRICE, 0x046F, "Tier 6 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_1_PRICE, 0x0470, "Tier 7 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_2_PRICE, 0x0471, "Tier 7 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_3_PRICE, 0x0472, "Tier 7 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_4_PRICE, 0x0473, "Tier 7 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_5_PRICE, 0x0474, "Tier 7 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_6_PRICE, 0x0475, "Tier 7 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_7_PRICE, 0x0476, "Tier 7 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_8_PRICE, 0x0477, "Tier 7 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_9_PRICE, 0x0478, "Tier 7 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_10_PRICE, 0x0479, "Tier 7 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_11_PRICE, 0x047A, "Tier 7 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_12_PRICE, 0x047B, "Tier 7 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_13_PRICE, 0x047C, "Tier 7 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_14_PRICE, 0x047D, "Tier 7 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_15_PRICE, 0x047E, "Tier 7 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_7_BLOCK_16_PRICE, 0x047F, "Tier 7 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_1_PRICE, 0x0480, "Tier 8 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_2_PRICE, 0x0481, "Tier 8 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_3_PRICE, 0x0482, "Tier 8 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_4_PRICE, 0x0483, "Tier 8 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_5_PRICE, 0x0484, "Tier 8 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_6_PRICE, 0x0485, "Tier 8 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_7_PRICE, 0x0486, "Tier 8 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_8_PRICE, 0x0487, "Tier 8 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_9_PRICE, 0x0488, "Tier 8 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_10_PRICE, 0x0489, "Tier 8 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_11_PRICE, 0x048A, "Tier 8 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_12_PRICE, 0x048B, "Tier 8 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_13_PRICE, 0x048C, "Tier 8 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_14_PRICE, 0x048D, "Tier 8 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_15_PRICE, 0x048E, "Tier 8 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_8_BLOCK_16_PRICE, 0x048F, "Tier 8 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_1_PRICE, 0x0490, "Tier 9 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_2_PRICE, 0x0491, "Tier 9 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_3_PRICE, 0x0492, "Tier 9 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_4_PRICE, 0x0493, "Tier 9 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_5_PRICE, 0x0494, "Tier 9 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_6_PRICE, 0x0495, "Tier 9 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_7_PRICE, 0x0496, "Tier 9 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_8_PRICE, 0x0497, "Tier 9 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_9_PRICE, 0x0498, "Tier 9 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_10_PRICE, 0x0499, "Tier 9 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_11_PRICE, 0x049A, "Tier 9 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_12_PRICE, 0x049B, "Tier 9 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_13_PRICE, 0x049C, "Tier 9 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_14_PRICE, 0x049D, "Tier 9 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_15_PRICE, 0x049E, "Tier 9 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_9_BLOCK_16_PRICE, 0x049F, "Tier 9 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_1_PRICE, 0x04A0, "Tier 10 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_2_PRICE, 0x04A1, "Tier 10 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_3_PRICE, 0x04A2, "Tier 10 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_4_PRICE, 0x04A3, "Tier 10 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_5_PRICE, 0x04A4, "Tier 10 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_6_PRICE, 0x04A5, "Tier 10 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_7_PRICE, 0x04A6, "Tier 10 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_8_PRICE, 0x04A7, "Tier 10 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_9_PRICE, 0x04A8, "Tier 10 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_10_PRICE, 0x04A9, "Tier 10 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_11_PRICE, 0x04AA, "Tier 10 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_12_PRICE, 0x04AB, "Tier 10 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_13_PRICE, 0x04AC, "Tier 10 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_14_PRICE, 0x04AD, "Tier 10 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_15_PRICE, 0x04AE, "Tier 10 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_10_BLOCK_16_PRICE, 0x04AF, "Tier 10 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_1_PRICE, 0x04B0, "Tier 11 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_2_PRICE, 0x04B1, "Tier 11 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_3_PRICE, 0x04B2, "Tier 11 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_4_PRICE, 0x04B3, "Tier 11 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_5_PRICE, 0x04B4, "Tier 11 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_6_PRICE, 0x04B5, "Tier 11 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_7_PRICE, 0x04B6, "Tier 11 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_8_PRICE, 0x04B7, "Tier 11 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_9_PRICE, 0x04B8, "Tier 11 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_10_PRICE, 0x04B9, "Tier 11 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_11_PRICE, 0x04BA, "Tier 11 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_12_PRICE, 0x04BB, "Tier 11 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_13_PRICE, 0x04BC, "Tier 11 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_14_PRICE, 0x04BD, "Tier 11 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_15_PRICE, 0x04BE, "Tier 11 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_11_BLOCK_16_PRICE, 0x04BF, "Tier 11 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_1_PRICE, 0x04C0, "Tier 12 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_2_PRICE, 0x04C1, "Tier 12 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_3_PRICE, 0x04C2, "Tier 12 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_4_PRICE, 0x04C3, "Tier 12 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_5_PRICE, 0x04C4, "Tier 12 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_6_PRICE, 0x04C5, "Tier 12 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_7_PRICE, 0x04C6, "Tier 12 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_8_PRICE, 0x04C7, "Tier 12 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_9_PRICE, 0x04C8, "Tier 12 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_10_PRICE, 0x04C9, "Tier 12 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_11_PRICE, 0x04CA, "Tier 12 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_12_PRICE, 0x04CB, "Tier 12 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_13_PRICE, 0x04CC, "Tier 12 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_14_PRICE, 0x04CD, "Tier 12 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_15_PRICE, 0x04CE, "Tier 12 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_12_BLOCK_16_PRICE, 0x04CF, "Tier 12 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_1_PRICE, 0x04D0, "Tier 13 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_2_PRICE, 0x04D1, "Tier 13 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_3_PRICE, 0x04D2, "Tier 13 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_4_PRICE, 0x04D3, "Tier 13 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_5_PRICE, 0x04D4, "Tier 13 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_6_PRICE, 0x04D5, "Tier 13 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_7_PRICE, 0x04D6, "Tier 13 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_8_PRICE, 0x04D7, "Tier 13 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_9_PRICE, 0x04D8, "Tier 13 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_10_PRICE, 0x04D9, "Tier 13 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_11_PRICE, 0x04DA, "Tier 13 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_12_PRICE, 0x04DB, "Tier 13 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_13_PRICE, 0x04DC, "Tier 13 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_14_PRICE, 0x04DD, "Tier 13 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_15_PRICE, 0x04DE, "Tier 13 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_13_BLOCK_16_PRICE, 0x04DF, "Tier 13 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_1_PRICE, 0x04E0, "Tier 14 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_2_PRICE, 0x04E1, "Tier 14 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_3_PRICE, 0x04E2, "Tier 14 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_4_PRICE, 0x04E3, "Tier 14 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_5_PRICE, 0x04E4, "Tier 14 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_6_PRICE, 0x04E5, "Tier 14 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_7_PRICE, 0x04E6, "Tier 14 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_8_PRICE, 0x04E7, "Tier 14 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_9_PRICE, 0x04E8, "Tier 14 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_10_PRICE, 0x04E9, "Tier 14 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_11_PRICE, 0x04EA, "Tier 14 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_12_PRICE, 0x04EB, "Tier 14 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_13_PRICE, 0x04EC, "Tier 14 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_14_PRICE, 0x04ED, "Tier 14 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_15_PRICE, 0x04EE, "Tier 14 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_14_BLOCK_16_PRICE, 0x04EF, "Tier 14 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_1_PRICE, 0x04F0, "Tier 15 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_2_PRICE, 0x04F1, "Tier 15 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_3_PRICE, 0x04F2, "Tier 15 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_4_PRICE, 0x04F3, "Tier 15 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_5_PRICE, 0x04F4, "Tier 15 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_6_PRICE, 0x04F5, "Tier 15 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_7_PRICE, 0x04F6, "Tier 15 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_8_PRICE, 0x04F7, "Tier 15 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_9_PRICE, 0x04F8, "Tier 15 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_10_PRICE, 0x04F9, "Tier 15 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_11_PRICE, 0x04FA, "Tier 15 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_12_PRICE, 0x04FB, "Tier 15 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_13_PRICE, 0x04FC, "Tier 15 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_14_PRICE, 0x04FD, "Tier 15 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_15_PRICE, 0x04FE, "Tier 15 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_15_BLOCK_16_PRICE, 0x04FF, "Tier 15 Block 16 Price" ) \
/* Extended Price Information (Delivered) Set */ \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_16, 0x050F, "Price Tier 16" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_17, 0x0510, "Price Tier 17" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_18, 0x0511, "Price Tier 18" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_19, 0x0512, "Price Tier 19" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_20, 0x0513, "Price Tier 20" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_21, 0x0514, "Price Tier 21" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_22, 0x0515, "Price Tier 22" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_23, 0x0516, "Price Tier 23" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_24, 0x0517, "Price Tier 24" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_25, 0x0518, "Price Tier 25" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_26, 0x0519, "Price Tier 26" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_27, 0x051A, "Price Tier 27" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_28, 0x051B, "Price Tier 28" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_29, 0x051C, "Price Tier 29" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_30, 0x051D, "Price Tier 30" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_31, 0x051E, "Price Tier 31" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_32, 0x051F, "Price Tier 32" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_33, 0x0520, "Price Tier 33" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_34, 0x0521, "Price Tier 34" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_35, 0x0522, "Price Tier 35" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_36, 0x0523, "Price Tier 36" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_37, 0x0524, "Price Tier 37" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_38, 0x0525, "Price Tier 38" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_39, 0x0526, "Price Tier 39" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_40, 0x0527, "Price Tier 40" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_41, 0x0528, "Price Tier 41" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_42, 0x0529, "Price Tier 42" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_43, 0x052A, "Price Tier 43" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_44, 0x052B, "Price Tier 44" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_45, 0x052C, "Price Tier 45" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_46, 0x052D, "Price Tier 46" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_47, 0x052E, "Price Tier 47" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TIER_48, 0x052F, "Price Tier 48" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CPP_1_PRICE, 0x05FE, "CPP 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CPP_2_PRICE, 0x05FF, "CPP 2 Price" ) \
/* Tariff Information Set (Delivered) */ \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TARIFF_LABEL, 0x0610, "Tariff Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_NUMBER_OF_PRICE_TIERS_IN_USE, 0x0611, "Number of Price Tiers in Use" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_NUMBER_OF_BLOCK_THRES_IN_USE, 0x0612, "Number of Block Thresholds in Use" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TIER_BLOCK_MODE, 0x0613, "Tier Block Mode" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_UNIT_OF_MEASURE, 0x0615, "Unit of Measure" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CURRENCY, 0x0616, "Currency" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PRICE_TRAILING_DIGIT, 0x0617, "Price Trailing Digit" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_TARIFF_RESOLUTION_PERIOD, 0x0619, "Tariff Resolution Period" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CO2, 0x0620, "CO2" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CO2_UNIT, 0x0621, "CO2 Unit" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CO2_TRAILING_DIGIT, 0x0622, "CO2 Trailing Digit" ) \
/* Billing Information (Delivered) Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CURRENT_BILLING_PERIOD_START, 0x0700, "Current Billing Period Start" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CURRENT_BILLING_PERIOD_DURATION, 0x0701, "Current Billing Period Duration" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_LAST_BILLING_PERIOD_START, 0x0702, "Last Billing Period Start" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_LAST_BILLING_PERIOD_DURATION, 0x0703, "Last Billing Period Duration" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_LAST_BILLING_PERIOD_CON_BILL, 0x0704, "Last Billing Period Consolidated Bill" ) \
/* Credit Payment Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CREDIT_PAYMENT_DUE_DATE, 0x0800, "Credit Payment Due Date" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CREDIT_PAYMENT_STATUS, 0x0801, "Credit Payment Status" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CREDIT_PAYMENT_OVER_DUE_AMOUNT, 0x0802, "Credit Payment Over Due Amount" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PAYMENT_DISCOUNT, 0x080A, "Payment Discount" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_PAYMENT_DISCOUNT_PERIOD, 0x080B, "Payment Discount Period" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CREDIT_PAYMENT_1, 0x0810, "Credit Payment #1" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CREDIT_PAYMENT_DATE_1, 0x0811, "Credit Payment Date #1" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CREDIT_PAYMENT_REF_1, 0x0812, "Credit Payment Ref #1" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CREDIT_PAYMENT_2, 0x0820, "Credit Payment #2" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CREDIT_PAYMENT_DATE_2, 0x0821, "Credit Payment Date #2" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CREDIT_PAYMENT_REF_2, 0x0822, "Credit Payment Ref #2" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CREDIT_PAYMENT_3, 0x0830, "Credit Payment #3" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CREDIT_PAYMENT_DATE_3, 0x0831, "Credit Payment Date #3" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CREDIT_PAYMENT_REF_3, 0x0832, "Credit Payment Ref #3" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CREDIT_PAYMENT_4, 0x0840, "Credit Payment #4" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CREDIT_PAYMENT_DATE_4, 0x0841, "Credit Payment Date #4" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CREDIT_PAYMENT_REF_4, 0x0842, "Credit Payment Ref #4" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CREDIT_PAYMENT_5, 0x0850, "Credit Payment #5" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CREDIT_PAYMENT_DATE_5, 0x0851, "Credit Payment Date #5" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CREDIT_PAYMENT_REF_5, 0x0852, "Credit Payment Ref #5" ) \
/* Received Tier Label Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_1_PRICE_LABEL, 0x8000, "Received Tier 1 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_2_PRICE_LABEL, 0x8001, "Received Tier 2 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_3_PRICE_LABEL, 0x8002, "Received Tier 3 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_4_PRICE_LABEL, 0x8003, "Received Tier 4 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_5_PRICE_LABEL, 0x8004, "Received Tier 5 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_6_PRICE_LABEL, 0x8005, "Received Tier 6 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_7_PRICE_LABEL, 0x8006, "Received Tier 7 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_8_PRICE_LABEL, 0x8007, "Received Tier 8 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_9_PRICE_LABEL, 0x8008, "Received Tier 9 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_10_PRICE_LABEL, 0x8009, "Received Tier 10 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_11_PRICE_LABEL, 0x800A, "Received Tier 11 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_12_PRICE_LABEL, 0x800B, "Received Tier 12 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_13_PRICE_LABEL, 0x800C, "Received Tier 13 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_14_PRICE_LABEL, 0x800D, "Received Tier 14 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_15_PRICE_LABEL, 0x800E, "Received Tier 15 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_16_PRICE_LABEL, 0x800F, "Received Tier 16 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_17_PRICE_LABEL, 0x8010, "Received Tier 17 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_18_PRICE_LABEL, 0x8011, "Received Tier 18 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_19_PRICE_LABEL, 0x8012, "Received Tier 19 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_20_PRICE_LABEL, 0x8013, "Received Tier 20 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_21_PRICE_LABEL, 0x8014, "Received Tier 21 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_22_PRICE_LABEL, 0x8015, "Received Tier 22 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_23_PRICE_LABEL, 0x8016, "Received Tier 23 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_24_PRICE_LABEL, 0x8017, "Received Tier 24 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_25_PRICE_LABEL, 0x8018, "Received Tier 25 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_26_PRICE_LABEL, 0x8019, "Received Tier 26 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_27_PRICE_LABEL, 0x801A, "Received Tier 27 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_28_PRICE_LABEL, 0x801B, "Received Tier 28 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_29_PRICE_LABEL, 0x801C, "Received Tier 29 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_30_PRICE_LABEL, 0x801D, "Received Tier 30 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_31_PRICE_LABEL, 0x801E, "Received Tier 31 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_32_PRICE_LABEL, 0x801F, "Received Tier 32 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_33_PRICE_LABEL, 0x8020, "Received Tier 33 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_34_PRICE_LABEL, 0x8021, "Received Tier 34 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_35_PRICE_LABEL, 0x8022, "Received Tier 35 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_36_PRICE_LABEL, 0x8023, "Received Tier 36 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_37_PRICE_LABEL, 0x8024, "Received Tier 37 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_38_PRICE_LABEL, 0x8025, "Received Tier 38 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_39_PRICE_LABEL, 0x8026, "Received Tier 39 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_40_PRICE_LABEL, 0x8027, "Received Tier 40 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_41_PRICE_LABEL, 0x8028, "Received Tier 41 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_42_PRICE_LABEL, 0x8029, "Received Tier 42 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_43_PRICE_LABEL, 0x802A, "Received Tier 43 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_44_PRICE_LABEL, 0x802B, "Received Tier 44 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_45_PRICE_LABEL, 0x802C, "Received Tier 45 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_46_PRICE_LABEL, 0x802D, "Received Tier 46 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_47_PRICE_LABEL, 0x802E, "Received Tier 47 Price label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_48_PRICE_LABEL, 0x802F, "Received Tier 48 Price label" ) \
/* Received Block Threshold Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_BLOCK_1_THRESHOLD, 0x8100, "Received Block 1 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_BLOCK_2_THRESHOLD, 0x8101, "Received Block 2 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_BLOCK_3_THRESHOLD, 0x8102, "Received Block 3 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_BLOCK_4_THRESHOLD, 0x8103, "Received Block 4 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_BLOCK_5_THRESHOLD, 0x8104, "Received Block 5 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_BLOCK_6_THRESHOLD, 0x8105, "Received Block 6 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_BLOCK_7_THRESHOLD, 0x8106, "Received Block 7 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_BLOCK_8_THRESHOLD, 0x8107, "Received Block 8 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_BLOCK_9_THRESHOLD, 0x8108, "Received Block 9 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_BLOCK_10_THRESHOLD, 0x8109, "Received Block 10 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_BLOCK_11_THRESHOLD, 0x810A, "Received Block 11 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_BLOCK_12_THRESHOLD, 0x810B, "Received Block 12 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_BLOCK_13_THRESHOLD, 0x810C, "Received Block 13 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_BLOCK_14_THRESHOLD, 0x810D, "Received Block 14 Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_BLOCK_15_THRESHOLD, 0x810E, "Received Block 15 Threshold" ) \
/* Received Block Period Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_START_OF_BLOCK_PERIOD, 0x8200, "Received Start of Block Period" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_BLOCK_PERIOD_DURATION, 0x8201, "Received Block Period Duration" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_THRESHOLD_MULTIPLIER, 0x8202, "Received Threshold Multiplier" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_THRESHOLD_DIVISOR, 0x8203, "Received Threshold Divisor" ) \
/* Received Block Price Information Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_NO_TIER_BLOCK_1_PRICE, 0x8400, "Rx No Tier Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_NO_TIER_BLOCK_2_PRICE, 0x8401, "Rx No Tier Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_NO_TIER_BLOCK_3_PRICE, 0x8402, "Rx No Tier Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_NO_TIER_BLOCK_4_PRICE, 0x8403, "Rx No Tier Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_NO_TIER_BLOCK_5_PRICE, 0x8404, "Rx No Tier Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_NO_TIER_BLOCK_6_PRICE, 0x8405, "Rx No Tier Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_NO_TIER_BLOCK_7_PRICE, 0x8406, "Rx No Tier Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_NO_TIER_BLOCK_8_PRICE, 0x8407, "Rx No Tier Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_NO_TIER_BLOCK_9_PRICE, 0x8408, "Rx No Tier Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_NO_TIER_BLOCK_10_PRICE, 0x8409, "Rx No Tier Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_NO_TIER_BLOCK_11_PRICE, 0x840A, "Rx No Tier Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_NO_TIER_BLOCK_12_PRICE, 0x840B, "Rx No Tier Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_NO_TIER_BLOCK_13_PRICE, 0x840C, "Rx No Tier Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_NO_TIER_BLOCK_14_PRICE, 0x840D, "Rx No Tier Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_NO_TIER_BLOCK_15_PRICE, 0x840E, "Rx No Tier Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_NO_TIER_BLOCK_16_PRICE, 0x840F, "Rx No Tier Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_1_BLOCK_1_PRICE, 0x8410, "Rx Tier 1 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_1_BLOCK_2_PRICE, 0x8411, "Rx Tier 1 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_1_BLOCK_3_PRICE, 0x8412, "Rx Tier 1 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_1_BLOCK_4_PRICE, 0x8413, "Rx Tier 1 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_1_BLOCK_5_PRICE, 0x8414, "Rx Tier 1 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_1_BLOCK_6_PRICE, 0x8415, "Rx Tier 1 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_1_BLOCK_7_PRICE, 0x8416, "Rx Tier 1 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_1_BLOCK_8_PRICE, 0x8417, "Rx Tier 1 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_1_BLOCK_9_PRICE, 0x8418, "Rx Tier 1 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_1_BLOCK_10_PRICE, 0x8419, "Rx Tier 1 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_1_BLOCK_11_PRICE, 0x841A, "Rx Tier 1 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_1_BLOCK_12_PRICE, 0x841B, "Rx Tier 1 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_1_BLOCK_13_PRICE, 0x841C, "Rx Tier 1 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_1_BLOCK_14_PRICE, 0x841D, "Rx Tier 1 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_1_BLOCK_15_PRICE, 0x841E, "Rx Tier 1 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_1_BLOCK_16_PRICE, 0x841F, "Rx Tier 1 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_2_BLOCK_1_PRICE, 0x8420, "Rx Tier 2 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_2_BLOCK_2_PRICE, 0x8421, "Rx Tier 2 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_2_BLOCK_3_PRICE, 0x8422, "Rx Tier 2 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_2_BLOCK_4_PRICE, 0x8423, "Rx Tier 2 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_2_BLOCK_5_PRICE, 0x8424, "Rx Tier 2 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_2_BLOCK_6_PRICE, 0x8425, "Rx Tier 2 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_2_BLOCK_7_PRICE, 0x8426, "Rx Tier 2 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_2_BLOCK_8_PRICE, 0x8427, "Rx Tier 2 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_2_BLOCK_9_PRICE, 0x8428, "Rx Tier 2 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_2_BLOCK_10_PRICE, 0x8429, "Rx Tier 2 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_2_BLOCK_11_PRICE, 0x842A, "Rx Tier 2 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_2_BLOCK_12_PRICE, 0x842B, "Rx Tier 2 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_2_BLOCK_13_PRICE, 0x842C, "Rx Tier 2 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_2_BLOCK_14_PRICE, 0x842D, "Rx Tier 2 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_2_BLOCK_15_PRICE, 0x842E, "Rx Tier 2 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_2_BLOCK_16_PRICE, 0x842F, "Rx Tier 2 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_3_BLOCK_1_PRICE, 0x8430, "Rx Tier 3 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_3_BLOCK_2_PRICE, 0x8431, "Rx Tier 3 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_3_BLOCK_3_PRICE, 0x8432, "Rx Tier 3 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_3_BLOCK_4_PRICE, 0x8433, "Rx Tier 3 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_3_BLOCK_5_PRICE, 0x8434, "Rx Tier 3 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_3_BLOCK_6_PRICE, 0x8435, "Rx Tier 3 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_3_BLOCK_7_PRICE, 0x8436, "Rx Tier 3 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_3_BLOCK_8_PRICE, 0x8437, "Rx Tier 3 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_3_BLOCK_9_PRICE, 0x8438, "Rx Tier 3 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_3_BLOCK_10_PRICE, 0x8439, "Rx Tier 3 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_3_BLOCK_11_PRICE, 0x843A, "Rx Tier 3 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_3_BLOCK_12_PRICE, 0x843B, "Rx Tier 3 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_3_BLOCK_13_PRICE, 0x843C, "Rx Tier 3 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_3_BLOCK_14_PRICE, 0x843D, "Rx Tier 3 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_3_BLOCK_15_PRICE, 0x843E, "Rx Tier 3 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_3_BLOCK_16_PRICE, 0x843F, "Rx Tier 3 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_4_BLOCK_1_PRICE, 0x8440, "Rx Tier 4 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_4_BLOCK_2_PRICE, 0x8441, "Rx Tier 4 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_4_BLOCK_3_PRICE, 0x8442, "Rx Tier 4 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_4_BLOCK_4_PRICE, 0x8443, "Rx Tier 4 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_4_BLOCK_5_PRICE, 0x8444, "Rx Tier 4 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_4_BLOCK_6_PRICE, 0x8445, "Rx Tier 4 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_4_BLOCK_7_PRICE, 0x8446, "Rx Tier 4 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_4_BLOCK_8_PRICE, 0x8447, "Rx Tier 4 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_4_BLOCK_9_PRICE, 0x8448, "Rx Tier 4 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_4_BLOCK_10_PRICE, 0x8449, "Rx Tier 4 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_4_BLOCK_11_PRICE, 0x844A, "Rx Tier 4 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_4_BLOCK_12_PRICE, 0x844B, "Rx Tier 4 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_4_BLOCK_13_PRICE, 0x844C, "Rx Tier 4 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_4_BLOCK_14_PRICE, 0x844D, "Rx Tier 4 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_4_BLOCK_15_PRICE, 0x844E, "Rx Tier 4 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_4_BLOCK_16_PRICE, 0x844F, "Rx Tier 4 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_5_BLOCK_1_PRICE, 0x8450, "Rx Tier 5 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_5_BLOCK_2_PRICE, 0x8451, "Rx Tier 5 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_5_BLOCK_3_PRICE, 0x8452, "Rx Tier 5 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_5_BLOCK_4_PRICE, 0x8453, "Rx Tier 5 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_5_BLOCK_5_PRICE, 0x8454, "Rx Tier 5 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_5_BLOCK_6_PRICE, 0x8455, "Rx Tier 5 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_5_BLOCK_7_PRICE, 0x8456, "Rx Tier 5 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_5_BLOCK_8_PRICE, 0x8457, "Rx Tier 5 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_5_BLOCK_9_PRICE, 0x8458, "Rx Tier 5 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_5_BLOCK_10_PRICE, 0x8459, "Rx Tier 5 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_5_BLOCK_11_PRICE, 0x845A, "Rx Tier 5 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_5_BLOCK_12_PRICE, 0x845B, "Rx Tier 5 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_5_BLOCK_13_PRICE, 0x845C, "Rx Tier 5 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_5_BLOCK_14_PRICE, 0x845D, "Rx Tier 5 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_5_BLOCK_15_PRICE, 0x845E, "Rx Tier 5 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_5_BLOCK_16_PRICE, 0x845F, "Rx Tier 5 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_6_BLOCK_1_PRICE, 0x8460, "Rx Tier 6 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_6_BLOCK_2_PRICE, 0x8461, "Rx Tier 6 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_6_BLOCK_3_PRICE, 0x8462, "Rx Tier 6 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_6_BLOCK_4_PRICE, 0x8463, "Rx Tier 6 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_6_BLOCK_5_PRICE, 0x8464, "Rx Tier 6 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_6_BLOCK_6_PRICE, 0x8465, "Rx Tier 6 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_6_BLOCK_7_PRICE, 0x8466, "Rx Tier 6 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_6_BLOCK_8_PRICE, 0x8467, "Rx Tier 6 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_6_BLOCK_9_PRICE, 0x8468, "Rx Tier 6 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_6_BLOCK_10_PRICE, 0x8469, "Rx Tier 6 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_6_BLOCK_11_PRICE, 0x846A, "Rx Tier 6 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_6_BLOCK_12_PRICE, 0x846B, "Rx Tier 6 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_6_BLOCK_13_PRICE, 0x846C, "Rx Tier 6 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_6_BLOCK_14_PRICE, 0x846D, "Rx Tier 6 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_6_BLOCK_15_PRICE, 0x846E, "Rx Tier 6 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_6_BLOCK_16_PRICE, 0x846F, "Rx Tier 6 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_7_BLOCK_1_PRICE, 0x8470, "Rx Tier 7 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_7_BLOCK_2_PRICE, 0x8471, "Rx Tier 7 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_7_BLOCK_3_PRICE, 0x8472, "Rx Tier 7 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_7_BLOCK_4_PRICE, 0x8473, "Rx Tier 7 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_7_BLOCK_5_PRICE, 0x8474, "Rx Tier 7 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_7_BLOCK_6_PRICE, 0x8475, "Rx Tier 7 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_7_BLOCK_7_PRICE, 0x8476, "Rx Tier 7 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_7_BLOCK_8_PRICE, 0x8477, "Rx Tier 7 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_7_BLOCK_9_PRICE, 0x8478, "Rx Tier 7 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_7_BLOCK_10_PRICE, 0x8479, "Rx Tier 7 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_7_BLOCK_11_PRICE, 0x847A, "Rx Tier 7 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_7_BLOCK_12_PRICE, 0x847B, "Rx Tier 7 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_7_BLOCK_13_PRICE, 0x847C, "Rx Tier 7 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_7_BLOCK_14_PRICE, 0x847D, "Rx Tier 7 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_7_BLOCK_15_PRICE, 0x847E, "Rx Tier 7 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_7_BLOCK_16_PRICE, 0x847F, "Rx Tier 7 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_8_BLOCK_1_PRICE, 0x8480, "Rx Tier 8 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_8_BLOCK_2_PRICE, 0x8481, "Rx Tier 8 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_8_BLOCK_3_PRICE, 0x8482, "Rx Tier 8 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_8_BLOCK_4_PRICE, 0x8483, "Rx Tier 8 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_8_BLOCK_5_PRICE, 0x8484, "Rx Tier 8 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_8_BLOCK_6_PRICE, 0x8485, "Rx Tier 8 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_8_BLOCK_7_PRICE, 0x8486, "Rx Tier 8 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_8_BLOCK_8_PRICE, 0x8487, "Rx Tier 8 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_8_BLOCK_9_PRICE, 0x8488, "Rx Tier 8 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_8_BLOCK_10_PRICE, 0x8489, "Rx Tier 8 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_8_BLOCK_11_PRICE, 0x848A, "Rx Tier 8 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_8_BLOCK_12_PRICE, 0x848B, "Rx Tier 8 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_8_BLOCK_13_PRICE, 0x848C, "Rx Tier 8 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_8_BLOCK_14_PRICE, 0x848D, "Rx Tier 8 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_8_BLOCK_15_PRICE, 0x848E, "Rx Tier 8 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_8_BLOCK_16_PRICE, 0x848F, "Rx Tier 8 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_9_BLOCK_1_PRICE, 0x8490, "Rx Tier 9 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_9_BLOCK_2_PRICE, 0x8491, "Rx Tier 9 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_9_BLOCK_3_PRICE, 0x8492, "Rx Tier 9 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_9_BLOCK_4_PRICE, 0x8493, "Rx Tier 9 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_9_BLOCK_5_PRICE, 0x8494, "Rx Tier 9 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_9_BLOCK_6_PRICE, 0x8495, "Rx Tier 9 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_9_BLOCK_7_PRICE, 0x8496, "Rx Tier 9 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_9_BLOCK_8_PRICE, 0x8497, "Rx Tier 9 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_9_BLOCK_9_PRICE, 0x8498, "Rx Tier 9 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_9_BLOCK_10_PRICE, 0x8499, "Rx Tier 9 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_9_BLOCK_11_PRICE, 0x849A, "Rx Tier 9 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_9_BLOCK_12_PRICE, 0x849B, "Rx Tier 9 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_9_BLOCK_13_PRICE, 0x849C, "Rx Tier 9 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_9_BLOCK_14_PRICE, 0x849D, "Rx Tier 9 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_9_BLOCK_15_PRICE, 0x849E, "Rx Tier 9 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_9_BLOCK_16_PRICE, 0x849F, "Rx Tier 9 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_10_BLOCK_1_PRICE, 0x84A0, "Rx Tier 10 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_10_BLOCK_2_PRICE, 0x84A1, "Rx Tier 10 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_10_BLOCK_3_PRICE, 0x84A2, "Rx Tier 10 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_10_BLOCK_4_PRICE, 0x84A3, "Rx Tier 10 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_10_BLOCK_5_PRICE, 0x84A4, "Rx Tier 10 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_10_BLOCK_6_PRICE, 0x84A5, "Rx Tier 10 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_10_BLOCK_7_PRICE, 0x84A6, "Rx Tier 10 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_10_BLOCK_8_PRICE, 0x84A7, "Rx Tier 10 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_10_BLOCK_9_PRICE, 0x84A8, "Rx Tier 10 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_10_BLOCK_10_PRICE, 0x84A9, "Rx Tier 10 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_10_BLOCK_11_PRICE, 0x84AA, "Rx Tier 10 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_10_BLOCK_12_PRICE, 0x84AB, "Rx Tier 10 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_10_BLOCK_13_PRICE, 0x84AC, "Rx Tier 10 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_10_BLOCK_14_PRICE, 0x84AD, "Rx Tier 10 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_10_BLOCK_15_PRICE, 0x84AE, "Rx Tier 10 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_10_BLOCK_16_PRICE, 0x84AF, "Rx Tier 10 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_11_BLOCK_1_PRICE, 0x84B0, "Rx Tier 11 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_11_BLOCK_2_PRICE, 0x84B1, "Rx Tier 11 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_11_BLOCK_3_PRICE, 0x84B2, "Rx Tier 11 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_11_BLOCK_4_PRICE, 0x84B3, "Rx Tier 11 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_11_BLOCK_5_PRICE, 0x84B4, "Rx Tier 11 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_11_BLOCK_6_PRICE, 0x84B5, "Rx Tier 11 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_11_BLOCK_7_PRICE, 0x84B6, "Rx Tier 11 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_11_BLOCK_8_PRICE, 0x84B7, "Rx Tier 11 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_11_BLOCK_9_PRICE, 0x84B8, "Rx Tier 11 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_11_BLOCK_10_PRICE, 0x84B9, "Rx Tier 11 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_11_BLOCK_11_PRICE, 0x84BA, "Rx Tier 11 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_11_BLOCK_12_PRICE, 0x84BB, "Rx Tier 11 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_11_BLOCK_13_PRICE, 0x84BC, "Rx Tier 11 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_11_BLOCK_14_PRICE, 0x84BD, "Rx Tier 11 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_11_BLOCK_15_PRICE, 0x84BE, "Rx Tier 11 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_11_BLOCK_16_PRICE, 0x84BF, "Rx Tier 11 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_12_BLOCK_1_PRICE, 0x84C0, "Rx Tier 12 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_12_BLOCK_2_PRICE, 0x84C1, "Rx Tier 12 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_12_BLOCK_3_PRICE, 0x84C2, "Rx Tier 12 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_12_BLOCK_4_PRICE, 0x84C3, "Rx Tier 12 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_12_BLOCK_5_PRICE, 0x84C4, "Rx Tier 12 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_12_BLOCK_6_PRICE, 0x84C5, "Rx Tier 12 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_12_BLOCK_7_PRICE, 0x84C6, "Rx Tier 12 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_12_BLOCK_8_PRICE, 0x84C7, "Rx Tier 12 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_12_BLOCK_9_PRICE, 0x84C8, "Rx Tier 12 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_12_BLOCK_10_PRICE, 0x84C9, "Rx Tier 12 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_12_BLOCK_11_PRICE, 0x84CA, "Rx Tier 12 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_12_BLOCK_12_PRICE, 0x84CB, "Rx Tier 12 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_12_BLOCK_13_PRICE, 0x84CC, "Rx Tier 12 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_12_BLOCK_14_PRICE, 0x84CD, "Rx Tier 12 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_12_BLOCK_15_PRICE, 0x84CE, "Rx Tier 12 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_12_BLOCK_16_PRICE, 0x84CF, "Rx Tier 12 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_13_BLOCK_1_PRICE, 0x84D0, "Rx Tier 13 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_13_BLOCK_2_PRICE, 0x84D1, "Rx Tier 13 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_13_BLOCK_3_PRICE, 0x84D2, "Rx Tier 13 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_13_BLOCK_4_PRICE, 0x84D3, "Rx Tier 13 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_13_BLOCK_5_PRICE, 0x84D4, "Rx Tier 13 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_13_BLOCK_6_PRICE, 0x84D5, "Rx Tier 13 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_13_BLOCK_7_PRICE, 0x84D6, "Rx Tier 13 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_13_BLOCK_8_PRICE, 0x84D7, "Rx Tier 13 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_13_BLOCK_9_PRICE, 0x84D8, "Rx Tier 13 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_13_BLOCK_10_PRICE, 0x84D9, "Rx Tier 13 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_13_BLOCK_11_PRICE, 0x84DA, "Rx Tier 13 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_13_BLOCK_12_PRICE, 0x84DB, "Rx Tier 13 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_13_BLOCK_13_PRICE, 0x84DC, "Rx Tier 13 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_13_BLOCK_14_PRICE, 0x84DD, "Rx Tier 13 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_13_BLOCK_15_PRICE, 0x84DE, "Rx Tier 13 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_13_BLOCK_16_PRICE, 0x84DF, "Rx Tier 13 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_14_BLOCK_1_PRICE, 0x84E0, "Rx Tier 14 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_14_BLOCK_2_PRICE, 0x84E1, "Rx Tier 14 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_14_BLOCK_3_PRICE, 0x84E2, "Rx Tier 14 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_14_BLOCK_4_PRICE, 0x84E3, "Rx Tier 14 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_14_BLOCK_5_PRICE, 0x84E4, "Rx Tier 14 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_14_BLOCK_6_PRICE, 0x84E5, "Rx Tier 14 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_14_BLOCK_7_PRICE, 0x84E6, "Rx Tier 14 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_14_BLOCK_8_PRICE, 0x84E7, "Rx Tier 14 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_14_BLOCK_9_PRICE, 0x84E8, "Rx Tier 14 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_14_BLOCK_10_PRICE, 0x84E9, "Rx Tier 14 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_14_BLOCK_11_PRICE, 0x84EA, "Rx Tier 14 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_14_BLOCK_12_PRICE, 0x84EB, "Rx Tier 14 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_14_BLOCK_13_PRICE, 0x84EC, "Rx Tier 14 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_14_BLOCK_14_PRICE, 0x84ED, "Rx Tier 14 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_14_BLOCK_15_PRICE, 0x84EE, "Rx Tier 14 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_14_BLOCK_16_PRICE, 0x84EF, "Rx Tier 14 Block 16 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_15_BLOCK_1_PRICE, 0x84F0, "Rx Tier 15 Block 1 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_15_BLOCK_2_PRICE, 0x84F1, "Rx Tier 15 Block 2 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_15_BLOCK_3_PRICE, 0x84F2, "Rx Tier 15 Block 3 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_15_BLOCK_4_PRICE, 0x84F3, "Rx Tier 15 Block 4 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_15_BLOCK_5_PRICE, 0x84F4, "Rx Tier 15 Block 5 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_15_BLOCK_6_PRICE, 0x84F5, "Rx Tier 15 Block 6 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_15_BLOCK_7_PRICE, 0x84F6, "Rx Tier 15 Block 7 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_15_BLOCK_8_PRICE, 0x84F7, "Rx Tier 15 Block 8 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_15_BLOCK_9_PRICE, 0x84F8, "Rx Tier 15 Block 9 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_15_BLOCK_10_PRICE, 0x84F9, "Rx Tier 15 Block 10 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_15_BLOCK_11_PRICE, 0x84FA, "Rx Tier 15 Block 11 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_15_BLOCK_12_PRICE, 0x84FB, "Rx Tier 15 Block 12 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_15_BLOCK_13_PRICE, 0x84FC, "Rx Tier 15 Block 13 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_15_BLOCK_14_PRICE, 0x84FD, "Rx Tier 15 Block 14 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_15_BLOCK_15_PRICE, 0x84FE, "Rx Tier 15 Block 15 Price" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_TIER_15_BLOCK_16_PRICE, 0x84FF, "Rx Tier 15 Block 16 Price" ) \
/* Received Extended Price Information Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_16, 0x850F, "Received Price Tier 16" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_17, 0x8510, "Received Price Tier 17" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_18, 0x8511, "Received Price Tier 18" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_19, 0x8512, "Received Price Tier 19" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_20, 0x8513, "Received Price Tier 20" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_21, 0x8514, "Received Price Tier 21" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_22, 0x8515, "Received Price Tier 22" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_23, 0x8516, "Received Price Tier 23" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_24, 0x8517, "Received Price Tier 24" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_25, 0x8518, "Received Price Tier 25" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_26, 0x8519, "Received Price Tier 26" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_27, 0x851A, "Received Price Tier 27" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_28, 0x851B, "Received Price Tier 28" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_29, 0x851C, "Received Price Tier 29" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_30, 0x851D, "Received Price Tier 30" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_31, 0x851E, "Received Price Tier 31" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_32, 0x851F, "Received Price Tier 32" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_33, 0x8520, "Received Price Tier 33" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_34, 0x8521, "Received Price Tier 34" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_35, 0x8522, "Received Price Tier 35" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_36, 0x8523, "Received Price Tier 36" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_37, 0x8524, "Received Price Tier 37" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_38, 0x8525, "Received Price Tier 38" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_39, 0x8526, "Received Price Tier 39" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_40, 0x8527, "Received Price Tier 40" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_41, 0x8528, "Received Price Tier 41" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_42, 0x8529, "Received Price Tier 42" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_43, 0x852A, "Received Price Tier 43" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_44, 0x852B, "Received Price Tier 44" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_45, 0x852C, "Received Price Tier 45" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_46, 0x852D, "Received Price Tier 46" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_47, 0x852E, "Received Price Tier 47" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_PRICE_TIER_48, 0x852F, "Received Price Tier 48" ) \
/* Received Tariff Information Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TARIFF_LABEL, 0x8610, "Received Tariff label" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_NUM_OF_PRICE_TIERS_IN_USE, 0x8611, "Received Number of Tariff Tiers in Use" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_NUM_OF_BLOCK_THRES_IN_USE, 0x8612, "Received Number of Block Thresholds in Use" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TIER_BLOCK_MODE, 0x8613, "Received Tier Block Mode" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_TARIFF_RES_PERIOD, 0x8615, "Received tariff Resolution Period" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_CO2, 0x8625, "Received CO2" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_CO2_UNIT, 0x8626, "Received CO2 Unit" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RECEIVED_CO2_TRAILING_DIGIT, 0x8627, "Received CO2 Trailing Digit" ) \
/* Received Billing Information Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_CURRENT_BILLING_PERIOD_START, 0x8700, "Received Current Billing Period Start" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_CURRENT_BILLING_PERIOD_DUR, 0x8701, "Received Current Billing Period Duration" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_LAST_BILLING_PERIOD_START, 0x8702, "Received Last Billing Period Start" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_RX_LAST_BILLING_PERIOD_CON_BILL, 0x8704, "Received Last Billing Period Consolidated Bill" ) \
/* Smart Energy */ \
XXX(ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_PRICE, 0xFFFE, "Attribute Reporting Status" )
VALUE_STRING_ENUM(zbee_zcl_price_attr_server_names);
VALUE_STRING_ARRAY(zbee_zcl_price_attr_server_names);
static value_string_ext zbee_zcl_price_attr_server_names_ext = VALUE_STRING_EXT_INIT(zbee_zcl_price_attr_server_names);
#define zbee_zcl_price_attr_client_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CLNT_PRICE_INC_RND_MINUTES, 0x0000, "Price Increase Randomize Minutes" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CLNT_PRICE_DEC_RND_MINUTES, 0x0001, "Price Decrease Randomize Minutes" ) \
XXX(ZBEE_ZCL_ATTR_ID_PRICE_CLNT_COMMODITY_TYPE, 0x0002, "Commodity Type" ) \
/* Smart Energy */ \
XXX(ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_PRICE_CLNT, 0xFFFE, "Attribute Reporting Status" )
VALUE_STRING_ENUM(zbee_zcl_price_attr_client_names);
VALUE_STRING_ARRAY(zbee_zcl_price_attr_client_names);
/* Server Commands Received */
#define zbee_zcl_price_srv_rx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_GET_CURRENT_PRICE, 0x00, "Get Current Price" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_GET_SCHEDULED_PRICES, 0x01, "Get Scheduled Prices" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_GET_PRICE_ACKNOWLEDGEMENT, 0x02, "Price Acknowledgement" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_GET_BLOCK_PERIOD, 0x03, "Get Block Period(s)" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_GET_CONVERSION_FACTOR, 0x04, "Get Conversion Factor" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_GET_CALORIFIC_VALUE, 0x05, "Get Calorific Value" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_GET_TARIFF_INFORMATION, 0x06, "Get Tariff Information" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_GET_PRICE_MATRIX, 0x07, "Get Price Matrix" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_GET_BLOCK_THRESHOLDS, 0x08, "Get Block Thresholds" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_GET_CO2_VALUE, 0x09, "Get CO2 Value" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_GET_TIER_LABELS, 0x0A, "Get Tier Labels" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_GET_BILLING_PERIOD, 0x0B, "Get Billing Period" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_GET_CONSOLIDATED_BILL, 0x0C, "Get Consolidated Bill" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_CPP_EVENT_RESPONSE, 0x0D, "CPP Event Response" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_GET_CREDIT_PAYMENT, 0x0E, "Get Credit Payment" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_GET_CURRENCY_CONVERSION, 0x0F, "Get Currency Conversion" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_GET_TARIFF_CANCELLATION, 0x10, "Get Tariff Cancellation" )
VALUE_STRING_ENUM(zbee_zcl_price_srv_rx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_price_srv_rx_cmd_names);
/* Server Commands Generated */
#define zbee_zcl_price_srv_tx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_PRICE, 0x00, "Publish Price" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_BLOCK_PERIOD, 0x01, "Publish Block Period" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_CONVERSION_FACTOR, 0x02, "Publish Conversion Factor" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_CALORIFIC_VALUE, 0x03, "Publish Calorific Value" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_TARIFF_INFORMATION, 0x04, "Publish Tariff Information" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_PRICE_MATRIX, 0x05, "Publish Price Matrix" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_BLOCK_THRESHOLDS, 0x06, "Publish Block Thresholds" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_CO2_VALUE, 0x07, "Publish CO2 Value" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_TIER_LABELS, 0x08, "Publish Tier Labels" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_BILLING_PERIOD, 0x09, "Publish Billing Period" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_CONSOLIDATED_BILL, 0x0A, "Publish Consolidated Bill" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_CPP_EVENT, 0x0B, "Publish CPP Event" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_CREDIT_PAYMENT, 0x0C, "Publish Credit Payment" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_CURRENCY_CONVERSION, 0x0D, "Publish Currency Conversion" ) \
XXX(ZBEE_ZCL_CMD_ID_PRICE_CANCEL_TARIFF, 0x0E, "Cancel Tariff" )
VALUE_STRING_ENUM(zbee_zcl_price_srv_tx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_price_srv_tx_cmd_names);
/* Block Period Control Field BitMap - Price Acknowledgement */
#define zbee_zcl_price_block_period_control_price_acknowledgement_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_PRICE_BLOCK_PERIOD_CONTROL_PRICE_ACKNOLEDGEMENT_NOT_REQUIRED, 0x0, "Price Acknowledgement not required" ) \
XXX(ZBEE_ZCL_PRICE_BLOCK_PERIOD_CONTROL_PRICE_ACKNOLEDGEMENT_REQUIRED, 0x1, "Price Acknowledgement required" )
VALUE_STRING_ARRAY(zbee_zcl_price_block_period_control_price_acknowledgement_names);
/* Block Period Control Field BitMap - Repeating Block */
#define zbee_zcl_price_block_period_control_repeating_block_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_PRICE_BLOCK_PERIOD_CONTROL_REPEATING_BLOCK_NON_REPEATING, 0x0, "Non Repeating Block" ) \
XXX(ZBEE_ZCL_PRICE_BLOCK_PERIOD_CONTROL_REPEATING_BLOCK_REPEATING, 0x1, "Repeating Block" )
VALUE_STRING_ARRAY(zbee_zcl_price_block_period_control_repeating_block_names);
/* Block Period DurationTimebase Enumeration */
#define zbee_zcl_price_block_period_duration_timebase_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_PRICE_BLOCK_PERIOD_DURATION_TIMEBASE_MINUTE, 0x0, "Minutes" ) \
XXX(ZBEE_ZCL_PRICE_BLOCK_PERIOD_DURATION_TIMEBASE_DAY, 0x1, "Days" ) \
XXX(ZBEE_ZCL_PRICE_BLOCK_PERIOD_DURATION_TIMEBASE_WEEK, 0x2, "Weeks" ) \
XXX(ZBEE_ZCL_PRICE_BLOCK_PERIOD_DURATION_TIMEBASE_MONTH, 0x3, "Months" )
VALUE_STRING_ARRAY(zbee_zcl_price_block_period_duration_timebase_names);
/* Block Period Duration Control Enumeration */
#define zbee_zcl_price_block_period_duration_control_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_PRICE_BLOCK_PERIOD_DURATION_CONTROL_START_OF_TIMEBASE, 0x0, "Start of Timebase" ) \
XXX(ZBEE_ZCL_PRICE_BLOCK_PERIOD_DURATION_CONTROL_END_OF_TIMEBASE, 0x1, "End of Timebase" ) \
XXX(ZBEE_ZCL_PRICE_BLOCK_PERIOD_DURATION_CONTROL_NOT_SPECIFIED, 0x2, "Not Specified" )
VALUE_STRING_ARRAY(zbee_zcl_price_block_period_duration_control_names);
/* Tariff Type Enumeration */
#define zbee_zcl_price_tariff_type_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_PRICE_TARIFF_TYPE_DELIVERED_TARIFF, 0x0, "Delivered Tariff" ) \
XXX(ZBEE_ZCL_PRICE_TARIFF_TYPE_RECEIVED_TARIFF, 0x1, "Received Tariff" ) \
XXX(ZBEE_ZCL_PRICE_TARIFF_TYPE_DELIVERED_AND_RECEIVED_TARIFF, 0x2, "delivered and Received Tariff" )
VALUE_STRING_ARRAY(zbee_zcl_price_tariff_type_names);
/* Tariff Resolution Period Enumeration */
#define zbee_zcl_price_tariff_resolution_period_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_PRICE_TARIFF_RESOLUTION_PERIOD_NOT_DEFINED, 0x00, "Not Defined" ) \
XXX(ZBEE_ZCL_PRICE_TARIFF_RESOLUTION_PERIOD_BLOCK_PERIOD, 0x01, "Block Period" ) \
XXX(ZBEE_ZCL_PRICE_TARIFF_RESOLUTION_PERIOD_1_DAY, 0x02, "1 Day" )
VALUE_STRING_ARRAY(zbee_zcl_price_tariff_resolution_period_names);
/* Tariff Charging Scheme Enumeration */
#define zbee_zcl_price_tariff_charging_scheme_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_PRICE_TARIFF_CHARGING_SCHEME_TOU_TARIFF, 0x0, "TOU Tariff" ) \
XXX(ZBEE_ZCL_PRICE_TARIFF_CHARGING_SCHEME_BLOCK_TARIFF, 0x1, "Block Tariff" ) \
XXX(ZBEE_ZCL_PRICE_TARIFF_CHARGING_SCHEME_BLOCK_TOU_WITH_COMMON_THRES, 0x2, "Block/TOU Tariff with common thresholds" ) \
XXX(ZBEE_ZCL_PRICE_TARIFF_CHARGING_SCHEME_BLOCK_TOU_WITH_INDIV_TRHES, 0x3, "Block/TOU Tariff with individual thresholds per tier" )
VALUE_STRING_ARRAY(zbee_zcl_price_tariff_charging_scheme_names);
/* Tariff Type */
#define ZBEE_ZCL_PRICE_TARIFF_TYPE 0x0F
/* Trailing Digit and Price Tier */
#define ZBEE_ZCL_PRICE_TIER 0x0F
#define ZBEE_ZCL_PRICE_TRAILING_DIGIT 0xF0
/* Number of Price Tiers and Register Tier */
#define ZBEE_ZCL_PRICE_REGISTER_TIER 0x0F
#define ZBEE_ZCL_PRICE_NUMBER_OF_PRICE_TIERS 0xF0
/* Alternate Cost Trailing Digit */
#define ZBEE_ZCL_PRICE_ALTERNATE_COST_TRAILING_DIGIT 0xF0
/* Block Period Duration Type */
#define ZBEE_ZCL_PRICE_BLOCK_PERIOD_DURATION_TIMEBASE 0x0F
#define ZBEE_ZCL_PRICE_BLOCK_PERIOD_DURATION_CONTROL 0xF0
/* Block Period Control Field BitMap */
#define ZBEE_ZCL_PRICE_BLOCK_PERIOD_CONTROL_PRICE_ACKNOWLEDGEMENT 0x01
#define ZBEE_ZCL_PRICE_BLOCK_PERIOD_CONTROL_REPEATING_BLOCK 0x02
/* Conversion Factor Trailing Digit */
#define ZBEE_ZCL_PRICE_CONVERSION_FACTOR_TRAILING_DIGIT 0xF0
/* Calorific Value Trailing Digit */
#define ZBEE_ZCL_PRICE_CALORIFIC_VALUE_TRAILING_DIGIT 0xF0
/* Tariff Type / Charging Scheme */
#define ZBEE_ZCL_PRICE_TARIFF_INFORMATION_TYPE 0x0F
#define ZBEE_ZCL_PRICE_TARIFF_INFORMATION_CHARGING_SCHEME 0xF0
/* Tariff Information Price Trailing Digit */
#define ZBEE_ZCL_PRICE_TARIFF_INFORMATION_PRICE_TRAILING_DIGIT 0xF0
/* Price Matrix Tier/Block ID */
#define ZBEE_ZCL_PRICE_PRICE_MATRIX_TIER_BLOCK_ID_BLOCK 0x0F
#define ZBEE_ZCL_PRICE_PRICE_MATRIX_TIER_BLOCK_ID_TIER 0xF0
/* Block Thresholds Tier/Number of Block Thresholds */
#define ZBEE_ZCL_PRICE_BLOCK_THRESHOLDS_NUMBER_OF_BLOCK_THRESHOLDS 0x0F
#define ZBEE_ZCL_PRICE_BLOCK_THRESHOLDS_TIER 0xF0
/* CO2 Value Trailing Digit */
#define ZBEE_ZCL_PRICE_CO2_VALUE_TRAILING_DIGIT 0xF0
/* Billing Period Duration Type */
#define ZBEE_ZCL_PRICE_BILLING_PERIOD_DURATION_TIMEBASE 0x0F
#define ZBEE_ZCL_PRICE_BILLING_PERIOD_DURATION_CONTROL 0xF0
/* Billign Period Tariff Type */
#define ZBEE_ZCL_PRICE_BILLING_PERIOD_TARIFF_TYPE 0x0F
/* Consolidated Bill Trailing Digit */
#define ZBEE_ZCL_PRICE_CONSOLIDATED_BILL_TRAILING_DIGIT 0xF0
/*************************/
/* Function Declarations */
/*************************/
void proto_register_zbee_zcl_price(void);
void proto_reg_handoff_zbee_zcl_price(void);
/* Attribute Dissector Helpers */
static void dissect_zcl_price_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr);
/* Command Dissector Helpers */
static void dissect_zcl_price_get_current_price (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_get_scheduled_prices (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_get_price_acknowledgement (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_get_block_period (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_get_conversion_factor (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_get_calorific_value (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_get_tariff_information (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_get_price_matrix (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_get_block_thresholds (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_get_co2_value (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_get_tier_labels (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_get_billing_period (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_get_consolidated_bill (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_get_cpp_event (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_get_credit_payment (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_publish_price (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_publish_block_period (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_publish_conversion_factor (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_publish_calorific_value (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_publish_tariff_information (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_publish_price_matrix (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_publish_block_thresholds (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_publish_co2_value (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_publish_tier_labels (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_publish_billing_period (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_publish_consolidated_bill (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_publish_cpp_event (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_publish_credit_payment (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_publish_currency_conversion (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_price_publish_cancel_tariff (tvbuff_t *tvb, proto_tree *tree, guint *offset);
/*************************/
/* Global Variables */
/*************************/
/* Initialize the protocol and registered fields */
static int proto_zbee_zcl_price = -1;
static int hf_zbee_zcl_price_srv_tx_cmd_id = -1;
static int hf_zbee_zcl_price_srv_rx_cmd_id = -1;
static int hf_zbee_zcl_price_attr_server_id = -1;
static int hf_zbee_zcl_price_attr_client_id = -1;
static int hf_zbee_zcl_price_attr_reporting_status = -1;
static int hf_zbee_zcl_price_provider_id = -1;
static int hf_zbee_zcl_price_issuer_event_id = -1;
static int hf_zbee_zcl_price_min_issuer_event_id = -1;
static int hf_zbee_zcl_price_issuer_tariff_id = -1;
static int hf_zbee_zcl_price_command_index = -1;
static int hf_zbee_zcl_price_total_number_of_commands = -1;
static int hf_zbee_zcl_price_number_of_commands = -1;
static int hf_zbee_zcl_price_number_of_events = -1;
static int hf_zbee_zcl_price_number_of_records = -1;
static int hf_zbee_zcl_price_number_of_block_thresholds = -1;
static int hf_zbee_zcl_price_number_of_generation_tiers = -1;
static int hf_zbee_zcl_price_extended_number_of_price_tiers = -1;
static int hf_zbee_zcl_price_command_options = -1;
static int hf_zbee_zcl_price_control = -1;
static int hf_zbee_zcl_price_tier = -1;
static int hf_zbee_zcl_price_tariff_type_mask = -1;
static int hf_zbee_zcl_price_tariff_type = -1;
static int hf_zbee_zcl_price_tariff_resolution_period = -1;
static int hf_zbee_zcl_price_cpp_auth = -1;
static int hf_zbee_zcl_price_cpp_price_tier= -1;
static int hf_zbee_zcl_price_rate_label = -1;
static int hf_zbee_zcl_price_unit_of_measure = -1;
static int hf_zbee_zcl_price_currency = -1;
static int hf_zbee_zcl_price_trailing_digit_and_price_tier = -1;
static int hf_zbee_zcl_price_trailing_digit = -1;
static int hf_zbee_zcl_price_extended_price_tier = -1;
static int hf_zbee_zcl_price_number_of_price_tiers_and_register_tier = -1;
static int hf_zbee_zcl_price_register_tier = -1;
static int hf_zbee_zcl_price_number_of_price_tiers = -1;
static int hf_zbee_zcl_price_extended_register_tier = -1;
static int hf_zbee_zcl_price_duration_in_minutes = -1;
static int hf_zbee_zcl_price = -1;
static int hf_zbee_zcl_price_ratio = -1;
static int hf_zbee_zcl_price_generation_price = -1;
static int hf_zbee_zcl_price_generation_price_ratio = -1;
static int hf_zbee_zcl_price_generation_tier = -1;
static int hf_zbee_zcl_price_alternate_cost_delivered = -1;
static int hf_zbee_zcl_price_alternate_cost_unit = -1;
static int hf_zbee_zcl_price_alternate_cost_trailing_digit_mask = -1;
static int hf_zbee_zcl_price_alternate_cost_trailing_digit = -1;
static int hf_zbee_zcl_price_start_time = -1;
static int hf_zbee_zcl_price_earliest_start_time = -1;
static int hf_zbee_zcl_price_latest_end_time = -1;
static int hf_zbee_zcl_price_current_time = -1;
static int hf_zbee_zcl_price_price_ack_time = -1;
static int hf_zbee_zcl_price_block_period_start_time = -1;
static int hf_zbee_zcl_price_block_period_duration = -1;
static int hf_zbee_zcl_price_block_period_duration_type = -1;
static int hf_zbee_zcl_price_block_period_duration_timebase = -1;
static int hf_zbee_zcl_price_block_period_duration_control = -1;
static int hf_zbee_zcl_price_block_period_control = -1;
static int hf_zbee_zcl_price_block_period_control_price_acknowledgement = -1;
static int hf_zbee_zcl_price_block_period_control_repeating_block = -1;
static int hf_zbee_zcl_price_conversion_factor = -1;
static int hf_zbee_zcl_price_conversion_factor_trailing_digit_mask = -1;
static int hf_zbee_zcl_price_conversion_factor_trailing_digit = -1;
static int hf_zbee_zcl_price_calorific_value = -1;
static int hf_zbee_zcl_price_calorific_value_unit = -1;
static int hf_zbee_zcl_price_calorific_value_trailing_digit_mask = -1;
static int hf_zbee_zcl_price_calorific_value_trailing_digit = -1;
static int hf_zbee_zcl_price_tariff_information_type_and_charging_scheme = -1;
static int hf_zbee_zcl_price_tariff_information_type = -1;
static int hf_zbee_zcl_price_tariff_information_charging_scheme = -1;
static int hf_zbee_zcl_price_tariff_information_tariff_label = -1;
static int hf_zbee_zcl_price_tariff_information_number_of_price_tiers_in_use = -1;
static int hf_zbee_zcl_price_tariff_information_number_of_block_thresholds_in_use = -1;
static int hf_zbee_zcl_price_tariff_information_price_trailing_digit_mask = -1;
static int hf_zbee_zcl_price_tariff_information_price_trailing_digit = -1;
static int hf_zbee_zcl_price_tariff_information_standing_charge = -1;
static int hf_zbee_zcl_price_tariff_information_tier_block_mode = -1;
static int hf_zbee_zcl_price_tariff_information_block_threshold_multiplier = -1;
static int hf_zbee_zcl_price_tariff_information_block_threshold_divisor = -1;
static int hf_zbee_zcl_price_price_matrix_sub_payload_control = -1;
static int hf_zbee_zcl_price_price_matrix_tier_block_id = -1;
static int hf_zbee_zcl_price_price_matrix_tier_block_id_block = -1;
static int hf_zbee_zcl_price_price_matrix_tier_block_id_tier = -1;
static int hf_zbee_zcl_price_price_matrix_tier_block_id_tou_tier = -1;
static int hf_zbee_zcl_price_price_matrix_price = -1;
static int hf_zbee_zcl_price_block_thresholds_sub_payload_control = -1;
static int hf_zbee_zcl_price_block_thresholds_tier_number_of_block_thresholds = -1;
static int hf_zbee_zcl_price_block_thresholds_tier = -1;
static int hf_zbee_zcl_price_block_thresholds_number_of_block_thresholds = -1;
static int hf_zbee_zcl_price_block_thresholds_block_threshold = -1;
static int hf_zbee_zcl_price_co2_value = -1;
static int hf_zbee_zcl_price_co2_unit = -1;
static int hf_zbee_zcl_price_co2_value_trailing_digit_mask = -1;
static int hf_zbee_zcl_price_co2_value_trailing_digit = -1;
static int hf_zbee_zcl_price_tier_labels_number_of_labels = -1;
static int hf_zbee_zcl_price_tier_labels_tier_id = -1;
static int hf_zbee_zcl_price_tier_labels_tier_label = -1;
static int hf_zbee_zcl_price_billing_period_start_time = -1;
static int hf_zbee_zcl_price_billing_period_duration = -1;
static int hf_zbee_zcl_price_billing_period_duration_type = -1;
static int hf_zbee_zcl_price_billing_period_duration_timebase = -1;
static int hf_zbee_zcl_price_billing_period_duration_control = -1;
static int hf_zbee_zcl_price_consolidated_bill = -1;
static int hf_zbee_zcl_price_consolidated_bill_trailing_digit_mask = -1;
static int hf_zbee_zcl_price_consolidated_bill_trailing_digit = -1;
static int hf_zbee_zcl_price_credit_payment_due_date = -1;
static int hf_zbee_zcl_price_credit_payment_overdue_amount = -1;
static int hf_zbee_zcl_price_credit_payment_status = -1;
static int hf_zbee_zcl_price_credit_payment = -1;
static int hf_zbee_zcl_price_credit_payment_date = -1;
static int hf_zbee_zcl_price_credit_payment_ref = -1;
static int hf_zbee_zcl_price_old_currency = -1;
static int hf_zbee_zcl_price_new_currency = -1;
static int hf_zbee_zcl_price_currency_change_control_flags = -1;
/* Initialize the subtree pointers */
static gint ett_zbee_zcl_price = -1;
static gint ett_zbee_zcl_price_tariff_type = -1;
static gint ett_zbee_zcl_price_trailing_digit_and_price_tier = -1;
static gint ett_zbee_zcl_price_number_of_price_tiers_and_register_tier = -1;
static gint ett_zbee_zcl_price_alternate_cost_trailing_digit = -1;
static gint ett_zbee_zcl_price_block_period_control = -1;
static gint ett_zbee_zcl_price_block_period_duration_type = -1;
static gint ett_zbee_zcl_price_conversion_factor_trailing_digit = -1;
static gint ett_zbee_zcl_price_calorific_value_trailing_digit = -1;
static gint ett_zbee_zcl_price_tariff_information_tariff_type_and_charging_scheme = -1;
static gint ett_zbee_zcl_price_tariff_information_price_trailing_digit = -1;
static gint ett_zbee_zcl_price_price_matrix_tier_block_id = -1;
static gint ett_zbee_zcl_price_block_thresholds_tier_number_of_block_thresholds = -1;
static gint ett_zbee_zcl_price_co2_value_trailing_digit = -1;
static gint ett_zbee_zcl_price_billing_period_duration_type = -1;
static gint ett_zbee_zcl_price_consolidated_bill_trailing_digit = -1;
static int * const zbee_zcl_price_billing_period_duration_type[] = {
&hf_zbee_zcl_price_billing_period_duration_timebase,
&hf_zbee_zcl_price_billing_period_duration_control,
NULL
};
static int * const zbee_zcl_price_block_period_duration_type[] = {
&hf_zbee_zcl_price_block_period_duration_timebase,
&hf_zbee_zcl_price_block_period_duration_control,
NULL
};
static int * const zbee_zcl_price_block_period_control[] = {
&hf_zbee_zcl_price_block_period_control_price_acknowledgement,
&hf_zbee_zcl_price_block_period_control_repeating_block,
NULL
};
static int * const zbee_zcl_price_tariff_type_mask[] = {
&hf_zbee_zcl_price_tariff_type,
NULL
};
/*************************/
/* Function Bodies */
/*************************/
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*@param attr_id attribute identifier
*@param data_type attribute data type
*@param client_attr ZCL client
*/
static void
dissect_zcl_price_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr)
{
switch (attr_id) {
/* applies to all SE clusters */
case ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_PRICE:
proto_tree_add_item(tree, hf_zbee_zcl_price_attr_reporting_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
break;
default: /* Catch all */
dissect_zcl_attr_data(tvb, tree, offset, data_type, client_attr);
break;
}
} /*dissect_zcl_price_attr_data*/
/**
*ZigBee ZCL Price cluster dissector for wireshark.
*
*@param tvb pointer to buffer containing raw packet.
*@param pinfo pointer to packet information fields
*@param tree pointer to data tree Wireshark uses to display packet.
*/
static int
dissect_zbee_zcl_price(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
proto_tree *payload_tree;
zbee_zcl_packet *zcl;
guint offset = 0;
guint8 cmd_id;
gint rem_len;
/* Reject the packet if data is NULL */
if (data == NULL)
return 0;
zcl = (zbee_zcl_packet *)data;
cmd_id = zcl->cmd_id;
/* Create a subtree for the ZCL Command frame, and add the command ID to it. */
if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_price_srv_rx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_price_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_price, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_PRICE_GET_CURRENT_PRICE:
dissect_zcl_price_get_current_price(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_GET_SCHEDULED_PRICES:
dissect_zcl_price_get_scheduled_prices(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_GET_PRICE_ACKNOWLEDGEMENT:
dissect_zcl_price_get_price_acknowledgement(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_GET_BLOCK_PERIOD:
dissect_zcl_price_get_block_period(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_GET_CONVERSION_FACTOR:
dissect_zcl_price_get_conversion_factor(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_GET_CALORIFIC_VALUE:
dissect_zcl_price_get_calorific_value(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_GET_TARIFF_INFORMATION:
dissect_zcl_price_get_tariff_information(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_GET_PRICE_MATRIX:
dissect_zcl_price_get_price_matrix(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_GET_BLOCK_THRESHOLDS:
dissect_zcl_price_get_block_thresholds(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_GET_CO2_VALUE:
dissect_zcl_price_get_co2_value(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_GET_TIER_LABELS:
dissect_zcl_price_get_tier_labels(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_GET_BILLING_PERIOD:
dissect_zcl_price_get_billing_period(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_GET_CONSOLIDATED_BILL:
dissect_zcl_price_get_consolidated_bill(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_CPP_EVENT_RESPONSE:
dissect_zcl_price_get_cpp_event(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_GET_CREDIT_PAYMENT:
dissect_zcl_price_get_credit_payment(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_GET_CURRENCY_CONVERSION:
/* No Payload */
break;
case ZBEE_ZCL_CMD_ID_PRICE_GET_TARIFF_CANCELLATION:
/* No Payload */
break;
default:
break;
}
}
}
else { /* ZBEE_ZCL_FCF_TO_CLIENT */
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_price_srv_tx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_price_srv_tx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_price, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_PRICE:
dissect_zcl_price_publish_price(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_BLOCK_PERIOD:
dissect_zcl_price_publish_block_period(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_CONVERSION_FACTOR:
dissect_zcl_price_publish_conversion_factor(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_CALORIFIC_VALUE:
dissect_zcl_price_publish_calorific_value(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_TARIFF_INFORMATION:
dissect_zcl_price_publish_tariff_information(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_PRICE_MATRIX:
dissect_zcl_price_publish_price_matrix(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_BLOCK_THRESHOLDS:
dissect_zcl_price_publish_block_thresholds(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_CO2_VALUE:
dissect_zcl_price_publish_co2_value(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_TIER_LABELS:
dissect_zcl_price_publish_tier_labels(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_BILLING_PERIOD:
dissect_zcl_price_publish_billing_period(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_CONSOLIDATED_BILL:
dissect_zcl_price_publish_consolidated_bill(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_CPP_EVENT:
dissect_zcl_price_publish_cpp_event(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_CREDIT_PAYMENT:
dissect_zcl_price_publish_credit_payment(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_PUBLISH_CURRENCY_CONVERSION:
dissect_zcl_price_publish_currency_conversion(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PRICE_CANCEL_TARIFF:
dissect_zcl_price_publish_cancel_tariff(tvb, payload_tree, &offset);
break;
default:
break;
}
}
}
return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_price*/
/**
*This function manages the Get Current Price payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_get_current_price(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Command Options */
proto_tree_add_item(tree, hf_zbee_zcl_price_command_options, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_price_get_current_price*/
/**
*This function manages the Get Scheduled Prices payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_get_scheduled_prices(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Number of Events */
proto_tree_add_item(tree, hf_zbee_zcl_price_number_of_events, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_price_get_scheduled_prices*/
/**
*This function manages the Get Price Acknowledgement payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_get_price_acknowledgement(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t price_ack_time;
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Price Ack Time */
price_ack_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
price_ack_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_price_ack_time, tvb, *offset, 4, &price_ack_time);
*offset += 4;
/* Price Control */
proto_tree_add_item(tree, hf_zbee_zcl_price_control, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_price_get_price_acknowledgement*/
/**
*This function manages the Get Block Period payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_get_block_period(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Number of Events */
proto_tree_add_item(tree, hf_zbee_zcl_price_number_of_events, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* (Optional) Tariff Type */
if (tvb_reported_length_remaining(tvb, *offset) > 0) {
proto_tree_add_item(tree, hf_zbee_zcl_price_tariff_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
}
} /*dissect_zcl_price_get_block_period*/
/**
*This function manages the Get Conversion Factor payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_get_conversion_factor(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t earliest_start_time;
/* Earliest Start Time */
earliest_start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
earliest_start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_earliest_start_time, tvb, *offset, 4, &earliest_start_time);
*offset += 4;
/* Min Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_min_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Number of Commands */
proto_tree_add_item(tree, hf_zbee_zcl_price_number_of_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_price_get_conversion_factor*/
/**
*This function manages the Get Calorific Value payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_get_calorific_value(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t earliest_start_time;
/* Earliest Start Time */
earliest_start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
earliest_start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_earliest_start_time, tvb, *offset, 4, &earliest_start_time);
*offset += 4;
/* Min Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_min_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Number of Commands */
proto_tree_add_item(tree, hf_zbee_zcl_price_number_of_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_price_get_calorific_value*/
/**
*This function manages the Get Tariff Information payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_get_tariff_information(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t earliest_start_time;
/* Earliest Start Time */
earliest_start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
earliest_start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_earliest_start_time, tvb, *offset, 4, &earliest_start_time);
*offset += 4;
/* Min Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_min_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Number of Commands */
proto_tree_add_item(tree, hf_zbee_zcl_price_number_of_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Tariff Type */
proto_tree_add_item(tree, hf_zbee_zcl_price_tariff_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_price_get_tariff_information*/
/**
*This function manages the Get Price Matrix payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_get_price_matrix(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Issuer Tariff ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_tariff_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_price_get_price_matrix*/
/**
*This function manages the Get Block Thresholds payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_get_block_thresholds(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Issuer Tariff ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_tariff_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_price_get_block_thresholds*/
/**
*This function manages the Get CO2 Value payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_get_co2_value(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t earliest_start_time;
/* Earliest Start Time */
earliest_start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
earliest_start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_earliest_start_time, tvb, *offset, 4, &earliest_start_time);
*offset += 4;
/* Min Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_min_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Number of Commands */
proto_tree_add_item(tree, hf_zbee_zcl_price_number_of_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* (Optional) Tariff Type */
if (tvb_reported_length_remaining(tvb, *offset) > 0) {
proto_tree_add_item(tree, hf_zbee_zcl_price_tariff_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
}
} /*dissect_zcl_price_get_co2_value*/
/**
*This function manages the Get Tier Labels payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_get_tier_labels(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Issuer Tariff ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_tariff_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_price_get_tier_labels*/
/**
*This function manages the Get Billing Period payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_get_billing_period(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t earliest_start_time;
/* Earliest Start Time */
earliest_start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
earliest_start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_earliest_start_time, tvb, *offset, 4, &earliest_start_time);
*offset += 4;
/* Min Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_min_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Number of Commands */
proto_tree_add_item(tree, hf_zbee_zcl_price_number_of_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* (Optional) Tariff Type */
if (tvb_reported_length_remaining(tvb, *offset) > 0) {
proto_tree_add_item(tree, hf_zbee_zcl_price_tariff_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
}
} /*dissect_zcl_price_get_billing_period*/
/**
*This function manages the Get Consolidated Bill payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_get_consolidated_bill(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t earliest_start_time;
/* Earliest Start Time */
earliest_start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
earliest_start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_earliest_start_time, tvb, *offset, 4, &earliest_start_time);
*offset += 4;
/* Min Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_min_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Number of Commands */
proto_tree_add_item(tree, hf_zbee_zcl_price_number_of_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* (Optional) Tariff Type */
if (tvb_reported_length_remaining(tvb, *offset) > 0) {
proto_tree_add_item(tree, hf_zbee_zcl_price_tariff_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
}
} /*dissect_zcl_price_get_consolidated_bill*/
/**
*This function manages the Get CPP Event Response payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_get_cpp_event(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* CPP Auth */
proto_tree_add_item(tree, hf_zbee_zcl_price_cpp_auth, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_price_get_event_response*/
/**
*This function manages the Get Credit Payment payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_get_credit_payment(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t latest_end_time;
/* Latest End Time */
latest_end_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
latest_end_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_latest_end_time, tvb, *offset, 4, &latest_end_time);
*offset += 4;
/* Number of Records */
proto_tree_add_item(tree, hf_zbee_zcl_price_number_of_records, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_price_get_credit_payment*/
/**
*This function manages the Publish Price payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_publish_price(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
nstime_t current_time;
int length;
static int * const trailing_digit[] = {
&hf_zbee_zcl_price_tier,
&hf_zbee_zcl_price_trailing_digit,
NULL
};
static int * const number_of_price_tiers_and_register_tier[] = {
&hf_zbee_zcl_price_register_tier,
&hf_zbee_zcl_price_number_of_price_tiers,
NULL
};
static int * const alternate_cost_trailing_digit[] = {
&hf_zbee_zcl_price_alternate_cost_trailing_digit,
NULL
};
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Rate Label */
proto_tree_add_item_ret_length(tree, hf_zbee_zcl_price_rate_label, tvb, *offset, 1, ENC_NA | ENC_ZIGBEE, &length);
*offset += length;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Current Time */
current_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
current_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_current_time, tvb, *offset, 4, &current_time);
*offset += 4;
/* Unit of Measure */
proto_tree_add_item(tree, hf_zbee_zcl_price_unit_of_measure, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Currency */
proto_tree_add_item(tree, hf_zbee_zcl_price_currency, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Price Trailing Digit and Price Tier */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_trailing_digit_and_price_tier, ett_zbee_zcl_price_trailing_digit_and_price_tier, trailing_digit, ENC_LITTLE_ENDIAN);
*offset += 1;
/* Number of Price Tiers and Register Tier */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_number_of_price_tiers_and_register_tier, ett_zbee_zcl_price_number_of_price_tiers_and_register_tier, number_of_price_tiers_and_register_tier, ENC_LITTLE_ENDIAN);
*offset += 1;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Duration in Minutes */
proto_tree_add_item(tree, hf_zbee_zcl_price_duration_in_minutes, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Price */
proto_tree_add_item(tree, hf_zbee_zcl_price, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* (Optional) Price Ratio */
if ( tvb_reported_length_remaining(tvb, *offset) <= 0 ) return;
proto_tree_add_item(tree, hf_zbee_zcl_price_ratio, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* (Optional) Generation Price */
if ( tvb_reported_length_remaining(tvb, *offset) <= 0 ) return;
proto_tree_add_item(tree, hf_zbee_zcl_price_generation_price, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* (Optional) Generation Price Ratio */
if ( tvb_reported_length_remaining(tvb, *offset) <= 0 ) return;
proto_tree_add_item(tree, hf_zbee_zcl_price_generation_price_ratio, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* (Optional) Alternate Cost Delivered */
if ( tvb_reported_length_remaining(tvb, *offset) <= 0 ) return;
proto_tree_add_item(tree, hf_zbee_zcl_price_alternate_cost_delivered, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* (Optional) Alternate Cost Unit */
if ( tvb_reported_length_remaining(tvb, *offset) <= 0 ) return;
proto_tree_add_item(tree, hf_zbee_zcl_price_alternate_cost_unit, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* (Optional) Alternate Cost Trailing Digit */
if ( tvb_reported_length_remaining(tvb, *offset) <= 0 ) return;
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_alternate_cost_trailing_digit_mask, ett_zbee_zcl_price_alternate_cost_trailing_digit, alternate_cost_trailing_digit, ENC_LITTLE_ENDIAN);
*offset += 1;
/* (Optional) Number of Block Thresholds */
if ( tvb_reported_length_remaining(tvb, *offset) <= 0 ) return;
proto_tree_add_item(tree, hf_zbee_zcl_price_number_of_block_thresholds, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* (Optional) Price Control */
if ( tvb_reported_length_remaining(tvb, *offset) <= 0 ) return;
proto_tree_add_item(tree, hf_zbee_zcl_price_control, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* (Optional) Number of Generation Tiers */
if ( tvb_reported_length_remaining(tvb, *offset) <= 0 ) return;
proto_tree_add_item(tree, hf_zbee_zcl_price_number_of_generation_tiers, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* (Optional) Generation Tier */
if ( tvb_reported_length_remaining(tvb, *offset) <= 0 ) return;
proto_tree_add_item(tree, hf_zbee_zcl_price_generation_tier, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* (Optional) Extended Number of Price Tiers */
if ( tvb_reported_length_remaining(tvb, *offset) <= 0 ) return;
proto_tree_add_item(tree, hf_zbee_zcl_price_extended_number_of_price_tiers, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* (Optional) Extended Price Tier */
if ( tvb_reported_length_remaining(tvb, *offset) <= 0 ) return;
proto_tree_add_item(tree, hf_zbee_zcl_price_extended_price_tier, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* (Optional) Extended Register Tier */
if ( tvb_reported_length_remaining(tvb, *offset) <= 0 ) return;
proto_tree_add_item(tree, hf_zbee_zcl_price_extended_register_tier, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_price_publish_price*/
/**
*This function manages the Publish Block Period payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_publish_block_period(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t block_period_start_time;
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Block Period Start Time */
block_period_start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
block_period_start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_block_period_start_time, tvb, *offset, 4, &block_period_start_time);
*offset += 4;
/* Block Period Duration */
proto_tree_add_item(tree, hf_zbee_zcl_price_block_period_duration, tvb, *offset, 3, ENC_LITTLE_ENDIAN);
*offset += 3;
/* Block Period Control */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_block_period_control, ett_zbee_zcl_price_block_period_control, zbee_zcl_price_block_period_control, ENC_LITTLE_ENDIAN);
*offset += 1;
/* Block Period Duration Type */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_block_period_duration_type, ett_zbee_zcl_price_block_period_duration_type, zbee_zcl_price_block_period_duration_type, ENC_LITTLE_ENDIAN);
*offset += 1;
/* Tariff Type */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_tariff_type_mask, ett_zbee_zcl_price_tariff_type, zbee_zcl_price_tariff_type_mask, ENC_LITTLE_ENDIAN);
*offset += 1;
/* Tariff Resolution Period */
proto_tree_add_item(tree, hf_zbee_zcl_price_tariff_resolution_period, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_price_publish_block_period*/
/**
*This function manages the Publish Conversion Factor payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_publish_conversion_factor(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
static int * const conversion_factor_trailing_digit[] = {
&hf_zbee_zcl_price_conversion_factor_trailing_digit,
NULL
};
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Conversion Factor */
proto_tree_add_item(tree, hf_zbee_zcl_price_conversion_factor, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Conversion Factor Trailing digit */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_conversion_factor_trailing_digit_mask, ett_zbee_zcl_price_conversion_factor_trailing_digit, conversion_factor_trailing_digit, ENC_LITTLE_ENDIAN);
*offset += 1;
} /*dissect_zcl_price_publish_conversion_factor*/
/**
*This function manages the Publish Calorific Value payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_publish_calorific_value(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
static int * const calorific_value_trailing_digit[] = {
&hf_zbee_zcl_price_calorific_value_trailing_digit,
NULL
};
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Calorific Value */
proto_tree_add_item(tree, hf_zbee_zcl_price_calorific_value, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Calorific Value Unit */
proto_tree_add_item(tree, hf_zbee_zcl_price_calorific_value_unit, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Calorific Value Trailing digit */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_calorific_value_trailing_digit_mask, ett_zbee_zcl_price_calorific_value_trailing_digit, calorific_value_trailing_digit, ENC_LITTLE_ENDIAN);
*offset += 1;
} /*dissect_zcl_price_publish_calorific_value*/
/**
*This function manages the Publish Tariff Information payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_publish_tariff_information(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
int length;
nstime_t start_time;
static int * const price_trailing_digit[] = {
&hf_zbee_zcl_price_tariff_information_price_trailing_digit,
NULL
};
static int * const type_and_charging_scheme[] = {
&hf_zbee_zcl_price_tariff_information_type,
&hf_zbee_zcl_price_tariff_information_charging_scheme,
NULL
};
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Tariff ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_tariff_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Tariff Type / Charging Scheme */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_tariff_information_type_and_charging_scheme, ett_zbee_zcl_price_tariff_information_tariff_type_and_charging_scheme, type_and_charging_scheme, ENC_LITTLE_ENDIAN);
*offset += 1;
/* Tariff Label */
proto_tree_add_item_ret_length(tree, hf_zbee_zcl_price_tariff_information_tariff_label, tvb, *offset, 1, ENC_NA|ENC_ZIGBEE, &length);
*offset += length;
/* Number of Price Tiers in Use */
proto_tree_add_item(tree, hf_zbee_zcl_price_tariff_information_number_of_price_tiers_in_use, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Number of Block Thresholds in Use */
proto_tree_add_item(tree, hf_zbee_zcl_price_tariff_information_number_of_block_thresholds_in_use, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Unit of Measure */
proto_tree_add_item(tree, hf_zbee_zcl_price_unit_of_measure, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Currency */
proto_tree_add_item(tree, hf_zbee_zcl_price_currency, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Price Trailing Digit */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_tariff_information_price_trailing_digit_mask, ett_zbee_zcl_price_tariff_information_price_trailing_digit, price_trailing_digit, ENC_LITTLE_ENDIAN);
*offset += 1;
/* Standing Charge */
proto_tree_add_item(tree, hf_zbee_zcl_price_tariff_information_standing_charge, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Tier Block Mode */
proto_tree_add_item(tree, hf_zbee_zcl_price_tariff_information_tier_block_mode, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Block Threshold Multiplier */
proto_tree_add_item(tree, hf_zbee_zcl_price_tariff_information_block_threshold_multiplier, tvb, *offset, 3, ENC_LITTLE_ENDIAN);
*offset += 3;
/* Block Threshold Divisor */
proto_tree_add_item(tree, hf_zbee_zcl_price_tariff_information_block_threshold_divisor, tvb, *offset, 3, ENC_LITTLE_ENDIAN);
*offset += 3;
} /*dissect_zcl_price_publish_tariff_information*/
/**
*This function manages the Publish Price Matrix payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_publish_price_matrix(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
guint8 sub_payload_control;
nstime_t start_time;
static int * const tier_block_id[] = {
&hf_zbee_zcl_price_price_matrix_tier_block_id_block,
&hf_zbee_zcl_price_price_matrix_tier_block_id_tier,
NULL
};
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Issuer Tariff ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_tariff_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Command Index */
proto_tree_add_item(tree, hf_zbee_zcl_price_command_index, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Total Number of Commands */
proto_tree_add_item(tree, hf_zbee_zcl_price_total_number_of_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Sub-Payload Control */
sub_payload_control = tvb_get_guint8(tvb, *offset) && 0x01; /* First bit determines Tier/Block ID field type */
proto_tree_add_item(tree, hf_zbee_zcl_price_price_matrix_sub_payload_control, tvb, *offset, 1, ENC_NA);
*offset += 1;
while (tvb_reported_length_remaining(tvb, *offset) > 0) {
/* Tier/Block ID */
if (sub_payload_control == 0)
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_price_matrix_tier_block_id, ett_zbee_zcl_price_price_matrix_tier_block_id, tier_block_id, ENC_LITTLE_ENDIAN);
else
proto_tree_add_item(tree, hf_zbee_zcl_price_price_matrix_tier_block_id_tou_tier, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Price */
proto_tree_add_item(tree, hf_zbee_zcl_price_price_matrix_price, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
}
} /*dissect_zcl_price_publish_price_matrix*/
/**
*This function manages the Publish Block Thresholds payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_publish_block_thresholds(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
guint8 sub_payload_control;
nstime_t start_time;
static int * const tier_number_of_block_thresholds[] = {
&hf_zbee_zcl_price_block_thresholds_number_of_block_thresholds,
&hf_zbee_zcl_price_block_thresholds_tier,
NULL
};
static int * const number_of_block_thresholds[] = {
&hf_zbee_zcl_price_block_thresholds_number_of_block_thresholds,
NULL
};
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Issuer Tariff ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_tariff_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Command Index */
proto_tree_add_item(tree, hf_zbee_zcl_price_command_index, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Total Number of Commands */
proto_tree_add_item(tree, hf_zbee_zcl_price_total_number_of_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Sub-Payload Control */
sub_payload_control = tvb_get_guint8(tvb, *offset) && 0x01; /* First bit determines Tier/Number of Block Thresholds field type */
proto_tree_add_item(tree, hf_zbee_zcl_price_block_thresholds_sub_payload_control, tvb, *offset, 1, ENC_NA);
*offset += 1;
while (tvb_reported_length_remaining(tvb, *offset) > 0) {
guint8 thresholds;
/* Tier/Number of Block Thresholds */
thresholds = tvb_get_guint8(tvb, *offset) & ZBEE_ZCL_PRICE_BLOCK_THRESHOLDS_NUMBER_OF_BLOCK_THRESHOLDS;
if (sub_payload_control == 0)
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_block_thresholds_tier_number_of_block_thresholds, ett_zbee_zcl_price_block_thresholds_tier_number_of_block_thresholds, tier_number_of_block_thresholds, ENC_LITTLE_ENDIAN);
else
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_block_thresholds_tier_number_of_block_thresholds, ett_zbee_zcl_price_block_thresholds_tier_number_of_block_thresholds, number_of_block_thresholds, ENC_LITTLE_ENDIAN);
*offset += 1;
/* Block Threshold(s) */
for (gint i = 0; i < thresholds; i++) {
proto_tree_add_item(tree, hf_zbee_zcl_price_block_thresholds_block_threshold, tvb, *offset, 6, ENC_LITTLE_ENDIAN);
*offset += 6;
}
}
} /*dissect_zcl_price_publish_block_thresholds*/
/**
*This function manages the Publish CO2 Value payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_publish_co2_value(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
static int * const co2_value_trailing_digit[] = {
&hf_zbee_zcl_price_co2_value_trailing_digit,
NULL
};
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Tariff Type */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_tariff_type_mask, ett_zbee_zcl_price_tariff_type, zbee_zcl_price_tariff_type_mask, ENC_LITTLE_ENDIAN);
*offset += 1;
/* CO2 Value */
proto_tree_add_item(tree, hf_zbee_zcl_price_co2_value, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* CO2 Unit */
proto_tree_add_item(tree, hf_zbee_zcl_price_co2_unit, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* CO2 Value Trailing Digit */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_co2_value_trailing_digit_mask, ett_zbee_zcl_price_co2_value_trailing_digit, co2_value_trailing_digit, ENC_LITTLE_ENDIAN);
*offset += 1;
} /*dissect_zcl_price_publish_co2_value*/
/**
*This function manages the Publish Tier Labels payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_publish_tier_labels(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
guint8 number_of_labels;
int length;
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Tariff ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_tariff_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Command Index */
proto_tree_add_item(tree, hf_zbee_zcl_price_command_index, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Total Number of Commands */
proto_tree_add_item(tree, hf_zbee_zcl_price_total_number_of_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Number of Labels */
number_of_labels = tvb_get_guint8(tvb, *offset);
proto_tree_add_item(tree, hf_zbee_zcl_price_tier_labels_number_of_labels, tvb, *offset, 1, ENC_NA);
*offset += 1;
for (gint i = 0; tvb_reported_length_remaining(tvb, *offset) >= 0 && i < number_of_labels; i++) {
/* Tier ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_tier_labels_tier_id, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Tier Label */
proto_tree_add_item_ret_length(tree, hf_zbee_zcl_price_tier_labels_tier_label, tvb, *offset, 1, ENC_NA|ENC_ZIGBEE, &length);
*offset += length;
}
} /*dissect_zcl_price_publish_tier_labels*/
/**
*This function manages the Publish Consolidated Bill payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_publish_billing_period(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Billing Period Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_billing_period_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Billing Period Duration */
proto_tree_add_item(tree, hf_zbee_zcl_price_billing_period_duration, tvb, *offset, 3, ENC_LITTLE_ENDIAN);
*offset += 3;
/* Billing Period Duration Type */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_billing_period_duration_type, ett_zbee_zcl_price_billing_period_duration_type, zbee_zcl_price_billing_period_duration_type, ENC_LITTLE_ENDIAN);
*offset += 1;
/* Tariff Type */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_tariff_type_mask, ett_zbee_zcl_price_tariff_type, zbee_zcl_price_tariff_type_mask, ENC_LITTLE_ENDIAN);
*offset += 1;
} /*dissect_zcl_price_publish_billing_period*/
/**
*This function manages the Publish Consolidated Bill payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_publish_consolidated_bill(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
static int * const bill_trailing_digit[] = {
&hf_zbee_zcl_price_consolidated_bill_trailing_digit,
NULL
};
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Billing Period Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Billing Period Duration */
proto_tree_add_item(tree, hf_zbee_zcl_price_billing_period_duration, tvb, *offset, 3, ENC_LITTLE_ENDIAN);
*offset += 3;
/* Billing Period Duration Type */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_billing_period_duration_type, ett_zbee_zcl_price_billing_period_duration_type, zbee_zcl_price_billing_period_duration_type, ENC_LITTLE_ENDIAN);
*offset += 1;
/* Tariff Type */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_tariff_type_mask, ett_zbee_zcl_price_tariff_type, zbee_zcl_price_tariff_type_mask, ENC_LITTLE_ENDIAN);
*offset += 1;
/* Consolidated Bill */
proto_tree_add_item(tree, hf_zbee_zcl_price_consolidated_bill, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Currency */
proto_tree_add_item(tree, hf_zbee_zcl_price_currency, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Bill Trailing Digit */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_consolidated_bill_trailing_digit_mask, ett_zbee_zcl_price_consolidated_bill_trailing_digit, bill_trailing_digit, ENC_LITTLE_ENDIAN);
*offset += 1;
} /*dissect_zcl_price_publish_consolidated_bill*/
/**
*This function manages the Publish CPP Event payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_publish_cpp_event(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Duration in Minutes */
proto_tree_add_item(tree, hf_zbee_zcl_price_duration_in_minutes, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Tariff Type */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_tariff_type_mask, ett_zbee_zcl_price_tariff_type, zbee_zcl_price_tariff_type_mask, ENC_LITTLE_ENDIAN);
*offset += 1;
/* CPP Price Tier */
proto_tree_add_item(tree, hf_zbee_zcl_price_cpp_price_tier, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* CPP Auth */
proto_tree_add_item(tree, hf_zbee_zcl_price_cpp_auth, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_price_publish_cpp_event*/
/**
*This function manages the Publish Credit Payment payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_publish_credit_payment(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t credit_payment_due_date;
nstime_t credit_payment_date;
int length;
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Credit Payment Due Date */
credit_payment_due_date.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
credit_payment_due_date.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_credit_payment_due_date, tvb, *offset, 4, &credit_payment_due_date);
*offset += 4;
/* Credit Payment Overdue Amount */
proto_tree_add_item(tree, hf_zbee_zcl_price_credit_payment_overdue_amount, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Credit Payment Status */
proto_tree_add_item(tree, hf_zbee_zcl_price_credit_payment_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Credit Payment */
proto_tree_add_item(tree, hf_zbee_zcl_price_credit_payment, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Credit Payment Date */
credit_payment_date.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
credit_payment_date.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_credit_payment_date, tvb, *offset, 4, &credit_payment_date);
*offset += 4;
/* Credit Payment Ref */
proto_tree_add_item_ret_length(tree, hf_zbee_zcl_price_credit_payment_ref, tvb, *offset, 1, ENC_NA|ENC_ZIGBEE, &length);
*offset += length;
} /*dissect_zcl_price_publish_credit_payment*/
/**
*This function manages the Publish Currency Conversion payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_publish_currency_conversion(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
static int * const conversion_factor_trailing_digit[] = {
&hf_zbee_zcl_price_conversion_factor_trailing_digit,
NULL
};
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_price_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Old Currency */
proto_tree_add_item(tree, hf_zbee_zcl_price_old_currency, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* New Currency */
proto_tree_add_item(tree, hf_zbee_zcl_price_new_currency, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Conversion Factor */
proto_tree_add_item(tree, hf_zbee_zcl_price_conversion_factor, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Conversion Factor Trailing digit */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_conversion_factor_trailing_digit_mask, ett_zbee_zcl_price_conversion_factor_trailing_digit, conversion_factor_trailing_digit, ENC_LITTLE_ENDIAN);
*offset += 1;
/* Currency Change Control Flags */
proto_tree_add_item(tree, hf_zbee_zcl_price_currency_change_control_flags, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_price_publish_currency_conversion*/
/**
*This function manages the Publish Cancel Tariff payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_price_publish_cancel_tariff(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_price_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Tariff Type */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_price_tariff_type_mask, ett_zbee_zcl_price_tariff_type, zbee_zcl_price_tariff_type_mask, ENC_LITTLE_ENDIAN);
*offset += 1;
} /*dissect_zcl_price_publish_cancel_tariff*/
/**
*This function registers the ZCL Price dissector
*
*/
void
proto_register_zbee_zcl_price(void)
{
static hf_register_info hf[] = {
{ &hf_zbee_zcl_price_attr_server_id,
{ "Attribute", "zbee_zcl_se.price.attr_id", FT_UINT16, BASE_HEX | BASE_EXT_STRING, &zbee_zcl_price_attr_server_names_ext,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_price_attr_client_id,
{ "Attribute", "zbee_zcl_se.price.attr_client_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_price_attr_client_names),
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_price_attr_reporting_status, /* common to all SE clusters */
{ "Attribute Reporting Status", "zbee_zcl_se.price.attr.attr_reporting_status",
FT_UINT8, BASE_HEX, VALS(zbee_zcl_se_reporting_status_names), 0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_srv_tx_cmd_id,
{ "Command", "zbee_zcl_se.price.cmd.srv_tx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_price_srv_tx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_srv_rx_cmd_id,
{ "Command", "zbee_zcl_se.price.cmd.srv_rx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_price_srv_rx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_provider_id,
{ "Provider ID", "zbee_zcl_se.price.provider_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.price.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_min_issuer_event_id,
{ "Min Issuer Event ID", "zbee_zcl_se.price.min_issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_issuer_tariff_id,
{ "Issuer Tariff ID", "zbee_zcl_se.price.issuer_tariff_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_command_index,
{ "Command Index", "zbee_zcl_se.price.command_index", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_total_number_of_commands,
{ "Total Number of Commands", "zbee_zcl_se.price.total_number_of_commands", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_number_of_commands,
{ "Number of Commands", "zbee_zcl_se.price.number_of_commands", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_number_of_events,
{ "Number of Events", "zbee_zcl_se.price.number_of_events", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_number_of_records,
{ "Number of Records", "zbee_zcl_se.price.number_of_records", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_number_of_block_thresholds,
{ "Number of Block Thresholds", "zbee_zcl_se.price.number_of_block_thresholds", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_number_of_generation_tiers,
{ "Number of Generation Tiers", "zbee_zcl_se.price.number_of_generation_tiers", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_extended_number_of_price_tiers,
{ "Extended Number of Price Tiers", "zbee_zcl_se.price.extended_number_of_price_tiers", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_command_options,
{ "Command Options", "zbee_zcl_se.price.command_options", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_control,
{ "Price Control", "zbee_zcl_se.price.control", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
/* start Tariff Type fields */
{ &hf_zbee_zcl_price_tariff_type_mask,
{ "Tariff Type", "zbee_zcl_se.price.tariff_type_mask", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_tariff_type,
{ "Tariff Type", "zbee_zcl_se.price.tariff_type", FT_UINT8, BASE_HEX, VALS(zbee_zcl_price_tariff_type_names),
ZBEE_ZCL_PRICE_TARIFF_TYPE, NULL, HFILL } },
/* end Tariff Type fields */
{ &hf_zbee_zcl_price_tariff_resolution_period,
{ "Tariff Resolution Period", "zbee_zcl_se.price.tariff.resolution_period", FT_UINT8, BASE_HEX, VALS(zbee_zcl_price_tariff_resolution_period_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_cpp_price_tier,
{ "CPP Price Tier", "zbee_zcl_se.price.cpp_price_tier", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_cpp_auth,
{ "CPP Auth", "zbee_zcl_se.price.cpp_auth", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_rate_label,
{ "Rate Label", "zbee_zcl_se.price.rate_label", FT_UINT_STRING, BASE_NONE, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_unit_of_measure,
{ "Unit of Measure", "zbee_zcl_se.price.unit_of_measure", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_currency,
{ "Currency", "zbee_zcl_se.price.currency", FT_UINT16, BASE_HEX, NULL,
0x00, NULL, HFILL } },
/* start Trailing Digit and Price Tier fields */
{ &hf_zbee_zcl_price_trailing_digit_and_price_tier,
{ "Trailing Digit and Price Tier", "zbee_zcl_se.price.trailing_digit_and_price_tier", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_tier,
{ "Price Tier", "zbee_zcl_se.price.tier", FT_UINT8, BASE_HEX, NULL,
ZBEE_ZCL_PRICE_TIER, NULL, HFILL } },
{ &hf_zbee_zcl_price_trailing_digit,
{ "Trailing Digit", "zbee_zcl_se.price.trailing_digit", FT_UINT8, BASE_HEX, NULL,
ZBEE_ZCL_PRICE_TRAILING_DIGIT, NULL, HFILL } },
/* end Trailing Digit and Price Tier fields */
/* start Number of Price Tiers and Register Tier fields */
{ &hf_zbee_zcl_price_number_of_price_tiers_and_register_tier,
{ "Number of Price Tiers and Register Tier", "zbee_zcl_se.price.number_of_price_tiers_and_register_tier", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_register_tier,
{ "Register Tier", "zbee_zcl_se.price.register_tier", FT_UINT8, BASE_HEX, NULL,
ZBEE_ZCL_PRICE_REGISTER_TIER, NULL, HFILL } },
{ &hf_zbee_zcl_price_number_of_price_tiers,
{ "Number of Price Tiers", "zbee_zcl_se.price.number_of_price_tiers", FT_UINT8, BASE_HEX, NULL,
ZBEE_ZCL_PRICE_NUMBER_OF_PRICE_TIERS, NULL, HFILL } },
/* end Number of Price Tiers and Register Tier fields */
{ &hf_zbee_zcl_price_extended_price_tier,
{ "Extended Price Tier", "zbee_zcl_se.price.extended_price_tier", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_extended_register_tier,
{ "Extended Register Tier", "zbee_zcl_se.price.extended_register_tier", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_duration_in_minutes,
{ "Duration in Minutes", "zbee_zcl_se.price.duration_in_minutes", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price,
{ "Price", "zbee_zcl_se.price.price", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_ratio,
{ "Price Ratio", "zbee_zcl_se.price.price.ratio", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_generation_price,
{ "Generation Price", "zbee_zcl_se.price.generation_price", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_generation_price_ratio,
{ "Generation Price Ratio", "zbee_zcl_se.price.generation_price.ratio", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_generation_tier,
{ "Generation Tier", "zbee_zcl_se.price.generation_tier", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_alternate_cost_delivered,
{ "Alternate Cost Delivered", "zbee_zcl_se.price.alternate_cost_delivered", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_alternate_cost_unit,
{ "Alternate Cost Unit", "zbee_zcl_se.price.alternate_cost.unit", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
/* start Alternate Cost Trailing Digit */
{ &hf_zbee_zcl_price_alternate_cost_trailing_digit_mask,
{ "Alternate Cost Trailing Digit", "zbee_zcl_se.price.alternate_cost.trailing_digit", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_alternate_cost_trailing_digit,
{ "Alternate Cost Trailing Digit", "zbee_zcl_se.price.alternate_cost.trailing_digit", FT_UINT8, BASE_DEC, NULL,
ZBEE_ZCL_PRICE_ALTERNATE_COST_TRAILING_DIGIT, NULL, HFILL } },
/* end Alternate Cost Trailing Digit */
{ &hf_zbee_zcl_price_start_time,
{ "Start Time", "zbee_zcl_se.price.start_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_earliest_start_time,
{ "Earliest Start Time", "zbee_zcl_se.price.earliest_start_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_latest_end_time,
{ "Latest End Time", "zbee_zcl_se.price.latest_end_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_current_time,
{ "Current Time", "zbee_zcl_se.price.current_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_price_ack_time,
{ "Price Ack Time", "zbee_zcl_se.price.price_ack_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_block_period_start_time,
{ "Block Period Start Time", "zbee_zcl_se.price.block_period.start_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_block_period_duration,
{ "Block Period Duration", "zbee_zcl_se.price.block_period.duration", FT_UINT24, BASE_DEC, NULL,
0x00, NULL, HFILL } },
/* start Block Period Control */
{ &hf_zbee_zcl_price_block_period_control,
{ "Block Period Control", "zbee_zcl_se.price.block_period.control", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_block_period_control_price_acknowledgement,
{ "Price Acknowledgement", "zbee_zcl_se.price.block_period.control.price_acknowledgement", FT_UINT8, BASE_DEC, VALS(zbee_zcl_price_block_period_control_price_acknowledgement_names),
ZBEE_ZCL_PRICE_BLOCK_PERIOD_CONTROL_PRICE_ACKNOWLEDGEMENT, NULL, HFILL } },
{ &hf_zbee_zcl_price_block_period_control_repeating_block,
{ "Repeating Block", "zbee_zcl_se.price.block_period.control.repeating_block", FT_UINT8, BASE_DEC, VALS(zbee_zcl_price_block_period_control_repeating_block_names),
ZBEE_ZCL_PRICE_BLOCK_PERIOD_CONTROL_REPEATING_BLOCK, NULL, HFILL } },
/* end Block Period Control */
/* start Block Period Duration Type fields */
{ &hf_zbee_zcl_price_block_period_duration_type,
{ "Block Period Duration Type", "zbee_zcl_se.price.block_period.duration.type", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_block_period_duration_timebase,
{ "Duration Timebase", "zbee_zcl_se.price.block_period.duration.timebase", FT_UINT8, BASE_HEX, VALS(zbee_zcl_price_block_period_duration_timebase_names),
ZBEE_ZCL_PRICE_BLOCK_PERIOD_DURATION_TIMEBASE, NULL, HFILL } },
{ &hf_zbee_zcl_price_block_period_duration_control,
{ "Duration Control", "zbee_zcl_se.price.block_period.duration.control", FT_UINT8, BASE_HEX, VALS(zbee_zcl_price_block_period_duration_control_names),
ZBEE_ZCL_PRICE_BLOCK_PERIOD_DURATION_CONTROL, NULL, HFILL } },
/* end Block Period Duration Type fields */
{ &hf_zbee_zcl_price_conversion_factor,
{ "Conversion Factor", "zbee_zcl_se.price.conversion_factor", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
/* start Conversion Factor Trailing Digit fields */
{ &hf_zbee_zcl_price_conversion_factor_trailing_digit_mask,
{ "Conversion Factor Trailing Digit", "zbee_zcl_se.price.conversion_factor_trailing_digit", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_conversion_factor_trailing_digit,
{ "Conversion Factor Trailing Digit", "zbee_zcl_se.price.conversion_factor.trailing_digit", FT_UINT8, BASE_DEC, NULL,
ZBEE_ZCL_PRICE_CONVERSION_FACTOR_TRAILING_DIGIT, NULL, HFILL } },
/* end Conversion Factor Trailing Digit fields */
{ &hf_zbee_zcl_price_calorific_value,
{ "Calorific Value", "zbee_zcl_se.price.calorific_value", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_calorific_value_unit,
{ "Calorific Value Unit", "zbee_zcl_se.price.calorific_value.unit", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
/* start Calorific Value Trailing Digit fields */
{ &hf_zbee_zcl_price_calorific_value_trailing_digit_mask,
{ "Calorific Value Trailing Digit", "zbee_zcl_se.price.calorific_value.trailing_digit", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_calorific_value_trailing_digit,
{ "Calorific Value Trailing Digit", "zbee_zcl_se.price.calorific_value.trailing_digit", FT_UINT8, BASE_DEC, NULL,
ZBEE_ZCL_PRICE_CALORIFIC_VALUE_TRAILING_DIGIT, NULL, HFILL } },
/* end Calorific Value Trailing Digit fields */
/* start Tariff Information Type/Charging Scheme fields */
{ &hf_zbee_zcl_price_tariff_information_type_and_charging_scheme,
{ "Tariff Type/Charging Scheme", "zbee_zcl_se.price.tariff_information.type_and_charging_scheme", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_tariff_information_type,
{ "Tariff Type", "zbee_zcl_se.price.tariff_information.type", FT_UINT8, BASE_HEX, VALS(zbee_zcl_price_tariff_type_names),
ZBEE_ZCL_PRICE_TARIFF_INFORMATION_TYPE, NULL, HFILL } },
{ &hf_zbee_zcl_price_tariff_information_charging_scheme,
{ "Charging Scheme", "zbee_zcl_se.price.tariff_information.charging_scheme", FT_UINT8, BASE_HEX, VALS(zbee_zcl_price_tariff_charging_scheme_names),
ZBEE_ZCL_PRICE_TARIFF_INFORMATION_CHARGING_SCHEME, NULL, HFILL } },
/* end Tariff Information Type/Charging Scheme fields */
{ &hf_zbee_zcl_price_tariff_information_tariff_label,
{ "Tariff Label", "zbee_zcl_se.price.tariff_information.tariff_label", FT_UINT_STRING, BASE_NONE, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_tariff_information_number_of_price_tiers_in_use,
{ "Number of Price Tiers in Use", "zbee_zcl_se.price.tariff_information.number_of_price_tiers_in_use", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_tariff_information_number_of_block_thresholds_in_use,
{ "Number of Block Thresholds in Use", "zbee_zcl_se.price.tariff_information.number_of_block_thresholds_in_use", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
/* start Price Trailing Digit fields */
{ &hf_zbee_zcl_price_tariff_information_price_trailing_digit_mask,
{ "Price Trailing Digit", "zbee_zcl_se.price.tariff_information.price.trailing_digit", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_tariff_information_price_trailing_digit,
{ "Price Trailing Digit", "zbee_zcl_se.price.tariff_information.price.trailing_digit", FT_UINT8, BASE_DEC, NULL,
ZBEE_ZCL_PRICE_TARIFF_INFORMATION_PRICE_TRAILING_DIGIT, NULL, HFILL } },
/* start Price Trailing Digit fields */
{ &hf_zbee_zcl_price_tariff_information_standing_charge,
{ "Standing Charge", "zbee_zcl_se.price.tariff_information.standing_charge", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_tariff_information_tier_block_mode,
{ "Tier Block Mode", "zbee_zcl_se.price.tariff_information.tier_block_mode", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_block_thresholds_number_of_block_thresholds,
{ "Number of Block Thresholds", "zbee_zcl_se.price.tariff_information.number_of_block_thresholds", FT_UINT8, BASE_DEC, NULL,
ZBEE_ZCL_PRICE_BLOCK_THRESHOLDS_NUMBER_OF_BLOCK_THRESHOLDS, NULL, HFILL } },
{ &hf_zbee_zcl_price_tariff_information_block_threshold_multiplier,
{ "Block Threshold Multiplier", "zbee_zcl_se.price.tariff_information.block_threshold_multiplier", FT_UINT24, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_tariff_information_block_threshold_divisor,
{ "Block Threshold Divisor", "zbee_zcl_se.price.tariff_information.block_threshold_divisor", FT_UINT24, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_price_matrix_sub_payload_control,
{ "Sub Payload Control", "zbee_zcl_se.price.price_matrix.sub_payload_control", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
/* start Tier/Block ID fields */
{ &hf_zbee_zcl_price_price_matrix_tier_block_id,
{ "Tier/Block ID", "zbee_zcl_se.price.price_matrix.tier_block_id", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_price_matrix_tier_block_id_block,
{ "Block", "zbee_zcl_se.price.price_matrix.block", FT_UINT8, BASE_DEC, NULL,
ZBEE_ZCL_PRICE_PRICE_MATRIX_TIER_BLOCK_ID_BLOCK, NULL, HFILL } },
{ &hf_zbee_zcl_price_price_matrix_tier_block_id_tier,
{ "Tier", "zbee_zcl_se.price.price_matrix.tier", FT_UINT8, BASE_DEC, NULL,
ZBEE_ZCL_PRICE_PRICE_MATRIX_TIER_BLOCK_ID_TIER, NULL, HFILL } },
/* end Tier/Block ID fields */
{ &hf_zbee_zcl_price_price_matrix_tier_block_id_tou_tier,
{ "Tier", "zbee_zcl_se.price.price_matrix.tier", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_price_matrix_price,
{ "Price", "zbee_zcl_se.price.price_matrix.price", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_block_thresholds_sub_payload_control,
{ "Sub Payload Control", "zbee_zcl_se.price.block_thresholds.sub_payload_control", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
/* start Tier/Number of Block Thresholds fields */
{ &hf_zbee_zcl_price_block_thresholds_tier_number_of_block_thresholds,
{ "Tier/Number of Block Thresholds", "zbee_zcl_se.price.block_thresholds.tier_number_of_block_thresholds", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_block_thresholds_tier,
{ "Tier", "zbee_zcl_se.price.block_thresholds.tier", FT_UINT8, BASE_DEC, NULL,
ZBEE_ZCL_PRICE_BLOCK_THRESHOLDS_TIER, NULL, HFILL } },
/* end Tier/Number of Block Thresholds fields */
{ &hf_zbee_zcl_price_block_thresholds_block_threshold,
{ "Block Threshold", "zbee_zcl_se.price.block_threshold", FT_UINT48, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_co2_value,
{ "CO2 Value", "zbee_zcl_se.price.co2.value", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_co2_unit,
{ "CO2 Unit", "zbee_zcl_se.price.co2.unit", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
/* start CO2 Trailing Digit fields */
{ &hf_zbee_zcl_price_co2_value_trailing_digit_mask,
{ "CO2 Value Trailing Digit", "zbee_zcl_se.price.co2.value.trailing_digit", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_co2_value_trailing_digit,
{ "CO2 Value Trailing Digit", "zbee_zcl_se.price.co2.value.trailing_digit", FT_UINT8, BASE_DEC, NULL,
ZBEE_ZCL_PRICE_CO2_VALUE_TRAILING_DIGIT, NULL, HFILL } },
/* end CO2 Trailing Digit fields */
{ &hf_zbee_zcl_price_tier_labels_number_of_labels,
{ "Number of Labels", "zbee_zcl_se.price.tier_labels.number_of_labels", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_tier_labels_tier_id,
{ "Tier ID", "zbee_zcl_se.price.tier_labels.tier_id", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_tier_labels_tier_label,
{ "Tariff Label", "zbee_zcl_se.price.tier_labels.tier_label", FT_UINT_STRING, BASE_NONE, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_billing_period_start_time,
{ "Billing Period Start Time", "zbee_zcl_se.price.billing_period.start_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_billing_period_duration,
{ "Billing Period Duration", "zbee_zcl_se.price.billing_period.duration", FT_UINT24, BASE_DEC, NULL,
0x00, NULL, HFILL } },
/* start Billing Period Duration Type fields */
{ &hf_zbee_zcl_price_billing_period_duration_type,
{ "Billing Period Duration Type", "zbee_zcl_se.price.billing_period.duration.type", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_billing_period_duration_timebase,
{ "Duration Timebase", "zbee_zcl_se.price.billing_period.duration.timebase", FT_UINT8, BASE_HEX, VALS(zbee_zcl_price_block_period_duration_timebase_names),
ZBEE_ZCL_PRICE_BILLING_PERIOD_DURATION_TIMEBASE, NULL, HFILL } },
{ &hf_zbee_zcl_price_billing_period_duration_control,
{ "Duration Control", "zbee_zcl_se.price.billing_period.duration.control", FT_UINT8, BASE_HEX, VALS(zbee_zcl_price_block_period_duration_control_names),
ZBEE_ZCL_PRICE_BILLING_PERIOD_DURATION_CONTROL, NULL, HFILL } },
/* end Billing Period Duration Type fields */
{ &hf_zbee_zcl_price_consolidated_bill,
{ "Consolidated Bill", "zbee_zcl_se.price.consolidated_bill", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
/* start Consolidated Bill Trailing Digit fields */
{ &hf_zbee_zcl_price_consolidated_bill_trailing_digit_mask,
{ "Bill Trailing Digit", "zbee_zcl_se.price.consolidated_bill.trailing_digit", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_consolidated_bill_trailing_digit,
{ "Bill Trailing Digit", "zbee_zcl_se.price.consolidated_bill.trailing_digit", FT_UINT8, BASE_DEC, NULL,
ZBEE_ZCL_PRICE_CONSOLIDATED_BILL_TRAILING_DIGIT, NULL, HFILL } },
/* end Consolidated Bill Trailing Digit fields */
{ &hf_zbee_zcl_price_credit_payment_due_date,
{ "Credit Payment Due Date", "zbee_zcl_se.price.credit_payment.due_date", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_credit_payment_date,
{ "Credit Payment Date", "zbee_zcl_se.price.credit_payment.date", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_credit_payment_overdue_amount,
{ "Credit Payment Overdue Amount", "zbee_zcl_se.price.credit_payment.overdue_amount", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_credit_payment_status,
{ "Credit Payment Status", "zbee_zcl_se.price.credit_payment.status", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_credit_payment,
{ "Credit Payment", "zbee_zcl_se.price.credit_payment", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_credit_payment_ref,
{ "Credit Payment Ref", "zbee_zcl_se.price.credit_payment.ref", FT_UINT_STRING, BASE_NONE, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_old_currency,
{ "Old Currency", "zbee_zcl_se.price.old_currency", FT_UINT16, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_new_currency,
{ "New Currency", "zbee_zcl_se.price.new_currency", FT_UINT16, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_price_currency_change_control_flags,
{ "Currency Change Control Flags", "zbee_zcl_se.price.currency_change_control_flags", FT_UINT32, BASE_HEX, NULL,
0x00, NULL, HFILL } },
};
/* ZCL Price subtrees */
gint *ett[] = {
&ett_zbee_zcl_price,
&ett_zbee_zcl_price_tariff_type,
&ett_zbee_zcl_price_trailing_digit_and_price_tier,
&ett_zbee_zcl_price_number_of_price_tiers_and_register_tier,
&ett_zbee_zcl_price_alternate_cost_trailing_digit,
&ett_zbee_zcl_price_block_period_control,
&ett_zbee_zcl_price_block_period_duration_type,
&ett_zbee_zcl_price_conversion_factor_trailing_digit,
&ett_zbee_zcl_price_calorific_value_trailing_digit,
&ett_zbee_zcl_price_tariff_information_tariff_type_and_charging_scheme,
&ett_zbee_zcl_price_tariff_information_price_trailing_digit,
&ett_zbee_zcl_price_price_matrix_tier_block_id,
&ett_zbee_zcl_price_block_thresholds_tier_number_of_block_thresholds,
&ett_zbee_zcl_price_co2_value_trailing_digit,
&ett_zbee_zcl_price_billing_period_duration_type,
&ett_zbee_zcl_price_consolidated_bill_trailing_digit,
};
/* Register the ZigBee ZCL Price cluster protocol name and description */
proto_zbee_zcl_price = proto_register_protocol("ZigBee ZCL Price", "ZCL Price", ZBEE_PROTOABBREV_ZCL_PRICE);
proto_register_field_array(proto_zbee_zcl_price, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
/* Register the ZigBee ZCL Price dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_PRICE, dissect_zbee_zcl_price, proto_zbee_zcl_price);
} /*proto_register_zbee_zcl_price*/
/**
*Hands off the ZCL Price dissector.
*
*/
void
proto_reg_handoff_zbee_zcl_price(void)
{
zbee_zcl_init_cluster( ZBEE_PROTOABBREV_ZCL_PRICE,
proto_zbee_zcl_price,
ett_zbee_zcl_price,
ZBEE_ZCL_CID_PRICE,
ZBEE_MFG_CODE_NONE,
hf_zbee_zcl_price_attr_server_id,
hf_zbee_zcl_price_attr_client_id,
hf_zbee_zcl_price_srv_rx_cmd_id,
hf_zbee_zcl_price_srv_tx_cmd_id,
(zbee_zcl_fn_attr_data)dissect_zcl_price_attr_data
);
} /*proto_reg_handoff_zbee_zcl_price*/
/* ########################################################################## */
/* #### (0x0701) DEMAND RESPONSE AND LOAD CONTROL CLUSTER ################### */
/* ########################################################################## */
/* Attributes */
#define zbee_zcl_drlc_attr_client_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_ATTR_ID_DRLC_CLNT_UTILITY_ENROLLMENT_GROUP, 0x0000, "Utility Enrollment Group" ) \
XXX(ZBEE_ZCL_ATTR_ID_DRLC_CLNT_START_RANDOMIZATION_MINUTES,0x0001, "Start Randomization Minutes" ) \
XXX(ZBEE_ZCL_ATTR_ID_DRLC_CLNT_DURATION_RND_MINUTES, 0x0002, "Duration Randomization Minutes" ) \
XXX(ZBEE_ZCL_ATTR_ID_DRLC_CLNT_DEVICE_CLASS_VALUE, 0x0003, "Device Class Value" ) \
/* Smart Energy */ \
XXX(ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_DRLC_CLNT, 0xFFFE, "Attribute Reporting Status" )
VALUE_STRING_ENUM(zbee_zcl_drlc_attr_client_names);
VALUE_STRING_ARRAY(zbee_zcl_drlc_attr_client_names);
/* Server Commands Received */
#define zbee_zcl_drlc_srv_rx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_DRLC_REPORT_EVENT_STATUS, 0x00, "Report Event Status" ) \
XXX(ZBEE_ZCL_CMD_ID_DRLC_GET_SCHEDULED_EVENTS, 0x01, "Get Scheduled Events" )
VALUE_STRING_ENUM(zbee_zcl_drlc_srv_rx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_drlc_srv_rx_cmd_names);
/* Server Commands Generated */
#define zbee_zcl_drlc_srv_tx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_DRLC_LOAD_CONTROL_EVENT, 0x00, "Load Control Event" ) \
XXX(ZBEE_ZCL_CMD_ID_DRLC_CANCEL_LOAD_CONTROL_EVENT, 0x01, "Cancel Load Control Event" ) \
XXX(ZBEE_ZCL_CMD_ID_DRLC_CANCEL_ALL_LOAD_CONTROL_EVENTS, 0x02, "Cancel All Load Control Events" )
VALUE_STRING_ENUM(zbee_zcl_drlc_srv_tx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_drlc_srv_tx_cmd_names);
#define ZBEE_ZCL_DRLC_TEMP_OFFSET_NOT_USED 0xFF
#define ZBEE_ZCL_DRLC_TEMP_OFFSET_DIVIDER 10.0f
#define ZBEE_ZCL_DRLC_TEMP_SET_POINT_NOT_USED 0x8000
#define ZBEE_ZCL_DRLC_TEMP_SET_POINT_DIVIDER 100.0f
#define ZBEE_ZCL_DRLC_AVERAGE_LOAD_ADJUSTMENT_PERCENTAGE 0x80
static const range_string zbee_zcl_drlc_load_control_event_criticality_level[] = {
{ 0x0, 0x0, "Reserved" },
{ 0x1, 0x1, "Green" },
{ 0x2, 0x2, "1" },
{ 0x3, 0x3, "2" },
{ 0x4, 0x4, "3" },
{ 0x5, 0x5, "4" },
{ 0x6, 0x6, "5" },
{ 0x7, 0x7, "Emergency" },
{ 0x8, 0x8, "Planned Outage" },
{ 0x9, 0x9, "Service Disconnect" },
{ 0x0A, 0x0F, "Utility Defined" },
{ 0x10, 0xFF, "Reserved" },
{ 0, 0, NULL }
};
static const range_string zbee_zcl_drlc_report_event_status_event_status[] = {
{ 0x0, 0x0, "Reserved for future use." },
{ 0x01, 0x01, "Load Control Event command received" },
{ 0x02, 0x02, "Event started" },
{ 0x03, 0x03, "Event completed" },
{ 0x04, 0x04, "User has chosen to \"Opt-Out\", user will not participate in this event" },
{ 0x05, 0x05, "User has chosen to \"Opt-In\", user will participate in this event" },
{ 0x06, 0x06, "The event has been cancelled" },
{ 0x07, 0x07, "The event has been superseded" },
{ 0x08, 0x08, "Event partially completed with User \"Opt-Out\"." },
{ 0x09, 0x09, "Event partially completed due to User \"Opt-In\"." },
{ 0x0A, 0x0A, "Event completed, no User participation (Previous \"Opt-Out\")." },
{ 0x0B, 0xF7, "Reserved for future use." },
{ 0xF8, 0xF8, "Rejected - Invalid Cancel Command (Default)" },
{ 0xF9, 0xF9, "Rejected - Invalid Cancel Command (Invalid Effective Time)" },
{ 0xFA, 0xFA , "Reserved" },
{ 0xFB, 0xFB, "Rejected - Event was received after it had expired (Current Time > Start Time + Duration)" },
{ 0xFC, 0xFC, "Reserved for future use." },
{ 0xFD, 0xFD, "Rejected - Invalid Cancel Command (Undefined Event)" },
{ 0xFE, 0xFE, "Load Control Event command Rejected" },
{ 0xFF, 0xFF, "Reserved for future use." },
{ 0, 0, NULL }
};
static const range_string zbee_zcl_drlc_report_event_signature_type[] = {
{ 0x0, 0x0, "No Signature" },
{ 0x01, 0x01, "ECDSA" },
{ 0x02, 0xFF, "Reserved" },
{ 0, 0, NULL }
};
static const true_false_string zbee_zcl_drlc_randomize_start_tfs = {
"Randomize Start time",
"Randomized Start not Applied"
};
static const true_false_string zbee_zcl_drlc_randomize_duration_tfs = {
"Randomize Duration time",
"Randomized Duration not Applied"
};
/*************************/
/* Function Declarations */
/*************************/
void proto_register_zbee_zcl_drlc(void);
void proto_reg_handoff_zbee_zcl_drlc(void);
static void decode_zcl_msg_start_time (gchar *s, guint32 value);
static void decode_zcl_drlc_temp_offset (gchar *s, guint8 value);
static void decode_zcl_drlc_temp_set_point (gchar *s, gint16 value);
static void decode_zcl_drlc_average_load_adjustment_percentage (gchar *s, gint8 value);
static void dissect_zcl_drlc_load_control_event (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_drlc_cancel_load_control_event (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_drlc_cancel_all_load_control_event (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_drlc_report_event_status (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_drlc_get_scheduled_events (tvbuff_t *tvb, proto_tree *tree, guint *offset);
/* Attribute Dissector Helpers */
static void dissect_zcl_drlc_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr);
/*************************/
/* Global Variables */
/*************************/
/* Initialize the protocol and registered fields */
static int proto_zbee_zcl_drlc = -1;
static int hf_zbee_zcl_drlc_srv_tx_cmd_id = -1;
static int hf_zbee_zcl_drlc_srv_rx_cmd_id = -1;
static int hf_zbee_zcl_drlc_attr_client_id = -1;
static int hf_zbee_zcl_drlc_attr_reporting_status = -1;
static int hf_zbee_zcl_drlc_issuer_event_id = -1;
static int hf_zbee_zcl_drlc_device_class = -1;
static int hf_zbee_zcl_drlc_device_class_hvac_compressor_or_furnace = -1;
static int hf_zbee_zcl_drlc_device_class_strip_heaters_baseboard_heaters = -1;
static int hf_zbee_zcl_drlc_device_class_water_heater = -1;
static int hf_zbee_zcl_drlc_device_class_pool_pump_spa_jacuzzi = -1;
static int hf_zbee_zcl_drlc_device_class_smart_appliances = -1;
static int hf_zbee_zcl_drlc_device_class_irrigation_pump = -1;
static int hf_zbee_zcl_drlc_device_class_managed_c_i_loads= -1;
static int hf_zbee_zcl_drlc_device_class_simple_misc_loads = -1;
static int hf_zbee_zcl_drlc_device_class_exterior_lighting = -1;
static int hf_zbee_zcl_drlc_device_class_interior_lighting = -1;
static int hf_zbee_zcl_drlc_device_class_electric_vehicle = -1;
static int hf_zbee_zcl_drlc_device_class_generation_systems = -1;
static int hf_zbee_zcl_drlc_device_class_reserved = -1;
static int hf_zbee_zcl_drlc_utility_enrollment_group = -1;
static int hf_zbee_zcl_drlc_start_time = -1;
static int hf_zbee_zcl_drlc_duration_in_minutes = -1;
static int hf_zbee_zcl_drlc_criticality_level = -1;
static int hf_zbee_zcl_drlc_cooling_temp_offset = -1;
static int hf_zbee_zcl_drlc_heating_temp_offset = -1;
static int hf_zbee_zcl_drlc_cooling_temp_set_point = -1;
static int hf_zbee_zcl_drlc_heating_temp_set_point = -1;
static int hf_zbee_zcl_drlc_average_load_adjustment_percentage = -1;
static int hf_zbee_zcl_drlc_duty_cycle = -1;
static int hf_zbee_zcl_drlc_event_control = -1;
static int hf_zbee_zcl_drlc_event_control_randomize_start_time = -1;
static int hf_zbee_zcl_drlc_event_control_randomize_duration_time = -1;
static int hf_zbee_zcl_drlc_event_control_reserved = -1;
static int hf_zbee_zcl_drlc_cancel_control = -1;
static int hf_zbee_zcl_drlc_cancel_control_event_in_process = -1;
static int hf_zbee_zcl_drlc_cancel_control_reserved = -1;
static int hf_zbee_zcl_drlc_effective_time = -1;
static int hf_zbee_zcl_drlc_report_event_issuer_event_id = -1;
static int hf_zbee_zcl_drlc_report_event_event_status = -1;
static int hf_zbee_zcl_drlc_report_event_event_status_time = -1;
static int hf_zbee_zcl_drlc_report_event_criticality_level_applied = -1;
static int hf_zbee_zcl_drlc_report_event_cooling_temp_set_point_applied = -1;
static int hf_zbee_zcl_drlc_report_event_heating_temp_set_point_applied = -1;
static int hf_zbee_zcl_drlc_report_event_average_load_adjustment_percentage = -1;
static int hf_zbee_zcl_drlc_report_event_duty_cycle = -1;
static int hf_zbee_zcl_drlc_report_event_event_control = -1;
static int hf_zbee_zcl_drlc_report_event_signature_type = -1;
static int hf_zbee_zcl_drlc_report_event_signature = -1;
static int hf_zbee_zcl_drlc_get_scheduled_events_start_time = -1;
static int hf_zbee_zcl_drlc_get_scheduled_events_number_of_events = -1;
static int hf_zbee_zcl_drlc_get_scheduled_events_issuer_event_id = -1;
static int* const zbee_zcl_drlc_control_event_device_classes[] = {
&hf_zbee_zcl_drlc_device_class_hvac_compressor_or_furnace,
&hf_zbee_zcl_drlc_device_class_strip_heaters_baseboard_heaters,
&hf_zbee_zcl_drlc_device_class_water_heater,
&hf_zbee_zcl_drlc_device_class_pool_pump_spa_jacuzzi,
&hf_zbee_zcl_drlc_device_class_smart_appliances,
&hf_zbee_zcl_drlc_device_class_irrigation_pump,
&hf_zbee_zcl_drlc_device_class_managed_c_i_loads,
&hf_zbee_zcl_drlc_device_class_simple_misc_loads,
&hf_zbee_zcl_drlc_device_class_exterior_lighting,
&hf_zbee_zcl_drlc_device_class_interior_lighting,
&hf_zbee_zcl_drlc_device_class_electric_vehicle,
&hf_zbee_zcl_drlc_device_class_generation_systems,
&hf_zbee_zcl_drlc_device_class_reserved,
NULL
};
static int* const hf_zbee_zcl_drlc_event_control_flags[] = {
&hf_zbee_zcl_drlc_event_control_randomize_start_time,
&hf_zbee_zcl_drlc_event_control_randomize_duration_time,
&hf_zbee_zcl_drlc_event_control_reserved,
NULL
};
static int* const hf_zbee_zcl_drlc_cancel_control_flags[] = {
&hf_zbee_zcl_drlc_cancel_control_event_in_process,
&hf_zbee_zcl_drlc_cancel_control_reserved,
NULL
};
/* Initialize the subtree pointers */
static gint ett_zbee_zcl_drlc = -1;
static gint ett_zbee_zcl_drlc_device_class = -1;
static gint ett_zbee_zcl_drlc_event_control = -1;
static gint ett_zbee_zcl_drlc_cancel_control = -1;
/*************************/
/* Function Bodies */
/*************************/
/**
* This function decodes Temperature Offset.
*
* @param s string to display
* @param value value to decode
*/
static void
decode_zcl_drlc_temp_offset(gchar *s, guint8 value)
{
if (value == ZBEE_ZCL_DRLC_TEMP_OFFSET_NOT_USED)
snprintf(s, ITEM_LABEL_LENGTH, "Not Used");
else {
gfloat temp_delta;
temp_delta = value / ZBEE_ZCL_DRLC_TEMP_OFFSET_DIVIDER;
snprintf(s, ITEM_LABEL_LENGTH, "%+.2f%s", temp_delta, units_degree_celsius.singular);
}
} /*decode_zcl_msg_start_time*/
/**
* This function decodes Temperature Set Point.
*
* @param s string to display
* @param value value to decode
*/
static void decode_zcl_drlc_temp_set_point(gchar *s, gint16 value)
{
if (value & ZBEE_ZCL_DRLC_TEMP_SET_POINT_NOT_USED)
snprintf(s, ITEM_LABEL_LENGTH, "Not Used");
else {
gfloat temp_delta;
temp_delta = value / ZBEE_ZCL_DRLC_TEMP_SET_POINT_DIVIDER;
snprintf(s, ITEM_LABEL_LENGTH, "%+.2f%s", temp_delta, units_degree_celsius.singular);
}
} /*decode_zcl_drlc_temp_set_point*/
/**
* This function decodes Average Load Adjustment Percentage.
*
* @param s string to display
* @param value value to decode
*/
static void decode_zcl_drlc_average_load_adjustment_percentage(gchar *s, gint8 value)
{
if (value & ZBEE_ZCL_DRLC_AVERAGE_LOAD_ADJUSTMENT_PERCENTAGE)
snprintf(s, ITEM_LABEL_LENGTH, "Not Used");
else {
snprintf(s, ITEM_LABEL_LENGTH, "%+d%%", value);
}
} /*decode_zcl_drlc_average_load_adjustment_percentage*/
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*@param attr_id attribute identifier
*@param data_type attribute data type
*@param client_attr ZCL client
*/
static void
dissect_zcl_drlc_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr)
{
switch (attr_id) {
/* applies to all SE clusters */
case ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_DRLC_CLNT:
proto_tree_add_item(tree, hf_zbee_zcl_drlc_attr_reporting_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
break;
default: /* Catch all */
dissect_zcl_attr_data(tvb, tree, offset, data_type, client_attr);
break;
}
} /*dissect_zcl_drlc_attr_data*/
/**
*This function is called by ZCL foundation dissector in order to decode
*DRLC Load Control Event Command Payload.
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*/
static void
dissect_zcl_drlc_load_control_event(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_issuer_event_id, tvb,
*offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Device Class */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_drlc_device_class, ett_zbee_zcl_drlc_device_class,
zbee_zcl_drlc_control_event_device_classes, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Utility Enrollment Group */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_utility_enrollment_group, tvb,
*offset, 1, ENC_NA);
*offset += 1;
/* Start Time */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_start_time, tvb,
*offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Duration In Minutes */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_duration_in_minutes, tvb,
*offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Criticality Level */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_criticality_level, tvb,
*offset, 1, ENC_NA);
*offset += 1;
/* Cooling Temperature Offset */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_cooling_temp_offset, tvb,
*offset, 1, ENC_NA);
*offset += 1;
/* Heating Temperature Offset */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_heating_temp_offset, tvb,
*offset, 1, ENC_NA);
*offset += 1;
/* Cooling Temperature Set Point */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_cooling_temp_set_point, tvb,
*offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Heating Temperature Set Point */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_heating_temp_set_point, tvb,
*offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Average Load Adjustment Percentage */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_average_load_adjustment_percentage, tvb,
*offset, 1, ENC_NA);
*offset += 1;
/* Duty Cycle */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_duty_cycle, tvb,
*offset, 1, ENC_NA);
*offset += 1;
/* Event Control */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_drlc_event_control, ett_zbee_zcl_drlc_event_control,
hf_zbee_zcl_drlc_event_control_flags, ENC_LITTLE_ENDIAN);
*offset += 1;
} /*dissect_zcl_drlc_load_control_event*/
/**
*This function is called by ZCL foundation dissector in order to decode
*DRLC Cancel Load Control Event Command Payload.
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*/
static void
dissect_zcl_drlc_cancel_load_control_event(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_issuer_event_id, tvb,
*offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Device Class */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_drlc_device_class, ett_zbee_zcl_drlc_device_class,
zbee_zcl_drlc_control_event_device_classes, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Utility Enrollment Group */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_utility_enrollment_group, tvb,
*offset, 1, ENC_NA);
*offset += 1;
/* Cancel Control */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_drlc_cancel_control, ett_zbee_zcl_drlc_cancel_control,
hf_zbee_zcl_drlc_cancel_control_flags, ENC_LITTLE_ENDIAN);
*offset += 1;
/* Effective Time */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_effective_time, tvb,
*offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
}
/**
*This function is called by ZCL foundation dissector in order to decode
*DRLC Cancel All Load Control Events Command Payload.
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*/
static void
dissect_zcl_drlc_cancel_all_load_control_event(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Cancel Control */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_drlc_cancel_control, ett_zbee_zcl_drlc_cancel_control,
hf_zbee_zcl_drlc_cancel_control_flags, ENC_LITTLE_ENDIAN);
*offset += 1;
} /*dissect_zcl_drlc_cancel_all_load_control_event*/
/**
*This function is called by ZCL foundation dissector in order to decode
*DRLC Report Event Status Command Payload.
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*/
static void
dissect_zcl_drlc_report_event_status(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t event_status_time;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_report_event_issuer_event_id, tvb,
*offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Event Status */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_report_event_event_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Event Status Time */
event_status_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
event_status_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_drlc_report_event_event_status_time, tvb, *offset, 4, &event_status_time);
*offset += 4;
/* Criticality Level Applied */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_report_event_criticality_level_applied, tvb,
*offset, 1, ENC_NA);
*offset += 1;
/* Cooling Temperature Set Point Applied */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_report_event_cooling_temp_set_point_applied, tvb,
*offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Heating Temperature Set Point Applied */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_report_event_heating_temp_set_point_applied, tvb,
*offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Average Load Adjustment Percentage Applied */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_report_event_average_load_adjustment_percentage, tvb,
*offset, 1, ENC_NA);
*offset += 1;
/* Duty Cycle Applied */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_report_event_duty_cycle, tvb,
*offset, 1, ENC_NA);
*offset += 1;
/* Event Control */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_drlc_report_event_event_control, ett_zbee_zcl_drlc_event_control,
hf_zbee_zcl_drlc_event_control_flags, ENC_LITTLE_ENDIAN);
*offset += 1;
/* Signature Type */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_report_event_signature_type, tvb,
*offset, 1, ENC_NA);
*offset += 1;
/* Signature */
guint rem_len;
rem_len = tvb_reported_length_remaining(tvb, *offset);
proto_tree_add_item(tree, hf_zbee_zcl_drlc_report_event_signature, tvb,
*offset, rem_len, ENC_NA);
*offset += rem_len;
} /*dissect_zcl_drlc_report_event_status*/
/**
*This function is called by ZCL foundation dissector in order to decode
*DRLC Get Scheduled Events Command Payload.
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*/
static void
dissect_zcl_drlc_get_scheduled_events(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
gint rem_len;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_drlc_get_scheduled_events_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Number of Events */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_get_scheduled_events_number_of_events, tvb,
*offset, 1, ENC_NA);
*offset += 1;
rem_len = tvb_reported_length_remaining(tvb, *offset);
if (rem_len > 3) {
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_drlc_get_scheduled_events_issuer_event_id, tvb,
*offset, rem_len, ENC_LITTLE_ENDIAN);
*offset += 4;
}
} /*dissect_zcl_drlc_report_event_status*/
/**
*ZigBee ZCL DRLC cluster dissector for wireshark.
*
*@param tvb pointer to buffer containing raw packet.
*@param pinfo pointer to packet information fields
*@param tree pointer to data tree Wireshark uses to display packet.
*/
static int
dissect_zbee_zcl_drlc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
zbee_zcl_packet *zcl;
guint offset = 0;
guint8 cmd_id;
gint rem_len;
proto_tree *payload_tree;
/* Reject the packet if data is NULL */
if (data == NULL)
return 0;
zcl = (zbee_zcl_packet *)data;
cmd_id = zcl->cmd_id;
/* Create a subtree for the ZCL Command frame, and add the command ID to it. */
if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_drlc_srv_rx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_drlc_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_drlc, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_DRLC_REPORT_EVENT_STATUS:
dissect_zcl_drlc_report_event_status(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_DRLC_GET_SCHEDULED_EVENTS:
dissect_zcl_drlc_get_scheduled_events(tvb, payload_tree, &offset);
break;
default:
break;
}
}
}
else { /* ZBEE_ZCL_FCF_TO_CLIENT */
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_drlc_srv_tx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_drlc_srv_tx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_drlc, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_DRLC_LOAD_CONTROL_EVENT:
dissect_zcl_drlc_load_control_event(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_DRLC_CANCEL_LOAD_CONTROL_EVENT:
dissect_zcl_drlc_cancel_load_control_event(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_DRLC_CANCEL_ALL_LOAD_CONTROL_EVENTS:
dissect_zcl_drlc_cancel_all_load_control_event(tvb, payload_tree, &offset);
break;
default:
break;
}
}
}
return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_drlc*/
/**
*This function registers the ZCL DRLC dissector
*
*/
void
proto_register_zbee_zcl_drlc(void)
{
static hf_register_info hf[] = {
{ &hf_zbee_zcl_drlc_attr_client_id,
{ "Attribute", "zbee_zcl_se.drlc.attr_client_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_drlc_attr_client_names),
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_attr_reporting_status, /* common to all SE clusters */
{ "Attribute Reporting Status", "zbee_zcl_se.drlc.attr.attr_reporting_status",
FT_UINT8, BASE_HEX, VALS(zbee_zcl_se_reporting_status_names), 0x00, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_srv_tx_cmd_id,
{ "Command", "zbee_zcl_se.drlc.cmd.srv_tx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_drlc_srv_tx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_srv_rx_cmd_id,
{ "Command", "zbee_zcl_se.drlc.cmd.srv_rx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_drlc_srv_rx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.drlc.issuer_id",
FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_device_class,
{ "Device Class", "zbee_zcl_se.drlc.device_class",
FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_device_class_hvac_compressor_or_furnace,
{ "HVAC Compressor or Furnace", "zbee_zcl_se.drlc.device_class.hvac_compressor_or_furnace",
FT_BOOLEAN, 16, NULL, 0x0001, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_device_class_strip_heaters_baseboard_heaters,
{ "Strip Heaters/Baseboard Heaters", "zbee_zcl_se.drlc.device_class.strip_heaters_baseboard_heaters",
FT_BOOLEAN, 16, NULL, 0x0002, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_device_class_water_heater,
{ "Water Heater", "zbee_zcl_se.drlc.device_class.water_heater",
FT_BOOLEAN, 16, NULL, 0x0004, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_device_class_pool_pump_spa_jacuzzi,
{ "Pool Pump/Spa/Jacuzzi", "zbee_zcl_se.drlc.device_class.pool_pump_spa_jacuzzi",
FT_BOOLEAN, 16, NULL, 0x0008, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_device_class_smart_appliances,
{ "Smart Appliances", "zbee_zcl_se.drlc.device_class.smart_appliances",
FT_BOOLEAN, 16, NULL, 0x0010, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_device_class_irrigation_pump,
{ "Irrigation Pump", "zbee_zcl_se.drlc.device_class.irrigation_pump",
FT_BOOLEAN, 16, NULL, 0x0020, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_device_class_managed_c_i_loads,
{ "Managed Commercial & Industrial (C&I) loads", "zbee_zcl_se.drlc.device_class.managed_c_i_loads",
FT_BOOLEAN, 16, NULL, 0x0040, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_device_class_simple_misc_loads,
{ "Simple misc. (Residential On/Off) loads", "zbee_zcl_se.drlc.device_class.simple_misc_loads",
FT_BOOLEAN, 16, NULL, 0x0080, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_device_class_exterior_lighting,
{ "Exterior Lighting", "zbee_zcl_se.drlc.device_class.exterior_lighting",
FT_BOOLEAN, 16, NULL, 0x0100, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_device_class_interior_lighting,
{ "Interior Lighting", "zbee_zcl_se.drlc.device_class.interior_lighting",
FT_BOOLEAN, 16, NULL, 0x0200, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_device_class_electric_vehicle,
{ "Electric Vehicle", "zbee_zcl_se.drlc.device_class.electric_vehicle",
FT_BOOLEAN, 16, NULL, 0x0400, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_device_class_generation_systems,
{ "Generation Systems", "zbee_zcl_se.drlc.device_class.generation_systems",
FT_BOOLEAN, 16, NULL, 0x0800, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_device_class_reserved ,
{ "Reserved", "zbee_zcl_se.drlc.device_class.reserved",
FT_UINT16, BASE_HEX, NULL, 0xF000, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_utility_enrollment_group,
{ "Utility Enrollment Group", "zbee_zcl_se.drlc.utility_enrollment_group",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_start_time,
{ "Start Time", "zbee_zcl_se.drlc.start_time",
FT_UINT32, BASE_CUSTOM, CF_FUNC(decode_zcl_msg_start_time), 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_duration_in_minutes,
{ "Duration In Minutes", "zbee_zcl_se.drlc.duration_in_minutes",
FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_criticality_level,
{ "Criticality Level", "zbee_zcl_se.drlc.criticality_level",
FT_UINT8, BASE_HEX | BASE_RANGE_STRING, RVALS(zbee_zcl_drlc_load_control_event_criticality_level), 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_cooling_temp_offset,
{ "Cooling Temperature Offset", "zbee_zcl_se.drlc.cooling_temperature_offset",
FT_UINT8, BASE_CUSTOM, CF_FUNC(decode_zcl_drlc_temp_offset), 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_heating_temp_offset,
{ "Heating Temperature Offset", "zbee_zcl_se.drlc.heating_temperature_offset",
FT_UINT8, BASE_CUSTOM, CF_FUNC(decode_zcl_drlc_temp_offset), 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_cooling_temp_set_point,
{ "Cooling Temperature Set Point", "zbee_zcl_se.drlc.cooling_temperature_set_point",
FT_INT16, BASE_CUSTOM, CF_FUNC(decode_zcl_drlc_temp_set_point), 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_heating_temp_set_point,
{ "Heating Temperature Set Point", "zbee_zcl_se.drlc.heating_temperature_set_point",
FT_INT16, BASE_CUSTOM, CF_FUNC(decode_zcl_drlc_temp_set_point), 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_average_load_adjustment_percentage,
{ "Average Load Adjustment Percentage", "zbee_zcl_se.drlc.average_load_adjustment_percentage",
FT_INT8, BASE_CUSTOM, CF_FUNC(decode_zcl_drlc_average_load_adjustment_percentage), 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_duty_cycle,
{ "Duty Cycle", "zbee_zcl_se.drlc.duty_cycle",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_event_control,
{ "Event Control", "zbee_zcl_se.drlc.event_control",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_event_control_randomize_start_time,
{ "Randomize Start time", "zbee_zcl_se.drlc.randomize_start_time",
FT_BOOLEAN, 8, TFS(&zbee_zcl_drlc_randomize_start_tfs), 0x01, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_event_control_randomize_duration_time,
{ "Randomize Duration time", "zbee_zcl_se.drlc.randomize_duration_time",
FT_BOOLEAN, 8, TFS(&zbee_zcl_drlc_randomize_duration_tfs), 0x02, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_event_control_reserved,
{ "Reserved", "zbee_zcl_se.drlc.reserved",
FT_UINT8, BASE_HEX, NULL, 0xFC, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_cancel_control,
{ "Cancel Control", "zbee_zcl_se.drlc.cancel_control",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_cancel_control_event_in_process,
{ "Event in process", "zbee_zcl_se.drlc.cancel_control.event_in_process",
FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_cancel_control_reserved,
{ "Reserved", "zbee_zcl_se.drlc.cancel_control.reserved",
FT_UINT8, BASE_HEX, NULL, 0xFE, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_effective_time,
{ "Reserved", "zbee_zcl_se.drlc.effective_time",
FT_UINT32, BASE_CUSTOM, CF_FUNC(decode_zcl_msg_start_time), 0xFE, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_report_event_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.drlc.report_event.issuer_id",
FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_report_event_event_status,
{ "Event Status", "zbee_zcl_se.drlc.report_event.event_status",
FT_UINT8, BASE_HEX | BASE_RANGE_STRING, RVALS(zbee_zcl_drlc_report_event_status_event_status), 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_report_event_event_status_time,
{ "Event Status Time", "zbee_zcl_se.drlc.report_event.event_status_time",
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_report_event_criticality_level_applied ,
{ "Criticality Level Applied", "zbee_zcl_se.drlc.report_event.criticality_level_applied",
FT_UINT8, BASE_HEX | BASE_RANGE_STRING, RVALS(zbee_zcl_drlc_load_control_event_criticality_level), 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_report_event_cooling_temp_set_point_applied,
{ "Cooling Temperature Set Point Applied", "zbee_zcl_se.drlc.report_event.cooling_temperature_set_point_applied",
FT_INT16, BASE_CUSTOM, CF_FUNC(decode_zcl_drlc_temp_set_point), 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_report_event_heating_temp_set_point_applied,
{ "Heating Temperature Set Point Applied", "zbee_zcl_se.drlc.report_event.heating_temperature_set_point_applied",
FT_INT16, BASE_CUSTOM, CF_FUNC(decode_zcl_drlc_temp_set_point), 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_report_event_average_load_adjustment_percentage ,
{ "Average Load Adjustment Percentage Applied", "zbee_zcl_se.drlc.report_event.average_load_adjustment_percentage_applied",
FT_INT8, BASE_CUSTOM, CF_FUNC(decode_zcl_drlc_average_load_adjustment_percentage), 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_report_event_duty_cycle,
{ "Duty Cycle Applied", "zbee_zcl_se.drlc.report_event.duty_cycle_applied",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_report_event_event_control ,
{ "Event Control", "zbee_zcl_se.drlc.report_event.event_control",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_report_event_signature_type,
{ "Signature Type", "zbee_zcl_se.drlc.report_event.signature_type",
FT_UINT8, BASE_HEX | BASE_RANGE_STRING, RVALS(zbee_zcl_drlc_report_event_signature_type), 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_report_event_signature,
{ "Signature", "zbee_zcl_se.drlc.report_event.signature",
FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_get_scheduled_events_start_time,
{ "Start Time", "zbee_zcl_se.drlc.get_scheduled_events.start_time",
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_get_scheduled_events_number_of_events,
{ "Number of Events", "zbee_zcl_se.drlc.get_scheduled_events.numbers_of_events",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_drlc_get_scheduled_events_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.drlc.get_scheduled_events.issuer_event_id",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
};
/* ZCL DRLC subtrees */
gint *ett[] = {
&ett_zbee_zcl_drlc,
&ett_zbee_zcl_drlc_device_class,
&ett_zbee_zcl_drlc_event_control,
&ett_zbee_zcl_drlc_cancel_control
};
/* Register the ZigBee ZCL DRLC cluster protocol name and description */
proto_zbee_zcl_drlc = proto_register_protocol("ZigBee ZCL DLRC", "ZCL DLRC", ZBEE_PROTOABBREV_ZCL_DRLC);
proto_register_field_array(proto_zbee_zcl_drlc, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
/* Register the ZigBee ZCL DRLC dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_DRLC, dissect_zbee_zcl_drlc, proto_zbee_zcl_drlc);
} /*proto_register_zbee_zcl_drlc*/
/**
*Hands off the ZCL DRLC dissector.
*
*/
void
proto_reg_handoff_zbee_zcl_drlc(void)
{
zbee_zcl_init_cluster( ZBEE_PROTOABBREV_ZCL_DRLC,
proto_zbee_zcl_drlc,
ett_zbee_zcl_drlc,
ZBEE_ZCL_CID_DEMAND_RESPONSE_LOAD_CONTROL,
ZBEE_MFG_CODE_NONE,
-1,
hf_zbee_zcl_drlc_attr_client_id,
hf_zbee_zcl_drlc_srv_rx_cmd_id,
hf_zbee_zcl_drlc_srv_tx_cmd_id,
(zbee_zcl_fn_attr_data)dissect_zcl_drlc_attr_data
);
} /*proto_reg_handoff_zbee_zcl_drlc*/
/* ########################################################################## */
/* #### (0x0702) METERING CLUSTER ########################################## */
/* ########################################################################## */
/* Attributes */
#define zbee_zcl_met_attr_server_names_VALUE_STRING_LIST(XXX) \
/* Reading Information Set */ \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_SUM_DEL, 0x0000, "Current Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_SUM_RECV, 0x0001, "Current Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_MAX_DE_DEL, 0x0002, "Current Max Demand Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_MAX_DE_RECV, 0x0003, "Current Max Demand Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_DFT_SUM, 0x0004, "DFTSummation" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_DAILY_FREEZE_TIME, 0x0005, "Daily Freeze Time" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_POWER_FACTOR, 0x0006, "Power Factor" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_READ_SNAP_TIME, 0x0007, "Reading Snapshot Time" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_MAX_DEMAND_DEL_TIME, 0x0008, "Current Max Demand Delivered Time" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_MAX_DEMAND_RECV_TIME, 0x0009, "Current Max Demand Received Time" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_DEFAULT_UPDATE_PERIOD, 0x000A, "Default Update Period" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_FAST_POLL_UPDATE_PERIOD, 0x000B, "Fast Poll Update Period" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_BLOCK_PER_CON_DEL, 0x000C, "Current Block Period Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_DAILY_CON_TARGET, 0x000D, "Daily Consumption Target" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_BLOCK, 0x000E, "Current Block" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PROFILE_INTERVAL_PERIOD, 0x000F, "Profile Interval Period" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_DEPRECATED, 0x0010, "Deprecated" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PRESET_READING_TIME, 0x0011, "Preset Reading Time" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_VOLUME_PER_REPORT, 0x0012, "Volume Per Report" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_FLOW_RESTRICTION, 0x0013, "Flow Restriction" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_SUPPLY_STATUS, 0x0014, "Supply Status" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_INLET_ENER_CAR_SUM, 0x0015, "Current Inlet Energy Carrier Summation" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_OUTLET_ENER_CAR_SUM, 0x0016, "Current Outlet Energy Carrier Summation" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_INLET_TEMPERATURE, 0x0017, "Inlet Temperature" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_OUTLET_TEMPERATURE, 0x0018, "Outlet Temperature" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CONTROL_TEMPERATURE, 0x0019, "Control Temperature" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_INLET_ENER_CAR_DEM, 0x001A, "Current Inlet Energy Carrier Demand" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_OUTLET_ENER_CAR_DEM, 0x001B, "Current Outlet Energy Carrier Demand" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_BLOCK_CON_DEL, 0x001C, "Previous Block Period Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_BLOCL_CON_RECV, 0x001D, "Current Block Period Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_BLOCK_RECEIVED, 0x001E, "Current Block Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_DFT_SUMMATION_RECEIVED, 0x001F, "DFT Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_ACTIVE_REG_TIER_DEL, 0x0020, "Active Register Tier Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_ACTIVE_REG_TIER_RECV, 0x0021, "Active Register Tier Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_LAST_BLOCK_SWITCH_TIME, 0x0022, "Last Block Switch Time" ) \
/* Summation TOU Information Set */ \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_1_SUM_DEL, 0x0100, "Current Tier 1 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_1_SUM_RECV, 0x0101, "Current Tier 1 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_2_SUM_DEL, 0x0102, "Current Tier 2 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_2_SUM_RECV, 0x0103, "Current Tier 2 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_3_SUM_DEL, 0x0104, "Current Tier 3 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_3_SUM_RECV, 0x0105, "Current Tier 3 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_4_SUM_DEL, 0x0106, "Current Tier 4 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_4_SUM_RECV, 0x0107, "Current Tier 4 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_5_SUM_DEL, 0x0108, "Current Tier 5 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_5_SUM_RECV, 0x0109, "Current Tier 5 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_6_SUM_DEL, 0x010A, "Current Tier 6 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_6_SUM_RECV, 0x010B, "Current Tier 6 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_7_SUM_DEL, 0x010C, "Current Tier 7 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_7_SUM_RECV, 0x010D, "Current Tier 7 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_8_SUM_DEL, 0x010E, "Current Tier 8 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_8_SUM_RECV, 0x010F, "Current Tier 8 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_9_SUM_DEL, 0x0110, "Current Tier 9 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_9_SUM_RECV, 0x0111, "Current Tier 9 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_10_SUM_DEL, 0x0112, "Current Tier 10 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_10_SUM_RECV, 0x0113, "Current Tier 10 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_11_SUM_DEL, 0x0114, "Current Tier 11 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_11_SUM_RECV, 0x0115, "Current Tier 11 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_12_SUM_DEL, 0x0116, "Current Tier 12 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_12_SUM_RECV, 0x0117, "Current Tier 12 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_13_SUM_DEL, 0x0118, "Current Tier 13 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_13_SUM_RECV, 0x0119, "Current Tier 13 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_14_SUM_DEL, 0x011A, "Current Tier 14 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_14_SUM_RECV, 0x011B, "Current Tier 14 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_15_SUM_DEL, 0x011C, "Current Tier 15 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_15_SUM_RECV, 0x011D, "Current Tier 15 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_16_SUM_DEL, 0x011E, "Current Tier 16 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_16_SUM_RECV, 0x011F, "Current Tier 16 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_17_SUM_DEL, 0x0120, "Current Tier 17 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_17_SUM_RECV, 0x0121, "Current Tier 17 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_18_SUM_DEL, 0x0122, "Current Tier 18 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_18_SUM_RECV, 0x0123, "Current Tier 18 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_19_SUM_DEL, 0x0124, "Current Tier 19 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_19_SUM_RECV, 0x0125, "Current Tier 19 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_20_SUM_DEL, 0x0126, "Current Tier 20 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_20_SUM_RECV, 0x0127, "Current Tier 20 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_21_SUM_DEL, 0x0128, "Current Tier 21 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_21_SUM_RECV, 0x0129, "Current Tier 21 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_22_SUM_DEL, 0x012A, "Current Tier 22 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_22_SUM_RECV, 0x012B, "Current Tier 22 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_23_SUM_DEL, 0x012C, "Current Tier 23 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_23_SUM_RECV, 0x012D, "Current Tier 23 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_24_SUM_DEL, 0x012E, "Current Tier 24 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_24_SUM_RECV, 0x012F, "Current Tier 24 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_25_SUM_DEL, 0x0130, "Current Tier 25 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_25_SUM_RECV, 0x0131, "Current Tier 25 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_26_SUM_DEL, 0x0132, "Current Tier 26 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_26_SUM_RECV, 0x0133, "Current Tier 26 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_27_SUM_DEL, 0x0134, "Current Tier 27 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_27_SUM_RECV, 0x0135, "Current Tier 27 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_28_SUM_DEL, 0x0136, "Current Tier 28 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_28_SUM_RECV, 0x0137, "Current Tier 28 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_29_SUM_DEL, 0x0138, "Current Tier 29 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_29_SUM_RECV, 0x0139, "Current Tier 29 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_30_SUM_DEL, 0x013A, "Current Tier 30 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_30_SUM_RECV, 0x013B, "Current Tier 30 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_31_SUM_DEL, 0x013C, "Current Tier 31 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_31_SUM_RECV, 0x013D, "Current Tier 31 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_32_SUM_DEL, 0x013E, "Current Tier 32 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_32_SUM_RECV, 0x013F, "Current Tier 32 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_33_SUM_DEL, 0x0140, "Current Tier 33 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_33_SUM_RECV, 0x0141, "Current Tier 33 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_34_SUM_DEL, 0x0142, "Current Tier 34 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_34_SUM_RECV, 0x0143, "Current Tier 34 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_35_SUM_DEL, 0x0144, "Current Tier 35 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_35_SUM_RECV, 0x0145, "Current Tier 35 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_36_SUM_DEL, 0x0146, "Current Tier 36 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_36_SUM_RECV, 0x0147, "Current Tier 36 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_37_SUM_DEL, 0x0148, "Current Tier 37 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_37_SUM_RECV, 0x0149, "Current Tier 37 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_38_SUM_DEL, 0x014A, "Current Tier 38 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_38_SUM_RECV, 0x014B, "Current Tier 38 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_39_SUM_DEL, 0x014C, "Current Tier 39 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_39_SUM_RECV, 0x014D, "Current Tier 39 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_40_SUM_DEL, 0x014E, "Current Tier 40 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_40_SUM_RECV, 0x014F, "Current Tier 40 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_41_SUM_DEL, 0x0150, "Current Tier 41 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_41_SUM_RECV, 0x0151, "Current Tier 41 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_42_SUM_DEL, 0x0152, "Current Tier 42 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_42_SUM_RECV, 0x0153, "Current Tier 42 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_43_SUM_DEL, 0x0154, "Current Tier 43 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_43_SUM_RECV, 0x0155, "Current Tier 43 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_44_SUM_DEL, 0x0156, "Current Tier 44 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_44_SUM_RECV, 0x0157, "Current Tier 44 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_45_SUM_DEL, 0x0158, "Current Tier 45 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_45_SUM_RECV, 0x0159, "Current Tier 45 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_46_SUM_DEL, 0x015A, "Current Tier 46 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_46_SUM_RECV, 0x015B, "Current Tier 46 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_47_SUM_DEL, 0x015C, "Current Tier 47 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_47_SUM_RECV, 0x015D, "Current Tier 47 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_48_SUM_DEL, 0x015E, "Current Tier 48 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_TIER_48_SUM_RECV, 0x015F, "Current Tier 48 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CPP1_SUMMATION_DELIVERED, 0x01FC, "CPP1 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CPP2_SUMMATION_DELIVERED, 0x01FE, "CPP2 Summation Delivered" ) \
/* Meter Status Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_MET_STATUS, 0x0200, "Status" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_REMAIN_BAT_LIFE, 0x0201, "Remaining Battery Life" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_HOURS_IN_OPERATION, 0x0202, "Hours in Operation" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_HOURS_IN_FAULT, 0x0203, "Hours in Fault" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_EXTENDED_STATUS, 0x0204, "Extended Status" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_REMAIN_BAT_LIFE_DAYS, 0x0205, "Remaining Battery Life in Days" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_METER_ID, 0x0206, "Current Meter ID" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_AMBIENT_CON_IND, 0x0207, "Ambient Consumption Indicator" ) \
/* Formatting */ \
XXX(ZBEE_ZCL_ATTR_ID_MET_UNIT_OF_MEASURE, 0x0300, "Unit of Measure" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_MULTIPLIER, 0x0301, "Multiplier" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_DIVISOR, 0x0302, "Divisor" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_SUMMATION_FORMATTING, 0x0303, "Summation Formatting" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_DEMAND_FORMATTING, 0x0304, "Demand Formatting" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_HISTORICAL_CON_FORMATTING, 0x0305, "Historical Consumption Formatting" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_METERING_DEVICE_TYPE, 0x0306, "Metering Device Type" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_SITE_ID, 0x0307, "Site ID" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_METER_SERIAL_NUMBER, 0x0308, "Meter Serial Number" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_ENERGY_CARRIER_UNIT_OF_MEASURE, 0x0309, "Energy Carrier Unit of Measure" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_ENERGY_CARRIER_SUMMATION_FORMAT, 0x030A, "Energy Carrier Summation Formatting" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_ENERGY_CARRIER_DEMAND_FORMAT, 0x030B, "Energy Carrier Demand Formatting" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_TEMPERATURE_UNIT_OF_MEASURE, 0x030C, "Temperature Unit of Measure" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_TEMPERATURE_FORMATTING, 0x030D, "Temperature Formatting" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_MODULE_SERIAL_NUMBER, 0x030E, "Module Serial Number" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_OPERATING_TARIFF_LABEL_DELIVERED, 0x030F, "Operating Tariff Label Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_OPERATING_TARIFF_LABEL_RECEIVED, 0x0310, "Operating Tariff Label Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUSTOMER_ID_NUMBER, 0x0311, "Customer ID Number" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_ALT_UNIT_OF_MEASURE, 0x0312, "Alternative Unit of Measure" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_ALT_DEMAND_FORMATTING, 0x0313, "Alternative Demand Formatting" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_ALT_CON_FORMATTING, 0x0314, "Alternative Consumption Formatting" ) \
/* Historical Consumption Attribute */ \
XXX(ZBEE_ZCL_ATTR_ID_MET_INSTANT_DEMAND, 0x0400, "Instantaneous Demand" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_DAY_CON_DEL, 0x0401, "Current Day Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_DAY_CON_RECV, 0x0402, "Current Day Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_DAY_CON_DEL, 0x0403, "Previous Day Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_DAY_CON_RECV, 0x0404, "Previous Day Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_PAR_PROF_INT_START_DEL, 0x0405, "Current Partial Profile Interval Start Time Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_PAR_PROF_INT_START_RECV, 0x0406, "Current Partial Profile Interval Start Time Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_PAR_PROF_INT_VALUE_DEL, 0x0407, "Current Partial Profile Interval Value Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_PAR_PROF_INT_VALUE_RECV, 0x0408, "Current Partial Profile Interval Value Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_DAY_MAX_PRESSURE, 0x0409, "Current Day Max Pressure" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_DAY_MIN_PRESSURE, 0x040A, "Current Day Min Pressure" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREVIOUS_DAY_MAX_PRESSURE, 0x040B, "Previous Day Max Pressure" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREVIOUS_DAY_MIN_PRESSURE, 0x040C, "Previous Day Min Pressure" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_DAY_MAX_DEMAND, 0x040D, "Current Day Max Demand" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREVIOUS_DAY_MAX_DEMAND, 0x040E, "Previous Day Max Demand" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_MONTH_MAX_DEMAND, 0x040F, "Current Month Max Demand" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_YEAR_MAX_DEMAND, 0x0410, "Current Year Max Demand" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_DAY_MAX_ENERGY_CARR_DEM, 0x0411, "Current Day Max Energy Carrier Demand" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREVIOUS_DAY_MAX_ENERGY_CARR_DEM, 0x0412, "Previous Day Max Energy Carrier Demand" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_MONTH_MAX_ENERGY_CARR_DEM, 0x0413, "Current Month Max Energy Carrier Demand" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_MONTH_MIN_ENERGY_CARR_DEM, 0x0414, "Current Month Min Energy Carrier Demand" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_YEAR_MAX_ENERGY_CARR_DEM, 0x0415, "Current Year Max Energy Carrier Demand" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_YEAR_MIN_ENERGY_CARR_DEM, 0x0416, "Current Year Min Energy Carrier Demand" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_2_DAY_CON_DEL, 0x0420, "Previous Day 2 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_2_DAY_CON_RECV, 0x0421, "Previous Day 2 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_3_DAY_CON_DEL, 0x0422, "Previous Day 3 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_3_DAY_CON_RECV, 0x0423, "Previous Day 3 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_4_DAY_CON_DEL, 0x0424, "Previous Day 4 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_4_DAY_CON_RECV, 0x0425, "Previous Day 4 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_5_DAY_CON_DEL, 0x0426, "Previous Day 5 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_5_DAY_CON_RECV, 0x0427, "Previous Day 5 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_6_DAY_CON_DEL, 0x0428, "Previous Day 6 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_6_DAY_CON_RECV, 0x0429, "Previous Day 6 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_7_DAY_CON_DEL, 0x042A, "Previous Day 7 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_7_DAY_CON_RECV, 0x042B, "Previous Day 7 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_8_DAY_CON_DEL, 0x042C, "Previous Day 8 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_8_DAY_CON_RECV, 0x042D, "Previous Day 8 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_WEEK_CON_DEL, 0x0430, "Current Week Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_WEEK_CON_RECV, 0x0431, "Current Week Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_CON_DEL, 0x0432, "Previous Week Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_CON_RECV, 0x0433, "Previous Week Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_2_CON_DEL, 0x0434, "Previous Week 2 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_2_CON_RECV, 0x0435, "Previous Week 2 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_3_CON_DEL, 0x0436, "Previous Week 3 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_3_CON_RECV, 0x0437, "Previous Week 3 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_4_CON_DEL, 0x0438, "Previous Week 4 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_4_CON_RECV, 0x0439, "Previous Week 4 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_5_CON_DEL, 0x043A, "Previous Week 5 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_5_CON_RECV, 0x043B, "Previous Week 5 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_MONTH_CON_DEL, 0x0440, "Current Month Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_MONTH_CON_RECV, 0x0441, "Current Month Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_CON_DEL, 0x0442, "Previous Month Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_CON_RECV, 0x0443, "Previous Month Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_2_CON_DEL, 0x0444, "Previous Month 2 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_2_CON_RECV, 0x0445, "Previous Month 2 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_3_CON_DEL, 0x0446, "Previous Month 3 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_3_CON_RECV, 0x0447, "Previous Month 3 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_4_CON_DEL, 0x0448, "Previous Month 4 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_4_CON_RECV, 0x0449, "Previous Month 4 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_5_CON_DEL, 0x044A, "Previous Month 5 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_5_CON_RECV, 0x044B, "Previous Month 5 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_6_CON_DEL, 0x044C, "Previous Month 6 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_6_CON_RECV, 0x044D, "Previous Month 6 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_7_CON_DEL, 0x044E, "Previous Month 7 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_7_CON_RECV, 0x044F, "Previous Month 7 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_8_CON_DEL, 0x0450, "Previous Month 8 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_8_CON_RECV, 0x0451, "Previous Month 8 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_9_CON_DEL, 0x0452, "Previous Month 9 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_9_CON_RECV, 0x0453, "Previous Month 9 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_10_CON_DEL, 0x0454, "Previous Month 10 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_10_CON_RECV, 0x0455, "Previous Month 10 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_11_CON_DEL, 0x0456, "Previous Month 11 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_11_CON_RECV, 0x0457, "Previous Month 11 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_12_CON_DEL, 0x0458, "Previous Month 12 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_12_CON_RECV, 0x0459, "Previous Month 12 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_13_CON_DEL, 0x045A, "Previous Month 13 Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_13_CON_RECV, 0x045B, "Previous Month 13 Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_HISTORICAL_FREEZE_TIME, 0x045C, "Historical Freeze Time" ) \
/* Load Profile Configuration */ \
XXX(ZBEE_ZCL_ATTR_ID_MET_MAX_NUMBER_OF_PERIODS_DELIVERED, 0x0500, "Max Number of Periods Delivered" ) \
/* Supply Limit Attributes */ \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_DEMAND_DELIVERED, 0x0600, "Current Demand Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_DEMAND_LIMIT, 0x0601, "Demand Limit" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_DEMAND_INTEGRATION_PERIOD, 0x0602, "Demand Integration Period" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_NUMBER_OF_DEMAND_SUBINTERVALS, 0x0603, "Number of Demand Subintervals" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_DEMAND_LIMIT_ARM_DURATION, 0x0604, "Demand Limit Arm Duration" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_LOAD_LIMIT_SUPPLY_STATE, 0x0605, "Load Limit Supply State" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_LOAD_LIMIT_COUNTER, 0x0606, "Load Limit Counter" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_SUPPLY_TAMPER_STATE, 0x0607, "Supply Tamper State" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_SUPPLY_DEPLETION_STATE, 0x0608, "Supply Depletion State" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_SUPPLY_UNCONTROLLED_FLOW_STATE, 0x0609, "Supply Uncontrolled Flow State" ) \
/* Block Information Attribute Set (Delivered) */ \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_1_SUM_DEL, 0x0700, "Current No Tier Block 1 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_2_SUM_DEL, 0x0701, "Current No Tier Block 2 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_3_SUM_DEL, 0x0702, "Current No Tier Block 3 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_4_SUM_DEL, 0x0703, "Current No Tier Block 4 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_5_SUM_DEL, 0x0704, "Current No Tier Block 5 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_6_SUM_DEL, 0x0705, "Current No Tier Block 6 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_7_SUM_DEL, 0x0706, "Current No Tier Block 7 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_8_SUM_DEL, 0x0707, "Current No Tier Block 8 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_9_SUM_DEL, 0x0708, "Current No Tier Block 9 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_10_SUM_DEL, 0x0709, "Current No Tier Block 10 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_11_SUM_DEL, 0x070A, "Current No Tier Block 11 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_12_SUM_DEL, 0x070B, "Current No Tier Block 12 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_13_SUM_DEL, 0x070C, "Current No Tier Block 13 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_14_SUM_DEL, 0x070D, "Current No Tier Block 14 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_15_SUM_DEL, 0x070E, "Current No Tier Block 15 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_16_SUM_DEL, 0x070F, "Current No Tier Block 16 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_1_SUM_DEL, 0x0710, "Current Tier 1 Block 1 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_2_SUM_DEL, 0x0711, "Current Tier 1 Block 2 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_3_SUM_DEL, 0x0712, "Current Tier 1 Block 3 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_4_SUM_DEL, 0x0713, "Current Tier 1 Block 4 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_5_SUM_DEL, 0x0714, "Current Tier 1 Block 5 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_6_SUM_DEL, 0x0715, "Current Tier 1 Block 6 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_7_SUM_DEL, 0x0716, "Current Tier 1 Block 7 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_8_SUM_DEL, 0x0717, "Current Tier 1 Block 8 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_9_SUM_DEL, 0x0718, "Current Tier 1 Block 9 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_10_SUM_DEL, 0x0719, "Current Tier 1 Block 10 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_11_SUM_DEL, 0x071A, "Current Tier 1 Block 11 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_12_SUM_DEL, 0x071B, "Current Tier 1 Block 12 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_13_SUM_DEL, 0x071C, "Current Tier 1 Block 13 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_14_SUM_DEL, 0x071D, "Current Tier 1 Block 14 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_15_SUM_DEL, 0x071E, "Current Tier 1 Block 15 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_16_SUM_DEL, 0x071F, "Current Tier 1 Block 16 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_1_SUM_DEL, 0x0720, "Current Tier 2 Block 1 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_2_SUM_DEL, 0x0721, "Current Tier 2 Block 2 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_3_SUM_DEL, 0x0722, "Current Tier 2 Block 3 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_4_SUM_DEL, 0x0723, "Current Tier 2 Block 4 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_5_SUM_DEL, 0x0724, "Current Tier 2 Block 5 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_6_SUM_DEL, 0x0725, "Current Tier 2 Block 6 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_7_SUM_DEL, 0x0726, "Current Tier 2 Block 7 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_8_SUM_DEL, 0x0727, "Current Tier 2 Block 8 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_9_SUM_DEL, 0x0728, "Current Tier 2 Block 9 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_10_SUM_DEL, 0x0729, "Current Tier 2 Block 10 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_11_SUM_DEL, 0x072A, "Current Tier 2 Block 11 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_12_SUM_DEL, 0x072B, "Current Tier 2 Block 12 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_13_SUM_DEL, 0x072C, "Current Tier 2 Block 13 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_14_SUM_DEL, 0x072D, "Current Tier 2 Block 14 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_15_SUM_DEL, 0x072E, "Current Tier 2 Block 15 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_16_SUM_DEL, 0x072F, "Current Tier 2 Block 16 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_1_SUM_DEL, 0x0730, "Current Tier 3 Block 1 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_2_SUM_DEL, 0x0731, "Current Tier 3 Block 2 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_3_SUM_DEL, 0x0732, "Current Tier 3 Block 3 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_4_SUM_DEL, 0x0733, "Current Tier 3 Block 4 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_5_SUM_DEL, 0x0734, "Current Tier 3 Block 5 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_6_SUM_DEL, 0x0735, "Current Tier 3 Block 6 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_7_SUM_DEL, 0x0736, "Current Tier 3 Block 7 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_8_SUM_DEL, 0x0737, "Current Tier 3 Block 8 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_9_SUM_DEL, 0x0738, "Current Tier 3 Block 9 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_10_SUM_DEL, 0x0739, "Current Tier 3 Block 10 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_11_SUM_DEL, 0x073A, "Current Tier 3 Block 11 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_12_SUM_DEL, 0x073B, "Current Tier 3 Block 12 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_13_SUM_DEL, 0x073C, "Current Tier 3 Block 13 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_14_SUM_DEL, 0x073D, "Current Tier 3 Block 14 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_15_SUM_DEL, 0x073E, "Current Tier 3 Block 15 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_16_SUM_DEL, 0x073F, "Current Tier 3 Block 16 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_1_SUM_DEL, 0x0740, "Current Tier 4 Block 1 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_2_SUM_DEL, 0x0741, "Current Tier 4 Block 2 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_3_SUM_DEL, 0x0742, "Current Tier 4 Block 3 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_4_SUM_DEL, 0x0743, "Current Tier 4 Block 4 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_5_SUM_DEL, 0x0744, "Current Tier 4 Block 5 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_6_SUM_DEL, 0x0745, "Current Tier 4 Block 6 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_7_SUM_DEL, 0x0746, "Current Tier 4 Block 7 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_8_SUM_DEL, 0x0747, "Current Tier 4 Block 8 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_9_SUM_DEL, 0x0748, "Current Tier 4 Block 9 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_10_SUM_DEL, 0x0749, "Current Tier 4 Block 10 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_11_SUM_DEL, 0x074A, "Current Tier 4 Block 11 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_12_SUM_DEL, 0x074B, "Current Tier 4 Block 12 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_13_SUM_DEL, 0x074C, "Current Tier 4 Block 13 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_14_SUM_DEL, 0x074D, "Current Tier 4 Block 14 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_15_SUM_DEL, 0x074E, "Current Tier 4 Block 15 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_16_SUM_DEL, 0x074F, "Current Tier 4 Block 16 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_1_SUM_DEL, 0x0750, "Current Tier 5 Block 1 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_2_SUM_DEL, 0x0751, "Current Tier 5 Block 2 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_3_SUM_DEL, 0x0752, "Current Tier 5 Block 3 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_4_SUM_DEL, 0x0753, "Current Tier 5 Block 4 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_5_SUM_DEL, 0x0754, "Current Tier 5 Block 5 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_6_SUM_DEL, 0x0755, "Current Tier 5 Block 6 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_7_SUM_DEL, 0x0756, "Current Tier 5 Block 7 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_8_SUM_DEL, 0x0757, "Current Tier 5 Block 8 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_9_SUM_DEL, 0x0758, "Current Tier 5 Block 9 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_10_SUM_DEL, 0x0759, "Current Tier 5 Block 10 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_11_SUM_DEL, 0x075A, "Current Tier 5 Block 11 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_12_SUM_DEL, 0x075B, "Current Tier 5 Block 12 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_13_SUM_DEL, 0x075C, "Current Tier 5 Block 13 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_14_SUM_DEL, 0x075D, "Current Tier 5 Block 14 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_15_SUM_DEL, 0x075E, "Current Tier 5 Block 15 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_16_SUM_DEL, 0x075F, "Current Tier 5 Block 16 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_1_SUM_DEL, 0x0760, "Current Tier 6 Block 1 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_2_SUM_DEL, 0x0761, "Current Tier 6 Block 2 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_3_SUM_DEL, 0x0762, "Current Tier 6 Block 3 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_4_SUM_DEL, 0x0763, "Current Tier 6 Block 4 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_5_SUM_DEL, 0x0764, "Current Tier 6 Block 5 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_6_SUM_DEL, 0x0765, "Current Tier 6 Block 6 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_7_SUM_DEL, 0x0766, "Current Tier 6 Block 7 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_8_SUM_DEL, 0x0767, "Current Tier 6 Block 8 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_9_SUM_DEL, 0x0768, "Current Tier 6 Block 9 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_10_SUM_DEL, 0x0769, "Current Tier 6 Block 10 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_11_SUM_DEL, 0x076A, "Current Tier 6 Block 11 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_12_SUM_DEL, 0x076B, "Current Tier 6 Block 12 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_13_SUM_DEL, 0x076C, "Current Tier 6 Block 13 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_14_SUM_DEL, 0x076D, "Current Tier 6 Block 14 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_15_SUM_DEL, 0x076E, "Current Tier 6 Block 15 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_16_SUM_DEL, 0x076F, "Current Tier 6 Block 16 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_1_SUM_DEL, 0x0770, "Current Tier 7 Block 1 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_2_SUM_DEL, 0x0771, "Current Tier 7 Block 2 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_3_SUM_DEL, 0x0772, "Current Tier 7 Block 3 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_4_SUM_DEL, 0x0773, "Current Tier 7 Block 4 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_5_SUM_DEL, 0x0774, "Current Tier 7 Block 5 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_6_SUM_DEL, 0x0775, "Current Tier 7 Block 6 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_7_SUM_DEL, 0x0776, "Current Tier 7 Block 7 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_8_SUM_DEL, 0x0777, "Current Tier 7 Block 8 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_9_SUM_DEL, 0x0778, "Current Tier 7 Block 9 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_10_SUM_DEL, 0x0779, "Current Tier 7 Block 10 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_11_SUM_DEL, 0x077A, "Current Tier 7 Block 11 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_12_SUM_DEL, 0x077B, "Current Tier 7 Block 12 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_13_SUM_DEL, 0x077C, "Current Tier 7 Block 13 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_14_SUM_DEL, 0x077D, "Current Tier 7 Block 14 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_15_SUM_DEL, 0x077E, "Current Tier 7 Block 15 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_16_SUM_DEL, 0x077F, "Current Tier 7 Block 16 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_1_SUM_DEL, 0x0780, "Current Tier 8 Block 1 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_2_SUM_DEL, 0x0781, "Current Tier 8 Block 2 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_3_SUM_DEL, 0x0782, "Current Tier 8 Block 3 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_4_SUM_DEL, 0x0783, "Current Tier 8 Block 4 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_5_SUM_DEL, 0x0784, "Current Tier 8 Block 5 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_6_SUM_DEL, 0x0785, "Current Tier 8 Block 6 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_7_SUM_DEL, 0x0786, "Current Tier 8 Block 7 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_8_SUM_DEL, 0x0787, "Current Tier 8 Block 8 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_9_SUM_DEL, 0x0788, "Current Tier 8 Block 9 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_10_SUM_DEL, 0x0789, "Current Tier 8 Block 10 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_11_SUM_DEL, 0x078A, "Current Tier 8 Block 11 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_12_SUM_DEL, 0x078B, "Current Tier 8 Block 12 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_13_SUM_DEL, 0x078C, "Current Tier 8 Block 13 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_14_SUM_DEL, 0x078D, "Current Tier 8 Block 14 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_15_SUM_DEL, 0x078E, "Current Tier 8 Block 15 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_16_SUM_DEL, 0x078F, "Current Tier 8 Block 16 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_1_SUM_DEL, 0x0790, "Current Tier 9 Block 1 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_2_SUM_DEL, 0x0791, "Current Tier 9 Block 2 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_3_SUM_DEL, 0x0792, "Current Tier 9 Block 3 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_4_SUM_DEL, 0x0793, "Current Tier 9 Block 4 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_5_SUM_DEL, 0x0794, "Current Tier 9 Block 5 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_6_SUM_DEL, 0x0795, "Current Tier 9 Block 6 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_7_SUM_DEL, 0x0796, "Current Tier 9 Block 7 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_8_SUM_DEL, 0x0797, "Current Tier 9 Block 8 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_9_SUM_DEL, 0x0798, "Current Tier 9 Block 9 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_10_SUM_DEL, 0x0799, "Current Tier 9 Block 10 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_11_SUM_DEL, 0x079A, "Current Tier 9 Block 11 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_12_SUM_DEL, 0x079B, "Current Tier 9 Block 12 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_13_SUM_DEL, 0x079C, "Current Tier 9 Block 13 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_14_SUM_DEL, 0x079D, "Current Tier 9 Block 14 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_15_SUM_DEL, 0x079E, "Current Tier 9 Block 15 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_16_SUM_DEL, 0x079F, "Current Tier 9 Block 16 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_1_SUM_DEL, 0x07A0, "Current Tier 10 Block 1 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_2_SUM_DEL, 0x07A1, "Current Tier 10 Block 2 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_3_SUM_DEL, 0x07A2, "Current Tier 10 Block 3 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_4_SUM_DEL, 0x07A3, "Current Tier 10 Block 4 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_5_SUM_DEL, 0x07A4, "Current Tier 10 Block 5 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_6_SUM_DEL, 0x07A5, "Current Tier 10 Block 6 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_7_SUM_DEL, 0x07A6, "Current Tier 10 Block 7 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_8_SUM_DEL, 0x07A7, "Current Tier 10 Block 8 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_9_SUM_DEL, 0x07A8, "Current Tier 10 Block 9 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_10_SUM_DEL, 0x07A9, "Current Tier 10 Block 10 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_11_SUM_DEL, 0x07AA, "Current Tier 10 Block 11 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_12_SUM_DEL, 0x07AB, "Current Tier 10 Block 12 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_13_SUM_DEL, 0x07AC, "Current Tier 10 Block 13 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_14_SUM_DEL, 0x07AD, "Current Tier 10 Block 14 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_15_SUM_DEL, 0x07AE, "Current Tier 10 Block 15 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_16_SUM_DEL, 0x07AF, "Current Tier 10 Block 16 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_1_SUM_DEL, 0x07B0, "Current Tier 11 Block 1 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_2_SUM_DEL, 0x07B1, "Current Tier 11 Block 2 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_3_SUM_DEL, 0x07B2, "Current Tier 11 Block 3 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_4_SUM_DEL, 0x07B3, "Current Tier 11 Block 4 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_5_SUM_DEL, 0x07B4, "Current Tier 11 Block 5 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_6_SUM_DEL, 0x07B5, "Current Tier 11 Block 6 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_7_SUM_DEL, 0x07B6, "Current Tier 11 Block 7 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_8_SUM_DEL, 0x07B7, "Current Tier 11 Block 8 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_9_SUM_DEL, 0x07B8, "Current Tier 11 Block 9 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_10_SUM_DEL, 0x07B9, "Current Tier 11 Block 10 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_11_SUM_DEL, 0x07BA, "Current Tier 11 Block 11 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_12_SUM_DEL, 0x07BB, "Current Tier 11 Block 12 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_13_SUM_DEL, 0x07BC, "Current Tier 11 Block 13 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_14_SUM_DEL, 0x07BD, "Current Tier 11 Block 14 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_15_SUM_DEL, 0x07BE, "Current Tier 11 Block 15 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_16_SUM_DEL, 0x07BF, "Current Tier 11 Block 16 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_1_SUM_DEL, 0x07C0, "Current Tier 12 Block 1 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_2_SUM_DEL, 0x07C1, "Current Tier 12 Block 2 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_3_SUM_DEL, 0x07C2, "Current Tier 12 Block 3 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_4_SUM_DEL, 0x07C3, "Current Tier 12 Block 4 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_5_SUM_DEL, 0x07C4, "Current Tier 12 Block 5 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_6_SUM_DEL, 0x07C5, "Current Tier 12 Block 6 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_7_SUM_DEL, 0x07C6, "Current Tier 12 Block 7 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_8_SUM_DEL, 0x07C7, "Current Tier 12 Block 8 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_9_SUM_DEL, 0x07C8, "Current Tier 12 Block 9 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_10_SUM_DEL, 0x07C9, "Current Tier 12 Block 10 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_11_SUM_DEL, 0x07CA, "Current Tier 12 Block 11 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_12_SUM_DEL, 0x07CB, "Current Tier 12 Block 12 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_13_SUM_DEL, 0x07CC, "Current Tier 12 Block 13 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_14_SUM_DEL, 0x07CD, "Current Tier 12 Block 14 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_15_SUM_DEL, 0x07CE, "Current Tier 12 Block 15 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_16_SUM_DEL, 0x07CF, "Current Tier 12 Block 16 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_1_SUM_DEL, 0x07D0, "Current Tier 13 Block 1 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_2_SUM_DEL, 0x07D1, "Current Tier 13 Block 2 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_3_SUM_DEL, 0x07D2, "Current Tier 13 Block 3 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_4_SUM_DEL, 0x07D3, "Current Tier 13 Block 4 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_5_SUM_DEL, 0x07D4, "Current Tier 13 Block 5 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_6_SUM_DEL, 0x07D5, "Current Tier 13 Block 6 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_7_SUM_DEL, 0x07D6, "Current Tier 13 Block 7 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_8_SUM_DEL, 0x07D7, "Current Tier 13 Block 8 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_9_SUM_DEL, 0x07D8, "Current Tier 13 Block 9 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_10_SUM_DEL, 0x07D9, "Current Tier 13 Block 10 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_11_SUM_DEL, 0x07DA, "Current Tier 13 Block 11 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_12_SUM_DEL, 0x07DB, "Current Tier 13 Block 12 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_13_SUM_DEL, 0x07DC, "Current Tier 13 Block 13 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_14_SUM_DEL, 0x07DD, "Current Tier 13 Block 14 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_15_SUM_DEL, 0x07DE, "Current Tier 13 Block 15 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_16_SUM_DEL, 0x07DF, "Current Tier 13 Block 16 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_1_SUM_DEL, 0x07E0, "Current Tier 14 Block 1 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_2_SUM_DEL, 0x07E1, "Current Tier 14 Block 2 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_3_SUM_DEL, 0x07E2, "Current Tier 14 Block 3 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_4_SUM_DEL, 0x07E3, "Current Tier 14 Block 4 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_5_SUM_DEL, 0x07E4, "Current Tier 14 Block 5 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_6_SUM_DEL, 0x07E5, "Current Tier 14 Block 6 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_7_SUM_DEL, 0x07E6, "Current Tier 14 Block 7 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_8_SUM_DEL, 0x07E7, "Current Tier 14 Block 8 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_9_SUM_DEL, 0x07E8, "Current Tier 14 Block 9 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_10_SUM_DEL, 0x07E9, "Current Tier 14 Block 10 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_11_SUM_DEL, 0x07EA, "Current Tier 14 Block 11 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_12_SUM_DEL, 0x07EB, "Current Tier 14 Block 12 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_13_SUM_DEL, 0x07EC, "Current Tier 14 Block 13 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_14_SUM_DEL, 0x07ED, "Current Tier 14 Block 14 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_15_SUM_DEL, 0x07EE, "Current Tier 14 Block 15 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_16_SUM_DEL, 0x07EF, "Current Tier 14 Block 16 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_1_SUM_DEL, 0x07F0, "Current Tier 15 Block 1 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_2_SUM_DEL, 0x07F1, "Current Tier 15 Block 2 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_3_SUM_DEL, 0x07F2, "Current Tier 15 Block 3 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_4_SUM_DEL, 0x07F3, "Current Tier 15 Block 4 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_5_SUM_DEL, 0x07F4, "Current Tier 15 Block 5 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_6_SUM_DEL, 0x07F5, "Current Tier 15 Block 6 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_7_SUM_DEL, 0x07F6, "Current Tier 15 Block 7 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_8_SUM_DEL, 0x07F7, "Current Tier 15 Block 8 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_9_SUM_DEL, 0x07F8, "Current Tier 15 Block 9 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_10_SUM_DEL, 0x07F9, "Current Tier 15 Block 10 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_11_SUM_DEL, 0x07FA, "Current Tier 15 Block 11 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_12_SUM_DEL, 0x07FB, "Current Tier 15 Block 12 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_13_SUM_DEL, 0x07FC, "Current Tier 15 Block 13 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_14_SUM_DEL, 0x07FD, "Current Tier 15 Block 14 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_15_SUM_DEL, 0x07FE, "Current Tier 15 Block 15 Summation Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_16_SUM_DEL, 0x07FF, "Current Tier 15 Block 16 Summation Delivered" ) \
/* Alarms Set */ \
XXX(ZBEE_ZCL_ATTR_ID_MET_GENERIC_ALARM_MASK, 0x0800, "Generic Alarm Mask" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_ELECTRICITY_ALARM_MASK, 0x0801, "Electricity Alarm Mask" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_GENERIC_FLOW_PRESS_ALARM_MASK, 0x0802, "Generic Flow/Pressure Alarm Mask" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_WATER_SPECIFIC_ALARM_MASK, 0x0803, "Water Specific Alarm Mask" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_HEAT_COOLING_SPECIFIC_ALARM_MASK, 0x0804, "Heat and Cooling Specific Alarm Mask" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_GAS_SPECIFIC_ALARM_MASK, 0x0805, "Gas Specific Alarm Mask" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_EXTENDED_GENERIC_ALARM_MASK, 0x0806, "Extended Generic Alarm Mask" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_MANUFACTURER_ALARM_MASK, 0x0807, "Manufacturer Alarm Mask" ) \
/* Block Information Attribute Set (Received) */ \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_1_SUM_RECV, 0x0900, "Current No Tier Block 1 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_2_SUM_RECV, 0x0901, "Current No Tier Block 2 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_3_SUM_RECV, 0x0902, "Current No Tier Block 3 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_4_SUM_RECV, 0x0903, "Current No Tier Block 4 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_5_SUM_RECV, 0x0904, "Current No Tier Block 5 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_6_SUM_RECV, 0x0905, "Current No Tier Block 6 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_7_SUM_RECV, 0x0906, "Current No Tier Block 7 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_8_SUM_RECV, 0x0907, "Current No Tier Block 8 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_9_SUM_RECV, 0x0908, "Current No Tier Block 9 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_10_SUM_RECV, 0x0909, "Current No Tier Block 10 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_11_SUM_RECV, 0x090A, "Current No Tier Block 11 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_12_SUM_RECV, 0x090B, "Current No Tier Block 12 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_13_SUM_RECV, 0x090C, "Current No Tier Block 13 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_14_SUM_RECV, 0x090D, "Current No Tier Block 14 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_15_SUM_RECV, 0x090E, "Current No Tier Block 15 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_NO_TIER_BLOCK_16_SUM_RECV, 0x090F, "Current No Tier Block 16 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_1_SUM_RECV, 0x0910, "Current Tier 1 Block 1 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_2_SUM_RECV, 0x0911, "Current Tier 1 Block 2 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_3_SUM_RECV, 0x0912, "Current Tier 1 Block 3 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_4_SUM_RECV, 0x0913, "Current Tier 1 Block 4 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_5_SUM_RECV, 0x0914, "Current Tier 1 Block 5 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_6_SUM_RECV, 0x0915, "Current Tier 1 Block 6 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_7_SUM_RECV, 0x0916, "Current Tier 1 Block 7 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_8_SUM_RECV, 0x0917, "Current Tier 1 Block 8 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_9_SUM_RECV, 0x0918, "Current Tier 1 Block 9 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_10_SUM_RECV, 0x0919, "Current Tier 1 Block 10 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_11_SUM_RECV, 0x091A, "Current Tier 1 Block 11 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_12_SUM_RECV, 0x091B, "Current Tier 1 Block 12 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_13_SUM_RECV, 0x091C, "Current Tier 1 Block 13 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_14_SUM_RECV, 0x091D, "Current Tier 1 Block 14 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_15_SUM_RECV, 0x091E, "Current Tier 1 Block 15 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_1_BLOCK_16_SUM_RECV, 0x091F, "Current Tier 1 Block 16 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_1_SUM_RECV, 0x0920, "Current Tier 2 Block 1 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_2_SUM_RECV, 0x0921, "Current Tier 2 Block 2 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_3_SUM_RECV, 0x0922, "Current Tier 2 Block 3 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_4_SUM_RECV, 0x0923, "Current Tier 2 Block 4 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_5_SUM_RECV, 0x0924, "Current Tier 2 Block 5 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_6_SUM_RECV, 0x0925, "Current Tier 2 Block 6 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_7_SUM_RECV, 0x0926, "Current Tier 2 Block 7 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_8_SUM_RECV, 0x0927, "Current Tier 2 Block 8 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_9_SUM_RECV, 0x0928, "Current Tier 2 Block 9 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_10_SUM_RECV, 0x0929, "Current Tier 2 Block 10 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_11_SUM_RECV, 0x092A, "Current Tier 2 Block 11 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_12_SUM_RECV, 0x092B, "Current Tier 2 Block 12 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_13_SUM_RECV, 0x092C, "Current Tier 2 Block 13 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_14_SUM_RECV, 0x092D, "Current Tier 2 Block 14 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_15_SUM_RECV, 0x092E, "Current Tier 2 Block 15 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_2_BLOCK_16_SUM_RECV, 0x092F, "Current Tier 2 Block 16 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_1_SUM_RECV, 0x0930, "Current Tier 3 Block 1 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_2_SUM_RECV, 0x0931, "Current Tier 3 Block 2 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_3_SUM_RECV, 0x0932, "Current Tier 3 Block 3 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_4_SUM_RECV, 0x0933, "Current Tier 3 Block 4 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_5_SUM_RECV, 0x0934, "Current Tier 3 Block 5 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_6_SUM_RECV, 0x0935, "Current Tier 3 Block 6 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_7_SUM_RECV, 0x0936, "Current Tier 3 Block 7 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_8_SUM_RECV, 0x0937, "Current Tier 3 Block 8 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_9_SUM_RECV, 0x0938, "Current Tier 3 Block 9 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_10_SUM_RECV, 0x0939, "Current Tier 3 Block 10 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_11_SUM_RECV, 0x093A, "Current Tier 3 Block 11 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_12_SUM_RECV, 0x093B, "Current Tier 3 Block 12 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_13_SUM_RECV, 0x093C, "Current Tier 3 Block 13 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_14_SUM_RECV, 0x093D, "Current Tier 3 Block 14 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_15_SUM_RECV, 0x093E, "Current Tier 3 Block 15 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_3_BLOCK_16_SUM_RECV, 0x093F, "Current Tier 3 Block 16 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_1_SUM_RECV, 0x0940, "Current Tier 4 Block 1 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_2_SUM_RECV, 0x0941, "Current Tier 4 Block 2 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_3_SUM_RECV, 0x0942, "Current Tier 4 Block 3 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_4_SUM_RECV, 0x0943, "Current Tier 4 Block 4 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_5_SUM_RECV, 0x0944, "Current Tier 4 Block 5 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_6_SUM_RECV, 0x0945, "Current Tier 4 Block 6 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_7_SUM_RECV, 0x0946, "Current Tier 4 Block 7 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_8_SUM_RECV, 0x0947, "Current Tier 4 Block 8 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_9_SUM_RECV, 0x0948, "Current Tier 4 Block 9 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_10_SUM_RECV, 0x0949, "Current Tier 4 Block 10 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_11_SUM_RECV, 0x094A, "Current Tier 4 Block 11 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_12_SUM_RECV, 0x094B, "Current Tier 4 Block 12 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_13_SUM_RECV, 0x094C, "Current Tier 4 Block 13 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_14_SUM_RECV, 0x094D, "Current Tier 4 Block 14 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_15_SUM_RECV, 0x094E, "Current Tier 4 Block 15 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_4_BLOCK_16_SUM_RECV, 0x094F, "Current Tier 4 Block 16 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_1_SUM_RECV, 0x0950, "Current Tier 5 Block 1 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_2_SUM_RECV, 0x0951, "Current Tier 5 Block 2 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_3_SUM_RECV, 0x0952, "Current Tier 5 Block 3 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_4_SUM_RECV, 0x0953, "Current Tier 5 Block 4 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_5_SUM_RECV, 0x0954, "Current Tier 5 Block 5 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_6_SUM_RECV, 0x0955, "Current Tier 5 Block 6 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_7_SUM_RECV, 0x0956, "Current Tier 5 Block 7 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_8_SUM_RECV, 0x0957, "Current Tier 5 Block 8 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_9_SUM_RECV, 0x0958, "Current Tier 5 Block 9 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_10_SUM_RECV, 0x0959, "Current Tier 5 Block 10 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_11_SUM_RECV, 0x095A, "Current Tier 5 Block 11 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_12_SUM_RECV, 0x095B, "Current Tier 5 Block 12 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_13_SUM_RECV, 0x095C, "Current Tier 5 Block 13 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_14_SUM_RECV, 0x095D, "Current Tier 5 Block 14 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_15_SUM_RECV, 0x095E, "Current Tier 5 Block 15 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_5_BLOCK_16_SUM_RECV, 0x095F, "Current Tier 5 Block 16 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_1_SUM_RECV, 0x0960, "Current Tier 6 Block 1 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_2_SUM_RECV, 0x0961, "Current Tier 6 Block 2 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_3_SUM_RECV, 0x0962, "Current Tier 6 Block 3 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_4_SUM_RECV, 0x0963, "Current Tier 6 Block 4 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_5_SUM_RECV, 0x0964, "Current Tier 6 Block 5 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_6_SUM_RECV, 0x0965, "Current Tier 6 Block 6 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_7_SUM_RECV, 0x0966, "Current Tier 6 Block 7 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_8_SUM_RECV, 0x0967, "Current Tier 6 Block 8 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_9_SUM_RECV, 0x0968, "Current Tier 6 Block 9 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_10_SUM_RECV, 0x0969, "Current Tier 6 Block 10 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_11_SUM_RECV, 0x096A, "Current Tier 6 Block 11 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_12_SUM_RECV, 0x096B, "Current Tier 6 Block 12 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_13_SUM_RECV, 0x096C, "Current Tier 6 Block 13 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_14_SUM_RECV, 0x096D, "Current Tier 6 Block 14 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_15_SUM_RECV, 0x096E, "Current Tier 6 Block 15 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_6_BLOCK_16_SUM_RECV, 0x096F, "Current Tier 6 Block 16 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_1_SUM_RECV, 0x0970, "Current Tier 7 Block 1 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_2_SUM_RECV, 0x0971, "Current Tier 7 Block 2 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_3_SUM_RECV, 0x0972, "Current Tier 7 Block 3 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_4_SUM_RECV, 0x0973, "Current Tier 7 Block 4 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_5_SUM_RECV, 0x0974, "Current Tier 7 Block 5 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_6_SUM_RECV, 0x0975, "Current Tier 7 Block 6 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_7_SUM_RECV, 0x0976, "Current Tier 7 Block 7 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_8_SUM_RECV, 0x0977, "Current Tier 7 Block 8 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_9_SUM_RECV, 0x0978, "Current Tier 7 Block 9 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_10_SUM_RECV, 0x0979, "Current Tier 7 Block 10 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_11_SUM_RECV, 0x097A, "Current Tier 7 Block 11 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_12_SUM_RECV, 0x097B, "Current Tier 7 Block 12 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_13_SUM_RECV, 0x097C, "Current Tier 7 Block 13 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_14_SUM_RECV, 0x097D, "Current Tier 7 Block 14 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_15_SUM_RECV, 0x097E, "Current Tier 7 Block 15 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_7_BLOCK_16_SUM_RECV, 0x097F, "Current Tier 7 Block 16 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_1_SUM_RECV, 0x0980, "Current Tier 8 Block 1 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_2_SUM_RECV, 0x0981, "Current Tier 8 Block 2 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_3_SUM_RECV, 0x0982, "Current Tier 8 Block 3 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_4_SUM_RECV, 0x0983, "Current Tier 8 Block 4 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_5_SUM_RECV, 0x0984, "Current Tier 8 Block 5 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_6_SUM_RECV, 0x0985, "Current Tier 8 Block 6 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_7_SUM_RECV, 0x0986, "Current Tier 8 Block 7 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_8_SUM_RECV, 0x0987, "Current Tier 8 Block 8 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_9_SUM_RECV, 0x0988, "Current Tier 8 Block 9 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_10_SUM_RECV, 0x0989, "Current Tier 8 Block 10 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_11_SUM_RECV, 0x098A, "Current Tier 8 Block 11 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_12_SUM_RECV, 0x098B, "Current Tier 8 Block 12 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_13_SUM_RECV, 0x098C, "Current Tier 8 Block 13 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_14_SUM_RECV, 0x098D, "Current Tier 8 Block 14 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_15_SUM_RECV, 0x098E, "Current Tier 8 Block 15 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_8_BLOCK_16_SUM_RECV, 0x098F, "Current Tier 8 Block 16 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_1_SUM_RECV, 0x0990, "Current Tier 9 Block 1 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_2_SUM_RECV, 0x0991, "Current Tier 9 Block 2 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_3_SUM_RECV, 0x0992, "Current Tier 9 Block 3 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_4_SUM_RECV, 0x0993, "Current Tier 9 Block 4 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_5_SUM_RECV, 0x0994, "Current Tier 9 Block 5 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_6_SUM_RECV, 0x0995, "Current Tier 9 Block 6 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_7_SUM_RECV, 0x0996, "Current Tier 9 Block 7 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_8_SUM_RECV, 0x0997, "Current Tier 9 Block 8 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_9_SUM_RECV, 0x0998, "Current Tier 9 Block 9 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_10_SUM_RECV, 0x0999, "Current Tier 9 Block 10 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_11_SUM_RECV, 0x099A, "Current Tier 9 Block 11 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_12_SUM_RECV, 0x099B, "Current Tier 9 Block 12 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_13_SUM_RECV, 0x099C, "Current Tier 9 Block 13 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_14_SUM_RECV, 0x099D, "Current Tier 9 Block 14 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_15_SUM_RECV, 0x099E, "Current Tier 9 Block 15 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_9_BLOCK_16_SUM_RECV, 0x099F, "Current Tier 9 Block 16 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_1_SUM_RECV, 0x09A0, "Current Tier 10 Block 1 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_2_SUM_RECV, 0x09A1, "Current Tier 10 Block 2 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_3_SUM_RECV, 0x09A2, "Current Tier 10 Block 3 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_4_SUM_RECV, 0x09A3, "Current Tier 10 Block 4 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_5_SUM_RECV, 0x09A4, "Current Tier 10 Block 5 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_6_SUM_RECV, 0x09A5, "Current Tier 10 Block 6 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_7_SUM_RECV, 0x09A6, "Current Tier 10 Block 7 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_8_SUM_RECV, 0x09A7, "Current Tier 10 Block 8 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_9_SUM_RECV, 0x09A8, "Current Tier 10 Block 9 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_10_SUM_RECV, 0x09A9, "Current Tier 10 Block 10 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_11_SUM_RECV, 0x09AA, "Current Tier 10 Block 11 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_12_SUM_RECV, 0x09AB, "Current Tier 10 Block 12 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_13_SUM_RECV, 0x09AC, "Current Tier 10 Block 13 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_14_SUM_RECV, 0x09AD, "Current Tier 10 Block 14 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_15_SUM_RECV, 0x09AE, "Current Tier 10 Block 15 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_10_BLOCK_16_SUM_RECV, 0x09AF, "Current Tier 10 Block 16 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_1_SUM_RECV, 0x09B0, "Current Tier 11 Block 1 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_2_SUM_RECV, 0x09B1, "Current Tier 11 Block 2 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_3_SUM_RECV, 0x09B2, "Current Tier 11 Block 3 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_4_SUM_RECV, 0x09B3, "Current Tier 11 Block 4 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_5_SUM_RECV, 0x09B4, "Current Tier 11 Block 5 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_6_SUM_RECV, 0x09B5, "Current Tier 11 Block 6 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_7_SUM_RECV, 0x09B6, "Current Tier 11 Block 7 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_8_SUM_RECV, 0x09B7, "Current Tier 11 Block 8 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_9_SUM_RECV, 0x09B8, "Current Tier 11 Block 9 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_10_SUM_RECV, 0x09B9, "Current Tier 11 Block 10 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_11_SUM_RECV, 0x09BA, "Current Tier 11 Block 11 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_12_SUM_RECV, 0x09BB, "Current Tier 11 Block 12 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_13_SUM_RECV, 0x09BC, "Current Tier 11 Block 13 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_14_SUM_RECV, 0x09BD, "Current Tier 11 Block 14 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_15_SUM_RECV, 0x09BE, "Current Tier 11 Block 15 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_11_BLOCK_16_SUM_RECV, 0x09BF, "Current Tier 11 Block 16 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_1_SUM_RECV, 0x09C0, "Current Tier 12 Block 1 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_2_SUM_RECV, 0x09C1, "Current Tier 12 Block 2 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_3_SUM_RECV, 0x09C2, "Current Tier 12 Block 3 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_4_SUM_RECV, 0x09C3, "Current Tier 12 Block 4 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_5_SUM_RECV, 0x09C4, "Current Tier 12 Block 5 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_6_SUM_RECV, 0x09C5, "Current Tier 12 Block 6 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_7_SUM_RECV, 0x09C6, "Current Tier 12 Block 7 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_8_SUM_RECV, 0x09C7, "Current Tier 12 Block 8 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_9_SUM_RECV, 0x09C8, "Current Tier 12 Block 9 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_10_SUM_RECV, 0x09C9, "Current Tier 12 Block 10 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_11_SUM_RECV, 0x09CA, "Current Tier 12 Block 11 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_12_SUM_RECV, 0x09CB, "Current Tier 12 Block 12 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_13_SUM_RECV, 0x09CC, "Current Tier 12 Block 13 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_14_SUM_RECV, 0x09CD, "Current Tier 12 Block 14 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_15_SUM_RECV, 0x09CE, "Current Tier 12 Block 15 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_12_BLOCK_16_SUM_RECV, 0x09CF, "Current Tier 12 Block 16 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_1_SUM_RECV, 0x09D0, "Current Tier 13 Block 1 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_2_SUM_RECV, 0x09D1, "Current Tier 13 Block 2 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_3_SUM_RECV, 0x09D2, "Current Tier 13 Block 3 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_4_SUM_RECV, 0x09D3, "Current Tier 13 Block 4 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_5_SUM_RECV, 0x09D4, "Current Tier 13 Block 5 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_6_SUM_RECV, 0x09D5, "Current Tier 13 Block 6 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_7_SUM_RECV, 0x09D6, "Current Tier 13 Block 7 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_8_SUM_RECV, 0x09D7, "Current Tier 13 Block 8 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_9_SUM_RECV, 0x09D8, "Current Tier 13 Block 9 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_10_SUM_RECV, 0x09D9, "Current Tier 13 Block 10 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_11_SUM_RECV, 0x09DA, "Current Tier 13 Block 11 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_12_SUM_RECV, 0x09DB, "Current Tier 13 Block 12 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_13_SUM_RECV, 0x09DC, "Current Tier 13 Block 13 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_14_SUM_RECV, 0x09DD, "Current Tier 13 Block 14 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_15_SUM_RECV, 0x09DE, "Current Tier 13 Block 15 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_13_BLOCK_16_SUM_RECV, 0x09DF, "Current Tier 13 Block 16 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_1_SUM_RECV, 0x09E0, "Current Tier 14 Block 1 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_2_SUM_RECV, 0x09E1, "Current Tier 14 Block 2 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_3_SUM_RECV, 0x09E2, "Current Tier 14 Block 3 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_4_SUM_RECV, 0x09E3, "Current Tier 14 Block 4 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_5_SUM_RECV, 0x09E4, "Current Tier 14 Block 5 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_6_SUM_RECV, 0x09E5, "Current Tier 14 Block 6 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_7_SUM_RECV, 0x09E6, "Current Tier 14 Block 7 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_8_SUM_RECV, 0x09E7, "Current Tier 14 Block 8 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_9_SUM_RECV, 0x09E8, "Current Tier 14 Block 9 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_10_SUM_RECV, 0x09E9, "Current Tier 14 Block 10 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_11_SUM_RECV, 0x09EA, "Current Tier 14 Block 11 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_12_SUM_RECV, 0x09EB, "Current Tier 14 Block 12 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_13_SUM_RECV, 0x09EC, "Current Tier 14 Block 13 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_14_SUM_RECV, 0x09ED, "Current Tier 14 Block 14 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_15_SUM_RECV, 0x09EE, "Current Tier 14 Block 15 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_14_BLOCK_16_SUM_RECV, 0x09EF, "Current Tier 14 Block 16 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_1_SUM_RECV, 0x09F0, "Current Tier 15 Block 1 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_2_SUM_RECV, 0x09F1, "Current Tier 15 Block 2 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_3_SUM_RECV, 0x09F2, "Current Tier 15 Block 3 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_4_SUM_RECV, 0x09F3, "Current Tier 15 Block 4 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_5_SUM_RECV, 0x09F4, "Current Tier 15 Block 5 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_6_SUM_RECV, 0x09F5, "Current Tier 15 Block 6 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_7_SUM_RECV, 0x09F6, "Current Tier 15 Block 7 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_8_SUM_RECV, 0x09F7, "Current Tier 15 Block 8 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_9_SUM_RECV, 0x09F8, "Current Tier 15 Block 9 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_10_SUM_RECV, 0x09F9, "Current Tier 15 Block 10 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_11_SUM_RECV, 0x09FA, "Current Tier 15 Block 11 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_12_SUM_RECV, 0x09FB, "Current Tier 15 Block 12 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_13_SUM_RECV, 0x09FC, "Current Tier 15 Block 13 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_14_SUM_RECV, 0x09FD, "Current Tier 15 Block 14 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_15_SUM_RECV, 0x09FE, "Current Tier 15 Block 15 Summation Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_TIER_15_BLOCK_16_SUM_RECV, 0x09FF, "Current Tier 15 Block 16 Summation Received" ) \
/* Meter Billing Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_MET_BILL_TO_DATE_DELIVERED, 0x0A00, "Bill to Date Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_BILL_TO_DATE_TIMESTAMP_DEL, 0x0A01, "Bill to Date Time Stamp Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PROJECTED_BILL_DELIVERED, 0x0A02, "Projected Bill Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PROJECTED_BILL_TIME_STAMP_DEL, 0x0A03, "Projected Bill Time Stamp Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_BILL_DELIVERED_TRAILING_DIGIT, 0x0A04, "Bill Delivered Trailing Digit" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_BILL_TO_DATE_RECEIVED, 0x0A10, "Bill to Date Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_BILL_TO_DATE_TIMESTAMP_RECEIVED, 0x0A11, "Bill to Date Time Stamp Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PROJECTED_BILL_RECEIVED, 0x0A12, "Projected Bill Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PROJECTED_BILL_TIME_STAMP_RECV, 0x0A13, "Projected Bill Time Stamp Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_BILL_RECEIVED_TRAILING_DIGIT, 0x0A14, "Bill Received Trailing Digit" ) \
/* Supply Control Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_MET_PROPOSED_CHANGE_SUPPLY_IMP_TIME, 0x0B00, "Proposed Change Supply Implementation Time" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PROPOSED_CHANGE_SUPPLY_STATUS, 0x0B01, "Proposed Change Supply Status" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_UNCONTROLLED_FLOW_THRESHOLD, 0x0B10, "Uncontrolled Flow Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_UNCONTROLLED_FLOW_UNIT_OF_MEAS, 0x0B11, "Uncontrolled Flow Unit of Measure" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_UNCONTROLLED_FLOW_MULTIPLIER, 0x0B12, "Uncontrolled Flow Multiplier" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_UNCONTROLLED_FLOW_DIVISOR, 0x0B13, "Uncontrolled Flow Divisor" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_FLOW_STABILISATION_PERIOD, 0x0B14, "Flow Stabilisation Period" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_FLOW_MEASUREMENT_PERIOD, 0x0B15, "Flow Measurement Period" ) \
/* Alternative Historical Consumption Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_MET_ALTERNATIVE_INSTANT_DEMAND, 0x0C00, "Alternative Instantaneous Demand" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_DAY_ALT_CON_DEL, 0x0C01, "Current Day Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_DAY_ALT_CON_RECV, 0x0C02, "Current Day Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_DAY_ALT_CON_DEL, 0x0C03, "Previous Day Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_DAY_ALT_CON_RECV, 0x0C04, "Previous Day Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_ALT_PAR_PROF_INT_DEL, 0x0C05, "Current Alternative Partial Profile Interval Start Time Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_ALT_PAR_PROF_INT_RECV, 0x0C06, "Current Alternative Partial Profile Interval Start Time Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_ALT_PAR_PROF_INT_VAL_DEL, 0x0C07, "Current Alternative Partial Profile Interval Value Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_ALT_PAR_PROF_INT_VAL_RECV, 0x0C08, "Current Alternative Partial Profile Interval Value Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_DAY_ALT_MAX_PRESS, 0x0C09, "Current Day Alternative Max Pressure" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_DAY_ALT_MIN_PRESS, 0x0C0A, "Current Day Alternative Min Pressure" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREVIOUS_DAY_ALT_MAX_PRESS, 0x0C0B, "Previous Day Alternative Max Pressure" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREVIOUS_DAY_ALT_MIN_PRESS, 0x0C0C, "Previous Day Alternative Min Pressure" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_DAY_ALT_MAX_DEMAND, 0x0C0D, "Current Day Alternative Max Demand" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREVIOUS_DAY_ALT_MAX_DEMAND, 0x0C0E, "Previous Day Alternative Max Demand" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_MONTH_ALT_MAX_DEMAND, 0x0C0F, "Current Month Alternative Max Demand" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CURRENT_YEAR_ALT_MAX_DEMAND, 0x0C10, "Current Year Alternative Max Demand" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_DAY_2_ALT_CON_DEL, 0x0C20, "Previous Day 2 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_DAY_2_ALT_CON_RECV, 0x0C21, "Previous Day 2 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_DAY_3_ALT_CON_DEL, 0x0C22, "Previous Day 3 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_DAY_3_ALT_CON_RECV, 0x0C23, "Previous Day 3 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_DAY_4_ALT_CON_DEL, 0x0C24, "Previous Day 4 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_DAY_4_ALT_CON_RECV, 0x0C25, "Previous Day 4 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_DAY_5_ALT_CON_DEL, 0x0C26, "Previous Day 5 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_DAY_5_ALT_CON_RECV, 0x0C27, "Previous Day 5 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_DAY_6_ALT_CON_DEL, 0x0C28, "Previous Day 6 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_DAY_6_ALT_CON_RECV, 0x0C29, "Previous Day 6 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_DAY_7_ALT_CON_DEL, 0x0C2A, "Previous Day 7 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_DAY_7_ALT_CON_RECV, 0x0C2B, "Previous Day 7 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_DAY_8_ALT_CON_DEL, 0x0C2C, "Previous Day 8 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_DAY_8_ALT_CON_RECV, 0x0C2D, "Previous Day 8 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_WEEK_ALT_CON_DEL, 0x0C30, "Current Week Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_WEEK_ALT_CON_RECV, 0x0C31, "Current Week Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_ALT_CON_DEL, 0x0C32, "Previous Week Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_ALT_CON_RECV, 0x0C33, "Previous Week Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_2_ALT_CON_DEL, 0x0C34, "Previous Week 2 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_2_ALT_CON_RECV, 0x0C35, "Previous Week 2 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_3_ALT_CON_DEL, 0x0C36, "Previous Week 3 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_3_ALT_CON_RECV, 0x0C37, "Previous Week 3 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_4_ALT_CON_DEL, 0x0C38, "Previous Week 4 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_4_ALT_CON_RECV, 0x0C39, "Previous Week 4 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_5_ALT_CON_DEL, 0x0C3A, "Previous Week 5 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_WEEK_5_ALT_CON_RECV, 0x0C3B, "Previous Week 5 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_MONTH_ALT_CON_DEL, 0x0C40, "Current Month Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CUR_MONTH_ALT_CON_RECV, 0x0C41, "Current Month Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_ALT_CON_DEL, 0x0C42, "Previous Month Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_ALT_CON_RECV, 0x0C43, "Previous Month Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_2_ALT_CON_DEL, 0x0C44, "Previous Month 2 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_2_ALT_CON_RECV, 0x0C45, "Previous Month 2 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_3_ALT_CON_DEL, 0x0C46, "Previous Month 3 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_3_ALT_CON_RECV, 0x0C47, "Previous Month 3 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_4_ALT_CON_DEL, 0x0C48, "Previous Month 4 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_4_ALT_CON_RECV, 0x0C49, "Previous Month 4 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_5_ALT_CON_DEL, 0x0C4A, "Previous Month 5 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_5_ALT_CON_RECV, 0x0C4B, "Previous Month 5 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_6_ALT_CON_DEL, 0x0C4C, "Previous Month 6 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_6_ALT_CON_RECV, 0x0C4D, "Previous Month 6 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_7_ALT_CON_DEL, 0x0C4E, "Previous Month 7 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_7_ALT_CON_RECV, 0x0C4F, "Previous Month 7 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_8_ALT_CON_DEL, 0x0C50, "Previous Month 8 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_8_ALT_CON_RECV, 0x0C51, "Previous Month 8 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_9_ALT_CON_DEL, 0x0C52, "Previous Month 9 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_9_ALT_CON_RECV, 0x0C53, "Previous Month 9 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_10_ALT_CON_DEL, 0x0C54, "Previous Month 10 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_10_ALT_CON_RECV, 0x0C55, "Previous Month 10 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_11_ALT_CON_DEL, 0x0C56, "Previous Month 11 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_11_ALT_CON_RECV, 0x0C57, "Previous Month 11 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_12_ALT_CON_DEL, 0x0C58, "Previous Month 12 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_12_ALT_CON_RECV, 0x0C59, "Previous Month 12 Alternative Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_13_ALT_CON_DEL, 0x0C5A, "Previous Month 13 Alternative Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_PREV_MONTH_13_ALT_CON_RECV, 0x0C5B, "Previous Month 13 Alternative Consumption Received" ) \
/* Smart Energy */ \
XXX(ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_MET, 0xFFFE, "Attribute Reporting Status" )
VALUE_STRING_ENUM(zbee_zcl_met_attr_server_names);
VALUE_STRING_ARRAY(zbee_zcl_met_attr_server_names);
static value_string_ext zbee_zcl_met_attr_server_names_ext = VALUE_STRING_EXT_INIT(zbee_zcl_met_attr_server_names);
#define zbee_zcl_met_attr_client_names_VALUE_STRING_LIST(XXX) \
/* Notification AttributeSet*/ \
XXX(ZBEE_ZCL_ATTR_ID_MET_CLNT_FUNC_NOTI_FLAGS, 0x0000, "Functional Notification Flags" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CLNT_NOTI_FLAGS_2, 0x0001, "Notification Flags 2" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CLNT_NOTI_FLAGS_3, 0x0002, "Notification Flags 3" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CLNT_NOTI_FLAGS_4, 0x0003, "Notification Flags 4" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CLNT_NOTI_FLAGS_5, 0x0004, "Notification Flags 5" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CLNT_NOTI_FLAGS_6, 0x0005, "Notification Flags 6" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CLNT_NOTI_FLAGS_7, 0x0006, "Notification Flags 7" ) \
XXX(ZBEE_ZCL_ATTR_ID_MET_CLNT_NOTI_FLAGS_8, 0x0007, "Notification Flags 8" ) \
/* Smart Energy */ \
XXX(ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_MET_CLNT, 0xFFFE, "Attribute Reporting Status" )
VALUE_STRING_ENUM(zbee_zcl_met_attr_client_names);
VALUE_STRING_ARRAY(zbee_zcl_met_attr_client_names);
/* Server Commands Received */
#define zbee_zcl_met_srv_rx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_MET_GET_PROFILE, 0x00, "Get Profile" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_REQUEST_MIRROR_RSP, 0x01, "Request Mirror Response" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_MIRROR_REMOVED, 0x02, "Mirror Removed" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_REQUEST_FAST_POLL_MODE, 0x03, "Request Fast Poll Mode" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_SCHEDULE_SNAPSHOT, 0x04, "Schedule Snapshot" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_TAKE_SNAPSHOT, 0x05, "Take Snapshot" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_GET_SNAPSHOT, 0x06, "Get Snapshot" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_START_SAMPLING, 0x07, "Start Sampling" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_GET_SAMPLED_DATA, 0x08, "Get Sampled Data" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_MIRROR_REPORT_ATTRIBUTE_RESPONSE, 0x09, "Mirror Report Attribute Response" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_RESET_LOAD_LIMIT_COUNTER, 0x0A, "Reset Load Limit Counter" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_CHANGE_SUPPLY, 0x0B, "Change Supply" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_LOCAL_CHANGE_SUPPLY, 0x0C, "Local Change Supply" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_SET_SUPPLY_STATUS, 0x0D, "Set Supply Status" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_SET_UNCONTROLLED_FLOW_THRESHOLD, 0x0E, "Set Uncontrolled Flow Threshold" )
VALUE_STRING_ENUM(zbee_zcl_met_srv_rx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_met_srv_rx_cmd_names);
/* Server Commands Generated */
#define zbee_zcl_met_srv_tx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_MET_GET_PROFILE_RESPONSE, 0x00, "Get Profile Response" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_REQUEST_MIRROR, 0x01, "Request Mirror" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_REMOVE_MIRROR, 0x02, "Remove Mirror" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_REQUEST_FAST_POLL_MODE_RESPONSE, 0x03, "Request Fast Poll Mode Response" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_SCHEDULE_SNAPSHOT_RESPONSE, 0x04, "Schedule Snapshot Response" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_TAKE_SNAPSHOT_RESPONSE, 0x05, "Take Snapshot Response" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_PUBLISH_SNAPSHOT, 0x06, "Publish Snapshot" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_GET_SAMPLED_DATA_RSP, 0x07, "Get Sampled Data Response" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_CONFIGURE_MIRROR, 0x08, "Configure Mirror" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_CONFIGURE_NOTIFICATION_SCHEME, 0x09, "Configure Notification Scheme" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_CONFIGURE_NOTIFICATION_FLAGS, 0x0A, "Configure Notification Flags" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_GET_NOTIFIED_MESSAGE, 0x0B, "Get Notified Message" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_SUPPLY_STATUS_RESPONSE, 0x0C, "Supply Status Response" ) \
XXX(ZBEE_ZCL_CMD_ID_MET_START_SAMPLING_RESPONSE, 0x0D, "Start Sampling Response" )
VALUE_STRING_ENUM(zbee_zcl_met_srv_tx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_met_srv_tx_cmd_names);
#define ZBEE_ZCL_MET_NOTIFICATION_SCHEME_A 0x1
#define ZBEE_ZCL_MET_NOTIFICATION_SCHEME_B 0x2
static const range_string zbee_zcl_met_notification_scheme[] = {
{ 0x0, 0x0, "No Notification Scheme Defined" },
{ ZBEE_ZCL_MET_NOTIFICATION_SCHEME_A, ZBEE_ZCL_MET_NOTIFICATION_SCHEME_A, "Predefined Notification Scheme A" },
{ ZBEE_ZCL_MET_NOTIFICATION_SCHEME_B, ZBEE_ZCL_MET_NOTIFICATION_SCHEME_B, "Predefined Notification Scheme B" },
{ 0x3, 0x80, "Reserved" },
{ 0x81, 0xFE, "For MSP Requirements" },
{ 0xFF, 0xFF, "Reserved" },
{ 0, 0, NULL }
};
/* Snapshot Schedule Confirmation */
#define zbee_zcl_met_snapshot_schedule_confirmation_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_SNAPSHOT_SCHEDULE_CONFIRMATION_ID_ACCEPTED, 0x00, "Accepted" ) \
XXX(ZBEE_ZCL_SNAPSHOT_SCHEDULE_CONFIRMATION_ID_TYPE_NOT_SUPPORTED, 0x01, "Snapshot Type not supported") \
XXX(ZBEE_ZCL_SNAPSHOT_SCHEDULE_CONFIRMATION_ID_CAUSE_NOT_SUPPORTED, 0x02, "Snapshot Cause not supported") \
XXX(ZBEE_ZCL_SNAPSHOT_SCHEDULE_CONFIRMATION_ID_CURRENTLY_NOT_AVAILABLE, 0x03, "Snapshot Cause not supported") \
XXX(ZBEE_ZCL_SNAPSHOT_SCHEDULE_CONFIRMATION_ID_NOT_SUPPORTED_BY_DEVICE, 0x04, "Snapshot Schedules not supported by device") \
XXX(ZBEE_ZCL_SNAPSHOT_SCHEDULE_CONFIRMATION_ID_INSUFFICIENT_SPACE, 0x05, "Insufficient space for snapshot schedule")
VALUE_STRING_ENUM(zbee_zcl_met_snapshot_schedule_confirmation);
VALUE_STRING_ARRAY(zbee_zcl_met_snapshot_schedule_confirmation);
/* Snapshot Schedule Frequency Type*/
#define zbee_zcl_met_snapshot_schedule_frequency_type_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_SNAPSHOT_SCHEDULE_FREQUENCY_TYPE_DAY, 0x0, "Day" ) \
XXX(ZBEE_ZCL_SNAPSHOT_SCHEDULE_FREQUENCY_TYPE_WEEK, 0x1, "Week" ) \
XXX(ZBEE_ZCL_SNAPSHOT_SCHEDULE_FREQUENCY_TYPE_MONTH, 0x2, "Month" ) \
XXX(ZBEE_ZCL_SNAPSHOT_SCHEDULE_FREQUENCY_TYPE_RESERVED, 0x3, "Reserved" )
VALUE_STRING_ENUM(zbee_zcl_met_snapshot_schedule_frequency_type);
VALUE_STRING_ARRAY(zbee_zcl_met_snapshot_schedule_frequency_type);
/* Snapshot Schedule Wild-Card Frequency*/
#define zbee_zcl_met_snapshot_schedule_frequency_wild_card_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_SNAPSHOT_SCHEDULE_FREQUENCY_WILD_CARD_START_OF, 0x0, "Start of" ) \
XXX(ZBEE_ZCL_SNAPSHOT_SCHEDULE_FREQUENCY_WILD_CARD_END_OF, 0x1, "End of" ) \
XXX(ZBEE_ZCL_SNAPSHOT_SCHEDULE_FREQUENCY_WILD_CARD_NOT_USED, 0x2, "Wild-card not used" ) \
XXX(ZBEE_ZCL_SNAPSHOT_SCHEDULE_FREQUENCY_WILD_CARD_RESERVED, 0x3, "Reserved" )
VALUE_STRING_ENUM(zbee_zcl_met_snapshot_schedule_frequency_wild_card);
VALUE_STRING_ARRAY(zbee_zcl_met_snapshot_schedule_frequency_wild_card);
/* Snapshot Payload Type */
#define zbee_zcl_met_snapshot_payload_type_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_SNAPSHOT_PAYLOAD_TYPE_TOU_INFO_SET_DELIVERED_REGISTERS, 0, "TOU Information Set Delivered Registers" ) \
XXX(ZBEE_ZCL_SNAPSHOT_PAYLOAD_TYPE_TOU_INFO_SET_RECEIVED_REGISTERS, 1, "TOU Information Set Received Registers") \
XXX(ZBEE_ZCL_SNAPSHOT_PAYLOAD_TYPE_BLOCK_TIER_INFO_SET_DELIVERED, 2, "Block Tier Information Set Delivered") \
XXX(ZBEE_ZCL_SNAPSHOT_PAYLOAD_TYPE_BLOCK_TIER_INFO_SET_RECEIVED, 3, "Block Tier Information Set Received") \
XXX(ZBEE_ZCL_SNAPSHOT_PAYLOAD_TYPE_TOU_INFO_SET_DELIVERED_NO_BILLING, 4, "TOU Information Set Delivered (No Billing)") \
XXX(ZBEE_ZCL_SNAPSHOT_PAYLOAD_TYPE_TOU_INFO_SET_RECEIVED_NO_BILLING, 5, "TOU Information Set Received (No Billing)") \
XXX(ZBEE_ZCL_SNAPSHOT_PAYLOAD_TYPE_BLOCK_TIER_INFO_SET_DELIVERED_NO_BILLING, 6, "Block Tier Information Set Delivered (No Billing)") \
XXX(ZBEE_ZCL_SNAPSHOT_PAYLOAD_TYPE_BLOCK_TIER_INFO_SET_RECEIVED_NO_BILLING, 7, "Block Tier Information Set Received (No Billing)") \
XXX(ZBEE_ZCL_SNAPSHOT_PAYLOAD_TYPE_DATA_UNAVAILABLE, 128, "Data Unavailable")
VALUE_STRING_ENUM(zbee_zcl_met_snapshot_payload_type);
VALUE_STRING_ARRAY(zbee_zcl_met_snapshot_payload_type);
/* Functional Notification Flags */
#define ZBEE_ZCL_FUNC_NOTI_FLAG_NEW_OTA_FIRMWARE 0x00000001
#define ZBEE_ZCL_FUNC_NOTI_FLAG_CBKE_UPDATE_REQUESTED 0x00000002
#define ZBEE_ZCL_FUNC_NOTI_FLAG_TIME_SYNC 0x00000004
#define ZBEE_ZCL_FUNC_NOTI_FLAG_RESERVED_1 0x00000008
#define ZBEE_ZCL_FUNC_NOTI_FLAG_STAY_AWAKE_REQUEST_HAN 0x00000010
#define ZBEE_ZCL_FUNC_NOTI_FLAG_STAY_AWAKE_REQUEST_WAN 0x00000020
#define ZBEE_ZCL_FUNC_NOTI_FLAG_PUSH_HISTORICAL_METERING_DATA_ATTRIBUTE_SET 0x000001C0
#define ZBEE_ZCL_FUNC_NOTI_FLAG_PUSH_HISTORICAL_PREPAYMENT_DATA_ATTRIBUTE_SET 0x00000E00
#define ZBEE_ZCL_FUNC_NOTI_FLAG_PUSH_ALL_STATIC_DATA_BASIC_CLUSTER 0x00001000
#define ZBEE_ZCL_FUNC_NOTI_FLAG_PUSH_ALL_STATIC_DATA_METERING_CLUSTER 0x00002000
#define ZBEE_ZCL_FUNC_NOTI_FLAG_PUSH_ALL_STATIC_DATA_PREPAYMENT_CLUSTER 0x00004000
#define ZBEE_ZCL_FUNC_NOTI_FLAG_NETWORK_KEY_ACTIVE 0x00008000
#define ZBEE_ZCL_FUNC_NOTI_FLAG_DISPLAY_MESSAGE 0x00010000
#define ZBEE_ZCL_FUNC_NOTI_FLAG_CANCEL_ALL_MESSAGES 0x00020000
#define ZBEE_ZCL_FUNC_NOTI_FLAG_CHANGE_SUPPLY 0x00040000
#define ZBEE_ZCL_FUNC_NOTI_FLAG_LOCAL_CHANGE_SUPPLY 0x00080000
#define ZBEE_ZCL_FUNC_NOTI_FLAG_SET_UNCONTROLLED_FLOW_THRESHOLD 0x00100000
#define ZBEE_ZCL_FUNC_NOTI_FLAG_TUNNEL_MESSAGE_PENDING 0x00200000
#define ZBEE_ZCL_FUNC_NOTI_FLAG_GET_SNAPSHOT 0x00400000
#define ZBEE_ZCL_FUNC_NOTI_FLAG_GET_SAMPLED_DATA 0x00800000
#define ZBEE_ZCL_FUNC_NOTI_FLAG_NEW_SUB_GHZ_CHANNEL_MASKS_AVAILABLE 0x01000000
#define ZBEE_ZCL_FUNC_NOTI_FLAG_ENERGY_SCAN_PENDING 0x02000000
#define ZBEE_ZCL_FUNC_NOTI_FLAG_CHANNEL_CHANGE_PENDING 0x04000000
#define ZBEE_ZCL_FUNC_NOTI_FLAG_RESERVED_2 0xF8000000
/* Notification Flags 2 */
#define ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_PRICE 0x00000001
#define ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_BLOCK_PERIOD 0x00000002
#define ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_TARIFF_INFORMATION 0x00000004
#define ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_CONVERSION_FACTOR 0x00000008
#define ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_CALORIFIC_VALUE 0x00000010
#define ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_CO2_VALUE 0x00000020
#define ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_BILLING_PERIOD 0x00000040
#define ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_CONSOLIDATED_BILL 0x00000080
#define ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_PRICE_MATRIX 0x00000100
#define ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_BLOCK_THRESHOLDS 0x00000200
#define ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_CURRENCY_CONVERSION 0x00000400
#define ZBEE_ZCL_NOTI_FLAG_2_RESERVED 0x00000800
#define ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_CREDIT_PAYMENT_INFO 0x00001000
#define ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_CPP_EVENT 0x00002000
#define ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_TIER_LABELS 0x00004000
#define ZBEE_ZCL_NOTI_FLAG_2_CANCEL_TARIFF 0x00008000
#define ZBEE_ZCL_NOTI_FLAG_2_RESERVED_FUTURE 0xFFFF0000
/* Notification Flags 3 */
#define ZBEE_ZCL_NOTI_FLAG_3_PUBLISH_CALENDAR 0x00000001
#define ZBEE_ZCL_NOTI_FLAG_3_PUBLISH_SPECIAL_DAYS 0x00000002
#define ZBEE_ZCL_NOTI_FLAG_3_PUBLISH_SEASONS 0x00000004
#define ZBEE_ZCL_NOTI_FLAG_3_PUBLISH_WEEK 0x00000008
#define ZBEE_ZCL_NOTI_FLAG_3_PUBLISH_DAY 0x00000010
#define ZBEE_ZCL_NOTI_FLAG_3_CANCEL_DAY 0x00000020
#define ZBEE_ZCL_NOTI_FLAG_3_RESERVED 0xFFFFFFC0
/* Notification Flags 4 */
#define ZBEE_ZCL_NOTI_FLAG_4_SELECT_AVAILABLE_EMERGENCY_CREDIT 0x00000001
#define ZBEE_ZCL_NOTI_FLAG_4_CHANGE_DEBT 0x00000002
#define ZBEE_ZCL_NOTI_FLAG_4_EMERGENCY_CREDIT_SETUP 0x00000004
#define ZBEE_ZCL_NOTI_FLAG_4_CONSUMER_TOP_UP 0x00000008
#define ZBEE_ZCL_NOTI_FLAG_4_CREDIT_ADJUSTMENT 0x00000010
#define ZBEE_ZCL_NOTI_FLAG_4_CHANGE_PAYMENT_MODE 0x00000020
#define ZBEE_ZCL_NOTI_FLAG_4_GET_PREPAY_SNAPSHOT 0x00000040
#define ZBEE_ZCL_NOTI_FLAG_4_GET_TOP_UP_LOG 0x00000080
#define ZBEE_ZCL_NOTI_FLAG_4_SET_LOW_CREDIT_WARNING_LEVEL 0x00000100
#define ZBEE_ZCL_NOTI_FLAG_4_GET_DEBT_REPAYMENT_LOG 0x00000200
#define ZBEE_ZCL_NOTI_FLAG_4_SET_MAXIMUM_CREDIT_LIMIT 0x00000400
#define ZBEE_ZCL_NOTI_FLAG_4_SET_OVERALL_DEBT_CAP 0x00000800
#define ZBEE_ZCL_NOTI_FLAG_4_RESERVED 0xFFFFF000
/* Notification Flags 5 */
#define ZBEE_ZCL_NOTI_FLAG_5_PUBLISH_CHANGE_OF_TENANCY 0x00000001
#define ZBEE_ZCL_NOTI_FLAG_5_PUBLISH_CHANGE_OF_SUPPLIER 0x00000002
#define ZBEE_ZCL_NOTI_FLAG_5_REQUEST_NEW_PASSWORD_1_RESPONSE 0x00000004
#define ZBEE_ZCL_NOTI_FLAG_5_REQUEST_NEW_PASSWORD_2_RESPONSE 0x00000008
#define ZBEE_ZCL_NOTI_FLAG_5_REQUEST_NEW_PASSWORD_3_RESPONSE 0x00000010
#define ZBEE_ZCL_NOTI_FLAG_5_REQUEST_NEW_PASSWORD_4_RESPONSE 0x00000020
#define ZBEE_ZCL_NOTI_FLAG_5_UPDATE_SITE_ID 0x00000040
#define ZBEE_ZCL_NOTI_FLAG_5_RESET_BATTERY_COUNTER 0x00000080
#define ZBEE_ZCL_NOTI_FLAG_5_UPDATE_CIN 0x00000100
#define ZBEE_ZCL_NOTI_FLAG_5_RESERVED 0XFFFFFE00
/*************************/
/* Function Declarations */
/*************************/
void proto_register_zbee_zcl_met(void);
void proto_reg_handoff_zbee_zcl_met(void);
/* Attribute Dissector Helpers */
static void dissect_zcl_met_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr);
/* Command Dissector Helpers */
static void dissect_zcl_met_get_profile (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_request_mirror_rsp (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_mirror_removed (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_request_fast_poll_mode (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_schedule_snapshot (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_take_snapshot (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_get_snapshot (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_start_sampling (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_get_sampled_data (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_mirror_report_attribute_response(tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_reset_load_limit_counter (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_change_supply (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_local_change_supply (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_set_supply_status (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_set_uncontrolled_flow_threshold (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_get_profile_response (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_request_fast_poll_mode_response (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_schedule_snapshot_response (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_take_snapshot_response (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_publish_snapshot (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_get_sampled_data_rsp (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_configure_mirror (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_configure_notification_scheme (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_configure_notification_flags (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_get_notified_msg (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_supply_status_response (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_start_sampling_response (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_met_notification_flags (tvbuff_t *tvb, proto_tree *tree, guint *offset, guint16 noti_flags_number);
/*************************/
/* Global Variables */
/*************************/
/* Initialize the protocol and registered fields */
static int proto_zbee_zcl_met = -1;
static int hf_zbee_zcl_met_srv_tx_cmd_id = -1;
static int hf_zbee_zcl_met_srv_rx_cmd_id = -1;
static int hf_zbee_zcl_met_attr_server_id = -1;
static int hf_zbee_zcl_met_attr_client_id = -1;
static int hf_zbee_zcl_met_attr_reporting_status = -1;
static int hf_zbee_zcl_met_func_noti_flags = -1;
static int hf_zbee_zcl_met_func_noti_flag_new_ota_firmware = -1;
static int hf_zbee_zcl_met_func_noti_flag_cbke_update_request = -1;
static int hf_zbee_zcl_met_func_noti_flag_time_sync = -1;
static int hf_zbee_zcl_met_func_noti_flag_stay_awake_request_han = -1;
static int hf_zbee_zcl_met_func_noti_flag_stay_awake_request_wan = -1;
static int hf_zbee_zcl_met_func_noti_flag_push_historical_metering_data_attribute_set = -1;
static int hf_zbee_zcl_met_func_noti_flag_push_historical_prepayment_data_attribute_set = -1;
static int hf_zbee_zcl_met_func_noti_flag_push_all_static_data_basic_cluster = -1;
static int hf_zbee_zcl_met_func_noti_flag_push_all_static_data_metering_cluster = -1;
static int hf_zbee_zcl_met_func_noti_flag_push_all_static_data_prepayment_cluster = -1;
static int hf_zbee_zcl_met_func_noti_flag_network_key_active = -1;
static int hf_zbee_zcl_met_func_noti_flag_display_message = -1;
static int hf_zbee_zcl_met_func_noti_flag_cancel_all_messages = -1;
static int hf_zbee_zcl_met_func_noti_flag_change_supply = -1;
static int hf_zbee_zcl_met_func_noti_flag_local_change_supply = -1;
static int hf_zbee_zcl_met_func_noti_flag_set_uncontrolled_flow_threshold = -1;
static int hf_zbee_zcl_met_func_noti_flag_tunnel_message_pending = -1;
static int hf_zbee_zcl_met_func_noti_flag_get_snapshot = -1;
static int hf_zbee_zcl_met_func_noti_flag_get_sampled_data = -1;
static int hf_zbee_zcl_met_func_noti_flag_new_sub_ghz_channel_masks_available = -1;
static int hf_zbee_zcl_met_func_noti_flag_energy_scan_pending = -1;
static int hf_zbee_zcl_met_func_noti_flag_channel_change_pending = -1;
static int hf_zbee_zcl_met_func_noti_flag_reserved = -1;
static int hf_zbee_zcl_met_noti_flags_2 = -1;
static int hf_zbee_zcl_met_noti_flag_2_publish_price = -1;
static int hf_zbee_zcl_met_noti_flag_2_publish_block_period = -1;
static int hf_zbee_zcl_met_noti_flag_2_publish_tariff_info = -1;
static int hf_zbee_zcl_met_noti_flag_2_publish_conversion_factor = -1;
static int hf_zbee_zcl_met_noti_flag_2_publish_calorific_value = -1;
static int hf_zbee_zcl_met_noti_flag_2_publish_co2_value = -1;
static int hf_zbee_zcl_met_noti_flag_2_publish_billing_period = -1;
static int hf_zbee_zcl_met_noti_flag_2_publish_consolidated_bill = -1;
static int hf_zbee_zcl_met_noti_flag_2_publish_price_matrix = -1;
static int hf_zbee_zcl_met_noti_flag_2_publish_block_thresholds = -1;
static int hf_zbee_zcl_met_noti_flag_2_publish_currency_conversion = -1;
static int hf_zbee_zcl_met_noti_flag_2_publish_credit_payment_info = -1;
static int hf_zbee_zcl_met_noti_flag_2_publish_cpp_event = -1;
static int hf_zbee_zcl_met_noti_flag_2_publish_tier_labels = -1;
static int hf_zbee_zcl_met_noti_flag_2_cancel_tariff = -1;
static int hf_zbee_zcl_met_noti_flag_2_reserved = -1;
static int hf_zbee_zcl_met_noti_flags_3 = -1;
static int hf_zbee_zcl_met_noti_flag_3_publish_calendar = -1;
static int hf_zbee_zcl_met_noti_flag_3_publish_special_days = -1;
static int hf_zbee_zcl_met_noti_flag_3_publish_seasons = -1;
static int hf_zbee_zcl_met_noti_flag_3_publish_week = -1;
static int hf_zbee_zcl_met_noti_flag_3_publish_day = -1;
static int hf_zbee_zcl_met_noti_flag_3_cancel_calendar = -1;
static int hf_zbee_zcl_met_noti_flag_3_reserved = -1;
static int hf_zbee_zcl_met_noti_flags_4 = -1;
static int hf_zbee_zcl_met_noti_flag_4_select_available_emergency_credit = -1;
static int hf_zbee_zcl_met_noti_flag_4_change_debt = -1;
static int hf_zbee_zcl_met_noti_flag_4_emergency_credit_setup = -1;
static int hf_zbee_zcl_met_noti_flag_4_consumer_top_up = -1;
static int hf_zbee_zcl_met_noti_flag_4_credit_adjustment = -1;
static int hf_zbee_zcl_met_noti_flag_4_change_payment_mode = -1;
static int hf_zbee_zcl_met_noti_flag_4_get_prepay_snapshot = -1;
static int hf_zbee_zcl_met_noti_flag_4_get_top_up_log = -1;
static int hf_zbee_zcl_met_noti_flag_4_set_low_credit_warning_level = -1;
static int hf_zbee_zcl_met_noti_flag_4_get_debt_repayment_log = -1;
static int hf_zbee_zcl_met_noti_flag_4_set_maximum_credit_limit = -1;
static int hf_zbee_zcl_met_noti_flag_4_set_overall_debt_cap = -1;
static int hf_zbee_zcl_met_noti_flag_4_reserved = -1;
static int hf_zbee_zcl_met_noti_flags_5 = -1;
static int hf_zbee_zcl_met_noti_flag_5_publish_change_of_tenancy = -1;
static int hf_zbee_zcl_met_noti_flag_5_publish_change_of_supplier = -1;
static int hf_zbee_zcl_met_noti_flag_5_request_new_password_1_response = -1;
static int hf_zbee_zcl_met_noti_flag_5_request_new_password_2_response = -1;
static int hf_zbee_zcl_met_noti_flag_5_request_new_password_3_response = -1;
static int hf_zbee_zcl_met_noti_flag_5_request_new_password_4_response = -1;
static int hf_zbee_zcl_met_noti_flag_5_update_site_id = -1;
static int hf_zbee_zcl_met_noti_flag_5_reset_battery_counter = -1;
static int hf_zbee_zcl_met_noti_flag_5_update_cin = -1;
static int hf_zbee_zcl_met_noti_flag_5_reserved = -1;
static int hf_zbee_zcl_met_get_profile_interval_channel = -1;
static int hf_zbee_zcl_met_get_profile_end_time = -1;
static int hf_zbee_zcl_met_get_profile_number_of_periods = -1;
static int hf_zbee_zcl_met_request_mirror_rsp_endpoint_id = -1;
static int hf_zbee_zcl_met_mirror_removed_removed_endpoint_id = -1;
static int hf_zbee_zcl_met_request_fast_poll_mode_fast_poll_update_period = -1;
static int hf_zbee_zcl_met_request_fast_poll_mode_duration = -1;
static int hf_zbee_zcl_met_schedule_snapshot_issuer_event_id = -1;
static int hf_zbee_zcl_met_schedule_snapshot_command_index = -1;
static int hf_zbee_zcl_met_schedule_snapshot_snapshot_schedule_payload_snapshot_schedule_id = -1;
static int hf_zbee_zcl_met_schedule_snapshot_snapshot_schedule_payload_snapshot_start_time = -1;
static int hf_zbee_zcl_met_schedule_snapshot_snapshot_schedule_payload_snapshot_schedule = -1;
static int hf_zbee_zcl_met_schedule_snapshot_snapshot_schedule_payload_shapshot_payload_type = -1;
static int hf_zbee_zcl_met_schedule_snapshot_snapshot_schedule_payload_snapshot_cause = -1;
static int hf_zbee_zcl_met_schedule_snapshot_total_number_of_commands = -1;
static int hf_zbee_zcl_met_take_snapshot_snapshot_cause = -1;
static int hf_zbee_zcl_met_get_snapshot_start_time = -1;
static int hf_zbee_zcl_met_get_snapshot_end_time = -1;
static int hf_zbee_zcl_met_get_snapshot_snapshot_offset = -1;
static int hf_zbee_zcl_met_get_snapshot_snapshot_cause = -1;
static int hf_zbee_zcl_met_start_sampling_issuer_event_id = -1;
static int hf_zbee_zcl_met_start_sampling_start_sampling_time = -1;
static int hf_zbee_zcl_met_start_sampling_sample_type = -1;
static int hf_zbee_zcl_met_start_sampling_sample_request_interval = -1;
static int hf_zbee_zcl_met_start_sampling_max_number_of_samples = -1;
static int hf_zbee_zcl_met_get_sampled_data_sample_id = -1;
static int hf_zbee_zcl_met_get_sampled_data_sample_start_time = -1;
static int hf_zbee_zcl_met_get_sampled_data_sample_type = -1;
static int hf_zbee_zcl_met_get_sampled_data_number_of_samples = -1;
static int hf_zbee_zcl_met_start_sampling_response_sample_id = -1;
static int hf_zbee_zcl_met_mirror_report_attribute_response_notification_scheme = -1;
static int hf_zbee_zcl_met_mirror_report_attribute_response_notification_flags_n = -1;
static int hf_zbee_zcl_met_reset_load_limit_counter_provider_id = -1;
static int hf_zbee_zcl_met_reset_load_limit_counter_issuer_event_id = -1;
static int hf_zbee_zcl_met_change_supply_provider_id = -1;
static int hf_zbee_zcl_met_change_supply_issuer_event_id = -1;
static int hf_zbee_zcl_met_change_supply_request_date_time = -1;
static int hf_zbee_zcl_met_change_supply_implementation_date_time = -1;
static int hf_zbee_zcl_met_change_supply_proposed_supply_status = -1;
static int hf_zbee_zcl_met_change_supply_supply_control_bits = -1;
static int hf_zbee_zcl_met_local_change_supply_proposed_supply_status = -1;
static int hf_zbee_zcl_met_set_supply_status_issuer_event_id = -1;
static int hf_zbee_zcl_met_set_supply_status_supply_tamper_state = -1;
static int hf_zbee_zcl_met_set_supply_status_supply_depletion_state = -1;
static int hf_zbee_zcl_met_set_supply_status_supply_uncontrolled_flow_state = -1;
static int hf_zbee_zcl_met_set_supply_status_load_limit_supply_state = -1;
static int hf_zbee_zcl_met_set_uncontrolled_flow_threshold_provider_id = -1;
static int hf_zbee_zcl_met_set_uncontrolled_flow_threshold_issuer_event_id = -1;
static int hf_zbee_zcl_met_set_uncontrolled_flow_threshold_uncontrolled_flow_threshold = -1;
static int hf_zbee_zcl_met_set_uncontrolled_flow_threshold_unit_of_measure = -1;
static int hf_zbee_zcl_met_set_uncontrolled_flow_threshold_multiplier = -1;
static int hf_zbee_zcl_met_set_uncontrolled_flow_threshold_divisor = -1;
static int hf_zbee_zcl_met_set_uncontrolled_flow_threshold_stabilisation_period = -1;
static int hf_zbee_zcl_met_set_uncontrolled_flow_threshold_measurement_period = -1;
static int hf_zbee_zcl_met_get_profile_response_end_time = -1;
static int hf_zbee_zcl_met_get_profile_response_status = -1;
static int hf_zbee_zcl_met_get_profile_response_profile_interval_period = -1;
static int hf_zbee_zcl_met_get_profile_response_number_of_periods_delivered = -1;
static int hf_zbee_zcl_met_get_profile_response_intervals = -1;
static int hf_zbee_zcl_met_request_fast_poll_mode_response_applied_update_period = -1;
static int hf_zbee_zcl_met_request_fast_poll_mode_response_fast_poll_mode_end_time = -1;
static int hf_zbee_zcl_met_schedule_snapshot_response_issuer_event_id = -1;
static int hf_zbee_zcl_met_schedule_snapshot_response_snapshot_schedule_id = -1;
static int hf_zbee_zcl_met_schedule_snapshot_response_snapshot_schedule_confirmation = -1;
static int hf_zbee_zcl_met_take_snapshot_response_snapshot_id = -1;
static int hf_zbee_zcl_met_take_snapshot_response_snapshot_confirmation = -1;
static int hf_zbee_zcl_met_publish_snapshot_snapshot_id = -1;
static int hf_zbee_zcl_met_publish_snapshot_snapshot_time = -1;
static int hf_zbee_zcl_met_publish_snapshot_snapshots_found = -1;
static int hf_zbee_zcl_met_publish_snapshot_cmd_index = -1;
static int hf_zbee_zcl_met_publish_snapshot_total_commands = -1;
static int hf_zbee_zcl_met_publish_snapshot_snapshot_cause = -1;
static int hf_zbee_zcl_met_publish_snapshot_snapshot_payload_type = -1;
static int hf_zbee_zcl_met_publish_snapshot_snapshot_sub_payload = -1;
static int hf_zbee_zcl_met_get_sampled_data_rsp_sample_id = -1;
static int hf_zbee_zcl_met_get_sampled_data_rsp_sample_start_time = -1;
static int hf_zbee_zcl_met_get_sampled_data_rsp_sample_type = -1;
static int hf_zbee_zcl_met_get_sampled_data_rsp_sample_request_interval = -1;
static int hf_zbee_zcl_met_get_sampled_data_rsp_sample_number_of_samples = -1;
static int hf_zbee_zcl_met_get_sampled_data_rsp_sample_samples = -1;
static int hf_zbee_zcl_met_configure_mirror_issuer_event_id = -1;
static int hf_zbee_zcl_met_configure_mirror_reporting_interval = -1;
static int hf_zbee_zcl_met_configure_mirror_mirror_notification_reporting = -1;
static int hf_zbee_zcl_met_configure_mirror_notification_scheme = -1;
static int hf_zbee_zcl_met_configure_notification_scheme_issuer_event_id = -1;
static int hf_zbee_zcl_met_configure_notification_scheme_notification_scheme = -1;
static int hf_zbee_zcl_met_configure_notification_scheme_notification_flag_order = -1;
static int hf_zbee_zcl_met_configure_notification_flags_issuer_event_id = -1;
static int hf_zbee_zcl_met_configure_notification_flags_notification_scheme = -1;
static int hf_zbee_zcl_met_configure_notification_flags_notification_flag_attribute_id = -1;
static int hf_zbee_zcl_met_configure_notification_flags_bit_field_allocation_cluster_id = -1;
static int hf_zbee_zcl_met_configure_notification_flags_bit_field_allocation_manufacturer_code = -1;
static int hf_zbee_zcl_met_configure_notification_flags_bit_field_allocation_no_of_commands = -1;
static int hf_zbee_zcl_met_configure_notification_flags_bit_field_allocation_command_identifier = -1;
static int hf_zbee_zcl_met_get_notified_msg_notification_scheme = -1;
static int hf_zbee_zcl_met_get_notified_msg_notification_flag_attribute_id = -1;
static int hf_zbee_zcl_met_get_notified_msg_notification_flags = -1;
static int hf_zbee_zcl_met_supply_status_response_provider_id = -1;
static int hf_zbee_zcl_met_supply_status_response_issuer_event_id = -1;
static int hf_zbee_zcl_met_supply_status_response_implementation_date_time = -1;
static int hf_zbee_zcl_met_supply_status_response_supply_status_after_implementation = -1;
static int hf_zbee_zcl_met_snapshot_cause_general = -1;
static int hf_zbee_zcl_met_snapshot_cause_end_of_billing_period = -1;
static int hf_zbee_zcl_met_snapshot_cause_end_of_block_period = -1;
static int hf_zbee_zcl_met_snapshot_cause_change_of_tariff_information = -1;
static int hf_zbee_zcl_met_snapshot_cause_change_of_price_matrix = -1;
static int hf_zbee_zcl_met_snapshot_cause_change_of_block_thresholds = -1;
static int hf_zbee_zcl_met_snapshot_cause_change_of_cv = -1;
static int hf_zbee_zcl_met_snapshot_cause_change_of_cf = -1;
static int hf_zbee_zcl_met_snapshot_cause_change_of_calendar = -1;
static int hf_zbee_zcl_met_snapshot_cause_critical_peak_pricing = -1;
static int hf_zbee_zcl_met_snapshot_cause_manually_triggered_from_client = -1;
static int hf_zbee_zcl_met_snapshot_cause_end_of_resolve_period = -1;
static int hf_zbee_zcl_met_snapshot_cause_change_of_tenancy = -1;
static int hf_zbee_zcl_met_snapshot_cause_change_of_supplier = -1;
static int hf_zbee_zcl_met_snapshot_cause_change_of_meter_mode = -1;
static int hf_zbee_zcl_met_snapshot_cause_debt_payment = -1;
static int hf_zbee_zcl_met_snapshot_cause_scheduled_snapshot = -1;
static int hf_zbee_zcl_met_snapshot_cause_ota_firmware_download = -1;
static int hf_zbee_zcl_met_snapshot_cause_reserved = -1;
static int hf_zbee_zcl_met_snapshot_schedule_frequency = -1;
static int hf_zbee_zcl_met_snapshot_schedule_frequency_type = -1;
static int hf_zbee_zcl_met_snapshot_schedule_frequency_wild_card = -1;
static int* const zbee_zcl_met_snapshot_schedule_bits[] = {
&hf_zbee_zcl_met_snapshot_schedule_frequency,
&hf_zbee_zcl_met_snapshot_schedule_frequency_type,
&hf_zbee_zcl_met_snapshot_schedule_frequency_wild_card,
NULL
};
static int* const zbee_zcl_met_func_noti_flags[] = {
&hf_zbee_zcl_met_func_noti_flag_new_ota_firmware,
&hf_zbee_zcl_met_func_noti_flag_cbke_update_request,
&hf_zbee_zcl_met_func_noti_flag_time_sync,
&hf_zbee_zcl_met_func_noti_flag_stay_awake_request_han,
&hf_zbee_zcl_met_func_noti_flag_stay_awake_request_wan,
&hf_zbee_zcl_met_func_noti_flag_push_historical_metering_data_attribute_set,
&hf_zbee_zcl_met_func_noti_flag_push_historical_prepayment_data_attribute_set,
&hf_zbee_zcl_met_func_noti_flag_push_all_static_data_basic_cluster,
&hf_zbee_zcl_met_func_noti_flag_push_all_static_data_metering_cluster,
&hf_zbee_zcl_met_func_noti_flag_push_all_static_data_prepayment_cluster,
&hf_zbee_zcl_met_func_noti_flag_network_key_active,
&hf_zbee_zcl_met_func_noti_flag_display_message,
&hf_zbee_zcl_met_func_noti_flag_cancel_all_messages,
&hf_zbee_zcl_met_func_noti_flag_change_supply,
&hf_zbee_zcl_met_func_noti_flag_local_change_supply,
&hf_zbee_zcl_met_func_noti_flag_set_uncontrolled_flow_threshold,
&hf_zbee_zcl_met_func_noti_flag_tunnel_message_pending,
&hf_zbee_zcl_met_func_noti_flag_get_snapshot,
&hf_zbee_zcl_met_func_noti_flag_get_sampled_data,
&hf_zbee_zcl_met_func_noti_flag_new_sub_ghz_channel_masks_available,
&hf_zbee_zcl_met_func_noti_flag_energy_scan_pending,
&hf_zbee_zcl_met_func_noti_flag_channel_change_pending,
&hf_zbee_zcl_met_func_noti_flag_reserved,
NULL
};
static int* const zbee_zcl_met_noti_flags_2[] = {
&hf_zbee_zcl_met_noti_flag_2_publish_price,
&hf_zbee_zcl_met_noti_flag_2_publish_block_period,
&hf_zbee_zcl_met_noti_flag_2_publish_tariff_info,
&hf_zbee_zcl_met_noti_flag_2_publish_conversion_factor,
&hf_zbee_zcl_met_noti_flag_2_publish_calorific_value,
&hf_zbee_zcl_met_noti_flag_2_publish_co2_value,
&hf_zbee_zcl_met_noti_flag_2_publish_billing_period,
&hf_zbee_zcl_met_noti_flag_2_publish_consolidated_bill,
&hf_zbee_zcl_met_noti_flag_2_publish_price_matrix,
&hf_zbee_zcl_met_noti_flag_2_publish_block_thresholds,
&hf_zbee_zcl_met_noti_flag_2_publish_currency_conversion,
&hf_zbee_zcl_met_noti_flag_2_publish_credit_payment_info,
&hf_zbee_zcl_met_noti_flag_2_publish_cpp_event,
&hf_zbee_zcl_met_noti_flag_2_publish_tier_labels,
&hf_zbee_zcl_met_noti_flag_2_cancel_tariff,
&hf_zbee_zcl_met_noti_flag_2_reserved,
NULL
};
static int* const zbee_zcl_met_noti_flags_3[] = {
&hf_zbee_zcl_met_noti_flag_3_publish_calendar,
&hf_zbee_zcl_met_noti_flag_3_publish_special_days,
&hf_zbee_zcl_met_noti_flag_3_publish_seasons,
&hf_zbee_zcl_met_noti_flag_3_publish_week,
&hf_zbee_zcl_met_noti_flag_3_publish_day,
&hf_zbee_zcl_met_noti_flag_3_cancel_calendar,
&hf_zbee_zcl_met_noti_flag_3_reserved,
NULL
};
static int* const zbee_zcl_met_noti_flags_4[] = {
&hf_zbee_zcl_met_noti_flag_4_select_available_emergency_credit,
&hf_zbee_zcl_met_noti_flag_4_change_debt,
&hf_zbee_zcl_met_noti_flag_4_emergency_credit_setup,
&hf_zbee_zcl_met_noti_flag_4_consumer_top_up,
&hf_zbee_zcl_met_noti_flag_4_credit_adjustment,
&hf_zbee_zcl_met_noti_flag_4_change_payment_mode,
&hf_zbee_zcl_met_noti_flag_4_get_prepay_snapshot,
&hf_zbee_zcl_met_noti_flag_4_get_top_up_log,
&hf_zbee_zcl_met_noti_flag_4_set_low_credit_warning_level,
&hf_zbee_zcl_met_noti_flag_4_get_debt_repayment_log,
&hf_zbee_zcl_met_noti_flag_4_set_maximum_credit_limit,
&hf_zbee_zcl_met_noti_flag_4_set_overall_debt_cap,
&hf_zbee_zcl_met_noti_flag_4_reserved,
NULL
};
static int* const zbee_zcl_met_noti_flags_5[] = {
&hf_zbee_zcl_met_noti_flag_5_publish_change_of_tenancy,
&hf_zbee_zcl_met_noti_flag_5_publish_change_of_supplier,
&hf_zbee_zcl_met_noti_flag_5_request_new_password_1_response,
&hf_zbee_zcl_met_noti_flag_5_request_new_password_2_response,
&hf_zbee_zcl_met_noti_flag_5_request_new_password_3_response,
&hf_zbee_zcl_met_noti_flag_5_request_new_password_4_response,
&hf_zbee_zcl_met_noti_flag_5_update_site_id,
&hf_zbee_zcl_met_noti_flag_5_reset_battery_counter,
&hf_zbee_zcl_met_noti_flag_5_update_cin,
&hf_zbee_zcl_met_noti_flag_5_reserved,
NULL
};
static int* const zbee_zcl_met_snapshot_cause_flags[] = {
&hf_zbee_zcl_met_snapshot_cause_general,
&hf_zbee_zcl_met_snapshot_cause_end_of_billing_period,
&hf_zbee_zcl_met_snapshot_cause_end_of_block_period,
&hf_zbee_zcl_met_snapshot_cause_change_of_tariff_information,
&hf_zbee_zcl_met_snapshot_cause_change_of_price_matrix,
&hf_zbee_zcl_met_snapshot_cause_change_of_block_thresholds,
&hf_zbee_zcl_met_snapshot_cause_change_of_cv,
&hf_zbee_zcl_met_snapshot_cause_change_of_cf,
&hf_zbee_zcl_met_snapshot_cause_change_of_calendar,
&hf_zbee_zcl_met_snapshot_cause_critical_peak_pricing,
&hf_zbee_zcl_met_snapshot_cause_manually_triggered_from_client,
&hf_zbee_zcl_met_snapshot_cause_end_of_resolve_period,
&hf_zbee_zcl_met_snapshot_cause_change_of_tenancy,
&hf_zbee_zcl_met_snapshot_cause_change_of_supplier,
&hf_zbee_zcl_met_snapshot_cause_change_of_meter_mode,
&hf_zbee_zcl_met_snapshot_cause_debt_payment,
&hf_zbee_zcl_met_snapshot_cause_scheduled_snapshot,
&hf_zbee_zcl_met_snapshot_cause_ota_firmware_download,
&hf_zbee_zcl_met_snapshot_cause_reserved,
NULL
};
/* Initialize the subtree pointers */
static gint ett_zbee_zcl_met = -1;
static gint ett_zbee_zcl_met_func_noti_flags = -1;
static gint ett_zbee_zcl_met_noti_flags_2 = -1;
static gint ett_zbee_zcl_met_noti_flags_3 = -1;
static gint ett_zbee_zcl_met_noti_flags_4 = -1;
static gint ett_zbee_zcl_met_noti_flags_5 = -1;
static gint ett_zbee_zcl_met_snapshot_cause_flags = -1;
static gint ett_zbee_zcl_met_snapshot_schedule = -1;
static gint ett_zbee_zcl_met_schedule_snapshot_response_payload = -1;
static gint ett_zbee_zcl_met_schedule_snapshot_payload = -1;
static gint ett_zbee_zcl_met_mirror_noti_flag = -1;
static gint ett_zbee_zcl_met_bit_field_allocation = -1;
/*************************/
/* Function Bodies */
/*************************/
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*@param attr_id attribute identifier
*@param data_type attribute data type
*@param client_attr ZCL client
*/
static void
dissect_zcl_met_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr)
{
if (client_attr) {
switch (attr_id) {
/* applies to all SE clusters */
case ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_MET_CLNT:
proto_tree_add_item(tree, hf_zbee_zcl_met_attr_reporting_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
break;
case ZBEE_ZCL_ATTR_ID_MET_CLNT_FUNC_NOTI_FLAGS:
proto_item_append_text(tree, ", Functional Notification Flags");
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_met_func_noti_flags, ett_zbee_zcl_met_func_noti_flags, zbee_zcl_met_func_noti_flags, ENC_LITTLE_ENDIAN);
*offset += 4;
break;
case ZBEE_ZCL_ATTR_ID_MET_CLNT_NOTI_FLAGS_2:
proto_item_append_text(tree, ", Notification Flags 2");
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_met_noti_flags_2, ett_zbee_zcl_met_noti_flags_2, zbee_zcl_met_noti_flags_2, ENC_LITTLE_ENDIAN);
*offset += 4;
break;
case ZBEE_ZCL_ATTR_ID_MET_CLNT_NOTI_FLAGS_3:
proto_item_append_text(tree, ", Notification Flags 3");
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_met_noti_flags_3, ett_zbee_zcl_met_noti_flags_3, zbee_zcl_met_noti_flags_3, ENC_LITTLE_ENDIAN);
*offset += 4;
break;
case ZBEE_ZCL_ATTR_ID_MET_CLNT_NOTI_FLAGS_4:
proto_item_append_text(tree, ", Notification Flags 4");
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_met_noti_flags_4, ett_zbee_zcl_met_noti_flags_4, zbee_zcl_met_noti_flags_4, ENC_LITTLE_ENDIAN);
*offset += 4;
break;
case ZBEE_ZCL_ATTR_ID_MET_CLNT_NOTI_FLAGS_5:
proto_item_append_text(tree, ", Notification Flags 5");
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_met_noti_flags_5, ett_zbee_zcl_met_noti_flags_5, zbee_zcl_met_noti_flags_5, ENC_LITTLE_ENDIAN);
*offset += 4;
break;
default: /* Catch all */
dissect_zcl_attr_data(tvb, tree, offset, data_type, client_attr);
break;
}
}
else {
switch (attr_id) {
/* applies to all SE clusters */
case ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_MET:
proto_tree_add_item(tree, hf_zbee_zcl_met_attr_reporting_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
break;
default: /* Catch all */
dissect_zcl_attr_data(tvb, tree, offset, data_type, client_attr);
break;
}
}
} /*dissect_zcl_met_attr_data*/
/**
*This function manages the Start Sampling Response payload.
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void dissect_zcl_met_start_sampling_response(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Sample ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_start_sampling_response_sample_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
} /*dissect_zcl_met_start_sampling_response*/
/**
*ZigBee ZCL Metering cluster dissector for wireshark.
*
*@param tvb pointer to buffer containing raw packet.
*@param pinfo pointer to packet information fields
*@param tree pointer to data tree Wireshark uses to display packet.
*/
static int
dissect_zbee_zcl_met(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
proto_tree *payload_tree;
zbee_zcl_packet *zcl;
guint offset = 0;
guint8 cmd_id;
gint rem_len;
/* Reject the packet if data is NULL */
if (data == NULL)
return 0;
zcl = (zbee_zcl_packet *)data;
cmd_id = zcl->cmd_id;
/* Create a subtree for the ZCL Command frame, and add the command ID to it. */
if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_met_srv_rx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_met_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_met, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_MET_GET_PROFILE:
dissect_zcl_met_get_profile(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_REQUEST_MIRROR_RSP:
dissect_zcl_met_request_mirror_rsp(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_MIRROR_REMOVED:
dissect_zcl_met_mirror_removed(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_REQUEST_FAST_POLL_MODE:
dissect_zcl_met_request_fast_poll_mode(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_SCHEDULE_SNAPSHOT:
dissect_zcl_met_schedule_snapshot(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_TAKE_SNAPSHOT:
dissect_zcl_met_take_snapshot(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_GET_SNAPSHOT:
dissect_zcl_met_get_snapshot(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_START_SAMPLING:
dissect_zcl_met_start_sampling(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_GET_SAMPLED_DATA:
dissect_zcl_met_get_sampled_data(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_MIRROR_REPORT_ATTRIBUTE_RESPONSE:
dissect_zcl_met_mirror_report_attribute_response(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_RESET_LOAD_LIMIT_COUNTER:
dissect_zcl_met_reset_load_limit_counter(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_CHANGE_SUPPLY:
dissect_zcl_met_change_supply(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_LOCAL_CHANGE_SUPPLY:
dissect_zcl_met_local_change_supply(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_SET_SUPPLY_STATUS:
dissect_zcl_met_set_supply_status(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_SET_UNCONTROLLED_FLOW_THRESHOLD:
dissect_zcl_met_set_uncontrolled_flow_threshold(tvb, payload_tree, &offset);
break;
default:
break;
}
}
}
else { /* ZBEE_ZCL_FCF_TO_CLIENT */
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_met_srv_tx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_met_srv_tx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_met, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_MET_GET_PROFILE_RESPONSE:
dissect_zcl_met_get_profile_response(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_REQUEST_MIRROR:
/* No payload */
break;
case ZBEE_ZCL_CMD_ID_MET_REMOVE_MIRROR:
/* No payload */
break;
case ZBEE_ZCL_CMD_ID_MET_REQUEST_FAST_POLL_MODE_RESPONSE:
dissect_zcl_met_request_fast_poll_mode_response(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_SCHEDULE_SNAPSHOT_RESPONSE:
dissect_zcl_met_schedule_snapshot_response(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_TAKE_SNAPSHOT_RESPONSE:
dissect_zcl_met_take_snapshot_response(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_PUBLISH_SNAPSHOT:
dissect_zcl_met_publish_snapshot(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_GET_SAMPLED_DATA_RSP:
dissect_zcl_met_get_sampled_data_rsp(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_CONFIGURE_MIRROR:
dissect_zcl_met_configure_mirror(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_CONFIGURE_NOTIFICATION_SCHEME:
dissect_zcl_met_configure_notification_scheme(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_CONFIGURE_NOTIFICATION_FLAGS:
dissect_zcl_met_configure_notification_flags(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_GET_NOTIFIED_MESSAGE:
dissect_zcl_met_get_notified_msg(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_SUPPLY_STATUS_RESPONSE:
dissect_zcl_met_supply_status_response(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MET_START_SAMPLING_RESPONSE:
dissect_zcl_met_start_sampling_response(tvb, payload_tree, &offset);
break;
default:
break;
}
}
}
return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_met*/
/**
*This function manages the Get Profile payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_get_profile(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t end_time;
/* Interval Channel */
proto_tree_add_item(tree, hf_zbee_zcl_met_get_profile_interval_channel, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* End Time */
end_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
end_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_met_get_profile_end_time, tvb, *offset, 4, &end_time);
*offset += 4;
/* Number of Periods */
proto_tree_add_item(tree, hf_zbee_zcl_met_get_profile_number_of_periods, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_met_get_profile*/
/**
*This function manages the Request Mirror Response payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_request_mirror_rsp(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* EndPoint ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_request_mirror_rsp_endpoint_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
} /*dissect_zcl_met_request_mirror_rsp*/
/**
*This function manages the Mirror Removed payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_mirror_removed(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Removed EndPoint ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_mirror_removed_removed_endpoint_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
} /*dissect_zcl_met_mirror_removed*/
/**
*This function manages the Request Fast Poll Mode payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_request_fast_poll_mode(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Fast Poll Update Period */
proto_tree_add_item(tree, hf_zbee_zcl_met_request_fast_poll_mode_fast_poll_update_period, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Duration */
proto_tree_add_item(tree, hf_zbee_zcl_met_request_fast_poll_mode_duration, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_met_request_fast_poll_mode*/
/**
*This function manages the Schedule Snapshot payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_schedule_snapshot(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
/* Issue Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_schedule_snapshot_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Command Index */
proto_tree_add_item(tree, hf_zbee_zcl_met_schedule_snapshot_command_index, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Total Number of Commands */
proto_tree_add_item(tree, hf_zbee_zcl_met_schedule_snapshot_total_number_of_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Snapshot Schedule Payload */
proto_tree *payload_tree;
payload_tree = proto_tree_add_subtree(tree, tvb, *offset, 13,
ett_zbee_zcl_met_schedule_snapshot_payload, NULL, "Snapshot Schedule Payload");
/* Snapshot Schedule ID */
proto_tree_add_item(payload_tree, hf_zbee_zcl_met_schedule_snapshot_snapshot_schedule_payload_snapshot_schedule_id,
tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Snapshot Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_met_schedule_snapshot_snapshot_schedule_payload_snapshot_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Snapshot Schedule */
proto_tree_add_bitmask(payload_tree, tvb, *offset, hf_zbee_zcl_met_schedule_snapshot_snapshot_schedule_payload_snapshot_schedule,
ett_zbee_zcl_met_snapshot_schedule,
zbee_zcl_met_snapshot_schedule_bits, ENC_LITTLE_ENDIAN);
*offset += 3;
/* Snapshot Payload Type */
proto_tree_add_item(payload_tree, hf_zbee_zcl_met_schedule_snapshot_snapshot_schedule_payload_shapshot_payload_type,
tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Snapshot Cause */
proto_tree_add_bitmask(payload_tree, tvb, *offset, hf_zbee_zcl_met_schedule_snapshot_snapshot_schedule_payload_snapshot_cause,
ett_zbee_zcl_met_snapshot_cause_flags, zbee_zcl_met_snapshot_cause_flags, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_met_schedule_snapshot*/
/**
*This function manages the Take Snapshot payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_take_snapshot(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Snapshot Cause */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_met_take_snapshot_snapshot_cause,
ett_zbee_zcl_met_snapshot_cause_flags, zbee_zcl_met_snapshot_cause_flags, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_met_take_snapshot*/
/**
*This function manages the Get Snapshot payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_get_snapshot(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
nstime_t end_time;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_met_get_snapshot_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
if (gPREF_zbee_se_protocol_version >= ZBEE_SE_VERSION_1_2) {
/* End Time - Introduced from ZCL version 1.2 */
end_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
end_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_met_get_snapshot_end_time, tvb, *offset, 4, &end_time);
*offset += 4;
}
/* Snapshot Offset */
proto_tree_add_item(tree, hf_zbee_zcl_met_get_snapshot_snapshot_offset, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Snapshot Cause */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_met_get_snapshot_snapshot_cause,
ett_zbee_zcl_met_snapshot_cause_flags, zbee_zcl_met_snapshot_cause_flags, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_met_get_snapshot*/
/**
*This function manages the Start Sampling payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_start_sampling(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t sample_time;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_start_sampling_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Start Sampling Time */
sample_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
sample_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_met_start_sampling_start_sampling_time, tvb, *offset, 4, &sample_time);
*offset += 4;
/* Sample Type */
proto_tree_add_item(tree, hf_zbee_zcl_met_start_sampling_sample_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Sample Request Interval */
proto_tree_add_item(tree, hf_zbee_zcl_met_start_sampling_sample_request_interval, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Max Number of Samples */
proto_tree_add_item(tree, hf_zbee_zcl_met_start_sampling_max_number_of_samples, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
} /*dissect_zcl_met_start_sampling*/
/**
*This function manages the Get Sampled Data payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_get_sampled_data(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t sample_time;
/* Sample ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_get_sampled_data_sample_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Sample Start Time */
sample_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
sample_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_met_get_sampled_data_sample_start_time, tvb, *offset, 4, &sample_time);
*offset += 4;
/* Sample Type */
proto_tree_add_item(tree, hf_zbee_zcl_met_get_sampled_data_sample_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Number of Samples */
proto_tree_add_item(tree, hf_zbee_zcl_met_get_sampled_data_number_of_samples, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
} /*dissect_zcl_met_get_sampled_data*/
/**
*This function manages the Mirror Report Attribute Response payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_mirror_report_attribute_response(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
guint8 notif_scheme_type;
gint noti_flags_count;
notif_scheme_type = tvb_get_guint8(tvb, *offset);
/* Notification Scheme */
proto_tree_add_item(tree, hf_zbee_zcl_met_mirror_report_attribute_response_notification_scheme, tvb, *offset, 1, ENC_NA);
*offset += 1;
switch(notif_scheme_type) {
case ZBEE_ZCL_MET_NOTIFICATION_SCHEME_A:
noti_flags_count = 1;
break;
case ZBEE_ZCL_MET_NOTIFICATION_SCHEME_B:
noti_flags_count = 5;
break;
default:
noti_flags_count = -1;
break;
}
if (noti_flags_count > 0) {
for (guint16 noti_flags_number = 0; noti_flags_number < noti_flags_count; noti_flags_number++) {
dissect_zcl_met_notification_flags(tvb, tree, offset, noti_flags_number);
}
} else {
/* Notification Flag */
while (tvb_reported_length_remaining(tvb, *offset) > 0) {
proto_tree *notification_flag_tree;
notification_flag_tree = proto_tree_add_subtree(tree, tvb, *offset, 4, ett_zbee_zcl_met_mirror_noti_flag, NULL, "Notification Flags");
proto_tree_add_item(notification_flag_tree, hf_zbee_zcl_met_mirror_report_attribute_response_notification_flags_n,
tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
}
}
} /*dissect_zcl_met_mirror_report_attribute_response*/
/**
*This function manages the Reset Load Limit Counter payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_reset_load_limit_counter(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_reset_load_limit_counter_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_reset_load_limit_counter_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_met_reset_load_limit_counter*/
/**
*This function manages the Change Supply payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_change_supply(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t request_time;
nstime_t implementation_time;
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_change_supply_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_change_supply_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Request Date/Time */
request_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
request_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_met_change_supply_request_date_time, tvb, *offset, 4, &request_time);
*offset += 4;
/* Implementation Date/Time */
implementation_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
implementation_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_met_change_supply_implementation_date_time, tvb, *offset, 4, &implementation_time);
*offset += 4;
/* Proposed Supple Status */
proto_tree_add_item(tree, hf_zbee_zcl_met_change_supply_proposed_supply_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Supple Control Bits */
proto_tree_add_item(tree, hf_zbee_zcl_met_change_supply_supply_control_bits, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_met_change_supply*/
/**
*This function manages the Local Change Supply payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_local_change_supply(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Proposed Supply Status */
proto_tree_add_item(tree, hf_zbee_zcl_met_local_change_supply_proposed_supply_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_met_local_change_supply*/
/**
*This function manages the Set Supply Status payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_set_supply_status(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_set_supply_status_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Supply Tamper State */
proto_tree_add_item(tree, hf_zbee_zcl_met_set_supply_status_supply_tamper_state, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Supply Depletion State */
proto_tree_add_item(tree, hf_zbee_zcl_met_set_supply_status_supply_depletion_state, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Supply Uncontrolled Flow State */
proto_tree_add_item(tree, hf_zbee_zcl_met_set_supply_status_supply_uncontrolled_flow_state, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Load Limit Supply State */
proto_tree_add_item(tree, hf_zbee_zcl_met_set_supply_status_load_limit_supply_state, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_met_set_supply_status*/
/**
*This function manages the Set Uncontrolled Flow Threshold payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_set_uncontrolled_flow_threshold(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_set_uncontrolled_flow_threshold_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_set_uncontrolled_flow_threshold_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Uncontrolled Flow Threshold */
proto_tree_add_item(tree, hf_zbee_zcl_met_set_uncontrolled_flow_threshold_uncontrolled_flow_threshold, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Unit of Measure */
proto_tree_add_item(tree, hf_zbee_zcl_met_set_uncontrolled_flow_threshold_unit_of_measure, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Multiplier */
proto_tree_add_item(tree, hf_zbee_zcl_met_set_uncontrolled_flow_threshold_multiplier, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Divisor */
proto_tree_add_item(tree, hf_zbee_zcl_met_set_uncontrolled_flow_threshold_divisor, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Stabilisation Period */
proto_tree_add_item(tree, hf_zbee_zcl_met_set_uncontrolled_flow_threshold_stabilisation_period, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Measurement Period */
proto_tree_add_item(tree, hf_zbee_zcl_met_set_uncontrolled_flow_threshold_measurement_period, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
} /*dissect_zcl_met_set_uncontrolled_flow_threshold*/
/**
*This function manages the Get Profile Response payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_get_profile_response(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t end_time;
/* End Time */
end_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
end_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_met_get_profile_response_end_time, tvb, *offset, 4, &end_time);
*offset += 4;
/* Status */
proto_tree_add_item(tree, hf_zbee_zcl_met_get_profile_response_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Profile Interval Period */
proto_tree_add_item(tree, hf_zbee_zcl_met_get_profile_response_profile_interval_period, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Number of Periods Delivered */
proto_tree_add_item(tree, hf_zbee_zcl_met_get_profile_response_number_of_periods_delivered, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Intervals */
while (tvb_reported_length_remaining(tvb, *offset) > 0) {
proto_tree_add_item(tree, hf_zbee_zcl_met_get_profile_response_intervals, tvb, *offset, 3, ENC_LITTLE_ENDIAN);
*offset += 3;
}
} /*dissect_zcl_met_get_profile_response*/
/**
*This function manages the Request Fast Poll Mode Response payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_request_fast_poll_mode_response(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Applied Update Period */
proto_tree_add_item(tree, hf_zbee_zcl_met_request_fast_poll_mode_response_applied_update_period, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Fast Poll End Time */
proto_tree_add_item(tree, hf_zbee_zcl_met_request_fast_poll_mode_response_fast_poll_mode_end_time, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_met_request_fast_poll_mode_response*/
/**
*This function manages the Schedule Snapshot Response payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_schedule_snapshot_response(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_schedule_snapshot_response_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
while (tvb_reported_length_remaining(tvb, *offset) > 0) {
proto_tree *payload_tree;
payload_tree = proto_tree_add_subtree(tree, tvb, *offset, 2,
ett_zbee_zcl_met_schedule_snapshot_response_payload, NULL, "Snapshot Response Payload");
/* Snapshot Schedule ID */
proto_tree_add_item(payload_tree, hf_zbee_zcl_met_schedule_snapshot_response_snapshot_schedule_id, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Snapshot Schedule Confirmation */
proto_tree_add_item(payload_tree, hf_zbee_zcl_met_schedule_snapshot_response_snapshot_schedule_confirmation, tvb, *offset, 1, ENC_NA);
*offset += 1;
}
} /*dissect_zcl_met_schedule_snapshot_response*/
/**
*This function manages the Take Snapshot Response payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_take_snapshot_response(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Snapshot ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_take_snapshot_response_snapshot_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Snapshot Confirmation */
proto_tree_add_item(tree, hf_zbee_zcl_met_take_snapshot_response_snapshot_confirmation, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_met_take_snapshot_response*/
/**
*This function manages the Publish Snapshot payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_publish_snapshot(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t snapshot_time;
gint rem_len;
/* Snapshot ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_publish_snapshot_snapshot_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Snapshot Time */
snapshot_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
snapshot_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_met_publish_snapshot_snapshot_time, tvb, *offset, 4, &snapshot_time);
*offset += 4;
/* Total Snapshots Found */
proto_tree_add_item(tree, hf_zbee_zcl_met_publish_snapshot_snapshots_found, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Command Index */
proto_tree_add_item(tree, hf_zbee_zcl_met_publish_snapshot_cmd_index, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Total Number of Commands */
proto_tree_add_item(tree, hf_zbee_zcl_met_publish_snapshot_total_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Snapshot Cause */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_met_publish_snapshot_snapshot_cause,
ett_zbee_zcl_met_snapshot_cause_flags, zbee_zcl_met_snapshot_cause_flags, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Snapshot Payload Type */
proto_tree_add_item(tree, hf_zbee_zcl_met_publish_snapshot_snapshot_payload_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Snapshot Sub-Payload */
rem_len = tvb_reported_length_remaining(tvb, *offset);
proto_tree_add_item(tree, hf_zbee_zcl_met_publish_snapshot_snapshot_sub_payload, tvb, *offset, rem_len, ENC_NA);
*offset += rem_len;
} /*dissect_zcl_met_publish_snapshot*/
/**
*This function manages the Get Sampled Data Response payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_get_sampled_data_rsp(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t sample_start_time;
gint rem_len;
/* Snapshot ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_get_sampled_data_rsp_sample_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Sample Start Time */
sample_start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
sample_start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_met_get_sampled_data_rsp_sample_start_time, tvb, *offset, 4, &sample_start_time);
*offset += 4;
/* Sample Type */
proto_tree_add_item(tree, hf_zbee_zcl_met_get_sampled_data_rsp_sample_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Sample Request Interval */
proto_tree_add_item(tree, hf_zbee_zcl_met_get_sampled_data_rsp_sample_request_interval, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Number of Samples */
proto_tree_add_item(tree, hf_zbee_zcl_met_get_sampled_data_rsp_sample_number_of_samples, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Samples */
rem_len = tvb_reported_length_remaining(tvb, *offset);
while (rem_len >= 3) {
guint32 val = tvb_get_guint24(tvb, *offset, ENC_LITTLE_ENDIAN);
proto_tree_add_uint(tree, hf_zbee_zcl_met_get_sampled_data_rsp_sample_samples, tvb, *offset, 3, val);
*offset += 3;
rem_len -= 3;
}
} /*dissect_zcl_met_get_sampled_data_rsp*/
/**
*This function manages the Configure Mirror payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_configure_mirror(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_configure_mirror_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Reporting Interval */
proto_tree_add_item(tree, hf_zbee_zcl_met_configure_mirror_reporting_interval, tvb, *offset, 3, ENC_LITTLE_ENDIAN);
*offset += 3;
/* Mirror Notification Reporting */
proto_tree_add_item(tree, hf_zbee_zcl_met_configure_mirror_mirror_notification_reporting, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Notification Scheme */
proto_tree_add_item(tree, hf_zbee_zcl_met_configure_mirror_notification_scheme, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_met_configure_mirror*/
/**
*This function manages the Configure Notification Scheme payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_configure_notification_scheme(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_configure_notification_scheme_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Notification Scheme */
proto_tree_add_item(tree, hf_zbee_zcl_met_configure_notification_scheme_notification_scheme, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Notification Flag Order */
proto_tree_add_item(tree, hf_zbee_zcl_met_configure_notification_scheme_notification_flag_order, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_met_configure_notification_scheme*/
/**
*This function manages the Configure Notification Flags payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_configure_notification_flags(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
proto_tree *bit_field_allocation_tree;
gint rem_len;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_configure_notification_flags_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Notification Scheme */
proto_tree_add_item(tree, hf_zbee_zcl_met_configure_notification_flags_notification_scheme, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Notification Attribute ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_configure_notification_flags_notification_flag_attribute_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
bit_field_allocation_tree = proto_tree_add_subtree(tree, tvb, *offset, -1, ett_zbee_zcl_met_bit_field_allocation, NULL, "Bit Field Allocation");
/* Cluster ID */
proto_tree_add_item(bit_field_allocation_tree, hf_zbee_zcl_met_configure_notification_flags_bit_field_allocation_cluster_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Manufacturer Code */
proto_tree_add_item(bit_field_allocation_tree, hf_zbee_zcl_met_configure_notification_flags_bit_field_allocation_manufacturer_code, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* No. of Commands */
proto_tree_add_item(bit_field_allocation_tree, hf_zbee_zcl_met_configure_notification_flags_bit_field_allocation_no_of_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
rem_len = tvb_reported_length_remaining(tvb, *offset);
while (rem_len >= 1) {
/* Command Identifier */
proto_tree_add_item(bit_field_allocation_tree, hf_zbee_zcl_met_configure_notification_flags_bit_field_allocation_command_identifier, tvb, *offset, 1, ENC_NA);
*offset += 1;
rem_len -= 1;
}
} /*dissect_zcl_met_configure_notification_flags*/
static void
dissect_zcl_met_notification_flags(tvbuff_t *tvb, proto_tree *tree, guint *offset, guint16 noti_flags_number)
{
/* Notification Flags #N */
switch (noti_flags_number) {
case ZBEE_ZCL_ATTR_ID_MET_CLNT_FUNC_NOTI_FLAGS:
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_met_func_noti_flags, ett_zbee_zcl_met_func_noti_flags, zbee_zcl_met_func_noti_flags, ENC_LITTLE_ENDIAN);
break;
case ZBEE_ZCL_ATTR_ID_MET_CLNT_NOTI_FLAGS_2:
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_met_noti_flags_2, ett_zbee_zcl_met_noti_flags_2, zbee_zcl_met_noti_flags_2, ENC_LITTLE_ENDIAN);
break;
case ZBEE_ZCL_ATTR_ID_MET_CLNT_NOTI_FLAGS_3:
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_met_noti_flags_3, ett_zbee_zcl_met_noti_flags_3, zbee_zcl_met_noti_flags_3, ENC_LITTLE_ENDIAN);
break;
case ZBEE_ZCL_ATTR_ID_MET_CLNT_NOTI_FLAGS_4:
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_met_noti_flags_4, ett_zbee_zcl_met_noti_flags_4, zbee_zcl_met_noti_flags_4, ENC_LITTLE_ENDIAN);
break;
case ZBEE_ZCL_ATTR_ID_MET_CLNT_NOTI_FLAGS_5:
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_met_noti_flags_5, ett_zbee_zcl_met_noti_flags_5, zbee_zcl_met_noti_flags_5, ENC_LITTLE_ENDIAN);
break;
default:
proto_tree_add_item(tree, hf_zbee_zcl_met_get_notified_msg_notification_flags, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
break;
}
*offset += 4;
}
/**
*This function manages the Get Notified Message payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_get_notified_msg(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
guint16 noti_flags_number;
/* Notification Scheme */
proto_tree_add_item(tree, hf_zbee_zcl_met_get_notified_msg_notification_scheme, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Notification Flag attribute ID */
noti_flags_number = tvb_get_guint16(tvb, *offset, ENC_LITTLE_ENDIAN);
proto_tree_add_item(tree, hf_zbee_zcl_met_get_notified_msg_notification_flag_attribute_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
dissect_zcl_met_notification_flags(tvb, tree, offset, noti_flags_number);
} /*dissect_zcl_met_get_notified_msg*/
/**
*This function manages the Supply Status Response payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_met_supply_status_response(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t implementation_date_time;
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_supply_status_response_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_met_supply_status_response_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Implementation Date/Time */
implementation_date_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
implementation_date_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_met_supply_status_response_implementation_date_time, tvb, *offset, 4, &implementation_date_time);
*offset += 4;
/* Supply Status After Implementation */
proto_tree_add_item(tree, hf_zbee_zcl_met_supply_status_response_supply_status_after_implementation, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_met_supply_status_response*/
/**
*This function registers the ZCL Metering dissector
*
*/
void
proto_register_zbee_zcl_met(void)
{
static hf_register_info hf[] = {
{ &hf_zbee_zcl_met_attr_server_id,
{ "Attribute", "zbee_zcl_se.met.attr_id", FT_UINT16, BASE_HEX | BASE_EXT_STRING, &zbee_zcl_met_attr_server_names_ext,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_met_attr_client_id,
{ "Attribute", "zbee_zcl_se.met.attr_client_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_met_attr_client_names),
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_met_attr_reporting_status, /* common to all SE clusters */
{ "Attribute Reporting Status", "zbee_zcl_se.met.attr.attr_reporting_status",
FT_UINT8, BASE_HEX, VALS(zbee_zcl_se_reporting_status_names), 0x00, NULL, HFILL } },
/* Functional Notification Flags */
{ &hf_zbee_zcl_met_func_noti_flags,
{ "Functional Notification Flags", "zbee_zcl_se.met.attr.func_noti_flag", FT_UINT32, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_new_ota_firmware,
{ "New OTA Firmware", "zbee_zcl_se.met.attr.func_noti_flag.new_ota_firmware", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_NEW_OTA_FIRMWARE, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_cbke_update_request,
{ "CBKE Update Request", "zbee_zcl_se.met.attr.func_noti_flag.cbke_update_request", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_CBKE_UPDATE_REQUESTED, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_time_sync,
{ "Time Sync", "zbee_zcl_se.met.attr.func_noti_flag.time_sync", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_TIME_SYNC, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_stay_awake_request_han,
{ "Stay Awake Request HAN", "zbee_zcl_se.met.attr.func_noti_flag.stay_awake_request_han", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_STAY_AWAKE_REQUEST_HAN, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_stay_awake_request_wan,
{ "Stay Awake Request WAN", "zbee_zcl_se.met.attr.func_noti_flag.stay_awake_request_wan", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_STAY_AWAKE_REQUEST_WAN, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_push_historical_metering_data_attribute_set,
{ "Push Historical Metering Data Attribute Set", "zbee_zcl_se.met.attr.func_noti_flag.push_historical_metering_data_attribute_set", FT_UINT32, BASE_HEX, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_PUSH_HISTORICAL_METERING_DATA_ATTRIBUTE_SET, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_push_historical_prepayment_data_attribute_set,
{ "Push Historical Prepayment Data Attribute Set", "zbee_zcl_se.met.attr.func_noti_flag.push_historical_prepayment_data_attribute_set", FT_UINT32, BASE_HEX, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_PUSH_HISTORICAL_PREPAYMENT_DATA_ATTRIBUTE_SET, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_push_all_static_data_basic_cluster,
{ "Push All Static Data - Basic Cluster", "zbee_zcl_se.met.attr.func_noti_flag.push_all_static_data_basic_cluster", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_PUSH_ALL_STATIC_DATA_BASIC_CLUSTER, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_push_all_static_data_metering_cluster,
{ "Push All Static Data - Metering Cluster", "zbee_zcl_se.met.attr.func_noti_flag.push_all_static_data_metering_cluster", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_PUSH_ALL_STATIC_DATA_METERING_CLUSTER, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_push_all_static_data_prepayment_cluster,
{ "Push All Static Data - Prepayment Cluster", "zbee_zcl_se.met.attr.func_noti_flag.push_all_static_data_prepayment_cluster", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_PUSH_ALL_STATIC_DATA_PREPAYMENT_CLUSTER, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_network_key_active,
{ "Network Key Active", "zbee_zcl_se.met.attr.func_noti_flag.network_key_active", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_NETWORK_KEY_ACTIVE, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_display_message,
{ "Display Message", "zbee_zcl_se.met.attr.func_noti_flag.display_message", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_DISPLAY_MESSAGE, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_cancel_all_messages,
{ "Cancel All Messages", "zbee_zcl_se.met.attr.func_noti_flag.cancel_all_messages", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_CANCEL_ALL_MESSAGES, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_change_supply,
{ "Change Supply", "zbee_zcl_se.met.attr.func_noti_flag.change_supply", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_CHANGE_SUPPLY, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_local_change_supply,
{ "Local Change Supply", "zbee_zcl_se.met.attr.func_noti_flag.local_change_supply", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_LOCAL_CHANGE_SUPPLY, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_set_uncontrolled_flow_threshold,
{ "Set Uncontrolled Flow Threshold", "zbee_zcl_se.met.attr.func_noti_flag.set_uncontrolled_flow_threshold", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_SET_UNCONTROLLED_FLOW_THRESHOLD, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_tunnel_message_pending,
{ "Tunnel Message Pending", "zbee_zcl_se.met.attr.func_noti_flag.tunnel_message_pending", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_TUNNEL_MESSAGE_PENDING, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_get_snapshot,
{ "Get Snapshot", "zbee_zcl_se.met.attr.func_noti_flag.get_snapshot", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_GET_SNAPSHOT, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_get_sampled_data,
{ "Get Sampled Data", "zbee_zcl_se.met.attr.func_noti_flag.get_sampled_data", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_GET_SAMPLED_DATA, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_new_sub_ghz_channel_masks_available,
{ "New Sub-GHz Channel Masks Available", "zbee_zcl_se.met.attr.func_noti_flag.new_sub_ghz_channel_masks_available", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_NEW_SUB_GHZ_CHANNEL_MASKS_AVAILABLE, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_energy_scan_pending,
{ "Energy Scan Pending", "zbee_zcl_se.met.attr.func_noti_flag.energy_scan_pending", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_ENERGY_SCAN_PENDING, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_channel_change_pending,
{ "Channel Change Pending", "zbee_zcl_se.met.attr.func_noti_flag.channel_change_pending", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_CHANNEL_CHANGE_PENDING, NULL, HFILL } },
{ &hf_zbee_zcl_met_func_noti_flag_reserved,
{ "Reserved", "zbee_zcl_se.met.attr.func_noti_flag.reserved", FT_UINT32, BASE_HEX, NULL,
ZBEE_ZCL_FUNC_NOTI_FLAG_RESERVED_1 | ZBEE_ZCL_FUNC_NOTI_FLAG_RESERVED_2, NULL, HFILL } },
/* Notification Flags 2 */
{ &hf_zbee_zcl_met_noti_flags_2,
{ "Notification Flags 2", "zbee_zcl_se.met.attr.noti_flag_2", FT_UINT32, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_2_publish_price,
{ "Publish Price", "zbee_zcl_se.met.attr.noti_flag_2.publish_price", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_PRICE, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_2_publish_block_period,
{ "Publish Block Period", "zbee_zcl_se.met.attr.noti_flag_2.publish_block_period", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_BLOCK_PERIOD, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_2_publish_tariff_info,
{ "Publish Tariff Information", "zbee_zcl_se.met.attr.noti_flag_2.publish_tariff_info", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_TARIFF_INFORMATION, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_2_publish_conversion_factor,
{ "Publish Conversion Factor", "zbee_zcl_se.met.attr.noti_flag_2.publish_conversion_factor", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_CONVERSION_FACTOR, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_2_publish_calorific_value,
{ "Publish Calorific Value", "zbee_zcl_se.met.attr.noti_flag_2.publish_calorific_value", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_CALORIFIC_VALUE, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_2_publish_co2_value,
{ "Publish CO2 Value", "zbee_zcl_se.met.attr.noti_flag_2.publish_co2_value", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_CO2_VALUE, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_2_publish_billing_period,
{ "Publish Billing Period", "zbee_zcl_se.met.attr.noti_flag_2.publish_billing_period", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_BILLING_PERIOD, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_2_publish_consolidated_bill,
{ "Publish Consolidated Bill", "zbee_zcl_se.met.attr.noti_flag_2.publish_consolidated_bill", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_CONSOLIDATED_BILL, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_2_publish_price_matrix,
{ "Publish Price Matrix", "zbee_zcl_se.met.attr.noti_flag_2.publish_price_matrix", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_PRICE_MATRIX, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_2_publish_block_thresholds,
{ "Publish Block Thresholds", "zbee_zcl_se.met.attr.noti_flag_2.publish_block_thresholds", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_BLOCK_THRESHOLDS, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_2_publish_currency_conversion,
{ "Publish Currency Conversion", "zbee_zcl_se.met.attr.noti_flag_2.publish_currency_conversion", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_CURRENCY_CONVERSION, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_2_publish_credit_payment_info,
{ "Publish Credit Payment Info", "zbee_zcl_se.met.attr.noti_flag_2.publish_credit_payment_info", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_CREDIT_PAYMENT_INFO, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_2_publish_cpp_event,
{ "Publish CPP Event", "zbee_zcl_se.met.attr.noti_flag_2.publish_cpp_event", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_CPP_EVENT, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_2_publish_tier_labels,
{ "Publish Tier Labels", "zbee_zcl_se.met.attr.noti_flag_2.publish_tier_labels", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_2_PUBLISH_TIER_LABELS, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_2_cancel_tariff,
{ "Cancel Tariff", "zbee_zcl_se.met.attr.noti_flag_2.cancel_tariff", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_2_CANCEL_TARIFF, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_2_reserved,
{ "Reserved", "zbee_zcl_se.met.attr.noti_flag_2.reserved", FT_UINT32, BASE_HEX, NULL,
ZBEE_ZCL_NOTI_FLAG_2_RESERVED | ZBEE_ZCL_NOTI_FLAG_2_RESERVED_FUTURE, NULL, HFILL } },
/* Notification Flags 3 */
{ &hf_zbee_zcl_met_noti_flags_3,
{ "Notification Flags 3", "zbee_zcl_se.met.attr.noti_flag_3", FT_UINT32, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_3_publish_calendar,
{ "Publish Calendar", "zbee_zcl_se.met.attr.noti_flag_3.publish_calendar", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_3_PUBLISH_CALENDAR, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_3_publish_special_days,
{ "Publish Special Days", "zbee_zcl_se.met.attr.noti_flag_3.publish_special_days", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_3_PUBLISH_SPECIAL_DAYS, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_3_publish_seasons,
{ "Publish Seasons", "zbee_zcl_se.met.attr.noti_flag_3.publish_seasons", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_3_PUBLISH_SEASONS, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_3_publish_week,
{ "Publish Week", "zbee_zcl_se.met.attr.noti_flag_3.publish_week", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_3_PUBLISH_WEEK, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_3_publish_day,
{ "Publish Day", "zbee_zcl_se.met.attr.noti_flag_3.publish_day", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_3_PUBLISH_DAY, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_3_cancel_calendar,
{ "Cancel Calendar", "zbee_zcl_se.met.attr.noti_flag_3.cancel_calendar", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_3_CANCEL_DAY, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_3_reserved,
{ "Reserved", "zbee_zcl_se.met.attr.noti_flag_3.reserved", FT_UINT32, BASE_HEX, NULL,
ZBEE_ZCL_NOTI_FLAG_3_RESERVED , NULL, HFILL } },
/* Notification Flags 4 */
{ &hf_zbee_zcl_met_noti_flags_4,
{ "Notification Flags 4", "zbee_zcl_se.met.attr.noti_flag_4", FT_UINT32, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_4_select_available_emergency_credit,
{ "Select Available Emergency Credit", "zbee_zcl_se.met.attr.noti_flag_4.select_available_emergency_credit", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_4_SELECT_AVAILABLE_EMERGENCY_CREDIT, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_4_change_debt,
{ "Change Debt", "zbee_zcl_se.met.attr.noti_flag_4.change_debt", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_4_CHANGE_DEBT, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_4_emergency_credit_setup,
{ "Emergency Credit Setup", "zbee_zcl_se.met.attr.noti_flag_4.emergency_credit_setup", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_4_EMERGENCY_CREDIT_SETUP, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_4_consumer_top_up,
{ "Consumer Top Up", "zbee_zcl_se.met.attr.noti_flag_4.consumer_top_up", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_4_CONSUMER_TOP_UP, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_4_credit_adjustment,
{ "Credit Adjustment", "zbee_zcl_se.met.attr.noti_flag_4.credit_adjustment", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_4_CREDIT_ADJUSTMENT, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_4_change_payment_mode,
{ "Change Payment Mode", "zbee_zcl_se.met.attr.noti_flag_4.change_payment_mode", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_4_CHANGE_PAYMENT_MODE, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_4_get_prepay_snapshot,
{ "Get Prepay Snapshot", "zbee_zcl_se.met.attr.noti_flag_4.get_prepay_snapshot", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_4_GET_PREPAY_SNAPSHOT, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_4_get_top_up_log,
{ "Get Top Up Log", "zbee_zcl_se.met.attr.noti_flag_4.get_top_up_log", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_4_GET_TOP_UP_LOG, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_4_set_low_credit_warning_level,
{ "Set Low Credit Warning Level", "zbee_zcl_se.met.attr.noti_flag_4.set_low_credit_warning_level", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_4_SET_LOW_CREDIT_WARNING_LEVEL, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_4_get_debt_repayment_log,
{ "Get Debt Repayment Log", "zbee_zcl_se.met.attr.noti_flag_4.get_debt_repayment_log", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_4_GET_DEBT_REPAYMENT_LOG, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_4_set_maximum_credit_limit,
{ "Set Maximum Credit Limit", "zbee_zcl_se.met.attr.noti_flag_4.set_maximum_credit_limit", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_4_SET_MAXIMUM_CREDIT_LIMIT, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_4_set_overall_debt_cap,
{ "Set Overall Debt Cap", "zbee_zcl_se.met.attr.noti_flag_4.set_overall_debt_cap", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_4_SET_OVERALL_DEBT_CAP, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_4_reserved,
{ "Reserved", "zbee_zcl_se.met.attr.noti_flag_4.reserved", FT_UINT32, BASE_HEX, NULL,
ZBEE_ZCL_NOTI_FLAG_4_RESERVED, NULL, HFILL } },
/* Notification Flags 5 */
{ &hf_zbee_zcl_met_noti_flags_5,
{ "Notification Flags 5", "zbee_zcl_se.met.attr.noti_flag_5", FT_UINT32, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_5_publish_change_of_tenancy,
{ "Publish Change of Tenancy", "zbee_zcl_se.met.attr.noti_flag_5.publish_change_of_tenancy", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_5_PUBLISH_CHANGE_OF_TENANCY, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_5_publish_change_of_supplier,
{ "Publish Change of Supplier", "zbee_zcl_se.met.attr.noti_flag_5.publish_change_of_supplier", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_5_PUBLISH_CHANGE_OF_SUPPLIER, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_5_request_new_password_1_response,
{ "Request New Password 1 Response", "zbee_zcl_se.met.attr.noti_flag_5.request_new_password_1_response", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_5_REQUEST_NEW_PASSWORD_1_RESPONSE, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_5_request_new_password_2_response,
{ "Request New Password 2 Response", "zbee_zcl_se.met.attr.noti_flag_5.request_new_password_2_response", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_5_REQUEST_NEW_PASSWORD_2_RESPONSE, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_5_request_new_password_3_response,
{ "Request New Password 3 Response", "zbee_zcl_se.met.attr.noti_flag_5.request_new_password_3_response", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_5_REQUEST_NEW_PASSWORD_3_RESPONSE, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_5_request_new_password_4_response,
{ "Request New Password 4 Response", "zbee_zcl_se.met.attr.noti_flag_5.request_new_password_4_response", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_5_REQUEST_NEW_PASSWORD_4_RESPONSE, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_5_update_site_id,
{ "Update Site ID", "zbee_zcl_se.met.attr.noti_flag_5.update_site_id", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_5_UPDATE_SITE_ID, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_5_reset_battery_counter,
{ "Reset Battery Counter", "zbee_zcl_se.met.attr.noti_flag_5.reset_battery_counter", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_5_RESET_BATTERY_COUNTER, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_5_update_cin,
{ "Update CIN", "zbee_zcl_se.met.attr.noti_flag_5.update_cin", FT_BOOLEAN, 32, NULL,
ZBEE_ZCL_NOTI_FLAG_5_UPDATE_CIN, NULL, HFILL } },
{ &hf_zbee_zcl_met_noti_flag_5_reserved,
{ "Reserved", "zbee_zcl_se.met.attr.noti_flag_5.reserved", FT_UINT32, BASE_HEX, NULL,
ZBEE_ZCL_NOTI_FLAG_5_RESERVED, NULL, HFILL } },
{ &hf_zbee_zcl_met_srv_tx_cmd_id,
{ "Command", "zbee_zcl_se.met.cmd.srv_tx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_met_srv_tx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_srv_rx_cmd_id,
{ "Command", "zbee_zcl_se.met.cmd.srv_rx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_met_srv_rx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_profile_interval_channel,
{ "Interval Channel", "zbee_zcl_se.met.get_profile.interval_channel", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_profile_end_time,
{ "End Time", "zbee_zcl_se.met.get_profile.end_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_profile_number_of_periods,
{ "Number of Periods", "zbee_zcl_se.met.get_profile.number_of_periods", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_request_mirror_rsp_endpoint_id,
{ "EndPoint ID", "zbee_zcl_se.met.request_mirror_rsp.endpoint_id", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_mirror_removed_removed_endpoint_id,
{ "Removed EndPoint ID", "zbee_zcl_se.met.mirror_removed.removed_endpoint_id", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_request_fast_poll_mode_fast_poll_update_period,
{ "Fast Poll Update Period", "zbee_zcl_se.met.request_fast_poll_mode.fast_poll_update_period", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_request_fast_poll_mode_duration,
{ "Duration", "zbee_zcl_se.met.request_fast_poll_mode.duration", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_schedule_snapshot_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.met.schedule_snapshot.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_schedule_snapshot_command_index,
{ "Command Index", "zbee_zcl_se.met.schedule_snapshot.command_index", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_schedule_snapshot_total_number_of_commands,
{ "Total Number of Commands", "zbee_zcl_se.met.schedule_snapshot.total_number_of_commands", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_schedule_snapshot_snapshot_schedule_payload_snapshot_schedule_id,
{ "Snapshot Schedule ID", "zbee_zcl_se.met.schedule_snapshot.snapshot_schedule_payload.snapshot_schedule_id", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_schedule_snapshot_snapshot_schedule_payload_snapshot_start_time,
{ "Snapshot Start Time", "zbee_zcl_se.met.schedule_snapshot.snapshot_schedule_payload.snapshot_start_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_schedule_snapshot_snapshot_schedule_payload_snapshot_schedule,
{ "Snapshot Schedule", "zbee_zcl_se.met.schedule_snapshot.snapshot_schedule_payload.snapshot_schedule", FT_UINT24, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_schedule_snapshot_snapshot_schedule_payload_shapshot_payload_type,
{ "Snapshot Payload Type", "zbee_zcl_se.met.schedule_snapshot.snapshot_schedule_payload.snapshot_payload_type",
FT_UINT8, BASE_DEC, VALS(zbee_zcl_met_snapshot_payload_type),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_schedule_snapshot_snapshot_schedule_payload_snapshot_cause,
{ "Snapshot Cause", "zbee_zcl_se.met.schedule_snapshot.snapshot_schedule_payload.snapshot_cause", FT_UINT32, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_schedule_frequency,
{ "Snapshot Schedule Frequency", "zbee_zcl_se.met.snapshot_schedule.frequency",
FT_UINT24, BASE_DEC, NULL,
0x0FFFFF, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_schedule_frequency_type,
{ "Snapshot Schedule Frequency Type", "zbee_zcl_se.met.snapshot_schedule.frequency_type",
FT_UINT24, BASE_HEX, VALS(zbee_zcl_met_snapshot_schedule_frequency_type),
0x300000, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_schedule_frequency_wild_card,
{ "Snapshot Schedule Frequency Wild Card", "zbee_zcl_se.met.snapshot_schedule.frequency_wild_card",
FT_UINT24, BASE_HEX,VALS(zbee_zcl_met_snapshot_schedule_frequency_wild_card),
0xC00000, NULL, HFILL } },
{ &hf_zbee_zcl_met_take_snapshot_snapshot_cause,
{ "Snapshot Cause", "zbee_zcl_se.met.take_snapshot.snapshot_cause", FT_UINT32, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_snapshot_start_time,
{ "Start Time", "zbee_zcl_se.met.get_snapshot.start_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_snapshot_end_time,
{ "End Time", "zbee_zcl_se.met.get_snapshot.end_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_snapshot_snapshot_offset,
{ "Snapshot Offset", "zbee_zcl_se.met.get_snapshot.snapshot_offset", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_snapshot_snapshot_cause,
{ "Snapshot Cause", "zbee_zcl_se.met.get_snapshot.snapshot_cause", FT_UINT32, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_start_sampling_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.met.start_sampling.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_start_sampling_start_sampling_time,
{ "Start Sampling Time", "zbee_zcl_se.met.start_sampling.start_sampling_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_start_sampling_sample_type,
{ "Sample Type", "zbee_zcl_se.met.start_sampling.sample_type", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_start_sampling_sample_request_interval,
{ "Sample Request Interval", "zbee_zcl_se.met.start_sampling.sample_request_interval", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_start_sampling_max_number_of_samples,
{ "Max Number of Samples", "zbee_zcl_se.met.start_sampling.max_number_of_samples", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_sampled_data_sample_id,
{ "Sample ID", "zbee_zcl_se.met.get_sampled_data.sample_id", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_sampled_data_sample_start_time,
{ "Sample Start Time", "zbee_zcl_se.met.get_sampled_data.sample_start_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_sampled_data_sample_type,
{ "Sample Type", "zbee_zcl_se.met.get_sampled_data.sample_type", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_sampled_data_number_of_samples,
{ "Number of Samples", "zbee_zcl_se.met.get_sampled_data.number_of_samples", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_start_sampling_response_sample_id,
{ "Sample ID", "zbee_zcl_se.met.start_sampling_response.sample_id", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_mirror_report_attribute_response_notification_scheme,
{ "Notification Scheme", "zbee_zcl_se.met.mirror_report_attribute_response.notification_scheme", FT_UINT8, BASE_HEX | BASE_RANGE_STRING, RVALS(zbee_zcl_met_notification_scheme),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_mirror_report_attribute_response_notification_flags_n,
{ "Notification Flag", "zbee_zcl_se.met.mirror_report_attribute_response.notification_flags_n", FT_UINT32, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_reset_load_limit_counter_provider_id,
{ "Provider ID", "zbee_zcl_se.met.reset_load_limit_counter.provider_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_reset_load_limit_counter_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.met.reset_load_limit_counter.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_change_supply_provider_id,
{ "Provider ID", "zbee_zcl_se.met.change_supply.provider_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_change_supply_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.met.change_supply.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_change_supply_request_date_time,
{ "Request Date/Time", "zbee_zcl_se.met.change_supply.request_date_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_change_supply_implementation_date_time,
{ "Implementation Date/Time", "zbee_zcl_se.met.change_supply.implementation_date_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_change_supply_proposed_supply_status,
{ "Proposed Supply Status", "zbee_zcl_se.met.change_supply.proposed_supply_status", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_change_supply_supply_control_bits,
{ "Supply Control bits", "zbee_zcl_se.met.change_supply.supply_control_bits", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_local_change_supply_proposed_supply_status,
{ "Proposed Supply Status", "zbee_zcl_se.met.local_change_supply.proposed_supply_status", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_set_supply_status_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.met.set_supply_status.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_set_supply_status_supply_tamper_state,
{ "Supply Tamper State", "zbee_zcl_se.met.set_supply_status.supply_tamper_state", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_set_supply_status_supply_depletion_state,
{ "Supply Depletion State", "zbee_zcl_se.met.set_supply_status.supply_depletion_state", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_set_supply_status_supply_uncontrolled_flow_state,
{ "Supply Uncontrolled Flow State", "zbee_zcl_se.met.set_supply_status.supply_uncontrolled_flow_state", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_set_supply_status_load_limit_supply_state,
{ "Load Limit Supply State", "zbee_zcl_se.met.set_supply_status.load_limit_supply_state", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_set_uncontrolled_flow_threshold_provider_id,
{ "Provider ID", "zbee_zcl_se.met.set_uncontrolled_flow_threshold.provider_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_set_uncontrolled_flow_threshold_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.met.set_uncontrolled_flow_threshold.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_set_uncontrolled_flow_threshold_uncontrolled_flow_threshold,
{ "Uncontrolled Flow Threshold", "zbee_zcl_se.met.set_uncontrolled_flow_threshold.uncontrolled_flow_threshold", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_set_uncontrolled_flow_threshold_unit_of_measure,
{ "Unit of Measure", "zbee_zcl_se.met.set_uncontrolled_flow_threshold.unit_of_measure", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_set_uncontrolled_flow_threshold_multiplier,
{ "Multiplier", "zbee_zcl_se.met.set_uncontrolled_flow_threshold.multiplier", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_set_uncontrolled_flow_threshold_divisor,
{ "Divisor", "zbee_zcl_se.met.set_uncontrolled_flow_threshold.divisor", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_set_uncontrolled_flow_threshold_stabilisation_period,
{ "Stabilisation Period", "zbee_zcl_se.met.set_uncontrolled_flow_threshold.stabilisation_period", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_set_uncontrolled_flow_threshold_measurement_period,
{ "Measurement Period", "zbee_zcl_se.met.set_uncontrolled_flow_threshold.measurement_period", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_profile_response_end_time,
{ "End Time", "zbee_zcl_se.met.get_profile_response.end_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_profile_response_status,
{ "Status", "zbee_zcl_se.met.get_profile_response.status", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_profile_response_profile_interval_period,
{ "Profile Interval Period", "zbee_zcl_se.met.get_profile_response.profile_interval_period", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_profile_response_number_of_periods_delivered,
{ "Number of Periods Delivered", "zbee_zcl_se.met.get_profile_response.number_of_periods_delivered", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_profile_response_intervals,
{ "Intervals", "zbee_zcl_se.met.get_profile_response.intervals", FT_UINT24, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_request_fast_poll_mode_response_applied_update_period,
{ "Applied Update Period (seconds)", "zbee_zcl_se.met.request_fast_poll_mode_response.applied_update_period", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_request_fast_poll_mode_response_fast_poll_mode_end_time,
{ "Fast Poll Mode End Time", "zbee_zcl_se.met.request_fast_poll_mode_response.fast_poll_mode_end_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_schedule_snapshot_response_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.met.schedule_snapshot_response.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_schedule_snapshot_response_snapshot_schedule_id,
{ "Snapshot Schedule ID", "zbee_zcl_se.met.schedule_snapshot_response.response_snapshot_schedule_id", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_schedule_snapshot_response_snapshot_schedule_confirmation,
{ "Snapshot Schedule Confirmation", "zbee_zcl_se.met.schedule_snapshot_response.snapshot_schedule_confirmation", FT_UINT8, BASE_HEX, VALS(zbee_zcl_met_snapshot_schedule_confirmation),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_take_snapshot_response_snapshot_id,
{ "Snapshot ID", "zbee_zcl_se.met.take_snapshot_response.snapshot_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_take_snapshot_response_snapshot_confirmation,
{ "Snapshot Confirmation", "zbee_zcl_se.met.take_snapshot_response.snapshot_confirmation", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_publish_snapshot_snapshot_id,
{ "Snapshot ID", "zbee_zcl_se.met.publish_snapshot.snapshot_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_publish_snapshot_snapshot_time,
{ "Snapshot Time", "zbee_zcl_se.met.publish_snapshot.snapshot_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_publish_snapshot_snapshots_found,
{ "Total Snapshots Found", "zbee_zcl_se.met.publish_snapshot.snapshots_found", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_publish_snapshot_cmd_index,
{ "Command Index", "zbee_zcl_se.met.publish_snapshot.command_index", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_publish_snapshot_total_commands,
{ "Total Number of Commands", "zbee_zcl_se.met.publish_snapshot.total_commands", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_publish_snapshot_snapshot_cause,
{ "Snapshot Cause", "zbee_zcl_se.met.publish_snapshot.snapshot_cause", FT_UINT32, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_publish_snapshot_snapshot_payload_type,
{ "Snapshot Payload Type", "zbee_zcl_se.met.publish_snapshot.payload_type", FT_UINT8, BASE_DEC, VALS(zbee_zcl_met_snapshot_payload_type),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_publish_snapshot_snapshot_sub_payload,
{ "Snapshot Sub-Payload", "zbee_zcl_se.met.publish_snapshot.sub_payload", FT_BYTES, BASE_NONE, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_sampled_data_rsp_sample_id,
{ "Sample ID", "zbee_zcl_se.met.get_sampled_data_rsp.sample_id", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_sampled_data_rsp_sample_start_time,
{ "Sample Start Time", "zbee_zcl_se.met.get_sampled_data_rsp.sample_start_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_sampled_data_rsp_sample_type,
{ "Sample Type", "zbee_zcl_se.met.get_sampled_data_rsp.sample_type", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_sampled_data_rsp_sample_request_interval,
{ "Sample Request Interval", "zbee_zcl_se.met.get_sampled_data_rsp.sample_request_interval", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_sampled_data_rsp_sample_number_of_samples,
{ "Number of Samples", "zbee_zcl_se.met.get_sampled_data_rsp.number_of_samples", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_sampled_data_rsp_sample_samples,
{ "Samples", "zbee_zcl_se.met.get_sampled_data_rsp.samples", FT_UINT24, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_configure_mirror_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.met.configure_mirror.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_configure_mirror_reporting_interval,
{ "Reporting Interval", "zbee_zcl_se.met.configure_mirror.reporting_interval", FT_UINT24, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_configure_mirror_mirror_notification_reporting,
{ "Mirror Notification Reporting", "zbee_zcl_se.met.configure_mirror.mirror_notification_reporting", FT_BOOLEAN, BASE_NONE, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_configure_mirror_notification_scheme,
{ "Notification Scheme", "zbee_zcl_se.met.configure_mirror.notification_scheme", FT_UINT8, BASE_HEX | BASE_RANGE_STRING, RVALS(zbee_zcl_met_notification_scheme),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_configure_notification_scheme_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.met.configure_notification_scheme.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_configure_notification_scheme_notification_scheme,
{ "Notification Scheme", "zbee_zcl_se.met.configure_notification_scheme.notification_scheme", FT_UINT8, BASE_HEX | BASE_RANGE_STRING, RVALS(zbee_zcl_met_notification_scheme),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_configure_notification_scheme_notification_flag_order,
{ "Notification Flag Order", "zbee_zcl_se.met.configure_notification_scheme.notification_flag_order", FT_UINT32, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_configure_notification_flags_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.met.configure_notification_flags.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_configure_notification_flags_notification_scheme,
{ "Notification Scheme", "zbee_zcl_se.met.configure_notification_flags.notification_scheme", FT_UINT8, BASE_HEX | BASE_RANGE_STRING, RVALS(zbee_zcl_met_notification_scheme),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_configure_notification_flags_notification_flag_attribute_id,
{ "Notification Flag Attribute ID", "zbee_zcl_se.met.configure_notification_flags.notification_flag_attribute_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_met_attr_client_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_configure_notification_flags_bit_field_allocation_cluster_id,
{ "Cluster ID", "zbee_zcl_se.met.configure_notification_flags.bit_field_allocation.cluster_id", FT_UINT16, BASE_HEX | BASE_RANGE_STRING, RVALS(zbee_aps_cid_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_configure_notification_flags_bit_field_allocation_manufacturer_code,
{ "Manufacturer Code", "zbee_zcl_se.met.configure_notification_flags.bit_field_allocation.manufacturer_code", FT_UINT16, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_configure_notification_flags_bit_field_allocation_no_of_commands,
{ "No. of Commands", "zbee_zcl_se.met.configure_notification_flags.bit_field_allocation.no_of_commands", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_configure_notification_flags_bit_field_allocation_command_identifier,
{ "Command Identifier", "zbee_zcl_se.met.configure_notification_flags.bit_field_allocation.command_identifier", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_notified_msg_notification_scheme,
{ "Notification Scheme", "zbee_zcl_se.met.get_notified_msg.notification_scheme", FT_UINT8, BASE_HEX | BASE_RANGE_STRING, RVALS(zbee_zcl_met_notification_scheme),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_notified_msg_notification_flag_attribute_id,
{ "Notification Flag attribute ID", "zbee_zcl_se.met.get_notified_msg.notification_flag_attribute_id", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_get_notified_msg_notification_flags,
{ "Notification Flags", "zbee_zcl_se.met.get_notified_msg.notification_flags", FT_UINT32, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_supply_status_response_provider_id,
{ "Provider ID", "zbee_zcl_se.met.supply_status_response.provider_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_supply_status_response_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.met.supply_status_response.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_supply_status_response_implementation_date_time,
{ "Implementation Date/Time", "zbee_zcl_se.met.supply_status_response.implementation_date_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_supply_status_response_supply_status_after_implementation,
{ "Supply Status After Implementation", "zbee_zcl_se.met.supply_status_response.supply_status_after_implementation", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_general,
{ "General", "zbee_zcl_se.met.snapshot_cause.general", FT_BOOLEAN, 32, NULL,
0x00000001, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_end_of_billing_period,
{ "End of Billing Period", "zbee_zcl_se.met.snapshot_cause.end_of_billing_period", FT_BOOLEAN, 32, NULL,
0x00000002, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_end_of_block_period,
{ "End of Block Period", "zbee_zcl_se.met.snapshot_cause.end_of_block_period", FT_BOOLEAN, 32, NULL,
0x00000004, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_change_of_tariff_information,
{ "Change of Tariff Information", "zbee_zcl_se.met.snapshot_cause.change_of_tariff_information", FT_BOOLEAN, 32, NULL,
0x00000008, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_change_of_price_matrix,
{ "Change of Price Matrix", "zbee_zcl_se.met.snapshot_cause.change_of_price_matrix", FT_BOOLEAN, 32, NULL,
0x00000010, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_change_of_block_thresholds,
{ "Change of Block Thresholds", "zbee_zcl_se.met.snapshot_cause.change_of_block_thresholds", FT_BOOLEAN, 32, NULL,
0x00000020, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_change_of_cv,
{ "Change of CV", "zbee_zcl_se.met.snapshot_cause.change_of_cv", FT_BOOLEAN, 32, NULL,
0x00000040, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_change_of_cf,
{ "Change of CF", "zbee_zcl_se.met.snapshot_cause.change_of_cf", FT_BOOLEAN, 32, NULL,
0x00000080, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_change_of_calendar,
{ "Change of Calendar", "zbee_zcl_se.met.snapshot_cause.change_of_calendar", FT_BOOLEAN, 32, NULL,
0x00000100, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_critical_peak_pricing,
{ "Critical Peak Pricing", "zbee_zcl_se.met.snapshot_cause.critical_peak_pricing", FT_BOOLEAN, 32, NULL,
0x00000200, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_manually_triggered_from_client,
{ "Manually Triggered from Client", "zbee_zcl_se.met.snapshot_cause.manually_triggered_from_client", FT_BOOLEAN, 32, NULL,
0x00000400, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_end_of_resolve_period,
{ "End of Resolve Period", "zbee_zcl_se.met.snapshot_cause.end_of_resolve_period", FT_BOOLEAN, 32, NULL,
0x00000800, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_change_of_tenancy,
{ "Change of Tenancy", "zbee_zcl_se.met.snapshot_cause.change_of_tenancy", FT_BOOLEAN, 32, NULL,
0x00001000, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_change_of_supplier,
{ "Change of Supplier", "zbee_zcl_se.met.snapshot_cause.change_of_supplier", FT_BOOLEAN, 32, NULL,
0x00002000, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_change_of_meter_mode,
{ "Change of (Meter) Mode", "zbee_zcl_se.met.snapshot_cause.change_of_meter_mode", FT_BOOLEAN, 32, NULL,
0x00004000, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_debt_payment,
{ "Debt Payment", "zbee_zcl_se.met.snapshot_cause.debt_payment", FT_BOOLEAN, 32, NULL,
0x00008000, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_scheduled_snapshot,
{ "Scheduled Snapshot", "zbee_zcl_se.met.snapshot_cause.scheduled_snapshot", FT_BOOLEAN, 32, NULL,
0x00010000, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_ota_firmware_download,
{ "OTA Firmware Download", "zbee_zcl_se.met.snapshot_cause.ota_firmware_download", FT_BOOLEAN, 32, NULL,
0x00020000, NULL, HFILL } },
{ &hf_zbee_zcl_met_snapshot_cause_reserved,
{ "Reserved", "zbee_zcl_se.met.snapshot_cause.reserved", FT_UINT32, BASE_HEX, NULL,
0xFFFC0000, NULL, HFILL } }
};
/* ZCL Metering subtrees */
gint *ett[] = {
&ett_zbee_zcl_met,
&ett_zbee_zcl_met_func_noti_flags,
&ett_zbee_zcl_met_noti_flags_2,
&ett_zbee_zcl_met_noti_flags_3,
&ett_zbee_zcl_met_noti_flags_4,
&ett_zbee_zcl_met_noti_flags_5,
&ett_zbee_zcl_met_snapshot_cause_flags,
&ett_zbee_zcl_met_snapshot_schedule,
&ett_zbee_zcl_met_schedule_snapshot_response_payload,
&ett_zbee_zcl_met_schedule_snapshot_payload,
&ett_zbee_zcl_met_mirror_noti_flag,
&ett_zbee_zcl_met_bit_field_allocation
};
/* Register the ZigBee ZCL Metering cluster protocol name and description */
proto_zbee_zcl_met = proto_register_protocol("ZigBee ZCL Metering", "ZCL Metering", ZBEE_PROTOABBREV_ZCL_MET);
proto_register_field_array(proto_zbee_zcl_met, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
/* Register the ZigBee ZCL Metering dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_MET, dissect_zbee_zcl_met, proto_zbee_zcl_met);
} /*proto_register_zbee_zcl_met*/
/**
*Hands off the ZCL Metering dissector.
*
*/
void
proto_reg_handoff_zbee_zcl_met(void)
{
zbee_zcl_init_cluster( ZBEE_PROTOABBREV_ZCL_MET,
proto_zbee_zcl_met,
ett_zbee_zcl_met,
ZBEE_ZCL_CID_SIMPLE_METERING,
ZBEE_MFG_CODE_NONE,
hf_zbee_zcl_met_attr_server_id,
hf_zbee_zcl_met_attr_client_id,
hf_zbee_zcl_met_srv_rx_cmd_id,
hf_zbee_zcl_met_srv_tx_cmd_id,
(zbee_zcl_fn_attr_data)dissect_zcl_met_attr_data
);
} /*proto_reg_handoff_zbee_zcl_met*/
/* ########################################################################## */
/* #### (0x0703) MESSAGING CLUSTER ########################################## */
/* ########################################################################## */
/* Attributes - None */
/* Server Commands Received */
#define zbee_zcl_msg_srv_rx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_MSG_GET_LAST_MSG, 0x00, "Get Last Message" ) \
XXX(ZBEE_ZCL_CMD_ID_MSG_MSG_CONFIRM, 0x01, "Message Confirmation" ) \
XXX(ZBEE_ZCL_CMD_ID_MSG_GET_MESSAGE_CANCEL, 0x02, "Get Message Cancellation" )
VALUE_STRING_ENUM(zbee_zcl_msg_srv_rx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_msg_srv_rx_cmd_names);
/* Server Commands Generated */
#define zbee_zcl_msg_srv_tx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_MSG_DISPLAY_MSG, 0x00, "Display Message" ) \
XXX(ZBEE_ZCL_CMD_ID_MSG_CANCEL_MSG, 0x01, "Cancel Message" ) \
XXX(ZBEE_ZCL_CMD_ID_MSG_DISPLAY_PROTECTED_MSG, 0x02, "Display Protected Message" ) \
XXX(ZBEE_ZCL_CMD_ID_MSG_CANCEL_ALL_MSG, 0x03, "Cancel All Messages" )
VALUE_STRING_ENUM(zbee_zcl_msg_srv_tx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_msg_srv_tx_cmd_names);
/* Message Control Field Bit Map */
#define ZBEE_ZCL_MSG_CTRL_TX_MASK 0x03
#define ZBEE_ZCL_MSG_CTRL_IMPORTANCE_MASK 0x0C
#define ZBEE_ZCL_MSG_CTRL_RESERVED_MASK 0x50
#define ZBEE_ZCL_MSG_CTRL_ENHANCED_CONFIRM_MASK 0x20
#define ZBEE_ZCL_MSG_CTRL_CONFIRM_MASK 0x80
#define ZBEE_ZCL_MSG_CTRL_TX_NORMAL_ONLY 0x00 /* Normal Transmission Only */
#define ZBEE_ZCL_MSG_CTRL_TX_NORMAL_ANON_INTERPAN 0x01 /* Normal and Anonymous Inter-PAN Transmission Only */
#define ZBEE_ZCL_MSG_CTRL_TX_ANON_INTERPAN_ONLY 0x02 /* Anonymous Inter-PAN Transmission Only */
#define ZBEE_ZCL_MSG_CTRL_IMPORTANCE_LOW 0x00 /* Low */
#define ZBEE_ZCL_MSG_CTRL_IMPORTANCE_MEDIUM 0x01 /* Medium */
#define ZBEE_ZCL_MSG_CTRL_IMPORTANCE_HIGH 0x02 /* High */
#define ZBEE_ZCL_MSG_CTRL_IMPORTANCE_CRITICAL 0x03 /* Critical */
#define ZBEE_ZCL_MSG_EXT_CTRL_STATUS_MASK 0x01
#define ZBEE_ZCL_MSG_CONFIRM_CTRL_MASK 0x01
#define ZBEE_ZCL_MSG_START_TIME_NOW 0x00000000 /* Now */
/*************************/
/* Function Declarations */
/*************************/
void proto_register_zbee_zcl_msg(void);
void proto_reg_handoff_zbee_zcl_msg(void);
/* Command Dissector Helpers */
static void dissect_zcl_msg_display (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_msg_cancel (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint *offset);
static void dissect_zcl_msg_confirm (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_msg_cancel_all (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_msg_get_cancel (tvbuff_t *tvb, proto_tree *tree, guint *offset);
/* Private functions prototype */
static void decode_zcl_msg_duration (gchar *s, guint16 value);
/*************************/
/* Global Variables */
/*************************/
/* Initialize the protocol and registered fields */
static int proto_zbee_zcl_msg = -1;
static int hf_zbee_zcl_msg_srv_tx_cmd_id = -1;
static int hf_zbee_zcl_msg_srv_rx_cmd_id = -1;
static int hf_zbee_zcl_msg_message_id = -1;
static int hf_zbee_zcl_msg_ctrl = -1;
static int hf_zbee_zcl_msg_ctrl_tx = -1;
static int hf_zbee_zcl_msg_ctrl_importance = -1;
static int hf_zbee_zcl_msg_ctrl_enh_confirm = -1;
static int hf_zbee_zcl_msg_ctrl_reserved = -1;
static int hf_zbee_zcl_msg_ctrl_confirm = -1;
static int hf_zbee_zcl_msg_ext_ctrl = -1;
static int hf_zbee_zcl_msg_ext_ctrl_status = -1;
static int hf_zbee_zcl_msg_start_time = -1;
static int hf_zbee_zcl_msg_duration = -1;
static int hf_zbee_zcl_msg_message = -1;
static int hf_zbee_zcl_msg_confirm_time = -1;
static int hf_zbee_zcl_msg_confirm_ctrl = -1;
static int hf_zbee_zcl_msg_confirm_response = -1;
static int hf_zbee_zcl_msg_implementation_time = -1;
static int hf_zbee_zcl_msg_earliest_time = -1;
/* Initialize the subtree pointers */
static gint ett_zbee_zcl_msg = -1;
static gint ett_zbee_zcl_msg_message_control = -1;
static gint ett_zbee_zcl_msg_ext_message_control = -1;
static expert_field ei_zbee_zcl_msg_msg_ctrl_deprecated = EI_INIT;
/* Message Control Transmission */
static const value_string zbee_zcl_msg_ctrl_tx_names[] = {
{ ZBEE_ZCL_MSG_CTRL_TX_NORMAL_ONLY, "Normal Transmission Only" },
{ ZBEE_ZCL_MSG_CTRL_TX_NORMAL_ANON_INTERPAN, "Normal and Anonymous Inter-PAN Transmission Only" },
{ ZBEE_ZCL_MSG_CTRL_TX_ANON_INTERPAN_ONLY, "Anonymous Inter-PAN Transmission Only" },
{ 0, NULL }
};
/* Message Control Importance */
static const value_string zbee_zcl_msg_ctrl_importance_names[] = {
{ ZBEE_ZCL_MSG_CTRL_IMPORTANCE_LOW, "Low" },
{ ZBEE_ZCL_MSG_CTRL_IMPORTANCE_MEDIUM, "Medium" },
{ ZBEE_ZCL_MSG_CTRL_IMPORTANCE_HIGH, "High" },
{ ZBEE_ZCL_MSG_CTRL_IMPORTANCE_CRITICAL, "Critical" },
{ 0, NULL }
};
/*************************/
/* Function Bodies */
/*************************/
/**
*ZigBee ZCL Messaging cluster dissector for wireshark.
*
*@param tvb pointer to buffer containing raw packet.
*@param pinfo pointer to packet information fields
*@param tree pointer to data tree Wireshark uses to display packet.
*/
static int
dissect_zbee_zcl_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
proto_tree *payload_tree;
zbee_zcl_packet *zcl;
guint offset = 0;
guint8 cmd_id;
gint rem_len;
/* Reject the packet if data is NULL */
if (data == NULL)
return 0;
zcl = (zbee_zcl_packet *)data;
cmd_id = zcl->cmd_id;
/* Create a subtree for the ZCL Command frame, and add the command ID to it. */
if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_msg_srv_rx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_msg_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_msg, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_MSG_GET_LAST_MSG:
/* No payload */
break;
case ZBEE_ZCL_CMD_ID_MSG_MSG_CONFIRM:
dissect_zcl_msg_confirm(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MSG_GET_MESSAGE_CANCEL:
dissect_zcl_msg_get_cancel(tvb, payload_tree, &offset);
break;
default:
break;
}
}
}
else { /* ZBEE_ZCL_FCF_TO_CLIENT */
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_msg_srv_tx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_msg_srv_tx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_msg, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_MSG_DISPLAY_MSG:
dissect_zcl_msg_display(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MSG_CANCEL_MSG:
dissect_zcl_msg_cancel(tvb, pinfo, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MSG_DISPLAY_PROTECTED_MSG:
dissect_zcl_msg_display(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_MSG_CANCEL_ALL_MSG:
dissect_zcl_msg_cancel_all(tvb, payload_tree, &offset);
break;
default:
break;
}
}
}
return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_msg*/
/**
*This function manages the Display Message payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_msg_display(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
guint msg_len;
static int * const message_ctrl_flags[] = {
&hf_zbee_zcl_msg_ctrl_tx,
&hf_zbee_zcl_msg_ctrl_importance,
&hf_zbee_zcl_msg_ctrl_enh_confirm,
&hf_zbee_zcl_msg_ctrl_reserved,
&hf_zbee_zcl_msg_ctrl_confirm,
NULL
};
static int * const message_ext_ctrl_flags[] = {
&hf_zbee_zcl_msg_ext_ctrl_status,
NULL
};
/* Message ID */
proto_tree_add_item(tree, hf_zbee_zcl_msg_message_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Message Control */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_msg_ctrl, ett_zbee_zcl_msg_message_control, message_ctrl_flags, ENC_NA);
*offset += 1;
/* Start Time */
proto_tree_add_item(tree, hf_zbee_zcl_msg_start_time, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Duration In Minutes*/
proto_tree_add_item(tree, hf_zbee_zcl_msg_duration, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Message */
proto_tree_add_item_ret_length(tree, hf_zbee_zcl_msg_message, tvb, *offset, 1, ENC_NA | ENC_ZIGBEE, &msg_len);
*offset += msg_len;
/* (Optional) Extended Message Control */
if (tvb_reported_length_remaining(tvb, *offset) > 0) {
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_msg_ext_ctrl, ett_zbee_zcl_msg_ext_message_control, message_ext_ctrl_flags, ENC_NA);
*offset += 1;
}
} /*dissect_zcl_msg_display*/
/**
*This function manages the Cancel Message payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_msg_cancel(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint *offset)
{
gint8 msg_ctrl;
/* Message ID */
proto_tree_add_item(tree, hf_zbee_zcl_msg_message_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Message Control */
msg_ctrl = tvb_get_guint8(tvb, *offset);
proto_tree_add_item(tree, hf_zbee_zcl_msg_ctrl, tvb, *offset, 1, ENC_NA);
*offset += 1;
if (msg_ctrl != 0x00) {
expert_add_info(pinfo, tree, &ei_zbee_zcl_msg_msg_ctrl_deprecated);
}
} /* dissect_zcl_msg_cancel */
/**
*This function manages the Cancel All Messages payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_msg_cancel_all(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t impl_time;
/* Implementation Date/Time */
impl_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
impl_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_msg_implementation_time, tvb, *offset, 4, &impl_time);
*offset += 4;
} /* dissect_zcl_msg_cancel_all */
/**
*This function manages the Get Message Cancellation payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_msg_get_cancel(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t impl_time;
/* Earliest Implementation Time */
impl_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
impl_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_msg_earliest_time, tvb, *offset, 4, &impl_time);
*offset += 4;
} /* dissect_zcl_msg_get_cancel */
/**
*This function manages the Message Confirmation payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_msg_confirm(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
guint msg_len;
nstime_t confirm_time;
/* Message ID */
proto_tree_add_item(tree, hf_zbee_zcl_msg_message_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Confirmation Time */
confirm_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
confirm_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_msg_confirm_time, tvb, *offset, 4, &confirm_time);
*offset += 4;
/* (Optional) Confirm Control */
if ( tvb_reported_length_remaining(tvb, *offset) <= 0 ) return;
proto_tree_add_item(tree, hf_zbee_zcl_msg_confirm_ctrl, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* (Optional) Response Text, but is we have a length we expect to find the subsequent string */
if ( tvb_reported_length_remaining(tvb, *offset) <= 0 ) return;
proto_tree_add_item_ret_length(tree, hf_zbee_zcl_msg_confirm_response, tvb, *offset, 1, ENC_NA | ENC_ZIGBEE, &msg_len);
*offset += msg_len;
} /* dissect_zcl_msg_confirm */
/**
*This function decodes duration in minute type variable
*
*/
static void
decode_zcl_msg_duration(gchar *s, guint16 value)
{
if (value == 0xffff)
snprintf(s, ITEM_LABEL_LENGTH, "Until changed");
else
snprintf(s, ITEM_LABEL_LENGTH, "%d minutes", value);
return;
} /*decode_zcl_msg_duration*/
/**
* This function decodes start time, with a special case for
* ZBEE_ZCL_MSG_START_TIME_NOW.
*
* @param s string to display
* @param value value to decode
*/
static void
decode_zcl_msg_start_time(gchar *s, guint32 value)
{
if (value == ZBEE_ZCL_MSG_START_TIME_NOW)
snprintf(s, ITEM_LABEL_LENGTH, "Now");
else {
gchar *start_time;
time_t epoch_time = (time_t)value + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time = abs_time_secs_to_str (NULL, epoch_time, ABSOLUTE_TIME_UTC, TRUE);
snprintf(s, ITEM_LABEL_LENGTH, "%s", start_time);
wmem_free(NULL, start_time);
}
} /* decode_zcl_msg_start_time */
/**
*This function registers the ZCL Messaging dissector
*
*/
void
proto_register_zbee_zcl_msg(void)
{
static hf_register_info hf[] = {
{ &hf_zbee_zcl_msg_srv_tx_cmd_id,
{ "Command", "zbee_zcl_se.msg.cmd.srv_tx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_msg_srv_tx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_msg_srv_rx_cmd_id,
{ "Command", "zbee_zcl_se.msg.cmd.srv_rx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_msg_srv_rx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_msg_message_id,
{ "Message ID", "zbee_zcl_se.msg.message.id", FT_UINT32, BASE_HEX, NULL,
0x00, NULL, HFILL } },
/* Start of 'Message Control' fields */
{ &hf_zbee_zcl_msg_ctrl,
{ "Message Control", "zbee_zcl_se.msg.message.ctrl", FT_UINT8, BASE_HEX, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_msg_ctrl_tx,
{ "Transmission", "zbee_zcl_se.msg.message.ctrl.tx", FT_UINT8, BASE_HEX, VALS(zbee_zcl_msg_ctrl_tx_names),
ZBEE_ZCL_MSG_CTRL_TX_MASK, NULL, HFILL } },
{ &hf_zbee_zcl_msg_ctrl_importance,
{ "Importance", "zbee_zcl_se.msg.message.ctrl.importance", FT_UINT8, BASE_HEX, VALS(zbee_zcl_msg_ctrl_importance_names),
ZBEE_ZCL_MSG_CTRL_IMPORTANCE_MASK, NULL, HFILL } },
{ &hf_zbee_zcl_msg_ctrl_enh_confirm,
{ "Confirmation", "zbee_zcl_se.msg.message.ctrl.enhconfirm", FT_BOOLEAN, 8, TFS(&tfs_required_not_required),
ZBEE_ZCL_MSG_CTRL_ENHANCED_CONFIRM_MASK, NULL, HFILL } },
{ &hf_zbee_zcl_msg_ctrl_reserved,
{ "Reserved", "zbee_zcl_se.msg.message.ctrl.reserved", FT_UINT8, BASE_HEX, NULL,
ZBEE_ZCL_MSG_CTRL_RESERVED_MASK, NULL, HFILL } },
{ &hf_zbee_zcl_msg_ctrl_confirm,
{ "Confirmation", "zbee_zcl_se.msg.message.ctrl.confirm", FT_BOOLEAN, 8, TFS(&tfs_required_not_required),
ZBEE_ZCL_MSG_CTRL_CONFIRM_MASK, NULL, HFILL } },
/* End of 'Message Control' fields */
/* Start of 'Extended Message Control' fields */
{ &hf_zbee_zcl_msg_ext_ctrl,
{ "Extended Message Control", "zbee_zcl_se.msg.message.ext.ctrl", FT_UINT8, BASE_HEX, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_msg_ext_ctrl_status,
{ "Message Confirmation Status", "zbee_zcl_se.msg.message.ext.ctrl.status", FT_BOOLEAN, 8, TFS(&tfs_confirmed_unconfirmed),
ZBEE_ZCL_MSG_EXT_CTRL_STATUS_MASK, NULL, HFILL } },
/* End of 'Extended Message Control' fields */
{ &hf_zbee_zcl_msg_start_time,
{ "Start Time", "zbee_zcl_se.msg.message.start_time", FT_UINT32, BASE_CUSTOM, CF_FUNC(decode_zcl_msg_start_time),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_msg_duration,
{ "Duration", "zbee_zcl_se.msg.message.duration", FT_UINT16, BASE_CUSTOM, CF_FUNC(decode_zcl_msg_duration),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_msg_message,
{ "Message", "zbee_zcl_se.msg.message", FT_UINT_STRING, BASE_NONE, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_msg_confirm_time,
{ "Confirmation Time", "zbee_zcl_se.msg.message.confirm_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_msg_confirm_ctrl,
{ "Confirmation Control", "zbee_zcl_se.msg.message.confirm.ctrl", FT_BOOLEAN, 8, TFS(&tfs_no_yes),
ZBEE_ZCL_MSG_CONFIRM_CTRL_MASK, NULL, HFILL } },
{ &hf_zbee_zcl_msg_confirm_response,
{ "Response", "zbee_zcl_se.msg.message", FT_UINT_STRING, BASE_NONE, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_msg_implementation_time,
{ "Implementation Time", "zbee_zcl_se.msg.impl_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0, NULL, HFILL } },
{ &hf_zbee_zcl_msg_earliest_time,
{ "Earliest Implementation Time", "zbee_zcl_se.msg.earliest_impl_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0, NULL, HFILL } },
};
/* ZCL Messaging subtrees */
gint *ett[] = {
&ett_zbee_zcl_msg,
&ett_zbee_zcl_msg_message_control,
&ett_zbee_zcl_msg_ext_message_control,
};
/* Expert Info */
expert_module_t* expert_zbee_zcl_msg;
static ei_register_info ei[] = {
{ &ei_zbee_zcl_msg_msg_ctrl_deprecated, { "zbee_zcl_se.msg.msg_ctrl.deprecated", PI_PROTOCOL, PI_WARN, "Message Control deprecated in this message, should be 0x00", EXPFILL }},
};
/* Register the ZigBee ZCL Messaging cluster protocol name and description */
proto_zbee_zcl_msg = proto_register_protocol("ZigBee ZCL Messaging", "ZCL Messaging", ZBEE_PROTOABBREV_ZCL_MSG);
proto_register_field_array(proto_zbee_zcl_msg, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
expert_zbee_zcl_msg = expert_register_protocol(proto_zbee_zcl_msg);
expert_register_field_array(expert_zbee_zcl_msg, ei, array_length(ei));
/* Register the ZigBee ZCL Messaging dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_MSG, dissect_zbee_zcl_msg, proto_zbee_zcl_msg);
} /*proto_register_zbee_zcl_msg*/
/**
*Hands off the ZCL Messaging dissector.
*
*/
void
proto_reg_handoff_zbee_zcl_msg(void)
{
zbee_zcl_init_cluster( ZBEE_PROTOABBREV_ZCL_MSG,
proto_zbee_zcl_msg,
ett_zbee_zcl_msg,
ZBEE_ZCL_CID_MESSAGE,
ZBEE_MFG_CODE_NONE,
-1, -1,
hf_zbee_zcl_msg_srv_rx_cmd_id,
hf_zbee_zcl_msg_srv_tx_cmd_id,
NULL
);
} /*proto_reg_handoff_zbee_zcl_msg*/
/* ########################################################################## */
/* #### (0x0704) TUNNELING CLUSTER ########################################### */
/* ########################################################################## */
/* Attributes */
#define zbee_zcl_tun_attr_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_ATTR_ID_TUN_CLOSE_TIMEOUT, 0x0000, "Close Tunnel Timeout" ) \
/* Smart Energy */ \
XXX(ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_TUN, 0xFFFE, "Attribute Reporting Status" )
VALUE_STRING_ENUM(zbee_zcl_tun_attr_names);
VALUE_STRING_ARRAY(zbee_zcl_tun_attr_names);
/* Server Commands Received */
#define zbee_zcl_tun_srv_rx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_TUN_REQUEST_TUNNEL, 0x00, "Request Tunnel" ) \
XXX(ZBEE_ZCL_CMD_ID_TUN_CLOSE_TUNNEL, 0x01, "Close Tunnel" ) \
XXX(ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA, 0x02, "Transfer Data" ) \
XXX(ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA_ERROR, 0x03, "Transfer Data Error" ) \
XXX(ZBEE_ZCL_CMD_ID_TUN_ACK_TRANSFER_DATA, 0x04, "Ack Transfer Data" ) \
XXX(ZBEE_ZCL_CMD_ID_TUN_READY_DATA, 0x05, "Ready Data" ) \
XXX(ZBEE_ZCL_CMD_ID_TUN_GET_SUPPORTED_PROTOCOLS, 0x06, "Get Supported Tunnel Protocols" )
VALUE_STRING_ENUM(zbee_zcl_tun_srv_rx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_tun_srv_rx_cmd_names);
/* Server Commands Generated */
#define zbee_zcl_tun_srv_tx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_TUN_REQUEST_TUNNEL_RSP, 0x00, "Request Tunnel Response" ) \
XXX(ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA_TX, 0x01, "Transfer Data" ) \
XXX(ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA_ERROR_TX, 0x02, "Transfer Data Error" ) \
XXX(ZBEE_ZCL_CMD_ID_TUN_ACK_TRANSFER_DATA_TX, 0x03, "Ack Transfer Data" ) \
XXX(ZBEE_ZCL_CMD_ID_TUN_READY_DATA_TX, 0x04, "Ready Data" ) \
XXX(ZBEE_ZCL_CMD_ID_TUN_GET_SUPPORTED_PROTOCOLS_RSP, 0x05, "Supported Tunnel Protocols Response" ) \
XXX(ZBEE_ZCL_CMD_ID_TUN_CLOSURE_NOTIFY, 0x06, "Tunnel Closure Notification" )
VALUE_STRING_ENUM(zbee_zcl_tun_srv_tx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_tun_srv_tx_cmd_names);
/*************************/
/* Function Declarations */
/*************************/
void proto_register_zbee_zcl_tun(void);
void proto_reg_handoff_zbee_zcl_tun(void);
/* Attribute Dissector Helpers */
static void dissect_zcl_tun_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr);
/* Private functions prototype */
/*************************/
/* Global Variables */
/*************************/
/* Initialize the protocol and registered fields */
static int proto_zbee_zcl_tun = -1;
static int hf_zbee_zcl_tun_srv_tx_cmd_id = -1;
static int hf_zbee_zcl_tun_srv_rx_cmd_id = -1;
static int hf_zbee_zcl_tun_attr_id = -1;
static int hf_zbee_zcl_tun_attr_reporting_status = -1;
static int hf_zbee_zcl_tun_attr_close_timeout = -1;
static int hf_zbee_zcl_tun_protocol_id = -1;
static int hf_zbee_zcl_tun_manufacturer_code = -1;
static int hf_zbee_zcl_tun_flow_control_support = -1;
static int hf_zbee_zcl_tun_max_in_size = -1;
static int hf_zbee_zcl_tun_tunnel_id = -1;
static int hf_zbee_zcl_tun_num_octets_left = -1;
static int hf_zbee_zcl_tun_protocol_offset = -1;
static int hf_zbee_zcl_tun_protocol_list_complete = -1;
static int hf_zbee_zcl_tun_protocol_count = -1;
static int hf_zbee_zcl_tun_transfer_status = -1;
static int hf_zbee_zcl_tun_transfer_data_status = -1;
static heur_dissector_list_t zbee_zcl_tun_heur_subdissector_list;
/* Initialize the subtree pointers */
static gint ett_zbee_zcl_tun = -1;
#define zbee_zcl_tun_protocol_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_TUN_PROTO_DLMS, 0x00, "DLMS/COSEM (IEC 62056)" ) \
XXX(ZBEE_ZCL_TUN_PROTO_IEC_61107, 0x01, "IEC 61107" ) \
XXX(ZBEE_ZCL_TUN_PROTO_ANSI_C12, 0x02, "ANSI C12" ) \
XXX(ZBEE_ZCL_TUN_PROTO_M_BUS, 0x03, "M-BUS" ) \
XXX(ZBEE_ZCL_TUN_PROTO_SML, 0x04, "SML" ) \
XXX(ZBEE_ZCL_TUN_PROTO_CLIMATE_TALK, 0x05, "ClimateTalk" ) \
XXX(ZBEE_ZCL_TUN_PROTO_GB_HRGP, 0x06, "GB-HRGP" ) \
XXX(ZBEE_ZCL_TUN_PROTO_IPV6, 0x07, "IPv6" ) \
XXX(ZBEE_ZCL_TUN_PROTO_IPV4, 0x08, "IPv4" ) \
XXX(ZBEE_ZCL_TUN_PROTO_NULL, 0x09, "null" ) \
XXX(ZBEE_ZCL_TUN_PROTO_TEST, 199, "test" ) \
XXX(ZBEE_ZCL_TUN_PROTO_MANUFACTURER, 200, "Manufacturer Specific" ) \
XXX(ZBEE_ZCL_TUN_PROTO_RESERVED, 0xFF, "Reserved" )
VALUE_STRING_ENUM(zbee_zcl_tun_protocol_names);
VALUE_STRING_ARRAY(zbee_zcl_tun_protocol_names);
#define zbee_zcl_tun_trans_data_status_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_TUN_TRANS_STATUS_NO_TUNNEL, 0x00, "Tunnel ID Does Not Exist" ) \
XXX(ZBEE_ZCL_TUN_TRANS_STATUS_WRONG_DEV, 0x01, "Wrong Device" ) \
XXX(ZBEE_ZCL_TUN_TRANS_STATUS_OVERFLOW, 0x02, "Data Overflow" )
VALUE_STRING_ENUM(zbee_zcl_tun_trans_data_status_names);
VALUE_STRING_ARRAY(zbee_zcl_tun_trans_data_status_names);
#define zbee_zcl_tun_status_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_TUN_STATUS_SUCCESS, 0x00, "Success" ) \
XXX(ZBEE_ZCL_TUN_STATUS_BUSY, 0x01, "Busy" ) \
XXX(ZBEE_ZCL_TUN_STATUS_NO_MORE_IDS, 0x02, "No More Tunnel IDs" ) \
XXX(ZBEE_ZCL_TUN_STATUS_PROTO_NOT_SUPP, 0x03, "Protocol Not Supported" ) \
XXX(ZBEE_ZCL_TUN_STATUS_FLOW_CONTROL_NOT_SUPP, 0x04, "Flow Control Not Supported" )
VALUE_STRING_ENUM(zbee_zcl_tun_status_names);
VALUE_STRING_ARRAY(zbee_zcl_tun_status_names);
/*************************/
/* Function Bodies */
/*************************/
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*@param attr_id attribute identifier
*@param data_type attribute data type
*@param client_attr ZCL client
*/
static void
dissect_zcl_tun_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr)
{
switch (attr_id) {
/* cluster specific attributes */
case ZBEE_ZCL_ATTR_ID_TUN_CLOSE_TIMEOUT:
proto_tree_add_item(tree, hf_zbee_zcl_tun_attr_close_timeout, tvb, *offset, 2, ENC_NA);
*offset += 2;
break;
/* applies to all SE clusters */
case ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_TUN:
proto_tree_add_item(tree, hf_zbee_zcl_tun_attr_reporting_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
break;
default: /* Catch all */
dissect_zcl_attr_data(tvb, tree, offset, data_type, client_attr);
break;
}
} /*dissect_zcl_ias_zone_attr_data*/
/**
*This function manages the Request Tunnel payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_tun_request_tunnel(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
proto_tree_add_item(tree, hf_zbee_zcl_tun_protocol_id, tvb, *offset, 1, ENC_NA);
*offset += 1;
proto_tree_add_item(tree, hf_zbee_zcl_tun_manufacturer_code, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
proto_tree_add_item(tree, hf_zbee_zcl_tun_flow_control_support, tvb, *offset, 1, ENC_NA);
*offset += 1;
proto_tree_add_item(tree, hf_zbee_zcl_tun_max_in_size, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
}
/**
*This function manages the Close Tunnel payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_tun_close_tunnel(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
proto_tree_add_item(tree, hf_zbee_zcl_tun_tunnel_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
}
/**
*This function manages the Transfer Data payload
*
*@param tvb pointer to buffer containing raw packet.
*@param pinfo pointer to packet information fields
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_tun_transfer_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint *offset)
{
gint length;
heur_dtbl_entry_t *hdtbl_entry;
tvbuff_t *data_tvb;
proto_tree *root_tree = proto_tree_get_root(tree);
proto_tree_add_item(tree, hf_zbee_zcl_tun_tunnel_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
length = tvb_reported_length_remaining(tvb, *offset);
data_tvb = tvb_new_subset_remaining(tvb, *offset);
*offset += length;
if (dissector_try_heuristic(zbee_zcl_tun_heur_subdissector_list, data_tvb, pinfo, root_tree, &hdtbl_entry, NULL)) {
return;
}
call_data_dissector(data_tvb, pinfo, root_tree);
}
/**
*This function manages the Transfer Data Error payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_tun_transfer_data_error(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
proto_tree_add_item(tree, hf_zbee_zcl_tun_tunnel_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
proto_tree_add_item(tree, hf_zbee_zcl_tun_transfer_data_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
}
/**
*This function manages the Ack Transfer Data payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_tun_ack_transfer_data(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
proto_tree_add_item(tree, hf_zbee_zcl_tun_tunnel_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
proto_tree_add_item(tree, hf_zbee_zcl_tun_num_octets_left, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
}
/**
*This function manages the Ready Data payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_tun_ready_data(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
proto_tree_add_item(tree, hf_zbee_zcl_tun_tunnel_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
proto_tree_add_item(tree, hf_zbee_zcl_tun_num_octets_left, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
}
/**
*This function manages the Get Supported Tunnel Protocols payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_tun_get_supported(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
proto_tree_add_item(tree, hf_zbee_zcl_tun_protocol_offset, tvb, *offset, 1, ENC_NA);
*offset += 1;
}
/**
*This function manages the Request Tunnel Response payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_tun_request_tunnel_rsp(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
proto_tree_add_item(tree, hf_zbee_zcl_tun_tunnel_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
proto_tree_add_item(tree, hf_zbee_zcl_tun_transfer_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
proto_tree_add_item(tree, hf_zbee_zcl_tun_max_in_size, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
}
/**
*This function manages the Supported Tunnel Protocols Response payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_tun_get_supported_rsp(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
guint16 mfg_code;
proto_tree_add_item(tree, hf_zbee_zcl_tun_protocol_list_complete, tvb, *offset, 1, ENC_NA);
*offset += 1;
proto_tree_add_item(tree, hf_zbee_zcl_tun_protocol_count, tvb, *offset, 1, ENC_NA);
*offset += 1;
while (tvb_reported_length_remaining(tvb, *offset) > 0) {
mfg_code = tvb_get_letohs(tvb, *offset);
if (mfg_code == 0xFFFF) {
proto_tree_add_uint_format(tree, hf_zbee_zcl_tun_manufacturer_code, tvb, *offset, 2, mfg_code, "Standard Protocol (Mfg Code %#x)", mfg_code);
}
else {
proto_tree_add_item(tree, hf_zbee_zcl_tun_manufacturer_code, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
}
*offset += 2;
proto_tree_add_item(tree, hf_zbee_zcl_tun_protocol_id, tvb, *offset, 1, ENC_NA);
*offset += 1;
}
}
/**
*This function manages the Tunnel Closure Notification payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_tun_closure_notify(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
proto_tree_add_item(tree, hf_zbee_zcl_tun_tunnel_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
}
/**
*ZigBee ZCL Tunneling cluster dissector for wireshark.
*
*@param tvb pointer to buffer containing raw packet.
*@param pinfo pointer to packet information fields
*@param tree pointer to data tree Wireshark uses to display packet.
*/
static int
dissect_zbee_zcl_tun(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
proto_tree *payload_tree;
zbee_zcl_packet *zcl;
guint offset = 0;
guint8 cmd_id;
gint rem_len;
/* Reject the packet if data is NULL */
if (data == NULL)
return 0;
zcl = (zbee_zcl_packet *)data;
cmd_id = zcl->cmd_id;
/* Create a subtree for the ZCL Command frame, and add the command ID to it. */
if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_tun_srv_rx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_tun_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_tun, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_TUN_REQUEST_TUNNEL:
dissect_zcl_tun_request_tunnel(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_TUN_CLOSE_TUNNEL:
dissect_zcl_tun_close_tunnel(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA:
dissect_zcl_tun_transfer_data(tvb, pinfo, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA_ERROR:
dissect_zcl_tun_transfer_data_error(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_TUN_ACK_TRANSFER_DATA:
dissect_zcl_tun_ack_transfer_data(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_TUN_READY_DATA:
dissect_zcl_tun_ready_data(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_TUN_GET_SUPPORTED_PROTOCOLS:
dissect_zcl_tun_get_supported(tvb, payload_tree, &offset);
break;
default:
break;
}
}
}
else { /* ZBEE_ZCL_FCF_TO_CLIENT */
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_tun_srv_tx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_tun_srv_tx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_tun, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_TUN_REQUEST_TUNNEL_RSP:
dissect_zcl_tun_request_tunnel_rsp(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA_TX:
dissect_zcl_tun_transfer_data(tvb, pinfo, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA_ERROR_TX:
dissect_zcl_tun_transfer_data_error(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_TUN_ACK_TRANSFER_DATA_TX:
dissect_zcl_tun_ack_transfer_data(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_TUN_READY_DATA_TX:
dissect_zcl_tun_ready_data(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_TUN_GET_SUPPORTED_PROTOCOLS_RSP:
dissect_zcl_tun_get_supported_rsp(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_TUN_CLOSURE_NOTIFY:
dissect_zcl_tun_closure_notify(tvb, payload_tree, &offset);
break;
default:
break;
}
}
}
return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_tun*/
/**
*This function registers the ZCL Tunneling dissector
*
*/
void
proto_register_zbee_zcl_tun(void)
{
static hf_register_info hf[] = {
{ &hf_zbee_zcl_tun_attr_id,
{ "Attribute", "zbee_zcl_se.tun.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_tun_attr_names),
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_tun_attr_reporting_status, /* common to all SE clusters */
{ "Attribute Reporting Status", "zbee_zcl_se.tun.attr.attr_reporting_status",
FT_UINT8, BASE_HEX, VALS(zbee_zcl_se_reporting_status_names), 0x00, NULL, HFILL } },
{ &hf_zbee_zcl_tun_attr_close_timeout,
{ "Close Tunnel Timeout", "zbee_zcl_se.tun.attr.close_tunnel", FT_UINT16, BASE_DEC, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_tun_srv_tx_cmd_id,
{ "Command", "zbee_zcl_se.tun.cmd.srv_tx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_tun_srv_tx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_tun_srv_rx_cmd_id,
{ "Command", "zbee_zcl_se.tun.cmd.srv_rx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_tun_srv_rx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_tun_protocol_id,
{ "Protocol ID", "zbee_zcl_se.tun.protocol_id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_tun_protocol_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_tun_manufacturer_code,
{ "Manufacturer Code", "zbee_zcl_se.tun.manufacturer_code", FT_UINT16, BASE_HEX, VALS(zbee_mfr_code_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_tun_flow_control_support,
{ "Flow Control Supported", "zbee_zcl_se.tun.flow_control_supported", FT_BOOLEAN, 8, TFS(&tfs_true_false),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_tun_max_in_size,
{ "Max Incoming Transfer Size", "zbee_zcl_se.tun.max_in_transfer_size", FT_UINT16, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_tun_tunnel_id,
{ "Tunnel Id", "zbee_zcl_se.tun.tunnel_id", FT_UINT16, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_tun_num_octets_left,
{ "Num Octets Left", "zbee_zcl_se.tun.octets_left", FT_UINT16, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_tun_protocol_offset,
{ "Protocol Offset", "zbee_zcl_se.tun.protocol_offset", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_tun_transfer_status,
{ "Transfer Status", "zbee_zcl_se.tun.transfer_status", FT_UINT8, BASE_HEX, VALS(zbee_zcl_tun_status_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_tun_transfer_data_status,
{ "Transfer Data Status", "zbee_zcl_se.tun.transfer_data_status", FT_UINT8, BASE_HEX, VALS(zbee_zcl_tun_trans_data_status_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_tun_protocol_count,
{ "Protocol Count", "zbee_zcl_se.tun.protocol_count", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_tun_protocol_list_complete,
{ "List Complete", "zbee_zcl_se.tun.protocol_list_complete", FT_BOOLEAN, 8, TFS(&tfs_true_false),
0x00, NULL, HFILL } },
};
/* ZCL Tunneling subtrees */
gint *ett[] = {
&ett_zbee_zcl_tun,
};
/* Register the ZigBee ZCL Tunneling cluster protocol name and description */
proto_zbee_zcl_tun = proto_register_protocol("ZigBee ZCL Tunneling", "ZCL Tunneling", ZBEE_PROTOABBREV_ZCL_TUN);
proto_register_field_array(proto_zbee_zcl_tun, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
/* Make heuristic dissectors possible */
zbee_zcl_tun_heur_subdissector_list = register_heur_dissector_list(ZBEE_PROTOABBREV_ZCL_TUN, proto_zbee_zcl_tun);
/* Register the ZigBee ZCL Tunneling dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_TUN, dissect_zbee_zcl_tun, proto_zbee_zcl_tun);
} /* proto_register_zbee_zcl_tun */
/**
*Hands off the ZCL Tunneling dissector.
*
*/
void
proto_reg_handoff_zbee_zcl_tun(void)
{
zbee_zcl_init_cluster( ZBEE_PROTOABBREV_ZCL_TUN,
proto_zbee_zcl_tun,
ett_zbee_zcl_tun,
ZBEE_ZCL_CID_TUNNELING,
ZBEE_MFG_CODE_NONE,
hf_zbee_zcl_tun_attr_id,
-1,
hf_zbee_zcl_tun_srv_rx_cmd_id,
hf_zbee_zcl_tun_srv_tx_cmd_id,
(zbee_zcl_fn_attr_data)dissect_zcl_tun_attr_data
);
} /* proto_reg_handoff_zbee_zcl_tun */
/* ########################################################################## */
/* #### (0x0705) PREPAYMENT CLUSTER ########################################## */
/* ########################################################################## */
/* Attributes */
#define zbee_zcl_pp_attr_names_VALUE_STRING_LIST(XXX) \
/* Prepayment Information Set */ \
XXX(ZBEE_ZCL_ATTR_ID_PP_PAYMENT_CONTROL_CONFIGURATION, 0x0000, "Payment Control Configuration" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_CREDIT_REMAINING, 0x0001, "Credit Remaining" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_EMERGENCY_CREDIT_REMAINING, 0x0002, "Emergency Credit Remaining" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_CREDIT_STATUS, 0x0003, "Credit Status" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_CREDIT_REMAINING_TIMESTAMP, 0x0004, "Credit Remaining Timestamp" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_ACCUMULATED_DEBT, 0x0005, "Accumulated Debt" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_OVERALL_DEBT_CAP, 0x0006, "Overall Debt Cap" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_EMERGENCY_CREDIT_LIMIT, 0x0010, "Emergency Credit Limit / Allowance" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_EMERGENCY_CREDIT_THRESHOLD, 0x0011, "Emergency Credit Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_TOTAL_CREDIT_ADDED, 0x0020, "Total Credit Added" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_MAX_CREDIT_LIMIT, 0x0021, "Max Credit Limit" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_MAX_CREDIT_PER_TOPUP, 0x0022, "Max Credit Per Top Up" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_FRIENDLY_CREDIT_WARNING, 0x0030, "Friendly Credit Warning" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_LOW_CREDIT_WARNING, 0x0031, "Low Credit Warning" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_IHD_LOW_CREDIT_WARNING, 0x0032, "IHD Low Credit Warning" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_INTERRUPT_SUSPEND_TIME, 0x0033, "Interrupt Suspend Time" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_REMAINING_FRIENDLY_CREDIT_TIME, 0x0034, "Remaining Friendly Credit Time" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_NEXT_FRIENDLY_CREDIT_PERIOD, 0x0035, "Next Friendly Credit Period" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_CUT_OFF_VALUE, 0x0040, "Cut Off Value" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_TOKEN_CARRIER_ID, 0x0080, "Token Carrier ID" ) \
/* Top-up Set */ \
XXX(ZBEE_ZCL_ATTR_ID_PP_TOPUP_DATE_TIME_1, 0x0100, "Top-up Date/time #1" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_TOPUP_AMOUNT_1, 0x0101, "Top-up Amount #1" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_ORIGINATING_DEVICE_1, 0x0102, "Originating Device #1" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_TOPUP_CODE_1, 0x0103, "Top-up Code #1" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_TOPUP_DATE_TIME_2, 0x0110, "Top-up Date/time #2" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_TOPUP_AMOUNT_2, 0x0111, "Top-up Amount #2" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_ORIGINATING_DEVICE_2, 0x0112, "Originating Device #2" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_TOPUP_CODE_2, 0x0113, "Top-up Code #2" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_TOPUP_DATE_TIME_3, 0x0120, "Top-up Date/time #3" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_TOPUP_AMOUNT_3, 0x0121, "Top-up Amount #3" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_ORIGINATING_DEVICE_3, 0x0122, "Originating Device #3" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_TOPUP_CODE_3, 0x0123, "Top-up Code #3" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_TOPUP_DATE_TIME_4, 0x0130, "Top-up Date/time #4" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_TOPUP_AMOUNT_4, 0x0131, "Top-up Amount #4" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_ORIGINATING_DEVICE_4, 0x0132, "Originating Device #4" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_TOPUP_CODE_4, 0x0133, "Top-up Code #4" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_TOPUP_DATE_TIME_5, 0x0140, "Top-up Date/time #5" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_TOPUP_AMOUNT_5, 0x0141, "Top-up Amount #5" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_ORIGINATING_DEVICE_5, 0x0142, "Originating Device #5" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_TOPUP_CODE_5, 0x0143, "Top-up Code #5" ) \
/* Debt Set */ \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_LABEL_1, 0x0210, "Debt Label #1" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_AMOUNT_1, 0x0211, "Debt Amount #1" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_RECOVERY_METHOD_1, 0x0212, "Debt Recovery Method #1" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_RECOVERY_START_TIME_1, 0x0213, "Debt Recovery Start Time #1" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_RECOVERY_COLLECTION_TIME_1, 0x0214, "Debt Recovery Collection Time #1" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_RECOVERY_FREQ_1, 0x0216, "Debt Recovery Frequency #1" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_RECOVERY_AMOUNT_1, 0x0217, "Debt Recovery Amount #1" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_RECOVERY_TOP_UP_PERCENTAGE_1, 0x0219, "Debt Recovery Top Up Percentage #1" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_LABEL_2, 0x0220, "Debt Label #2" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_AMOUNT_2, 0x0221, "Debt Amount #2" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_RECOVERY_METHOD_2, 0x0222, "Debt Recovery Method #2" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_RECOVERY_START_TIME_2, 0x0223, "Debt Recovery Start Time #2" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_RECOVERY_COLLECTION_TIME_2, 0x0224, "Debt Recovery Collection Time #2" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_RECOVERY_FREQ_2, 0x0226, "Debt Recovery Frequency #2" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_RECOVERY_AMOUNT_2, 0x0227, "Debt Recovery Amount #2" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_RECOVERY_TOP_UP_PERCENTAGE_2, 0x0229, "Debt Recovery Top Up Percentage #2" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_LABEL_3, 0x0230, "Debt Label #3" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_AMOUNT_3, 0x0231, "Debt Amount #3" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_RECOVERY_METHOD_3, 0x0232, "Debt Recovery Method #3" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_RECOVERY_START_TIME_3, 0x0233, "Debt Recovery Start Time #3" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_RECOVERY_COLLECTION_TIME_3, 0x0234, "Debt Recovery Collection Time #3" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_RECOVERY_FREQ_3, 0x0236, "Debt Recovery Frequency #3" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_RECOVERY_AMOUNT_3, 0x0237, "Debt Recovery Amount #3" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_DEBT_RECOVERY_TOP_UP_PERCENTAGE_3, 0x0239, "Debt Recovery Top Up Percentage #3" ) \
/* Alarm Set */ \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREPAYMENT_ALARM_STATUS, 0x0400, "Prepayment Alarm Status" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREPAY_GENERIC_ALARM_MASK, 0x0401, "Prepay Generic Alarm Mask" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREPAY_SWITCH_ALARM_MASK, 0x0402, "Prepay Switch Alarm Mask" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREPAY_EVENT_ALARM_MASK, 0x0403, "Prepay Event Alarm Mask" ) \
/* Historical Cost Consumption Information Set */ \
XXX(ZBEE_ZCL_ATTR_ID_PP_HISTORICAL_COST_CON_FORMAT, 0x0500, "Historical Cost Consumption Formatting" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_CONSUMPTION_UNIT_OF_MEASUREMENT, 0x0501, "Consumption Unit of Measurement" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_CURRENCY_SCALING_FACTOR, 0x0502, "Currency Scaling Factor" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_CURRENCY, 0x0503, "Currency" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_CURRENT_DAY_COST_CON_DELIVERED, 0x051C, "Current Day Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_CURRENT_DAY_COST_CON_RECEIVED, 0x051D, "Current Day Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_DAY_COST_CON_DELIVERED, 0x051E, "Previous Day Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_DAY_COST_CON_RECEIVED, 0x051F, "Previous Day Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_DAY_2_COST_CON_DELIVERED, 0x0520, "Previous Day 2 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_DAY_2_COST_CON_RECEIVED, 0x0521, "Previous Day 2 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_DAY_3_COST_CON_DELIVERED, 0x0522, "Previous Day 3 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_DAY_3_COST_CON_RECEIVED, 0x0523, "Previous Day 3 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_DAY_4_COST_CON_DELIVERED, 0x0524, "Previous Day 4 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_DAY_4_COST_CON_RECEIVED, 0x0525, "Previous Day 4 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_DAY_5_COST_CON_DELIVERED, 0x0526, "Previous Day 5 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_DAY_5_COST_CON_RECEIVED, 0x0527, "Previous Day 5 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_DAY_6_COST_CON_DELIVERED, 0x0528, "Previous Day 6 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_DAY_6_COST_CON_RECEIVED, 0x0529, "Previous Day 6 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_DAY_7_COST_CON_DELIVERED, 0x052A, "Previous Day 7 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_DAY_7_COST_CON_RECEIVED, 0x052B, "Previous Day 7 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_DAY_8_COST_CON_DELIVERED, 0x052C, "Previous Day 8 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_DAY_8_COST_CON_RECEIVED, 0x052D, "Previous Day 8 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_CURRENT_WEEK_COST_CON_DELIVERED, 0x0530, "Current Week Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_CURRENT_WEEK_COST_CON_RECEIVED, 0x0531, "Current Week Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_WEEK_COST_CON_DELIVERED, 0x0532, "Previous Week Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_WEEK_COST_CON_RECEIVED, 0x0533, "Previous Week Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_WEEK_2_COST_CON_DELIVERED, 0x0534, "Previous Week 2 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_WEEK_2_COST_CON_RECEIVED, 0x0535, "Previous Week 2 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_WEEK_3_COST_CON_DELIVERED, 0x0536, "Previous Week 3 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_WEEK_3_COST_CON_RECEIVED, 0x0537, "Previous Week 3 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_WEEK_4_COST_CON_DELIVERED, 0x0538, "Previous Week 4 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_WEEK_4_COST_CON_RECEIVED, 0x0539, "Previous Week 4 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_WEEK_5_COST_CON_DELIVERED, 0x053A, "Previous Week 5 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_WEEK_5_COST_CON_RECEIVED, 0x053B, "Previous Week 5 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_CURRENT_MON_COST_CON_DELIVERED, 0x0540, "Current Month Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_CURRENT_MON_COST_CON_RECEIVED, 0x0541, "Current Month Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_COST_CON_DELIVERED, 0x0542, "Previous Month Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_COST_CON_RECEIVED, 0x0543, "Previous Month Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_2_COST_CON_DELIVERED, 0x0544, "Previous Month 2 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_2_COST_CON_RECEIVED, 0x0545, "Previous Month 2 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_3_COST_CON_DELIVERED, 0x0546, "Previous Month 3 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_3_COST_CON_RECEIVED, 0x0547, "Previous Month 3 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_4_COST_CON_DELIVERED, 0x0548, "Previous Month 4 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_4_COST_CON_RECEIVED, 0x0549, "Previous Month 4 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_5_COST_CON_DELIVERED, 0x054A, "Previous Month 5 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_5_COST_CON_RECEIVED, 0x054B, "Previous Month 5 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_6_COST_CON_DELIVERED, 0x054C, "Previous Month 6 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_6_COST_CON_RECEIVED, 0x054D, "Previous Month 6 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_7_COST_CON_DELIVERED, 0x054E, "Previous Month 7 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_7_COST_CON_RECEIVED, 0x054F, "Previous Month 7 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_8_COST_CON_DELIVERED, 0x0550, "Previous Month 8 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_8_COST_CON_RECEIVED, 0x0551, "Previous Month 8 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_9_COST_CON_DELIVERED, 0x0552, "Previous Month 9 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_9_COST_CON_RECEIVED, 0x0553, "Previous Month 9 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_10_COST_CON_DELIVERED, 0x0554, "Previous Month 10 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_10_COST_CON_RECEIVED, 0x0555, "Previous Month 10 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_11_COST_CON_DELIVERED, 0x0556, "Previous Month 11 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_11_COST_CON_RECEIVED, 0x0557, "Previous Month 11 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_12_COST_CON_DELIVERED, 0x0558, "Previous Month 12 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_12_COST_CON_RECEIVED, 0x0559, "Previous Month 12 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_13_COST_CON_DELIVERED, 0x055A, "Previous Month 13 Cost Consumption Delivered" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_PREVIOUS_MON_13_COST_CON_RECEIVED, 0x055B, "Previous Month 13 Cost Consumption Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_PP_HISTORICAL_FREEZE_TIME, 0x055C, "Historical Freeze Time" ) \
/* Smart Energy */ \
XXX(ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_PP, 0xFFFE, "Attribute Reporting Status" )
VALUE_STRING_ENUM(zbee_zcl_pp_attr_names);
VALUE_STRING_ARRAY(zbee_zcl_pp_attr_names);
static value_string_ext zbee_zcl_pp_attr_names_ext = VALUE_STRING_EXT_INIT(zbee_zcl_pp_attr_names);
/* Server Commands Received */
#define zbee_zcl_pp_srv_rx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_PP_SELECT_AVAILABLE_EMERGENCY_CREDIT, 0x00, "Select Available Emergency Credit" ) \
XXX(ZBEE_ZCL_CMD_ID_PP_CHANGE_DEBT, 0x02, "Change Debt" ) \
XXX(ZBEE_ZCL_CMD_ID_PP_EMERGENCY_CREDIT_SETUP, 0x03, "Emergency Credit Setup" ) \
XXX(ZBEE_ZCL_CMD_ID_PP_CONSUMER_TOP_UP, 0x04, "Consumer Top Up" ) \
XXX(ZBEE_ZCL_CMD_ID_PP_CREDIT_ADJUSTMENT, 0x05, "Credit Adjustment" ) \
XXX(ZBEE_ZCL_CMD_ID_PP_CHANGE_PAYMENT_MODE, 0x06, "Change Payment Mode" ) \
XXX(ZBEE_ZCL_CMD_ID_PP_GET_PREPAY_SNAPTSHOT, 0x07, "Get Prepay Snapshot" ) \
XXX(ZBEE_ZCL_CMD_ID_PP_GET_TOP_UP_LOG, 0x08, "Get Top Up Log" ) \
XXX(ZBEE_ZCL_CMD_ID_PP_SET_LOW_CREDIT_WARNING_LEVEL, 0x09, "Set Low Credit Warning Level" ) \
XXX(ZBEE_ZCL_CMD_ID_PP_GET_DEBT_REPAYMENT_LOG, 0x0A, "Get Debt Repayment Log" ) \
XXX(ZBEE_ZCL_CMD_ID_PP_SET_MAXIMUM_CREDIT_LIMIT, 0x0B, "Set Maximum Credit Limit" ) \
XXX(ZBEE_ZCL_CMD_ID_PP_SET_OVERALL_DEBT_CAP, 0x0C, "Set Overall Debt Cap" )
VALUE_STRING_ENUM(zbee_zcl_pp_srv_rx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_pp_srv_rx_cmd_names);
/* Server Commands Generated */
#define zbee_zcl_pp_srv_tx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_PP_PUBLISH_PREPAY_SNAPSHOT, 0x01, "Publish Prepay Snapshot" ) \
XXX(ZBEE_ZCL_CMD_ID_PP_CHANGE_PAYMENT_MODE_RESPONSE, 0x02, "Change Payment Mode Response" ) \
XXX(ZBEE_ZCL_CMD_ID_PP_CONSUMER_TOP_UP_RESPONSE, 0x03, "Consumer Top Up Response" ) \
XXX(ZBEE_ZCL_CMD_ID_PP_PUBLISH_TOP_UP_LOG, 0x05, "Publish Top Up Log" ) \
XXX(ZBEE_ZCL_CMD_ID_PP_PUBLISH_DEBT_LOG, 0x06, "Publish Debt Log" )
VALUE_STRING_ENUM(zbee_zcl_pp_srv_tx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_pp_srv_tx_cmd_names);
/*************************/
/* Function Declarations */
/*************************/
void proto_register_zbee_zcl_pp(void);
void proto_reg_handoff_zbee_zcl_pp(void);
/* Attribute Dissector Helpers */
static void dissect_zcl_pp_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr);
/* Command Dissector Helpers */
static void dissect_zcl_pp_select_available_emergency_credit (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_pp_change_debt (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_pp_emergency_credit_setup (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_pp_consumer_top_up (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_pp_credit_adjustment (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_pp_change_payment_mode (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_pp_get_prepay_snapshot (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_pp_get_top_up_log (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_pp_set_low_credit_warning_level (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_pp_get_debt_repayment_log (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_pp_set_maximum_credit_limit (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_pp_set_overall_debt_cap (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_pp_publish_prepay_snapshot (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_pp_change_payment_mode_response (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_pp_consumer_top_up_response (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_pp_publish_top_up_log (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_pp_publish_debt_log (tvbuff_t *tvb, proto_tree *tree, guint *offset);
/*************************/
/* Global Variables */
/*************************/
/* Initialize the protocol and registered fields */
static int proto_zbee_zcl_pp = -1;
static int hf_zbee_zcl_pp_srv_tx_cmd_id = -1;
static int hf_zbee_zcl_pp_srv_rx_cmd_id = -1;
static int hf_zbee_zcl_pp_attr_id = -1;
static int hf_zbee_zcl_pp_attr_reporting_status = -1;
static int hf_zbee_zcl_pp_select_available_emc_cmd_issue_date_time = -1;
static int hf_zbee_zcl_pp_select_available_emc_originating_device = -1;
static int hf_zbee_zcl_pp_change_debt_issuer_event_id = -1;
static int hf_zbee_zcl_pp_change_debt_label = -1;
static int hf_zbee_zcl_pp_change_debt_amount = -1;
static int hf_zbee_zcl_pp_change_debt_recovery_method = -1;
static int hf_zbee_zcl_pp_change_debt_amount_type = -1;
static int hf_zbee_zcl_pp_change_debt_recovery_start_time = -1;
static int hf_zbee_zcl_pp_change_debt_recovery_collection_time = -1;
static int hf_zbee_zcl_pp_change_debt_recovery_frequency = -1;
static int hf_zbee_zcl_pp_change_debt_recovery_amount = -1;
static int hf_zbee_zcl_pp_change_debt_recovery_balance_percentage = -1;
static int hf_zbee_zcl_pp_emergency_credit_setup_issuer_event_id = -1;
static int hf_zbee_zcl_pp_emergency_credit_setup_start_time = -1;
static int hf_zbee_zcl_pp_emergency_credit_setup_emergency_credit_limit = -1;
static int hf_zbee_zcl_pp_emergency_credit_setup_emergency_credit_threshold = -1;
static int hf_zbee_zcl_pp_consumer_top_up_originating_device = -1;
static int hf_zbee_zcl_pp_consumer_top_up_top_up_code = -1;
static int hf_zbee_zcl_pp_credit_adjustment_issuer_event_id = -1;
static int hf_zbee_zcl_pp_credit_adjustment_start_time = -1;
static int hf_zbee_zcl_pp_credit_adjustment_credit_adjustment_type = -1;
static int hf_zbee_zcl_pp_credit_adjustment_credit_adjustment_value = -1;
static int hf_zbee_zcl_pp_change_payment_mode_provider_id = -1;
static int hf_zbee_zcl_pp_change_payment_mode_issuer_event_id = -1;
static int hf_zbee_zcl_pp_change_payment_mode_implementation_date_time = -1;
static int hf_zbee_zcl_pp_change_payment_mode_proposed_payment_control_configuration = -1;
static int hf_zbee_zcl_pp_change_payment_mode_cut_off_value = -1;
static int hf_zbee_zcl_pp_get_prepay_snapshot_earliest_start_time = -1;
static int hf_zbee_zcl_pp_get_prepay_snapshot_latest_end_time = -1;
static int hf_zbee_zcl_pp_get_prepay_snapshot_snapshot_offset = -1;
static int hf_zbee_zcl_pp_get_prepay_snapshot_snapshot_cause = -1;
static int hf_zbee_zcl_pp_get_top_up_log_latest_end_time = -1;
static int hf_zbee_zcl_pp_get_top_up_log_number_of_records = -1;
static int hf_zbee_zcl_pp_set_low_credit_warning_level_low_credit_warning_level = -1;
static int hf_zbee_zcl_pp_get_debt_repayment_log_latest_end_time = -1;
static int hf_zbee_zcl_pp_get_debt_repayment_log_number_of_debts = -1;
static int hf_zbee_zcl_pp_get_debt_repayment_log_debt_type = -1;
static int hf_zbee_zcl_pp_set_maximum_credit_limit_provider_id = -1;
static int hf_zbee_zcl_pp_set_maximum_credit_limit_issuer_event_id = -1;
static int hf_zbee_zcl_pp_set_maximum_credit_limit_implementation_date_time = -1;
static int hf_zbee_zcl_pp_set_maximum_credit_limit_maximum_credit_level = -1;
static int hf_zbee_zcl_pp_set_maximum_credit_limit_maximum_credit_per_top_up = -1;
static int hf_zbee_zcl_pp_set_overall_debt_cap_limit_provider_id = -1;
static int hf_zbee_zcl_pp_set_overall_debt_cap_limit_issuer_event_id = -1;
static int hf_zbee_zcl_pp_set_overall_debt_cap_limit_implementation_date_time = -1;
static int hf_zbee_zcl_pp_set_overall_debt_cap_limit_overall_debt_cap = -1;
static int hf_zbee_zcl_pp_publish_prepay_snapshot_snapshot_id = -1;
static int hf_zbee_zcl_pp_publish_prepay_snapshot_snapshot_time = -1;
static int hf_zbee_zcl_pp_publish_prepay_snapshot_total_snapshots_found = -1;
static int hf_zbee_zcl_pp_publish_prepay_snapshot_command_index = -1;
static int hf_zbee_zcl_pp_publish_prepay_snapshot_total_number_of_commands = -1;
static int hf_zbee_zcl_pp_publish_prepay_snapshot_snapshot_cause = -1;
static int hf_zbee_zcl_pp_publish_prepay_snapshot_snapshot_payload_type = -1;
static int hf_zbee_zcl_pp_publish_prepay_snapshot_snapshot_payload = -1;
static int hf_zbee_zcl_pp_change_payment_mode_response_friendly_credit = -1;
static int hf_zbee_zcl_pp_change_payment_mode_response_friendly_credit_calendar_id = -1;
static int hf_zbee_zcl_pp_change_payment_mode_response_emergency_credit_limit = -1;
static int hf_zbee_zcl_pp_change_payment_mode_response_emergency_credit_threshold = -1;
static int hf_zbee_zcl_pp_consumer_top_up_response_result_type = -1;
static int hf_zbee_zcl_pp_consumer_top_up_response_top_up_value = -1;
static int hf_zbee_zcl_pp_consumer_top_up_response_source_of_top_up = -1;
static int hf_zbee_zcl_pp_consumer_top_up_response_credit_remaining = -1;
static int hf_zbee_zcl_pp_publish_top_up_log_command_index = -1;
static int hf_zbee_zcl_pp_publish_top_up_log_total_number_of_commands = -1;
static int hf_zbee_zcl_pp_publish_top_up_log_top_up_code = -1;
static int hf_zbee_zcl_pp_publish_top_up_log_top_up_amount = -1;
static int hf_zbee_zcl_pp_publish_top_up_log_top_up_time = -1;
static int hf_zbee_zcl_pp_publish_debt_log_command_index = -1;
static int hf_zbee_zcl_pp_publish_debt_log_total_number_of_commands = -1;
static int hf_zbee_zcl_pp_publish_debt_log_collection_time = -1;
static int hf_zbee_zcl_pp_publish_debt_log_amount_collected = -1;
static int hf_zbee_zcl_pp_publish_debt_log_debt_type = -1;
static int hf_zbee_zcl_pp_publish_debt_log_outstanding_debt = -1;
static int hf_zbee_zcl_pp_payment_control_configuration = -1;
static int hf_zbee_zcl_pp_payment_control_configuration_disconnection_enabled = -1;
static int hf_zbee_zcl_pp_payment_control_configuration_prepayment_enabled = -1;
static int hf_zbee_zcl_pp_payment_control_configuration_credit_management_enabled = -1;
static int hf_zbee_zcl_pp_payment_control_configuration_credit_display_enabled = -1;
static int hf_zbee_zcl_pp_payment_control_configuration_account_base = -1;
static int hf_zbee_zcl_pp_payment_control_configuration_contactor_fitted = -1;
static int hf_zbee_zcl_pp_payment_control_configuration_standing_charge_configuration = -1;
static int hf_zbee_zcl_pp_payment_control_configuration_emergency_standing_charge_configuration = -1;
static int hf_zbee_zcl_pp_payment_control_configuration_debt_configuration = -1;
static int hf_zbee_zcl_pp_payment_control_configuration_emergency_debt_configuration = -1;
static int hf_zbee_zcl_pp_payment_control_configuration_reserved = -1;
static int hf_zbee_zcl_pp_snapshot_payload_cause_general = -1;
static int hf_zbee_zcl_pp_snapshot_payload_cause_end_of_billing_period = -1;
static int hf_zbee_zcl_pp_snapshot_payload_cause_change_of_tariff_information = -1;
static int hf_zbee_zcl_pp_snapshot_payload_cause_change_of_price_matrix = -1;
static int hf_zbee_zcl_pp_snapshot_payload_cause_manually_triggered_from_client = -1;
static int hf_zbee_zcl_pp_snapshot_payload_cause_change_of_tenancy = -1;
static int hf_zbee_zcl_pp_snapshot_payload_cause_change_of_supplier = -1;
static int hf_zbee_zcl_pp_snapshot_payload_cause_change_of_meter_mode = -1;
static int hf_zbee_zcl_pp_snapshot_payload_cause_top_up_addition = -1;
static int hf_zbee_zcl_pp_snapshot_payload_cause_debt_credit_addition = -1;
static int hf_zbee_zcl_pp_snapshot_payload_cause_reserved = -1;
static int* const zbee_zcl_pp_payment_control_configuration_flags[] = {
&hf_zbee_zcl_pp_payment_control_configuration_disconnection_enabled,
&hf_zbee_zcl_pp_payment_control_configuration_prepayment_enabled,
&hf_zbee_zcl_pp_payment_control_configuration_credit_management_enabled,
&hf_zbee_zcl_pp_payment_control_configuration_credit_display_enabled,
&hf_zbee_zcl_pp_payment_control_configuration_account_base,
&hf_zbee_zcl_pp_payment_control_configuration_contactor_fitted,
&hf_zbee_zcl_pp_payment_control_configuration_standing_charge_configuration,
&hf_zbee_zcl_pp_payment_control_configuration_emergency_standing_charge_configuration,
&hf_zbee_zcl_pp_payment_control_configuration_debt_configuration,
&hf_zbee_zcl_pp_payment_control_configuration_emergency_debt_configuration,
&hf_zbee_zcl_pp_payment_control_configuration_reserved,
NULL
};
static int* const zbee_zcl_pp_snapshot_payload_cause_flags[] = {
&hf_zbee_zcl_pp_snapshot_payload_cause_general,
&hf_zbee_zcl_pp_snapshot_payload_cause_end_of_billing_period,
&hf_zbee_zcl_pp_snapshot_payload_cause_change_of_tariff_information,
&hf_zbee_zcl_pp_snapshot_payload_cause_change_of_price_matrix,
&hf_zbee_zcl_pp_snapshot_payload_cause_manually_triggered_from_client,
&hf_zbee_zcl_pp_snapshot_payload_cause_change_of_tenancy,
&hf_zbee_zcl_pp_snapshot_payload_cause_change_of_supplier,
&hf_zbee_zcl_pp_snapshot_payload_cause_change_of_meter_mode,
&hf_zbee_zcl_pp_snapshot_payload_cause_top_up_addition,
&hf_zbee_zcl_pp_snapshot_payload_cause_debt_credit_addition,
&hf_zbee_zcl_pp_snapshot_payload_cause_reserved,
NULL
};
/* Initialize the subtree pointers */
#define ZBEE_ZCL_SE_PP_NUM_INDIVIDUAL_ETT 3
#define ZBEE_ZCL_SE_PP_NUM_PUBLISH_TOP_UP_LOG_ETT 30
#define ZBEE_ZCL_SE_PP_NUM_PUBLISH_DEBT_LOG_ETT 30
#define ZBEE_ZCL_SE_PP_NUM_TOTAL_ETT (ZBEE_ZCL_SE_PP_NUM_INDIVIDUAL_ETT + \
ZBEE_ZCL_SE_PP_NUM_PUBLISH_TOP_UP_LOG_ETT + \
ZBEE_ZCL_SE_PP_NUM_PUBLISH_DEBT_LOG_ETT)
static gint ett_zbee_zcl_pp = -1;
static gint ett_zbee_zcl_pp_payment_control_configuration = -1;
static gint ett_zbee_zcl_pp_snapshot_payload_cause = -1;
static gint ett_zbee_zcl_pp_publish_top_up_entry[ZBEE_ZCL_SE_PP_NUM_PUBLISH_TOP_UP_LOG_ETT];
static gint ett_zbee_zcl_pp_publish_debt_log_entry[ZBEE_ZCL_SE_PP_NUM_PUBLISH_DEBT_LOG_ETT];
/*************************/
/* Function Bodies */
/*************************/
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*@param attr_id attribute identifier
*@param data_type attribute data type
*@param client_attr ZCL client
*/
static void
dissect_zcl_pp_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr)
{
switch (attr_id) {
/* applies to all SE clusters */
case ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_PP:
proto_tree_add_item(tree, hf_zbee_zcl_pp_attr_reporting_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
break;
case ZBEE_ZCL_ATTR_ID_PP_PAYMENT_CONTROL_CONFIGURATION:
proto_item_append_text(tree, ", Payment Control Configuration");
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_pp_payment_control_configuration,
ett_zbee_zcl_pp_payment_control_configuration, zbee_zcl_pp_payment_control_configuration_flags, ENC_LITTLE_ENDIAN);
*offset += 2;
break;
default: /* Catch all */
dissect_zcl_attr_data(tvb, tree, offset, data_type, client_attr);
break;
}
} /*dissect_zcl_pp_attr_data*/
/**
*ZigBee ZCL Prepayment cluster dissector for wireshark.
*
*@param tvb pointer to buffer containing raw packet.
*@param pinfo pointer to packet information fields
*@param tree pointer to data tree Wireshark uses to display packet.
*/
static int
dissect_zbee_zcl_pp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
proto_tree *payload_tree;
zbee_zcl_packet *zcl;
guint offset = 0;
guint8 cmd_id;
gint rem_len;
/* Reject the packet if data is NULL */
if (data == NULL)
return 0;
zcl = (zbee_zcl_packet *)data;
cmd_id = zcl->cmd_id;
/* Create a subtree for the ZCL Command frame, and add the command ID to it. */
if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_pp_srv_rx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_pp_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_pp, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_PP_SELECT_AVAILABLE_EMERGENCY_CREDIT:
dissect_zcl_pp_select_available_emergency_credit(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PP_CHANGE_DEBT:
dissect_zcl_pp_change_debt(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PP_EMERGENCY_CREDIT_SETUP:
dissect_zcl_pp_emergency_credit_setup(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PP_CONSUMER_TOP_UP:
dissect_zcl_pp_consumer_top_up(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PP_CREDIT_ADJUSTMENT:
dissect_zcl_pp_credit_adjustment(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PP_CHANGE_PAYMENT_MODE:
dissect_zcl_pp_change_payment_mode(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PP_GET_PREPAY_SNAPTSHOT:
dissect_zcl_pp_get_prepay_snapshot(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PP_GET_TOP_UP_LOG:
dissect_zcl_pp_get_top_up_log(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PP_SET_LOW_CREDIT_WARNING_LEVEL:
dissect_zcl_pp_set_low_credit_warning_level(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PP_GET_DEBT_REPAYMENT_LOG:
dissect_zcl_pp_get_debt_repayment_log(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PP_SET_MAXIMUM_CREDIT_LIMIT:
dissect_zcl_pp_set_maximum_credit_limit(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PP_SET_OVERALL_DEBT_CAP:
dissect_zcl_pp_set_overall_debt_cap(tvb, payload_tree, &offset);
break;
default:
break;
}
}
}
else { /* ZBEE_ZCL_FCF_TO_CLIENT */
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_pp_srv_tx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_pp_srv_tx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_pp, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_PP_PUBLISH_PREPAY_SNAPSHOT:
dissect_zcl_pp_publish_prepay_snapshot(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PP_CHANGE_PAYMENT_MODE_RESPONSE:
dissect_zcl_pp_change_payment_mode_response(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PP_CONSUMER_TOP_UP_RESPONSE:
dissect_zcl_pp_consumer_top_up_response(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PP_PUBLISH_TOP_UP_LOG:
dissect_zcl_pp_publish_top_up_log(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_PP_PUBLISH_DEBT_LOG:
dissect_zcl_pp_publish_debt_log(tvb, payload_tree, &offset);
break;
default:
break;
}
}
}
return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_pp*/
/**
*This function manages the Select Available Emergency Credit payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_pp_select_available_emergency_credit(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
/* Command Issue Date/Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_pp_select_available_emc_cmd_issue_date_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Originating Device */
proto_tree_add_item(tree, hf_zbee_zcl_pp_select_available_emc_originating_device, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_pp_select_available_emergency_credit*/
/**
*This function manages the Change Debt payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_pp_change_debt(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
guint8 label_length;
nstime_t start_time;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_pp_change_debt_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Debt Label */
label_length = tvb_get_guint8(tvb, *offset) + 1;
proto_tree_add_item(tree, hf_zbee_zcl_pp_change_debt_label, tvb, *offset, label_length, ENC_NA);
*offset += label_length;
/* Debt Amount */
proto_tree_add_item(tree, hf_zbee_zcl_pp_change_debt_amount, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Debt Recovery Method */
proto_tree_add_item(tree, hf_zbee_zcl_pp_change_debt_recovery_method, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Debt Amount Type */
proto_tree_add_item(tree, hf_zbee_zcl_pp_change_debt_amount_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Debt Recovery Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_pp_change_debt_recovery_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Debt Recovery Collection Time */
proto_tree_add_item(tree, hf_zbee_zcl_pp_change_debt_recovery_collection_time, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Debt Recovery Frequency */
proto_tree_add_item(tree, hf_zbee_zcl_pp_change_debt_recovery_frequency, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Debt Recovery Amount */
proto_tree_add_item(tree, hf_zbee_zcl_pp_change_debt_recovery_amount, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Debt Recovery Balance Percentage */
proto_tree_add_item(tree, hf_zbee_zcl_pp_change_debt_recovery_balance_percentage, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_pp_change_debt*/
/**
*This function manages the Select Available Emergency Credit payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_pp_emergency_credit_setup(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_pp_emergency_credit_setup_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_pp_emergency_credit_setup_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Emergency Credit Limit */
proto_tree_add_item(tree, hf_zbee_zcl_pp_emergency_credit_setup_emergency_credit_limit, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Emergency Credit Threshold */
proto_tree_add_item(tree, hf_zbee_zcl_pp_emergency_credit_setup_emergency_credit_threshold, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_pp_emergency_credit_setup*/
/**
*This function manages the Consumer Top Up payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_pp_consumer_top_up(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
int length;
/* Originating Device */
proto_tree_add_item(tree, hf_zbee_zcl_pp_consumer_top_up_originating_device, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* TopUp Code */
proto_tree_add_item_ret_length(tree, hf_zbee_zcl_pp_consumer_top_up_top_up_code, tvb, *offset, 1, ENC_NA|ENC_ZIGBEE, &length);
*offset += length;
} /*dissect_zcl_pp_consumer_top_up*/
/**
*This function manages the Credit Adjustment payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_pp_credit_adjustment(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_pp_credit_adjustment_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_pp_credit_adjustment_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Credit Adjustment Type */
proto_tree_add_item(tree, hf_zbee_zcl_pp_credit_adjustment_credit_adjustment_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Credit Adjustment Value */
proto_tree_add_item(tree, hf_zbee_zcl_pp_credit_adjustment_credit_adjustment_value, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_pp_credit_adjustment*/
/**
*This function manages the Change Payment Mode payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_pp_change_payment_mode(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_pp_change_payment_mode_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_pp_change_payment_mode_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Implementation Date/Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_pp_change_payment_mode_implementation_date_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Proposed Payment Control Configuration */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_pp_change_payment_mode_proposed_payment_control_configuration,
ett_zbee_zcl_pp_payment_control_configuration, zbee_zcl_pp_payment_control_configuration_flags, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Cut Off Value */
proto_tree_add_item(tree, hf_zbee_zcl_pp_change_payment_mode_cut_off_value, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_pp_change_payment_mode*/
/**
*This function manages the Get Prepay Snapshot payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_pp_get_prepay_snapshot(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
nstime_t end_time;
/* Earliest Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_pp_get_prepay_snapshot_earliest_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Latest End Time */
end_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
end_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_pp_get_prepay_snapshot_latest_end_time, tvb, *offset, 4, &end_time);
*offset += 4;
/* Snapshot Offset */
proto_tree_add_item(tree, hf_zbee_zcl_pp_get_prepay_snapshot_snapshot_offset, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Snapshot Cause */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_pp_get_prepay_snapshot_snapshot_cause,
ett_zbee_zcl_pp_snapshot_payload_cause, zbee_zcl_pp_snapshot_payload_cause_flags, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_pp_get_prepay_snapshot*/
/**
*This function manages the Get Top Up Log payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_pp_get_top_up_log(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t end_time;
/* Latest End Time */
end_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
end_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_pp_get_top_up_log_latest_end_time, tvb, *offset, 4, &end_time);
*offset += 4;
/* Number of Records */
proto_tree_add_item(tree, hf_zbee_zcl_pp_get_top_up_log_number_of_records, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_pp_get_top_up_log*/
/**
*This function manages the Set Low Credit Warning Level payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_pp_set_low_credit_warning_level(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Low Credit Warning Level */
proto_tree_add_item(tree, hf_zbee_zcl_pp_set_low_credit_warning_level_low_credit_warning_level, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_pp_set_low_credit_warning_level*/
/**
*This function manages the Get Debt Repayment Log payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_pp_get_debt_repayment_log(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t end_time;
/* Latest End Time */
end_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
end_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_pp_get_debt_repayment_log_latest_end_time, tvb, *offset, 4, &end_time);
*offset += 4;
/* Number of Records */
proto_tree_add_item(tree, hf_zbee_zcl_pp_get_debt_repayment_log_number_of_debts, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Debt Type */
proto_tree_add_item(tree, hf_zbee_zcl_pp_get_debt_repayment_log_debt_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_pp_get_debt_repayment_log*/
/**
*This function manages the Set Maximum Credit Limit payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_pp_set_maximum_credit_limit(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_pp_set_maximum_credit_limit_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_pp_set_maximum_credit_limit_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Implementation Date/Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_pp_set_maximum_credit_limit_implementation_date_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Maximum Credit Level */
proto_tree_add_item(tree, hf_zbee_zcl_pp_set_maximum_credit_limit_maximum_credit_level, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Maximum Credit Per Top Up */
proto_tree_add_item(tree, hf_zbee_zcl_pp_set_maximum_credit_limit_maximum_credit_per_top_up, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_pp_set_maximum_credit_limit*/
/**
*This function manages the Set Overall Debt Cap payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_pp_set_overall_debt_cap(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_pp_set_overall_debt_cap_limit_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_pp_set_overall_debt_cap_limit_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Implementation Date/Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_pp_set_overall_debt_cap_limit_implementation_date_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Overall Debt Cap */
proto_tree_add_item(tree, hf_zbee_zcl_pp_set_overall_debt_cap_limit_overall_debt_cap, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_pp_set_overall_debt_cap*/
/**
*This function manages the Publish Prepay Snapshot payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_pp_publish_prepay_snapshot(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t snapshot_time;
gint rem_len;
/* Snapshot ID */
proto_tree_add_item(tree, hf_zbee_zcl_pp_publish_prepay_snapshot_snapshot_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Snapshot Time */
snapshot_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
snapshot_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_pp_publish_prepay_snapshot_snapshot_time, tvb, *offset, 4, &snapshot_time);
*offset += 4;
/* Total Snapshots Found */
proto_tree_add_item(tree, hf_zbee_zcl_pp_publish_prepay_snapshot_total_snapshots_found, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Command Index */
proto_tree_add_item(tree, hf_zbee_zcl_pp_publish_prepay_snapshot_command_index, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Total Number of Commands */
proto_tree_add_item(tree, hf_zbee_zcl_pp_publish_prepay_snapshot_total_number_of_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Snapshot Cause */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_pp_publish_prepay_snapshot_snapshot_cause,
ett_zbee_zcl_pp_snapshot_payload_cause, zbee_zcl_pp_snapshot_payload_cause_flags, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Snapshot Payload Type */
proto_tree_add_item(tree, hf_zbee_zcl_pp_publish_prepay_snapshot_snapshot_payload_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Snapshot Payload */
rem_len = tvb_reported_length_remaining(tvb, *offset);
proto_tree_add_item(tree, hf_zbee_zcl_pp_publish_prepay_snapshot_snapshot_payload, tvb, *offset, rem_len, ENC_NA);
*offset += rem_len;
} /*dissect_zcl_pp_publish_prepay_snapshot*/
/**
*This function manages the Change Payment Mode Response payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_pp_change_payment_mode_response(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Friendly Credit */
proto_tree_add_item(tree, hf_zbee_zcl_pp_change_payment_mode_response_friendly_credit, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Friendly Credit Calendar ID */
proto_tree_add_item(tree, hf_zbee_zcl_pp_change_payment_mode_response_friendly_credit_calendar_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Emergency Credit Limit */
proto_tree_add_item(tree, hf_zbee_zcl_pp_change_payment_mode_response_emergency_credit_limit, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Emergency Credit Threshold */
proto_tree_add_item(tree, hf_zbee_zcl_pp_change_payment_mode_response_emergency_credit_threshold, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_pp_change_payment_mode_response*/
/**
*This function manages the Consumer Top Up Response payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_pp_consumer_top_up_response(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Result Type */
proto_tree_add_item(tree, hf_zbee_zcl_pp_consumer_top_up_response_result_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Top Up Value */
proto_tree_add_item(tree, hf_zbee_zcl_pp_consumer_top_up_response_top_up_value, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Source of Top up */
proto_tree_add_item(tree, hf_zbee_zcl_pp_consumer_top_up_response_source_of_top_up, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Credit Remaining */
proto_tree_add_item(tree, hf_zbee_zcl_pp_consumer_top_up_response_credit_remaining, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_pp_consumer_top_up_response*/
/**
*This function manages the Publish Top Up Log payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_pp_publish_top_up_log(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
guint i = 0;
gint length;
nstime_t top_up_time;
proto_tree *sub_tree;
/* Command Index */
proto_tree_add_item(tree, hf_zbee_zcl_pp_publish_top_up_log_command_index, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Total Number of Commands */
proto_tree_add_item(tree, hf_zbee_zcl_pp_publish_top_up_log_total_number_of_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Top Up Payload */
while (tvb_reported_length_remaining(tvb, *offset) > 0 && i < ZBEE_ZCL_SE_PP_NUM_PUBLISH_TOP_UP_LOG_ETT) {
/* Add subtree */
sub_tree = proto_tree_add_subtree_format(tree, tvb, *offset, 0, ett_zbee_zcl_pp_publish_top_up_entry[i], NULL, "TopUp Log %d", i + 1);
i++;
/* Top Up Code */
proto_tree_add_item_ret_length(sub_tree, hf_zbee_zcl_pp_publish_top_up_log_top_up_code, tvb, *offset, 1, ENC_NA|ENC_ZIGBEE, &length);
*offset += length;
/* Top Up Amount */
proto_tree_add_item(sub_tree, hf_zbee_zcl_pp_publish_top_up_log_top_up_amount, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Top Up Time */
top_up_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
top_up_time.nsecs = 0;
proto_tree_add_time(sub_tree, hf_zbee_zcl_pp_publish_top_up_log_top_up_time, tvb, *offset, 4, &top_up_time);
*offset += 4;
/* Set length of subtree */
proto_item_set_end(proto_tree_get_parent(sub_tree), tvb, *offset);
}
} /*dissect_zcl_pp_publish_top_up_log*/
/**
*This function manages the Publish Debt Log payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_pp_publish_debt_log(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
guint i = 0;
nstime_t collection_time;
proto_tree *sub_tree;
/* Command Index */
proto_tree_add_item(tree, hf_zbee_zcl_pp_publish_debt_log_command_index, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Total Number of Commands */
proto_tree_add_item(tree, hf_zbee_zcl_pp_publish_debt_log_total_number_of_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Debt Payload */
while (tvb_reported_length_remaining(tvb, *offset) > 0 && i < ZBEE_ZCL_SE_PP_NUM_PUBLISH_DEBT_LOG_ETT) {
/* Add subtree */
sub_tree = proto_tree_add_subtree_format(tree, tvb, *offset, 4 + 4 + 1 + 4, ett_zbee_zcl_pp_publish_debt_log_entry[i], NULL, "Debt Log %d", i + 1);
i++;
/* Collection Time */
collection_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
collection_time.nsecs = 0;
proto_tree_add_time(sub_tree, hf_zbee_zcl_pp_publish_debt_log_collection_time, tvb, *offset, 4, &collection_time);
*offset += 4;
/* Amount Collected */
proto_tree_add_item(sub_tree, hf_zbee_zcl_pp_publish_debt_log_amount_collected, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Debt Type */
proto_tree_add_item(sub_tree, hf_zbee_zcl_pp_publish_debt_log_debt_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Outstanding Debt */
proto_tree_add_item(sub_tree, hf_zbee_zcl_pp_publish_debt_log_outstanding_debt, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
}
} /*dissect_zcl_pp_publish_debt_log*/
/**
*This function registers the ZCL Prepayment dissector
*
*/
void
proto_register_zbee_zcl_pp(void)
{
static hf_register_info hf[] = {
{ &hf_zbee_zcl_pp_attr_id,
{ "Attribute", "zbee_zcl_se.pp.attr_id", FT_UINT16, BASE_HEX | BASE_EXT_STRING, &zbee_zcl_pp_attr_names_ext,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_pp_attr_reporting_status, /* common to all SE clusters */
{ "Attribute Reporting Status", "zbee_zcl_se.pp.attr.attr_reporting_status",
FT_UINT8, BASE_HEX, VALS(zbee_zcl_se_reporting_status_names), 0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_srv_tx_cmd_id,
{ "Command", "zbee_zcl_se.pp.cmd.srv_tx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_pp_srv_tx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_srv_rx_cmd_id,
{ "Command", "zbee_zcl_se.pp.cmd.srv_rx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_pp_srv_rx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_select_available_emc_cmd_issue_date_time,
{ "Command Issue Date/Time", "zbee_zcl_se.pp.select_available_emc.cmd_issue_date_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_select_available_emc_originating_device,
{ "Originating Device", "zbee_zcl_se.pp.select_available_emc.originating_device", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_debt_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.pp.change_debt.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_debt_label,
{ "Debt Label", "zbee_zcl_se.pp.change_debt.debt_label", FT_BYTES, BASE_NONE, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_debt_amount,
{ "Debt Amount", "zbee_zcl_se.pp.change_debt.debt_amount", FT_INT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_debt_recovery_method,
{ "Debt Recovery Method", "zbee_zcl_se.pp.change_debt.recovery_method", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_debt_amount_type,
{ "Debt Amount Type", "zbee_zcl_se.pp.change_debt.amount_type", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_debt_recovery_start_time,
{ "Debt Recovery Start Time", "zbee_zcl_se.pp.change_debt.recovery_start_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_debt_recovery_collection_time,
{ "Debt Recovery Collection Time", "zbee_zcl_se.pp.change_debt.recovery_collection_time", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_debt_recovery_frequency,
{ "Debt Recovery Frequency", "zbee_zcl_se.pp.change_debt.recovery_frequency", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_debt_recovery_amount,
{ "Debt Recovery Amount", "zbee_zcl_se.pp.change_debt.recovery_amount", FT_INT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_debt_recovery_balance_percentage,
{ "Debt Recovery Balance Percentage", "zbee_zcl_se.pp.change_debt.recovery_balance_percentage", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_emergency_credit_setup_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.pp.emc_setup.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_emergency_credit_setup_start_time,
{ "Start Time", "zbee_zcl_se.pp.emc_setup.start_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_emergency_credit_setup_emergency_credit_limit,
{ "Emergency Credit Limit", "zbee_zcl_se.pp.emc_setup.emc_limit", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_emergency_credit_setup_emergency_credit_threshold,
{ "Emergency Credit Threshold", "zbee_zcl_se.pp.emc_setup.emc_threshold", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_consumer_top_up_originating_device,
{ "Originating Device", "zbee_zcl_se.pp.consumer_top_up.originating_device", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_consumer_top_up_top_up_code,
{ "TopUp Code", "zbee_zcl_se.pp.consumer_top_up.top_up_code", FT_UINT_BYTES, SEP_COLON, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_credit_adjustment_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.pp.credit_adjustment.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_credit_adjustment_start_time,
{ "Start Time", "zbee_zcl_se.pp.credit_adjustment.start_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_credit_adjustment_credit_adjustment_type,
{ "Credit Adjustment Type", "zbee_zcl_se.pp.credit_adjustment.credit_adjustment_type", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_credit_adjustment_credit_adjustment_value,
{ "Credit Adjustment Value", "zbee_zcl_se.pp.credit_adjustment.credit_adjustment_value", FT_INT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_payment_mode_provider_id,
{ "Provider ID", "zbee_zcl_se.pp.change_payment_mode.provider_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_payment_mode_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.pp.change_payment_mode.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_payment_mode_implementation_date_time,
{ "Implementation Date/Time", "zbee_zcl_se.pp.change_payment_mode.implementation_date_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_payment_mode_proposed_payment_control_configuration,
{ "Proposed Payment Control Configuration", "zbee_zcl_se.pp.change_payment_mode.payment_control_configuration", FT_UINT16, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_payment_mode_cut_off_value,
{ "Cut Off Value", "zbee_zcl_se.pp.change_payment_mode.cut_off_value", FT_INT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_get_prepay_snapshot_earliest_start_time,
{ "Earliest Start Time", "zbee_zcl_se.pp.get_prepay_snapshot.earliest_start_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_get_prepay_snapshot_latest_end_time,
{ "Latest End Time", "zbee_zcl_se.pp.get_prepay_snapshot.latest_end_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_get_prepay_snapshot_snapshot_offset,
{ "Snapshot Offset", "zbee_zcl_se.pp.get_prepay_snapshot.snapshot_offset", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_get_prepay_snapshot_snapshot_cause,
{ "Snapshot Cause", "zbee_zcl_se.pp.get_prepay_snapshot.snapshot_cause", FT_UINT32, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_get_top_up_log_latest_end_time,
{ "Latest End Time", "zbee_zcl_se.pp.get_top_up_log.latest_end_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_get_top_up_log_number_of_records,
{ "Number of Records", "zbee_zcl_se.pp.get_top_up_log.number_of_records", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_set_low_credit_warning_level_low_credit_warning_level,
{ "Low Credit Warning Level", "zbee_zcl_se.pp.set_low_credit_warning_level.low_credit_warning_level", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_get_debt_repayment_log_latest_end_time,
{ "Latest End Time", "zbee_zcl_se.pp.get_debt_repayment_log.latest_end_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_get_debt_repayment_log_number_of_debts,
{ "Number of Records", "zbee_zcl_se.pp.get_debt_repayment_log.number_of_records", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_get_debt_repayment_log_debt_type,
{ "Debt Type", "zbee_zcl_se.pp.get_debt_repayment_log.debt_type", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_set_maximum_credit_limit_provider_id,
{ "Provider ID", "zbee_zcl_se.pp.set_maximum_credit_limit.provider_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_set_maximum_credit_limit_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.pp.set_maximum_credit_limit.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_set_maximum_credit_limit_implementation_date_time,
{ "Implementation Date/Time", "zbee_zcl_se.pp.set_maximum_credit_limit.implementation_date_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_set_maximum_credit_limit_maximum_credit_level,
{ "Maximum Credit Level", "zbee_zcl_se.pp.set_maximum_credit_limit.max_credit_level", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_set_maximum_credit_limit_maximum_credit_per_top_up,
{ "Maximum Credit Per Top Up", "zbee_zcl_se.pp.set_maximum_credit_limit.max_credit_per_top_up", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_set_overall_debt_cap_limit_provider_id,
{ "Provider ID", "zbee_zcl_se.pp.set_overall_debt_cap_limit.provider_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_set_overall_debt_cap_limit_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.pp.set_overall_debt_cap_limit.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_set_overall_debt_cap_limit_implementation_date_time,
{ "Implementation Date/Time", "zbee_zcl_se.pp.set_overall_debt_cap_limit.implementation_date_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_set_overall_debt_cap_limit_overall_debt_cap,
{ "Overall Debt Cap", "zbee_zcl_se.pp.set_overall_debt_cap_limit.overall_debt_cap", FT_INT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_prepay_snapshot_snapshot_id,
{ "Snapshot ID", "zbee_zcl_se.pp.publish_prepay_snapshot.snapshot_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_prepay_snapshot_snapshot_time,
{ "Snapshot Time", "zbee_zcl_se.pp.publish_prepay_snapshot.snapshot_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_prepay_snapshot_total_snapshots_found,
{ "Total Snapshots Found", "zbee_zcl_se.pp.publish_prepay_snapshot.total_snapshots_found", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_prepay_snapshot_command_index,
{ "Command Index", "zbee_zcl_se.pp.publish_prepay_snapshot.command_index", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_prepay_snapshot_total_number_of_commands,
{ "Total Number of Commands", "zbee_zcl_se.pp.publish_prepay_snapshot.total_number_of_commands", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_prepay_snapshot_snapshot_cause,
{ "Snapshot Cause", "zbee_zcl_se.pp.publish_prepay_snapshot.snapshot_cause", FT_UINT32, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_prepay_snapshot_snapshot_payload_type,
{ "Snapshot Payload Type", "zbee_zcl_se.pp.publish_prepay_snapshot.snapshot_payload_type", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_prepay_snapshot_snapshot_payload,
{ "Snapshot Payload", "zbee_zcl_se.pp.publish_prepay_snapshot.snapshot_payload", FT_BYTES, BASE_NONE, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_payment_mode_response_friendly_credit,
{ "Friendly Credit", "zbee_zcl_se.pp.change_payment_mode_response.friendly_credit", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_payment_mode_response_friendly_credit_calendar_id,
{ "Friendly Credit Calendar ID", "zbee_zcl_se.pp.change_payment_mode_response.friendly_credit_calendar_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_payment_mode_response_emergency_credit_limit,
{ "Emergency Credit Limit", "zbee_zcl_se.pp.change_payment_mode_response.emc_limit", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_change_payment_mode_response_emergency_credit_threshold,
{ "Emergency Credit Threshold", "zbee_zcl_se.pp.change_payment_mode_response.emc_threshold", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_consumer_top_up_response_result_type,
{ "Result Type", "zbee_zcl_se.pp.consumer_top_up_response.result_type", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_consumer_top_up_response_top_up_value,
{ "Top Up Value", "zbee_zcl_se.pp.consumer_top_up_response.top_up_value", FT_INT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_consumer_top_up_response_source_of_top_up,
{ "Source of Top up", "zbee_zcl_se.pp.consumer_top_up_response.source_of_top_up", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_consumer_top_up_response_credit_remaining,
{ "Credit Remaining", "zbee_zcl_se.pp.consumer_top_up_response.credit_remaining", FT_INT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_top_up_log_command_index,
{ "Command Index", "zbee_zcl_se.pp.publish_top_up_log.command_index", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_top_up_log_total_number_of_commands,
{ "Total Number of Commands", "zbee_zcl_se.pp.publish_top_up_log.total_number_of_commands", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_top_up_log_top_up_code,
{ "TopUp Code", "zbee_zcl_se.pp.publish_top_up_log.top_up_code", FT_UINT_BYTES, SEP_COLON, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_top_up_log_top_up_amount,
{ "TopUp Amount", "zbee_zcl_se.pp.publish_top_up_log.top_up_amount", FT_INT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_top_up_log_top_up_time,
{ "TopUp Time", "zbee_zcl_se.pp.publish_top_up_log.top_up_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_debt_log_command_index,
{ "Command Index", "zbee_zcl_se.pp.publish_debt_log.command_index", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_debt_log_total_number_of_commands,
{ "Total Number of Commands", "zbee_zcl_se.pp.publish_debt_log.total_number_of_commands", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_debt_log_collection_time,
{ "Collection Time", "zbee_zcl_se.pp.publish_debt_log.collection_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_debt_log_amount_collected,
{ "Amount Collected", "zbee_zcl_se.pp.publish_debt_log.amount_collected", FT_INT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_debt_log_debt_type,
{ "Debt Type", "zbee_zcl_se.pp.publish_debt_log.debt_type", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_publish_debt_log_outstanding_debt,
{ "Outstanding Debt", "zbee_zcl_se.pp.publish_debt_log.outstanding_debt", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_payment_control_configuration,
{ "Payment Control Configuration", "zbee_zcl_se.pp.attr.payment_control_configuration", FT_UINT16, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_pp_payment_control_configuration_disconnection_enabled,
{ "Disconnection Enabled", "zbee_zcl_se.pp.attr.payment_control_configuration.disconnection_enabled", FT_BOOLEAN, 16, NULL,
0x0001, NULL, HFILL } },
{ &hf_zbee_zcl_pp_payment_control_configuration_prepayment_enabled,
{ "Prepayment Enabled", "zbee_zcl_se.pp.attr.payment_control_configuration.prepayment_enabled", FT_BOOLEAN, 16, NULL,
0x0002, NULL, HFILL } },
{ &hf_zbee_zcl_pp_payment_control_configuration_credit_management_enabled,
{ "Credit Management Enabled", "zbee_zcl_se.pp.attr.payment_control_configuration.credit_management_enabled", FT_BOOLEAN, 16, NULL,
0x0004, NULL, HFILL } },
{ &hf_zbee_zcl_pp_payment_control_configuration_credit_display_enabled,
{ "Credit Display Enabled", "zbee_zcl_se.pp.attr.payment_control_configuration.credit_display_enabled", FT_BOOLEAN, 16, NULL,
0x0010, NULL, HFILL } },
{ &hf_zbee_zcl_pp_payment_control_configuration_account_base,
{ "Account Base", "zbee_zcl_se.pp.attr.payment_control_configuration.account_base", FT_BOOLEAN, 16, NULL,
0x0040, NULL, HFILL } },
{ &hf_zbee_zcl_pp_payment_control_configuration_contactor_fitted,
{ "Contactor Fitted", "zbee_zcl_se.pp.attr.payment_control_configuration.contactor_fitted", FT_BOOLEAN, 16, NULL,
0x0080, NULL, HFILL } },
{ &hf_zbee_zcl_pp_payment_control_configuration_standing_charge_configuration,
{ "Standing Charge Configuration", "zbee_zcl_se.pp.attr.payment_control_configuration.standing_charge_configuration", FT_BOOLEAN, 16, NULL,
0x0100, NULL, HFILL } },
{ &hf_zbee_zcl_pp_payment_control_configuration_emergency_standing_charge_configuration,
{ "Emergency Standing Charge Configuration", "zbee_zcl_se.pp.attr.payment_control_configuration.emergency_standing_charge_configuration", FT_BOOLEAN, 16, NULL,
0x0200, NULL, HFILL } },
{ &hf_zbee_zcl_pp_payment_control_configuration_debt_configuration,
{ "Debt Configuration", "zbee_zcl_se.pp.attr.payment_control_configuration.debt_configuration", FT_BOOLEAN, 16, NULL,
0x0400, NULL, HFILL } },
{ &hf_zbee_zcl_pp_payment_control_configuration_emergency_debt_configuration,
{ "Emergency Debt Configuration", "zbee_zcl_se.pp.attr.payment_control_configuration.emergency_debt_configuration", FT_BOOLEAN, 16, NULL,
0x0800, NULL, HFILL } },
{ &hf_zbee_zcl_pp_payment_control_configuration_reserved,
{ "Reserved", "zbee_zcl_se.pp.attr.payment_control_configuration.reserved", FT_UINT16, BASE_HEX, NULL,
0xF028, NULL, HFILL } },
{ &hf_zbee_zcl_pp_snapshot_payload_cause_general,
{ "General", "zbee_zcl_se.pp.snapshot_payload_cause.general", FT_BOOLEAN, 32, NULL,
0x00000001, NULL, HFILL } },
{ &hf_zbee_zcl_pp_snapshot_payload_cause_end_of_billing_period,
{ "End of Billing Period", "zbee_zcl_se.pp.snapshot_payload_cause.end_of_billing_period", FT_BOOLEAN, 32, NULL,
0x00000002, NULL, HFILL } },
{ &hf_zbee_zcl_pp_snapshot_payload_cause_change_of_tariff_information,
{ "Change of Tariff Information", "zbee_zcl_se.pp.snapshot_payload_cause.change_of_tariff_information", FT_BOOLEAN, 32, NULL,
0x00000008, NULL, HFILL } },
{ &hf_zbee_zcl_pp_snapshot_payload_cause_change_of_price_matrix,
{ "Change of Price Matrix", "zbee_zcl_se.pp.snapshot_payload_cause.change_of_price_matrix", FT_BOOLEAN, 32, NULL,
0x00000010, NULL, HFILL } },
{ &hf_zbee_zcl_pp_snapshot_payload_cause_manually_triggered_from_client,
{ "Manually Triggered from Client", "zbee_zcl_se.pp.snapshot_payload_cause.manually_triggered_from_client", FT_BOOLEAN, 32, NULL,
0x00000400, NULL, HFILL } },
{ &hf_zbee_zcl_pp_snapshot_payload_cause_change_of_tenancy,
{ "Change of Tenancy", "zbee_zcl_se.pp.snapshot_payload_cause.change_of_tenancy", FT_BOOLEAN, 32, NULL,
0x00001000, NULL, HFILL } },
{ &hf_zbee_zcl_pp_snapshot_payload_cause_change_of_supplier,
{ "Change of Supplier", "zbee_zcl_se.pp.snapshot_payload_cause.change_of_supplier", FT_BOOLEAN, 32, NULL,
0x00002000, NULL, HFILL } },
{ &hf_zbee_zcl_pp_snapshot_payload_cause_change_of_meter_mode,
{ "Change of (Meter) Mode", "zbee_zcl_se.pp.snapshot_payload_cause.change_of_meter_mode", FT_BOOLEAN, 32, NULL,
0x00004000, NULL, HFILL } },
{ &hf_zbee_zcl_pp_snapshot_payload_cause_top_up_addition,
{ "TopUp addition", "zbee_zcl_se.pp.snapshot_payload_cause.top_up_addition", FT_BOOLEAN, 32, NULL,
0x00040000, NULL, HFILL } },
{ &hf_zbee_zcl_pp_snapshot_payload_cause_debt_credit_addition,
{ "Debt/Credit addition", "zbee_zcl_se.pp.snapshot_payload_cause.debt_credit_addition", FT_BOOLEAN, 32, NULL,
0x00080000, NULL, HFILL } },
{ &hf_zbee_zcl_pp_snapshot_payload_cause_reserved,
{ "Reserved", "zbee_zcl_se.pp.snapshot_payload_cause.reserved", FT_UINT32, BASE_HEX, NULL,
0xFFF38BE4, NULL, HFILL } },
};
/* ZCL Prepayment subtrees */
gint *ett[ZBEE_ZCL_SE_PP_NUM_TOTAL_ETT];
ett[0] = &ett_zbee_zcl_pp;
ett[1] = &ett_zbee_zcl_pp_payment_control_configuration;
ett[2] = &ett_zbee_zcl_pp_snapshot_payload_cause;
guint j = ZBEE_ZCL_SE_PP_NUM_INDIVIDUAL_ETT;
/* Initialize Publish Top Up Log subtrees */
for (guint i = 0; i < ZBEE_ZCL_SE_PP_NUM_PUBLISH_TOP_UP_LOG_ETT; i++, j++) {
ett_zbee_zcl_pp_publish_top_up_entry[i] = -1;
ett[j] = &ett_zbee_zcl_pp_publish_top_up_entry[i];
}
/* Initialize Publish Debt Log subtrees */
for (guint i = 0; i < ZBEE_ZCL_SE_PP_NUM_PUBLISH_DEBT_LOG_ETT; i++, j++ ) {
ett_zbee_zcl_pp_publish_debt_log_entry[i] = -1;
ett[j] = &ett_zbee_zcl_pp_publish_debt_log_entry[i];
}
/* Register the ZigBee ZCL Prepayment cluster protocol name and description */
proto_zbee_zcl_pp = proto_register_protocol("ZigBee ZCL Prepayment", "ZCL Prepayment", ZBEE_PROTOABBREV_ZCL_PRE_PAYMENT);
proto_register_field_array(proto_zbee_zcl_pp, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
/* Register the ZigBee ZCL Prepayment dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_PRE_PAYMENT, dissect_zbee_zcl_pp, proto_zbee_zcl_pp);
} /*proto_register_zbee_zcl_pp*/
/**
*Hands off the ZCL Prepayment dissector.
*
*/
void
proto_reg_handoff_zbee_zcl_pp(void)
{
zbee_zcl_init_cluster( ZBEE_PROTOABBREV_ZCL_PRE_PAYMENT,
proto_zbee_zcl_pp,
ett_zbee_zcl_pp,
ZBEE_ZCL_CID_PRE_PAYMENT,
ZBEE_MFG_CODE_NONE,
hf_zbee_zcl_pp_attr_id,
-1,
hf_zbee_zcl_pp_srv_rx_cmd_id,
hf_zbee_zcl_pp_srv_tx_cmd_id,
(zbee_zcl_fn_attr_data)dissect_zcl_pp_attr_data
);
} /*proto_reg_handoff_zbee_zcl_pp*/
/* ########################################################################## */
/* #### (0x0706) ENERGY MANAGEMENT CLUSTER ################################## */
/* ########################################################################## */
/* Attributes */
#define zbee_zcl_energy_management_attr_names_VALUE_STRING_LIST(XXX) \
/* Block Threshold (Delivered) Set */ \
XXX(ZBEE_ZCL_ATTR_ID_ENERGY_MANAGEMENT_LOAD_CONTROL_STATE, 0x0000, "Load Control State" ) \
XXX(ZBEE_ZCL_ATTR_ID_ENERGY_MANAGEMENT_CURRENT_EVENT_ID, 0x0001, "Current Event ID" ) \
XXX(ZBEE_ZCL_ATTR_ID_ENERGY_MANAGEMENT_CURRENT_EVENT_STATUS, 0x0002, "Current Event Status" ) \
XXX(ZBEE_ZCL_ATTR_ID_ENERGY_MANAGEMENT_CONFORMANCE_LEVEL, 0x0003, "Conformance Level" ) \
XXX(ZBEE_ZCL_ATTR_ID_ENERGY_MANAGEMENT_MINIMUM_OFF_TIME, 0x0004, "Minimum Off Time" ) \
XXX(ZBEE_ZCL_ATTR_ID_ENERGY_MANAGEMENT_MINIMUM_ON_TIME, 0x0005, "Minimum On Time" ) \
XXX(ZBEE_ZCL_ATTR_ID_ENERGY_MANAGEMENT_MINIMUM_CYCLE_PERIOD, 0x0006, "Minimum Cycle Period" ) \
/* Smart Energy */ \
XXX(ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_ENERGY_MANAGEMENT, 0xFFFE, "Attribute Reporting Status" )
VALUE_STRING_ENUM(zbee_zcl_energy_management_attr_names);
VALUE_STRING_ARRAY(zbee_zcl_energy_management_attr_names);
/* Server Commands Received */
#define zbee_zcl_energy_management_srv_rx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_ENERGY_MANAGEMENT_MANAGE_EVENT, 0x00, "Manage Event" )
VALUE_STRING_ENUM(zbee_zcl_energy_management_srv_rx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_energy_management_srv_rx_cmd_names);
/* Server Commands Generated */
#define zbee_zcl_energy_management_srv_tx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_ENERGY_MANAGEMENT_REPORT_EVENT_STATUS, 0x00, "Report Event Status" )
VALUE_STRING_ENUM(zbee_zcl_energy_management_srv_tx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_energy_management_srv_tx_cmd_names);
/*************************/
/* Function Declarations */
/*************************/
void proto_register_zbee_zcl_energy_management(void);
void proto_reg_handoff_zbee_zcl_energy_management(void);
static void dissect_zbee_zcl_energy_management_manage_event (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zbee_zcl_energy_management_report_event_status (tvbuff_t *tvb, proto_tree *tree, guint *offset);
/* Attribute Dissector Helpers */
static void dissect_zcl_energy_management_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr);
/*************************/
/* Global Variables */
/*************************/
/* Initialize the protocol and registered fields */
static int proto_zbee_zcl_energy_management = -1;
static int hf_zbee_zcl_energy_management_srv_tx_cmd_id = -1;
static int hf_zbee_zcl_energy_management_srv_rx_cmd_id = -1;
static int hf_zbee_zcl_energy_management_attr_id = -1;
static int hf_zbee_zcl_energy_management_attr_reporting_status = -1;
static int hf_zbee_zcl_energy_management_issuer_event_id = -1;
static int hf_zbee_zcl_energy_management_device_class = -1;
static int hf_zbee_zcl_energy_management_device_class_hvac_compressor_or_furnace = -1;
static int hf_zbee_zcl_energy_management_device_class_strip_heaters_baseboard_heaters = -1;
static int hf_zbee_zcl_energy_management_device_class_water_heater = -1;
static int hf_zbee_zcl_energy_management_device_class_pool_pump_spa_jacuzzi = -1;
static int hf_zbee_zcl_energy_management_device_class_smart_appliances = -1;
static int hf_zbee_zcl_energy_management_device_class_irrigation_pump = -1;
static int hf_zbee_zcl_energy_management_device_class_managed_c_i_loads= -1;
static int hf_zbee_zcl_energy_management_device_class_simple_misc_loads = -1;
static int hf_zbee_zcl_energy_management_device_class_exterior_lighting = -1;
static int hf_zbee_zcl_energy_management_device_class_interior_lighting = -1;
static int hf_zbee_zcl_energy_management_device_class_electric_vehicle = -1;
static int hf_zbee_zcl_energy_management_device_class_generation_systems = -1;
static int hf_zbee_zcl_energy_management_device_class_reserved = -1;
static int hf_zbee_zcl_energy_management_utility_enrollment_group = -1;
static int hf_zbee_zcl_energy_management_action_required = -1;
static int hf_zbee_zcl_energy_management_action_required_opt_out_of_event = -1;
static int hf_zbee_zcl_energy_management_action_required_opt_into_event = -1;
static int hf_zbee_zcl_energy_management_action_required_disable_duty_cycling = -1;
static int hf_zbee_zcl_energy_management_action_required_enable_duty_cycling = -1;
static int hf_zbee_zcl_energy_management_action_required_reserved = -1;
static int hf_zbee_zcl_energy_management_report_event_issuer_event_id = -1;
static int hf_zbee_zcl_energy_management_report_event_event_status = -1;
static int hf_zbee_zcl_energy_management_report_event_event_status_time = -1;
static int hf_zbee_zcl_energy_management_report_event_criticality_level_applied = -1;
static int hf_zbee_zcl_energy_management_report_event_cooling_temp_set_point_applied = -1;
static int hf_zbee_zcl_energy_management_report_event_heating_temp_set_point_applied = -1;
static int hf_zbee_zcl_energy_management_report_event_average_load_adjustment_percentage = -1;
static int hf_zbee_zcl_energy_management_report_event_duty_cycle = -1;
static int hf_zbee_zcl_energy_management_report_event_event_control = -1;
static int hf_zbee_zcl_energy_management_report_event_event_control_randomize_start_time = -1;
static int hf_zbee_zcl_energy_management_report_event_event_control_randomize_duration_time = -1;
static int hf_zbee_zcl_energy_management_report_event_event_control_reserved = -1;
static int* const zbee_zcl_energy_management_device_classes[] = {
&hf_zbee_zcl_energy_management_device_class_hvac_compressor_or_furnace,
&hf_zbee_zcl_energy_management_device_class_strip_heaters_baseboard_heaters,
&hf_zbee_zcl_energy_management_device_class_water_heater,
&hf_zbee_zcl_energy_management_device_class_pool_pump_spa_jacuzzi,
&hf_zbee_zcl_energy_management_device_class_smart_appliances,
&hf_zbee_zcl_energy_management_device_class_irrigation_pump,
&hf_zbee_zcl_energy_management_device_class_managed_c_i_loads,
&hf_zbee_zcl_energy_management_device_class_simple_misc_loads,
&hf_zbee_zcl_energy_management_device_class_exterior_lighting,
&hf_zbee_zcl_energy_management_device_class_interior_lighting,
&hf_zbee_zcl_energy_management_device_class_electric_vehicle,
&hf_zbee_zcl_energy_management_device_class_generation_systems,
&hf_zbee_zcl_energy_management_device_class_reserved,
NULL
};
static int* const zbee_zcl_energy_management_action_required[] = {
&hf_zbee_zcl_energy_management_action_required_opt_out_of_event,
&hf_zbee_zcl_energy_management_action_required_opt_into_event,
&hf_zbee_zcl_energy_management_action_required_disable_duty_cycling,
&hf_zbee_zcl_energy_management_action_required_enable_duty_cycling,
&hf_zbee_zcl_energy_management_action_required_reserved,
NULL
};
static int* const hf_zbee_zcl_energy_management_event_control_flags[] = {
&hf_zbee_zcl_energy_management_report_event_event_control_randomize_start_time,
&hf_zbee_zcl_energy_management_report_event_event_control_randomize_duration_time,
&hf_zbee_zcl_energy_management_report_event_event_control_reserved,
NULL
};
/* Initialize the subtree pointers */
static gint ett_zbee_zcl_energy_management = -1;
static gint ett_zbee_zcl_energy_management_device_class = -1;
static gint ett_zbee_zcl_energy_management_actions_required = -1;
static gint ett_zbee_zcl_energy_management_report_event_event_control = -1;
static const range_string zbee_zcl_energy_management_load_control_event_criticality_level[] = {
{ 0x0, 0x0, "Reserved" },
{ 0x1, 0x1, "Green" },
{ 0x2, 0x2, "1" },
{ 0x3, 0x3, "2" },
{ 0x4, 0x4, "3" },
{ 0x5, 0x5, "4" },
{ 0x6, 0x6, "5" },
{ 0x7, 0x7, "Emergency" },
{ 0x8, 0x8, "Planned Outage" },
{ 0x9, 0x9, "Service Disconnect" },
{ 0x0A, 0x0F, "Utility Defined" },
{ 0x10, 0xFF, "Reserved" },
{ 0, 0, NULL }
};
/*************************/
/* Function Bodies */
/*************************/
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*@param attr_id attribute identifier
*@param data_type attribute data type
*@param client_attr ZCL client
*/
static void
dissect_zcl_energy_management_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr)
{
switch (attr_id) {
/* applies to all SE clusters */
case ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_ENERGY_MANAGEMENT:
proto_tree_add_item(tree, hf_zbee_zcl_energy_management_attr_reporting_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
break;
default: /* Catch all */
dissect_zcl_attr_data(tvb, tree, offset, data_type, client_attr);
break;
}
} /*dissect_zcl_energy_management_attr_data*/
/**
*ZigBee ZCL Energy Management cluster dissector for wireshark.
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to buffer offset
*/
static void
dissect_zbee_zcl_energy_management_manage_event(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_energy_management_issuer_event_id, tvb,
*offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Device Class */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_energy_management_device_class, ett_zbee_zcl_energy_management_device_class,
zbee_zcl_energy_management_device_classes, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Utility Enrollment Group */
proto_tree_add_item(tree, hf_zbee_zcl_energy_management_utility_enrollment_group, tvb,
*offset, 1, ENC_NA);
*offset += 1;
/* Action(s) Required */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_energy_management_action_required, ett_zbee_zcl_energy_management_actions_required,
zbee_zcl_energy_management_action_required, ENC_NA);
*offset += 1;
}
/**
*ZigBee ZCL Energy Management cluster dissector for wireshark.
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to buffer offset
*/
static void
dissect_zbee_zcl_energy_management_report_event_status(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Event Control */
nstime_t event_status_time;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_energy_management_report_event_issuer_event_id, tvb,
*offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Event Status */
proto_tree_add_item(tree, hf_zbee_zcl_energy_management_report_event_event_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Event Status Time */
event_status_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
event_status_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_energy_management_report_event_event_status_time, tvb, *offset, 4, &event_status_time);
*offset += 4;
/* Criticality Level Applied */
proto_tree_add_item(tree, hf_zbee_zcl_energy_management_report_event_criticality_level_applied, tvb,
*offset, 1, ENC_NA);
*offset += 1;
/* Cooling Temperature Set Point Applied */
proto_tree_add_item(tree, hf_zbee_zcl_energy_management_report_event_cooling_temp_set_point_applied, tvb,
*offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Heating Temperature Set Point Applied */
proto_tree_add_item(tree, hf_zbee_zcl_energy_management_report_event_heating_temp_set_point_applied, tvb,
*offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Average Load Adjustment Percentage Applied */
proto_tree_add_item(tree, hf_zbee_zcl_energy_management_report_event_average_load_adjustment_percentage, tvb,
*offset, 1, ENC_NA);
*offset += 1;
/* Duty Cycle Applied */
proto_tree_add_item(tree, hf_zbee_zcl_energy_management_report_event_duty_cycle, tvb,
*offset, 1, ENC_NA);
*offset += 1;
/* Event Control */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_energy_management_report_event_event_control, ett_zbee_zcl_energy_management_report_event_event_control,
hf_zbee_zcl_energy_management_event_control_flags, ENC_LITTLE_ENDIAN);
*offset += 1;
} /*dissect_zbee_zcl_energy_management_report_event_status*/
/**
*ZigBee ZCL Energy Management cluster dissector for wireshark.
*
*@param tvb pointer to buffer containing raw packet.
*@param pinfo pointer to packet information fields
*@param tree pointer to data tree Wireshark uses to display packet.
*/
static int
dissect_zbee_zcl_energy_management(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
zbee_zcl_packet *zcl;
guint offset = 0;
guint8 cmd_id;
gint rem_len;
/* Reject the packet if data is NULL */
if (data == NULL)
return 0;
zcl = (zbee_zcl_packet *)data;
cmd_id = zcl->cmd_id;
/* Create a subtree for the ZCL Command frame, and add the command ID to it. */
if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_energy_management_srv_rx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_energy_management_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_energy_management, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_ENERGY_MANAGEMENT_MANAGE_EVENT:
dissect_zbee_zcl_energy_management_manage_event(tvb, tree, &offset);
break;
default:
break;
}
}
}
else { /* ZBEE_ZCL_FCF_TO_CLIENT */
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_energy_management_srv_tx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_energy_management_srv_tx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_energy_management, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_ENERGY_MANAGEMENT_REPORT_EVENT_STATUS:
dissect_zbee_zcl_energy_management_report_event_status(tvb, tree, &offset);
break;
default:
break;
}
}
}
return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_energy_management*/
/**
*This function registers the ZCL Energy_Management dissector
*
*/
void
proto_register_zbee_zcl_energy_management(void)
{
static hf_register_info hf[] = {
{ &hf_zbee_zcl_energy_management_attr_id,
{ "Attribute", "zbee_zcl_se.energy_management.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_energy_management_attr_names),
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_attr_reporting_status, /* common to all SE clusters */
{ "Attribute Reporting Status", "zbee_zcl_se.energy_management.attr.attr_reporting_status",
FT_UINT8, BASE_HEX, VALS(zbee_zcl_se_reporting_status_names), 0x00, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_srv_tx_cmd_id,
{ "Command", "zbee_zcl_se.energy_management.cmd.srv_tx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_energy_management_srv_tx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_srv_rx_cmd_id,
{ "Command", "zbee_zcl_se.energy_management.cmd.srv_rx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_energy_management_srv_rx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.energy_management.issuer_id",
FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_device_class,
{ "Device Class", "zbee_zcl_se.energy_management.device_class",
FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_device_class_hvac_compressor_or_furnace,
{ "HVAC Compressor or Furnace", "zbee_zcl_se.energy_management.device_class.hvac_compressor_or_furnace",
FT_BOOLEAN, 16, NULL, 0x0001, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_device_class_strip_heaters_baseboard_heaters,
{ "Strip Heaters/Baseboard Heaters", "zbee_zcl_se.energy_management.device_class.strip_heaters_baseboard_heaters",
FT_BOOLEAN, 16, NULL, 0x0002, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_device_class_water_heater,
{ "Water Heater", "zbee_zcl_se.energy_management.device_class.water_heater",
FT_BOOLEAN, 16, NULL, 0x0004, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_device_class_pool_pump_spa_jacuzzi,
{ "Pool Pump/Spa/Jacuzzi", "zbee_zcl_se.energy_management.device_class.pool_pump_spa_jacuzzi",
FT_BOOLEAN, 16, NULL, 0x0008, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_device_class_smart_appliances,
{ "Smart Appliances", "zbee_zcl_se.energy_management.device_class.smart_appliances",
FT_BOOLEAN, 16, NULL, 0x0010, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_device_class_irrigation_pump,
{ "Irrigation Pump", "zbee_zcl_se.energy_management.device_class.irrigation_pump",
FT_BOOLEAN, 16, NULL, 0x0020, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_device_class_managed_c_i_loads,
{ "Managed Commercial & Industrial (C&I) loads", "zbee_zcl_se.energy_management.device_class.managed_c_i_loads",
FT_BOOLEAN, 16, NULL, 0x0040, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_device_class_simple_misc_loads,
{ "Simple misc. (Residential On/Off) loads", "zbee_zcl_se.energy_management.device_class.simple_misc_loads",
FT_BOOLEAN, 16, NULL, 0x0080, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_device_class_exterior_lighting,
{ "Exterior Lighting", "zbee_zcl_se.energy_management.device_class.exterior_lighting",
FT_BOOLEAN, 16, NULL, 0x0100, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_device_class_interior_lighting,
{ "Interior Lighting", "zbee_zcl_se.energy_management.device_class.interior_lighting",
FT_BOOLEAN, 16, NULL, 0x0200, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_device_class_electric_vehicle,
{ "Electric Vehicle", "zbee_zcl_se.energy_management.device_class.electric_vehicle",
FT_BOOLEAN, 16, NULL, 0x0400, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_device_class_generation_systems,
{ "Generation Systems", "zbee_zcl_se.energy_management.device_class.generation_systems",
FT_BOOLEAN, 16, NULL, 0x0800, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_device_class_reserved ,
{ "Reserved", "zbee_zcl_se.energy_management.device_class.reserved",
FT_UINT16, BASE_HEX, NULL, 0xF000, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_utility_enrollment_group,
{ "Utility Enrollment Group", "zbee_zcl_se.energy_management.utility_enrollment_group",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_action_required,
{ "Action(s) Required", "zbee_zcl_se.energy_management.action_required",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_action_required_opt_out_of_event,
{ "Opt Out of Event", "zbee_zcl_se.energy_management.action_required.opt_out_of_event",
FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_action_required_opt_into_event,
{ "Opt Into Event", "zbee_zcl_se.energy_management.action_required.opt_into_event",
FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_action_required_disable_duty_cycling,
{ "Disable Duty Cycling", "zbee_zcl_se.energy_management.action_required.disable_duty_cycling",
FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_action_required_enable_duty_cycling,
{ "Enable Duty Cycling", "zbee_zcl_se.energy_management.action_required.enable_duty_cycling",
FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_action_required_reserved,
{ "Reserved", "zbee_zcl_se.energy_management.action_required.reserved",
FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_report_event_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.energy_management.report_event.issuer_id",
FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_report_event_event_status,
{ "Event Status", "zbee_zcl_se.energy_management.report_event.event_status",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_report_event_event_status_time,
{ "Event Status Time", "zbee_zcl_se.energy_management.report_event.event_status_time",
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_report_event_criticality_level_applied ,
{ "Criticality Level Applied", "zbee_zcl_se.energy_management.report_event.criticality_level_applied",
FT_UINT8, BASE_HEX | BASE_RANGE_STRING, RVALS(zbee_zcl_energy_management_load_control_event_criticality_level), 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_report_event_cooling_temp_set_point_applied,
{ "Cooling Temperature Set Point Applied", "zbee_zcl_se.energy_management.report_event.cooling_temperature_set_point_applied",
FT_INT16, BASE_CUSTOM, CF_FUNC(decode_zcl_drlc_temp_set_point), 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_report_event_heating_temp_set_point_applied,
{ "Heating Temperature Set Point Applied", "zbee_zcl_se.energy_management.report_event.heating_temperature_set_point_applied",
FT_INT16, BASE_CUSTOM, CF_FUNC(decode_zcl_drlc_temp_set_point), 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_report_event_average_load_adjustment_percentage ,
{ "Average Load Adjustment Percentage Applied", "zbee_zcl_se.energy_management.report_event.average_load_adjustment_percentage_applied",
FT_INT8, BASE_CUSTOM, CF_FUNC(decode_zcl_drlc_average_load_adjustment_percentage), 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_report_event_duty_cycle,
{ "Duty Cycle Applied", "zbee_zcl_se.energy_management.report_event.duty_cycle_applied",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_report_event_event_control,
{ "Event Control", "zbee_zcl_se.energy_management.report_event.event_control",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_report_event_event_control_randomize_start_time,
{ "Randomize Start time", "zbee_zcl_se.energy_management.report_event.randomize_start_time",
FT_BOOLEAN, 8, TFS(&zbee_zcl_drlc_randomize_start_tfs), 0x01, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_report_event_event_control_randomize_duration_time,
{ "Randomize Duration time", "zbee_zcl_se.energy_management.report_event.randomize_duration_time",
FT_BOOLEAN, 8, TFS(&zbee_zcl_drlc_randomize_duration_tfs), 0x02, NULL, HFILL } },
{ &hf_zbee_zcl_energy_management_report_event_event_control_reserved,
{ "Reserved", "zbee_zcl_se.energy_management.reserved",
FT_UINT8, BASE_HEX, NULL, 0xFC, NULL, HFILL } },
};
/* ZCL Energy_Management subtrees */
gint *ett[] = {
&ett_zbee_zcl_energy_management,
&ett_zbee_zcl_energy_management_device_class,
&ett_zbee_zcl_energy_management_actions_required,
&ett_zbee_zcl_energy_management_report_event_event_control,
};
/* Register the ZigBee ZCL Energy Management cluster protocol name and description */
proto_zbee_zcl_energy_management = proto_register_protocol("ZigBee ZCL Energy Management", "ZCL Energy Management", ZBEE_PROTOABBREV_ZCL_ENERGY_MANAGEMENT);
proto_register_field_array(proto_zbee_zcl_energy_management, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
/* Register the ZigBee ZCL Energy Management dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_ENERGY_MANAGEMENT, dissect_zbee_zcl_energy_management, proto_zbee_zcl_energy_management);
} /*proto_register_zbee_zcl_energy_management*/
/**
*Hands off the ZCL Energy_Management dissector.
*
*/
void
proto_reg_handoff_zbee_zcl_energy_management(void)
{
zbee_zcl_init_cluster( ZBEE_PROTOABBREV_ZCL_ENERGY_MANAGEMENT,
proto_zbee_zcl_energy_management,
ett_zbee_zcl_energy_management,
ZBEE_ZCL_CID_ENERGY_MANAGEMENT,
ZBEE_MFG_CODE_NONE,
hf_zbee_zcl_energy_management_attr_id,
-1,
hf_zbee_zcl_energy_management_srv_rx_cmd_id,
hf_zbee_zcl_energy_management_srv_tx_cmd_id,
(zbee_zcl_fn_attr_data)dissect_zcl_energy_management_attr_data
);
} /*proto_reg_handoff_zbee_zcl_energy_management*/
/* ########################################################################## */
/* #### (0x0707) CALENDAR CLUSTER ########################################### */
/* ########################################################################## */
/* Attributes */
#define zbee_zcl_calendar_attr_names_VALUE_STRING_LIST(XXX) \
/* Auxiliary Switch Label Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_CAL_AUX_SWITCH_1_LABEL, 0x0000, "Aux Switch 1 Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_CAL_AUX_SWITCH_2_LABEL, 0x0001, "Aux Switch 2 Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_CAL_AUX_SWITCH_3_LABEL, 0x0002, "Aux Switch 3 Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_CAL_AUX_SWITCH_4_LABEL, 0x0003, "Aux Switch 4 Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_CAL_AUX_SWITCH_5_LABEL, 0x0004, "Aux Switch 5 Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_CAL_AUX_SWITCH_6_LABEL, 0x0005, "Aux Switch 6 Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_CAL_AUX_SWITCH_7_LABEL, 0x0006, "Aux Switch 7 Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_CAL_AUX_SWITCH_8_LABEL, 0x0007, "Aux Switch 8 Label" ) \
/* Smart Energy */ \
XXX(ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_CAL, 0xFFFE, "Attribute Reporting Status" )
VALUE_STRING_ENUM(zbee_zcl_calendar_attr_names);
VALUE_STRING_ARRAY(zbee_zcl_calendar_attr_names);
/* Server Commands Received */
#define zbee_zcl_calendar_srv_rx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_CAL_GET_CALENDAR, 0x00, "Get Calendar" ) \
XXX(ZBEE_ZCL_CMD_ID_CAL_GET_DAY_PROFILES, 0x01, "Get Day Profiles" ) \
XXX(ZBEE_ZCL_CMD_ID_CAL_GET_WEEK_PROFILES, 0x02, "Get Week Profiles" ) \
XXX(ZBEE_ZCL_CMD_ID_CAL_GET_SEASONS, 0x03, "Get Seasons" ) \
XXX(ZBEE_ZCL_CMD_ID_CAL_GET_SPECIAL_DAYS, 0x04, "Get Special Days" ) \
XXX(ZBEE_ZCL_CMD_ID_CAL_GET_CALENDAR_CANCELLATION, 0x05, "Get Calendar Cancellation" )
VALUE_STRING_ENUM(zbee_zcl_calendar_srv_rx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_calendar_srv_rx_cmd_names);
/* Server Commands Generated */
#define zbee_zcl_calendar_srv_tx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_CAL_PUBLISH_CALENDAR, 0x00, "Publish Calendar" ) \
XXX(ZBEE_ZCL_CMD_ID_CAL_PUBLISH_DAY_PROFILE, 0x01, "Publish Day Profile" ) \
XXX(ZBEE_ZCL_CMD_ID_CAL_PUBLISH_WEEK_PROFILE, 0x02, "Publish Week Profile" ) \
XXX(ZBEE_ZCL_CMD_ID_CAL_PUBLISH_SEASONS, 0x03, "Publish Seasons" ) \
XXX(ZBEE_ZCL_CMD_ID_CAL_PUBLISH_SPECIAL_DAYS, 0x04, "Publish Special Days" ) \
XXX(ZBEE_ZCL_CMD_ID_CAL_CANCEL_CALENDAR, 0x05, "Cancel Calendar" )
VALUE_STRING_ENUM(zbee_zcl_calendar_srv_tx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_calendar_srv_tx_cmd_names);
/*************************/
/* Function Declarations */
/*************************/
void proto_register_zbee_zcl_calendar(void);
void proto_reg_handoff_zbee_zcl_calendar(void);
/* Attribute Dissector Helpers */
static void dissect_zcl_calendar_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr);
/* Command Dissector Helpers */
static void dissect_zcl_calendar_get_calendar (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_calendar_get_day_profiles(tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_calendar_get_week_profiles(tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_calendar_get_seasons(tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_calendar_get_special_days(tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_calendar_publish_calendar(tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_calendar_publish_day_profile(tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_calendar_publish_week_profile(tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_calendar_publish_seasons(tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_calendar_publish_special_days(tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_calendar_cancel(tvbuff_t *tvb, proto_tree *tree, guint *offset);
/*************************/
/* Global Variables */
/*************************/
/* Initialize the protocol and registered fields */
static int proto_zbee_zcl_calendar = -1;
static int hf_zbee_zcl_calendar_srv_tx_cmd_id = -1;
static int hf_zbee_zcl_calendar_srv_rx_cmd_id = -1;
static int hf_zbee_zcl_calendar_attr_id = -1;
static int hf_zbee_zcl_calendar_attr_reporting_status = -1;
static int hf_zbee_zcl_calendar_type = -1;
static int hf_zbee_zcl_calendar_start_time = -1;
static int hf_zbee_zcl_calendar_earliest_start_time = -1;
static int hf_zbee_zcl_calendar_time_reference = -1;
static int hf_zbee_zcl_calendar_name = -1;
static int hf_zbee_zcl_calendar_command_index = -1;
static int hf_zbee_zcl_calendar_date_year = -1;
static int hf_zbee_zcl_calendar_date_month = -1;
static int hf_zbee_zcl_calendar_date_month_day = -1;
static int hf_zbee_zcl_calendar_date_week_day = -1;
static int hf_zbee_zcl_calendar_provider_id = -1;
static int hf_zbee_zcl_calendar_issuer_event_id = -1;
static int hf_zbee_zcl_calendar_min_issuer_event_id = -1;
static int hf_zbee_zcl_calendar_issuer_calendar_id = -1;
static int hf_zbee_zcl_calendar_day_id = -1;
static int hf_zbee_zcl_calendar_day_id_ref = -1;
static int hf_zbee_zcl_calendar_day_id_ref_monday = -1;
static int hf_zbee_zcl_calendar_day_id_ref_tuesday = -1;
static int hf_zbee_zcl_calendar_day_id_ref_wednesday = -1;
static int hf_zbee_zcl_calendar_day_id_ref_thursday = -1;
static int hf_zbee_zcl_calendar_day_id_ref_friday = -1;
static int hf_zbee_zcl_calendar_day_id_ref_saturday = -1;
static int hf_zbee_zcl_calendar_day_id_ref_sunday = -1;
static int hf_zbee_zcl_calendar_week_id = -1;
static int hf_zbee_zcl_calendar_week_id_ref = -1;
static int hf_zbee_zcl_calendar_start_day_id = -1;
static int hf_zbee_zcl_calendar_start_week_id = -1;
static int hf_zbee_zcl_calendar_number_of_calendars = -1;
static int hf_zbee_zcl_calendar_number_of_events = -1;
static int hf_zbee_zcl_calendar_number_of_days = -1;
static int hf_zbee_zcl_calendar_number_of_weeks = -1;
static int hf_zbee_zcl_calendar_number_of_seasons = -1;
static int hf_zbee_zcl_calendar_number_of_day_profiles = -1;
static int hf_zbee_zcl_calendar_number_of_week_profiles = -1;
static int hf_zbee_zcl_calendar_total_number_of_schedule_entries = -1;
static int hf_zbee_zcl_calendar_total_number_of_special_days = -1;
static int hf_zbee_zcl_calendar_total_number_of_commands = -1;
static int hf_zbee_zcl_calendar_schedule_entry_start_time = -1;
static int hf_zbee_zcl_calendar_schedule_entry_price_tier = -1;
static int hf_zbee_zcl_calendar_schedule_entry_friendly_credit_enable = -1;
static int hf_zbee_zcl_calendar_schedule_entry_auxiliary_load_switch_state = -1;
/* Initialize the subtree pointers */
static gint ett_zbee_zcl_calendar = -1;
static gint ett_zbee_zcl_calendar_special_day_date = -1;
static gint ett_zbee_zcl_calendar_season_start_date = -1;
#define zbee_zcl_calendar_type_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CALENDAR_TYPE_DELIVERED, 0x00, "Delivered Calendar" ) \
XXX(ZBEE_ZCL_CALENDAR_TYPE_RECEIVED, 0x01, "Received Calendar" ) \
XXX(ZBEE_ZCL_CALENDAR_TYPE_DELIVERED_AND_RECEIVED, 0x02, "Delivered and Received Calendar" ) \
XXX(ZBEE_ZCL_CALENDAR_TYPE_FRIENDLY_CREDIT, 0x03, "Friendly Credit Calendar" ) \
XXX(ZBEE_ZCL_CALENDAR_TYPE_AUXILIARY_LOAD_SWITCH, 0x04, "Auxiliary Load Switch Calendar" )
VALUE_STRING_ENUM(zbee_zcl_calendar_type_names);
VALUE_STRING_ARRAY(zbee_zcl_calendar_type_names);
#define zbee_zcl_calendar_time_reference_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CALENDAR_TIME_REFERENCE_UTC_TIME, 0x00, "UTC Time" ) \
XXX(ZBEE_ZCL_CALENDAR_TIME_REFERENCE_STANDARD_TIME, 0x01, "Standard Time" ) \
XXX(ZBEE_ZCL_CALENDAR_TIME_REFERENCE_LOCAL_TIME, 0x02, "Local Time" )
VALUE_STRING_ENUM(zbee_zcl_calendar_time_reference_names);
VALUE_STRING_ARRAY(zbee_zcl_calendar_time_reference_names);
/*************************/
/* Function Bodies */
/*************************/
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*@param attr_id attribute identifier
*@param data_type attribute data type
*@param client_attr ZCL client
*/
static void
dissect_zcl_calendar_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr)
{
switch (attr_id) {
/* applies to all SE clusters */
case ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_CAL:
proto_tree_add_item(tree, hf_zbee_zcl_calendar_attr_reporting_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
break;
default: /* Catch all */
dissect_zcl_attr_data(tvb, tree, offset, data_type, client_attr);
break;
}
} /*dissect_zcl_calendar_attr_data*/
/**
*ZigBee ZCL Calendar cluster dissector for wireshark.
*
*@param tvb pointer to buffer containing raw packet.
*@param pinfo pointer to packet information fields
*@param tree pointer to data tree Wireshark uses to display packet.
*/
static int
dissect_zbee_zcl_calendar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
proto_tree *payload_tree;
zbee_zcl_packet *zcl;
guint offset = 0;
guint8 cmd_id;
gint rem_len;
/* Reject the packet if data is NULL */
if (data == NULL)
return 0;
zcl = (zbee_zcl_packet *)data;
cmd_id = zcl->cmd_id;
/* Create a subtree for the ZCL Command frame, and add the command ID to it. */
if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_calendar_srv_rx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_calendar_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_calendar, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_CAL_GET_CALENDAR:
dissect_zcl_calendar_get_calendar(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_CAL_GET_DAY_PROFILES:
dissect_zcl_calendar_get_day_profiles(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_CAL_GET_WEEK_PROFILES:
dissect_zcl_calendar_get_week_profiles(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_CAL_GET_SEASONS:
dissect_zcl_calendar_get_seasons(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_CAL_GET_SPECIAL_DAYS:
dissect_zcl_calendar_get_special_days(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_CAL_GET_CALENDAR_CANCELLATION:
/* No Payload */
break;
default:
break;
}
}
}
else { /* ZBEE_ZCL_FCF_TO_CLIENT */
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_calendar_srv_tx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_calendar_srv_tx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_calendar, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_CAL_PUBLISH_CALENDAR:
dissect_zcl_calendar_publish_calendar(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_CAL_PUBLISH_DAY_PROFILE:
dissect_zcl_calendar_publish_day_profile(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_CAL_PUBLISH_WEEK_PROFILE:
dissect_zcl_calendar_publish_week_profile(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_CAL_PUBLISH_SEASONS:
dissect_zcl_calendar_publish_seasons(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_CAL_PUBLISH_SPECIAL_DAYS:
dissect_zcl_calendar_publish_special_days(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_CAL_CANCEL_CALENDAR:
dissect_zcl_calendar_cancel(tvb, payload_tree, &offset);
break;
default:
break;
}
}
}
return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_calendar*/
/**
*This function manages the Get Calendar payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_calendar_get_calendar(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t earliest_start_time;
/* Earliest Start Time */
earliest_start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
earliest_start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_calendar_earliest_start_time, tvb, *offset, 4, &earliest_start_time);
*offset += 4;
/* Min Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_min_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Number of Calendars */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_number_of_calendars, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Calendar Type */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Provider Id */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_calendar_get_calendar*/
/**
*This function manages the Get Day Profiles payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_calendar_get_day_profiles(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Provider Id */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Calendar ID */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_issuer_calendar_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Start Day Id */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_start_day_id, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Number of Days */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_number_of_days, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_calendar_get_day_profiles*/
/**
*This function manages the Get Week Profiles payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_calendar_get_week_profiles(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Provider Id */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Calendar ID */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_issuer_calendar_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Start Week Id */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_start_week_id, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Number of Weeks */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_number_of_weeks, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_calendar_get_week_profiles*/
/**
*This function manages the Get Seasons payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_calendar_get_seasons(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Provider Id */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Calendar ID */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_issuer_calendar_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_calendar_get_seasons*/
/**
*This function manages the Get Special Days payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_calendar_get_special_days(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_calendar_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Number of Events */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_number_of_events, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Calendar Type */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Provider Id */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Calendar ID */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_issuer_calendar_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_calendar_get_special_days*/
/**
*This function manages the Publish Calendar payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_calendar_publish_calendar(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
int length;
/* Provider Id */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Calendar ID */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_issuer_calendar_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_calendar_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Calendar Type */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Calendar Time Reference */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_time_reference, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Calendar Name */
proto_tree_add_item_ret_length(tree, hf_zbee_zcl_calendar_name, tvb, *offset, 1, ENC_NA|ENC_ZIGBEE, &length);
*offset += length;
/* Number of Seasons */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_number_of_seasons, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Number of Week Profiles */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_number_of_week_profiles, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Number of Day Profiles */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_number_of_day_profiles, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_calendar_publish_calendar*/
/**
*This function manages the Publish Day Profile payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_calendar_publish_day_profile(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
guint8 schedule_entries_count;
guint8 calendar_type;
/* Provider Id */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Calendar ID */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_issuer_calendar_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Day ID */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_day_id, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Total Number of Schedule Entries */
schedule_entries_count = tvb_get_guint8(tvb, *offset);
proto_tree_add_item(tree, hf_zbee_zcl_calendar_total_number_of_schedule_entries, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Command Index */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_command_index, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Total Number of Commands */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_total_number_of_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Calendar Type */
calendar_type = tvb_get_guint8(tvb, *offset);
proto_tree_add_item(tree, hf_zbee_zcl_calendar_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
for (gint i = 0; tvb_reported_length_remaining(tvb, *offset) >= 3 && i < schedule_entries_count; i++) {
/* Start Time */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_schedule_entry_start_time, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
switch (calendar_type) {
/* Rate Start Time */
case ZBEE_ZCL_CALENDAR_TYPE_DELIVERED:
case ZBEE_ZCL_CALENDAR_TYPE_RECEIVED:
case ZBEE_ZCL_CALENDAR_TYPE_DELIVERED_AND_RECEIVED:
/* Price Tier */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_schedule_entry_price_tier, tvb, *offset, 1, ENC_NA);
*offset += 1;
break;
/* Friendly Credit Start Time */
case ZBEE_ZCL_CALENDAR_TYPE_FRIENDLY_CREDIT:
/* Price Tier */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_schedule_entry_friendly_credit_enable, tvb, *offset, 1, ENC_NA);
*offset += 1;
break;
/* Auxiliary Load Start Time */
case ZBEE_ZCL_CALENDAR_TYPE_AUXILIARY_LOAD_SWITCH:
/* Price Tier */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_schedule_entry_auxiliary_load_switch_state, tvb, *offset, 1, ENC_NA);
*offset += 1;
break;
}
}
} /*dissect_zcl_calendar_publish_day_profile*/
/**
*This function manages the Publish Week Profile payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_calendar_publish_week_profile(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Provider Id */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Calendar ID */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_issuer_calendar_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Week ID */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_week_id, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Day ID Ref Monday */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_day_id_ref_monday, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Day ID Ref Tuesday */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_day_id_ref_tuesday, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Day ID Ref Wednesday */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_day_id_ref_wednesday, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Day ID Ref Thursday */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_day_id_ref_thursday, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Day ID Ref Friday */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_day_id_ref_friday, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Day ID Ref Saturday */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_day_id_ref_saturday, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Day ID Ref Sunday */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_day_id_ref_sunday, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_calendar_publish_week_profile*/
/**
*This function manages the Publish Season Profile payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_calendar_publish_seasons(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Provider Id */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Calendar ID */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_issuer_calendar_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Command Index */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_command_index, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Total Number of Commands */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_total_number_of_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
while (tvb_reported_length_remaining(tvb, *offset) >= 5) {
/* Season Start Date */
dissect_zcl_date(tvb, tree, offset, ett_zbee_zcl_calendar_season_start_date, "Season Start Date", hf_zbee_zcl_calendar_date_year, hf_zbee_zcl_calendar_date_month, hf_zbee_zcl_calendar_date_month_day, hf_zbee_zcl_calendar_date_week_day);
/* Week ID Ref */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_week_id_ref, tvb, *offset, 1, ENC_NA);
*offset += 1;
}
} /*dissect_zcl_calendar_publish_seasons*/
/**
*This function manages the Publish Special Days payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_calendar_publish_special_days(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
guint8 total_special_days_count;
nstime_t start_time;
/* Provider Id */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Calendar ID */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_issuer_calendar_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_calendar_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Calendar Type */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Total Number of Special Days */
total_special_days_count = tvb_get_guint8(tvb, *offset);
proto_tree_add_item(tree, hf_zbee_zcl_calendar_total_number_of_special_days, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Command Index */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_command_index, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Total Number of Commands */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_total_number_of_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
for (gint i = 0; tvb_reported_length_remaining(tvb, *offset) >= 5 && i < total_special_days_count; i++) {
/* Special Day Date */
dissect_zcl_date(tvb, tree, offset, ett_zbee_zcl_calendar_special_day_date, "Special Day Date", hf_zbee_zcl_calendar_date_year, hf_zbee_zcl_calendar_date_month, hf_zbee_zcl_calendar_date_month_day, hf_zbee_zcl_calendar_date_week_day);
/* Day ID Ref */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_day_id_ref, tvb, *offset, 1, ENC_NA);
*offset += 1;
}
} /*dissect_zcl_calendar_publish_special_days*/
/**
*This function manages the Cancel Calendar payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_calendar_cancel(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Provider Id */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Calendar ID */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_issuer_calendar_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Calendar Type */
proto_tree_add_item(tree, hf_zbee_zcl_calendar_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_calendar_cancel*/
/**
*This function registers the ZCL Calendar dissector
*
*/
void
proto_register_zbee_zcl_calendar(void)
{
static hf_register_info hf[] = {
{ &hf_zbee_zcl_calendar_attr_id,
{ "Attribute", "zbee_zcl_se.calendar.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_calendar_attr_names),
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_attr_reporting_status, /* common to all SE clusters */
{ "Attribute Reporting Status", "zbee_zcl_se.calendar.attr.attr_reporting_status",
FT_UINT8, BASE_HEX, VALS(zbee_zcl_se_reporting_status_names), 0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_srv_tx_cmd_id,
{ "Command", "zbee_zcl_se.calendar.cmd.srv_tx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_calendar_srv_tx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_srv_rx_cmd_id,
{ "Command", "zbee_zcl_se.calendar.cmd.srv_rx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_calendar_srv_rx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_type,
{ "Calendar Type", "zbee_zcl_se.calendar.type", FT_UINT8, BASE_HEX, VALS(zbee_zcl_calendar_type_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_start_time,
{ "Start Time", "zbee_zcl_se.calendar.start_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_earliest_start_time,
{ "Earliest Start Time", "zbee_zcl_se.calendar.earliest_start_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_time_reference,
{ "Calendar Time Reference", "zbee_zcl_se.calendar.time_reference", FT_UINT8, BASE_HEX, VALS(zbee_zcl_calendar_time_reference_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_name,
{ "Calendar Name", "zbee_zcl_se.calendar.name", FT_UINT_STRING, BASE_NONE, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_command_index,
{ "Command Index", "zbee_zcl_se.calendar.command_index", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_date_year,
{ "Year", "zbee_zcl_se.calendar.date.year", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_date_month,
{ "Month", "zbee_zcl_se.calendar.date.month", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_date_month_day,
{ "Month Day", "zbee_zcl_se.calendar.date.month_day", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_date_week_day,
{ "Week Day", "zbee_zcl_se.calendar.date.week_day", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_provider_id,
{ "Provider ID", "zbee_zcl_se.calendar.provider_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.calendar.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_min_issuer_event_id,
{ "Min. Issuer Event ID", "zbee_zcl_se.calendar.min_issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_issuer_calendar_id,
{ "Issuer Calendar ID", "zbee_zcl_se.calendar.issuer_calendar_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_day_id,
{ "Day ID", "zbee_zcl_se.calendar.day_id", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_day_id_ref,
{ "Day ID Ref", "zbee_zcl_se.calendar.day_id_ref", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_day_id_ref_monday,
{ "Day ID Ref Monday", "zbee_zcl_se.calendar.day_id_ref_monday", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_day_id_ref_tuesday,
{ "Day ID Ref Tuesday", "zbee_zcl_se.calendar.day_id_ref_tuesday", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_day_id_ref_wednesday,
{ "Day ID Ref Wednesday", "zbee_zcl_se.calendar.day_id_ref_wednesday", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_day_id_ref_thursday,
{ "Day ID Ref Thursday", "zbee_zcl_se.calendar.day_id_ref_thursday", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_day_id_ref_friday,
{ "Day ID Ref Friday", "zbee_zcl_se.calendar.day_id_ref_friday", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_day_id_ref_saturday,
{ "Day ID Ref Saturday", "zbee_zcl_se.calendar.day_id_ref_saturday", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_day_id_ref_sunday,
{ "Day ID Ref Sunday", "zbee_zcl_se.calendar.day_id_ref_sunday", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_week_id,
{ "Week ID", "zbee_zcl_se.calendar.week_id", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_week_id_ref,
{ "Week ID Ref", "zbee_zcl_se.calendar.week_id_ref", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_start_day_id,
{ "Start Day ID", "zbee_zcl_se.calendar.start_day_id", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_start_week_id,
{ "Start Week ID", "zbee_zcl_se.calendar.start_week_id", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_number_of_calendars,
{ "Number of Calendars", "zbee_zcl_se.calendar.number_of_calendars", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_number_of_events,
{ "Number of Events", "zbee_zcl_se.calendar.number_of_events", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_number_of_days,
{ "Number of Days", "zbee_zcl_se.calendar.number_of_days", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_number_of_weeks,
{ "Number of Weeks", "zbee_zcl_se.calendar.number_of_weeks", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_number_of_seasons,
{ "Number of Seasons", "zbee_zcl_se.calendar.number_of_seasons", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_number_of_day_profiles,
{ "Number of Day Profiles", "zbee_zcl_se.calendar.number_of_day_profiles", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_number_of_week_profiles,
{ "Number of Week Profiles", "zbee_zcl_se.calendar.number_of_week_profiles", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_total_number_of_schedule_entries,
{ "Total Number of Schedule Entries", "zbee_zcl_se.calendar.total_number_of_schedule_entries", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_total_number_of_special_days,
{ "Total Number of Special Days", "zbee_zcl_se.calendar.total_number_of_special_days", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_total_number_of_commands,
{ "Total Number of Commands", "zbee_zcl_se.calendar.total_number_of_commands", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_schedule_entry_start_time,
{ "Start Time", "zbee_zcl_se.calendar.schedule_entry.start_time", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_schedule_entry_price_tier,
{ "Price Tier", "zbee_zcl_se.calendar.schedule_entry.price_tier", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_schedule_entry_friendly_credit_enable,
{ "Friendly Credit Enable", "zbee_zcl_se.calendar.schedule_entry.friendly_credit_enable", FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_calendar_schedule_entry_auxiliary_load_switch_state,
{ "Auxiliary Load Switch State", "zbee_zcl_se.calendar.schedule_entry.auxiliary_load_switch_state", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
};
/* ZCL Calendar subtrees */
gint *ett[] = {
&ett_zbee_zcl_calendar,
&ett_zbee_zcl_calendar_special_day_date,
&ett_zbee_zcl_calendar_season_start_date,
};
/* Register the ZigBee ZCL Calendar cluster protocol name and description */
proto_zbee_zcl_calendar = proto_register_protocol("ZigBee ZCL Calendar", "ZCL Calendar", ZBEE_PROTOABBREV_ZCL_CALENDAR);
proto_register_field_array(proto_zbee_zcl_calendar, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
/* Register the ZigBee ZCL Calendar dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_CALENDAR, dissect_zbee_zcl_calendar, proto_zbee_zcl_calendar);
} /*proto_register_zbee_zcl_calendar*/
/**
*Hands off the ZCL Calendar dissector.
*
*/
void
proto_reg_handoff_zbee_zcl_calendar(void)
{
zbee_zcl_init_cluster( ZBEE_PROTOABBREV_ZCL_CALENDAR,
proto_zbee_zcl_calendar,
ett_zbee_zcl_calendar,
ZBEE_ZCL_CID_CALENDAR,
ZBEE_MFG_CODE_NONE,
hf_zbee_zcl_calendar_attr_id,
-1,
hf_zbee_zcl_calendar_srv_rx_cmd_id,
hf_zbee_zcl_calendar_srv_tx_cmd_id,
(zbee_zcl_fn_attr_data)dissect_zcl_calendar_attr_data
);
} /*proto_reg_handoff_zbee_zcl_calendar*/
/* ----------------------- Daily Schedule cluster ---------------------- */
/* Attributes */
#define zbee_zcl_daily_schedule_attr_names_VALUE_STRING_LIST(XXX) \
/* Auxiliary Switch Label Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_DSH_AUX_SWITCH_1_LABEL, 0x0000, "Aux Switch 1 Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_DSH_AUX_SWITCH_2_LABEL, 0x0001, "Aux Switch 2 Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_DSH_AUX_SWITCH_3_LABEL, 0x0002, "Aux Switch 3 Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_DSH_AUX_SWITCH_4_LABEL, 0x0003, "Aux Switch 4 Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_DSH_AUX_SWITCH_5_LABEL, 0x0004, "Aux Switch 5 Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_DSH_AUX_SWITCH_6_LABEL, 0x0005, "Aux Switch 6 Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_DSH_AUX_SWITCH_7_LABEL, 0x0006, "Aux Switch 7 Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_DSH_AUX_SWITCH_8_LABEL, 0x0007, "Aux Switch 8 Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_DSH_CURRENT_AUX_LOAD_SWITCH_STATE, 0x0100, "Current Auxiliary Load Switch State" ) \
XXX(ZBEE_ZCL_ATTR_ID_DSH_CURRENT_DELIVERED_TIER, 0x0101, "Current Delivered Tier" ) \
XXX(ZBEE_ZCL_ATTR_ID_DSH_CURRENT_TIER_LABEL, 0x0102, "Current Tier Label" ) \
XXX(ZBEE_ZCL_ATTR_ID_DSH_LINKY_PEAK_PERIOD_STATUS, 0x0103, "Linky Peak Period Status" ) \
XXX(ZBEE_ZCL_ATTR_ID_DSH_PEAK_START_TIME, 0x0104, "Peak Start Time" ) \
XXX(ZBEE_ZCL_ATTR_ID_DSH_PEAK_END_TIME, 0x0105, "Peak End Time" ) \
XXX(ZBEE_ZCL_ATTR_ID_DSH_CURRENT_TARIFF_LABEL, 0x0106, "Current Tariff Label" ) \
VALUE_STRING_ENUM(zbee_zcl_daily_schedule_attr_names);
VALUE_STRING_ARRAY(zbee_zcl_daily_schedule_attr_names);
/* Server Commands Received */
#define zbee_zcl_daily_schedule_srv_rx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_DSH_GET_SCHEDULE, 0x00, "Get Schedule" ) \
XXX(ZBEE_ZCL_CMD_ID_DSH_GET_DAY_PROFILE, 0x01, "Get Day Profile" ) \
XXX(ZBEE_ZCL_CMD_ID_DSH_GET_SCHEDULE_CANCELLATION, 0x05, "Get Schedule Cancellation" ) \
VALUE_STRING_ENUM(zbee_zcl_daily_schedule_srv_rx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_daily_schedule_srv_rx_cmd_names);
/* Server Commands Generated */
#define zbee_zcl_daily_schedule_srv_tx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_DSH_PUBLISH_SCHEDULE, 0x00, "Publish Schedule" ) \
XXX(ZBEE_ZCL_CMD_ID_DSH_PUBLISH_DAY_PROFILE, 0x01, "Publish Day Profile" ) \
XXX(ZBEE_ZCL_CMD_ID_DSH_CANCEL_SCHEDULE, 0x05, "Cancel Schedule" ) \
VALUE_STRING_ENUM(zbee_zcl_daily_schedule_srv_tx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_daily_schedule_srv_tx_cmd_names);
/*************************/
/* Function Declarations */
/*************************/
void proto_register_zbee_zcl_daily_schedule(void);
void proto_reg_handoff_zbee_zcl_daily_schedule(void);
/* Attribute Dissector Helpers */
static void dissect_zcl_daily_schedule_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr);
/* Command Dissector Helpers */
static void dissect_zcl_daily_schedule_get_schedule(tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_daily_schedule_get_day_profile(tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_daily_schedule_publish_schedule(tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_daily_schedule_publish_day_profile(tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_daily_schedule_cancel_schedule(tvbuff_t *tvb, proto_tree *tree, guint *offset);
/*************************/
/* Global Variables */
/*************************/
/* Initialize the protocol and registered fields */
static int proto_zbee_zcl_daily_schedule = -1;
static int hf_zbee_zcl_daily_schedule_srv_tx_cmd_id = -1;
static int hf_zbee_zcl_daily_schedule_srv_rx_cmd_id = -1;
static int hf_zbee_zcl_daily_schedule_attr_server_id = -1;
/* Get Schedule cmd */
static int hf_zbee_zcl_daily_schedule_type = -1;
static int hf_zbee_zcl_daily_schedule_name = -1;
static int hf_zbee_zcl_daily_schedule_start_time = -1;
static int hf_zbee_zcl_daily_schedule_earliest_start_time = -1;
static int hf_zbee_zcl_daily_schedule_command_index = -1;
static int hf_zbee_zcl_daily_schedule_id = -1;
static int hf_zbee_zcl_daily_schedule_time_reference = -1;
static int hf_zbee_zcl_daily_schedule_provider_id = -1;
static int hf_zbee_zcl_daily_schedule_issuer_event_id = -1;
static int hf_zbee_zcl_daily_schedule_min_issuer_event_id = -1;
static int hf_zbee_zcl_daily_schedule_number_of_schedules = -1;
static int hf_zbee_zcl_daily_schedule_total_number_of_schedule_entries = -1;
static int hf_zbee_zcl_daily_schedule_schedule_entry_start_time = -1;
static int hf_zbee_zcl_daily_schedule_schedule_entry_price_tier = -1;
static int hf_zbee_zcl_daily_schedule_schedule_entry_auxiliary_load_switch_state = -1;
/* Initialize the subtree pointers */
static gint ett_zbee_zcl_daily_schedule = -1;
#define zbee_zcl_daily_schedule_type_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_SCHEDULE_TYPE_LINKY_SCHEDULE, 0x00, "Linky Schedule" ) \
VALUE_STRING_ENUM(zbee_zcl_daily_schedule_type_names);
VALUE_STRING_ARRAY(zbee_zcl_daily_schedule_type_names);
#define zbee_zcl_daily_schedule_time_reference_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_SCHEDULE_TIME_REFERENCE_UTC_TIME, 0x00, "UTC Time" ) \
XXX(ZBEE_ZCL_SCHEDULE_TIME_REFERENCE_STANDARD_TIME, 0x01, "Standard Time" ) \
XXX(ZBEE_ZCL_SCHEDULE_TIME_REFERENCE_LOCAL_TIME, 0x02, "Local Time" )
VALUE_STRING_ENUM(zbee_zcl_daily_schedule_time_reference_names);
VALUE_STRING_ARRAY(zbee_zcl_daily_schedule_time_reference_names);
/**
*ZigBee ZCL Daily Schedule cluster dissector for wireshark.
*
*@param tvb pointer to buffer containing raw packet.
*@param pinfo pointer to packet information fields
*@param tree pointer to data tree Wireshark uses to display packet.
*/
static int
dissect_zbee_zcl_daily_schedule(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
proto_tree *payload_tree;
zbee_zcl_packet *zcl;
guint offset = 0;
guint8 cmd_id;
gint rem_len;
/* Reject the packet if data is NULL */
if (data == NULL)
return 0;
zcl = (zbee_zcl_packet *)data;
cmd_id = zcl->cmd_id;
/* Create a subtree for the ZCL Command frame, and add the command ID to it. */
if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_calendar_srv_rx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_daily_schedule_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_daily_schedule, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_DSH_GET_SCHEDULE:
dissect_zcl_daily_schedule_get_schedule(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_DSH_GET_DAY_PROFILE:
dissect_zcl_daily_schedule_get_day_profile(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_DSH_GET_SCHEDULE_CANCELLATION:
/* No Payload */
break;
default:
break;
}
}
}
else { /* ZBEE_ZCL_FCF_TO_CLIENT */
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_daily_schedule_srv_tx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_daily_schedule_srv_tx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_daily_schedule, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_DSH_PUBLISH_SCHEDULE:
dissect_zcl_daily_schedule_publish_schedule(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_DSH_PUBLISH_DAY_PROFILE:
dissect_zcl_daily_schedule_publish_day_profile(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_DSH_CANCEL_SCHEDULE:
dissect_zcl_daily_schedule_cancel_schedule(tvb, payload_tree, &offset);
break;
default:
break;
}
}
}
return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_daily_schedule*/
/**
*This function manages the Publish Calendar payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_daily_schedule_publish_schedule(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
int length;
/* Provider Id */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Schedule ID */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_daily_schedule_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Schedule Type */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Schedule Time Reference */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_time_reference, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Schedule Name */
proto_tree_add_item_ret_length(tree, hf_zbee_zcl_daily_schedule_name, tvb, *offset, 1, ENC_NA | ENC_ZIGBEE, &length);
*offset += length;
} /*dissect_zcl_daily_schedule_publish_schedule*/
/**
*This function manages the Publish Day Profile payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_daily_schedule_publish_day_profile(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
guint8 schedule_entries_count;
guint8 calendar_type;
/* Provider Id */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Calendar ID */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Total Number of Schedule Entries */
schedule_entries_count = tvb_get_guint8(tvb, *offset);
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_total_number_of_schedule_entries, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Command Index */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_command_index, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Number of Schedules */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_number_of_schedules, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Calendar Type */
calendar_type = tvb_get_guint8(tvb, *offset);
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
for (gint i = 0; tvb_reported_length_remaining(tvb, *offset) >= 4 && i < schedule_entries_count; i++) {
/* Start Time */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_schedule_entry_start_time, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
switch (calendar_type) {
/* Rate Start Time */
case ZBEE_ZCL_SCHEDULE_TYPE_LINKY_SCHEDULE:
/* Price Tier */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_schedule_entry_price_tier, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Auxiliary Load Switch State */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_schedule_entry_auxiliary_load_switch_state, tvb, *offset, 1, ENC_NA);
*offset += 1;
break;
}
}
} /*dissect_zcl_daily_schedule_publish_day_profile*/
/**
*This function manages the Cancel Calendar payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_daily_schedule_cancel_schedule(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Provider Id */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Calendar ID */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Schedule Type */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_calendar_cancel*/
/**
*This function manages the Get Calendar payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_daily_schedule_get_schedule(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t earliest_start_time;
/* Provider Id */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Earliest Start Time */
earliest_start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
earliest_start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_daily_schedule_earliest_start_time, tvb, *offset, 4, &earliest_start_time);
*offset += 4;
/* Min Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_min_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Number of Schedules */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_number_of_schedules, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Schedule Type */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_daily_schedule_get_schedule*/
/**
*This function manages the Get Day Profiles payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_daily_schedule_get_day_profile(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Provider Id */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Schedule ID */
proto_tree_add_item(tree, hf_zbee_zcl_daily_schedule_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
} /*dissect_zcl_daily_schedule_get_day_profile*/
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*@param attr_id attribute identifier
*@param data_type attribute data type
*/
static void
dissect_zcl_daily_schedule_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr)
{
(void)attr_id;
/* Catch all */
dissect_zcl_attr_data(tvb, tree, offset, data_type, client_attr);
} /*dissect_zcl_calendar_attr_data*/
/**
*This function registers the ZCL Calendar dissector
*
*/
void
proto_register_zbee_zcl_daily_schedule(void)
{
static hf_register_info hf[] = {
{ &hf_zbee_zcl_daily_schedule_attr_server_id,
{ "Attribute", "zbee_zcl_se.daily_schedule.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_daily_schedule_attr_names),
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_daily_schedule_srv_tx_cmd_id,
{ "Command", "zbee_zcl_se.daily_schedule.cmd.srv_tx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_daily_schedule_srv_tx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_daily_schedule_srv_rx_cmd_id,
{ "Command", "zbee_zcl_se.daily_schedule.cmd.srv_rx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_daily_schedule_srv_rx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_daily_schedule_type,
{ "Schedule Type", "zbee_zcl_se.daily_schedule.type", FT_UINT8, BASE_HEX, VALS(zbee_zcl_daily_schedule_type_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_daily_schedule_start_time,
{ "Start Time", "zbee_zcl_se.daily_schedule.start_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_daily_schedule_earliest_start_time,
{ "Earliest Start Time", "zbee_zcl_se.daily_schedule.earliest_start_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_daily_schedule_time_reference,
{ "Schedule Time Reference", "zbee_zcl_se.daily_schedule.time_reference", FT_UINT8, BASE_HEX, VALS(zbee_zcl_daily_schedule_time_reference_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_daily_schedule_name,
{ "Schedule Name", "zbee_zcl_se.daily_schedule.name", FT_UINT_STRING, BASE_NONE, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_daily_schedule_command_index,
{ "Command Index", "zbee_zcl_se.daily_schedule.command_index", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_daily_schedule_provider_id,
{ "Provider ID", "zbee_zcl_se.daily_schedule.provider_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_daily_schedule_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.daily_schedule.issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_daily_schedule_min_issuer_event_id,
{ "Min. Issuer Event ID", "zbee_zcl_se.daily_schedule.min_issuer_event_id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_daily_schedule_id,
{ "Schedule ID", "zbee_zcl_se.daily_schedule.id", FT_UINT32, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_daily_schedule_total_number_of_schedule_entries,
{ "Total Number of Schedule Entries", "zbee_zcl_se.daily_schedule.total_number_of_schedule_entries", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_daily_schedule_number_of_schedules,
{ "Number of Schedules", "zbee_zcl_se.daily_schedule.number_of_schedules", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_daily_schedule_schedule_entry_start_time,
{ "Start Time", "zbee_zcl_se.daily_schedule.schedule_entry.start_time", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_daily_schedule_schedule_entry_price_tier,
{ "Price Tier", "zbee_zcl_se.daily_schedule.schedule_entry.price_tier", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_daily_schedule_schedule_entry_auxiliary_load_switch_state,
{ "Auxiliary Load Switch State", "zbee_zcl_se.daily_schedule.schedule_entry.auxiliary_load_switch_state", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
};
/* ZCL Daily Schedule subtrees */
gint *ett[] = {
&ett_zbee_zcl_daily_schedule,
};
/* Register the ZigBee ZCL Calendar cluster protocol name and description */
proto_zbee_zcl_daily_schedule = proto_register_protocol("ZigBee ZCL Daily Schedule", "ZCL Daily Schedule", ZBEE_PROTOABBREV_ZCL_DAILY_SCHEDULE);
proto_register_field_array(proto_zbee_zcl_daily_schedule, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
/* Register the ZigBee ZCL Daily Schedule dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_DAILY_SCHEDULE, dissect_zbee_zcl_daily_schedule, proto_zbee_zcl_daily_schedule);
} /*proto_register_zbee_zcl_calendar*/
void
proto_reg_handoff_zbee_zcl_daily_schedule(void)
{
zbee_zcl_init_cluster( ZBEE_PROTOABBREV_ZCL_DAILY_SCHEDULE,
proto_zbee_zcl_daily_schedule,
ett_zbee_zcl_daily_schedule,
ZBEE_ZCL_CID_DAILY_SCHEDULE,
ZBEE_MFG_CODE_NONE,
hf_zbee_zcl_daily_schedule_attr_server_id,
-1,
hf_zbee_zcl_daily_schedule_srv_rx_cmd_id,
hf_zbee_zcl_daily_schedule_srv_tx_cmd_id,
(zbee_zcl_fn_attr_data)dissect_zcl_daily_schedule_attr_data
);
} /*proto_reg_handoff_zbee_zcl_calendar*/
/* ########################################################################## */
/* #### (0x0708) DEVICE_MANAGEMENT CLUSTER ############################################## */
/* ########################################################################## */
/* Attributes */
#define zbee_zcl_device_management_attr_server_names_VALUE_STRING_LIST(XXX) \
/* Supplier Control Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_PROVIDER_ID, 0x0100, "Provider ID" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_PROVIDER_NAME, 0x0101, "Provider Name" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_PROVIDER_CONTACT_DETAILS, 0x0102, "Provider Contact Details" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_PROPOSED_PROVIDER_ID, 0x0110, "Proposed Provider ID" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_PROPOSED_PROVIDER_NAME, 0x0111, "Proposed Provider Name" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_PROPOSED_PROVIDER_CHANGE_DATE_TIME, 0x0112, "Proposed Provider Change Date/Time" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_PROPOSED_PROVIDER_CHANGE_CONTROL, 0x0113, "Proposed Provider Change Control" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_PROPOSED_PROVIDER_CONTACT_DETAILS, 0x0114, "Proposed Provider Contact Details" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_RECEIVED_PROVIDER_ID, 0x0120, "Received Provider ID" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_RECEIVED_PROVIDER_NAME, 0x0121, "Received Provider Name" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_RECEIVED_PROVIDER_CONTACT_DETAILS, 0x0122, "Received Provider Contact Details" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_RECEIVED_PROPOSED_PROVIDER_ID, 0x0130, "Received Proposed Provider ID" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_RECEIVED_PROPOSED_PROVIDER_NAME, 0x0131, "Received Proposed Provider Name" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_RECEIVED_PROPOSED_PROVIDER_CHANGE_DATE_TIME, 0x0132, "Received Proposed Provider Change Date/Time" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_RECEIVED_PROPOSED_PROVIDER_CHANGE_CONTROL, 0x0133, "Received Proposed Provider Change Control" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_RECEIVED_PROPOSED_PROVIDER_CONTACT_DETAILS, 0x0134, "Received Proposed Provider Contact Details" ) \
/* Tenancy Control Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CHANGE_OF_TENANCY_UPDATE_DATE_TIME, 0x0200, "Change of Tenancy Update Date/Time" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_PROPOSED_TENANCY_CHANGE_CONTROL, 0x0201, "Proposed Tenancy Change control" ) \
/* Backhaul Control Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_WAN_STATUS, 0x0300, "WAN Status" ) \
/* HAN Control Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_LOW_MEDIUM_THRESHOLD, 0x0400, "Low Medium Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_MEDIUM_HIGH_THRESHOLD, 0x0401, "Medium High Threshold" ) \
/* Add client attribute sets */ \
/* Smart Energy */ \
XXX(ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_DEVICE_MANAGEMENT, 0xFFFE, "Attribute Reporting Status" )
VALUE_STRING_ENUM(zbee_zcl_device_management_attr_server_names);
VALUE_STRING_ARRAY(zbee_zcl_device_management_attr_server_names);
#define zbee_zcl_device_management_attr_client_names_VALUE_STRING_LIST(XXX) \
/* Supplier Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PROVIDER_ID, 0x0000, "Provider ID" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_RECEIVED_PROVIDER_ID, 0x0010, "Received Provider ID" ) \
/* Price Event Configuration Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TOU_TARIFF_ACTIVATION, 0x0100, "TOU Tariff Activation" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_BLOCK_TARIFF_ACTIVATED, 0x0101, "Block Tariff Activated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_BLOCK_TOU_TARIFF_ACTIVATED, 0x0102, "Block TOU Tariff Activated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SINGLE_TARIFF_RATE_ACTIVATED, 0x0103, "Single Tariff Rate Activated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_ASYNCHRONOUS_BILLING_OCCURRED, 0x0104, "Asynchronous Billing Occurred" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SYNCHRONOUS_BILLING_OCCURRED, 0x0105, "Synchronous Billing Occurred" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TARIFF_NOT_SUPPORTED, 0x0106, "Tariff Not Supported" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PRICE_CLUSTER_NOT_FOUND, 0x0107, "Price Cluster Not Found" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CURRENCY_CHANGE_PASSIVE_ACTIVATED, 0x0108, "Currency Change Passive Activated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CURRENCY_CHANGE_PASSIVE_UPDATED, 0x0109, "Currency Change Passive Updated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PRICE_MATRIX_PASSIVE_ACTIVATED, 0x010A, "Price Matrix Passive Activated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PRICE_MATRIX_PASSIVE_UPDATED, 0x010B, "Price Matrix Passive Updated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TARIFF_CHANGE_PASSIVE_ACTIVATED, 0x010C, "Tariff Change Passive Activated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TARIFF_CHANGED_PASSIVE_UPDATED, 0x010D, "Tariff Changed Passive Updated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_PRICE_RECEIVED, 0x01B0, "Publish Price Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_PRICE_ACTIONED, 0x01B1, "Publish Price Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_PRICE_CANCELLED, 0x01B2, "Publish Price Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_PRICE_REJECTED, 0x01B3, "Publish Price Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_TARIFF_INFORMATION_RECEIVED, 0x01B4, "Publish Tariff Information Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_TARIFF_INFORMATION_ACTIONED, 0x01B5, "Publish Tariff Information Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_TARIFF_INFORMATION_CANCELLED, 0x01B6, "Publish Tariff Information Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_TARIFF_INFORMATION_REJECTED, 0x01B7, "Publish Tariff Information Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_PRICE_MATRIX_RECEIVED, 0x01B8, "Publish Price Matrix Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_PRICE_MATRIX_ACTIONED, 0x01B9, "Publish Price Matrix Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_PRICE_MATRIX_CANCELLED, 0x01BA, "Publish Price Matrix Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_PRICE_MATRIX_REJECTED, 0x01BB, "Publish Price Matrix Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_BLOCK_THRESHOLDS_RECEIVED, 0x01BC, "Publish Block Thresholds Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_BLOCK_THRESHOLDS_ACTIONED, 0x01BD, "Publish Block Thresholds Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_BLOCK_THRESHOLDS_CANCELLED, 0x01BE, "Publish Block Thresholds Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_BLOCK_THRESHOLDS_REJECTED, 0x01BF, "Publish Block Thresholds Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CALORIFIC_VALUE_RECEIVED, 0x01C0, "Publish Calorific Value Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CALORIFIC_VALUE_ACTIONED, 0x01C1, "Publish Calorific Value Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CALORIFIC_VALUE_CANCELLED, 0x01C2, "Publish Calorific Value Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CALORIFIC_VALUE_REJECTED, 0x01C3, "Publish Calorific Value Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CONVERSION_FACTOR_RECEIVED, 0x01C4, "Publish Conversion Factor Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CONVERSION_FACTOR_ACTIONED, 0x01C5, "Publish Conversion Factor Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CONVERSION_FACTOR_CANCELLED, 0x01C6, "Publish Conversion Factor Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CONVERSION_FACTOR_REJECTED, 0x01C7, "Publish Conversion Factor Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CO2_VALUE_RECEIVED, 0x01C8, "Publish CO2 Value Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CO2_VALUE_ACTIONED, 0x01C9, "Publish CO2 Value Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CO2_VALUE_CANCELLED, 0x01CA, "Publish CO2 Value Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CO2_VALUE_REJECTED, 0x01CB, "Publish CO2 Value Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CPP_EVENT_RECEIVED, 0x01CC, "Publish CPP event Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CPP_EVENT_ACTIONED, 0x01CD, "Publish CPP event Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CPP_EVENT_CANCELLED, 0x01CE, "Publish CPP event Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CPP_EVENT_REJECTED, 0x01CF, "Publish CPP event Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_TIER_LABELS_RECEIVED, 0x01D0, "Publish Tier Labels Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_TIER_LABELS_ACTIONED, 0x01D1, "Publish Tier Labels Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_TIER_LABELS_CANCELLED, 0x01D2, "Publish Tier Labels Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_TIER_LABELS_REJECTED, 0x01D3, "Publish Tier Labels Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_BILLING_PERIOD_RECEIVED, 0x01D4, "Publish Billing Period Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_BILLING_PERIOD_ACTIONED, 0x01D5, "Publish Billing Period Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_BILLING_PERIOD_CANCELLED, 0x01D6, "Publish Billing Period Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_BILLING_PERIOD_REJECTED, 0x01D7, "Publish Billing Period Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CONSOLIDATED_BILL_RECEIVED, 0x01D8, "Publish Consolidated Bill Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CONSOLIDATED_BILL_ACTIONED, 0x01D9, "Publish Consolidated Bill Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CONSOLIDATED_BILL_CANCELLED, 0x01DA, "Publish Consolidated Bill Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CONSOLIDATED_BILL_REJECTED, 0x01DB, "Publish Consolidated Bill Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_BLOCK_PERIOD_RECEIVED, 0x01DC, "Publish Block Period Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_BLOCK_PERIOD_ACTIONED, 0x01DD, "Publish Block Period Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_BLOCK_PERIOD_CANCELLED, 0x01DE, "Publish Block Period Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_BLOCK_PERIOD_REJECTED, 0x01DF, "Publish Block Period Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CREDIT_PAYMENT_INFO_RECEIVED, 0x01E0, "Publish Credit Payment Info Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CREDIT_PAYMENT_INFO_ACTIONED, 0x01E1, "Publish Credit Payment Info Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CREDIT_PAYMENT_INFO_CANCELLED, 0x01E2, "Publish Credit Payment Info Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CREDIT_PAYMENT_INFO_REJECTED, 0x01E3, "Publish Credit Payment Info Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CURRENCY_CONVERSION_RECEIVED, 0x01E4, "Publish Currency Conversion Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CURRENCY_CONVERSION_ACTIONED, 0x01E5, "Publish Currency Conversion Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CURRENCY_CONVERSION_CANCELLED, 0x01E6, "Publish Currency Conversion Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CURRENCY_CONVERSION_REJECTED, 0x01E7, "Publish Currency Conversion Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_RESERVED_FOR_PRICE_CLUSTER_GROUP_ID, 0x01FF, "Reserved for Price Cluster Group ID" ) \
/* Metering Event Configuration Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CHECK_METER, 0x0200, "Check Meter" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_LOW_BATTERY, 0x0201, "Low Battery" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TAMPER_DETECT, 0x0202, "Tamper Detect" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SUPPLY_STATUS, 0x0203, "Supply Status" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SUPPLY_QUALITY, 0x0204, "Supply Quality" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_LEAK_DETECT, 0x0205, "Leak Detect" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SERVICE_DISCONNECT, 0x0206, "Service Disconnect" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_METERING_REVERSE_FLOW_GAS_WATER_HEAT, 0x0207, "Reverse Flow (Gas, Water, Heat/Cooling)" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_METER_COVER_REMOVED, 0x0208, "Meter Cover Removed" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_METER_COVER_CLOSED, 0x0209, "Meter Cover Closed" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_STRONG_MAGNETIC_FIELD, 0x020A, "Strong Magnetic Field" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_NO_STRONG_MAGNETIC_FIELD, 0x020B, "No Strong Magnetic Field" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_BATTERY_FAILURE, 0x020C, "Battery Failure" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PROGRAM_MEMORY_ERROR, 0x020D, "Program Memory Error" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_RAM_ERROR, 0x020E, "RAM Error" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_NV_MEMORY_ERROR, 0x020F, "NV Memory Error" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_LOW_VOLTAGE_L1, 0x0210, "Low Voltage L1" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_HIGH_VOLTAGE_L1, 0x0211, "High Voltage L1" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_LOW_VOLTAGE_L2, 0x0212, "Low Voltage L2" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_HIGH_VOLTAGE_L2, 0x0213, "High Voltage L2" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_LOW_VOLTAGE_L3, 0x0214, "Low Voltage L3" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_HIGH_VOLTAGE_L3, 0x0215, "High Voltage L3" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_OVER_CURRENT_L1, 0x0216, "Over Current L1" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_OVER_CURRENT_L2, 0x0217, "Over Current L2" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_OVER_CURRENT_L3, 0x0218, "Over Current L3" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_FREQUENCY_TOO_LOW_L1, 0x0219, "Frequency too Low L1" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_FREQUENCY_TOO_HIGH_L1, 0x021A, "Frequency too High L1" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_FREQUENCY_TOO_LOW_L2, 0x021B, "Frequency too Low L2" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_FREQUENCY_TOO_HIGH_L2, 0x021C, "Frequency too High L2" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_FREQUENCY_TOO_LOW_L3, 0x021D, "Frequency too Low L3" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_FREQUENCY_TOO_HIGH_L3, 0x021E, "Frequency too High L3" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GROUND_FAULT, 0x021F, "Ground Fault" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_ELECTRIC_TAMPER_DETECT, 0x0220, "Electric Tamper Detect" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_INCORRECT_POLARITY, 0x0221, "Incorrect Polarity" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CURRENT_NO_VOLTAGE, 0x0222, "Current No Voltage" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_UNDER_VOLTAGE, 0x0223, "Under Voltage" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_OVER_VOLTAGE, 0x0224, "Over Voltage" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_NORMAL_VOLTAGE, 0x0225, "Normal Voltage" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PF_BELOW_THRESHOLD, 0x0226, "PF Below Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PF_ABOVE_THRESHOLD, 0x0227, "PF Above Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TERMINAL_COVER_REMOVED, 0x0228, "Terminal Cover Removed" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TERMINAL_COVER_CLOSED, 0x0229, "Terminal Cover Closed" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_BURST_DETECT, 0x0230, "Burst Detect" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PRESSURE_TOO_LOW, 0x0231, "Pressure too Low" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PRESSURE_TOO_HIGH, 0x0232, "Pressure too High" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_FLOW_SENSOR_COMMUNICATION_ERROR, 0x0233, "Flow Sensor Communication Error" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_FLOW_SENSOR_MEASUREMENT_FAULT, 0x0234, "Flow Sensor Measurement Fault" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_FLOW_SENSOR_REVERSE_FLOW, 0x0235, "Flow Sensor Reverse Flow" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_FLOW_SENSOR_AIR_DETECT, 0x0236, "Flow Sensor Air Detect" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PIPE_EMPTY, 0x0237, "Pipe Empty" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_INLET_TEMPERATURE_SENSOR_FAULT, 0x0250, "Inlet Temperature Sensor Fault" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_OUTLET_TEMPERATURE_SENSOR_FAULT, 0x0251, "Outlet Temperature Sensor Fault" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_REVERSE_FLOW, 0x0260, "Reverse Flow" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TILT_TAMPER, 0x0261, "Tilt Tamper" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_BATTERY_COVER_REMOVED, 0x0262, "Battery Cover Removed" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_BATTERY_COVER_CLOSED, 0x0263, "Battery Cover Closed" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_EXCESS_FLOW, 0x0264, "Excess Flow" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TILT_TAMPER_ENDED, 0x0265, "Tilt Tamper Ended" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MEASUREMENT_SYSTEM_ERROR, 0x0270, "Measurement System Error" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_WATCHDOG_ERROR, 0x0271, "Watchdog Error" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SUPPLY_DISCONNECT_FAILURE, 0x0272, "Supply Disconnect Failure" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SUPPLY_CONNECT_FAILURE, 0x0273, "Supply Connect Failure" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MEASUREMENT_SOFTWARE_CHANGED, 0x0274, "Measurement Software Changed" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_DST_ENABLED, 0x0275, "DST Enabled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_DST_DISABLED, 0x0276, "DST Disabled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CLOCK_ADJUST_BACKWARD, 0x0277, "Clock Adjust Backward" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CLOCK_ADJUST_FORWARD, 0x0278, "Clock Adjust Forward" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CLOCK_INVALID, 0x0279, "Clock Invalid" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_COMMUNICATION_ERROR_HAN, 0x027A, "Communication Error HAN" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_COMMUNICATION_OK_HAN, 0x027B, "Communication OK HAN" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_METER_FRAUD_ATTEMPT, 0x027C, "Meter Fraud Attempt" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_POWER_LOSS, 0x027D, "Power Loss" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_UNUSUAL_HAN_TRAFFIC, 0x027E, "Unusual HAN Traffic" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_UNEXPECTED_CLOCK_CHANGE, 0x027F, "Unexpected Clock Change" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_COMMS_USING_UNAUTHENTICATED_COMPONENT, 0x0280, "Comms Using Unauthenticated Component" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MET_ERROR_REGISTER_CLEAR, 0x0281, "Metering Error Register Clear" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MET_ALARM_REGISTER_CLEAR, 0x0282, "Metering Alarm Register Clear" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_UNEXPECTED_HW_RESET, 0x0283, "Unexpected HW Reset" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_UNEXPECTED_PROGRAM_EXECUTION, 0x0284, "Unexpected Program Execution" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_LIMIT_THRESHOLD_EXCEEDED, 0x0285, "Limit Threshold Exceeded" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_LIMIT_THRESHOLD_OK, 0x0286, "Limit Threshold OK" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_LIMIT_THRESHOLD_CHANGED, 0x0287, "Limit Threshold Changed" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MAXIMUM_DEMAND_EXCEEDED, 0x0288, "Maximum Demand Exceeded" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PROFILE_CLEARED, 0x0289, "Profile Cleared" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_LOAD_PROFILE_CLEARED, 0x028A, "Load Profile Cleared" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_BATTERY_WARNING, 0x028B, "Battery Warning" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_WRONG_SIGNATURE, 0x028C, "Wrong Signature" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_NO_SIGNATURE, 0x028D, "No Signature" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SIGNATURE_NOT_VALID, 0x028E, "Signature Not Valid" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_UNAUTHORISED_ACTION_FROM_HAN, 0x028F, "Unauthorized Action From HAN" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_FAST_POLLING_START, 0x0290, "Fast Polling Start" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_FAST_POLLING_END, 0x0291, "Fast Polling End" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_METER_REPORTING_INTERVAL_CHANGED, 0x0292, "Meter Reporting Interval Changed" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_DISCONNECT_TO_LOAD_LIMIT, 0x0293, "Disconnect to Load Limit" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_METER_SUPPLY_STATUS_REGISTER_CHANGED, 0x0294, "Meter Supply Status Register Changed" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_METER_ALARM_STATUS_REGISTER_CHANGED, 0x0295, "Meter Alarm Status Register Changed" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_EXTENDED_METER_ALARM_STATUS_REG_CHANGED,0x0296, "Extended Meter Alarm Status Register Changed." ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_DATA_ACCESS_VIA_LOCAL_PORT, 0x0297, "Data Access Via Local Port" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CONFIGURE_MIRROR_SUCCESS, 0x0298, "Configure Mirror Success" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CONFIGURE_MIRROR_FAILURE, 0x0299, "Configure Mirror Failure" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CONFIGURE_NOTIFICATION_FLAG_SCHEME_SUCC,0x029A, "Configure Notification Flag Scheme Success" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CONFIGURE_NOTIFICATION_FLAG_SCHEME_FAIL,0x029B, "Configure Notification Flag Scheme Failure" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CONFIGURE_NOTIFICATION_FLAGS_SUCCESS, 0x029C, "Configure Notification Flags Success" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CONFIGURE_NOTIFICATION_FLAGS_FAILURE, 0x029D, "Configure Notification Flags Failure" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_STAY_AWAKE_REQUEST_HAN, 0x029E, "Stay Awake Request HAN" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_STAY_AWAKE_REQUEST_WAN, 0x029F, "Stay Awake Request WAN" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MANUFACTURER_SPECIFIC_A, 0x02B0, "Manufacturer Specific A" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MANUFACTURER_SPECIFIC_B, 0x02B1, "Manufacturer Specific B" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MANUFACTURER_SPECIFIC_C, 0x02B2, "Manufacturer Specific C" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MANUFACTURER_SPECIFIC_D, 0x02B3, "Manufacturer Specific D" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MANUFACTURER_SPECIFIC_E, 0x02B4, "Manufacturer Specific E" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MANUFACTURER_SPECIFIC_F, 0x02B5, "Manufacturer Specific F" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MANUFACTURER_SPECIFIC_G, 0x02B6, "Manufacturer Specific G" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MANUFACTURER_SPECIFIC_H, 0x02B7, "Manufacturer Specific H" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MANUFACTURER_SPECIFIC_I, 0x02B8, "Manufacturer Specific I" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_PROFILE_COMMAND_RECEIVED, 0x02C0, "Get Profile Command Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_PROFILE_COMMAND_ACTIONED, 0x02C1, "Get Profile Command Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_PROFILE_COMMAND_CANCELLED, 0x02C2, "Get Profile Command Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_PROFILE_COMMAND_REJECTED, 0x02C3, "Get Profile Command Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_REQUEST_MIRROR_RESPONSE_COMMAND_RECV, 0x02C4, "Request Mirror Response Command Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_REQUEST_MIRROR_RESPONSE_COMMAND_ACTION, 0x02C5, "Request Mirror Response Command Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_REQUEST_MIRROR_RESPONSE_COMMAND_CANCEL, 0x02C6, "Request Mirror Response Command Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_REQUEST_MIRROR_RESPONSE_COMMAND_REJECT, 0x02C7, "Request Mirror Response Command Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MIRROR_REMOVED_COMMAND_RECEIVED, 0x02C8, "Mirror Removed Command Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MIRROR_REMOVED_COMMAND_ACTIONED, 0x02C9, "Mirror Removed Command Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MIRROR_REMOVED_COMMAND_CANCELLED, 0x02CA, "Mirror Removed Command Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MIRROR_REMOVED_COMMAND_REJECTED, 0x02CB, "Mirror Removed Command Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_SNAPSHOT_COMMAND_RECEIVED, 0x02CC, "Get Snapshot Command Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_SNAPSHOT_COMMAND_ACTIONED, 0x02CD, "Get Snapshot Command Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_SNAPSHOT_COMMAND_CANCELLED, 0x02CE, "Get Snapshot Command Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_SNAPSHOT_COMMAND_REJECTED, 0x02CF, "Get Snapshot Command Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TAKE_SNAPSHOT_COMMAND_RECEIVED, 0x02D0, "Take Snapshot Command Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TAKE_SNAPSHOT_COMMAND_ACTIONED, 0x02D1, "Take Snapshot Command Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TAKE_SNAPSHOT_COMMAND_CANCELLED, 0x02D2, "Take Snapshot Command Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TAKE_SNAPSHOT_COMMAND_REJECTED, 0x02D3, "Take Snapshot Command Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MIRROR_REPORT_ATTRIBUTE_RSP_CMD_RECV, 0x02D4, "Mirror Report Attribute Response Command Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MIRROR_REPORT_ATTRIBUTE_RSP_CMD_ACTION, 0x02D5, "Mirror Report Attribute Response Command Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MIRROR_REPORT_ATTRIBUTE_RSP_CMD_CANCEL, 0x02D6, "Mirror Report Attribute Response Command Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MIRROR_REPORT_ATTRIBUTE_RSP_CMD_REJECT, 0x02D7, "Mirror Report Attribute Response Command Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SCHEDULE_SNAPSHOT_COMMAND_RECEIVED, 0x02D8, "Schedule Snapshot Command Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SCHEDULE_SNAPSHOT_COMMAND_ACTIONED, 0x02D9, "Schedule Snapshot Command Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SCHEDULE_SNAPSHOT_COMMAND_CANCELLED, 0x02DA, "Schedule Snapshot Command Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SCHEDULE_SNAPSHOT_COMMAND_REJECTED, 0x02DB, "Schedule Snapshot Command Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_START_SAMPLING_COMMAND_RECEIVED, 0x02DC, "Start Sampling Command Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_START_SAMPLING_COMMAND_ACTIONED, 0x02DD, "Start Sampling Command Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_START_SAMPLING_COMMAND_CANCELLED, 0x02DE, "Start Sampling Command Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_START_SAMPLING_COMMAND_REJECTED, 0x02DF, "Start Sampling Command Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_SAMPLED_DATA_COMMAND_RECEIVED, 0x02E0, "Get Sampled Data Command Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_SAMPLED_DATA_COMMAND_ACTIONED, 0x02E1, "Get Sampled Data Command Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_SAMPLED_DATA_COMMAND_CANCELLED, 0x02E2, "Get Sampled Data Command Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_SAMPLED_DATA_COMMAND_REJECTED, 0x02E3, "Get Sampled Data Command Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SUPPLY_ON, 0x02E4, "Supply On" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SUPPLY_ARMED, 0x02E5, "Supply Armed" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SUPPLY_OFF, 0x02E6, "Supply Off" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_DISCONNECTED_DUE_TO_TAMPER_DETECTED, 0x02E7, "Disconnected due to Tamper Detected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MANUAL_DISCONNECT, 0x02E8, "Manual Disconnect" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MANUAL_CONNECT, 0x02E9, "Manual Connect" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_REMOTE_DISCONNECTION, 0x02EA, "Remote Disconnection" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_REMOTE_CONNECT, 0x02EB, "Remote Connect" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_LOCAL_DISCONNECTION, 0x02EC, "Local Disconnection" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_LOCAL_CONNECT, 0x02ED, "Local Connect" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CHANGE_SUPPLY_RECEIVED, 0x02EE, "Change Supply Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CHANGE_SUPPLY_ACTIONED, 0x02EF, "Change Supply Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CHANGE_SUPPLY_CANCELLED, 0x02F0, "Change Supply Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CHANGE_SUPPLY_REJECTED, 0x02F1, "Change Supply Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_LOCAL_CHANGE_SUPPLY_RECEIVED, 0x02F2, "Local Change Supply Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_LOCAL_CHANGE_SUPPLY_ACTIONED, 0x02F3, "Local Change Supply Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_LOCAL_CHANGE_SUPPLY_CANCELLED, 0x02F4, "Local Change Supply Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_LOCAL_CHANGE_SUPPLY_REJECTED, 0x02F5, "Local Change Supply Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_UNCONTROLLED_FLOW_THRES_RECV, 0x02F6, "Publish Uncontrolled Flow Threshold Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_UNCONTROLLED_FLOW_THRES_ACTION, 0x02F7, "Publish Uncontrolled Flow Threshold Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_UNCONTROLLED_FLOW_THRES_CANCEL, 0x02F8, "Publish Uncontrolled Flow Threshold Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_UNCONTROLLED_FLOW_THRES_REJECY, 0x02F9, "Publish Uncontrolled Flow Threshold Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_RESERVED_FOR_METERING_CLUSTER_GROUP_ID, 0x02FF, "Reserved for Metering Cluster Group Id" ) \
/* Messaging Event Configuration Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MESSAGE_CONFIRMATION_SENT, 0x0300, "Message Confirmation Sent" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_DISPLAY_MESSAGE_RECEIVED, 0x03C0, "Display Message Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_DISPLAY_MESSAGE_ACTIONED, 0x03C1, "Display Message Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_DISPLAY_MESSAGE_CANCELLED, 0x03C2, "Display Message Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_DISPLAY_MESSAGE_REJECTED, 0x03C3, "Display Message Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CANCEL_MESSAGE_RECEIVED, 0x03C4, "Cancel Message Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CANCEL_MESSAGE_ACTIONED, 0x03C5, "Cancel Message Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CANCEL_MESSAGE_CANCELLED, 0x03C6, "Cancel Message Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CANCEL_MESSAGE_REJECTED, 0x03C7, "Cancel Message Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_RESERVED_FOR_MESSAGING_CLUSTER_GROUP_ID,0x03FF, "Reserved for Messaging Cluster Group ID" ) \
/* Prepayment Event Configuration Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_LOW_CREDIT, 0x0400, "Low Credit" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_NO_CREDIT_ZERO_CREDIT, 0x0401, "No Credit (Zero Credit)" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CREDIT_EXHAUSTED, 0x0402, "Credit Exhausted" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_EMERGENCY_CREDIT_ENABLED, 0x0403, "Emergency Credit Enabled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_EMERGENCY_CREDIT_EXHAUSTED, 0x0404, "Emergency Credit Exhausted" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_IHD_LOW_CREDIT_WARNING, 0x0405, "IHD Low Credit Warning" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PHYSICAL_ATTACK_ON_THE_PREPAY_METER, 0x0420, "Physical Attack on the Prepay Meter" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_ELECTRONIC_ATTACK_ON_THE_PREPAY_METER, 0x0421, "Electronic Attack on the Prepay Meter" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_DISCOUNT_APPLIED, 0x0422, "Discount Applied" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CREDIT_ADJUSTMENT, 0x0423, "Credit Adjustment" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CREDIT_ADJUST_FAIL, 0x0424, "Credit Adjust Fail" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_DEBT_ADJUSTMENT, 0x0425, "Debt Adjustment" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_DEBT_ADJUST_FAIL, 0x0426, "Debt Adjust Fail" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MODE_CHANGE, 0x0427, "Mode Change" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TOPUP_CODE_ERROR, 0x0428, "Topup Code Error" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TOPUP_ALREADY_USED, 0x0429, "Topup Already Used" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TOPUP_CODE_INVALID, 0x042A, "Topup Code Invalid" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TOPUP_ACCEPTED_VIA_REMOTE, 0x042B, "Topup Accepted via Remote" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TOPUP_ACCEPTED_VIA_MANUAL_ENTRY, 0x042C, "Topup Accepted via Manual Entry" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_FRIENDLY_CREDIT_IN_USE, 0x042D, "Friendly Credit in Use" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_FRIENDLY_CREDIT_PERIOD_END_WARNING, 0x042E, "Friendly Credit Period End Warning" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_FRIENDLY_CREDIT_PERIOD_END, 0x042F, "Friendly Credit Period End" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PP_ERROR_REGISTER_CLEAR, 0x0430, "Prepayment Error Register Clear" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PP_ALARM_REGISTER_CLEAR, 0x0431, "Prepayment Alarm Register Clear" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PREPAY_CLUSTER_NOT_FOUND, 0x0432, "Prepay Cluster Not Found" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TOPUP_VALUE_TOO_LARGE, 0x0433, "Topup Value too Large" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MODE_CREDIT_2_PREPAY, 0x0441, "Mode Credit 2 Prepay" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MODE_PREPAY_2_CREDIT, 0x0442, "Mode Prepay 2 Credit" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_MODE_DEFAULT, 0x0443, "Mode Default" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SELECT_AVAILABLE_EMERG_CREDIT_RECV, 0x04C0, "Select Available Emergency Credit Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SELECT_AVAILABLE_EMERG_CREDIT_ACTION, 0x04C1, "Select Available Emergency Credit Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SELECT_AVAILABLE_EMERG_CREDIT_CANCEL, 0x04C2, "Select Available Emergency Credit Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SELECT_AVAILABLE_EMERG_CREDIT_REJECT, 0x04C3, "Select Available Emergency Credit Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CHANGE_DEBT_RECEIVED, 0x04C4, "Change Debt Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CHANGE_DEBT_ACTIONED, 0x04C5, "Change Debt Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CHANGE_DEBT_CANCELLED, 0x04C6, "Change Debt Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CHANGE_DEBT_REJECTED, 0x04C7, "Change Debt Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_EMERGENCY_CREDIT_SETUP_RECEIVED, 0x04C8, "Emergency Credit Setup Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_EMERGENCY_CREDIT_SETUP_ACTIONED, 0x04C9, "Emergency Credit Setup Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_EMERGENCY_CREDIT_SETUP_CANCELLED, 0x04CA, "Emergency Credit Setup Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_EMERGENCY_CREDIT_SETUP_REJECTED, 0x04CB, "Emergency Credit Setup Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CONSUMER_TOPUP_RECEIVED, 0x04CC, "Consumer Topup Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CONSUMER_TOPUP_ACTIONED, 0x04CD, "Consumer Topup Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CONSUMER_TOPUP_CANCELLED, 0x04CE, "Consumer Topup Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CONSUMER_TOPUP_REJECTED, 0x04CF, "Consumer Topup Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CREDIT_ADJUSTMENT_RECEIVED, 0x04D0, "Credit Adjustment Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CREDIT_ADJUSTMENT_ACTIONED, 0x04D1, "Credit Adjustment Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CREDIT_ADJUSTMENT_CANCELLED, 0x04D2, "Credit Adjustment Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CREDIT_ADJUSTMENT_REJECTED, 0x04D3, "Credit Adjustment Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CHANGE_PAYMENT_MODE_RECEIVED, 0x04D4, "Change Payment Mode Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CHANGE_PAYMENT_MODE_ACTIONED, 0x04D5, "Change Payment Mode Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CHANGE_PAYMENT_MODE_CANCELLED, 0x04D6, "Change Payment Mode Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CHANGE_PAYMENT_MODE_REJECTED, 0x04D7, "Change Payment Mode Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_PREPAY_SNAPSHOT_RECEIVED, 0x04D8, "Get Prepay Snapshot Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_PREPAY_SNAPSHOT_ACTIONED, 0x04D9, "Get Prepay Snapshot Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_PREPAY_SNAPSHOT_CANCELLED, 0x04DA, "Get Prepay Snapshot Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_PREPAY_SNAPSHOT_REJECTED, 0x04DB, "Get Prepay Snapshot Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_TOPUP_LOG_RECEIVED, 0x04DC, "Get Topup Log Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_TOPUP_LOG_ACTIONED, 0x04DD, "Get Topup Log Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_TOPUP_LOG_CANCELLED, 0x04DE, "Get Topup Log Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_TOPUP_LOG_REJECTED, 0x04DF, "Get Topup Log Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SET_LOW_CREDIT_WARNING_LEVEL_RECEIVED, 0x04E0, "Set Low Credit Warning Level Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SET_LOW_CREDIT_WARNING_LEVEL_ACTIONED, 0x04E1, "Set Low Credit Warning Level Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SET_LOW_CREDIT_WARNING_LEVEL_CANCELLED, 0x04E2, "Set Low Credit Warning Level Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SET_LOW_CREDIT_WARNING_LEVEL_REJECTED, 0x04E3, "Set Low Credit Warning Level Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_DEBT_REPAY_LOG_RECEIVED, 0x04E4, "Get Debt Repay Log Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_DEBT_REPAY_LOG_ACTIONED, 0x04E5, "Get Debt Repay Log Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_DEBT_REPAY_LOG_CANCELLED, 0x04E6, "Get Debt Repay Log Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_DEBT_REPAY_LOG_REJECTED, 0x04E7, "Get Debt Repay Log Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SET_MAXIMUM_CREDIT_LIMIT_RECEIVED, 0x04E8, "Set Maximum Credit Limit Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SET_MAXIMUM_CREDIT_LIMIT_ACTIONED, 0x04E9, "Set Maximum Credit Limit Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SET_MAXIMUM_CREDIT_LIMIT_CANCELLED, 0x04EA, "Set Maximum Credit Limit Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SET_MAXIMUM_CREDIT_LIMIT_REJECTED, 0x04EB, "Set Maximum Credit Limit Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SET_OVERALL_DEBT_CAP_RECEIVED, 0x04EC, "Set Overall Debt Cap Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SET_OVERALL_DEBT_CAP_ACTIONED, 0x04ED, "Set Overall Debt Cap Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SET_OVERALL_DEBT_CAP_CANCELLED, 0x04EE, "Set Overall Debt Cap Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SET_OVERALL_DEBT_CAP_REJECTED, 0x04EF, "Set Overall Debt Cap Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_RESERVED_FOR_PP_CLUSTER_GROUP_ID, 0x04FF, "Reserved for Prepayment Cluster Group ID" ) \
/* Calendar Event Configuration Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CALENDAR_CLUSTER_NOT_FOUND, 0x0500, "Calendar Cluster Not Found" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CALENDAR_CHANGE_PASSIVE_ACTIVATED, 0x0501, "Calendar Change Passive Activated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CALENDAR_CHANGE_PASSIVE_UPDATED, 0x0502, "Calendar Change Passive Updated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CALENDAR_RECEIVED, 0x05C0, "Publish Calendar Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CALENDAR_ACTIONED, 0x05C1, "Publish Calendar Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CALENDAR_CANCELLED, 0x05C2, "Publish Calendar Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_CALENDAR_REJECTED, 0x05C3, "Publish Calendar Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_DAY_PROFILE_RECEIVED, 0x05C4, "Publish Day Profile Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_DAY_PROFILE_ACTIONED, 0x05C5, "Publish Day Profile Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_DAY_PROFILE_CANCELLED, 0x05C6, "Publish Day Profile Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_DAY_PROFILE_REJECTED, 0x05C7, "Publish Day Profile Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_WEEK_PROFILE_RECEIVED, 0x05C8, "Publish Week Profile Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_WEEK_PROFILE_ACTIONED, 0x05C9, "Publish Week Profile Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_WEEK_PROFILE_CANCELLED, 0x05CA, "Publish Week Profile Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_WEEK_PROFILE_REJECTED, 0x05CB, "Publish Week Profile Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_SEASONS_RECEIVED, 0x05CC, "Publish Seasons Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_SEASONS_ACTIONED, 0x05CD, "Publish Seasons Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_SEASONS_CANCELLED, 0x05CE, "Publish Seasons Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_SEASONS_REJECTED, 0x05CF, "Publish Seasons Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_SPECIAL_DAYS_RECEIVED, 0x05D0, "Publish Special Days Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_SPECIAL_DAYS_ACTIONED, 0x05D1, "Publish Special Days Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_SPECIAL_DAYS_CANCELLED, 0x05D2, "Publish Special Days Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_SPECIAL_DAYS_REJECTED, 0x05D3, "Publish Special Days Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_RESERVED_FOR_CALENDAR_CLUSTER_GROUP_ID, 0x05FF, "Reserved For Calendar Cluster Group ID" ) \
/* Device Management Event Configuration Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PASSWORD_1_CHANGE, 0x0600, "Password 1 Change" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PASSWORD_2_CHANGE, 0x0601, "Password 2 Change" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PASSWORD_3_CHANGE, 0x0602, "Password 3 Change" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PASSWORD_4_CHANGE, 0x0603, "Password 4 Change" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_EVENT_LOG_CLEARED, 0x0604, "Event Log Cleared" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_ZIGBEE_APS_TIMEOUT, 0x0610, "ZigBee APS Timeout" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_ZIGBEE_IEEE_TRANS_FAILURE_OVER_THRES, 0x0611, "ZigBee IEEE Transmission Failure Over Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_ZIGBEE_IEEE_FRAME_CHECK_SEQ_THRES, 0x0612, "ZigBee IEEE Frame Check Sequence Threshold" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_ERROR_CERTIFICATE, 0x0613, "Error Certificate" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_ERROR_SIGNATURE, 0x0614, "Error Signature" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_ERROR_PROGRAM_STORAGE, 0x0615, "Error Program Storage" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_COT_RECEIVED, 0x06C0, "Publish CoT Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_COT_ACTIONED, 0x06C1, "Publish CoT Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_COT_CANCELLED, 0x06C2, "Publish CoT Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_COT_REJECTED, 0x06C3, "Publish CoT Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_COS_RECEIVED, 0x06C4, "Publish CoS Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_COS_ACTIONED, 0x06C5, "Publish CoS Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_COS_CANCELLED, 0x06C6, "Publish CoS Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PUBLISH_COS_REJECTED, 0x06C7, "Publish CoS Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CHANGE_PASSWORD_RECEIVED, 0x06C8, "Change Password Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CHANGE_PASSWORD_ACTIONED, 0x06C9, "Change Password Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CHANGE_PASSWORD_CANCELLED, 0x06CA, "Change Password Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CHANGE_PASSWORD_REJECTED, 0x06CB, "Change Password Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SET_EVENT_CONFIGURATION_RECEIVED, 0x06CC, "Set Event Configuration Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SET_EVENT_CONFIGURATION_ACTIONED, 0x06CD, "Set Event Configuration Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SET_EVENT_CONFIGURATION_CANCELLED, 0x06CE, "Set Event Configuration Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_SET_EVENT_CONFIGURATION_REJECTED, 0x06CF, "Set Event Configuration Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_UPDATE_SITE_ID_RECEIVED, 0x06D0, "Update Site ID Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_UPDATE_SITE_ID_ACTIONED, 0x06D1, "Update Site ID Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_UPDATE_SITE_ID_CANCELLED, 0x06D2, "Update Site ID Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_UPDATE_SITE_ID_REJECTED, 0x06D3, "Update Site ID Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_UPDATE_CIN_RECEIVED, 0x06D4, "Update CIN Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_UPDATE_CIN_ACTIONED, 0x06D5, "Update CIN Actioned" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_UPDATE_CIN_CANCELLED, 0x06D6, "Update CIN Cancelled" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_UPDATE_CIN_REJECTED, 0x06D7, "Update CIN Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_RESERVED_FOR_DM_CLUSTER_ID, 0x06FF, "Reserved for Device Management Cluster Group ID" ) \
/* Tunnel Event Configuration Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TUNNELING_CLUSTER_NOT_FOUND, 0x0700, "Tunneling Cluster Not Found" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_UNSUPPORTED_PROTOCOL, 0x0701, "Unsupported Protocol" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_INCORRECT_PROTOCOL, 0x0702, "Incorrect Protocol" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_REQUEST_TUNNEL_COMMAND_RECEIVED, 0x07C0, "Request Tunnel Command Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_REQUEST_TUNNEL_COMMAND_REJECTED, 0x07C1, "Request Tunnel Command Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_REQUEST_TUNNEL_COMMAND_GENERATED, 0x07C2, "Request Tunnel Command Generated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CLOSE_TUNNEL_COMMAND_RECEIVED, 0x07C3, "Close Tunnel Command Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CLOSE_TUNNEL_COMMAND_REJECTED, 0x07C4, "Close Tunnel Command Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_CLOSE_TUNNEL_COMMAND_GENERATED, 0x07C5, "Close Tunnel Command Generated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TRANSFER_DATA_COMMAND_RECEIVED, 0x07C6, "Transfer Data Command Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TRANSFER_DATA_COMMAND_REJECTED, 0x07C7, "Transfer Data Command Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TRANSFER_DATA_COMMAND_GENERATED, 0x07C8, "Transfer Data Command Generated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TRANSFER_DATA_ERROR_COMMAND_RECEIVED, 0x07C9, "Transfer Data Error Command Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TRANSFER_DATA_ERROR_COMMAND_REJECTED, 0x07CA, "Transfer Data Error Command Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_TRANSFER_DATA_ERROR_COMMAND_GENERATED, 0x07CB, "Transfer Data Error Command Generated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_ACK_TRANSFER_DATA_COMMAND_RECEIVED, 0x07CC, "Ack Transfer Data Command Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_ACK_TRANSFER_DATA_COMMAND_REJECTED, 0x07CD, "Ack Transfer Data Command Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_ACK_TRANSFER_DATA_COMMAND_GENERATED, 0x07CE, "Ack Transfer Data Command Generated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_READY_DATA_COMMAND_RECEIVED, 0x07CF, "Ready Data Command Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_READY_DATA_COMMAND_REJECTED, 0x07D0, "Ready Data Command Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_READY_DATA_COMMAND_GENERATED, 0x07D1, "Ready Data Command Generated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_SUPPORTED_TUNNEL_PROT_CMD_RECV, 0x07D2, "Get Supported Tunnel Protocols Command Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_SUPPORTED_TUNNEL_PROT_CMD_REJECT, 0x07D3, "Get Supported Tunnel Protocols Command Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_GET_SUPPORTED_TUNNEL_PROT_CMD_GENERATED,0x07D4, "Get Supported Tunnel Protocols Command Generated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_RESERVED_FOR_TUNNEL_CLUSTER_GROUP_ID, 0x07FF, "Reserved for Tunnel Cluster Group ID" ) \
/* OTA Event Configuration Attribute Set */ \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_FIRMWARE_READY_FOR_ACTIVATION, 0x0800, "Firmware Ready for Activation" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_FIRMWARE_ACTIVATED, 0x0801, "Firmware Activated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_FIRMWARE_ACTIVATION_FAILURE, 0x0802, "Firmware Activation Failure" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PATCH_READY_FOR_ACTIVATION, 0x0803, "Patch Ready for Activation" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PATCH_ACTIVATED, 0x0804, "Patch Activated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_PATCH_FAILURE, 0x0805, "Patch Failure" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_IMAGE_NOTIFY_COMMAND_RECEIVED, 0x08C0, "Image Notify Command Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_IMAGE_NOTIFY_COMMAND_REJECTED, 0x08C1, "Image Notify Command Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_QUERY_NEXT_IMAGE_REQUEST_GENERATED, 0x08C2, "Query Next Image Request Generated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_QUERY_NEXT_IMAGE_RESPONSE_RECEIVED, 0x08C3, "Query Next Image Response Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_QUERY_NEXT_IMAGE_RESPONSE_REJECTED, 0x08C4, "Query Next Image Response Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_IMAGE_BLOCK_REQUEST_GENERATED, 0x08C5, "Image Block Request Generated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_IMAGE_PAGE_REQUEST_GENERATED, 0x08C6, "Image Page Request Generated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_IMAGE_BLOCK_RESPONSE_RECEIVED, 0x08C7, "Image Block Response Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_IMAGE_BLOCK_RESPONSE_REJECTED, 0x08C8, "Image Block Response Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_UPGRADE_END_REQUEST_GENERATED, 0x08C9, "Upgrade End Request Generated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_UPGRADE_END_RESPONSE_RECEIVED, 0x08CA, "Upgrade End Response Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_UPGRADE_END_RESPONSE_REJECTED, 0x08CB, "Upgrade End Response Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_QUERY_SPECIFIC_FILE_REQUEST_GENERATED, 0x08CC, "Query Specific File Request Generated" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_QUERY_SPECIFIC_FILE_RESPONSE_RECEIVED, 0x08CD, "Query Specific File Response Received" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_QUERY_SPECIFIC_FILE_RESPONSE_REJECTED, 0x08CE, "Query Specific File Response Rejected" ) \
XXX(ZBEE_ZCL_ATTR_ID_DEVICE_MANAGEMENT_CLNT_RESERVED_FOR_OTA_CLUSTER_GROUP_ID, 0x08FF, "Reserved For OTA Cluster Group ID" ) \
/* Smart Energy */ \
XXX(ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_DEVICE_MANAGEMENT_CLNT, 0xFFFE, "Attribute Reporting Status" )
VALUE_STRING_ENUM(zbee_zcl_device_management_attr_client_names);
VALUE_STRING_ARRAY(zbee_zcl_device_management_attr_client_names);
static value_string_ext zbee_zcl_device_management_attr_client_names_ext = VALUE_STRING_EXT_INIT(zbee_zcl_device_management_attr_client_names);
/* Server Commands Received */
#define zbee_zcl_device_management_srv_rx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_GET_CHANGE_OF_TENANCY, 0x00, "Get Change Of Tenancy" ) \
XXX(ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_GET_CHANGE_OF_SUPPLIER, 0x01, "Get Change Of Supplier" ) \
XXX(ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_REQUEST_NEW_PASSWORD, 0x02, "Request New Password" ) \
XXX(ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_GET_SITE_ID, 0x03, "Get Site ID" ) \
XXX(ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_REPORT_EVENT_CONFIGURATION, 0x04, "Report Event Configuration" ) \
XXX(ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_GET_CIN, 0x05, "Get CIN" )
VALUE_STRING_ENUM(zbee_zcl_device_management_srv_rx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_device_management_srv_rx_cmd_names);
/* Server Commands Generated */
#define zbee_zcl_device_management_srv_tx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_PUBLISH_CHANGE_OF_TENANCY, 0x00, "Publish Change Of Tenancy" ) \
XXX(ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_PUBLISH_CHANGE_OF_SUPPLIER, 0x01, "Publish Change Of Supplier" ) \
XXX(ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_REQUEST_NEW_PASSWORD_RESPONSE, 0x02, "Request New Password Response" ) \
XXX(ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_UPDATE_SITE_ID, 0x03, "Update Site ID" ) \
XXX(ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_SET_EVENT_CONFIGURATION, 0x04, "Set Event Configuration" ) \
XXX(ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_GET_EVENT_CONFIGURATION, 0x05, "Get Event Configuration" ) \
XXX(ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_UPDATE_CIN, 0x06, "Update CIN" )
VALUE_STRING_ENUM(zbee_zcl_device_management_srv_tx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_device_management_srv_tx_cmd_names);
#define zbee_zcl_device_management_password_types_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_PASSWORD_TYPE_RESERVED, 0x00, "Reserved") \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_PASSWORD_TYPE_PASSWORD_1, 0x01, "Password 1") \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_PASSWORD_TYPE_PASSWORD_2, 0x02, "Password 2") \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_PASSWORD_TYPE_PASSWORD_3, 0x03, "Password 3") \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_PASSWORD_TYPE_PASSWORD_4, 0x04, "Password 4")
VALUE_STRING_ENUM(zbee_zcl_device_management_password_types);
VALUE_STRING_ARRAY(zbee_zcl_device_management_password_types);
#define zbee_zcl_device_management_event_configuration_log_types_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_EVENT_CONFIGURATION_DO_NOT_LOG, 0x0, "Do not Log") \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_EVENT_CONFIGURATION_LOG_AS_TAMPER, 0x1, "Log as Tamper") \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_EVENT_CONFIGURATION_LOG_AS_FAULT, 0x2, "Log as Fault") \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_EVENT_CONFIGURATION_LOG_AS_GENERAL_EVENT, 0x3, "Log as General Event") \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_EVENT_CONFIGURATION_LOG_AS_SECURITY_EVENT, 0x4, "Log as Security Event") \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_EVENT_CONFIGURATION_LOG_AS_NETWORK_EVENT, 0x5, "Log as Network Event")
VALUE_STRING_ENUM(zbee_zcl_device_management_event_configuration_log_types);
VALUE_STRING_ARRAY(zbee_zcl_device_management_event_configuration_log_types);
#define zbee_zcl_device_management_contactor_states_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_SUPPLY_OFF, 0x0, "Supply OFF") \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_SUPPLY_OFF_ARMED, 0x1, "Supply OFF / ARMED") \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_SUPPLY_ON, 0x2, "Supply ON") \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_SUPPLY_UNCHANGED, 0x3, "Supply UNCHANGED")
VALUE_STRING_ENUM(zbee_zcl_device_management_contactor_states);
VALUE_STRING_ARRAY(zbee_zcl_device_management_contactor_states);
#define zbee_zcl_device_management_configuration_controls_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_CONFIGURATION_CONTROL_APPLY_BY_LIST, 0x00, "Apply by List") \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_CONFIGURATION_CONTROL_APPLY_BY_EVENT_GROUP, 0x01, "Apply by Event Group") \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_CONFIGURATION_CONTROL_APPLY_BY_LOG_TYPE, 0x02, "Apply by Log Type") \
XXX(ZBEE_ZCL_DEVICE_MANAGEMENT_CONFIGURATION_CONTROL_APPLY_BY_CONFIGURATION_MATCH, 0x03, "Apply by Configuration Match")
VALUE_STRING_ENUM(zbee_zcl_device_management_configuration_controls);
VALUE_STRING_ARRAY(zbee_zcl_device_management_configuration_controls);
/*************************/
/* Function Declarations */
/*************************/
void proto_register_zbee_zcl_device_management(void);
void proto_reg_handoff_zbee_zcl_device_management(void);
/* Attribute Dissector Helpers */
static void dissect_zcl_device_management_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr);
/*************************/
/* Global Variables */
/*************************/
/* Initialize the protocol and registered fields */
static int proto_zbee_zcl_device_management = -1;
static int hf_zbee_zcl_device_management_srv_tx_cmd_id = -1;
static int hf_zbee_zcl_device_management_srv_rx_cmd_id = -1;
static int hf_zbee_zcl_device_management_attr_server_id = -1;
static int hf_zbee_zcl_device_management_attr_client_id = -1;
static int hf_zbee_zcl_device_management_attr_reporting_status = -1;
static int hf_zbee_zcl_device_management_password_type = -1;
static int hf_zbee_zcl_device_management_command_index = -1;
static int hf_zbee_zcl_device_management_total_commands = -1;
static int hf_zbee_zcl_device_management_event_id= -1;
static int hf_zbee_zcl_device_management_event_configuration = -1;
static int hf_zbee_zcl_device_management_event_configuration_logging = -1;
static int hf_zbee_zcl_device_management_event_configuration_push_event_to_wan = -1;
static int hf_zbee_zcl_device_management_event_configuration_push_event_to_han = -1;
static int hf_zbee_zcl_device_management_event_configuration_raise_alarm_zigbee = -1;
static int hf_zbee_zcl_device_management_event_configuration_raise_alarm_physical = -1;
static int hf_zbee_zcl_device_management_event_configuration_reserved = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_provider_id = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_issuer_event_id = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_tariff_type = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_implementation_date = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_pre_snapshot = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_post_snapshot = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_reset_credit_register = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_reset_debit_register = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_reset_billing_period = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_tariff_plan = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_standing_charge = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_block_historical_load_profile_information = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_historical_load_profile_information = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_ihd_data_consumer = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_ihd_data_supplier = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_meter_contactor_state = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_transaction_log = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_prepayment_data = -1;
static int hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_reserved = -1;
static int hf_zbee_zcl_device_management_publish_change_of_supplier_current_provider_id = -1;
static int hf_zbee_zcl_device_management_publish_change_of_supplier_issuer_event_id = -1;
static int hf_zbee_zcl_device_management_publish_change_of_supplier_tariff_type = -1;
static int hf_zbee_zcl_device_management_publish_change_of_supplier_proposed_provider_id = -1;
static int hf_zbee_zcl_device_management_publish_change_of_supplier_provider_change_implementation_time = -1;
static int hf_zbee_zcl_device_management_publish_change_of_supplier_provider_change_control = -1;
static int hf_zbee_zcl_device_management_publish_change_of_supplier_provider_proposed_provider_name = -1;
static int hf_zbee_zcl_device_management_publish_change_of_supplier_provider_proposed_provider_contact_details = -1;
static int hf_zbee_zcl_device_management_request_new_password_issuer_event_id = -1;
static int hf_zbee_zcl_device_management_request_new_password_implementation_date = -1;
static int hf_zbee_zcl_device_management_request_new_password_password = -1;
static int hf_zbee_zcl_device_management_request_new_password_duration_in_minutes = -1;
static int hf_zbee_zcl_device_management_update_site_id_issuer_event_id = -1;
static int hf_zbee_zcl_device_management_update_site_id_site_id_time = -1;
static int hf_zbee_zcl_device_management_update_site_id_provider_id = -1;
static int hf_zbee_zcl_device_management_update_site_id_site_id = -1;
static int hf_zbee_zcl_device_management_set_event_configuration_issuer_event_id = -1;
static int hf_zbee_zcl_device_management_set_event_configuration_start_time = -1;
static int hf_zbee_zcl_device_management_set_event_configuration_configuration_control = -1;
static int hf_zbee_zcl_device_management_set_event_configuration_event_configuration_number_of_events = -1;
static int hf_zbee_zcl_device_management_set_event_configuration_event_configuration_event_id = -1;
static int hf_zbee_zcl_device_management_set_event_configuration_event_configuration_event_group_id = -1;
static int hf_zbee_zcl_device_management_set_event_configuration_event_configuration_event_log_id = -1;
static int hf_zbee_zcl_device_management_set_event_configuration_event_configuration_event_configuration_value_match = -1;
static int hf_zbee_zcl_device_management_get_event_configuration_event_id = -1;
static int hf_zbee_zcl_device_management_update_cin_issuer_event_id = -1;
static int hf_zbee_zcl_device_management_update_cin_cin_implementation_time = -1;
static int hf_zbee_zcl_device_management_update_cin_provider_id = -1;
static int hf_zbee_zcl_device_management_update_cin_customerid_number = -1;
static int* const hf_zbee_zcl_device_management_event_configuration_flags[] = {
&hf_zbee_zcl_device_management_event_configuration_logging,
&hf_zbee_zcl_device_management_event_configuration_push_event_to_wan,
&hf_zbee_zcl_device_management_event_configuration_push_event_to_han,
&hf_zbee_zcl_device_management_event_configuration_raise_alarm_zigbee,
&hf_zbee_zcl_device_management_event_configuration_raise_alarm_physical,
&hf_zbee_zcl_device_management_event_configuration_reserved,
NULL
};
static int* const hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_flags[] = {
&hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_pre_snapshot,
&hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_post_snapshot,
&hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_reset_credit_register,
&hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_reset_debit_register,
&hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_reset_billing_period,
&hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_tariff_plan,
&hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_standing_charge,
&hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_block_historical_load_profile_information,
&hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_historical_load_profile_information,
&hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_ihd_data_consumer,
&hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_ihd_data_supplier,
&hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_meter_contactor_state,
&hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_transaction_log,
&hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_prepayment_data,
&hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_reserved,
NULL
};
/* Initialize the subtree pointers */
static gint ett_zbee_zcl_device_management = -1;
static gint ett_zbee_zcl_device_management_event_configuration_payload = -1;
static gint ett_zbee_zcl_device_management_event_configuration = -1;
static gint ett_zbee_zcl_device_management_proposed_tenancy_change_control = -1;
/*************************/
/* Function Bodies */
/*************************/
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*@param attr_id attribute identifier
*@param data_type attribute data type
*@param client_attr ZCL client
*/
static void
dissect_zcl_device_management_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr)
{
switch (attr_id) {
/* applies to all SE clusters */
case ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_DEVICE_MANAGEMENT:
proto_tree_add_item(tree, hf_zbee_zcl_device_management_attr_reporting_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
break;
default: /* Catch all */
dissect_zcl_attr_data(tvb, tree, offset, data_type, client_attr);
break;
}
} /*dissect_zcl_device_management_attr_data*/
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*/
static void
dissect_zcl_device_management_request_new_password(proto_tree *tree, tvbuff_t *tvb, guint *offset)
{
/* Password Type */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_password_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
}
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*/
static void
dissect_zcl_device_management_report_event_configuration(proto_tree *tree, tvbuff_t *tvb, guint *offset)
{
proto_tree *event_configuration_payload;
guint rem_len;
/* Command Index */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_command_index, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Total Commands */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_total_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
rem_len = tvb_reported_length_remaining(tvb, *offset);
/* Event Configuration Payload */
event_configuration_payload = proto_tree_add_subtree(tree, tvb, *offset, rem_len, ett_zbee_zcl_device_management_event_configuration_payload, NULL, "Event Configuration Payload");
while(tvb_reported_length_remaining(tvb, *offset) > 2) {
/* Event ID */
proto_tree_add_item(event_configuration_payload, hf_zbee_zcl_device_management_event_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Event Configuration */
proto_tree_add_bitmask(event_configuration_payload, tvb, *offset, hf_zbee_zcl_device_management_event_configuration,
ett_zbee_zcl_device_management_event_configuration, hf_zbee_zcl_device_management_event_configuration_flags, ENC_NA);
*offset += 1;
}
}
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*/
static void
dissect_zcl_device_management_publish_change_of_tenancy(proto_tree *tree, tvbuff_t *tvb, guint *offset)
{
nstime_t impl_date;
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_publish_change_of_tenancy_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_publish_change_of_tenancy_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Tariff Type */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_publish_change_of_tenancy_tariff_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Implementation Date/Time */
impl_date.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
impl_date.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_device_management_publish_change_of_tenancy_implementation_date, tvb, *offset, 4, &impl_date);
*offset += 4;
/* Proposed Tenancy Change Control */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control,
ett_zbee_zcl_device_management_proposed_tenancy_change_control, hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_flags, ENC_NA);
*offset += 4;
} /*dissect_zcl_device_management_publish_change_of_tenancy*/
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*/
static void
dissect_zcl_device_management_publish_change_of_supplier(proto_tree *tree, tvbuff_t *tvb, guint *offset)
{
nstime_t impl_time;
gint name_length;
gint detail_length;
/* Current Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_publish_change_of_supplier_current_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_publish_change_of_supplier_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Tariff Type */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_publish_change_of_supplier_tariff_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Proposed Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_publish_change_of_supplier_proposed_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Provider Change Implementation Time */
impl_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
impl_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_device_management_publish_change_of_supplier_provider_change_implementation_time, tvb, *offset, 4, &impl_time);
*offset += 4;
/* Provider Change Control */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_publish_change_of_supplier_provider_change_control, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Proposed Provider Name */
proto_tree_add_item_ret_length(tree, hf_zbee_zcl_device_management_publish_change_of_supplier_provider_proposed_provider_name, tvb, *offset, 1, ENC_NA|ENC_ZIGBEE, &name_length);
*offset += name_length;
/* Proposed Provider Contact Details */
proto_tree_add_item_ret_length(tree, hf_zbee_zcl_device_management_publish_change_of_supplier_provider_proposed_provider_contact_details, tvb, *offset, 1, ENC_NA|ENC_ZIGBEE, &detail_length);
*offset += detail_length;
} /*dissect_zcl_device_management_publish_change_of_supplier*/
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*/
static void
dissect_zcl_device_management_request_new_password_response(proto_tree *tree, tvbuff_t *tvb, guint *offset)
{
nstime_t impl_date;
gint password_length;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_request_new_password_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Implementation Date/Time */
impl_date.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
impl_date.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_device_management_request_new_password_implementation_date, tvb, *offset, 4, &impl_date);
*offset += 4;
/* Duration in minutes */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_request_new_password_duration_in_minutes, tvb, *offset, 2, ENC_NA);
*offset += 2;
/* Password Type */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_password_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Password */
proto_tree_add_item_ret_length(tree, hf_zbee_zcl_device_management_request_new_password_password, tvb, *offset, 1, ENC_NA|ENC_ZIGBEE, &password_length);
*offset += password_length;
} /*dissect_zcl_device_management_request_new_password_response*/
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*/
static void
dissect_zcl_device_management_update_site_id(proto_tree *tree, tvbuff_t *tvb, guint *offset)
{
nstime_t siteid_time;
gint siteid_length;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_update_site_id_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* SiteID Time */
siteid_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
siteid_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_device_management_update_site_id_site_id_time, tvb, *offset, 4, &siteid_time);
*offset += 4;
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_update_site_id_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* SiteID */
proto_tree_add_item_ret_length(tree, hf_zbee_zcl_device_management_update_site_id_site_id, tvb, *offset, 1, ENC_NA|ENC_ZIGBEE, &siteid_length);
*offset += siteid_length;
} /*dissect_zcl_device_management_update_site_id*/
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*/
static void
dissect_zcl_device_management_set_event_configuration(proto_tree *tree, tvbuff_t *tvb, guint *offset)
{
nstime_t start_time;
guint8 config_control;
guint8 number_of_events;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_set_event_configuration_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Start Date/Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_device_management_set_event_configuration_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* Event Configuration */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_device_management_event_configuration,
ett_zbee_zcl_device_management_event_configuration, hf_zbee_zcl_device_management_event_configuration_flags, ENC_NA);
*offset += 1;
/* Configuration Control */
config_control = tvb_get_guint8(tvb, *offset);
proto_tree_add_item(tree, hf_zbee_zcl_device_management_set_event_configuration_configuration_control, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Event Configuration Payload */
switch (config_control) {
case ZBEE_ZCL_DEVICE_MANAGEMENT_CONFIGURATION_CONTROL_APPLY_BY_LIST:
number_of_events = tvb_get_guint8(tvb, *offset);
/* Number of Events */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_set_event_configuration_event_configuration_number_of_events, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Event IDs */
for (guint i = 0; tvb_reported_length_remaining(tvb, *offset) > 0 && i < number_of_events; i++) {
proto_tree_add_item(tree, hf_zbee_zcl_device_management_set_event_configuration_event_configuration_event_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
}
break;
case ZBEE_ZCL_DEVICE_MANAGEMENT_CONFIGURATION_CONTROL_APPLY_BY_EVENT_GROUP:
/* Event Group ID */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_set_event_configuration_event_configuration_event_group_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
break;
case ZBEE_ZCL_DEVICE_MANAGEMENT_CONFIGURATION_CONTROL_APPLY_BY_LOG_TYPE:
/* Log ID */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_set_event_configuration_event_configuration_event_log_id, tvb, *offset, 1, ENC_LITTLE_ENDIAN);
*offset += 1;
break;
case ZBEE_ZCL_DEVICE_MANAGEMENT_CONFIGURATION_CONTROL_APPLY_BY_CONFIGURATION_MATCH:
/* Configuration Value Match */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_set_event_configuration_event_configuration_event_configuration_value_match, tvb, *offset, 1, ENC_LITTLE_ENDIAN);
*offset += 1;
break;
}
} /*dissect_zcl_device_management_set_event_configuration*/
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*/
static void
dissect_zcl_device_management_get_event_configuration(proto_tree *tree, tvbuff_t *tvb, guint *offset)
{
/* Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_get_event_configuration_event_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
} /*dissect_zcl_device_management_get_event_configuration*/
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*/
static void
dissect_zcl_device_management_update_cin(proto_tree *tree, tvbuff_t *tvb, guint *offset)
{
nstime_t cin_impl_time;
gint customer_id_length;
/* Issuer Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_update_cin_issuer_event_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* CIN Implementation Time */
cin_impl_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
cin_impl_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_device_management_update_cin_cin_implementation_time, tvb, *offset, 4, &cin_impl_time);
*offset += 4;
/* Provider ID */
proto_tree_add_item(tree, hf_zbee_zcl_device_management_update_cin_provider_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* CustomerID Number */
proto_tree_add_item_ret_length(tree, hf_zbee_zcl_device_management_update_cin_customerid_number, tvb, *offset, 1, ENC_NA|ENC_ZIGBEE, &customer_id_length);
*offset += customer_id_length;
} /*dissect_zcl_device_management_update_cin*/
/**
*ZigBee ZCL Device Management cluster dissector for wireshark.
*
*@param tvb pointer to buffer containing raw packet.
*@param pinfo pointer to packet information fields
*@param tree pointer to data tree Wireshark uses to display packet.
*/
static int
dissect_zbee_zcl_device_management(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
zbee_zcl_packet *zcl;
proto_tree *payload_tree;
guint offset = 0;
guint8 cmd_id;
gint rem_len;
/* Reject the packet if data is NULL */
if (data == NULL)
return 0;
zcl = (zbee_zcl_packet *)data;
cmd_id = zcl->cmd_id;
/* Create a subtree for the ZCL Command frame, and add the command ID to it. */
if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_device_management_srv_rx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_device_management_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_device_management, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_GET_CHANGE_OF_TENANCY:
/* No Payload */
break;
case ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_GET_CHANGE_OF_SUPPLIER:
/* No Payload */
break;
case ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_REQUEST_NEW_PASSWORD:
dissect_zcl_device_management_request_new_password(payload_tree, tvb, &offset);
break;
case ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_GET_SITE_ID:
/* No Payload */
break;
case ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_REPORT_EVENT_CONFIGURATION:
dissect_zcl_device_management_report_event_configuration(payload_tree, tvb, &offset);
break;
case ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_GET_CIN:
/* No Payload */
break;
default:
break;
}
}
}
else { /* ZBEE_ZCL_FCF_TO_CLIENT */
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_device_management_srv_tx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_device_management_srv_tx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_device_management, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_PUBLISH_CHANGE_OF_TENANCY:
dissect_zcl_device_management_publish_change_of_tenancy(payload_tree, tvb, &offset);
break;
case ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_PUBLISH_CHANGE_OF_SUPPLIER:
dissect_zcl_device_management_publish_change_of_supplier(payload_tree, tvb, &offset);
break;
case ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_REQUEST_NEW_PASSWORD_RESPONSE:
dissect_zcl_device_management_request_new_password_response(payload_tree, tvb, &offset);
break;
case ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_UPDATE_SITE_ID:
dissect_zcl_device_management_update_site_id(payload_tree, tvb, &offset);
break;
case ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_SET_EVENT_CONFIGURATION:
dissect_zcl_device_management_set_event_configuration(payload_tree, tvb, &offset);
break;
case ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_GET_EVENT_CONFIGURATION:
dissect_zcl_device_management_get_event_configuration(payload_tree, tvb, &offset);
break;
case ZBEE_ZCL_CMD_ID_DEVICE_MANAGEMENT_UPDATE_CIN:
dissect_zcl_device_management_update_cin(payload_tree, tvb, &offset);
break;
default:
break;
}
}
}
return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_device_management*/
/**
*This function registers the ZCL Device Management dissector
*
*/
void
proto_register_zbee_zcl_device_management(void)
{
static hf_register_info hf[] = {
{ &hf_zbee_zcl_device_management_attr_server_id,
{ "Attribute", "zbee_zcl_se.device_management.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_device_management_attr_server_names),
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_attr_client_id,
{ "Attribute", "zbee_zcl_se.device_management.attr_client_id", FT_UINT16, BASE_HEX | BASE_EXT_STRING, &zbee_zcl_device_management_attr_client_names_ext,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_attr_reporting_status, /* common to all SE clusters */
{ "Attribute Reporting Status", "zbee_zcl_se.device_management.attr.attr_reporting_status",
FT_UINT8, BASE_HEX, VALS(zbee_zcl_se_reporting_status_names), 0x00, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_srv_tx_cmd_id,
{ "Command", "zbee_zcl_se.device_management.cmd.srv_tx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_device_management_srv_tx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_srv_rx_cmd_id,
{ "Command", "zbee_zcl_se.device_management.cmd.srv_rx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_device_management_srv_rx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_password_type,
{ "Password Type", "zbee_zcl_se.device_management.password_type", FT_UINT8, BASE_HEX, VALS(zbee_zcl_device_management_password_types),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_command_index,
{ "Command Index", "zbee_zcl_se.device_management.command_index", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_total_commands,
{ "Total Commands", "zbee_zcl_se.device_management.total_commands", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_event_id,
{ "Event ID", "zbee_zcl_se.device_management.event_id", FT_UINT16, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_event_configuration,
{ "Event Configuration", "zbee_zcl_se.device_management.event_configuration", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_event_configuration_logging,
{ "Logging", "zbee_zcl_se.device_management.event_configuration.logging", FT_UINT8, BASE_HEX, VALS(zbee_zcl_device_management_event_configuration_log_types),
0x07, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_event_configuration_push_event_to_wan,
{ "Push Event to WAN", "zbee_zcl_se.device_management.event_configuration.push_event_to_wan", FT_BOOLEAN, 8, NULL,
0x08, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_event_configuration_push_event_to_han,
{ "Push Event to HAN", "zbee_zcl_se.device_management.event_configuration.push_event_to_han", FT_BOOLEAN, 8, NULL,
0x10, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_event_configuration_raise_alarm_zigbee,
{ "Raise Alarm (Zigbee)", "zbee_zcl_se.device_management.event_configuration.raise_alarm_zigbee", FT_BOOLEAN, 8, NULL,
0x20, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_event_configuration_raise_alarm_physical,
{ "Raise Alarm (Physical)", "zbee_zcl_se.device_management.event_configuration.raise_alarm_physical", FT_BOOLEAN, 8, NULL,
0x40, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_event_configuration_reserved,
{ "Reserved", "zbee_zcl_se.device_management.event_configuration.reserved", FT_UINT8, BASE_HEX, NULL,
0x80, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_provider_id,
{ "Provider ID", "zbee_zcl_se.device_management.publish_change_of_tenancy.provider_id", FT_UINT32, BASE_HEX, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.device_management.publish_change_of_tenancy.issuer_event_id", FT_UINT32, BASE_HEX, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_tariff_type,
{ "Tariff Type", "zbee_zcl_se.device_management.publish_change_of_tenancy.tariff_type", FT_UINT8, BASE_HEX, VALS(zbee_zcl_price_tariff_type_names),
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_implementation_date,
{ "Implementation Date/Time", "zbee_zcl_se.device_management.publish_change_of_tenancy.implementation_date", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control,
{ "Proposed Tenancy Change Control", "zbee_zcl_se.device_management.publish_change_of_tenancy.proposed_tenancy_change_control", FT_UINT32, BASE_HEX, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_pre_snapshot,
{ "Pre Snapshots", "zbee_zcl_se.device_management.publish_change_of_tenancy.proposed_tenancy_change_control.pre_snapshot", FT_BOOLEAN, 32, NULL,
0x00000001, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_post_snapshot,
{ "Post Snapshots", "zbee_zcl_se.device_management.publish_change_of_tenancy.proposed_tenancy_change_control.post_snapshot", FT_BOOLEAN, 32, NULL,
0x00000002, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_reset_credit_register,
{ "Reset Credit Register", "zbee_zcl_se.device_management.publish_change_of_tenancy.proposed_tenancy_change_control.reset_credit_register", FT_BOOLEAN, 32, NULL,
0x00000004, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_reset_debit_register,
{ "Reset Debit Register", "zbee_zcl_se.device_management.publish_change_of_tenancy.proposed_tenancy_change_control.reset_debit_register", FT_BOOLEAN, 32, NULL,
0x00000008, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_reset_billing_period,
{ "Reset Billing Period", "zbee_zcl_se.device_management.publish_change_of_tenancy.proposed_tenancy_change_control.reset_billing_period", FT_BOOLEAN, 32, NULL,
0x00000010, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_tariff_plan,
{ "Clear Tariff Plan", "zbee_zcl_se.device_management.publish_change_of_tenancy.proposed_tenancy_change_control.clear_tariff_plan", FT_BOOLEAN, 32, NULL,
0x00000020, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_standing_charge,
{ "Clear Standing Charge", "zbee_zcl_se.device_management.publish_change_of_tenancy.proposed_tenancy_change_control.clear_standing_charge", FT_BOOLEAN, 32, NULL,
0x00000040, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_block_historical_load_profile_information,
{ "Block Historical Load Profile Information", "zbee_zcl_se.device_management.publish_change_of_tenancy.proposed_tenancy_change_control.block_historical_load_profile_information", FT_BOOLEAN, 32, NULL,
0x00000080, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_historical_load_profile_information,
{ "Clear Historical Load Profile Information", "zbee_zcl_se.device_management.publish_change_of_tenancy.proposed_tenancy_change_control.clear_historical_load_profile_information", FT_BOOLEAN, 32, NULL,
0x00000100, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_ihd_data_consumer,
{ "Clear IHD Data - Consumer", "zbee_zcl_se.device_management.publish_change_of_tenancy.proposed_tenancy_change_control.clear_ihd_data_consumer", FT_BOOLEAN, 32, NULL,
0x00000200, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_ihd_data_supplier,
{ "Clear IHD Data - Supplier", "zbee_zcl_se.device_management.publish_change_of_tenancy.proposed_tenancy_change_control.clear_ihd_data_supplier", FT_BOOLEAN, 32, NULL,
0x00000400, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_meter_contactor_state,
{ "Meter Contactor State \"On / Off / Armed\"", "zbee_zcl_se.device_management.publish_change_of_tenancy.proposed_tenancy_change_control.meter_contactor_state", FT_UINT32, BASE_HEX, VALS(zbee_zcl_device_management_contactor_states),
0x00001800, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_transaction_log,
{ "Clear Transaction Log", "zbee_zcl_se.device_management.publish_change_of_tenancy.proposed_tenancy_change_control.clear_transaction_log", FT_BOOLEAN, 32, NULL,
0x00002000, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_clear_prepayment_data,
{ "Clear Prepayment Data", "zbee_zcl_se.device_management.publish_change_of_tenancy.proposed_tenancy_change_control.clear_prepayment_data", FT_BOOLEAN, 32, NULL,
0x00004000, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_tenancy_proposed_tenancy_change_control_reserved,
{ "Reserved", "zbee_zcl_se.device_management.publish_change_of_tenancy.proposed_tenancy_change_control.reserved", FT_UINT32, BASE_HEX, NULL,
0xFFFF8000, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_supplier_current_provider_id,
{ "Current Provider ID", "zbee_zcl_se.device_management.publish_change_of_supplier.current_provider_id", FT_UINT32, BASE_HEX, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_supplier_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.device_management.publish_change_of_supplier.issuer_event_id", FT_UINT32, BASE_HEX, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_supplier_tariff_type,
{ "Tariff Type", "zbee_zcl_se.device_management.publish_change_of_supplier.tariff_type", FT_UINT8, BASE_HEX, VALS(zbee_zcl_price_tariff_type_names),
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_supplier_proposed_provider_id,
{ "Proposed Provider ID", "zbee_zcl_se.device_management.publish_change_of_supplier.proposed_provider_id", FT_UINT32, BASE_HEX, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_supplier_provider_change_implementation_time,
{ "Provider Change Implementation Time", "zbee_zcl_se.device_management.publish_change_of_supplier.provider_change_implementation_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_supplier_provider_change_control,
{ "Provider Change Control", "zbee_zcl_se.device_management.publish_change_of_supplier.provider_change_control", FT_UINT32, BASE_HEX, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_supplier_provider_proposed_provider_name,
{ "Proposed Provider Name", "zbee_zcl_se.device_management.publish_change_of_supplier.provider_proposed_provider_name", FT_UINT_STRING, BASE_NONE, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_publish_change_of_supplier_provider_proposed_provider_contact_details,
{ "Proposed Provider Contact Details", "zbee_zcl_se.device_management.publish_change_of_supplier.provider_proposed_provider_contact_details", FT_UINT_STRING, BASE_NONE, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_request_new_password_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.device_management.request_new_password.issuer_event_id", FT_UINT32, BASE_HEX, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_request_new_password_implementation_date,
{ "Implementation Date/Time", "zbee_zcl_se.device_management.request_new_password.implementation_date", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_request_new_password_duration_in_minutes,
{ "Duration in minutes", "zbee_zcl_se.device_management.request_new_password.duration_in_minutes", FT_UINT16, BASE_DEC, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_request_new_password_password,
{ "Password", "zbee_zcl_se.device_management.request_new_password.password", FT_UINT_STRING, BASE_NONE, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_update_site_id_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.device_management.update_site_id.issuer_event_id", FT_UINT32, BASE_HEX, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_update_site_id_site_id_time,
{ "SiteID Time", "zbee_zcl_se.device_management.update_site_id.site_id_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_update_site_id_provider_id,
{ "Provider ID", "zbee_zcl_se.device_management.update_site_id.provider_id", FT_UINT32, BASE_HEX, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_update_site_id_site_id,
{ "SiteID", "zbee_zcl_se.device_management.update_site_id.site_id", FT_UINT_STRING, BASE_NONE, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_get_event_configuration_event_id,
{ "Event ID", "zbee_zcl_se.device_management.get_event_configuration.event_id", FT_UINT16, BASE_HEX, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_update_cin_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.device_management.update_cin.issuer_event_id", FT_UINT32, BASE_HEX, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_update_cin_cin_implementation_time,
{ "CIN Implementation Time", "zbee_zcl_se.device_management.update_cin.cin_implementation_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_update_cin_provider_id,
{ "Provider ID", "zbee_zcl_se.device_management.update_cin.provider_id", FT_UINT32, BASE_HEX, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_update_cin_customerid_number,
{ "CustomerID Number", "zbee_zcl_se.device_management.update_cin.customerid_number", FT_UINT_STRING, BASE_NONE, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_set_event_configuration_issuer_event_id,
{ "Issuer Event ID", "zbee_zcl_se.device_management.set_event_configuration.issuer_event_id", FT_UINT32, BASE_HEX, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_set_event_configuration_start_time,
{ "Start Date/Time", "zbee_zcl_se.device_management.set_event_configuration.start_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_set_event_configuration_configuration_control,
{ "Configuration Control", "zbee_zcl_se.device_management.set_event_configuration.configuration_control", FT_UINT8, BASE_HEX, VALS(zbee_zcl_device_management_configuration_controls),
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_set_event_configuration_event_configuration_number_of_events,
{ "Number of Events", "zbee_zcl_se.device_management.set_event_configuration.event_configuration.number_of_events", FT_UINT8, BASE_DEC, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_set_event_configuration_event_configuration_event_id,
{ "Event ID", "zbee_zcl_se.device_management.set_event_configuration.event_configuration.event_id", FT_UINT16, BASE_DEC, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_set_event_configuration_event_configuration_event_group_id,
{ "Event Group ID", "zbee_zcl_se.device_management.set_event_configuration.event_configuration.event_group_id", FT_UINT16, BASE_DEC, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_set_event_configuration_event_configuration_event_log_id,
{ "Log ID", "zbee_zcl_se.device_management.set_event_configuration.event_configuration.log_id", FT_UINT8, BASE_DEC, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_device_management_set_event_configuration_event_configuration_event_configuration_value_match,
{ "Configuration Value Match", "zbee_zcl_se.device_management.set_event_configuration.event_configuration.configuration_value_match", FT_UINT8, BASE_DEC, NULL,
0x0, NULL, HFILL } },
};
/* ZCL Device Management subtrees */
gint *ett[] = {
&ett_zbee_zcl_device_management,
&ett_zbee_zcl_device_management_event_configuration_payload,
&ett_zbee_zcl_device_management_event_configuration,
&ett_zbee_zcl_device_management_proposed_tenancy_change_control
};
/* Register the ZigBee ZCL Device Management cluster protocol name and description */
proto_zbee_zcl_device_management = proto_register_protocol("ZigBee ZCL Device Management", "ZCL Device Management", ZBEE_PROTOABBREV_ZCL_DEVICE_MANAGEMENT);
proto_register_field_array(proto_zbee_zcl_device_management, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
/* Register the ZigBee ZCL Device Management dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_DEVICE_MANAGEMENT, dissect_zbee_zcl_device_management, proto_zbee_zcl_device_management);
} /*proto_register_zbee_zcl_device_management*/
/**
*Hands off the ZCL Device Management dissector.
*
*/
void
proto_reg_handoff_zbee_zcl_device_management(void)
{
zbee_zcl_init_cluster( ZBEE_PROTOABBREV_ZCL_DEVICE_MANAGEMENT,
proto_zbee_zcl_device_management,
ett_zbee_zcl_device_management,
ZBEE_ZCL_CID_DEVICE_MANAGEMENT,
ZBEE_MFG_CODE_NONE,
hf_zbee_zcl_device_management_attr_server_id,
hf_zbee_zcl_device_management_attr_client_id,
hf_zbee_zcl_device_management_srv_rx_cmd_id,
hf_zbee_zcl_device_management_srv_tx_cmd_id,
(zbee_zcl_fn_attr_data)dissect_zcl_device_management_attr_data
);
} /*proto_reg_handoff_zbee_zcl_device_management*/
/* ########################################################################## */
/* #### (0x0709) EVENTS CLUSTER ############################################# */
/* ########################################################################## */
/* Attributes - None */
/* Server Commands Received */
#define zbee_zcl_events_srv_rx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_EVENTS_GET_EVENT_LOG, 0x00, "Get Event Log" ) \
XXX(ZBEE_ZCL_CMD_ID_EVENTS_CLEAR_EVENT_LOG_REQUEST, 0x01, "Clear Event Log Request" )
VALUE_STRING_ENUM(zbee_zcl_events_srv_rx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_events_srv_rx_cmd_names);
/* Server Commands Generated */
#define zbee_zcl_events_srv_tx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_EVENTS_PUBLISH_EVENT, 0x00, "Publish Event" ) \
XXX(ZBEE_ZCL_CMD_ID_EVENTS_PUBLISH_EVENT_LOG, 0x01, "Publish Event Log" ) \
XXX(ZBEE_ZCL_CMD_ID_EVENTS_CLEAR_EVENT_LOG_RESPONSE, 0x02, "Clear Event Log Response" )
VALUE_STRING_ENUM(zbee_zcl_events_srv_tx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_events_srv_tx_cmd_names);
/*************************/
/* Function Declarations */
/*************************/
void proto_register_zbee_zcl_events(void);
void proto_reg_handoff_zbee_zcl_events(void);
/* Command Dissector Helpers */
static void dissect_zcl_events_get_event_log (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_events_clear_event_log_request (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_events_publish_event (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_events_publish_event_log (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_events_clear_event_log_response (tvbuff_t *tvb, proto_tree *tree, guint *offset);
/*************************/
/* Global Variables */
/*************************/
/* Initialize the protocol and registered fields */
static int proto_zbee_zcl_events = -1;
static int hf_zbee_zcl_events_srv_tx_cmd_id = -1;
static int hf_zbee_zcl_events_srv_rx_cmd_id = -1;
static int hf_zbee_zcl_events_get_event_log_event_control_log_id = -1;
static int hf_zbee_zcl_events_get_event_log_event_id = -1;
static int hf_zbee_zcl_events_get_event_log_start_time = -1;
static int hf_zbee_zcl_events_get_event_log_end_time = -1;
static int hf_zbee_zcl_events_get_event_log_number_of_events = -1;
static int hf_zbee_zcl_events_get_event_log_event_offset = -1;
static int hf_zbee_zcl_events_clear_event_log_request_log_id = -1;
static int hf_zbee_zcl_events_publish_event_log_id = -1;
static int hf_zbee_zcl_events_publish_event_event_id = -1;
static int hf_zbee_zcl_events_publish_event_event_time = -1;
static int hf_zbee_zcl_events_publish_event_event_control = -1;
static int hf_zbee_zcl_events_publish_event_event_data = -1;
static int hf_zbee_zcl_events_publish_event_log_total_number_of_matching_events = -1;
static int hf_zbee_zcl_events_publish_event_log_command_index = -1;
static int hf_zbee_zcl_events_publish_event_log_total_commands = -1;
static int hf_zbee_zcl_events_publish_event_log_number_of_events_log_payload_control = -1;
static int hf_zbee_zcl_events_publish_event_log_log_id = -1;
static int hf_zbee_zcl_events_publish_event_log_event_id = -1;
static int hf_zbee_zcl_events_publish_event_log_event_time = -1;
static int hf_zbee_zcl_events_publish_event_log_event_data = -1;
static int hf_zbee_zcl_events_clear_event_log_response_cleared_event_logs = -1;
/* Initialize the subtree pointers */
#define ZBEE_ZCL_SE_EVENTS_NUM_INDIVIDUAL_ETT 1
#define ZBEE_ZCL_SE_EVENTS_NUM_PUBLISH_EVENT_LOG_ETT 100 // The Great Britain Companion Specification (GBCS) allows up to 100 even though ZigBee only allows 15
#define ZBEE_ZCL_SE_EVENTS_NUM_TOTAL_ETT (ZBEE_ZCL_SE_EVENTS_NUM_INDIVIDUAL_ETT + ZBEE_ZCL_SE_EVENTS_NUM_PUBLISH_EVENT_LOG_ETT)
static gint ett_zbee_zcl_events = -1;
static gint ett_zbee_zcl_events_publish_event_log_entry[ZBEE_ZCL_SE_EVENTS_NUM_PUBLISH_EVENT_LOG_ETT];
/*************************/
/* Function Bodies */
/*************************/
/**
*ZigBee ZCL Events cluster dissector for wireshark.
*
*@param tvb pointer to buffer containing raw packet.
*@param pinfo pointer to packet information fields
*@param tree pointer to data tree Wireshark uses to display packet.
*/
static int
dissect_zbee_zcl_events(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
proto_tree *payload_tree;
zbee_zcl_packet *zcl;
guint offset = 0;
guint8 cmd_id;
gint rem_len;
/* Reject the packet if data is NULL */
if (data == NULL)
return 0;
zcl = (zbee_zcl_packet *)data;
cmd_id = zcl->cmd_id;
/* Create a subtree for the ZCL Command frame, and add the command ID to it. */
if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_events_srv_rx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_events_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_events, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_EVENTS_GET_EVENT_LOG:
dissect_zcl_events_get_event_log(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_EVENTS_CLEAR_EVENT_LOG_REQUEST:
dissect_zcl_events_clear_event_log_request(tvb, payload_tree, &offset);
break;
default:
break;
}
}
}
else { /* ZBEE_ZCL_FCF_TO_CLIENT */
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_events_srv_tx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_events_srv_tx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_events, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_EVENTS_PUBLISH_EVENT:
dissect_zcl_events_publish_event(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_EVENTS_PUBLISH_EVENT_LOG:
dissect_zcl_events_publish_event_log(tvb, payload_tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_EVENTS_CLEAR_EVENT_LOG_RESPONSE:
dissect_zcl_events_clear_event_log_response(tvb, payload_tree, &offset);
break;
default:
break;
}
}
}
return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_events*/
/**
*This function manages the Get Event Log payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_events_get_event_log(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t start_time;
nstime_t end_time;
/* Event Control / Log ID */
proto_tree_add_item(tree, hf_zbee_zcl_events_get_event_log_event_control_log_id, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_events_get_event_log_event_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Start Time */
start_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
start_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_events_get_event_log_start_time, tvb, *offset, 4, &start_time);
*offset += 4;
/* End Time */
end_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
end_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_events_get_event_log_end_time, tvb, *offset, 4, &end_time);
*offset += 4;
/* Number of Events */
proto_tree_add_item(tree, hf_zbee_zcl_events_get_event_log_number_of_events, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Event Offset */
proto_tree_add_item(tree, hf_zbee_zcl_events_get_event_log_event_offset, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
} /*dissect_zcl_events_get_event_log*/
/**
*This function manages the Clear Event Log Request payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_events_clear_event_log_request(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Log ID */
proto_tree_add_item(tree, hf_zbee_zcl_events_clear_event_log_request_log_id, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_events_clear_event_log_request*/
/**
*This function manages the Publish Event payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_events_publish_event(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t event_time;
gint length;
if (gPREF_zbee_se_protocol_version >= ZBEE_SE_VERSION_1_2) {
/* Log ID - Introduced from ZCL version 1.2 */
proto_tree_add_item(tree, hf_zbee_zcl_events_publish_event_log_id, tvb, *offset, 1, ENC_NA);
*offset += 1;
}
/* Event ID */
proto_tree_add_item(tree, hf_zbee_zcl_events_publish_event_event_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Event Time */
event_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
event_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_events_publish_event_event_time, tvb, *offset, 4, &event_time);
*offset += 4;
/* Event Control */
proto_tree_add_item(tree, hf_zbee_zcl_events_publish_event_event_control, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Event Data */
proto_tree_add_item_ret_length(tree, hf_zbee_zcl_events_publish_event_event_data, tvb, *offset, 1, ENC_NA|ENC_ZIGBEE, &length);
*offset += length;
} /*dissect_zcl_events_publish_event*/
/**
*This function manages the Publish Event Log payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_events_publish_event_log(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
proto_tree* event_log_tree;
nstime_t event_time;
int length;
/* Total Number of Matching Events */
proto_tree_add_item(tree, hf_zbee_zcl_events_publish_event_log_total_number_of_matching_events, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Command Index */
proto_tree_add_item(tree, hf_zbee_zcl_events_publish_event_log_command_index, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Total Commands */
proto_tree_add_item(tree, hf_zbee_zcl_events_publish_event_log_total_commands, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Number of Events / Log Payload Control */
proto_tree_add_item(tree, hf_zbee_zcl_events_publish_event_log_number_of_events_log_payload_control, tvb, *offset, 1, ENC_NA);
*offset += 1;
for (gint i = 0; tvb_reported_length_remaining(tvb, *offset) > 0 && i < ZBEE_ZCL_SE_EVENTS_NUM_PUBLISH_EVENT_LOG_ETT; i++) {
/* Add subtree */
event_log_tree = proto_tree_add_subtree_format(tree, tvb, *offset, 0, ett_zbee_zcl_events_publish_event_log_entry[i], NULL, "Event Log %d", i + 1);
if (gPREF_zbee_se_protocol_version >= ZBEE_SE_VERSION_1_2) {
/* Log ID - Introduced from ZCL version 1.2 */
proto_tree_add_item(event_log_tree, hf_zbee_zcl_events_publish_event_log_log_id, tvb, *offset, 1, ENC_NA);
*offset += 1;
}
/* Event ID */
proto_item_append_text(event_log_tree, ", Event ID: 0x%04x", tvb_get_guint16(tvb, *offset, ENC_LITTLE_ENDIAN));
proto_tree_add_item(event_log_tree, hf_zbee_zcl_events_publish_event_log_event_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
/* Event Time */
event_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
event_time.nsecs = 0;
proto_tree_add_time(event_log_tree, hf_zbee_zcl_events_publish_event_log_event_time, tvb, *offset, 4, &event_time);
*offset += 4;
/* Event Data */
proto_tree_add_item_ret_length(event_log_tree, hf_zbee_zcl_events_publish_event_log_event_data, tvb, *offset, 1, ENC_NA|ENC_ZIGBEE, &length);
*offset += length;
/* Set length of subtree */
proto_item_set_end(proto_tree_get_parent(event_log_tree), tvb, *offset);
}
} /*dissect_zcl_events_publish_event_log*/
/**
*This function manages the Clear Event Log Response payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_events_clear_event_log_response(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Cleared Event Logs */
proto_tree_add_item(tree, hf_zbee_zcl_events_clear_event_log_response_cleared_event_logs, tvb, *offset, 1, ENC_NA);
*offset += 1;
} /*dissect_zcl_events_clear_event_log_response*/
/**
*This function registers the ZCL Events dissector
*
*/
void
proto_register_zbee_zcl_events(void)
{
static hf_register_info hf[] = {
{ &hf_zbee_zcl_events_srv_tx_cmd_id,
{ "Command", "zbee_zcl_se.events.cmd.srv_tx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_events_srv_tx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_srv_rx_cmd_id,
{ "Command", "zbee_zcl_se.events.cmd.srv_rx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_events_srv_rx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_get_event_log_event_control_log_id,
{ "Event Control / Log ID", "zbee_zcl_se.events.get_event_log.event_control_log_id", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_get_event_log_event_id,
{ "Event ID", "zbee_zcl_se.events.get_event_log.event_id", FT_UINT16, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_get_event_log_start_time,
{ "Start Time", "zbee_zcl_se.events.get_event_log.start_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_get_event_log_end_time,
{ "End Time", "zbee_zcl_se.events.get_event_log.end_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_get_event_log_number_of_events,
{ "Number of Events", "zbee_zcl_se.events.get_event_log.number_of_events", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_get_event_log_event_offset,
{ "Event Offset", "zbee_zcl_se.events.get_event_log.event_offset", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_clear_event_log_request_log_id,
{ "Log ID", "zbee_zcl_se.events.clear_event_log_request.log_id", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_publish_event_log_id,
{ "Log ID", "zbee_zcl_se.events.publish_event.log_id", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_publish_event_event_id,
{ "Event ID", "zbee_zcl_se.events.publish_event.event_id", FT_UINT16, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_publish_event_event_time,
{ "Event Time", "zbee_zcl_se.events.publish_event.event_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_publish_event_event_control,
{ "Event Control", "zbee_zcl_se.events.publish_event.event_control", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_publish_event_event_data,
{ "Event Data", "zbee_zcl_se.events.publish_event.event_data", FT_UINT_BYTES, SEP_COLON, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_publish_event_log_total_number_of_matching_events,
{ "Total Number of Matching Events", "zbee_zcl_se.events.publish_event_log.event_id", FT_UINT16, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_publish_event_log_command_index,
{ "Command Index", "zbee_zcl_se.events.publish_event_log.command_index", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_publish_event_log_total_commands,
{ "Total Commands", "zbee_zcl_se.events.publish_event_log.total_commands", FT_UINT8, BASE_DEC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_publish_event_log_number_of_events_log_payload_control,
{ "Number of Events / Log Payload Control", "zbee_zcl_se.events.publish_event_log.number_of_events_log_payload_control", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_publish_event_log_log_id,
{ "Log ID", "zbee_zcl_se.events.publish_event_log.log_id", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_publish_event_log_event_id,
{ "Event ID", "zbee_zcl_se.events.publish_event_log.event_id", FT_UINT16, BASE_HEX, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_publish_event_log_event_time,
{ "Event Time", "zbee_zcl_se.events.publish_event_log.event_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_publish_event_log_event_data,
{ "Event Data", "zbee_zcl_se.events.publish_event_log.event_data", FT_UINT_BYTES, SEP_COLON, NULL,
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_events_clear_event_log_response_cleared_event_logs,
{ "Cleared Event Logs", "zbee_zcl_se.events.clear_event_log_response.cleared_event_logs", FT_UINT8, BASE_HEX, NULL,
0x00, NULL, HFILL } },
};
/* ZCL Events subtrees */
gint *ett[ZBEE_ZCL_SE_EVENTS_NUM_TOTAL_ETT];
ett[0] = &ett_zbee_zcl_events;
guint j = ZBEE_ZCL_SE_EVENTS_NUM_INDIVIDUAL_ETT;
/* Initialize Publish Event Log subtrees */
for (guint i = 0; i < ZBEE_ZCL_SE_EVENTS_NUM_PUBLISH_EVENT_LOG_ETT; i++, j++) {
ett_zbee_zcl_events_publish_event_log_entry[i] = -1;
ett[j] = &ett_zbee_zcl_events_publish_event_log_entry[i];
}
/* Register the ZigBee ZCL Events cluster protocol name and description */
proto_zbee_zcl_events = proto_register_protocol("ZigBee ZCL Events", "ZCL Events", ZBEE_PROTOABBREV_ZCL_EVENTS);
proto_register_field_array(proto_zbee_zcl_events, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
/* Register the ZigBee ZCL Events dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_EVENTS, dissect_zbee_zcl_events, proto_zbee_zcl_events);
} /*proto_register_zbee_zcl_events*/
/**
*Hands off the ZCL Events dissector.
*
*/
void
proto_reg_handoff_zbee_zcl_events(void)
{
zbee_zcl_init_cluster( ZBEE_PROTOABBREV_ZCL_EVENTS,
proto_zbee_zcl_events,
ett_zbee_zcl_events,
ZBEE_ZCL_CID_EVENTS,
ZBEE_MFG_CODE_NONE,
-1, -1,
hf_zbee_zcl_events_srv_rx_cmd_id,
hf_zbee_zcl_events_srv_tx_cmd_id,
NULL
);
} /*proto_reg_handoff_zbee_zcl_events*/
/* ########################################################################## */
/* #### (0x070A) MDU PAIRING CLUSTER ############################################ */
/* ########################################################################## */
/* Attributes - None */
/* Server Commands Received */
#define zbee_zcl_mdu_pairing_srv_rx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_MDU_PAIRING_REQUEST, 0x00, "Pairing Request" )
VALUE_STRING_ENUM(zbee_zcl_mdu_pairing_srv_rx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_mdu_pairing_srv_rx_cmd_names);
/* Server Commands Generated */
#define zbee_zcl_mdu_pairing_srv_tx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_MDU_PAIRING_RESPONSE, 0x00, "Pairing Response" )
VALUE_STRING_ENUM(zbee_zcl_mdu_pairing_srv_tx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_mdu_pairing_srv_tx_cmd_names);
/*************************/
/* Function Declarations */
/*************************/
void proto_register_zbee_zcl_mdu_pairing(void);
void proto_reg_handoff_zbee_zcl_mdu_pairing(void);
/* Command Dissector Helpers */
static void dissect_zcl_mdu_pairing_request (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_mdu_pairing_response(tvbuff_t *tvb, proto_tree *tree, guint *offset);
/*************************/
/* Global Variables */
/*************************/
/* Initialize the protocol and registered fields */
static int proto_zbee_zcl_mdu_pairing = -1;
static int hf_zbee_zcl_mdu_pairing_srv_tx_cmd_id = -1;
static int hf_zbee_zcl_mdu_pairing_srv_rx_cmd_id = -1;
static int hf_zbee_zcl_mdu_pairing_info_version = -1;
static int hf_zbee_zcl_mdu_pairing_total_devices_number = -1;
static int hf_zbee_zcl_mdu_pairing_cmd_id = -1;
static int hf_zbee_zcl_mdu_pairing_total_commands_number = -1;
static int hf_zbee_zcl_mdu_pairing_device_eui64 = -1;
static int hf_zbee_zcl_mdu_pairing_local_info_version = -1;
static int hf_zbee_zcl_mdu_pairing_requesting_device_eui64 = -1;
/* Initialize the subtree pointers */
static gint ett_zbee_zcl_mdu_pairing = -1;
/*************************/
/* Function Bodies */
/*************************/
/**
*ZigBee ZCL MDU Pairing cluster dissector for wireshark.
*
*@param tvb pointer to buffer containing raw packet.
*@param pinfo pointer to packet information fields
*@param tree pointer to data tree Wireshark uses to display packet.
*/
static int
dissect_zbee_zcl_mdu_pairing(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
proto_tree *payload_tree;
zbee_zcl_packet *zcl;
guint offset = 0;
guint8 cmd_id;
gint rem_len;
/* Reject the packet if data is NULL */
if (data == NULL)
return 0;
zcl = (zbee_zcl_packet *)data;
cmd_id = zcl->cmd_id;
/* Create a subtree for the ZCL Command frame, and add the command ID to it. */
if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_mdu_pairing_srv_rx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_mdu_pairing_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_mdu_pairing, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_MDU_PAIRING_REQUEST:
dissect_zcl_mdu_pairing_request(tvb, payload_tree, &offset);
break;
default:
break;
}
}
}
else { /* ZBEE_ZCL_FCF_TO_CLIENT */
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_mdu_pairing_srv_tx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_mdu_pairing_srv_tx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_mdu_pairing, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_MDU_PAIRING_RESPONSE:
dissect_zcl_mdu_pairing_response(tvb, payload_tree, &offset);
break;
default:
break;
}
}
}
return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_mdu_pairing*/
/**
*This function manages the Pairing Request payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_mdu_pairing_request(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* Local pairing information version */
proto_tree_add_item(tree, hf_zbee_zcl_mdu_pairing_local_info_version, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* EUI64 of Requesting Device */
proto_tree_add_item(tree, hf_zbee_zcl_mdu_pairing_requesting_device_eui64, tvb, *offset, 8, ENC_LITTLE_ENDIAN);
*offset += 8;
} /*dissect_zcl_mdu_pairing_request*/
/**
*This function manages the Pairing Response payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_mdu_pairing_response(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
guint8 devices_num;
/* Pairing information version */
proto_tree_add_item(tree, hf_zbee_zcl_mdu_pairing_info_version, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
/* Total Number of Devices */
devices_num = tvb_get_guint8(tvb, *offset);
proto_tree_add_item(tree, hf_zbee_zcl_mdu_pairing_total_devices_number, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Command index */
proto_tree_add_item(tree, hf_zbee_zcl_mdu_pairing_cmd_id, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Total Number of Commands */
proto_tree_add_item(tree, hf_zbee_zcl_mdu_pairing_total_commands_number, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* EUI64 of Devices */
for (gint i = 0; tvb_reported_length_remaining(tvb, *offset) >= 8 && i < devices_num; i++) {
/* EUI64 of Device i */
proto_tree_add_item(tree, hf_zbee_zcl_mdu_pairing_device_eui64, tvb, *offset, 8, ENC_LITTLE_ENDIAN);
*offset += 8;
}
} /*dissect_zcl_mdu_pairing_response*/
/**
*This function registers the ZCL MDU Pairing dissector
*
*/
void
proto_register_zbee_zcl_mdu_pairing(void)
{
static hf_register_info hf[] = {
{ &hf_zbee_zcl_mdu_pairing_srv_tx_cmd_id,
{ "Command", "zbee_zcl_se.mdu_pairing.cmd.srv_tx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_mdu_pairing_srv_tx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_mdu_pairing_srv_rx_cmd_id,
{ "Command", "zbee_zcl_se.mdu_pairing.cmd.srv_rx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_mdu_pairing_srv_rx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_mdu_pairing_info_version,
{ "Pairing information version", "zbee_zcl_se.mdu_pairing.info_version", FT_UINT32, BASE_DEC, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_mdu_pairing_total_devices_number,
{ "Total Number of Devices", "zbee_zcl_se.mdu_pairing.total_devices_number", FT_UINT8, BASE_DEC, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_mdu_pairing_cmd_id,
{ "Command Index", "zbee_zcl_se.mdu_pairing.command_index", FT_UINT8, BASE_HEX, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_mdu_pairing_total_commands_number,
{ "Total Number of Commands", "zbee_zcl_se.mdu_pairing.total_commands_number", FT_UINT8, BASE_DEC, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_mdu_pairing_device_eui64,
{ "Device EUI64", "zbee_zcl_se.mdu_pairing.device_eui64", FT_EUI64, BASE_NONE, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_mdu_pairing_local_info_version,
{ "Local Pairing Information Version", "zbee_zcl_se.mdu_pairing.local_info_version", FT_UINT32, BASE_DEC, NULL,
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_mdu_pairing_requesting_device_eui64,
{ "EUI64 of Requesting Device", "zbee_zcl_se.mdu_pairing.requesting_device_eui64", FT_EUI64, BASE_NONE, NULL,
0x0, NULL, HFILL } },
};
/* ZCL MDU Pairing subtrees */
gint *ett[] = {
&ett_zbee_zcl_mdu_pairing
};
/* Register the ZigBee ZCL MDU Pairing cluster protocol name and description */
proto_zbee_zcl_mdu_pairing = proto_register_protocol("ZigBee ZCL MDU Pairing", "ZCL MDU Pairing", ZBEE_PROTOABBREV_ZCL_MDU_PAIRING);
proto_register_field_array(proto_zbee_zcl_mdu_pairing, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
/* Register the ZigBee ZCL MDU Pairing dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_MDU_PAIRING, dissect_zbee_zcl_mdu_pairing, proto_zbee_zcl_mdu_pairing);
} /*proto_register_zbee_zcl_mdu_pairing*/
/**
*Hands off the ZCL MDU Pairing dissector.
*
*/
void
proto_reg_handoff_zbee_zcl_mdu_pairing(void)
{
zbee_zcl_init_cluster( ZBEE_PROTOABBREV_ZCL_MDU_PAIRING,
proto_zbee_zcl_mdu_pairing,
ett_zbee_zcl_mdu_pairing,
ZBEE_ZCL_CID_MDU_PAIRING,
ZBEE_MFG_CODE_NONE,
-1, -1,
hf_zbee_zcl_mdu_pairing_srv_rx_cmd_id,
hf_zbee_zcl_mdu_pairing_srv_tx_cmd_id,
NULL
);
} /*proto_reg_handoff_zbee_zcl_mdu_pairing*/
/* ########################################################################## */
/* #### (0x070B) SUB-GHZ CLUSTER ############################################ */
/* ########################################################################## */
/* Attributes */
#define zbee_zcl_sub_ghz_attr_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_ATTR_ID_SUB_GHZ_CHANNEL_CHANGE, 0x0000, "Channel Change" ) \
XXX(ZBEE_ZCL_ATTR_ID_SUB_GHZ_PAGE_28_CHANNEL_MASK, 0x0001, "Page 28 Channel Mask" ) \
XXX(ZBEE_ZCL_ATTR_ID_SUB_GHZ_PAGE_29_CHANNEL_MASK, 0x0002, "Page 29 Channel Mask" ) \
XXX(ZBEE_ZCL_ATTR_ID_SUB_GHZ_PAGE_30_CHANNEL_MASK, 0x0003, "Page 30 Channel Mask" ) \
XXX(ZBEE_ZCL_ATTR_ID_SUB_GHZ_PAGE_31_CHANNEL_MASK, 0x0004, "Page 31 Channel Mask" ) \
XXX(ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_SUB_GHZ, 0xFFFE, "Attribute Reporting Status" )
VALUE_STRING_ENUM(zbee_zcl_sub_ghz_attr_names);
VALUE_STRING_ARRAY(zbee_zcl_sub_ghz_attr_names);
/* Server Commands Received */
#define zbee_zcl_sub_ghz_srv_rx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_SUB_GHZ_GET_SUSPEND_ZCL_MESSAGES_STATUS, 0x00, "Get Suspend ZCL Messages Status" )
VALUE_STRING_ENUM(zbee_zcl_sub_ghz_srv_rx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_sub_ghz_srv_rx_cmd_names);
/* Server Commands Generated */
#define zbee_zcl_sub_ghz_srv_tx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_SUB_GHZ_SUSPEND_ZCL_MESSAGES, 0x00, "Suspend ZCL Messages" )
VALUE_STRING_ENUM(zbee_zcl_sub_ghz_srv_tx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_sub_ghz_srv_tx_cmd_names);
/*************************/
/* Function Declarations */
/*************************/
void proto_register_zbee_zcl_sub_ghz(void);
void proto_reg_handoff_zbee_zcl_sub_ghz(void);
/* Attribute Dissector Helpers */
static void dissect_zcl_sub_ghz_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr);
/* Command Dissector Helpers */
static void dissect_zcl_sub_ghz_suspend_zcl_messages(tvbuff_t *tvb, proto_tree *tree, guint *offset);
/*************************/
/* Global Variables */
/*************************/
/* Initialize the protocol and registered fields */
static int proto_zbee_zcl_sub_ghz = -1;
static int hf_zbee_zcl_sub_ghz_srv_tx_cmd_id = -1;
static int hf_zbee_zcl_sub_ghz_srv_rx_cmd_id = -1;
static int hf_zbee_zcl_sub_ghz_attr_id = -1;
static int hf_zbee_zcl_sub_ghz_attr_reporting_status = -1;
static int hf_zbee_zcl_sub_ghz_zcl_messages_suspension_period = -1;
/* Initialize the subtree pointers */
static gint ett_zbee_zcl_sub_ghz = -1;
/*************************/
/* Function Bodies */
/*************************/
/**
*This function is called by ZCL foundation dissector in order to decode
*
*@param tree pointer to data tree Wireshark uses to display packet.
*@param tvb pointer to buffer containing raw packet.
*@param offset pointer to buffer offset
*@param attr_id attribute identifier
*@param data_type attribute data type
*@param client_attr ZCL client
*/
static void
dissect_zcl_sub_ghz_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr)
{
/* Dissect attribute data type and data */
switch (attr_id) {
/* applies to all SE clusters */
case ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS_SUB_GHZ:
proto_tree_add_item(tree, hf_zbee_zcl_sub_ghz_attr_reporting_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
break;
case ZBEE_ZCL_ATTR_ID_SUB_GHZ_CHANNEL_CHANGE:
case ZBEE_ZCL_ATTR_ID_SUB_GHZ_PAGE_28_CHANNEL_MASK:
case ZBEE_ZCL_ATTR_ID_SUB_GHZ_PAGE_29_CHANNEL_MASK:
case ZBEE_ZCL_ATTR_ID_SUB_GHZ_PAGE_30_CHANNEL_MASK:
case ZBEE_ZCL_ATTR_ID_SUB_GHZ_PAGE_31_CHANNEL_MASK:
default: /* Catch all */
dissect_zcl_attr_data(tvb, tree, offset, data_type, client_attr);
break;
}
} /*dissect_zcl_sub_ghz_attr_data*/
/**
*ZigBee ZCL Sub-Ghz cluster dissector for wireshark.
*
*@param tvb pointer to buffer containing raw packet.
*@param pinfo pointer to packet information fields
*@param tree pointer to data tree Wireshark uses to display packet.
*/
static int
dissect_zbee_zcl_sub_ghz(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
proto_tree *payload_tree;
zbee_zcl_packet *zcl;
guint offset = 0;
guint8 cmd_id;
gint rem_len;
/* Reject the packet if data is NULL */
if (data == NULL)
return 0;
zcl = (zbee_zcl_packet *)data;
cmd_id = zcl->cmd_id;
/* Create a subtree for the ZCL Command frame, and add the command ID to it. */
if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_sub_ghz_srv_rx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_sub_ghz_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
/* payload_tree = */proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_sub_ghz, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_SUB_GHZ_GET_SUSPEND_ZCL_MESSAGES_STATUS:
/* No Payload */
break;
default:
break;
}
}
}
else { /* ZBEE_ZCL_FCF_TO_CLIENT */
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_sub_ghz_srv_tx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_sub_ghz_srv_tx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_sub_ghz, NULL, "Payload");
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_SUB_GHZ_SUSPEND_ZCL_MESSAGES:
dissect_zcl_sub_ghz_suspend_zcl_messages(tvb, payload_tree, &offset);
break;
default:
break;
}
}
}
return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_sub_ghz*/
/**
*This function manages the Suspend ZCL Messages payload
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_sub_ghz_suspend_zcl_messages(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
/* (Optional) Suspension Period */
if (tvb_reported_length_remaining(tvb, *offset) > 0) {
proto_tree_add_item(tree, hf_zbee_zcl_sub_ghz_zcl_messages_suspension_period, tvb, *offset, 1, ENC_NA);
*offset += 1;
}
} /*dissect_zcl_sub_ghz_suspend_zcl_messages*/
/**
*This function registers the ZCL Sub-Ghz dissector
*
*/
void
proto_register_zbee_zcl_sub_ghz(void)
{
static hf_register_info hf[] = {
{ &hf_zbee_zcl_sub_ghz_attr_id,
{ "Attribute", "zbee_zcl_se.sub_ghz.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_sub_ghz_attr_names),
0x0, NULL, HFILL } },
{ &hf_zbee_zcl_sub_ghz_attr_reporting_status, /* common to all SE clusters */
{ "Attribute Reporting Status", "zbee_zcl_se.sub_ghz.attr.attr_reporting_status",
FT_UINT8, BASE_HEX, VALS(zbee_zcl_se_reporting_status_names), 0x00, NULL, HFILL } },
{ &hf_zbee_zcl_sub_ghz_srv_tx_cmd_id,
{ "Command", "zbee_zcl_se.sub_ghz.cmd.srv_tx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_sub_ghz_srv_tx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_sub_ghz_srv_rx_cmd_id,
{ "Command", "zbee_zcl_se.sub_ghz.cmd.srv_rx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_sub_ghz_srv_rx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_sub_ghz_zcl_messages_suspension_period,
{ "ZCL Messages Suspension Period", "zbee_zcl_se.sub_ghz.zcl_messages_suspension_period", FT_UINT8, BASE_DEC, NULL,
0x0, NULL, HFILL } },
};
/* ZCL Sub-Ghz subtrees */
gint *ett[] = {
&ett_zbee_zcl_sub_ghz
};
/* Register the ZigBee ZCL Sub-Ghz cluster protocol name and description */
proto_zbee_zcl_sub_ghz = proto_register_protocol("ZigBee ZCL Sub-Ghz", "ZCL Sub-Ghz", ZBEE_PROTOABBREV_ZCL_SUB_GHZ);
proto_register_field_array(proto_zbee_zcl_sub_ghz, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
/* Register the ZigBee ZCL Sub-Ghz dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_SUB_GHZ, dissect_zbee_zcl_sub_ghz, proto_zbee_zcl_sub_ghz);
} /*proto_register_zbee_zcl_sub_ghz*/
/**
*Hands off the ZCL Sub-Ghz dissector.
*
*/
void
proto_reg_handoff_zbee_zcl_sub_ghz(void)
{
zbee_zcl_init_cluster( ZBEE_PROTOABBREV_ZCL_SUB_GHZ,
proto_zbee_zcl_sub_ghz,
ett_zbee_zcl_sub_ghz,
ZBEE_ZCL_CID_SUB_GHZ,
ZBEE_MFG_CODE_NONE,
hf_zbee_zcl_sub_ghz_attr_id,
-1,
hf_zbee_zcl_sub_ghz_srv_rx_cmd_id,
hf_zbee_zcl_sub_ghz_srv_tx_cmd_id,
(zbee_zcl_fn_attr_data)dissect_zcl_sub_ghz_attr_data
);
} /*proto_reg_handoff_zbee_zcl_sub_ghz*/
/* ########################################################################## */
/* #### (0x0800) KEY ESTABLISHMENT ########################################## */
/* ########################################################################## */
/*************************/
/* Defines */
/*************************/
#define ZBEE_ZCL_KE_USAGE_KEY_AGREEMENT 0x08
#define ZBEE_ZCL_KE_USAGE_DIGITAL_SIGNATURE 0x80
/* Attributes */
#define zbee_zcl_ke_attr_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_ATTR_ID_KE_SUITE, 0x0000, "Supported Key Establishment Suites" )
VALUE_STRING_ARRAY(zbee_zcl_ke_attr_names);
/* Server Commands Received */
#define zbee_zcl_ke_srv_rx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_KE_INITIATE_REQ, 0x00, "Initiate Key Establishment Request" ) \
XXX(ZBEE_ZCL_CMD_ID_KE_EPHEMERAL_REQ, 0x01, "Ephemeral Data Request" ) \
XXX(ZBEE_ZCL_CMD_ID_KE_CONFIRM_REQ, 0x02, "Confirm Key Data Request" ) \
XXX(ZBEE_ZCL_CMD_ID_KE_CLNT_TERMINATE, 0x03, "Terminate Key Establishment" )
VALUE_STRING_ENUM(zbee_zcl_ke_srv_rx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_ke_srv_rx_cmd_names);
/* Server Commands Generated */
#define zbee_zcl_ke_srv_tx_cmd_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_CMD_ID_KE_INITIATE_RSP, 0x00, "Initiate Key Establishment Response" ) \
XXX(ZBEE_ZCL_CMD_ID_KE_EPHEMERAL_RSP, 0x01, "Ephemeral Data Response" ) \
XXX(ZBEE_ZCL_CMD_ID_KE_CONFIRM_RSP, 0x02, "Confirm Key Data Response" ) \
XXX(ZBEE_ZCL_CMD_ID_KE_SRV_TERMINATE, 0x03, "Terminate Key Establishment" )
VALUE_STRING_ENUM(zbee_zcl_ke_srv_tx_cmd_names);
VALUE_STRING_ARRAY(zbee_zcl_ke_srv_tx_cmd_names);
/* Suite Names */
#define zbee_zcl_ke_suite_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_KE_SUITE_1, 0x0001, "Crypto Suite 1 (CBKE K163)" ) \
XXX(ZBEE_ZCL_KE_SUITE_2, 0x0002, "Crypto Suite 2 (CBKE K283)" )
VALUE_STRING_ENUM(zbee_zcl_ke_suite_names);
VALUE_STRING_ARRAY(zbee_zcl_ke_suite_names);
/* Crypto Suite 2 Type Names */
#define zbee_zcl_ke_type_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_KE_TYPE_NO_EXT, 0x00, "No Extensions" )
VALUE_STRING_ARRAY(zbee_zcl_ke_type_names);
/* Crypto Suite 2 Curve Names */
#define zbee_zcl_ke_curve_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_KE_CURVE_SECT283K1, 0x0D, "sect283k1" )
VALUE_STRING_ARRAY(zbee_zcl_ke_curve_names);
/* Crypto Suite 2 Hash Names */
#define zbee_zcl_ke_hash_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_KE_HASH_AES_MMO, 0x08, "AES MMO" )
VALUE_STRING_ARRAY(zbee_zcl_ke_hash_names);
#define zbee_zcl_ke_status_names_VALUE_STRING_LIST(XXX) \
XXX(ZBEE_ZCL_KE_STATUS_RESERVED, 0x00, "Reserved" ) \
XXX(ZBEE_ZCL_KE_STATUS_UNKNOWN_ISSUER, 0x01, "Unknown Issuer" ) \
XXX(ZBEE_ZCL_KE_STATUS_BAD_KEY_CONFIRM, 0x02, "Bad Key Confirm" ) \
XXX(ZBEE_ZCL_KE_STATUS_BAD_MESSAGE, 0x03, "Bad Message" ) \
XXX(ZBEE_ZCL_KE_STATUS_NO_RESOURCES, 0x04, "No Resources" ) \
XXX(ZBEE_ZCL_KE_STATUS_UNSUPPORTED_SUITE, 0x05, "Unsupported Suite" ) \
XXX(ZBEE_ZCL_KE_STATUS_INVALID_CERTIFICATE, 0x06, "Invalid Certificate" )
VALUE_STRING_ARRAY(zbee_zcl_ke_status_names);
/*************************/
/* Function Declarations */
/*************************/
void proto_register_zbee_zcl_ke(void);
void proto_reg_handoff_zbee_zcl_ke(void);
/* Private functions prototype */
/*************************/
/* Global Variables */
/*************************/
/* Initialize the protocol and registered fields */
static int proto_zbee_zcl_ke = -1;
static int hf_zbee_zcl_ke_srv_tx_cmd_id = -1;
static int hf_zbee_zcl_ke_srv_rx_cmd_id = -1;
static int hf_zbee_zcl_ke_attr_id = -1;
static int hf_zbee_zcl_ke_attr_client_id = -1;
static int hf_zbee_zcl_ke_suite = -1;
static int hf_zbee_zcl_ke_ephemeral_time = -1;
static int hf_zbee_zcl_ke_confirm_time = -1;
static int hf_zbee_zcl_ke_status = -1;
static int hf_zbee_zcl_ke_wait_time = -1;
static int hf_zbee_zcl_ke_cert_reconstr = -1;
static int hf_zbee_zcl_ke_cert_subject = -1;
static int hf_zbee_zcl_ke_cert_issuer = -1;
static int hf_zbee_zcl_ke_cert_profile_attr = -1;
static int hf_zbee_zcl_ke_cert_type = -1;
static int hf_zbee_zcl_ke_cert_serialno = -1;
static int hf_zbee_zcl_ke_cert_curve = -1;
static int hf_zbee_zcl_ke_cert_hash = -1;
static int hf_zbee_zcl_ke_cert_valid_from = -1;
static int hf_zbee_zcl_ke_cert_valid_to = -1;
static int hf_zbee_zcl_ke_cert_key_usage_agreement = -1;
static int hf_zbee_zcl_ke_cert_key_usage_signature = -1;
static int hf_zbee_zcl_ke_ephemeral_qeu = -1;
static int hf_zbee_zcl_ke_ephemeral_qev = -1;
static int hf_zbee_zcl_ke_macu = -1;
static int hf_zbee_zcl_ke_macv = -1;
/* Initialize the subtree pointers */
static gint ett_zbee_zcl_ke = -1;
static gint ett_zbee_zcl_ke_cert = -1;
static gint ett_zbee_zcl_ke_key_usage = -1;
/*************************/
/* Function Bodies */
/*************************/
/**
*This function dissects the Suite 1 Certificate
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_ke_suite1_certificate(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_reconstr, tvb, *offset, 22, ENC_NA);
*offset += 22;
proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_subject, tvb, *offset, 8, ENC_NA);
*offset += 8;
proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_issuer, tvb, *offset, 8, ENC_NA);
*offset += 8;
proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_profile_attr, tvb, *offset, 10, ENC_NA);
*offset += 10;
} /*dissect_zcl_ke_suite1_certificate*/
/**
*This function dissects the Suite 2 Certificate
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_ke_suite2_certificate(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
nstime_t valid_from_time;
nstime_t valid_to_time;
guint32 valid_to;
guint8 key_usage;
proto_tree *usage_tree;
proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_type, tvb, *offset, 1, ENC_NA);
*offset += 1;
proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_serialno, tvb, *offset, 8, ENC_NA);
*offset += 8;
proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_curve, tvb, *offset, 1, ENC_NA);
*offset += 1;
proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_hash, tvb, *offset, 1, ENC_NA);
*offset += 1;
proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_issuer, tvb, *offset, 8, ENC_NA);
*offset += 8;
valid_from_time.secs = (time_t)tvb_get_ntoh40(tvb, *offset);
valid_from_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_ke_cert_valid_from, tvb, *offset, 5, &valid_from_time);
*offset += 5;
valid_to = tvb_get_ntohl(tvb, *offset);
if (valid_to == 0xFFFFFFFF) {
proto_tree_add_time_format(tree, hf_zbee_zcl_ke_cert_valid_to, tvb, *offset, 4, &valid_to_time, "Valid To: does not expire (0xFFFFFFFF)");
}
else {
valid_to_time.secs = valid_from_time.secs + valid_to;
valid_to_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_ke_cert_valid_to, tvb, *offset, 4, &valid_to_time);
}
*offset += 4;
proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_subject, tvb, *offset, 8, ENC_NA);
*offset += 8;
key_usage = tvb_get_guint8(tvb, *offset);
usage_tree = proto_tree_add_subtree_format(tree, tvb, *offset, 1, ett_zbee_zcl_ke_key_usage, NULL, "Key Usage (0x%02x)", key_usage);
proto_tree_add_item(usage_tree, hf_zbee_zcl_ke_cert_key_usage_agreement, tvb, *offset, 1, ENC_NA);
proto_tree_add_item(usage_tree, hf_zbee_zcl_ke_cert_key_usage_signature, tvb, *offset, 1, ENC_NA);
*offset += 1;
proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_reconstr, tvb, *offset, 37, ENC_NA);
*offset += 37;
} /*dissect_zcl_ke_suite2_certificate*/
/**
*This function manages the Initiate Key Establishment message
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_ke_initiate(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
gint rem_len;
proto_tree *subtree;
guint16 suite;
suite = tvb_get_letohs(tvb, *offset);
proto_tree_add_item(tree, hf_zbee_zcl_ke_suite, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
proto_tree_add_item(tree, hf_zbee_zcl_ke_ephemeral_time, tvb, *offset, 1, ENC_NA);
*offset += 1;
proto_tree_add_item(tree, hf_zbee_zcl_ke_confirm_time, tvb, *offset, 1, ENC_NA);
*offset += 1;
rem_len = tvb_reported_length_remaining(tvb, *offset);
subtree = proto_tree_add_subtree(tree, tvb, *offset, rem_len, ett_zbee_zcl_ke_cert, NULL, "Implicit Certificate");
switch (suite) {
case ZBEE_ZCL_KE_SUITE_1:
dissect_zcl_ke_suite1_certificate(tvb, subtree, offset);
break;
case ZBEE_ZCL_KE_SUITE_2:
dissect_zcl_ke_suite2_certificate(tvb, subtree, offset);
break;
default:
break;
}
} /* dissect_zcl_ke_initiate */
/**
*This function dissects the Ephemeral Data QEU
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static int
dissect_zcl_ke_ephemeral_qeu(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
gint length;
/* size depends on suite but without a session we don't know that here */
/* so just report what we have */
length = tvb_reported_length_remaining(tvb, *offset);
proto_tree_add_item(tree, hf_zbee_zcl_ke_ephemeral_qeu, tvb, *offset, length, ENC_NA);
*offset += length;
return tvb_captured_length(tvb);
}
/**
*This function dissects the Ephemeral Data QEV
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static int
dissect_zcl_ke_ephemeral_qev(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
gint length;
/* size depends on suite but without a session we don't know that here */
/* so just report what we have */
length = tvb_reported_length_remaining(tvb, *offset);
proto_tree_add_item(tree, hf_zbee_zcl_ke_ephemeral_qev, tvb, *offset, length, ENC_NA);
*offset += length;
return tvb_captured_length(tvb);
}
/**
*This function dissects the Confirm MACU
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static int
dissect_zcl_ke_confirm_macu(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
proto_tree_add_item(tree, hf_zbee_zcl_ke_macu, tvb, *offset, ZBEE_SEC_CONST_BLOCKSIZE, ENC_NA);
*offset += ZBEE_SEC_CONST_BLOCKSIZE;
return tvb_captured_length(tvb);
}
/**
*This function dissects the Confirm MACV
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static int
dissect_zcl_ke_confirm_macv(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
proto_tree_add_item(tree, hf_zbee_zcl_ke_macv, tvb, *offset, ZBEE_SEC_CONST_BLOCKSIZE, ENC_NA);
*offset += ZBEE_SEC_CONST_BLOCKSIZE;
return tvb_captured_length(tvb);
}
/**
*This function dissects the Terminate Key Establishment message
*
*@param tvb pointer to buffer containing raw packet.
*@param tree pointer to data tree Wireshark uses to display packet.
*@param offset pointer to offset from caller
*/
static void
dissect_zcl_ke_terminate(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
proto_tree_add_item(tree, hf_zbee_zcl_ke_status, tvb, *offset, 1, ENC_NA);
*offset += 1;
proto_tree_add_item(tree, hf_zbee_zcl_ke_wait_time, tvb, *offset, 1, ENC_NA);
*offset += 1;
proto_tree_add_item(tree, hf_zbee_zcl_ke_suite, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
}
/**
*ZigBee ZCL Key Establishment cluster dissector for wireshark.
*
*@param tvb pointer to buffer containing raw packet.
*@param pinfo pointer to packet information fields
*@param tree pointer to data tree Wireshark uses to display packet.
*/
static int
dissect_zbee_zcl_ke(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
zbee_zcl_packet *zcl;
guint offset = 0;
guint8 cmd_id;
gint rem_len;
/* Reject the packet if data is NULL */
if (data == NULL)
return 0;
zcl = (zbee_zcl_packet *)data;
cmd_id = zcl->cmd_id;
/* Create a subtree for the ZCL Command frame, and add the command ID to it. */
if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_ke_srv_rx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_ke_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, offset);
offset += 1; /* delay from last add_item */
if (rem_len > 0) {
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_KE_INITIATE_REQ:
dissect_zcl_ke_initiate(tvb, tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_KE_EPHEMERAL_REQ:
return dissect_zcl_ke_ephemeral_qeu(tvb, tree, &offset);
case ZBEE_ZCL_CMD_ID_KE_CONFIRM_REQ:
return dissect_zcl_ke_confirm_macu(tvb, tree, &offset);
case ZBEE_ZCL_CMD_ID_KE_CLNT_TERMINATE:
dissect_zcl_ke_terminate(tvb, tree, &offset);
break;
default:
break;
}
}
}
else { /* ZBEE_ZCL_FCF_TO_CLIENT */
/* Append the command name to the info column. */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
val_to_str_const(cmd_id, zbee_zcl_ke_srv_tx_cmd_names, "Unknown Command"),
zcl->tran_seqno);
/* Add the command ID. */
proto_tree_add_uint(tree, hf_zbee_zcl_ke_srv_tx_cmd_id, tvb, offset, 1, cmd_id);
/* Check is this command has a payload, than add the payload tree */
rem_len = tvb_reported_length_remaining(tvb, ++offset);
if (rem_len > 0) {
/* Call the appropriate command dissector */
switch (cmd_id) {
case ZBEE_ZCL_CMD_ID_KE_INITIATE_RSP:
dissect_zcl_ke_initiate(tvb, tree, &offset);
break;
case ZBEE_ZCL_CMD_ID_KE_EPHEMERAL_RSP:
return dissect_zcl_ke_ephemeral_qev(tvb, tree, &offset);
case ZBEE_ZCL_CMD_ID_KE_CONFIRM_RSP:
return dissect_zcl_ke_confirm_macv(tvb, tree, &offset);
case ZBEE_ZCL_CMD_ID_KE_SRV_TERMINATE:
dissect_zcl_ke_terminate(tvb, tree, &offset);
break;
default:
break;
}
}
}
return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_ke*/
/**
*This function registers the ZCL Key Establishment dissector
*
*/
void
proto_register_zbee_zcl_ke(void)
{
static hf_register_info hf[] = {
{ &hf_zbee_zcl_ke_attr_id,
{ "Attribute", "zbee_zcl_se.ke.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_ke_attr_names),
0x00, NULL, HFILL } },
/* Server and client attributes are the same but should of cause be put in the correct field */
{ &hf_zbee_zcl_ke_attr_client_id,
{ "Attribute", "zbee_zcl_se.ke.attr_client_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_ke_attr_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_ke_srv_tx_cmd_id,
{ "Command", "zbee_zcl_se.ke.cmd.srv_tx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_ke_srv_tx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_ke_srv_rx_cmd_id,
{ "Command", "zbee_zcl_se.ke.cmd.srv_rx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_ke_srv_rx_cmd_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_ke_suite,
{ "Key Establishment Suite", "zbee_zcl_se.ke.attr.suite", FT_UINT16, BASE_HEX, VALS(zbee_zcl_ke_suite_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_ke_ephemeral_time,
{ "Ephemeral Data Generate Time", "zbee_zcl_se.ke.init.ephemeral.time", FT_UINT8, BASE_DEC, NULL,
0, NULL, HFILL } },
{ &hf_zbee_zcl_ke_confirm_time,
{ "Confirm Key Generate Time", "zbee_zcl_se.ke.init.confirm.time", FT_UINT8, BASE_DEC, NULL,
0, NULL, HFILL } },
{ &hf_zbee_zcl_ke_status,
{ "Status", "zbee_zcl_se.ke.terminate.status", FT_UINT8, BASE_HEX, VALS(zbee_zcl_ke_status_names),
0x00, NULL, HFILL } },
{ &hf_zbee_zcl_ke_wait_time,
{ "Wait Time", "zbee_zcl_se.ke.terminate.wait.time", FT_UINT8, BASE_DEC, NULL,
0, NULL, HFILL } },
{ &hf_zbee_zcl_ke_cert_reconstr,
{ "Public Key", "zbee_zcl_se.ke.cert.reconst", FT_BYTES, BASE_NONE, NULL,
0, NULL, HFILL } },
{ &hf_zbee_zcl_ke_cert_subject,
{ "Subject", "zbee_zcl_se.ke.cert.subject", FT_BYTES, BASE_NONE, NULL,
0, NULL, HFILL } },
{ &hf_zbee_zcl_ke_cert_issuer,
{ "Issuer", "zbee_zcl_se.ke.cert.issuer", FT_BYTES, BASE_NONE, NULL,
0, NULL, HFILL } },
{ &hf_zbee_zcl_ke_cert_profile_attr,
{ "Profile Attribute Data", "zbee_zcl_se.ke.cert.profile", FT_BYTES, BASE_NONE, NULL,
0, NULL, HFILL } },
{ &hf_zbee_zcl_ke_cert_type,
{ "Type", "zbee_zcl_se.ke.cert.type", FT_UINT8, BASE_HEX, VALS(zbee_zcl_ke_type_names),
0, NULL, HFILL } },
{ &hf_zbee_zcl_ke_cert_serialno,
{ "Serial No", "zbee_zcl_se.ke.cert.serialno", FT_UINT64, BASE_HEX, NULL,
0, NULL, HFILL } },
{ &hf_zbee_zcl_ke_cert_curve,
{ "Curve", "zbee_zcl_se.ke.cert.curve", FT_UINT8, BASE_HEX, VALS(zbee_zcl_ke_curve_names),
0, NULL, HFILL } },
{ &hf_zbee_zcl_ke_cert_hash,
{ "Hash", "zbee_zcl_se.ke.cert.hash", FT_UINT8, BASE_HEX, VALS(zbee_zcl_ke_hash_names),
0, NULL, HFILL } },
{ &hf_zbee_zcl_ke_cert_valid_from,
{ "Valid From", "zbee_zcl_se.ke.cert.valid.from", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0, NULL, HFILL } },
{ &hf_zbee_zcl_ke_cert_valid_to,
{ "Valid To", "zbee_zcl_se.ke.cert.valid.to", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
0, NULL, HFILL } },
{ &hf_zbee_zcl_ke_cert_key_usage_agreement,
{ "Key Agreement", "zbee_zcl_se.ke.cert.key.usage.agreement", FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled),
ZBEE_ZCL_KE_USAGE_KEY_AGREEMENT, NULL, HFILL }},
{ &hf_zbee_zcl_ke_cert_key_usage_signature,
{ "Digital Signature", "zbee_zcl_se.ke.cert.key.usage.signature", FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled),
ZBEE_ZCL_KE_USAGE_DIGITAL_SIGNATURE, NULL, HFILL }},
{ &hf_zbee_zcl_ke_ephemeral_qeu,
{ "Ephemeral Data (QEU)", "zbee_zcl_se.ke.qeu", FT_BYTES, BASE_NONE, NULL,
0, NULL, HFILL } },
{ &hf_zbee_zcl_ke_ephemeral_qev,
{ "Ephemeral Data (QEV)", "zbee_zcl_se.ke.qev", FT_BYTES, BASE_NONE, NULL,
0, NULL, HFILL } },
{ &hf_zbee_zcl_ke_macu,
{ "Message Authentication Code (MACU)", "zbee_zcl_se.ke.macu", FT_BYTES, BASE_NONE, NULL,
0, NULL, HFILL } },
{ &hf_zbee_zcl_ke_macv,
{ "Message Authentication Code (MACV)", "zbee_zcl_se.ke.macv", FT_BYTES, BASE_NONE, NULL,
0, NULL, HFILL } },
};
/* subtrees */
gint *ett[] = {
&ett_zbee_zcl_ke,
&ett_zbee_zcl_ke_cert,
&ett_zbee_zcl_ke_key_usage,
};
/* Register the ZigBee ZCL Key Establishment cluster protocol name and description */
proto_zbee_zcl_ke = proto_register_protocol("ZigBee ZCL Key Establishment", "ZCL Key Establishment", ZBEE_PROTOABBREV_ZCL_KE);
proto_register_field_array(proto_zbee_zcl_ke, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
/* Register the ZigBee ZCL Key Establishment dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_KE, dissect_zbee_zcl_ke, proto_zbee_zcl_ke);
} /*proto_register_zbee_zcl_ke*/
/**
*Hands off the ZCL Key Establishment dissector.
*
*/
void
proto_reg_handoff_zbee_zcl_ke(void)
{
zbee_zcl_init_cluster( ZBEE_PROTOABBREV_ZCL_KE,
proto_zbee_zcl_ke,
ett_zbee_zcl_ke,
ZBEE_ZCL_CID_KE,
ZBEE_MFG_CODE_NONE,
hf_zbee_zcl_ke_attr_id,
hf_zbee_zcl_ke_attr_client_id,
hf_zbee_zcl_ke_srv_rx_cmd_id,
hf_zbee_zcl_ke_srv_tx_cmd_id,
NULL
);
} /*proto_reg_handoff_zbee_zcl_ke*/
/*
* Editor modelines - https://www.wireshark.org/tools/modelines.html
*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* indent-tabs-mode: nil
* End:
*
* vi: set shiftwidth=4 tabstop=8 expandtab:
* :indentSize=4:tabSize=8:noTabs=true:
*/