Introduction

This document outlines the USB HID based protocol for the Omron 790IT Blood Pressure Monitor. The protocol allows a user to download information that was stored on the unit over multiple usages.

Thanks to Adam Richter for editing and additions to the document.

Document Notation

The following notation is used in the packet formats in this document

0xXX

refers to a byte that is ignored and can take any value

0x??

refers to a byte that is significant but variable

Protocol Information

Packet Format

The protocol itself does not follow the normal USB HID specification, instead catching and using the raw reports with its own format. It does this in order to bypass driver installation on Windows based machines.

All output reports are 8 bytes with no HID report ID, but some operating sytem software (at least under Microsoft Windows) will provide prepend a byte that is always 0, to indicate report ID 0, so the report will be appear to be 9 bytes (1 report ID, always 0, 8 data). This is probably intended to simplify HID report processing by allowing client software to be written as if all HID devices prepend a one byte report ID.

In input and output reports, the first data byte specifies the number of "valid" bytes in the packet. Count starts after the count byte, all bytes after the count are ignored.

i.e. In the packet

0x05 0x01 0x02 0x03 0x04 0x05 0x06 0x07

Only bytes 1-5 are used, and would look like this in our notation

0x05 0x01 0x02 0x03 0x04 0x05 0xXX 0xXX

0x06 0x07 are ignored and can be anything.

Command Format

All commands from the computer to the Omron device consit of at least five bytes. All commands begin with three mnemonic ASCII characters (except for the "clearing block" command described below, where these bytes are all zero) followed by one or more data bytes (which may or may not human readable ASCII, depending on command), followed, by a terminating checksum byte which is the XOR of the data bytes. Commands may span multiple output reports.

Response Format

For returns, the first 2-3 bytes specify the status. Returns may be broken up over multiple input reports

Successful input reports begin with ASCII "OK" and are either exactly two bytes or at least five bytes, the last of which is a checksum of the bytes after the "OK".

0x4F 0x4B [ 0x00 ... CHECKSUM ]
(ASCII: "OK")
(The CHECKSUM byte is the XOR of bytes designateed by "...")

An exception to the statement about checksums above is the response to the "END" command which is "OFF\r\n" with no checksum byte. Also a response of zero bytes to an "END" command may have been observed under Linux, but this may have been a figment of a user level bug.

Unsuccessful input reports will have their first two bytes as 0x4E 0x4F.

0x4E 0x4F
(ASCII: "NO")

Initialization

The Omron 790IT has 3 data retrieval modes that need to be set before data can be pulled from the unit.

These data modes are set by way of HID Feature Requests. All feature requests are 3 bytes (1 report ID, always 0, and 2 data bytes).

Device Information
0x01 0x01
Individual Reading Information
0x74 0xbc
Weekly Average Information
0x10 0x74

After a mode is set, a clearing block is sent. These consist of:

Device Information Mode Commands

Get Unit Version

Description

Used to retrieve the version of the unit, in ASCII string format

Command

0x56 0x45 0x52 0x30 0x30
(ASCII: "VER00")
(Three byte ASCII command "VER", argument "0", checksum checksum "0")

Parameters

None

Return Format

15 bytes (3 bytes for "OK" success string, 12 byte ASCII string, not null terminated, giving the unit version)

Output Report Example

0x56 0x45 0x52 0x30 0x30
(Three byte ASCII command "VER", argument byte ASCII "0", checksum byte ASCII "0")

Output Report Example in HID Raw Report Format

0x05 0x56 0x45 0x52 0x30 0x30 0xXX 0xXX
(Byte count 5, command "VER", argument "0", argument checksum "0")

Return Example

0x4d 0x37 0x30 0x38 0x30 0x49 0x54 0x20 0x32 0x30 0x37 0x4a
(ASCII: "M7080IT 207J")
(data bytes: ASCII "M7080IT 207", data checksum: 0x4a )

Return Example in HID Raw Report Format

0x07 0x4f 0x4b 0x00 0x4d 0x37 0x30 0x38
0x07 0x30 0x49 0x54 0x20 0x32 0x30 0x37
0x01 0x4a 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX

Get Unit PRF

Description

Used to retrieve whatever the PRF is for the unit. ASCII string, could be some sort of odd bitfield?

Command

0x50 0x52 0x46 0x30 0x30
(ASCII: "PRF00")

Parameters

None

Return Format

14 bytes (3 bytes for "OK" success string, 11 byte ASCII string)

Output Report Example

0x50 0x52 0x46 0x30 0x30

Output Report Example in HID Raw Report Format

0x05 0x50 0x52 0x46 0x30 0x30 0xXX 0xXX
(Byte count 5, ASCII "PRF", data byte "0", data checksum "0")

Return Example

0x30 0x30 0x31 0x30 0x31 0x30 0x30 0x30 0x30 0x30 0x00
(ASCII: '001010000')
(ASCII data '0010100', data checksum: 0)

Return Example in HID Raw Report Format

0x07 0x4f 0x4b 0x00 0x30 0x30 0x31 0x30
0x07 0x31 0x30 0x30 0x30 0x30 0x30 0x00

Get Unit SRL

Description

Used to retrieve whatever the SRL is for the unit. ASCII string, could be serial number?

Command

0x53 0x52 0x4c 0x30 0x30
(ASCII: "SRL00")

Parameters

None

Return Format

11 bytes (3 bytes for "OK" success string, 8 bytes, binary, not sure of context)

Output Report Example

0x53 0x52 0x4c 0x30 0x30

Output Report Example in HID Raw Report Format

0x05 0x53 0x52 0x4c 0x30 0x30 0xXX 0xXX

Return Example

0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x06

Return Example in HID Raw Report Format

0x07 0x4f 0x4b 0x00 0x06 0x00 0x00 0x00
0x04 0x00 0x00 0x00 0x06 0xXX 0xXX 0xXX

Individual Reading Mode Commands

Get Individual Reading Count

Description

Used to retreive how many sessions are currently stored on the machine

Command

0x47 0x44 0x43 0x00 bank 0x00 0x00 checksum
ASCII: "GDC" (Get Data Count?)
index = 0..(value returned by GDC - 1)
bank = 0x00, 0x01 or 0x02, perhaps for user A, user B, combined?
checksum = the XOR of the bytes after "GDC"

Parameters

Which bank to query, last byte of command (NEED TO CONFIRM)

Return Format

8 bytes (3 bytes for "OK" success string, 5 bytes, binary, not sure of context)

Byte 3: Number of available sessions

Output Report Example

0x47 0x44 0x43 0x00 0x00 0x00 0x00 0x01

Output Report Example in HID Raw Report Format

0x07 0x47 0x44 0x43 0x00 0x00 0x00 0x00
0x01 0x01 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX

Return Example

0x00 0x0a 0x00 0x08 0x02

Return Example in HID Raw Report Format

0x07 0x4f 0x4b 0x00 0x00 0x0a 0x00 0x08
0x01 0x02 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX

Get Individual Reading

Description

Retrieve information about a single reading

Command

0x47 0x4d 0x45 0x00 bank 0x00 index checksum
ASCII: "GME" (Get Measurement?)
index = 0..(value returned by GDC - 1)
bank = 0x00, 0x01 or 0x02, perhaps for user A, user B, combined?
checksum = the XOR of the bytes after "GME"

Parameters

Index of record, last 2 bytes of command

Return Format

17 bytes (3 bytes for "OK" success string, 14 bytes, binary) Will sometimes return "NO" message. If this happens, requery using the same command

Byte 0

Last 2 digits of year

Byte 1

Month

Byte 2

Day

Byte 3

Hour (24-hour format) (NEED TO CONFIRM)

Byte 4

Minute

Byte 5

Seconds

Byte 6

UNKNOWN

Byte 7

UNKNOWN

Byte 8

SYS

Byte 9

DIA

Byte A

Pulse

Byte B

UNKNOWN

Byte C

Status Flags

  • 0x0X - Standalone reading

  • 0x1X - First reading of a 3 reading average (TruRead function)

  • 0x2X - Second reading of a 3 reading average (TruRead function)

  • 0x3X - Third reading of a 3 reading average (TruRead function)

  • Others: UNKNOWN

Byte D

Checksum (XOR of bytes 0..C)

Output Report Example

Command gets newest available record

0x47 0x4d 0x45 0x00 0x00 0x00 0x00 0x00

Output Report Example in HID Raw Report Format

0x07 0x47 0x4d 0x45 0x00 0x00 0x00 0x00
0x01 0x00 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX

Return Example

0x07 0x01 0x03 0x00 0x06 0x33 0x00 0x00 0x70 0x4b 0x47 0x00 0x00 0x4c
Year

07

Month

01

Day

03

Hour

00

Minute

06

Seconds

33

SYS

0x70 (112)

DIA

0x4b (75)

Pulse

0x47 (71)

Read Type

Standalone

Return Example in HID Raw Report Format

0x07 0x4f 0x4b 0x00 0x07 0x01 0x03 0x00
0x07 0x06 0x33 0x00 0x00 0x70 0x4b 0x47
0x03 0x00 0x00 0x4c 0xXX 0xXX 0xXX 0xXX

Weekly Average Mode Commands

Get Weekly Morning/Evening Data

Description

Retrieve information about a weekly morning/evening average

Command

0x47 0x4d 0x41 0x00 bank index 0x00 0x00 checksum
ASCII: "GMA" (Get Morning Average)
or
0x47 0x45 0x41 0x00 bank index 0x00 0x00 checksum
ASCII: "GEA" (Get Evening Average)

index = 0..7?
bank = 0x00, 0x01 or 0x02, perhaps for user A, user B, combined?
checksum = the XOR of the bytes after "GMA" or "GEA"

Parameters

Index of record

Return Format

12 bytes (3 bytes for "OK" success string, 9 bytes, binary)

Byte 0

UNKNOWN (always 0x80?)

Byte 1

UNKNOWN (always 0..7?)

Byte 2

Last two digits of year

Byte 3

Month

Byte 4

Day

Byte 5

SYS minus 25 (NEED TO CONFIRM) (0 = no readings this week?)

Byte 6

DIA (0 = no readings this week?)

Byte 7

Pulse

Byte 8

Checksum (XOR of bytes 0..7)

Output Report Example

Command gets 7th record

0x47 0x4d 0x41 0x00 0x00 0x06 0x00 0x00 0x06

Output Report Example in HID Raw Report Format

0x07 0x47 0x4d 0x41 0x00 0x00 0x00 0x06
0x02 0x00 0x06 0x00 0x00 0x00 0x00 0x00

Return Example

0x80 0x01 0x09 0x04 0x13 0x71 0x69 0x70 0xf7
SYS

138 (0x71 + 0x19, unit says 138 though. This lines up across other readings too)

DIA

105 (0x69)

Pulse

112 (0x70)

Return Example in HID Raw Report Format

0x07 0x4f 0x4b 0x00 0x80 0x01 0x09 0x04
0x05 0x13 0x71 0x69 0x70 0xf7 0xXX 0xXX

Utility Commands

End Data Request

Description

Notifies the unit that the transfer session is over. Device will turn off after this command is sent.

Command

0x45 0x4E 0x44 0xFF 0xFF
(ASCII: "END")

Parameters

None

Return Format

5 Bytes (ASCII "OFF\r\n"), signaling that the unit is turning off

Output Report Example

0x45 0x4E 0x44 0xFF 0xFF

Output Report Example in HID Raw Report Format

0x05 0x45 0x4E 0x44 0xFF 0xFF 0xXX 0xXX

Return Example

0x4F 0x46 0x46 0x0D 0x0A
(ASCII: "OFF\r\n")

Return Example in HID Raw Report Format

0x07 0x4F 0x46 0x46 0x0D 0x0A 0xXX 0xXX

Further Information

For further information, visit: