CyberPower UPS USB Protocol

From Eleccelerator Wiki
Jump to: navigation, search

Contents

CyberPower CP850PFCLCD

I got this UPS for my computer. I want to use it as a starting point to build my another DIY battery backup for my NAS. My NAS supports many UPS, it can shutdown cleanly when the battery gets too low. In order to enable this kind of feature in my own DIY implementation, I need to learn about the protocol used in a supported UPS.

Descriptors

Device Descriptor

0x12,        // bLength
0x01,        // bDescriptorType (Device)
0x00, 0x02,  // bcdUSB 2.00
0x00,        // bDeviceClass (Use class information in the Interface Descriptors)
0x00,        // bDeviceSubClass 
0x00,        // bDeviceProtocol 
0x40,        // bMaxPacketSize0 64
0x64, 0x07,  // idVendor 0x0764
0x01, 0x05,  // idProduct 0x0501
0x01, 0x00,  // bcdDevice 0.01
0x03,        // iManufacturer (String Index)
0x01,        // iProduct (String Index)
0x02,        // iSerialNumber (String Index)
0x01,        // bNumConfigurations 1

Configuration Descriptor

0x09,        // bLength
0x02,        // bDescriptorType (Configuration)
0x22, 0x00,  // wTotalLength 34
0x01,        // bNumInterfaces 1
0x01,        // bConfigurationValue
0x00,        // iConfiguration (String Index)
0xC0,        // bmAttributes Self Powered
0x01,        // bMaxPower 2mA

0x09,        // bLength
0x04,        // bDescriptorType (Interface)
0x00,        // bInterfaceNumber 0
0x00,        // bAlternateSetting
0x01,        // bNumEndpoints 1
0x03,        // bInterfaceClass
0x00,        // bInterfaceSubClass
0x00,        // bInterfaceProtocol
0x00,        // iInterface (String Index)

0x09,        // bLength
0x21,        // bDescriptorType (HID)
0x10, 0x01,  // bcdHID 1.10
0x21,        // bCountryCode
0x01,        // bNumDescriptors
0x22,        // bDescriptorType[0] (HID)
0xB7, 0x01,  // wDescriptorLength[0] 439

0x07,        // bLength
0x05,        // bDescriptorType (Endpoint)
0x81,        // bEndpointAddress (IN/D2H)
0x03,        // bmAttributes (Interrupt)
0x40, 0x00,  // wMaxPacketSize 64
0x0A,        // bInterval 10 (unit depends on device speed)

// 34 bytes

HID Report Descriptor

0x05, 0x84,        // Usage Page (Power Pages)
0x09, 0x04,        // Usage (0x04)
0xA1, 0x01,        // Collection (Application)
0x09, 0x24,        //   Usage (0x24)
0xA1, 0x00,        //   Collection (Physical)
0x85, 0x01,        //     Report ID (1)
0x09, 0xFE,        //     Usage (0xFE)
0x75, 0x08,        //     Report Size (8)
0x95, 0x01,        //     Report Count (1)
0x15, 0x00,        //     Logical Minimum (0)
0x26, 0xFF, 0x00,  //     Logical Maximum (255)
0xB1, 0x23,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x85, 0x02,        //     Report ID (2)
0x09, 0xFF,        //     Usage (0xFF)
0xB1, 0x23,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x85, 0x1B,        //     Report ID (27)
0x06, 0x01, 0xFF,  //     Usage Page (Vendor Defined 0xFF01)
0x09, 0xD0,        //     Usage (0xD0)
0xB1, 0x22,        //     Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x85, 0x03,        //     Report ID (3)
0x05, 0x85,        //     Usage Page (Power Pages)
0x09, 0x89,        //     Usage (0x89)
0xB1, 0x23,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x85, 0x04,        //     Report ID (4)
0x09, 0x8F,        //     Usage (0x8F)
0xB1, 0x23,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x85, 0x05,        //     Report ID (5)
0x09, 0x8B,        //     Usage (0x8B)
0xB1, 0x23,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x85, 0x06,        //     Report ID (6)
0x09, 0x2C,        //     Usage (0x2C)
0xB1, 0x23,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x85, 0x07,        //     Report ID (7)
0x75, 0x08,        //     Report Size (8)
0x95, 0x06,        //     Report Count (6)
0x25, 0x64,        //     Logical Maximum (100)
0x09, 0x83,        //     Usage (0x83)
0x09, 0x8D,        //     Usage (0x8D)
0x09, 0x8E,        //     Usage (0x8E)
0x09, 0x8C,        //     Usage (0x8C)
0x09, 0x29,        //     Usage (0x29)
0x09, 0x67,        //     Usage (0x67)
0xB1, 0x23,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x85, 0x08,        //     Report ID (8)
0x75, 0x08,        //     Report Size (8)
0x95, 0x01,        //     Report Count (1)
0x65, 0x00,        //     Unit (None)
0x09, 0x66,        //     Usage (0x66)
0x81, 0x23,        //     Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position)
0x09, 0x66,        //     Usage (0x66)
0xB1, 0xA3,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x09, 0x68,        //     Usage (0x68)
0x75, 0x10,        //     Report Size (16)
0x27, 0xFF, 0xFF, 0x00, 0x00,  //     Logical Maximum (65535)
0x66, 0x01, 0x10,  //     Unit (System: SI Linear, Time: Seconds)
0x81, 0x23,        //     Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position)
0x09, 0x68,        //     Usage (0x68)
0xB1, 0xA3,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x09, 0x2A,        //     Usage (0x2A)
0x26, 0x58, 0x02,  //     Logical Maximum (600)
0x81, 0x23,        //     Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position)
0x09, 0x2A,        //     Usage (0x2A)
0xB1, 0xA2,        //     Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x85, 0x09,        //     Report ID (9)
0x75, 0x08,        //     Report Size (8)
0x26, 0xFF, 0x00,  //     Logical Maximum (255)
0x05, 0x84,        //     Usage Page (Power Pages)
0x09, 0x40,        //     Usage (0x40)
0x67, 0x21, 0xD1, 0xF0, 0x00,  //     Unit (System: SI Linear, Length: Radians, Mass: Gram)
0x55, 0x06,        //     Unit Exponent (6)
0xB1, 0x23,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x85, 0x0A,        //     Report ID (10)
0x09, 0x30,        //     Usage (0x30)
0xB1, 0xA3,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x09, 0x02,        //     Usage (0x02)
0xA1, 0x02,        //     Collection (Logical)
0x65, 0x00,        //       Unit (None)
0x55, 0x00,        //       Unit Exponent (0)
0x85, 0x0B,        //       Report ID (11)
0x75, 0x01,        //       Report Size (1)
0x95, 0x06,        //       Report Count (6)
0x25, 0x01,        //       Logical Maximum (1)
0x05, 0x85,        //       Usage Page (Power Pages)
0x09, 0xD0,        //       Usage (0xD0)
0x09, 0x44,        //       Usage (0x44)
0x09, 0x45,        //       Usage (0x45)
0x09, 0x42,        //       Usage (0x42)
0x09, 0x46,        //       Usage (0x46)
0x09, 0x43,        //       Usage (0x43)
0x81, 0x23,        //       Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position)
0x09, 0xD0,        //       Usage (0xD0)
0x09, 0x44,        //       Usage (0x44)
0x09, 0x45,        //       Usage (0x45)
0x09, 0x42,        //       Usage (0x42)
0x09, 0x46,        //       Usage (0x46)
0x09, 0x43,        //       Usage (0x43)
0xB1, 0xA3,        //       Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x75, 0x02,        //       Report Size (2)
0x95, 0x01,        //       Report Count (1)
0x81, 0x01,        //       Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xB1, 0x01,        //       Feature (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0xC0,              //     End Collection
0x85, 0x0C,        //     Report ID (12)
0x05, 0x84,        //     Usage Page (Power Pages)
0x09, 0x5A,        //     Usage (0x5A)
0x75, 0x08,        //     Report Size (8)
0x15, 0x01,        //     Logical Minimum (1)
0x25, 0x03,        //     Logical Maximum (3)
0xB1, 0xA2,        //     Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x09, 0x5A,        //     Usage (0x5A)
0x81, 0x22,        //     Input (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position)
0x85, 0x0D,        //     Report ID (13)
0x09, 0xFD,        //     Usage (0xFD)
0x15, 0x00,        //     Logical Minimum (0)
0x26, 0xFF, 0x00,  //     Logical Maximum (255)
0xB1, 0x23,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0xC0,              //   End Collection
0x05, 0x84,        //   Usage Page (Power Pages)
0x09, 0x1A,        //   Usage (0x1A)
0xA1, 0x00,        //   Collection (Physical)
0x85, 0x0E,        //     Report ID (14)
0x05, 0x84,        //     Usage Page (Power Pages)
0x09, 0x40,        //     Usage (0x40)
0x75, 0x08,        //     Report Size (8)
0x67, 0x21, 0xD1, 0xF0, 0x00,  //     Unit (System: SI Linear, Length: Radians, Mass: Gram)
0x55, 0x07,        //     Unit Exponent (7)
0xB1, 0x23,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x85, 0x0F,        //     Report ID (15)
0x75, 0x10,        //     Report Size (16)
0x09, 0x30,        //     Usage (0x30)
0xB1, 0xA3,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x85, 0x10,        //     Report ID (16)
0x09, 0x53,        //     Usage (0x53)
0x15, 0x4E,        //     Logical Minimum (78)
0x25, 0x58,        //     Logical Maximum (88)
0xB1, 0xA2,        //     Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x09, 0x53,        //     Usage (0x53)
0x81, 0x23,        //     Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position)
0x09, 0x54,        //     Usage (0x54)
0x16, 0x88, 0x00,  //     Logical Minimum (136)
0x26, 0x8E, 0x00,  //     Logical Maximum (142)
0xB1, 0xA2,        //     Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x09, 0x54,        //     Usage (0x54)
0x81, 0x23,        //     Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position)
0xC0,              //   End Collection
0x09, 0x1C,        //   Usage (0x1C)
0xA1, 0x00,        //   Collection (Physical)
0x85, 0x12,        //     Report ID (18)
0x09, 0x30,        //     Usage (0x30)
0xB1, 0xA3,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x75, 0x08,        //     Report Size (8)
0x15, 0x00,        //     Logical Minimum (0)
0x26, 0xFF, 0x00,  //     Logical Maximum (255)
0x65, 0x00,        //     Unit (None)
0x55, 0x00,        //     Unit Exponent (0)
0x85, 0x13,        //     Report ID (19)
0x09, 0x35,        //     Usage (0x35)
0xB1, 0xA3,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x85, 0x14,        //     Report ID (20)
0x09, 0x58,        //     Usage (0x58)
0x25, 0x06,        //     Logical Maximum (6)
0xB1, 0xA2,        //     Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x09, 0x58,        //     Usage (0x58)
0x81, 0x22,        //     Input (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position)
0x85, 0x15,        //     Report ID (21)
0x09, 0x57,        //     Usage (0x57)
0x75, 0x10,        //     Report Size (16)
0x15, 0xFF,        //     Logical Minimum (255)
0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
0x35, 0xC4,        //     Physical Minimum (196)
0x47, 0xC4, 0xFF, 0x1D, 0x00,  //     Physical Maximum (1966020)
0x66, 0x01, 0x10,  //     Unit (System: SI Linear, Time: Seconds)
0xB1, 0xA2,        //     Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x85, 0x16,        //     Report ID (22)
0x09, 0x56,        //     Usage (0x56)
0xB1, 0xA2,        //     Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x85, 0x17,        //     Report ID (23)
0x09, 0x6E,        //     Usage (0x6E)
0x75, 0x01,        //     Report Size (1)
0x15, 0x00,        //     Logical Minimum (0)
0x25, 0x01,        //     Logical Maximum (1)
0x35, 0x00,        //     Physical Minimum (0)
0x45, 0x00,        //     Physical Maximum (0)
0x65, 0x00,        //     Unit (None)
0xB1, 0xA3,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x09, 0x65,        //     Usage (0x65)
0xB1, 0xA3,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x75, 0x06,        //     Report Size (6)
0xB1, 0x01,        //     Feature (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x85, 0x18,        //     Report ID (24)
0x75, 0x10,        //     Report Size (16)
0x09, 0x44,        //     Usage (0x44)
0x26, 0x84, 0x03,  //     Logical Maximum (900)
0x66, 0x21, 0xD1,  //     Unit (System: SI Linear, Length: Radians, Mass: Gram)
0x55, 0x07,        //     Unit Exponent (7)
0xB1, 0xA3,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x85, 0x1A,        //     Report ID (26)
0x06, 0x01, 0xFF,  //     Usage Page (Vendor Defined 0xFF01)
0x65, 0x00,        //     Unit (None)
0x55, 0x00,        //     Unit Exponent (0)
0x75, 0x08,        //     Report Size (8)
0x15, 0x00,        //     Logical Minimum (0)
0x25, 0x02,        //     Logical Maximum (2)
0x09, 0x43,        //     Usage (0x43)
0xB1, 0xA2,        //     Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x09, 0x43,        //     Usage (0x43)
0x81, 0x23,        //     Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position)
0xC0,              //   End Collection
0xC0,              // End Collection

// 439 bytes

Initialization

Once the enumeration completes, the following Control Transfers occur:

Setup:  A1 01 06 03 00 00 08 00
IN EP0: 06 02
Setup:  A1 01 0A 03 00 00 08 00
IN EP0: 0A F0
Setup:  A1 01 0A 03 00 00 08 00
IN EP0: 0A F0
Setup:  A1 01 07 03 00 00 08 00
IN EP0: 07 64 05 0A 14 0A 64

Sample Communication

Once every second, two different reports are sent repeatedly:

During Charging

IN EP1: 08 2B 98 01 2C 01
IN EP1: 0B 03
... pause 1 second
IN EP1: 08 2B 62 01 2C 01
IN EP1: 0B 03
... later
IN EP1: 08 2E A6 02 2C 01
IN EP1: 0B 03
... later
IN EP1: 08 2E D4 02 2C 01
IN EP1: 0B 03
... later
IN EP1: 08 2E E3 01 2C 01
IN EP1: 0B 03

Power Outage Event

IN EP1: 08 2E 78 02 2C 01
IN EP1: 0B 03
... pause
IN EP1: 08 64 C9 04 2C 01
IN EP1: 0B 04
... pause
SETUP:  A1 01 0B 03 00 00 08 00
IN EP0: 0B 04
SETUP:  A1 01 0B 03 00 00 08 00
IN EP0: 0B 04
SETUP:  A1 01 0B 03 00 00 08 00
IN EP0: 0B 04
SETUP:  A1 01 0B 03 00 00 08 00
IN EP0: 0B 04
SETUP:  A1 01 08 03 00 00 08 00
IN EP0: 08 64 C9 04 2C 01
SETUP:  A1 01 08 03 00 00 08 00
IN EP0: 08 64 C9 04 2C 01
SETUP:  A1 01 08 03 00 00 08 00
IN EP0: 08 64 C9 04 2C 01
SETUP:  A1 01 08 03 00 00 08 00
IN EP0: 08 64 C9 04 2C 01
... pause
IN EP1: 08 59 FF 03 2C 01
IN EP1: 0B 04
... pause
IN EP1: 08 51 3E 03 2C 01
IN EP1: 0B 04

The burst of control endpoint transactions here are probably just the Windows driver freaking out. A proper request handler should be able to handle these easily.

Warning: USB errors are expected in power outage events, which means possible occurrence of re-enumeration. It could've been what triggered the control requests seen here.

Power Outage Event From Full Charge

08 64 54 06 2C 01
0B 11
... pause
08 64 FA 05 2C 01
0B 04
... pause
08 64 C7 05 2C 01
0B 04
... pause
08 64 80 05 2C 01
0B 04

The same warning regarding errors and control requests apply here too.

During Discharging

08 2B 98 01 2C 01
0B 03
... pause
08 2B A3 01 2C 01
0B 03
... pause
08 2B 8D 01 2C 01
0B 03
... pause
08 2B A3 01 2C 01
0B 03
... pause
08 2B 98 01 2C 01
0B 03
... pause
08 2B 62 01 2C 01
0B 03
... later
08 2E A6 02 2C 01
0B 03
... later
08 2E E3 01 2C 01
0B 03
... later
08 2E BD 02 2C 01
0B 03

Power Restored Event

08 20 40 01 2C 01
0B 04
... pause
08 21 E6 01 2C 01
0B 05
... device resets and re-enumerates, goes into charging state

Idle While Full

08 64 BE 05 2C 01
0B 11
... pause
08 64 A0 05 2C 01
0B 11

Pressing the Mute Button

0C 01

Basic Report Breakdown

For the Power Pages, check http://www.usb.org/developers/hidpage/pdcv10.pdf

Report ID 0x08

Previous Usage Page: 0x85, Battery System
0x85, 0x08,        //     Report ID (8)
0x75, 0x08,        //     Report Size (8)
0x95, 0x01,        //     Report Count (1)
0x65, 0x00,        //     Unit (None)
0x09, 0x66,        //     Usage (0x66) // RemainingCapacity
0x81, 0x23,        //     Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position)
0x09, 0x66,        //     Usage (0x66) // RemainingCapacity
0xB1, 0xA3,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x09, 0x68,        //     Usage (0x68) // RunTimeToEmpty
0x75, 0x10,        //     Report Size (16)
0x27, 0xFF, 0xFF, 0x00, 0x00,  //     Logical Maximum (65535)
0x66, 0x01, 0x10,  //     Unit (System: SI Linear, Time: Seconds)
0x81, 0x23,        //     Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position)
0x09, 0x68,        //     Usage (0x68) // RunTimeToEmpty
0xB1, 0xA3,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x09, 0x2A,        //     Usage (0x2A) // RemainingTimeLimit 
0x26, 0x58, 0x02,  //     Logical Maximum (600)
0x81, 0x23,        //     Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position)
0x09, 0x2A,        //     Usage (0x2A) // RemainingTimeLimit 
0xB1, 0xA2,        //     Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)

Report ID 0x0B

Previous Usage Page: 0x84, Power Device
0x85, 0x0B,        //       Report ID (11)
0x75, 0x01,        //       Report Size (1)
0x95, 0x06,        //       Report Count (6)
0x25, 0x01,        //       Logical Maximum (1)
0x05, 0x85,        //       Usage Page (Power Pages) // Actually Battery System
0x09, 0xD0,        //       Usage (0xD0) // ACPresent
0x09, 0x44,        //       Usage (0x44) // Charging
0x09, 0x45,        //       Usage (0x45) // Discharging
0x09, 0x42,        //       Usage (0x42) // BelowRemainingCapacityLimit
0x09, 0x46,        //       Usage (0x46) // FullyCharged
0x09, 0x43,        //       Usage (0x43) // RemainingTimeLimitExpired
0x81, 0x23,        //       Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position)
0x09, 0xD0,        //       Usage (0xD0)
0x09, 0x44,        //       Usage (0x44)
0x09, 0x45,        //       Usage (0x45)
0x09, 0x42,        //       Usage (0x42)
0x09, 0x46,        //       Usage (0x46)
0x09, 0x43,        //       Usage (0x43)
0xB1, 0xA3,        //       Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
0x75, 0x02,        //       Report Size (2)
0x95, 0x01,        //       Report Count (1)
0x81, 0x01,        //       Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xB1, 0x01,        //       Feature (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)

Report ID 0x07

Previous Usage Page: 0x85, Battery System
0x85, 0x07,        //     Report ID (7)
0x75, 0x08,        //     Report Size (8)
0x95, 0x06,        //     Report Count (6)
0x25, 0x64,        //     Logical Maximum (100)
0x09, 0x83,        //     Usage (0x83) // DesignCapacity
0x09, 0x8D,        //     Usage (0x8D) // CapacityGranularity1
0x09, 0x8E,        //     Usage (0x8E) // CapacityGranularity2
0x09, 0x8C,        //     Usage (0x8C) // WarningCapacityLimit
0x09, 0x29,        //     Usage (0x29) // RemainingTimeLimit
0x09, 0x67,        //     Usage (0x67) // FullChargeCapacity
0xB1, 0x23,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)

Report ID 1 through 6

0x05, 0x84,        // Usage Page (Power Pages) // Power Device
0x09, 0x04,        // Usage (0x04) // UPS
0xA1, 0x01,        // Collection (Application)
0x09, 0x24,        //   Usage (0x24) // PowerSummary
0xA1, 0x00,        //   Collection (Physical)
0x85, 0x01,        //     Report ID (1)
0x09, 0xFE,        //     Usage (0xFE) // iProduct
0x75, 0x08,        //     Report Size (8)
0x95, 0x01,        //     Report Count (1)
0x15, 0x00,        //     Logical Minimum (0)
0x26, 0xFF, 0x00,  //     Logical Maximum (255)
0xB1, 0x23,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x85, 0x02,        //     Report ID (2)
0x09, 0xFF,        //     Usage (0xFF) // iserialNumber
0xB1, 0x23,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x85, 0x1B,        //     Report ID (27)
0x06, 0x01, 0xFF,  //     Usage Page (Vendor Defined 0xFF01)
0x09, 0xD0,        //     Usage (0xD0)
0xB1, 0x22,        //     Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x85, 0x03,        //     Report ID (3)
0x05, 0x85,        //     Usage Page (Power Pages) // Battery System
0x09, 0x89,        //     Usage (0x89) // iDeviceChemistery
0xB1, 0x23,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x85, 0x04,        //     Report ID (4)
0x09, 0x8F,        //     Usage (0x8F) // iOEMInformation
0xB1, 0x23,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x85, 0x05,        //     Report ID (5)
0x09, 0x8B,        //     Usage (0x8B) // Rechargable
0xB1, 0x23,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
0x85, 0x06,        //     Report ID (6)
0x09, 0x2C,        //     Usage (0x2C) // CapacityMode
0xB1, 0x23,        //     Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox