Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Remote Two/3 API Documentation

Visit the core-api GitHub project site where this documentation was built from and where you can find further technical information.

Introduction

Core API

The Unfolded Circle Remote WebSocket & REST Core-APIs allow you to interact with the Unfolded Circle remote-core service and take full control of its features.

The focus of the Core-APIs is to provide all functionality for the UI application and the web-configurator. The APIs are specialized for certain tasks, but otherwise contain the same functionality and data models.

  • The UCR REST Core-API adds:
    • Custom resource handling for uploading icons, images etc.
    • Installing custom remote-ui and web-configurator components.
    • Installing custom integration drivers.
    • User management and authentication handling.
  • The UCR WS Core-API adds:
    • Event subscription with asynchronous notifications.

The Core-APIs may also be used by other external systems and integration drivers, if specific configuration or interaction features are required, which are not present in the UCR Integration-API.

The API specifications are defined with OpenAPI & AsyncAPI in YAML format.

Dock API

The Remote Two/3 WebSocket Dock-API allows you to directly interact with the Unfolded Circle smart charging docks and take full control of its features.

The API specification is defined with AsyncAPI in YAML format. The WebSocket communication is using text messages with JSON payload.

Integration API

The Unfolded Circle WebSocket Integration-API allows writing device integration drivers for the Unfolded Circle Remotes.

The API specification is defined with AsyncAPI in YAML format. The WebSocket communication is using text messages with JSON payload.

Integration Driver

Contact us

There are a few different ways to reach us:

Contributions

Please read our contribution guidelines before opening a pull request.

License

We have published the API specifications and documentations under the CC-BY-AS-4.0 (Creative Commons Attribution-ShareAlike 4.0 International) license.
All code examples in this repository are licensed under the Apache License 2.0.
All graphics copyright © Unfolded Circle ApS 2022.

Remote Two User Interface

The user interface was designed to be easy to use by anyone, who can use a smart home app. Similar principles were applied to the touch interface, enhanced with button navigation and control.

Home/page screen

Overview

Description
1Notification indicator
2Clock
3Indicator when an integration is connecting
4Battery level
5Current profile - tap opens setting
6Microphone in use indicator
7Current page - tap opens page selector
8List of entities/groups

Profiles

A profile can contain customised settings and UI configurations, including pages, groups and entities.

Overview

A profile can be changed by tapping on the current profile in settings.

Pages

Overview

A page can contain entities or groups. Pages can be selected by swiping left and right or using the left and right buttons on the D-pad. Tapping the page's name will bring up the page selector, where pages can be also added, deleted or renamed. Pages can have an image header and contain entities or groups. Multiple pages can contain the same entity.

A page can be used to segment rooms, areas, a specific purpose or anything else that makes sense to you.

Groups

Groups are a set of entities that can be defined by the user. Groups are another way of organising entities. A group can be configured to have a group switch, that can turn on/off every entity within the group at once. A group can be collapsed or expanded.

Overview

Example of a group containing two lights in expanded mode.

Remote Two DNS-SD lookup

The Remote Two will announce itself as service type _uc-remote._tcp.

The service lookup will return IP address and port number and other information in the TXT record data like model number and API version of the remote.

KeyDescription
verVersion number
ver_apiAPI version number
modelModel number
https_portHTTPS port if enabled

Model numbers

The model key specifies the physical device or the core-simulator:

ModelDescription
UCR3Remote 3
UCR2Remote Two
UCR2-simulatorRemote Core simulator
YIO1YIO Remote

Examples

macOS:

dns-sd -Z _uc-remote._tcp

For a UI tool, see Discovery.

Linux:

avahi-browse -d local --resolve _uc-remote._tcp -t

Entities

Entities represent devices by describing features and exposing controls. An integration can offer available entities for control. The user might select and configure entities, that will be available for the user interface.

Based on the entity type, device class and features, a specific user interface is shown. These features and other entity characteristics are set by the integration.

An integration driver provides entity definitions to the remote which then can be used in profiles and pages for the user to interact with the device.

Whenever the user interacts with an entity from an integration driver, the remote sends command requests to the integration driver. Once the entity or physical device has been updated the integration driver sends a change event message back to the remote to notify it about the updated state or attribute(s).

Supported entities:

The 🚧 icon within the entity descriptions indicates a planned feature.

Integration API

To make entities available to the remote, an integration driver needs to provide entity definition for each entity instance, filled with entity type specific data.

The remote retrieves the available entities from the integration driver with the get_available_entities request message:

{
  "kind": "req",
  "id": 11,
  "msg": "get_available_entities"
}

The integration driver then responds with the available_entities message containing all entity definitions:

{
  "kind": "resp",
  "req_id": 11,
  "msg": "available_entities",
  "code": 200,
  "msg_data": {
    "available_entities": [
      {
        "entity_id": "button-1",
        "entity_type": "button",
        "name": {
          "en": "Ring dinner bell"
        }
      },
      {
        "entity_id": "blind-1",
        "entity_type": "cover",
        "device_class": "blind",
        "features": [
          "open",
          "close",
          "stop",
          "position"
        ],
        "name": {
          "en": "Living room blinds",
          "de": "Wohnzimmer Jalousien"
        }
      },
      {
        "entity_id": "light-1",
        "entity_type": "light",
        "features": [
          "on_off",
          "dim",
          "colour"
        ],
        "name": {
          "en": "Living room"
        }
      }
    ]
  }
}

All entities share a set of common attributes like name and the UNAVAILABLE, UNKNOWN states. An entity implementation defines additional features, attributes, states and options which need to be handled in the driver implementation.

Please see Integration AsyncAPI definition for more information and additional options.

Common entity definition

All entities share the following properties in the entity structure:

Entity propertyDescription
entity_idUnique identifier of the entity for command and event messages.
entity_typeEntity device type name: one of the supported entities.
device_idOptional associated device, if the integration driver supports multiple devices.
featuresSupported features of the entity. See concrete entity definition for available features.
nameHuman readable name of the entity or device. Default value of the entity name for the entity configuration in the remote. Changeable by the user.
areaOptional area name, e.g. Living room. This information might be used by the UI in the setup process to automatically create profile pages for all areas returned in the available entities.

Features

The entity features define the controllable properties of an entity. They also influence how an entity is shown in the UI, e.g. if there are dimmer and colour selection controls for a lamp, or blind position controls.

Attributes

Entity attributes are controlled or influenced by features. A features can act on multiple attributes, e.g. the open command for a cover entity will set the state and if supported, also the current position of the cover.

An attribute value should represent the correct state of the physical device being controlled whenever possible. An integration driver might simulate intermediate states and position values, if the current state is either not readable from the device or involves expensive operations. E.g. if it's known that opening a window blind takes 30 seconds, the integration driver can start a timer and send approximated status updates during the opening time frame.
This will show a nice animation in the remote UI instead of immediately jumping from closed to open while the physical blind is still opening.

States

The entity state attribute holds the following common values which an integration driver can choose to support:

ValueDescription
UNAVAILABLEThe entity is currently not available. The UI will render the entity as inactive until the entity becomes active again.
UNKNOWNThe entity is available but the current state is unknown.

Device classes

An entity type can be further classified by an optional device class. This has mainly an influence on the UI representation how an entity is presented to a user. E.g. a cover entity has multiple device classes like blind or garage.

Options

Options are feature modifiers to customize certain behaviour, e.g. the default on_off feature for a switch expects the current state to be retrievable. If a switch can't provide its current state, it becomes a toggle switch with setting the readable option to false.

Commands

For all user or scene interactions with an entity, like switching it on or changing an attribute, the remote sends an entity_command message to the integration driver. This message contains the entity command with optional parameters to execute by the driver:

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "$TYPE",
    "entity_id": "$ID",
    "cmd_id": "$COMMAND",
    "params": {
      "$ParameterName1": "$ParameterValue1",
      "$ParameterName2": "$ParameterValue2",
      "$ParameterNameN": "$ParameterValueN"
    }
  }
}
  • The command is specified in msg_data.cmd_id.
    • Optional command parameters are passed as key / value pairs under msg_data.params.
    • The available commands and parameters are specified in the corresponding entity documentation.
  • The command request must be acknowledged with a result response message.
    • If at the time of receiving the command the driver already knows that it can't execute the command, it can send back an error to notify that the command execution is not possible.
      Otherwise, the remote assumes that the command is executed.
  • Once the value has been set or confirmed by the physical device, an entity_change event message must be sent by the integration driver with the new value(s). Of course, this only applies to stateful attributes and not to buttons or "fire and forget" commands.

Events

The entity_change event must be emitted by the integration driver if the state of the entity changes. Either after an entity_command or if the entity has been updated otherwise, e.g. externally through a user or another system.
This keeps the remote in sync with the real state of the entity without the need of constant polling.

Event message structure:

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "msg_data": {
    "entity_type": "$TYPE",
    "entity_id": "$ID",
    "attributes": {
      "$Attribute1": "$Value1",
      "$Attribute2": "$Value2",
      "$AttributeN": "$ValueN"
    }
  }
}

The available $Attribute(s) and their $Value(s) are specified in the entity documentation.

Common event attributes available for all entities:

AttributeDescription
stateNew entity state.

At least one attribute must be specified in the entity_change message. If the common entity state and an addition attribute changed at the same time, they may both be included in the same message. It's also valid to always send every entity attribute. The remote will filter out non-changed attributes and only update changes in the UI.

Button Entity

A button entity can fire an event or start an action which cannot be further controlled once started.

This can be used for "fire and forget" commands, e.g. running a system command, sending an IR code, restart a device, reset something etc.

A button is stateless. To represent something that can be turned on and off, the switch entity should be used.

Features

NameRWDescription
pressDefault feature of a button. Always present, even if not specified.

States

The button entity only supports the ON state and the common entity states.

ValueDescription
AVAILABLEThe button is available.

Device Classes

None.

Options

None: the button entity doesn't support additional options.

Integration API

Commands

The integration driver has to implement a handler for the entity_command message to process the following command requests in msg_data.cmd_id.

cmd_idParametersDescription
push-Push the button!

Events

None: the button entity is stateless and the remote doesn't need to be notified when the button was pressed externally.

Command examples

push

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "button",
    "entity_id": "button-1",
    "command_id": "push"
  }
}

Switch Entity

A switch entity can turn something on or off and the current state should be readable by the integration driver.

If the state can't be read, the readable option property can be set to false. This should be avoided whenever possible, because the remote either has to assume the current state, or the UI needs to ask the user for the current state.

If the switch controls a light source, then the light entity is usually a better choice.

Features

NameRWDescription
on_offDefault feature of a switch. Always present, even if not specified.
toggleToggle support. If there's no native support, the remote will use the current state of the switch to send the corresponding on or off command.

Attributes

Entity attributes are controlled by features. Multiple features can act on the same attribute. See Events on how to notify the remote about an updated attribute. The attributes have to be listed as properties under attributes with their current value.

AttributeFeaturesTypeValuesDescription
stateon_offenumStatesState of the switch, it's either on or off.
toggleToggle inverts the current state. If the driver doesn't provide the toggle feature, the remote uses the current value and calls on or off.

States

The switch entity provides the following entity state values:

ValueDescription
ONThe switch is on.
OFFThe switch is off.

See common entity states.

Device classes

Optional switch type. This can be used by the UI to represent the entity with a different icon, behaviour etc.

NameDescription
outletThe switch represents a switchable power outlet.
switchGeneric switch.

Options

NameTypeDefaultDescription
readablebooleantrueIf set to false the current state of the switch cannot be read. This will make the switch stateless and the UI might ask the user for the current state.

Integration API

Commands

The integration driver has to implement a handler for the entity_command message to process the following command requests in msg_data.cmd_id.

cmd_idParametersDescription
on-Put the switch in the on state.
off-Put the switch in the off state.
toggle-Toggle the current switch state, either from on -> off or from off -> on.

Events

The entity_change event must be emitted by the integration driver if the state or an attribute of the switch changes.

The following attributes must be included:

AttributeDescription
stateNew entity state.

Command examples

on

{
  "kind": "req",
  "id": 124,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "switch",
    "entity_id": "switch-1",
    "cmd_id": "on"
  }
}

off

{
  "kind": "req",
  "id": 124,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "switch",
    "entity_id": "switch-1",
    "cmd_id": "off"
  }
}

toggle

{
  "kind": "req",
  "id": 124,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "switch",
    "entity_id": "switch-1",
    "cmd_id": "toggle"
  }
}

Event examples

Switched on

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "msg_data": {
    "entity_type": "switch",
    "entity_id": "switch-1",
    "attributes": {
      "state": "on"
    }
  }
}

Switched off

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "msg_data": {
    "entity_type": "switch",
    "entity_id": "switch-1",
    "attributes": {
      "state": "off"
    }
  }
}

Climate Entity

A climate entity controls heating, ventilation and air conditioning (HVAC) devices. This can range from simple fans to personal air conditioning units to integrated building devices.

Features

NameRWDescription
on_offThe device can be turned on and off. The active HVAC mode after power on is device specific and must be reflected in the state attribute.
heatThe device supports heating.
coolThe device supports cooling.
current_temperatureThe device can measure the current temperature.
target_temperatureThe device supports a target temperature for heating or cooling.
🚧 target_temperature_rangeThe device supports a target temperature range.
🚧 fanThe device has a controllable fan.

Attributes

Entity attributes are controlled by features. Multiple features can act on the same attribute.

AttributeFeaturesTypeValuesDescription
stateon_offenumStatesState of the climate device, corresponds to HVAC mode.
heat
cool
fan
current_temperaturecurrent_temperaturenumber
target_temperaturetarget_temperaturenumber
🚧 target_temperature_hightarget_temperature_rangenumber
🚧 target_temperature_lowtarget_temperature_rangenumber
🚧 fan_modefanenum

See entity options for temperature unit and ranges.

States

The climate entity provides the following entity state values and represents the currently set HVAC mode of the device:

ValueDescription
OFFThe climate device is switched off.
HEATThe device is set to heating, optionally to a set target temperature.
COOLThe device is set to cooling, optionally to a set target temperature.
HEAT_COOLThe device is set to heat or cool to a target temperature range.
FANFan-only mode without heating or cooling.
AUTOThe device is set to automatic mode. This is device dependant, e.g. according to a schedule, presence detection, etc.

Note: the current mode may not be the active state of the device. E.g. if the mode is set to AUTO the climate unit may be heating, cooling, idle, etc. at a specific point in time.

See common entity states.

Device Classes

None.

Options

NameTypeDefaultDescription
temperature_unitenumCELSIUSThe unit of temperature measurement: CELSIUS, FAHRENHEIT. If not specified, the remote settings are used.
target_temperature_stepnumber0.5 / 1Step value for the UI for setting the target temperature. Defaults: CELSIUS = 0.5, 'FAHRENHEIT` = 1. Smallest step size: 0.1
max_temperaturenumber30Maximum temperature to show in the UI for the target temperature range.
min_temperaturenumber10Minimum temperature to show in the UI for the target temperature range.
🚧 fan_modesenum

🚧 Planned feature.

Integration API

Commands

The integration driver has to implement a handler for the entity_command message to process the following command requests within msg_data.cmd_id.

  • The command request must be acknowledged with a result response message.
  • Once the value has been set or confirmed by the physical device, an entity_change event message with the new value(s) must be sent.
cmd_idParametersDescription
on-Switch on the climate device.
off-Switch off the climate device.
hvac_modehvac_modeSet the device to heating, cooling, etc. See state.
target_temperaturetemperatureChange the target temperature
🚧 target_temperature_rangetemperature_high
temperature_low
🚧 fan_modeenum

Events

The entity_change event must be emitted by the integration driver if the state or an attribute of the climate device changes. Either after anentity_command or if the climate device has been updated externally through a user or another system. This keeps the remote in sync with the real state of the entity without the need of constant polling.

The following attributes are supported:

AttributeDescription
hvac_modeNew HVAC mode. See state.
current_temperatureCurrent temperature value.
target_temperatureChanged target temperature value.
🚧 target_temperature_highChanged high target temperature value.
🚧 target_temperature_lowChanged low target temperature value.
🚧 fan_modeChanged fan mode.

At least one attribute must be specified in the entity_change message. If the entity state and a climate attribute changed at the same time, they may both be included in the same message. It's also valid to always send every attribute.

Command examples

on

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "climate",
    "entity_id": "climate-1",
    "cmd_id": "on"
  }
}

off

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "climate",
    "entity_id": "climate-1",
    "cmd_id": "off"
  }
}

hvac_mode

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "climate",
    "entity_id": "climate-1",
    "cmd_id": "hvac_mode",
    "params": {
      "hvac_mode": "COOL"
    }
  }
}

Combined with target temperature

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "climate",
    "entity_id": "climate-1",
    "cmd_id": "hvac_mode",
    "params": {
      "hvac_mode": "COOL",
      "temperature": 23
    }
  }
}

target_temperature

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "climate",
    "entity_id": "climate-1",
    "cmd_id": "target_temperature",
    "params": {
      "temperature": 23
    }
  }
}

Event examples

State change event

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "msg_data": {
    "entity_type": "climate",
    "entity_id": "climate-1",
    "attributes": {
      "hvac_mode": "HEAT",
      "current_temperature": 19.5,
      "target_temperature": 21.0
    }
  }
}

Cover Entity

Entity for covering or opening things like blinds, window covers, curtains, etc. The entity features specify the abilities of the cover and the controllable properties, whereas the device class specifies the UI representation.

Features

NameRWDescription
openThe cover can can be opened.
closeThe cover can can be closed.
stopOpening, closing or setting the position can be stopped.
positionThe cover can be moved to a specific position, e.g. 30% open.
🚧 tiltThe cover supports being tilted up and down.
🚧 tilt_stopTilting the cover can be stopped.
🚧 tilt_positionThe cover can be moved to a specific tilt position.

🚧 Planned feature.

If no tilt* features are specified in the cover entity, the remote UI will not show the tilt support and the integration driver does not need to support the required tilt commands and events.

Attributes

AttributeFeaturesTypeValuesDescription
stateopen closeenumStatesDefault entity state attribute. Influenced by the cover commands.
stop
positionpositionint0..100Current position of the cover: 0 = closed, 100 = open.
open close0 / 100Position is set to min / max if the state reaches CLOSED / OPEN.
🚧 tilt_positiontilt_positionint0..100Current tilt position of the cover: 0 = no tilt, 100 = max tilt.
tilt_stop
tilt0 / 100Tilt position is set to min / max when tilted up or down.

States

The cover entity provides the following entity state values:

ValueDescription
OPENINGThe cover is in the process of opening. Either fully opened or to a set position.
OPENThe cover is in the open state.
CLOSINGThe cover is in the process of closing. Either fully closed or to a set position.
CLOSEDThe cover is in the closed state.

See common entity states.

Device classes

Optional cover type. This can be used by the UI to represent the cover with a different icon, behaviour etc.

NameDescription
blindWindow blinds or shutters which can be opened, closed or tilted.
curtainWindow curtain or drapes which can be opened or closed.
garageControllable garage door.
shadeSun shades which can be opened to protect an area from the sun.
🚧 doorControllable door which can be opened and closed.
🚧 gateControllable gate which can be opened and closed.
🚧 windowA window which can be opened, closed or tilted.

Options

None: the cover entity doesn't support additional options.

Integration API

Commands

The integration driver has to implement a handler for the entity_command message to process the following command requests in msg_data.cmd_id.

cmd_idParametersDescription
open-Open the cover.
close-Close the cover.
stop-Stop the current cover open, close or position operation.
positionpositionSet the cover to the given position.
🚧 tilttilt_positionTilt the cover to the given position.
🚧 tilt_up-Tilt the cover fully up.
🚧 tilt_down-Tilt the cover fully down.
🚧 tilt_stop-Stop current tilt operation.

Events

The entity_change event must be emitted by the integration driver if the state or an attribute of the cover changes.

The following attributes are supported:

AttributeDescription
stateNew entity state.
positionCurrent cover position value.
🚧 tilt_positionCurrent tilt position value.

At least one attribute must be specified in the entity_change message. If the entity state and a position attribute changed at the same time, they may both be included in the same message. It's also valid to always send every attribute.

Command examples

open

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "cover",
    "entity_id": "blind-1",
    "cmd_id": "open"
  }
}

close

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "cover",
    "entity_id": "blind-1",
    "cmd_id": "close"
  }
}

stop

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "cover",
    "entity_id": "blind-1",
    "cmd_id": "stop"
  }
}

position

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "cover",
    "entity_id": "blind-1",
    "cmd_id": "position",
    "params": {
      "position": 70
    }
  }
}

tilt

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "cover",
    "entity_id": "blind-1",
    "cmd_id": "tilt",
    "params": {
      "tilt_position": 45
    }
  }
}

tilt_down

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "cover",
    "entity_id": "blind-1",
    "cmd_id": "tilt_down"
  }
}

tilt_up

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "cover",
    "entity_id": "blind-1",
    "cmd_id": "tilt_up"
  }
}

tilt_stop

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "cover",
    "entity_id": "blind-1",
    "cmd_id": "tilt_stop"
  }
}

Event examples

State change event

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "msg_data": {
    "entity_type": "cover",
    "entity_id": "blind-1",
    "attributes": {
      "state": "OPENING",
      "position": 72
    }
  }
}

Cover position change event

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "msg_data": {
    "entity_type": "cover",
    "entity_id": "blind-1",
    "attributes": {
      "position": 72
    }
  }
}

Cover tilt position change event

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "msg_data": {
    "entity_type": "cover",
    "entity_id": "blind-1",
    "attributes": {
      "tilt_position": 50
    }
  }
}

Light Entity

A light entity can be switched on and off and depending on its features, the light source can be further controlled like setting brightness, hue, color saturation and color temperature.

The HSV color model is used for adjusting color and brightness.

Features

NameRWDescription
on_offDefault feature of a light source. Always present, even if not specified.
toggleToggle support. If there's no native support, the remote will use the current state of the light to send the corresponding on or off command.
dimLight source supports dimming.
colorThe color of the light source can be adjusted.
color_temperatureThe color temperature of the light source can be adjusted.

Attributes

AttributeFeaturesTypeValuesDescription
stateon_offenumStatesDefault entity state attribute. Influenced by the entity commands.
toggle
huecolorint0..360Color wheel: 0-360 degree
saturationcolorint0..255
brightnessdimint0..255
color_temperaturecolor_temperatureint0..100Color temperature percentage: a higher value means a warmer color. 0% = coldest, 100% = warmest.

States

The light entity provides the following entity state values:

ValueDescription
ONThe light is switched on.
OFFThe light is switched off.

See common entity states.

Device Classes

None.

Options

NameTypeValuesDefaultDescription
color_temperature_stepsnumber2..100100Number of color temperature steps of the light source. Some lamps only support 3 modes, where others can be adjusted freely.

Integration API

Commands

The integration driver has to implement a handler for the entity_command message to process the following command requests in msg_data.cmd_id.

cmd_idParametersDescription
on-Turn the light on. Optionally set brightness and color values:
brightness- dim the light to the given percentage value.
hue, saturation- adjust the color of the light.
color_temperature- adjust the color temperature.
off-Turn the light off.
toggle-Toggle the light from on -> off or from off -> on.

Events

The entity_change event must be emitted by the integration driver if the state or an attribute of the light changes.

The following attributes are supported:

AttributeDescription
stateNew entity state.
brightnessCurrent brightness.
hueCurrent hue value.
saturationCurrent saturation value.
color_temperatureCurrent color temperature. The possible values are influenced by color_temperature_steps. E.g. with 3 steps: [0, 50, 100]

Command examples

on

Default request:

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "light",
    "entity_id": "light-1",
    "cmd_id": "on"
  }
}

Request with setting brightness value:

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "light",
    "entity_id": "light-1",
    "cmd_id": "on",
    "params": {
      "brightness": 140
    }
  }
}

Request with setting color temperature:

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "light",
    "entity_id": "light-1",
    "cmd_id": "on",
    "params": {
      "color_temperature": 70
    }
  }
}

Request with setting light color:

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "light",
    "entity_id": "light-1",
    "cmd_id": "on",
    "params": {
      "hue": 180,
      "saturation": 200
    }
  }
}

off

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "light",
    "entity_id": "light-1",
    "cmd_id": "off"
  }
}

toggle

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "light",
    "entity_id": "light-1",
    "cmd_id": "toggle"
  }
}

Event examples

Switched on

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "msg_data": {
    "entity_type": "light",
    "entity_id": "light-1",
    "attributes": {
      "state": "ON"
    }
  }
}

The additional brightness and color attributes can be added as well:

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "msg_data": {
    "entity_type": "light",
    "entity_id": "light-1",
    "attributes": {
      "state": "ON",
      "brightness": 180,
      "hue": 180,
      "saturation": 150
    }
  }
}

Switched off

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "msg_data": {
    "entity_type": "light",
    "entity_id": "light-1",
    "attributes": {
      "state": "OFF"
    }
  }
}

Media Player Entity


A media player entity controls playback of media on a device. This could be an online music streaming service, a TV, a stereo or a video player.

Features

Media-player features define the capabilities of the controlled device. For example the dpad feature will enable the four directional commands and the enter command. Furthermore, certain features control the appearance and functionality of the media-player UI on the Remote Two.

NameRWDescription
on_offThe media player can be switched on and off.
toggleThe media player's power state can be toggled.
volumeThe volume level can be set to a specific level.
volume_up_downThe volume can be adjusted up (louder) and down.
mute_toggleThe mute state can be toggled.
muteThe volume can be muted.
unmuteThe volume can be un-muted.
play_pauseThe player supports starting and pausing media playback.
stopThe player supports stopping media playback.
nextThe player supports skipping to the next track.
previousThe player supports returning to the previous track.
fast_forwardThe player supports fast-forwarding the current track.
rewindThe player supports rewinding the current track.
repeatThe current track or playlist can be repeated.
shuffleThe player supports random playback / shuffling the current playlist.
seekThe player supports seeking the playback position.
media_durationThe player announces the duration of the current media being played.
media_positionThe player announces the current position of the media being played.
media_titleThe player announces the media title.
media_artistThe player announces the media artist.
media_albumThe player announces the media album if music is being played.
media_image_urlThe player provides an image url of the media being played.
media_typeThe player announces the type of media being played.
dpadDirectional pad navigation, provides up / down / left / right / enter commands.
numpadNumber pad, provides digit_0, .. , digit_9 commands.
homeHome navigation support with home & back commands.
menuMenu navigation support with menu & back commands.
context_menuContext menu (for example right clicking or long pressing an item).
guideProgram guide support with guide & back commands.
infoInformation popup / menu support with info & back commands.
color_buttonsColor button support for red / green / yellow / blue function commands.
channel_switcherChannel zapping support with channel up and down commands.
select_sourceMedia playback sources or inputs can be selected.
select_sound_modeSound modes can be selected, e.g. stereo or surround.
ejectThe media can be ejected, e.g. a slot-in CD or USB stick.
open_closeThe player supports opening and closing, e.g. a disc tray.
audio_trackThe player supports selecting or switching the audio track.
subtitleThe player supports selecting or switching subtitles.
recordThe player has recording capabilities with record, my_recordings, live commands
settingsThe player supports a settings menu.
  • R: readable
    • ✅ Feature has a readable attribute to retrieve the current or available values.
    • ❌ Feature value(s) cannot be read.
  • W: writeable
    • ✅ Feature has one or multiple commands to trigger an action or set a value.
    • ❌ No corresponding command(s), only the current value(s) of the feature can be read.

🚧 Planned features are playlist handling, media browsing and searching.

🧑‍💻 Integration driver developers:

  • If certain features or commands are missing for your device, they can be defined with "simple commands".
  • If a feature doesn't fully match your device, for example it only has a record function but no my_recordings or live functions, then the desired command(s) should also be defined as a "simple command".
    • For the command name use the corresponding cmd_id in uppercase to keep any command related automations.
      (This would be RECORD for the record-only feature example).

Attributes

Entity attributes are enabled by features and hold the current value of a feature or provide available options. Multiple features can act on the same attribute.

AttributeFeaturesTypeValuesDescription
stateon_offenumStatesState of the media player, influenced by the play and power commands.
toggle
play_pause, stop
volumevolumenumber0..100Current volume level.
volume_up_down
mutedmute_togglebooleanFlag if the volume is muted.
mute, unmute
media_durationmedia_durationnumberMedia duration in seconds.
media_positionmedia_positionnumberCurrent media position in seconds.
play_pause, stop
fast_forward, rewind, seek
media_position_updated_atmedia_positionstringdatetime (ISO 8601)Optional timestamp when media_position was last updated. Requires integration support.
media_typemedia_typeenumplatform specificThe type of media being played.
media_image_urlmedia_image_urlstringURL to retrieve the album art or an image representing what's being played.
play_pause
next, previous
media_titlemedia_titlestringCurrently playing media information.
play_pause
next, previous
media_artistmedia_artiststringCurrently playing media information.
play_pause
next, previous
media_albummedia_albumstringCurrently playing media information.
play_pause
next, previous
repeatrepeatenumOFF, ALL, ONECurrent repeat mode.
shuffleshufflebooleanShuffle mode on or off.
sourceselect_sourcestringCurrently selected media or input source.
source_listselect_sourcelisttext itemsAvailable media or input sources.
sound_modeselect_sound_modestringCurrently selected sound mode.
sound_mode_listselect_sound_modelisttext itemsAvailable sound modes.

States

The entity state attribute holds the following values:

ValueDescription
ONThe media player is switched on
OFFThe media player is switched off
PLAYINGThe media player is playing something
PAUSEDThe media player is paused
STANDBYThe device is in low power state and accepting commands
BUFFERINGThe media player is buffering to start playback

See also common entity states.

Device Classes

Optional: the media player can be classified what kind of device it represents. This can be used by the UI to represent the media player with a different icon, behaviour etc.

NameDescription
receiverAudio-video receiver.
set_top_boxSet-top box for multichannel video and media playback
speakerSmart speakers or stereo device.
streaming_boxDevice for media streaming services.
tvTelevision device.

Options

Optional features of the media-player entity.

NameTypeValuesDefaultDescription
simple_commandsarraystring[]Additional commands the media-player supports, which are not covered in the feature list. See simple commands.
Example: ["EXIT", "THUMBS_UP", "THUMBS_DOWN"]
volume_stepsnumber2..100100Number of available volume steps for the set volume command and UI controls.
Examples: 100 = any value between 0..100, 50 = only odd numbers, 3 = [33, 67, 100] etc. Value 0 = mute.
Note: if the integration receives an "unexpected" number it is required to round up or down to the next matching value.

Integration API

Commands

The integration driver has to implement a handler for the entity_command message to process the following command requests in msg_data.cmd_id.

cmd_idParametersDescription
on-Switch on media player.
off-Switch off media player.
toggle-Toggle the current power state, either from on -> off or from off -> on.
play_pause-Toggle play / pause.
stop-Stop playback.
previous-Go back to previous track.
next-Skip to next track.
fast_forward-Fast forward current track.
rewind-Rewind current track.
seekmedia_positionSeek to given position in current track. Position is given in seconds.
volumevolumeSet volume to given level.
volume_up-Increase volume.
volume_down-Decrease volume.
mute_toggle-Toggle mute state.
mute-Mute volume.
unmute-Unmute volume.
repeatrepeatRepeat track or playlist.
shuffleshuffleShuffle playlist or start random playback.
channel_up-Channel up.
channel_down-Channel down.
cursor_up-Directional pad up.
cursor_down-Directional pad down.
cursor_left-Directional pad left.
cursor_right-Directional pad right.
cursor_enter-Directional pad enter.
digit_0 - digit_9-Number pad digits 0..9.
function_red-Function red.
function_green-Function green.
function_yellow-Function yellow.
function_blue-Function blue.
home-Home menu
menu-Menu
context_menu-Context menu
guide-Program guide menu.
info-Information menu / what's playing.
back-Back / exit function for menu navigation (to exit menu, guide, info).
select_sourcesourceSelect an input source from the available sources.
select_sound_modemodeSelect a sound mode from the available modes.
record-Start, stop or open recording menu (device dependant).
my_recordings-Open recordings.
live-Switch to live view.
eject-Eject media.
open_close-Open or close.
audio_track-Switch or select audio track.
subtitle-Switch or select subtitle.
settings-Settings menu
🚧 search

Simple Commands

Additional commands can be enabled with the simple_commands options. A device exposing a media-player entity can support all additional device commands, not covered with the standard features, as so-called "simple commands". These commands are comparable with the infrared remote-entity commands, where keys trigger an action on the device:

  • The command is fully defined by its name and doesn't have any further arguments or related attributes.
  • Command names must be upper case and may not contain spaces.
    • The upper case restriction makes them distinguishable from the pre-defined feature commands.
    • Only a subset of the 7-bit ASCII printable characters are allowed: -/_.:+#*°@%()?
    • Maximum length is 20 characters.
    • Command name regex: ^[A-Z0-9\/_.:+#*°@%()?-]{1,20}$
  • 🚧 Simple commands cannot be translated yet. In the web-configurator they show up as defined.

Command Name Patterns

Even though command names can be freely defined with the allowed characters, the following prefixes should be used. This allows better integration into Remote Two, like default UI mappings and grouping of similar commands.

  • INPUT_: source inputs, e.g. INPUT_AUX1, INPUT_TV, INPUT_RADIO
  • APP_: applications, e.g. APP_MY_TV_STREAMING, APP_INTERNET
  • MODE_: mode changing functions, e.g. MODE_16/9, MODE_SURROUND, MODE_FOOTBALL
  • MENU_: additional menus, e.g. MENU_SMART_HOME, MENU_QUICK
  • DIGIT_: additional input digits besides the pre-defined numpad digits, e.g. DIGIT_10, DIGIT_10+
  • ZONE_: multi-room functions, e.g. ZONE_A, ZONE_MULTIROOM

Events

The entity_change event must be emitted by the integration driver if the state or an attribute of the media player changes.

The following attributes are supported:

AttributeDescription
stateNew entity state.
volumeCurrent volume.
mutedMute state.
media_positionCurrent playback position.
media_durationDuration of current media.
media_titleCurrent media title.
media_artistCurrent media artist.
media_albumCurrent media artist.
media_image_urlCurrent media image url, which will be resized for small and medium representations.
If the player already has multiple sizes it's recommended to use the _small, _med, _large attributes.
media_image_url_smallCurrent media image url for the small image.
media_image_url_mediumCurrent media image url for the medium size image.
media_image_url_largeCurrent media image url for the large image.
media_typeCurrent media type.
repeatCurrent repeat mode.
shuffleCurrent shuffle mode.
sourceSelected source.
source_listList of available media sources or inputs.
sound_modeSelected sound mode.
sound_mode_listAvailable sound modes.

At least one attribute must be specified in the entity_change message. If the entity state and another attribute changed at the same time, for example if a new track starts playing, they may both be included in the same message. It's also valid to always send every attribute.

Media types

The media_type attribute specifies the media being played:

  • MUSIC
  • RADIO
  • TVSHOW
  • MOVIE
  • VIDEO

The integration may return other values, but the UI will most likely handle them as an "unknown media".

Media images

  • Supported image formats: jpg and png.
  • The album art image can either be provided as a single image or as three matching image sizes.
    • Images will automatically be resized to the required sizes.
      Either from the single image in media_image_url or from the individual sizes.
    • Images too large in pixel or file size will be rejected due to resource constraints on the remote.
  • Preferred image sizes in pixel:
    • Large, for full screen album art: 420 x 420
    • Medium: 100 x 100
    • Small, for thumbnails: 60 x 60

Command examples

on

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "media_player",
    "entity_id": "media-1",
    "cmd_id": "on"
  }
}

play_pause

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "media_player",
    "entity_id": "media-1",
    "cmd_id": "play_pause"
  }
}

volume

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "media_player",
    "entity_id": "media-1",
    "cmd_id": "volume",
    "params": {
      "volume": 40
    }
  }
}

seek

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "media_player",
    "entity_id": "media-1",
    "cmd_id": "seek",
    "params": {
      "media_position": 180
    }
  }
}

repeat

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "media_player",
    "entity_id": "media-1",
    "cmd_id": "repeat",
    "params": {
      "repeat": "ALL"
    }
  }
}

shuffle

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "media_player",
    "entity_id": "media-1",
    "cmd_id": "shuffle",
    "params": {
      "shuffle": true
    }
  }
}

select_sound_mode

Specify a sound mode value contained in the sound_mode_list attribute array.

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "media_player",
    "entity_id": "media-1",
    "cmd_id": "select_sound_mode",
    "params": {
      "mode": "MOVIE"
    }
  }
}

Custom simple command

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "media_player",
    "entity_id": "media-1",
    "cmd_id": "THUMBS_UP"
  }
}

Event examples

State change event

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "msg_data": {
    "entity_type": "media_player",
    "entity_id": "media-1",
    "attributes": {
      "state": "PLAYING",
      "media_duration": 245,
      "media_position": 1,
      "media_position_updated_at": "2025-03-18T07:30:00.000Z",
      "media_title": "Some title",
      "media_artist": "My artist",
      "media_album": "Best of",
      "media_image_url_large": "http://192.168.1.100/player/current/album_l.png",
      "media_image_url_medium": "http://192.168.1.100/player/current/album_m.png",
      "media_image_url_small": "http://192.168.1.100/player/current/album_s.png"
    }
  }
}

Open issues and missing features

  • Define album art image limits
  • Define media types
  • Playlist handling
  • Media browsing
  • Searching

Remote Entity

A remote entity can send commands to a controllable device.

ℹ️ Supported in remote-core / Core Simulator from version 0.43.0.

Features

NameRWDescription
send_cmdDefault feature of a remote entity. Always present, even if not specified.
on_offRemote has on and off commands.
togglePower toggle support. If there's no native support, the remote will use the current state of the remote to send the corresponding on or off command.
  • R: readable
    • ✅ Feature has a readable attribute to retrieve the current or available values.
    • ❌ Feature value(s) cannot be read.
  • W: writeable
    • ✅ Feature has one or multiple commands to trigger an action or set a value.
    • ❌ No corresponding command(s), only the current value(s) of the feature can be read.

Attributes

Entity attributes are controlled by features. Multiple features can act on the same attribute. See Events on how to notify the remote about an updated attribute. The attributes have to be listed as properties under attributes with their current value.

AttributeFeaturesTypeValuesDescription
stateon_offenumStatesState of the controlled device, it's either on or off.
toggleToggle inverts the current state. If the driver doesn't provide the toggle feature, the remote uses the current value and calls on or off.

States

The remote entity provides the following entity state values:

ValueDescription
ONThe controlled device is on.
OFFThe controlled device is off.

See common entity states.

Device classes

None.

Options

Optional features of the remote entity.

NameTypeValuesDefaultDescription
simple_commandsarraystring(20)[]Optional list of supported commands. If not provided, the integration driver has to document the available commands for the user.
button_mappingarrayDeviceButtonMapping[]Optional command mapping for the physical buttons.
user_interfaceobjectUserInterface{}Optional user interface definition for the supported commands.

If the available commands are known by the integration driver, they should be made available in the simple_commands option. This allows the Remote Two configuration in the web-configurator to show all supported commands to the user. Otherwise, the user has to know the command names and has to enter them manually for each command.

If button_mapping or user_interface options are not provided, an automatic mapping is attempted based on the command names in simple_commands. The mapping logic is similar to the infrared codesets in the internal IR-remotes. See Command name patterns below on how commands should be named.

The automatic button and user interface creation is only done once at the initial entity configuration. From that point on the user can independently modify the UI and button mapping. Only changes in the simple_commands list will be applied to the configured entities in Remote Two, if the available entities are reloaded from the integration driver.

Simple commands

A simple command is fully defined by its name and doesn't have any further arguments or related attributes. It's comparable to the simple commands in the media-player entity, with fewer naming restrictions.

Restrictions:

  • A command name may not include whitespace characters.
  • The maximum length of a command name is 20 characters.
  • A command name may not be any of the defined cmd_id commands: on, off, toggle, send_cmd, send_cmd_sequence.
  • Commands cannot have any further parameters. For example, it's not possible to have a switch_channel command with the channel number as parameter.

Command naming recommendations:

  • Command names should be short and follow naming patterns.
  • Uppercase naming is preferred.
  • Dedicated power on/off or toggle commands should not be added. Use the on_off and toggle features with the defined on, off and toggle commands.

Command Name Patterns

Even though command names can be freely defined, it's highly recommended to follow a naming pattern and use the recommended names for common commands. This allows better integration into Remote Two, like default UI mappings and grouping of similar commands.

  • Navigation: CURSOR_UP, CURSOR_DOWN, CURSOR_LEFT, CURSOR_RIGHT, CURSOR_ENTER, BACK, EXIT
  • Menus: HOME, MENU, CONTEXT_MENU, GUIDE, INFO, SETTINGS
  • Volume control: VOLUME_UP, VOLUME_DOWN, MUTE_TOGGLE, MUTE, UNMUTE
  • Media playback: PLAY_PAUSE, STOP, PREVIOUS, NEXT, FAST_FORWARD, REWIND

See media-player entity commands for further commands.

Prefixes for other common functions:

  • INPUT_: source inputs, e.g. INPUT_AUX1, INPUT_TV, INPUT_RADIO
  • APP_: applications, e.g. APP_MY_TV_STREAMING, APP_INTERNET
  • MODE_: mode changing functions, e.g. MODE_16/9, MODE_SURROUND, MODE_FOOTBALL
  • MENU_: additional menus, e.g. MENU_SMART_HOME, MENU_QUICK
  • DIGIT_: additional input digits besides the pre-defined numpad digits, e.g. DIGIT_10, DIGIT_10+
  • ZONE_: multi-room functions, e.g. ZONE_A, ZONE_MULTIROOM

Button mapping

A default button mapping can be provided in options.button_mapping.

The DeviceButtonMapping object is defined in the Integration-API and is based on the same definition in the Core-API.

Example of entity.options object:

{
  "simple_commands": [
    "VOLUME_UP",
    "VOLUME_DOWN",
    "HOME",
    "CURSOR_UP",
    "CURSOR_DOWN",
    "CURSOR_LEFT",
    "CURSOR_RIGHT",
    "CURSOR_ENTER"
  ],
  "button_mapping": [
    {
      "button": "POWER",
      "short_press": {
        "cmd_id": "remote.toggle"
      }
    },
    {
      "button": "RED",
      "short_press": {
        "cmd_id": "remote.send_cmd",
        "params": {
          "command": "VOLUME_DOWN",
          "repeat": 10
        }
      }
    },
    {
      "button": "DPAD_UP",
      "short_press": {
        "cmd_id": "CURSOR_UP"
      }
    },
    {
      "button": "DPAD_MIDDLE",
      "short_press": {
        "cmd_id": "CURSOR_ENTER"
      },
      "long_press": {
        "cmd_id": "MENU"
      }
    },
    {
      "button": "DPAD_DOWN",
      "short_press": {
        "cmd_id": "CURSOR_DOWN"
      }
    },
    {
      "button": "BLUE",
      "short_press": {
        "cmd_id": "remote.send_cmd_sequence",
        "params": {
          "sequence": "HOME,CURSOR_DOWN,CURSOR_RIGHT,CURSOR_ENTER",
          "delay": 200
        }
      }
    }
  ]
}

See Commands about entity commands and their short vs fully qualified syntax. For example on and off vs remote.on and remote.off.

Button identifiers for Remote Two:

  • BACK
  • HOME
  • VOICE
  • VOLUME_UP, VOLUME_DOWN, MUTE
  • DPAD_UP, DPAD_DOWN, DPAD_LEFT, DPAD_RIGHT, DPAD_MIDDLE
  • GREEN, YELLOW, RED, BLUE
  • CHANNEL_UP, CHANNEL_DOWN
  • PREV, PLAY, NEXT
  • POWER

A detailed button mapping can be retrieved with the Core-API: GET /api/cfg/device/button_layout.

User interface

A default user interface can be provided in options.user_interface.

The UserInterface object is defined in the Integration-API and is based on the Core-API ActivityUserInterface definition.

UI page example

ui-page-media.png

entity.options object:

{
  "simple_commands": [
    "MY_RECORDINGS",
    "MY_APPS",
    "REVERSE",
    "PLAY",
    "PAUSE",
    "FORWARD",
    "RECORD"
  ],
  "user_interface": {
    "pages": [
      {
        "page_id": "media",
        "name": "Media",
        "grid": { "width": 4, "height": 6 },
        "items": [
          {
            "type": "text",
            "text": "Recordings",
            "command": {
              "cmd_id": "MY_RECORDINGS"
            },
            "location": { "x": 0, "y": 2 },
            "size": { "width": 2, "height": 1 }
          },
          {
            "type": "text",
            "text": "Apps",
            "command": {
              "cmd_id": "MY_APPS"
            },
            "location": { "x": 2, "y": 2 },
            "size": { "width": 2, "height": 1 }
          },
          {
            "type": "icon",
            "icon": "uc:bw",
            "command": {
              "cmd_id": "REVERSE"
            },
            "location": { "x": 0, "y": 5 }
          },
          {
            "type": "icon",
            "icon": "uc:play",
            "command": {
              "cmd_id": "PLAY"
            },
            "location": { "x": 1, "y": 5 }
          },
          {
            "type": "icon",
            "icon": "uc:pause",
            "command": {
              "cmd_id": "PAUSE"
            },
            "location": { "x": 2, "y": 5 }
          },
          {
            "type": "icon",
            "icon": "uc:ff",
            "command": {
              "cmd_id": "FORWARD"
            },
            "location": { "x": 3, "y": 5 }
          },
          {
            "type": "icon",
            "icon": "uc:rec",
            "command": {
              "cmd_id": "RECORD"
            },
            "location": { "x": 2, "y": 4 }
          }
        ]
      }
    ]
  }
}

Screen grid sizes for Remote Two:

  • Minimal size: 1 x 1
  • Maximum size: 8 x 12
  • Default: 4 x 6

The screen layout grid definition can be retrieved with the Core-API: GET /api/cfg/device/screen_layout.

Integration API

Commands

The integration driver has to implement a handler for the entity_command WebSocket message to process the following command requests in msg_data.cmd_id. See Command examples and Integration-API for the full message structure.

cmd_idParametersTypeDescription
on-Send the on-command to the controlled device.
off-Send the off-command.
toggle-Toggle the power state of the controlled device, either from on -> off or from off -> on.
send_cmdcommandString(20)A single command.
repeatNumberOptional: how many times the command shall be repeated. Defaults to 1 if not specified.
delayNumberOptional: delay in milliseconds between repeated commands.
holdNumberOptional: time in milliseconds before a command is released. Defaults to 0 if not specified.
send_cmd_sequencesequenceString arrayCommand list. Same defaults are used as for the send_cmd command.
repeatNumberOptional: how many times each command shall be repeated.
delayNumberOptional: delay in milliseconds between commands.
holdNumberOptional: time in milliseconds before each command is released.
  • The command and sequence parameters will either contain a simple command (if specified in entity options) or a freetext command. It is up to the integration driver to verify and validate commands.
  • A command name may not include whitespace characters.
  • The maximum length of a command name is 20 characters.
  • A command name may not be any of the defined cmd_id commands: on, off, toggle, send_cmd, send_cmd_sequence
  • If no delay parameter is included, the integration driver has to choose an appropriate delay based on the command and controlled device.

Using commands for button mappings and UI elements

‼️ Attention: the cmd_id for button mapping and UI item commands is slightly different than the remote-entity Commands!

  • Core-API button mapping and UI item commands:
    • The cmd_id value is either a simple command or an entity command with the entity type prefix.
  • Integration-API entity commands:
    • The cmd_id value refers to the defined Commands without the entity type prefix.
    • A simple command will always be wrapped into the remote-entity command send_cmd.

When defining commands in button mappings or UI elements, either entity commands or simple commands can be used.

  • Entity commands are all the commands an entity defines (see cmd_id column in Commands above). Example:
{
  "cmd_id": "toggle"
}
  • If the integration driver provides the simple_commands option, the specified commands can be directly used in cmd_id. Example:
{
  "cmd_id": "PLAY"
}
  • Specified simple commands can also be used in the send_cmd entity command.
  • The command parameter of send_cmd allows any command name ("free-text") and it's up to the integration driver to validate the received commands.
    Example of a simple command used in send_cmd:
{
  "cmd_id": "send_cmd",
  "params": {
    "command": "PLAY"
  }
}
  • If an entity command is used it's recommended to prefix it with the entity type to use the same naming convention as in the Core-API.
    • Using the fully qualified command name might make it easier in the integration driver to distinguish the commands.
    • A missing entity type prefix is automatically added when an available remote-entity is configured in Remote Two.
    • When working with the Core-API, for example reconfiguring a button mapping, the fully qualified command name is required.

Recommended fully-qualified entity command name:

{
  "cmd_id": "remote.send_cmd",
  "params": {
    "command": "PLAY"
  }
}

Events

The entity_change event must be emitted by the integration driver if the state or an attribute of the remote device changes.

The following attributes must be included:

AttributeDescription
stateNew entity state.

Command examples

Remote-entity examples of received entity_command WebSocket messages in an integration driver.

on

{
  "kind": "req",
  "id": 124,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "remote",
    "entity_id": "remote-1",
    "cmd_id": "on"
  }
}

off

{
  "kind": "req",
  "id": 124,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "remote",
    "entity_id": "remote-1",
    "cmd_id": "off"
  }
}

toggle

{
  "kind": "req",
  "id": 124,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "remote",
    "entity_id": "remote-1",
    "cmd_id": "toggle"
  }
}

send command

{
  "kind": "req",
  "id": 124,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "remote",
    "entity_id": "remote-1",
    "cmd_id": "send_cmd",
    "params": {
      "command": "DPAD_UP"
    }
  }
}

send long-press command

{
  "kind": "req",
  "id": 124,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "remote",
    "entity_id": "remote-1",
    "cmd_id": "send_cmd",
    "params": {
      "command": "CURSOR_ENTER",
      "hold": 800
    }
  }
}

send repeated command

{
  "kind": "req",
  "id": 124,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "remote",
    "entity_id": "remote-1",
    "cmd_id": "send_cmd",
    "params": {
      "command": "VOLUME_DOWN",
      "repeat": 5
    }
  }
}

send sequence

{
  "kind": "req",
  "id": 124,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "remote",
    "entity_id": "remote-1",
    "cmd_id": "send_cmd_sequence",
    "params": {
      "sequence": ["1", "2", "3", "ENTER"],
      "delay": 100
    }
  }
}

Event examples

device was turned on

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "msg_data": {
    "entity_type": "remote",
    "entity_id": "remote-1",
    "attributes": {
      "state": "on"
    }
  }
}

device was turned off

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "msg_data": {
    "entity_type": "remote",
    "entity_id": "remote-1",
    "attributes": {
      "state": "off"
    }
  }
}

Sensor Entity

A sensor entity provides measured values from devices or dedicated hardware sensors.
The device class specifies the type of sensor and links it with a default unit of measurement to display in the user interface.

  • The custom device class allows arbitrary text values and unit labels.
  • The temperature device class performs automatic conversion between °C and °F.

Features

The sensor entity has no features.

Attributes

AttributeTypeValuesDescription
stateenumStatesOptional state of the sensor.
valuenumber / stringThe native measurement value of the sensor.
unitstringOptional unit of the value if no default unit is set.

The unit attribute can be specified in the entity_change event and takes precedence over the associated default unit in the device_class or the specified custom_unit in the options.

If an integration driver gets the current unit from an external system together with the current value, it's recommended to pass it on.
If the integration driver is in control of the unit, and it can't change at runtime, the unit can be specified in the available entity definition as options.custom_unit and then omitted in entity_change events.

States

The state attribute is optional for a sensor.

The sensor entity only supports the ON state and the common entity states.

ValueDescription
ONThe sensor is available and providing measurements.

Device Classes

The device class specifies the type of sensor. Default if not specified: custom.

NameDefault unitDescription
customGeneric sensor with custom unit
battery%Battery charge in %
currentAElectrical current in ampere
energykWhEnergy in kilowatt-hour
humidity%Humidity in %
powerWPower in watt or kilowatt
temperature°CTemperature with automatic °C, °F conversion, depending on remote settings. Use native_unit option if the temperature is measured in °F.
voltageVVoltage in volt
binaryBinary sensor. The binary specific device class is stored in the unit attribute.

Binary Device Class

The binary device class allows specifying a binary sensor with two states in the value attribute: on and off.

These values can mean different things depending on the unit attribute. For example, a binary sensor with the unit attribute set to sound: on means sound detected and off means no sound detected. For unit set to window: on means the window is open and off means the window is closed.

If the unit attribute is not specified, the binary sensor is a generic on/off sensor.

🚧 Supported unit values are the Home Assistant binary sensor device classes: https://www.home-assistant.io/integrations/binary_sensor/#device-class

Options

NameTypeDefaultDescription
custom_unittextUnit label for a custom sensor if device_class is not specified or to override a default unit.
native_unittextThe sensor's native unit of measurement to perform automatic conversion. Applicable to device classes: temperature.
decimalsnumber0Number of decimal places to show in the UI if the sensor provides the measurement as a number. Not applicable to string values.
🚧 min_valuenumberOptional minimum value of the sensor output. This can be used in the UI for graphs or gauges.
🚧 max_valuenumberOptional maximum value of the sensor output. This can be used in the UI for graphs or gauges.

Integration API

Commands

The sensor entity doesn't support any commands.

Events

The entity_change event must be emitted by the integration driver if the state or an attribute of a sensor changes.

The following attributes are supported:

AttributeDescription
stateOptional entity state.
valueThe current sensor value.
unitOptional: the unit of measurement for the given value. If omitted, the configured entity unit is used.
  • At least one attribute must be specified in the entity_change message.
    • If the sensor value and unit attributes change at the same time, both must be included in the same message.
    • It's also valid to always send every attribute.
  • Only sending the unit attribute is not valid.
  • If the state is never sent, the sensor is considered available (ON).

Event Examples

State Change Event

Sensor with a number value:

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "msg_data": {
    "entity_type": "sensor",
    "entity_id": "sensor-1",
    "attributes": {
      "value": 21.2,
      "unit": "°C"
    }
  }
}

Sensor with a string value:

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "msg_data": {
    "entity_type": "sensor",
    "entity_id": "sensor-2",
    "attributes": {
      "value": "231",
      "unit": "V"
    }
  }
}

Sensor coming online with the current value:

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "msg_data": {
    "entity_type": "sensor",
    "entity_id": "sensor-1",
    "attributes": {
      "state": "ON",
      "value": 21.5,
      "unit": "°C"
    }
  }
}

Binary sensor event:

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "msg_data": {
    "entity_type": "sensor",
    "entity_id": "sensor-bin1",
    "attributes": {
      "state": "ON",
      "value": "off",
      "unit": "running"
    }
  }
}

IR-emitter Entity

An IR-emitter entity allows to send IR commands in PRONTO hex format.

This entity allows to integrate external IR blasters and emitters. Once added to a Remote, a new IR-emitter output is registered which can be used for IR-remote entities. Similar as adding a new dock.

An IR-emitter device must support the PRONTO hex format. Other IR formats are optional. Currently only the IR protocols and data values of the IRremoteESP8266 library are supported as additional format (see options below for more information).

ℹ️ Supported in UC Remote firmware from version 1.9.3, Core Simulator from version 0.48.0.

Features

NameRWDescription
send_irDefault feature of an IR-emitter entity. Always present, even if not specified.
🚧 learn_irPlanned feature: IR-emitter is also capable of learning IR codes.
  • R: readable
    • ✅ Feature has a readable attribute to retrieve the current or available values.
    • ❌ Feature value(s) cannot be read.
  • W: writeable
    • ✅ Feature has one or multiple commands to trigger an action or set a value.
    • ❌ No corresponding command(s), only the current value(s) of the feature can be read.

Attributes

Entity attributes are controlled by features. Multiple features can act on the same attribute.

AttributeFeaturesTypeValuesDescription
stateenumStatesState of the IR-emitter

States

The IR-emitter entity only supports the ON state and the common entity states.

ValueDescription
ONThe emitter is available and ready to send.

Device Classes

None.

Options

Optional features of the IR-emitter entity.

NameTypeValuesDefaultDescription
portsarrayEmitterPort[]List of individual emitter ports which can be selected for sending IR commands.
ir_formatsarrayHEX[]Supported IR formats / protocols besides PRONTO.
  • The ports option can be omitted, if the emitter only supports a single output port.
    EmitterPort format:

    {
      "id": "unique-id",
      "name": "Friendly port name"
    }
    
  • The PRONTO hex format is the default and must be supported by the IR-emitter driver.

  • The HEX IR format refers to the learned IR codes with the Unfolded Circle Dock.

    • Format: <protocol>;<hex-ir-code>;<bits>;<repeat-count> from the IRremoteESP8266 library.
    • protocol: numeric value from supported and enabled protocols. See: decode_type_t
    • hex-ir-code: HEX value prefixed with 0x.
    • bits: number of bits in hex value.
    • repeat-count: number of repeats.
  • Specifying additional formats like HEX allows the Remote to send these formats when available, e.g. learned codes from the dock. It does not mean, that all codes are transformed into this format!

  • If the emitter device doesn't support the HEX format, the learned codes from the dock are automatically converted and sent as PRONTO codes.

    • ⚠️ The PRONTO-conversion is a best effort process only and certain IR protocols might lose the native auto-repeat functionality!
  • ℹ️ Raw and Global Caché sendir formats are planned in the future.

Integration API

Commands

The integration driver has to implement a handler for the entity_command message to process the following command requests in msg_data.cmd_id.

cmd_idParametersTypeDescription
send_irSend an IR code on the specified output port and number of repeats.
codeStringIR code to send.
formatStringOptional IR format of code if the emitter supports multiple IR formats. Defaults to PRONTO if not specified.
portStringOptional: output port identifier. Only required if the emitter supports multiple outputs.
repeatNumberOptional: how many times the command shall be repeated. Defaults to 1 if not specified (single command without repeat).
stop_irStop sending any active IR transmission on the specified port.
portStringOptional: output port identifier. Only required if the emitter supports multiple outputs.
🚧 start_learn
🚧 stop_learn

send_ir

The send_ir command is used to send an IR code on the specified output port.

Long button presses on the Remote will trigger continuous send_ir requests with a repeat count set to 3 or higher. Once the button is released, a stop_ir request is sent. This allows to implement a continuous IR repeat feature:

  • If no transmission is active: start sending the IR command.
  • If transmission is active:
    1. check if the same IR code is being transmitted. If other code: abort and respond with error code 409.
    2. reset repeat count of the active transmission to prolong the command.

Queuing IR send requests should be avoided to prevent "ghost actions" when the user doesn't expect it. New IR commands should be executed within 1 second.

ℹ️ The HEX format already contains a repeat field. This value is relevant, if the send_ir.repeat parameter is not set. For continuous IR repeat, the send_ir.repeat parameter is set and overrides the embedded repeat field in the IR code.

stop_ir

The stop_ir command signals to stop an active IR transmission on the specified output port.

The IR transmission should be stopped no later than at the start of the next repeat sequence. (This also depends on the IR protocol, some have a specific repeat sequence, others need to be fully retransmitted).

Events

The entity_change event must be emitted by the integration driver if the state or an attribute of the IR-emitter changes.

The following attributes must be included:

AttributeDescription
stateNew entity state.

Command examples

IR-emitter entity examples of received entity_command WebSocket messages in an integration driver.

send_ir with PRONTO code on default output

Sending a single PRONTO code (without repeat) on an IR-emitter with only one output port (options.ports not specified or empty):

{
  "kind": "req",
  "id": 122,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "ir_emitter",
    "entity_id": "emitter-1",
    "cmd_id": "send_ir",
    "params": {
      "code": "0000 006D 0004 0002 0155 00AB 0015 0015 0015 0015 0015 0015 0155 0055 0015 0E4C"
    }
  }
}

send_ir with PRONTO code on specific output and repeat

Sending a PRONTO code three times on a specific output port:

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "ir_emitter",
    "entity_id": "emitter-2",
    "cmd_id": "send_ir",
    "params": {
      "code": "0000 006D 0004 0002 0155 00AB 0015 0015 0015 0015 0015 0015 0155 0055 0015 0E4C",
      "port": "port1",
      "repeat": 3
    }
  }
}

stop_ir

Stop an active IR transmission on a specific output port:

{
  "kind": "req",
  "id": 124,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "ir_emitter",
    "entity_id": "emitter-2",
    "cmd_id": "stop_ir",
    "params": {
      "port": "port1"
    }
  }
}

Event examples

State change event

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "msg_data": {
    "entity_type": "ir_emitter",
    "entity_id": "emitter-1",
    "attributes": {
      "state": "on"
    }
  }
}

Integration Drivers

Since we are providing an API and not an SDK for a specific programming language, one can develop external integrations in any language which is capable running a WebSockets server and handling JSON data.

The downside of an API is that more low-level coding is required. In our case this involves running a WebSocket server, handling the connections from the Remote device, and parsing the JSON payload in the WebSocket text messages. However, once this is done, the required API message interactions are rather simple to handle.

See examples below for integration libraries and existing open source integrations.

WebSocket Integration API

The Unfolded Circle WebSocket Integration-API allows writing device integration drivers for the Unfolded Circle Remotes.

The API specification is defined with AsyncAPI in YAML format. The WebSocket communication is using text messages with JSON payload.

Examples

Node.js

Integrations using the Node.js API wrapper:

Python

Integrations using the Python API wrapper:

Rust

How to write an integration driver

The Integration-API allows to develop external integration drivers in any programming language capable of running a WebSockets server. Custom integration drivers require Node.js or a statically linked binary.

  • External integration driver: a driver running on an external device, reachable by the Remote.
  • Custom integration driver: a driver running on the Remote in a restricted, sandboxed environment.

ℹ️ Beta release 1.9.0 allows to install custom integration drivers on the Remote.
This is a developer preview feature to test integrations. See Driver installation on the Remote for more information.

ℹ️ See NodeJS API wrapper for a quick start in JavaScript, or the Python API wrapper if using Python.

When writing a driver from scratch without using a wrapper library:

  1. Choose your programming language.
  2. Choose a WebSockets server library or framework for your language.
  3. Choose a JSON framework for your language.
  4. Choose which entities and features the driver should expose.
  5. Implement the required WebSockets text messages in the WebSocket Integration API.

❗️ Using a wrapper library or one of the existing open source drivers as a start will greatly simplify driver development. Node.js should be preferred when developing a custom integration driver.

Integration Driver Types

The API defines two different driver types: a simple single-device driver or a multi-device instance driver.

⚠️ Only the single device instance driver is supported. The multi-device driver type will most likely not be implemented in the near future!

Single Device Instance Driver

The single-device instance driver is the default and easiest driver to develop:

  • There is no concept of different or individual devices, just entities that the driver provides.
  • The driver offers a list of available entities to the remote. This can be a single media player entity, or a large list of different entities from a home automation hub.
  • The optional device_id property must be omitted in all messages.
  • The driver may still control multiple physical devices, but from the Remote's point of view, these are just different entities provided from the same integration driver.

E.g. if smart WiFi light bulbs can be discovered by the driver and then each bulb can be provided as a light entity to the remote.

Authentication

⚠️ Custom integrations running on the remote do not support authentication.

An external integration driver can choose if the Remote Two requires authentication or not to connect to the driver.
Supported are header based token authentication during connection setup or with an application level message after the connection has been established.

See WebSocket authentication for more information.

Connection Handling

  • Support multiple Remote sessions
    • An external driver should support multiple, independent WebSocket connections at the same time.
  • Keep alive
    • The driver must support WebSocket Ping Pong control frames.
      Please check your WebSocket library, most libraries support this out of the box.
    • The Remote Two continuously sends ping frames and automatically closes the connection if it doesn't receive a pong within a certain time frame. The driver may also send ping frames to check if the connection is still alive.

Driver Registration

⚠️ Custom integrations running on the remote are automatically registered during installation.

An external integration driver should advertise itself over mDNS for auto-discovery and allow user configuration with the web-configurator. See mDNS advertisement for more information.

An external integration driver can optionally register itself at a remote and provide its authentication token.

See driver registration for more information.

Discover Remote Two Devices

The Remote Two can be discovered with DNS-SD. It announces itself with service type _uc-remote._tcp.

See remote DNS-SD lookup for more information.

JSON Messages

Message Format

  • Only WebSockets Text message are supported at the moment.
    Binary support might be added in the future.
  • All messages are serialized in JSON format.
  • Text encoding is UTF-8.
  • The application level protocol defines two message interactions with three different message types:
    • Request / response messages
    • Event messages

Request Messages

  • A request message is of kind req.
  • Every request message must include a unique id value, which must be increased for every new request.
  • The request message type is specified in property msg.
  • An optional msg_data object holds the request specific data.
  • A request message is usually answered by a response message if not otherwise stated in the documentation.
    Exceptions are event responses, e.g. if the event can be triggered independently of the request message.

Example of a request message:

{
  "kind": "req",
  "id": 123,
  "msg": "entity_command",
  "msg_data": {
    "entity_type": "button",
    "entity_id": "button-1",
    "cmd_id": "push"
  }
}

Response Messages

  • A response message is of kind resp.
  • The corresponding id of the request message is given in property req_id.
  • The response message type is specified in property msg.
  • The status of the request operation is given in code.
  • The msg_data object holds the response specific data.

Example of a response message:

{
  "kind": "resp",
  "req_id": 11,
  "msg": "available_entities",
  "code": 200,
  "msg_data": {
    "available_entities": [
      {
        "entity_id": "button-1",
        "entity_type": "button",
        "name": {
          "en": "Ring dinner bell"
        }
      }
    ]
  }
}

Event Messages

  • An event message is of kind event.
  • The event type is specified in property msg.
  • The optional cat property denotes the event category.
  • The optional ts property holds the timestamp when the event occurred.
  • The msg_data object holds the event specific data.

Example of an event message:

{
  "kind": "event",
  "msg": "entity_change",
  "cat": "ENTITY",
  "ts": "2021-04-24T14:15:22Z",
  "msg_data": {
    "entity_type": "cover",
    "entity_id": "blind-1",
    "attributes": {
      "position": 72
    }
  }
}

Required Messages

For a functioning integration driver not all defined messages and optional features in the integration API have to be implemented. The mandatory messages are tagged with a pizza 🍕 emoji in the WebSocket Integration AsyncAPI definition.

Required request messages which must be processed and answered by a driver:

RequestResponseDescription
get_driver_versiondriver_versionGet version information about the integration driver.
get_device_statedevice_stateGet the current device state.
This informs the Remote Two if the device is ready or not available.
get_available_entitiesavailable_entitiesRetrieve the available entities from the integration driver.
subscribe_eventsresultSubscribe to entity state change events.
This instructs the driver to send entity state changes for specific entities.
get_entity_statesentity_statesGet the current state of the entities.
This provides the Remote Two the current entity properties.
entity_commandresultInstructs the driver to execute an entity command.
This sets entity properties from user interactions.

Required event messages which must be sent by the driver:

EventDescription
entity_changeEmitted when an attribute of an entity changes.
device_stateEmitted when the device state changes.

Common Message Flow

The basic message flow between an integration and the remote is as follows:

  • The integration driver acts as server and the Remote Two initiates the connection.
  • After the WebSocket connection is established to the integration driver, the remote subscribes to events of all configured entities.
  • Whenever the state of the integration driver changes, the driver sends a device state event.
    This is usually the device which the driver represents or connects / communicates with. E.g. a smart device, home automation hub, cloud service, etc.
  • Whenever an entity attribute of a subscribed entity changes, the driver sends an entity state event.
  • The remote announces when it goes into and out of standby, so the integration driver can act accordingly.
    Note: the WebSocket connection might get disconnected during remote standby!

Establish Connection

sequenceDiagram
    participant I as Integration
    participant R as Remote

    R-)+R:     create integration driver session

    critical Establish WS connection
      R-)+I:     connect         
      alt header token
        I->>I:    authentication & version check etc
        I--)R:    authentication (OK)
      else message based auth
        I--)R:    auth_required
        R-)I:   auth
        I--)R:    authentication (OK)
      end
      Note over I,R: Authenticated WS session
      R-)R:    wait for messages
      Note over I,R: Message exchange until disconnected
      R-->-I:     disconnect
    option Authentication timeout
      R-->I:     disconnect
    option Credentials rejected
      I--)R:    authentication (401)
      R-->I:     disconnect
    end
    

Integration Driver Setup

See driver setup.

Integration Instance Configuration

After the driver has been registered and configured, the provided entities can be configured in the Remote Two.

This consists of requesting all available entities from the driver and subscribing to entity events of the chosen entities by the user.

  • The subscribe_events message is only sent for entities which are configured in the Remote. I.e. only for entities which are used in a profile and placed on a page or group.
  • For simplicity reasons the driver may choose to always send events for all entities. The Remote will ignore unnecessary events. However, it's recommended to limit the message exchange to entities which are actually used to save network & processing resources.
  • The configured entities from the user(s) are stored in the remote-core application.
    Whenever the Remote (re)connects to the driver, only those entity identifiers are submitted in the subscribe_events message.
  • The driver can use the get_version message to retrieve version and model information of the Remote.
  • The driver can use the get_localization_cfg message to retrieve localization information from the remote if it deals with localized labels, values etc.
sequenceDiagram
    participant D as Device(s)
    participant I as Integration
    participant R as Remote
    participant U as UI
    participant C as configurator
    actor User

    User->>+C: setup new integration
    C->>-R:  enable integration instance

    critical Establish a connection. See normal operation.
        R-)I: connect
    end

    R-)+I:   get_driver_version
    I--)-R:  driver_version
    
    C-)+R:   get_available_entities(integration)
    R-)-I:   get_available_entities
    I--)+R:  available_entities 
    R->>R:   cache entities
    R--)-C:  available entities

    loop
        User->>+C: configure entity 
        C-)+R:   add entity
        R->>R:   store entity cfg
        R-)-I:   subscribe_events
    end

Normal Operation

During normal operation there are only a few different message exchanged between the Remote and the integration driver:

  • authentication: sent by the driver after WebSocket connection is established
  • subscribe_events: sent by the Remote after the WebSocket connection is authenticated
  • entity_command: instruct the driver to perform an action on an entity
  • entity_change: inform the Remote that an entity changed
  • get_device_state: request the device state from the driver
  • get_entity_states: request the current entity attributes and states
sequenceDiagram
    participant D as Device(s)
    participant I as Integration
    participant R as Remote
    participant U as UI
    actor User

    R->>R:  startup: lookup enabled integration

    R-)+I:  [WS connection] 
    I->>I:  authentication & version check etc
    I--)-R:  authentication

    R-)+I:  connect
    loop until connected
      opt
          I-->>D:  connect / initialize
      end
      I--)-R:  device_state
    end

    opt
        I-)+R:  get_version
        R--)-I: version

        I-)+R:  get_localization_cfg
        R--)-I: localization_cfg
    end
    

    R-)I:   subscribe_events

    R-)I:   get_entity_states

    D-->>I:  external state change
    I--)+R:  entity_change 
    R->>R:   store event
    R-)+U:   entity change event
    opt
        U-)-R:   get entity
        R--)-U:  entity
    end

    User->>+U: interact with entity
    U-)-R:     entity action
    R-)+I:     entity_command
    opt
        I-->>D:  update
    end
    I--)-R:    result

    opt
        D-->>+I:  state change
    end
    I-)-R:   entity_change
    R->>+R:  store event
    R-)-U:   entity change event

    R-)I:    enter_standby
    R-)I:    exit_standby
    R-)+I:   get_device_state
    I--)-R:  device_state
    R-)+I:   get_entity_states
    I--)-R:  entity_states
    R-)I:    [disconnect]

WebSocket

WebSocket is a bidirectional communication channel to exchange messages.
These messages are all events, which can be sent by the client or server at any time.
There's no support for synchronous calls or transactions. Message relations must be handled in the application level protocol and are designed with message exchange patterns.

Authentication

⚠️ Custom integrations running on the remote do not support authentication.

An external integration driver may require a token for authentication, or no authentication at all.

  • During driver registration the preferred authentication type and the token can be specified.
  • Default authentication method: message based if a token has been set.

Header Authentication

If header based authentication has been specified for the integration driver in the remote configuration, the remote will send the token in the auth-token header field while establishing the connection.

The WebSocket connection should then only be established by the driver if the token matches. Otherwise, the integration driver (which is the WebSocket server) must respond with http status code 401 Unauthorized and not upgrading the connection to WebSockets.

If the integration driver upgrades the WebSocket connection, the remote assumes the connection as authenticated.

Message Authentication

For integration drivers not able to use header based authentication with WebSockets (due to framework or runtime restrictions), a fallback option with text messages exists. See AsyncAPI specification for the message definitions.

  1. Right after the WebSocket connection is established, the integration driver must send the auth_required event as first message:
{
  "kind": "event",
  "msg": "auth_required",
  "msg_data": {
    "name": "my-integration",
    "version": {
      "api": "0.5.0",
      "driver": "1.0.0"
    }
  }
}
  1. The remote sends an authentication message:
{
  "kind": "req",
  "id": 1,
  "msg": "auth",
  "msg_data": {
    "token": "$TOKEN"
  }
}
  1. The integration driver replies with the authentication event including the result code of the authentication:

    • 200: authentication succeeded, driver can be used, all API messages are accepted.
    • 401: invalid token and the driver must close the connection. The remote will mark the integration as unauthorized and stop auto-reconnect.
{
  "kind": "resp",
  "req_id": 1,
  "msg": "authentication",
  "code": 200
}

The remote will close the connection if the integration sends any other code than 200 or 401.

No Authentication

If the driver doesn't support authentication tokens, it still needs to send the authentication message with code 200 right after a connection has been established by a client.

Keep Alive

The integration should automatically close idle connections.
In order to keep a connection open, the remote sends WebSocket Ping Pong control frames at least every 60 seconds. Furthermore, an integration should also send pings to the remote to detect stale connections and handle the standby events from the remote.

Error Handling

  • All response messages include a status code property.
    This code corresponds to the standard http status codes as main success / error indication.

TODO Disconnection standard status code in WebSockets: rfc6455

Integration Driver mDNS advertisement

The Remote Two uses mDNS discovery to look for local integration drivers on the same network.

If an integration driver shall be discoverable, it needs to advertise the driver service using multicast DNS:

  • Service type: _uc-integration._tcp
  • Instance name: unique identifier of the integration driver (driver_id in the API model).

TXT Record

Additional information is published in the TXT record.

KeyRequiredFormatDescription
namextextIntegration name
developerxtextDeveloper or company of the integration
verxtextIntegration version number
ver_apitextImplemented integration API version
ws_urltextOverride the WebSocket url. ws_path, wss, wss_port will be ignored
ws_pathtextWebSocket endpoint path. Default: /
wssboolUse secure WebSocket connection
wss_portnumberWebSocket SSL port if different from published port, or driver supports ws & wss connections
pwdboolAccess token required

Examples

Node.js

Using bonjour-service:

const { Bonjour } = require('bonjour-service');
const bonjour = new Bonjour();

bonjour.publish({
    name: 'my-driver',
    type: 'uc-integration',
    port: 1234,
    txt: {
        name: 'My Driver',
        ver: '1.0.0',
        developer: 'Foobar Inc',
        ws_path: '/ws',
        pwd: 'true'
    }
});

Driver Registration

An external integration driver can optionally register itself in a remote if the driver advertisement for auto-discovery is not sufficient.
This is a convenience feature if a driver would like to provide its access token without the user requiring to manually enter it, or if the driver cannot be automatically be discovered by the remote due to network setup (non-local servers, firewalls, VLAN etc.).

sequenceDiagram
    participant I as Integration
    participant mDNS
    participant R as Remote
    participant U as UI / web-configurator
    R-)mDNS: publish service
    I-)mDNS: lookup remote
    I->>+R:  register integration driver
    R-->>-I: result
    rect rgb(118, 153, 144)
    Note right of R: Integration setup
    U->>R:  get integration drivers
    U->>R:  create integration instance
    U->>R:  enable integration instance
    end
    rect rgb(51, 82, 102)
    R-)I:   start communication
    Note right of I: See integration message flow
    end

Registration REST API

Driver registration is only possible through the Remote core REST API.

See: https://github.com/unfoldedcircle/core-api/tree/main/core-api

Example

Register the simulated-light driver using the Core-Simulator Docker setup. This also works using the Simulator VM running with bridge networking:

  • The integration driver is accessible at 192.168.1.115 and listens on port 9988. Adapt to your environment!
  • Register driver with "driver_url:" "ws://192.168.1.115:9988"
  • Use the predefined Postman collection to interact with the Simulator from the host, or use a curl call:
curl --location 'http://localhost:8080/api/intg/drivers' \
--user "web-configurator:1234" \
--header 'Content-Type: application/json' \
--data '
{
  "driver_id": "unique-driver-id or omit for auto generated uuid",
  "name": {
    "en": "Nodejs Test driver"
  },
  "driver_url": "ws://192.168.1.115:9988",
  "version": "0.0.1",
  "icon": "uc:test",
  "enabled": true,
  "description": {
    "en": "This is the way"
  },
  "device_discovery": false,
  "setup_data_schema": {},
  "release_date": "2023-04-02"
}
'
  • Note: using localhost:8080 when running from the host where the Simulator service is running in a container.

After a successful registration the driver will show up in the web-configurator:

driver-registered

Click on the driver and start the setup:

driver-add.png

The above example has an empty setup_data_schema, so there won't be a user interaction and the setup only consists of connecting to the driver and fetching the driver information.

driver-setup-ok.png

The driver is now registered and the available entities will show up in the driver configuration:

driver.png

Driver Setup

An integration driver can support a settings page and an interactive setup flow with the Remote Two app or web-configurator to configure the driver.

The integration driver can specify a setup_data_schema for the initial setup screen for the user to fill out. This can be as simple as an information text or a confirmation button without any further interactions. It also allows to define more sophisticated user interactions where the integration driver sends dynamic setup screens to the user, e.g. offer choices or asking for more input data.

Driver Registration

The following sequence diagram shows the happy message flow of a driver registration. Note that driver registration can be aborted at every stage with an error response or timeout.

sequenceDiagram
    participant I as Integration X
    participant M as mDNS
    participant R as Remote
    participant C as UI configurator
    actor User

    I--)M:     advertise service X

    User->>C:  Start integration discovery
    C-)+R:     start_discovery
    R--)C:     event: integration_discovery (START)
    R-)M:      lookup service
    loop
        M--)R: service(n) 
        opt Not yet registered
            R--)C: event: integration_discovery (DISCOVER) [n] 
        end
    end 
    R--)-C:    event: integration_discovery (STOP) 
    
    User->>C:  Choose integration X
    
    loop
      opt
        User->>+C: Enter access token    
      end
      opt
        User->>+C: Change driver URL   
      end
   

      opt
        User->>C: Connection test
        C-)+R:    get_discovered_intg_driver_metadata
        rect rgb(51, 82, 102)
            R-)+I:           [temporary connection]
            Note right of I: See Establish Connection
        end
        R-)I:    get_driver_metadata 
        I--)-R:  driver_metadata
        R-->I:   disconnect 
        R--)-C:  integration_driver
      end
    end
    
    User->>+C: Confirm
    C-)+R:   configure_discovered_integration_driver
    rect rgb(51, 82, 102)
        R-)+I:           [temporary connection]
        Note right of I: See Establish Connection
    end
    R-)I:    get_driver_metadata 
    I--)-R:  driver_metadata
    R-->I:   disconnect 
    R->>R:   create driver
    R--)C:   integration_driver
    R--)C:  event: integration_driver_change (NEW)

    rect rgb(51, 82, 102)
        R-)+I:           [start communication]
        Note right of I: See Establish Connection
    end

    R--)C:   event: integration_state (CONNECTING)
    R--)-C:   event: integration_state (ACTIVE)
    Note over I,R: Configured driver

Driver Setup Flow

The following sequence diagram shows the message flow after the driver registration above. Again, the happy flow is shown. An error response or timeout can occur at any step in the process.

sequenceDiagram
    participant I as Integration
    participant R as Remote
    participant C as UI configurator
    actor User

    Note over I,R: Configured driver
    R-->+I:           connection

    User->>C: Configure new integration

    User->>C: Provide settings value

    C-)+R:   setup_integration
    R->>R:   verify setup session not running & driver connected
    R--)C:   event: integration_setup_change<br>START (SETUP)
    R->>R:   create new setup session
    R--)C:   integration_setup_info (SETUP)

    R-)+I:    setup_driver
    I--)R:    result (OK)
    R--)C:   event: integration_setup_change<br>SETUP (SETUP)
    Note right of I: setup started, updates with `driver_setup_change`
    loop
      alt setup progress
        I--)R:    event: driver_setup_change<br>(`event_type: SETUP, state: PROGRESS?`)
        R--)C:    event: integration_setup_change<br>SETUP (PROGRESS)
      else user interaction
        I--)R:    event: driver_setup_change<br>(`event_type: SETUP, state: WAIT_USER_ACTION?`)
        R--)+C:   event: integration_setup_change<br>SETUP (WAIT_USER_ACTION)
        User->>C: Provide input  
        C-)+R:    set_integration_user_data
        R-)+I:    set_driver_user_data
        I--)-R:   result (OK)
        R--)-C:    integration_setup_info
      end
    end
    I--)-R: driver_setup_change<br>(`event_type: STOP, state: OK`
    R-)R:   create integration
    R--)C:  event: integration_change<br>(NEW)
    R--)C:  event: integration_state<br>(CONNECTED)
    R--)C:  event: integration_setup_change<br>SETUP (OK)
    R--)C: event: integration_setup_change<br>STOP (OK)
    R-)-R:   remove setup session

    Note over I,R: Configured integration
    R-)R:    wait for messages
    Note over I,R: Message exchange until disconnected
    I-->-R:     disconnect

Driver installation on the Remote

Starting with firmware v1.9.0, custom installation drivers can be installed on the Remote.

‼️ Custom integration drivers is a developer preview and not all features are implemented yet. See missing features.

Installation archive format

Integration driver archive requirements:

  • TAR GZip archive (either .tgz or .tar.gz file suffix) with a maximum size of 100 MB.
  • In the root of the archive, there must be a driver.json metadata file describing the custom integration driver.
  • The driver binary must be in the ./bin subdirectory.
    • Either a statically linked aarch64 executable named driver.
    • Or a Node.js file named driver.js.
  • All application files must be in one of the following subdirectories, other locations are not accessible at runtime:
    • ./bin: application binary folder.
    • ./config: optional configuration data. Path is accessible with UC_CONFIG_HOME environment variable.
    • ./data: optional application data. Path is accessible with UC_DATA_HOME environment variable.

Metadata file

The driver.json metadata file in the root of the archive describes the integration driver.

‼️ The data schema is not yet included in the Core-API, the full object is shown below. It is a reduced version of the IntegrationDriver object, without driver connection fields like driver_url, token etc.

{
  "driver_id": "foobar",
  "version": "1.0.0",
  "min_core_api": "0.20.0",
  "name": {
    "en": "Foobar special"
  },
  "icon": "custom:foobar.png",
  "description": {
    "en": "Control Foobar products",
    "de": "Steuere Foobar Produkte"
  },
  "features": [
    {
      "name": "auth.external_tokens",
      "required": true
    }
  ],
  "developer": {
    "name": "Unfolded Circle ApS",
    "email": "hello@unfoldedcircle.com",
    "url": "https://www.unfoldedcircle.com"
  },
  "home_page": "https://www.unfoldedcircle.com",
  "setup_data_schema": {
    "title": {
      "en": "Integration setup",
      "de": "Integrationssetup"
    },
    "settings": [
      {
        "id": "info",
        "label": {
          "en": "Setup process",
          "de": "Setup Fortschritt"
        },
        "field": {
          "label": {
            "value": {
              "en": "The integration will discover your Foobar products on your network. This process is automatic and can take a few minutes.",
              "de": "Diese Integration wird Foobar Produkte im Netzwerk finden. Dies ist ein Automatischer Prozess der ein paar Minuten dauern kann."
            }
          }
        }
      }
    ]
  },
  "release_date": "2024-07-21"
}
  • driver_id must be at least 5 characters long and start with a lower-case letter.
    • Only lower-case letters, digits and -, _ are allowed.
    • Common system identifiers are not allowed and will be rejected (e.g. daemon, backup, etc.).
    • The uc_ prefix should not be used. This is reserved for pre-installed integrations. Any custom integrations using this prefix might get removed during a future firmware update.
  • Multiple language fields are not required, but recommended.
    • If only a single language is provided, it should use the en key.
  • setup_data_schema is optional if the driver provides a setup flow.
    • This is the first screen of the setup, all further screens are dynamically provided by the driver.
  • ⚠️ min_core_api is not yet used.

Driver icon

A driver icon can either use a predefined icon or a custom icon. Predefined icons are prefixed with uc:, followed by the icon identifier in lowercase.

A custom driver icon can be installed automatically as custom icon resource.

  1. In driver.json set the icon field to custom:$ICON_FILENAME
  2. Include $ICON_FILENAME in the root of the archive.

Example driver.json (other fields omitted for simplicity):

{
  "icon": "custom:foobar.png"
}

The icon file called foobar.png must be added to the root of the archive. Icons must be of size 90x90 pixels and either in PNG or JPG format. Maximum size is 32 KB.

Installation archive example

Example of a Node.js based integration driver archive (contents of bin/node_modules are not shown for a clearer overview):

.
├── bin
│   ├── driver.js
│   ├── node_modules
│   │   ├── ...
│   │   ├── foobar
│   │   ├── uc-integration-api
│   │   ├── ws
│   │   └── ...
│   └── foobar.js
├── config
├── data
├── driver.json
└── foobar.png
  • If the driver doesn't require any data or configuration files, the ./data and ./config directories can be omitted from the archive.
    • During the installation, the data and config directories are automatically created and can be accessed by the driver at runtime, no matter if they were provided in the installation archive or not.
  • The driver.json file in the root folder is automatically copied to the ./bin folder during installation if it is missing.
    • If the driver requires a different driver.json file, simply include a file in the ./bin folder.
      The one in the root folder won't be copied anymore.

Restrictions

  • Maximum 10 custom integrations can be installed.
  • Only Node.js is supported besides a statically linked binary. Other runtimes are not supported at the moment.
    • Python integrations must pack the Python runtime into the archive.
  • The integration driver runs in a sandbox. Access to devices and the filesystem is restricted.
  • No symlinks are allowed. They are automatically removed during the installation.
  • Executable files are only allowed in the ./bin directory.
    • No other tools are provided in the runtime environment. E.g. there is no shell available and no other tools like cp or mv.

Missing features

  • Resource restrictions for integration drivers: limit maximum amount of memory and CPU usage.
  • Update an installed integrations.
    • Workaround: remove and re-install.
  • Resource usage: provide memory and CPU usage per integration.
    • Only the overall resource usage can be monitored with GET /api/pub/status.
  • Web-Configurator support: install custom integration drivers.
    • Custom integration drivers can already be deleted in the web-configurator.

Runtime environment

The driver runs in a sandbox with limited access to the host system.

  • Environment variables for the Websocket integration-API server:
    • UC_INTEGRATION_INTERFACE: network interface to bind to.
    • UC_INTEGRATION_HTTP_PORT: port number.
  • The working directory is set to the binary directory.
  • The binary directory is read-only.
  • Node.js version: v20.16 (firmware release 1.9.3 and newer).
    • There are no pre-installed node modules.
    • An integration driver must include all required modules in the installation archive, including uc-integration-api (if used).
  • File access with relative paths between bin, config, and data is not possible.
    • Environment variables must be used to retrieve the full path of these directories.
      • UC_CONFIG_HOME and HOME: configuration directory.
      • UC_DATA_HOME: data directory.
    • The returned path may not be stored, it may change with future software updates.
  • Only the $UC_CONFIG_HOME and $UC_DATA_HOME directories are writeable and persisted between restarts.
    • The /tmp directory can be used for small temporary files.
      • This is a RAM file system and limited by the available free memory.
      • Temporary files are not persisted between restarts.
  • A dynamic user and group is allocated when the driver is started.
    • The user and group IDs may change between driver restarts.
    • Write access to the $UC_CONFIG_HOME, $UC_DATA_HOME and /tmp directories is ensured.

⚠️ CPU and memory restrictions are not yet in place but will be enforced in a future firmware update!

  • A single integration driver should not use more than 100 MB of memory.

TODO more details about sandbox environment

Network

The integration runs on the same network environment as the Remote. There is no network bridge or firewall.

  • Binding ports below 1024 is not possible.

⚠️ A port-binding filter might be added in the future to prevent integrations to steal away ports of other integrations. The port range 8000-9200 and port 13333 are not allowed to be used!

Native integration drivers

TODO sysroot, available dynamic libraries

The Remote Two Cross Compile Toolchain can be used to cross-compile a native binary for the Remote.

  • The driver must be compiled as a static binary for libc.
  • Most dynamic libraries in the cross-compile sysroot are NOT available in the custom integration runtime environment!

Install driver

curl --location 'http://$IP/api/intg/install' \
--user 'web-configurator:$PIN' \
--form 'file=@"custom-intg.tar.gz"'

See REST Core API for more details.

Delete driver

To delete a custom integration, use the regular endpoints to delete an integration instance and driver. These are the same endpoints as for an external network integration driver:

  • Delete integration instance DELETE /api/intg/instances/:intgId.
  • Delete driver and installation files: DELETE /api/intg/drivers/:driverId.

See REST Core API for more details.

The instance and driver can also be deleted in the web-configurator.

Log access

Output to stdout and stderr are automatically stored with a timestamp and accessible as the other system logs:

  • Get log services: GET /api/system/logs/services.
  • Query logs: GET /api/system/logs?....

See REST Core API for more details.

Log files can also be downloaded in the web-configurator: Settings, Development: Logs

Web-app log viewer

⚠️ Available from firmware release v2.1.0

The Logdy web application is installed on the device to monitor integration driver log events in near real time.

  • URL: http://$IP/log/
  • This function is deactivated by default and the endpoint returns 503.
  • The log viewer must be started using the REST Core API with the /api/system/logs/web endpoint:
    • GET request returns the current state.
    • PUT request allows to start, stop or to permanently enable the log app. A password can be set to restrict access to the web app.
  • Available logs:
    • Remote core service
    • All pre-installed and custom integrations
    • Custom remote-ui service if installed
  • ❗️The log processing and logdy daemon require around 170 MB of the custom integration memory pool.

Using curl to start the app:

curl --request PUT 'http://$IP/api/system/logs/web' \
  --header 'Content-Type: application/json' \
  --user web-configurator:$PIN \
  --data '{"enabled": true}'

Start and permanently enable the app, even after a reboot:

curl --request PUT 'http://$IP/api/system/logs/web' \
  --header 'Content-Type: application/json' \
  --user web-configurator:$PIN \
  --data '{"enabled": true; "autostart": true}'

Recommendations

  • Node.js should be preferred for writing integration drivers.
  • If using Python:
    • Use PyInstaller to create a binary distribution.
    • Use the default one-folder bundle containing an executable (--onedir). Avoid the one-file bundled executable, since it will easily use an additional 100 MB of memory!
    • See Android TV integration or Apple TV integration as an example.
  • An integration driver should be limited to one process and not launch other processes.
  • Use ports above 10000 if the integration needs to create an IPv4 or IPv6 server socket (besides the required WebSocket server for the integration-API).
  • Preserve resources, use as little memory and CPU as possible.
  • Use stdout & stderr for logging.
  • Only use /tmp for small, temporary files since it is a RAM file system.

Example integrations

The following Python based integration drivers create a custom integration installation archive during build with a GitHub action:

Bluetooth HID peripheral

‼️ This is currently a beta feature released in the v1.8.0 beta firmware.

Support articles:

Virtual Keyboard

The virtual keyboard defines the following HID report descriptors:

The upper-case Key name in the above usage tables is used for the remote-entity commands.

HID key codes reference: https://usb.org/sites/default/files/hut1_2.pdf

Devices

Consumer devices usually only support a small subset of the HID usage definitions. Furthermore, the HID usage tables leave room for interpretation and contain multiple functions with different commands (for example media and volume control).

The device test reports are located in the ./devices folder. They are used to create the device profiles.

The template document can be used to submit pull requests for additional devices.

Device Profiles

Devices might use different commands or accept different key presses to perform certain actions. Therefore, a universal button configuration or UI screen layout would not work the same way.

Devices profiles are device specific configurations that contain default button mapping and UI configuration for a specific device.

These configurations are tested to make sure it works with the specific device.

For Android TV based streaming boxes and TV devices, try the generic Android profile if there's not a specific profile for your device.

Use the default profile if nothing else matches.

See BT device profile list for pre-defined profiles and BT device test reports for tested HID commands.
The existing device profiles are stored in GitHub at https://github.com/unfoldedcircle/core-api/tree/main/doc/bt/profiles.

Send commands with Core-API

send_cmd

The BT-remote entity supports the same remote.send_cmd command as an external remote-entity.

The command parameter supports:

  • UPPER_CASE HID usage key names: regular key codes, consumer key codes, system key codes depending on prefix.
    • Regular key codes support up to 6 simultaneous keys.
      Separate key names or codes with +, e.g. KEY_A+KEY_B+KEY_C
    • Regular key codes support the following modifiers:
      LSHIFT, LALT, LCTRL, LGUI, RSHIFT, RALT, RCTRL, RGUI.
      For example: LCTRL+KEY_C or LCTRL+LALT+KEY_DELETE
  • Mouse commands if starting with MOUSE_:
    • Buttons: MOUSE_BTN_1, MOUSE_BTN_2, MOUSE_BTN_3
    • X-movement: MOUSE_X_# where # is the amount of movement within: MOUSE_X_-128 .. MOUSE_X_127
    • Y-movement: MOUSE_Y_# where # is the amount of movement within: MOUSE_Y_-128 .. MOUSE_Y_127
    • Scroll-wheel: MOUSE_WHEEL_# where # is the amount of movement within: MOUSE_WHEEL_-128 .. MOUSE_WHEEL_127
  • Hex-codes allow to send an arbitrary usage code, even for keys which are not defined.
    This is intended to simplify testing and for proprietary manufacturer commands.
    • 2-digit hex-code starting with 0x: regular key code, for example 0x66 for KEY_POWER.
    • 4-digit hex-code starting with 0x: consumer key code, for example 0x0030 for CONSUMER_POWER.
  • Text: single character or ASCII 7-Bit text (limited to ~ 20 characters).
    • Attention: only US layout is supported (as defined in the USB HID specification), there is no support yet for different character maps.
  • ‼️The repeat, delay, and hold parameters are not supported and are ignored.

Curl example:

curl --location --request PUT 'http://$IP/api/entities/$ENTITY_ID/command' \
--header 'Content-Type: application/json' \
--user 'web-configurator:$PIN' \
--data '{
  "cmd_id": "remote.send_cmd",
  "params": {
    "command": "LSHIFT+KEY_A"
  }
}'

send_key

The BT-remote entity supports an additional command remote.send_key for sending a single, predefined key code oder ASCII character. Optionally, the GUI / meta key modifier can be enabled.

The key parameter supports:

For a regular key code, the GUI / meta key modifier can be set in the gui parameter.

Curl example:

curl --location --request PUT 'http://$IP/api/entities/$ENTITY_ID/command' \
--header 'Content-Type: application/json' \
--user 'web-configurator:$PIN' \
--data '{
  "cmd_id": "remote.send_key",
  "params": {
    "key": "KEY_E",
    "gui": true
  }
}'

Restrictions and missing features

  • Number of BT connections / devices is restricted to 1 by default. Multiple Bluetooth LE connections can be enabled under "Settings, Development: Preview features".
  • The Bluetooth controller is put to sleep in system standby and re-initialized at wakeup.
    • Some devices will show a disconnect & connect message or popup when the remote wakes up.
    • Different sleep behaviour can only be configured with the REST Core-API at the moment. Instructions will be published.
  • Dock Bluetooth setup is not yet implemented with the new Bluetooth stack.
  • Only US-ASCII character map (other languages will likely have KEY_Z / KEY_Y switched and non-letter & digit keys mapped to something else).
  • Entity state handling is not yet fully implemented, only UNAVAILABLE (if not connected) and UNKNOWN (when connected) are currently used.
  • Power state handling is not yet implemented if the device supports dedicated power on & off commands. Command mapping is prepared in the BT device profile files.
  • Native key repeat is not yet implemented. Pressing & holding a button will send individual key presses.
    • BT remote-entity send_cmd command parameters repeat, delay, hold are ignored.
  • Web-configurator requires manual refresh:
    • after the pairing confirmation, otherwise it still shows as not paired.
    • after deleting a paired device, otherwise it still shows paired.
  • Pairing information is not included in backup archive.

See known device issues for more information.

Fixed in v1.9.0 beta:

  • Entity command validation issue in send_cmd & send_key commands with negative mouse movement values.

Known Device Issues

  • Shield TV: occasional "bonding lost" issues, under investigation
  • LG TV, Samsung smart monitor M7: cannot be powered-on with Bluetooth. Most likely this applies to many other devices as well.

Not Supported Devices

  • Playstation 4 & 5 do not support BLE keyboards.

BT suspend / wakeup patterns

When the remote goes into deep sleep mode, the Bluetooth controller is put to sleep and re-initialized at wakeup.

  • Some devices will show a disconnect & connect message or popup when the remote wakes up.
  • Different sleep behaviour can only be configured with the REST Core-API at the moment.
  • Default suspend actions if not defined (empty array): disable advertisements, then put BT controller to sleep
  • Default wakeup actions if not defined (empty array): restart BT controller
curl --location --request PATCH 'http://$IP/api/cfg/bt' \
--header 'Content-Type: application/json' \
--user 'web-configurator:$PIN' \
--data '{
    "suspend_actions": ["DISABLE_ADVERTISEMENTS", "SLEEP"],
    "wakeup_actions": ["RESTART"]
}'

Do nothing, best effort

{
  "suspend_actions": ["NONE"],
  "wakeup_actions": ["NONE"]
}
  • keeps connection during sleep
  • fastest way to send key commands after wakeup (if connection is still alive)
  • least reliable with certain devices
  • connection might hang after wakeup: R2 shows connected, no error while sending keys, but central shows disconnected
  • does not work if central is restarted while R2 is suspended

Disconnect connections at wakeup

{
  "suspend_actions": ["NONE"],
  "wakeup_actions": ["DISCONNECT"]
}
  • trigger central reconnection at wakeup
  • more reliable than best effort
  • some devices will show "connected" & "disconnected" popups after wakeup

Restart at wakeup

{
  "suspend_actions": ["NONE"],
  "wakeup_actions": ["RESTART"]
}
  • keeps connection during sleep
  • restart at wakeup to cleanly reconnect centrals
  • small chance that central considers connection as non-working
  • some devices will show "connected" & "disconnected" popups after wakeup

HCI sleep mode, restart at wakeup

{
  "suspend_actions": ["DISABLE_ADVERTISEMENTS", "SLEEP"],
  "wakeup_actions": ["RESTART"]
}
  • disconnect central before HCI sleep mode
  • restart at wakeup to cleanly reconnect centrals
  • seems to be the most reliable option that centrals reconnect
  • some devices will show "connected" popup at sleep & "disconnected" popup after wakeup

HCI sleep mode & resume at wakeup

About 1 sec faster than restart (~ 3sec).

{
  "suspend_actions": ["DISABLE_ADVERTISEMENTS", "SLEEP"],
  "wakeup_actions": ["ENABLE", "ENABLE_ADVERTISEMENTS"]
}
  • disconnect central before HCI sleep mode
  • startup BT controller at wakeup and re-enable advertisements for centrals to reconnect
  • some devices will show "connected" popup at sleep & "disconnected" popup after wakeup

Virtual BLE Keyboard

The virtual keyboard defines the following HID report descriptors:

The upper-case Key name in the above usage tables is used for the remote-entity commands.

HID key codes reference: https://usb.org/sites/default/files/hut1_2.pdf

Regular keycodes (Keyboard Keypad Page (0x07))

Key nameUsage codeComment
KEY_A4
KEY_B5
KEY_C6
KEY_D7
KEY_E8
KEY_F9
KEY_G10
KEY_H11
KEY_I12
KEY_J13
KEY_K14
KEY_L15
KEY_M16
KEY_N17
KEY_O18
KEY_P19
KEY_Q20
KEY_R21
KEY_S22
KEY_T23
KEY_U24
KEY_V25
KEY_W26
KEY_X27
KEY_Y28
KEY_Z29
KEY_130
KEY_231
KEY_332
KEY_433
KEY_534
KEY_635
KEY_736
KEY_837
KEY_938
KEY_039
KEY_RETURN40
KEY_ESC41
KEY_BACKSPACE42
KEY_TAB43
KEY_SPACE44
KEY_MINUS45
KEY_EQUAL46
KEY_LEFT_BRACE47
KEY_RIGHT_BRACE48
KEY_BACKSLASH49
KEY_HASH_TILDE50
KEY_SEMICOLON51
KEY_APOSTROPHE52
KEY_GRAVE53
KEY_COMMA54
KEY_DOT55
KEY_SLASH56
KEY_CAPSLOCK57
KEY_F158
KEY_F259
KEY_F360
KEY_F461
KEY_F562
KEY_F663
KEY_F764
KEY_F865
KEY_F966
KEY_F1067
KEY_F1168
KEY_F1269
KEY_SYSRQ70
KEY_SCROLL_LOCK71
KEY_PAUSE72
KEY_INSERT73
KEY_HOME74
KEY_PAGE_UP75
KEY_DELETE76
KEY_END77
KEY_PAGE_DOWN78
KEY_RIGHT_ARROW79
KEY_LEFT_ARROW80
KEY_DOWN_ARROW81
KEY_UP_ARROW82
KEYPAD_NUMLOCK83
KEYPAD_SLASH84
KEYPAD_ASTERISK85
KEYPAD_MINUS86
KEYPAD_PLUS87
KEYPAD_ENTER88
KEYPAD_189
KEYPAD_290
KEYPAD_391
KEYPAD_492
KEYPAD_593
KEYPAD_694
KEYPAD_795
KEYPAD_896
KEYPAD_997
KEYPAD_098
KEYPAD_DOT99
KEY_102ND100
KEY_APPLICATION101
KEY_POWER102
KEYPAD_EQUAL103
KEY_F13104
KEY_F14105
KEY_F15106
KEY_F16107
KEY_F17108
KEY_F18109
KEY_F19110
KEY_F20111
KEY_F21112
KEY_F22113
KEY_F23114
KEY_F24115
KEY_EXECUTE116
KEY_HELP117
KEY_MENU118
KEY_SELECT119
KEY_STOP120
KEY_AGAIN121
KEY_UNDO122
KEY_CUT123
KEY_COPY124
KEY_PASTE125
KEY_FIND126
KEY_MUTE127
KEY_VOLUME_UP128
KEY_VOLUME_DOWN129
-130
-131
-132
KEYPAD_COMMA133
-134
KEY_RO135
KEY_KATAKANA_HIRAGANA136
KEY_YEN137
KEY_HENKAN138
KEY_MUHENKAN139
KEYPAD_JPCOMMA140
KEY_INTERNATIONAL7141
KEY_INTERNATIONAL8142
KEY_INTERNATIONAL9143
KEY_HANGEUL144
KEY_HANJA145
KEY_KATAKANA146
KEY_HIRAGANA147
KEY_ZENKAKU_HANKAKU148
KEY_FURIGANA149
KEY_LANG7150
KEY_LANG8151
KEY_LANG9152
KEY_ALTERNATE_ERASE153
KEY_SYS_REQ_ATTENTION154
KEY_CANCEL155
KEY_CLEAR156
KEY_PRIOR157
-158
KEY_SEPARATOR159
KEY_OUT160
KEY_OPER161
KEY_CLEAR_AGAIN162
KEY_CR_SEL_PROPS163
KEY_EX_SEL164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
KEYPAD_00176
KEYPAD_000177
KEY_THOUSANDS_SEPARATOR178
KEY_DECIMAL_SEPARATOR179
KEY_CURRENCY_UNIT180
KEY_CURRENCY_SUB_UNIT181
KEYPAD_LEFT_PARENTHESIS182
KEYPAD_RIGHT_PARENTHESIS183
KEYPAD_LEFT_BRACE184
KEYPAD_RIGHT_BRACE185
KEYPAD_TAB186
KEYPAD_BACKSPACE187
KEYPAD_A188
KEYPAD_B189
KEYPAD_C190
KEYPAD_D191
KEYPAD_E192
KEYPAD_F193
KEYPAD_XOR194
KEYPAD_CARET195
KEYPAD_PERCENT196
KEYPAD_LESS_THAN197
KEYPAD_GREATER_THAN198
KEYPAD_AMPERSAND199
KEYPAD_AMPERSAND_AMPERSAND200
KEYPAD_PIPE201
KEYPAD_PIPE_PIPE202
KEYPAD_COLON203
KEYPAD_HASH204
KEYPAD_SPACE205
KEYPAD_AT206
KEYPAD_EXCLAMATION207
KEYPAD_MEMORY_STORE208
KEYPAD_MEMORY_RECALL209
KEYPAD_MEMORY_CLEAR210
KEYPAD_MEMORY_ADD211
KEYPAD_MEMORY_SUBTRACT212
KEYPAD_MEMORY_MULTIPLY213
KEYPAD_MEMORY_DIVIDE214
KEYPAD_PLUS_MINUS215
KEYPAD_CLEAR216
KEYPAD_CLEAR_ENTRY217
KEYPAD_BINARY218
KEYPAD_OCTAL229
KEYPAD_DECIMAL220
KEYPAD_HEXADECIMAL221
-222
-223
KEY_LEFT_CONTROL224
KEY_LEFT_SHIFT225
KEY_LEFT_ALT226
KEY_LEFT_GUI227
KEY_RIGHT_CONTROL228
KEY_RIGHT_SHIFT229
KEY_RIGHT_ALT230
KEY_RIGHT_GUI231
KEY_MEDIA_PLAY_PAUSE232Not specified in official HID Usage Table specification.
KEY_MEDIA_STOP_CD233Applies to all "KEY_MEDIA_" keys.
KEY_MEDIA_PREVIOUS_SONG234--> found in Android sources
KEY_MEDIA_NEXT_SONG235
KEY_MEDIA_EJECT_CD236
KEY_MEDIA_VOLUME_UP237
KEY_MEDIA_VOLUME_DOWN238
KEY_MEDIA_MUTE239
KEY_MEDIA_WWW240
KEY_MEDIA_BACK241
KEY_MEDIA_FORWARD242
KEY_MEDIA_STOP243
KEY_MEDIA_FIND244
KEY_MEDIA_SCROLL_UP245
KEY_MEDIA_SCROLL_DOWN246
KEY_MEDIA_EDIT247
KEY_MEDIA_SLEEP248
KEY_MEDIA_COFFEE249
KEY_MEDIA_REFRESH250
KEY_MEDIA_CALC251
-252
-253
-254
-255

Consumer codes (Consumer Page (0x0C))

Key nameUsage codeComment
CONSUMER_INCREMENT_100x20
CONSUMER_INCREMENT_1000x21
CONSUMER_AM_PM0x22
CONSUMER_POWER0x30
CONSUMER_RESET0x31
CONSUMER_SLEEP0x32
CONSUMER_SLEEP_AFTER0x33
CONSUMER_SLEEP_MODE0x34
CONSUMER_ILLUMINATION0x35
CONSUMER_FUNCTION_BUTTONS0x36
CONSUMER_MENU0x40
CONSUMER_MENU_PICK0x41
CONSUMER_MENU_UP0x42
CONSUMER_MENU_DOWN0x43
CONSUMER_MENU_LEFT0x44
CONSUMER_MENU_RIGHT0x45
CONSUMER_MENU_ESCAPE0x46
CONSUMER_MENU_VALUE_INCREASE0x47
CONSUMER_MENU_VALUE_DECREASE0x48
CONSUMER_DATA_ON_SCREEN0x60
CONSUMER_CLOSED_CAPTION0x61
CONSUMER_CLOSED_CAPTION_SELECT0x62
CONSUMER_VCR_TV0x63
CONSUMER_BROADCAST_MODE0x64
CONSUMER_SNAPSHOT0x65
CONSUMER_STILL0x66
CONSUMER_PICTURE_IN_PICTURE_TOGGLE0x67
CONSUMER_PICTURE_IN_PICTURE_SWAP0x68
CONSUMER_RED_MENU_BUTTON0x69
CONSUMER_GREEN_MENU_BUTTON0x6A
CONSUMER_BLUE_MENU_BUTTON0x6B
CONSUMER_YELLOW_MENU_BUTTON0x6C
CONSUMER_ASPECT0x6D
CONSUMER_MODE_SELECT_3D0x6E
CONSUMER_DISPLAY_BRIGHTNESS_INCREMENT0x6F
CONSUMER_DISPLAY_BRIGHTNESS_DECREMENT0x70
CONSUMER_DISPLAY_BRIGHTNESS0x71
CONSUMER_DISPLAY_BACKLIGHT_TOGGLE0x72
CONSUMER_DISPLAY_SET_BRIGHTNESS_TO_MINIMUM0x73
CONSUMER_DISPLAY_SET_BRIGHTNESS_TO_MAXIMUM0x74
CONSUMER_DISPLAY_SET_AUTO_BRIGHTNESS0x75
CONSUMER_CAMERA_ACCESS_ENABLED0x76
CONSUMER_CAMERA_ACCESS_DISABLED0x77
CONSUMER_CAMERA_ACCESS_TOGGLE0x78
CONSUMER_KEYBOARD_BRIGHTNESS_INCREMENT0x79
CONSUMER_KEYBOARD_BRIGHTNESS_DECREMENT0x7A
CONSUMER_KEYBOARD_BACKLIGHT_SET_LEVEL0x7B
CONSUMER_KEYBOARD_BACKLIGHT_OOC0x7C
CONSUMER_KEYBOARD_BACKLIGHT_SET_MINIMUM0x7D
CONSUMER_KEYBOARD_BACKLIGHT_SET_MAXIMUM0x7E
CONSUMER_KEYBOARD_BACKLIGHT_AUTO0x7F
CONSUMER_SELECTION0x80
CONSUMER_ASSIGN_SELECTION0x81
CONSUMER_MODE_STEP0x82
CONSUMER_RECALL_LAST0x83
CONSUMER_ENTER_CHANNEL0x84
CONSUMER_ORDER_MOVIE0x85
CONSUMER_CHANNEL0x86
CONSUMER_MEDIA_SELECTION0x87
CONSUMER_MEDIA_SELECT_COMPUTER0x88
CONSUMER_MEDIA_SELECT_TV0x89
CONSUMER_MEDIA_SELECT_WWW0x8A
CONSUMER_MEDIA_SELECT_DVD0x8B
CONSUMER_MEDIA_SELECT_TELEPHONE0x8C
CONSUMER_MEDIA_SELECT_PROGRAM_GUIDE0x8D
CONSUMER_MEDIA_SELECT_VIDEO_PHONE0x8E
CONSUMER_MEDIA_SELECT_GAMES0x8F
CONSUMER_MEDIA_SELECT_MESSAGES0x90
CONSUMER_MEDIA_SELECT_CD0x91
CONSUMER_MEDIA_SELECT_VCR0x92
CONSUMER_MEDIA_SELECT_TUNER0x93
CONSUMER_QUIT0x94
CONSUMER_HELP0x95
CONSUMER_MEDIA_SELECT_TAPE0x96
CONSUMER_MEDIA_SELECT_CABLE0x97
CONSUMER_MEDIA_SELECT_SATELLITE0x98
CONSUMER_MEDIA_SELECT_SECURITY0x99
CONSUMER_MEDIA_SELECT_HOME0x9A
CONSUMER_MEDIA_SELECT_CALL0x9B
CONSUMER_CHANNEL_INCREMENT0x9C
CONSUMER_CHANNEL_DECREMENT0x9D
CONSUMER_MEDIA_SELECT_SAP0x9E
CONSUMER_VCR_PLUS0xA0
CONSUMER_ONCE0xA1
CONSUMER_DAILY0xA2
CONSUMER_WEEKLY0xA3
CONSUMER_MONTHLY0xA4
CONSUMER_PLAY0xB0
CONSUMER_PAUSE0xB1
CONSUMER_RECORD0xB2
CONSUMER_FAST_FORWARD0xB3
CONSUMER_REWIND0xB4
CONSUMER_SCAN_NEXT_TRACK0xB5
CONSUMER_SCAN_PREVIOUS_TRACK0xB6
CONSUMER_STOP0xB7
CONSUMER_EJECT0xB8
CONSUMER_RANDOM_PLAY0xB9
CONSUMER_SELECT_DISC0xBA
CONSUMER_ENTER_DISC0xBB
CONSUMER_REPEAT0xBC
CONSUMER_TRACKING0xBD
CONSUMER_TRACK_NORMAL0xBE
CONSUMER_SLOW_TRACKING0xBF
CONSUMER_FRAME_FORWARD0xC0
CONSUMER_FRAME_BACK0xC1
CONSUMER_MARK0xC2
CONSUMER_CLEAR_MARK0xC3
CONSUMER_REPEAT_FROM_MARK0xC4
CONSUMER_RETURN_TO_MARK0xC5
CONSUMER_SEARCH_MARK_FORWARD0xC6
CONSUMER_SEARCH_MARK_BACKWARDS0xC7
CONSUMER_COUNTER_RESET0xC8
CONSUMER_SHOW_COUNTER0xC9
CONSUMER_TRACKING_INCREMENT0xCA
CONSUMER_TRACKING_DECREMENT0xCB
CONSUMER_STOP_EJECT0xCC
CONSUMER_PLAY_PAUSE0xCD
CONSUMER_PLAY_SKIP0xCE
CONSUMER_VOICE_COMMAND0xCF
CONSUMER_INVOKE_CAPTURE_INTERFACE0xD0
CONSUMER_START_OR_STOP_GAME_RECORDING0xD1
CONSUMER_HISTORICAL_GAME_CAPTURE0xD2
CONSUMER_CAPTURE_GAME_SCREENSHOT0xD3
CONSUMER_SHOW_OR_HIDE_RECORDING_INDICATOR0xD4
CONSUMER_START_OR_STOP_MICROPHONE_CAPTURE0xD5
CONSUMER_START_OR_STOP_CAMERA_CAPTURE0xD6
CONSUMER_START_OR_STOP_GAME_BROADCAST0xD7
CONSUMER_VOLUME0xE0
CONSUMER_BALANCE0xE1
CONSUMER_MUTE0xE2
CONSUMER_BASS0xE3
CONSUMER_TREBLE0xE4
CONSUMER_BASS_BOOST0xE5
CONSUMER_SURROUND_MODE0xE6
CONSUMER_LOUDNESS0xE7
CONSUMER_MPX0xE8
CONSUMER_VOLUME_INCREMENT0xE9
CONSUMER_VOLUME_DECREMENT0xEA
CONSUMER_SPEED_SELECT0xF0
CONSUMER_PLAYBACK_SPEED0xF1
CONSUMER_STANDARD_PLAY0xF2
CONSUMER_LONG_PLAY0xF3
CONSUMER_EXTENDED_PLAY0xF4
CONSUMER_SLOW0xF5
CONSUMER_FAN_ENABLE0x100
CONSUMER_FAN_SPEED0x101
CONSUMER_LIGHT_ENABLE0x102
CONSUMER_LIGHT_ILLUMINATION_LEVEL0x103
CONSUMER_CLIMATE_CONTROL_ENABLE0x104
CONSUMER_ROOM_TEMPERATURE0x105
CONSUMER_SECURITY_ENABLE0x106
CONSUMER_FIRE_ALARM0x107
CONSUMER_POLICE_ALARM0x108
CONSUMER_PROXIMITY0x109
CONSUMER_MOTION0x10A
CONSUMER_DURESS_ALARM0x10B
CONSUMER_HOLDUP_ALARM0x10C
CONSUMER_MEDICAL_ALARM0x10D
CONSUMER_BALANCE_RIGHT0x150
CONSUMER_BALANCE_LEFT0x151
CONSUMER_BASS_INCREMENT0x152
CONSUMER_BASS_DECREMENT0x153
CONSUMER_TREBLE_INCREMENT0x154
CONSUMER_TREBLE_DECREMENT0x155
CONSUMER_SPEAKER_SYSTEM0x160
CONSUMER_CHANNEL_LEFT0x161
CONSUMER_CHANNEL_RIGHT0x162
CONSUMER_CHANNEL_CENTER0x163
CONSUMER_CHANNEL_FRONT0x164
CONSUMER_CHANNEL_CENTER_FRONT0x165
CONSUMER_CHANNEL_SIDE0x166
CONSUMER_CHANNEL_SURROUND0x167
CONSUMER_CHANNEL_LOW_FREQUENCY_ENHANCEMENT0x168
CONSUMER_CHANNEL_TOP0x169
CONSUMER_CHANNEL_UNKNOWN0x16A
CONSUMER_SUB_CHANNEL0x170
CONSUMER_SUB_CHANNEL_INCREMENT0x171
CONSUMER_SUB_CHANNEL_DECREMENT0x172
CONSUMER_ALTERNATE_AUDIO_INCREMENT0x173
CONSUMER_ALTERNATE_AUDIO_DECREMENT0x174
CONSUMER_APPLICATION_LAUNCH_BUTTONS0x180
CONSUMER_AL_LAUNCH_BUTTON_CONFIGURATION_TOOL0x181
CONSUMER_AL_PROGRAMMABLE_BUTTON_CONFIGURATION0x182
CONSUMER_AL_CONSUMER_CONTROL_CONFIGURATION0x183
CONSUMER_AL_WORD_PROCESSOR0x184
CONSUMER_AL_TEXT_EDITOR0x185
CONSUMER_AL_SPREADSHEET0x186
CONSUMER_AL_GRAPHICS_EDITOR0x187
CONSUMER_AL_PRESENTATION_APP0x188
CONSUMER_AL_DATABASE_APP0x189
CONSUMER_AL_EMAIL_READER0x18A
CONSUMER_AL_NEWSREADER0x18B
CONSUMER_AL_VOICEMAIL0x18C
CONSUMER_AL_CONTACTS_ADDRESS_BOOK0x18D
CONSUMER_AL_CALENDAR_SCHEDULE0x18E
CONSUMER_AL_TASK_PROJECT_MANAGER0x18F
CONSUMER_AL_LOG_JOURNAL_TIMECARD0x190
CONSUMER_AL_CHECKBOOK_FINANCE0x191
CONSUMER_AL_CALCULATOR0x192
CONSUMER_AL_A_V_CAPTURE_PLAYBACK0x193
CONSUMER_AL_LOCAL_MACHINE_BROWSER0x194
CONSUMER_AL_LAN_WAN_BROWSER0x195
CONSUMER_AL_INTERNET_BROWSER0x196
CONSUMER_AL_REMOTE_NETWORKING_ISP_CONNECT0x197
CONSUMER_AL_NETWORK_CONFERENCE0x198
CONSUMER_AL_NETWORK_CHAT0x199
CONSUMER_AL_TELEPHONY_DIALER0x19A
CONSUMER_AL_LOGON0x19B
CONSUMER_AL_LOGOFF0x19C
CONSUMER_AL_LOGON_LOGOFF0x19D
CONSUMER_AL_TERMINAL_LOCK_SCREENSAVER0x19E
CONSUMER_AL_CONTROL_PANEL0x19F
CONSUMER_AL_COMMAND_LINE_PROCESSOR_RUN0x1A0
CONSUMER_AL_PROCESS_TASK_MANAGER0x1A1
CONSUMER_AL_SELECT_TASK_APPLICATION0x1A2
CONSUMER_AL_NEXT_TASK_APPLICATION0x1A3
CONSUMER_AL_PREVIOUS_TASK_APPLICATION0x1A4
CONSUMER_AL_PREEMPTIVE_HALT_TASK_APPLICATION0x1A5
CONSUMER_AL_INTEGRATED_HELP_CENTER0x1A6
CONSUMER_AL_DOCUMENTS0x1A7
CONSUMER_AL_THESAURUS0x1A8
CONSUMER_AL_DICTIONARY0x1A9
CONSUMER_AL_DESKTOP0x1AA
CONSUMER_AL_SPELL_CHECK0x1AB
CONSUMER_AL_GRAMMAR_CHECK0x1AC
CONSUMER_AL_WIRELESS_STATUS0x1AD
CONSUMER_AL_KEYBOARD_LAYOUT0x1AE
CONSUMER_AL_VIRUS_PROTECTION0x1AF
CONSUMER_AL_ENCRYPTION0x1B0
CONSUMER_AL_SCREEN_SAVER0x1B1
CONSUMER_AL_ALARMS0x1B2
CONSUMER_AL_CLOCK0x1B3
CONSUMER_AL_FILE_BROWSER0x1B4
CONSUMER_AL_POWER_STATUS0x1B5
CONSUMER_AL_IMAGE_BROWSER0x1B6
CONSUMER_AL_AUDIO_BROWSER0x1B7
CONSUMER_AL_MOVIE_BROWSER0x1B8
CONSUMER_AL_DIGITAL_RIGHTS_MANAGER0x1B9
CONSUMER_AL_DIGITAL_WALLET0x1BA
CONSUMER_AL_INSTANT_MESSAGING0x1BC
CONSUMER_AL_OEM_FEATURES_TIPS_TUTORIAL_BROWSER0x1BD
CONSUMER_AL_OEM_HELP0x1BE
CONSUMER_AL_ONLINE_COMMUNITY0x1BF
CONSUMER_AL_ENTERTAINMENT_CONTENT_BROWSER0x1C0
CONSUMER_AL_ONLINE_SHOPPING_BROWSER0x1C1
CONSUMER_AL_SMARTCARD_INFORMATION_HELP0x1C2
CONSUMER_AL_MARKET_MONITOR_FINANCE_BROWSER0x1C3
CONSUMER_AL_CUSTOMIZED_CORPORATE_NEWS_BROWSER0x1C4
CONSUMER_AL_ONLINE_ACTIVITY_BROWSER0x1C5
CONSUMER_AL_RESEARCH_SEARCH_BROWSER0x1C6
CONSUMER_AL_AUDIO_PLAYER0x1C7
CONSUMER_AL_MESSAGE_STATUS0x1C8
CONSUMER_AL_CONTACT_SYNC0x1C9
CONSUMER_AL_NAVIGATION0x1CA
CONSUMER_AL_CONTEXT_AWARE_DESKTOP_ASSISTANT0x1CB
CONSUMER_GENERIC_GUI_APPLICATION_CONTROLS0x200
CONSUMER_AC_NEW0x201
CONSUMER_AC_OPEN0x202
CONSUMER_AC_CLOSE0x203
CONSUMER_AC_EXIT0x204
CONSUMER_AC_MAXIMIZE0x205
CONSUMER_AC_MINIMIZE0x206
CONSUMER_AC_SAVE0x207
CONSUMER_AC_PRINT0x208
CONSUMER_AC_PROPERTIES0x209
CONSUMER_AC_UNDO0x21A
CONSUMER_AC_COPY0x21B
CONSUMER_AC_CUT0x21C
CONSUMER_AC_PASTE0x21D
CONSUMER_AC_SELECT_ALL0x21E
CONSUMER_AC_FIND0x21F
CONSUMER_AC_FIND_AND_REPLACE0x220
CONSUMER_AC_SEARCH0x221
CONSUMER_AC_GO_TO0x222
CONSUMER_AC_HOME0x223
CONSUMER_AC_BACK0x224
CONSUMER_AC_FORWARD0x225
CONSUMER_AC_STOP0x226
CONSUMER_AC_REFRESH0x227
CONSUMER_AC_PREVIOUS_LINK0x228
CONSUMER_AC_NEXT_LINK0x229
CONSUMER_AC_BOOKMARKS0x22A
CONSUMER_AC_HISTORY0x22B
CONSUMER_AC_SUBSCRIPTIONS0x22C
CONSUMER_AC_ZOOM_IN0x22D
CONSUMER_AC_ZOOM_OUT0x22E
CONSUMER_AC_ZOOM0x22F
CONSUMER_AC_FULL_SCREEN_VIEW0x230
CONSUMER_AC_NORMAL_VIEW0x231
CONSUMER_AC_VIEW_TOGGLE0x232
CONSUMER_AC_SCROLL_UP0x233
CONSUMER_AC_SCROLL_DOWN0x234
CONSUMER_AC_SCROLL0x235
CONSUMER_AC_PAN_LEFT0x236
CONSUMER_AC_PAN_RIGHT0x237
CONSUMER_AC_PAN0x238
CONSUMER_AC_NEW_WINDOW0x239
CONSUMER_AC_TILE_HORIZONTALLY0x23A
CONSUMER_AC_TILE_VERTICALLY0x23B
CONSUMER_AC_FORMAT0x23C
CONSUMER_AC_EDIT0x23D
CONSUMER_AC_BOLD0x23E
CONSUMER_AC_ITALICS0x23F
CONSUMER_AC_UNDERLINE0x240
CONSUMER_AC_STRIKETHROUGH0x241
CONSUMER_AC_SUBSCRIPT0x242
CONSUMER_AC_SUPERSCRIPT0x243
CONSUMER_AC_ALL_CAPS0x244
CONSUMER_AC_ROTATE0x245
CONSUMER_AC_RESIZE0x246
CONSUMER_AC_FLIP_HORIZONTAL0x247
CONSUMER_AC_FLIP_VERTICAL0x248
CONSUMER_AC_MIRROR_HORIZONTAL0x249
CONSUMER_AC_MIRROR_VERTICAL0x24A
CONSUMER_AC_FONT_SELECT0x24B
CONSUMER_AC_FONT_COLOR0x24C
CONSUMER_AC_FONT_SIZE0x24D
CONSUMER_AC_JUSTIFY_LEFT0x24E
CONSUMER_AC_JUSTIFY_CENTER_H0x24F
CONSUMER_AC_JUSTIFY_RIGHT0x250
CONSUMER_AC_JUSTIFY_BLOCK_H0x251
CONSUMER_AC_JUSTIFY_TOP0x252
CONSUMER_AC_JUSTIFY_CENTER_V0x253
CONSUMER_AC_JUSTIFY_BOTTOM0x254
CONSUMER_AC_JUSTIFY_BLOCK_V0x255
CONSUMER_AC_INDENT_DECREASE0x256
CONSUMER_AC_INDENT_INCREASE0x257
CONSUMER_AC_NUMBERED_LIST0x258
CONSUMER_AC_RESTART_NUMBERING0x259
CONSUMER_AC_BULLETED_LIST0x25A
CONSUMER_AC_PROMOTE0x25B
CONSUMER_AC_DEMOTE0x25C
CONSUMER_AC_YES0x25D
CONSUMER_AC_NO0x25E
CONSUMER_AC_CANCEL0x25F
CONSUMER_AC_CATALOG0x260
CONSUMER_AC_BUY_CHECKOUT0x261
CONSUMER_AC_ADD_TO_CART0x262
CONSUMER_AC_EXPAND0x263
CONSUMER_AC_EXPAND_ALL0x264
CONSUMER_AC_COLLAPSE0x265
CONSUMER_AC_COLLAPSE_ALL0x266
CONSUMER_AC_PRINT_PREVIEW0x267
CONSUMER_AC_PASTE_SPECIAL0x268
CONSUMER_AC_INSERT_MODE0x269
CONSUMER_AC_DELETE0x26A
CONSUMER_AC_LOCK0x26B
CONSUMER_AC_UNLOCK0x26C
CONSUMER_AC_PROTECT0x26D
CONSUMER_AC_UNPROTECT0x26E
CONSUMER_AC_ATTACH_COMMENT0x26F
CONSUMER_AC_DELETE_COMMENT0x270
CONSUMER_AC_VIEW_COMMENT0x271
CONSUMER_AC_SELECT_WORD0x272
CONSUMER_AC_SELECT_SENTENCE0x273
CONSUMER_AC_SELECT_PARAGRAPH0x274
CONSUMER_AC_SELECT_COLUMN0x275
CONSUMER_AC_SELECT_ROW0x276
CONSUMER_AC_SELECT_TABLE0x277
CONSUMER_AC_SELECT_OBJECT0x278
CONSUMER_AC_REDO_REPEAT0x279
CONSUMER_AC_SORT0x27A
CONSUMER_AC_SORT_ASCENDING0x27B
CONSUMER_AC_SORT_DESCENDING0x27C
CONSUMER_AC_FILTER0x27D
CONSUMER_AC_SET_CLOCK0x27E
CONSUMER_AC_VIEW_CLOCK0x27F
CONSUMER_AC_SELECT_TIME_ZONE0x280
CONSUMER_AC_EDIT_TIME_ZONES0x281
CONSUMER_AC_SET_ALARM0x282
CONSUMER_AC_CLEAR_ALARM0x283
CONSUMER_AC_SNOOZE_ALARM0x284
CONSUMER_AC_RESET_ALARM0x285
CONSUMER_AC_SYNCHRONIZE0x286
CONSUMER_AC_SEND_RECEIVE0x287
CONSUMER_AC_SEND_TO0x288
CONSUMER_AC_REPLY0x289
CONSUMER_AC_REPLY_ALL0x28A
CONSUMER_AC_FORWARD_MSG0x28B
CONSUMER_AC_SEND0x28C
CONSUMER_AC_ATTACH_FILE0x28D
CONSUMER_AC_UPLOAD0x28E
CONSUMER_AC_DOWNLOAD_SAVE_TARGET_AS0x28F
CONSUMER_AC_SET_BORDERS0x290
CONSUMER_AC_INSERT_ROW0x291
CONSUMER_AC_INSERT_COLUMN0x292
CONSUMER_AC_INSERT_FILE0x293
CONSUMER_AC_INSERT_PICTURE0x294
CONSUMER_AC_INSERT_OBJECT0x295
CONSUMER_AC_INSERT_SYMBOL0x296
CONSUMER_AC_SAVE_AND_CLOSE0x297
CONSUMER_AC_RENAME0x298
CONSUMER_AC_MERGE0x299
CONSUMER_AC_SPLIT0x29A
CONSUMER_AC_DISRIBUTE_HORIZONTALLY0x29B
CONSUMER_AC_DISTRIBUTE_VERTICALLY0x29C
CONSUMER_AC_NEXT_KEYBOARD_LAYOUT_SELECT0x29D
CONSUMER_AC_NAVIGATION_GUIDANCE0x29E
CONSUMER_AC_DESKTOP_SHOW_ALL_WINDOWS0x29F
CONSUMER_AC_SOFT_KEY_LEFT0x2A0
CONSUMER_AC_SOFT_KEY_RIGHT0x2A1
CONSUMER_AC_DESKTOP_SHOW_ALL_APPLICATIONS0x2A2
CONSUMER_AC_IDLE_KEEP_ALIVE0x2B0
CONSUMER_EXTENDED_KEYBOARD_ATTRIBUTES_COLLECTION0x2C0
CONSUMER_KEYBOARD_FORM_FACTOR0x2C1
CONSUMER_KEYBOARD_KEY_TYPE0x2C2
CONSUMER_KEYBOARD_PHYSICAL_LAYOUT0x2C3
CONSUMER_VENDOR_SPECIFIC_KEYBOARD_PHYSICAL_LAYOUT0x2C4
CONSUMER_KEYBOARD_IETF_LANGUAGE_TAG_INDEX0x2C5
CONSUMER_IMPLEMENTED_KEYBOARD_INPUT_ASSIST_CONTROLS0x2C6
CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS0x2C7
CONSUMER_KEYBOARD_INPUT_ASSIST_NEXT0x2C8
CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS_GROUP0x2C9
CONSUMER_KEYBOARD_INPUT_ASSIST_NEXT_GROUP0x2CA
CONSUMER_KEYBOARD_INPUT_ASSIST_ACCEPT0x2CB
CONSUMER_KEYBOARD_INPUT_ASSIST_CANCEL0x2CC

System Controls (Generic Desktop Page (0x01))

Key nameUsage codeComment
SYSTEM_POWER_DOWN0x81
SYSTEM_SLEEP0x82
SYSTEM_WAKE_UP0x83
SYSTEM_CONTEXT_MENU0x84
SYSTEM_MAIN_MENU0x85
SYSTEM_APP_MENU0x86
SYSTEM_MENU_HELP0x87
SYSTEM_MENU_EXIT0x88
SYSTEM_MENU_SELECT0x89
SYSTEM_MENU_RIGHT0x8A
SYSTEM_MENU_LEFT0x8B
SYSTEM_MENU_UP0x8C
SYSTEM_MENU_DOWN0x8D
SYSTEM_COLD_RESTART0x8E
SYSTEM_WARM_RESTART0x8F
SYSTEM_DPAD_UP0x90
SYSTEM_DPAD_DOWN0x91
SYSTEM_DPAD_RIGHT0x92
SYSTEM_DPAD_LEFT0x93

BT Device Profiles

Bluetooth device profiles are tailored device configurations with ready-to-use key-mappings and prepared default UI screens. The known working key codes are defined as simple commands and directly usable in the web-configurator.

All other commands can still be used manually with the send_cmd command. Only the filtered simple commands in the profile are visible.

The remote firmware includes a set of device profiles. New profiles will be included with firmware updates. It's also possible to load custom profiles without waiting for firmware updates. Custom profiles can be uploaded with the resource endpoint in the REST Core-API. Support in the web-configurator will be added in the future.

Available device profiles:

Support articles:

Upload Custom Device Profiles

Custom profiles can be uploaded and managed with the existing /resources REST Core-API endpoints.

  • New resource type: BtDeviceProfile
  • Upload: POST /api/resources/BtDeviceProfile
    • The filename should be the value of the id field and will automatically be renamed.
    • Included profiles can be overwritten when using the same id.
  • Retrieve custom profiles: GET /api/resources/BtDeviceProfile?page=1&limit=100
  • Delete: DELETE /api/resources/BtDeviceProfile/:resourceId

See REST Core-API for more information.

BT Device Test Reports

Android

Notes:

Regular keycodes (Keyboard Keypad Page (0x07))

Source: https://android.googlesource.com/kernel/msm.git/+/refs/tags/android-14.0.0_r0.78/drivers/hid/hid-input.c#39

Key nameUsage codeAndroid key codeComment
KEY_A430
KEY_B548
KEY_C646
KEY_D732
KEY_E818
KEY_F933
KEY_G1034
KEY_H1135
KEY_I1223
KEY_J1336
KEY_K1437
KEY_L1538
KEY_M1650
KEY_N1749
KEY_O1824
KEY_P1925
KEY_Q2016
KEY_R2119
KEY_S2231
KEY_T2320
KEY_U2422
KEY_V2547
KEY_W2617
KEY_X2745
KEY_Y2821
KEY_Z2944
KEY_1302
KEY_2313
KEY_3324
KEY_4335
KEY_5346
KEY_6357
KEY_7368
KEY_8379
KEY_93810
KEY_03911
KEY_RETURN4028
KEY_ESC411
KEY_BACKSPACE4214
KEY_TAB4315
KEY_SPACE4457
KEY_MINUS4512
KEY_EQUAL4613
KEY_LEFT_BRACE4726
KEY_RIGHT_BRACE4827
KEY_BACKSLASH4943
KEY_HASH_TILDE5043
KEY_SEMICOLON5139
KEY_APOSTROPHE5240
KEY_GRAVE5341
KEY_COMMA5451
KEY_DOT5552
KEY_SLASH5653
KEY_CAPSLOCK5758
KEY_F15859
KEY_F25960
KEY_F36061
KEY_F46162
KEY_F56263
KEY_F66364
KEY_F76465
KEY_F86566
KEY_F96667
KEY_F106768
KEY_F116887
KEY_F126988
KEY_SYSRQ7099
KEY_SCROLL_LOCK7170
KEY_PAUSE72119
KEY_INSERT73110
KEY_HOME74102
KEY_PAGE_UP75104
KEY_DELETE76111
KEY_END77107
KEY_PAGE_DOWN78109
KEY_RIGHT_ARROW79106
KEY_LEFT_ARROW80105
KEY_DOWN_ARROW81108
KEY_UP_ARROW82103
KEYPAD_NUMLOCK8369
KEYPAD_SLASH8498
KEYPAD_ASTERISK8555
KEYPAD_MINUS8674
KEYPAD_PLUS8778
KEYPAD_ENTER8896
KEYPAD_18979
KEYPAD_29080
KEYPAD_39181
KEYPAD_49275
KEYPAD_59376
KEYPAD_69477
KEYPAD_79571
KEYPAD_89672
KEYPAD_99773
KEYPAD_09882
KEYPAD_DOT9983
KEY_102ND10086
KEY_APPLICATION101127
KEY_POWER102116
KEYPAD_EQUAL103117
KEY_F13104183
KEY_F14105184
KEY_F15106185
KEY_F16107186
KEY_F17108187
KEY_F18109188
KEY_F19110189
KEY_F20111190
KEY_F21112191
KEY_F22113192
KEY_F23114193
KEY_F24115194
KEY_EXECUTE116134
KEY_HELP117138
KEY_MENU118130
KEY_SELECT119132
KEY_STOP120128
KEY_AGAIN121129
KEY_UNDO122131
KEY_CUT123137
KEY_COPY124133
KEY_PASTE125135
KEY_FIND126136
KEY_MUTE127113
KEY_VOLUME_UP128115
KEY_VOLUME_DOWN129114
-130-
-131-
-132-
KEYPAD_COMMA133121
-134-
KEY_RO13589
KEY_KATAKANA_HIRAGANA13693
KEY_YEN137124
KEY_HENKAN13892
KEY_MUHENKAN13994
KEYPAD_JPCOMMA14095
KEY_INTERNATIONAL7141-
KEY_INTERNATIONAL8142-
KEY_INTERNATIONAL9143-
KEY_HANGEUL144122
KEY_HANJA145123
KEY_KATAKANA14690
KEY_HIRAGANA14791
KEY_ZENKAKU_HANKAKU14885
KEY_FURIGANA149-
KEY_LANG7150-
KEY_LANG8151-
KEY_LANG9152-
-153-
-154-
-155-
-156111 KEY_DELETE
-157-
-158-
-159-
-160-
-161-
-162-
-163-
-164-
-165-
-166-
-167-
-168-
-169-
-170-
-171-
-172-
-173-
-174-
-175-
-176-
-177-
-178-
-179-
-180-
-181-
-182179 KEY_KPLEFTPAREN
-183180 KEY_KPRIGHTPAREN
-184-
-185-
-186-
-187-
-188-
-189-
-190-
-191-
-192-
-193-
-194-
-195-
-196-
-197-
-198-
-199-
-200-
-201-
-202-
-203-
-204-
-205-
-206-
-207-
-208-
-209-
-210-
-211-
-212-
-213-
-214-
-215-
-216111 KEY_DELETE
-217-
-218-
-229-
-220-
-221-
-222-
-223-
KEY_LEFT_CONTROL22429 KEY_LEFTCTRL
KEY_LEFT_SHIFT22542 KEY_LEFTSHIFT
KEY_LEFT_ALT22656 KEY_LEFTALT
KEY_LEFT_GUI227125 KEY_LEFTMETA
KEY_RIGHT_CONTROL22897 KEY_RIGHTCTRL
KEY_RIGHT_SHIFT22954 KEY_RIGHTSHIFT
KEY_RIGHT_ALT230100 KEY_RIGHTALT
KEY_RIGHT_GUI231126 KEY_RIGHTMETA
KEY_MEDIA_PLAY_PAUSE232164Not specified in official HID Usage Table specification.
KEY_MEDIA_STOP_CD233166Applies to all "KEY_MEDIA_" keys.
KEY_MEDIA_PREVIOUS_SONG234165--> found in Android sources
KEY_MEDIA_NEXT_SONG235163
KEY_MEDIA_EJECT_CD236161
KEY_MEDIA_VOLUME_UP237115
KEY_MEDIA_VOLUME_DOWN238114
KEY_MEDIA_MUTE239113
KEY_MEDIA_WWW240150
KEY_MEDIA_BACK241158
KEY_MEDIA_FORWARD242159
KEY_MEDIA_STOP243128
KEY_MEDIA_FIND244136
KEY_MEDIA_SCROLL_UP245177
KEY_MEDIA_SCROLL_DOWN246178
KEY_MEDIA_EDIT247176
KEY_MEDIA_SLEEP248142
KEY_MEDIA_COFFEE249152
KEY_MEDIA_REFRESH250173
KEY_MEDIA_CALC251140
-252-
-253-
-254-
-255-

Consumer codes (Consumer Page (0x0C))

  • Source: https://android.googlesource.com/kernel/msm.git/+/refs/tags/android-14.0.0_r0.78/drivers/hid/hid-input.c#875
  • Android key events: https://developer.android.com/reference/android/view/KeyEvent
Key nameUsage codeAndroid key codeComment
CONSUMER_INCREMENT_100x020
CONSUMER_INCREMENT_1000x021
CONSUMER_AM_PM0x022
CONSUMER_POWER0x030KEY_POWERPower toggle (sleep / wake)
CONSUMER_RESET0x031KEY_RESTART
CONSUMER_SLEEP0x032KEY_SLEEPSleep, no wake
CONSUMER_SLEEP_AFTER0x033
CONSUMER_SLEEP_MODE0x034KEY_SLEEP
CONSUMER_ILLUMINATION0x035KEY_KBDILLUMTOGGLE
CONSUMER_FUNCTION_BUTTONS0x036BTN_MISC
CONSUMER_MENU0x040KEY_MENUMenu
CONSUMER_MENU_PICK0x041KEY_SELECTMenu Pick
CONSUMER_MENU_UP0x042KEY_UPMenu Up
CONSUMER_MENU_DOWN0x043KEY_DOWNMenu Down
CONSUMER_MENU_LEFT0x044KEY_LEFTMenu Left
CONSUMER_MENU_RIGHT0x045KEY_RIGHTMenu Right
CONSUMER_MENU_ESCAPE0x046KEY_ESCMenu Escape
CONSUMER_MENU_VALUE_INCREASE0x047KEY_KPPLUSMenu Value Increase
CONSUMER_MENU_VALUE_DECREASE0x048KEY_KPMINUSMenu Value Decrease
CONSUMER_DATA_ON_SCREEN0x060KEY_INFOData On Screen
CONSUMER_CLOSED_CAPTION0x061KEY_SUBTITLEClosed Caption
CONSUMER_CLOSED_CAPTION_SELECT0x062
CONSUMER_VCR_TV0x063KEY_VCRVCR/TV
CONSUMER_BROADCAST_MODE0x064
CONSUMER_SNAPSHOT0x065KEY_CAMERASnapshot
CONSUMER_STILL0x066
CONSUMER_PICTURE_IN_PICTURE_TOGGLE0x067
CONSUMER_PICTURE_IN_PICTURE_SWAP0x068
CONSUMER_RED_MENU_BUTTON0x069KEY_RED
CONSUMER_GREEN_MENU_BUTTON0x06AKEY_GREEN
CONSUMER_BLUE_MENU_BUTTON0x06BKEY_BLUE
CONSUMER_YELLOW_MENU_BUTTON0x06CKEY_YELLOW
CONSUMER_ASPECT0x06DKEY_ZOOM
CONSUMER_MODE_SELECT_3D0x06E
CONSUMER_DISPLAY_BRIGHTNESS_INCREMENT0x06FKEY_BRIGHTNESSUP
CONSUMER_DISPLAY_BRIGHTNESS_DECREMENT0x070KEY_BRIGHTNESSDOWN
CONSUMER_DISPLAY_BRIGHTNESS0x071
CONSUMER_DISPLAY_BACKLIGHT_TOGGLE0x072KEY_BRIGHTNESS_TOGGLE
CONSUMER_DISPLAY_SET_BRIGHTNESS_TO_MINIMUM0x073KEY_BRIGHTNESS_MIN
CONSUMER_DISPLAY_SET_BRIGHTNESS_TO_MAXIMUM0x074KEY_BRIGHTNESS_MAX
CONSUMER_DISPLAY_SET_AUTO_BRIGHTNESS0x075KEY_BRIGHTNESS_AUTO
CONSUMER_CAMERA_ACCESS_ENABLED0x076
CONSUMER_CAMERA_ACCESS_DISABLED0x077
CONSUMER_CAMERA_ACCESS_TOGGLE0x078
CONSUMER_KEYBOARD_BRIGHTNESS_INCREMENT0x079KEY_KBDILLUMUP
CONSUMER_KEYBOARD_BRIGHTNESS_DECREMENT0x07AKEY_KBDILLUMDOWN
CONSUMER_KEYBOARD_BACKLIGHT_SET_LEVEL0x07B
CONSUMER_KEYBOARD_BACKLIGHT_OOC0x07CKEY_KBDILLUMTOGGLE
CONSUMER_KEYBOARD_BACKLIGHT_SET_MINIMUM0x07D
CONSUMER_KEYBOARD_BACKLIGHT_SET_MAXIMUM0x07E
CONSUMER_KEYBOARD_BACKLIGHT_AUTO0x07F
CONSUMER_SELECTION0x080
CONSUMER_ASSIGN_SELECTION0x081
CONSUMER_MODE_STEP0x082KEY_VIDEO_NEXT
CONSUMER_RECALL_LAST0x083KEY_LAST
CONSUMER_ENTER_CHANNEL0x084KEY_ENTER
CONSUMER_ORDER_MOVIE0x085
CONSUMER_CHANNEL0x086
CONSUMER_MEDIA_SELECTION0x087
CONSUMER_MEDIA_SELECT_COMPUTER0x088KEY_PC
CONSUMER_MEDIA_SELECT_TV0x089KEY_TV
CONSUMER_MEDIA_SELECT_WWW0x08AKEY_WWW
CONSUMER_MEDIA_SELECT_DVD0x08BKEY_DVD
CONSUMER_MEDIA_SELECT_TELEPHONE0x08CKEY_PHONE
CONSUMER_MEDIA_SELECT_PROGRAM_GUIDE0x08DKEY_PROGRAM
CONSUMER_MEDIA_SELECT_VIDEO_PHONE0x08EKEY_VIDEOPHONE
CONSUMER_MEDIA_SELECT_GAMES0x08FKEY_GAMES
CONSUMER_MEDIA_SELECT_MESSAGES0x090KEY_MEMO
CONSUMER_MEDIA_SELECT_CD0x091KEY_CD
CONSUMER_MEDIA_SELECT_VCR0x092KEY_VCR
CONSUMER_MEDIA_SELECT_TUNER0x093KEY_TUNER
CONSUMER_QUIT0x094KEY_EXIT
CONSUMER_HELP0x095KEY_HELP
CONSUMER_MEDIA_SELECT_TAPE0x096KEY_TAPE
CONSUMER_MEDIA_SELECT_CABLE0x097KEY_TV2
CONSUMER_MEDIA_SELECT_SATELLITE0x098KEY_SAT
CONSUMER_MEDIA_SELECT_SECURITY0x099
CONSUMER_MEDIA_SELECT_HOME0x09AKEY_PVR
CONSUMER_MEDIA_SELECT_CALL0x09B
CONSUMER_CHANNEL_INCREMENT0x09CKEY_CHANNELUP
CONSUMER_CHANNEL_DECREMENT0x09DKEY_CHANNELDOWN
CONSUMER_MEDIA_SELECT_SAP0x09E
CONSUMER_VCR_PLUS0x0A0KEY_VCR2
CONSUMER_ONCE0x0A1
CONSUMER_DAILY0x0A2
CONSUMER_WEEKLY0x0A3
CONSUMER_MONTHLY0x0A4
CONSUMER_PLAY0x0B0KEY_PLAY
CONSUMER_PAUSE0x0B1KEY_PAUSE
CONSUMER_RECORD0x0B2KEY_RECORD
CONSUMER_FAST_FORWARD0x0B3KEY_FASTFORWARD
CONSUMER_REWIND0x0B4KEY_REWIND
CONSUMER_SCAN_NEXT_TRACK0x0B5KEY_NEXTSONG
CONSUMER_SCAN_PREVIOUS_TRACK0x0B6KEY_PREVIOUSSONG
CONSUMER_STOP0x0B7KEY_STOPCD
CONSUMER_EJECT0x0B8KEY_EJECTCD
CONSUMER_RANDOM_PLAY0x0B9KEY_SHUFFLE
CONSUMER_SELECT_DISC0x0BA
CONSUMER_ENTER_DISC0x0BB
CONSUMER_REPEAT0x0BCKEY_MEDIA_REPEAT
CONSUMER_TRACKING0x0BD
CONSUMER_TRACK_NORMAL0x0BE
CONSUMER_SLOW_TRACKING0x0BFKEY_SLOW
CONSUMER_FRAME_FORWARD0x0C0
CONSUMER_FRAME_BACK0x0C1
CONSUMER_MARK0x0C2
CONSUMER_CLEAR_MARK0x0C3
CONSUMER_REPEAT_FROM_MARK0x0C4
CONSUMER_RETURN_TO_MARK0x0C5
CONSUMER_SEARCH_MARK_FORWARD0x0C6
CONSUMER_SEARCH_MARK_BACKWARDS0x0C7
CONSUMER_COUNTER_RESET0x0C8
CONSUMER_SHOW_COUNTER0x0C9
CONSUMER_TRACKING_INCREMENT0x0CA
CONSUMER_TRACKING_DECREMENT0x0CB
CONSUMER_STOP_EJECT0x0CC
CONSUMER_PLAY_PAUSE0x0CDKEY_PLAYPAUSE
CONSUMER_PLAY_SKIP0x0CE
CONSUMER_VOICE_COMMAND0x0CFKEY_VOICECOMMAND
CONSUMER_INVOKE_CAPTURE_INTERFACE0x0D0
CONSUMER_START_OR_STOP_GAME_RECORDING0x0D1
CONSUMER_HISTORICAL_GAME_CAPTURE0x0D2
CONSUMER_CAPTURE_GAME_SCREENSHOT0x0D3
CONSUMER_SHOW_OR_HIDE_RECORDING_INDICATOR0x0D4
CONSUMER_START_OR_STOP_MICROPHONE_CAPTURE0x0D5
CONSUMER_START_OR_STOP_CAMERA_CAPTURE0x0D6
CONSUMER_START_OR_STOP_GAME_BROADCAST0x0D7
CONSUMER_VOLUME0x0E0ABS_VOLUME
CONSUMER_BALANCE0x0E1
CONSUMER_MUTE0x0E2KEY_MUTE
CONSUMER_BASS0x0E3
CONSUMER_TREBLE0x0E4
CONSUMER_BASS_BOOST0x0E5KEY_BASSBOOST
CONSUMER_SURROUND_MODE0x0E6
CONSUMER_LOUDNESS0x0E7
CONSUMER_MPX0x0E8
CONSUMER_VOLUME_INCREMENT0x0E9KEY_VOLUMEUP
CONSUMER_VOLUME_DECREMENT0x0EAKEY_VOLUMEDOWN
CONSUMER_SPEED_SELECT0x0F0
CONSUMER_PLAYBACK_SPEED0x0F1
CONSUMER_STANDARD_PLAY0x0F2
CONSUMER_LONG_PLAY0x0F3
CONSUMER_EXTENDED_PLAY0x0F4
CONSUMER_SLOW0x0F5KEY_SLOW
CONSUMER_FAN_ENABLE0x100
CONSUMER_FAN_SPEED0x101
CONSUMER_LIGHT_ENABLE0x102
CONSUMER_LIGHT_ILLUMINATION_LEVEL0x103
CONSUMER_CLIMATE_CONTROL_ENABLE0x104
CONSUMER_ROOM_TEMPERATURE0x105
CONSUMER_SECURITY_ENABLE0x106
CONSUMER_FIRE_ALARM0x107
CONSUMER_POLICE_ALARM0x108
CONSUMER_PROXIMITY0x109
CONSUMER_MOTION0x10A
CONSUMER_DURESS_ALARM0x10B
CONSUMER_HOLDUP_ALARM0x10C
CONSUMER_MEDICAL_ALARM0x10D
CONSUMER_BALANCE_RIGHT0x150
CONSUMER_BALANCE_LEFT0x151
CONSUMER_BASS_INCREMENT0x152
CONSUMER_BASS_DECREMENT0x153
CONSUMER_TREBLE_INCREMENT0x154
CONSUMER_TREBLE_DECREMENT0x155
CONSUMER_SPEAKER_SYSTEM0x160
CONSUMER_CHANNEL_LEFT0x161
CONSUMER_CHANNEL_RIGHT0x162
CONSUMER_CHANNEL_CENTER0x163
CONSUMER_CHANNEL_FRONT0x164
CONSUMER_CHANNEL_CENTER_FRONT0x165
CONSUMER_CHANNEL_SIDE0x166
CONSUMER_CHANNEL_SURROUND0x167
CONSUMER_CHANNEL_LOW_FREQUENCY_ENHANCEMENT0x168
CONSUMER_CHANNEL_TOP0x169
CONSUMER_CHANNEL_UNKNOWN0x16A
CONSUMER_SUB_CHANNEL0x170
CONSUMER_SUB_CHANNEL_INCREMENT0x171
CONSUMER_SUB_CHANNEL_DECREMENT0x172
CONSUMER_ALTERNATE_AUDIO_INCREMENT0x173
CONSUMER_ALTERNATE_AUDIO_DECREMENT0x174
CONSUMER_APPLICATION_LAUNCH_BUTTONS0x180
CONSUMER_AL_LAUNCH_BUTTON_CONFIGURATION_TOOL0x181KEY_BUTTONCONFIG
CONSUMER_AL_PROGRAMMABLE_BUTTON_CONFIGURATION0x182KEY_BOOKMARKS
CONSUMER_AL_CONSUMER_CONTROL_CONFIGURATION0x183KEY_CONFIG
CONSUMER_AL_WORD_PROCESSOR0x184KEY_WORDPROCESSOR
CONSUMER_AL_TEXT_EDITOR0x185KEY_EDITOR
CONSUMER_AL_SPREADSHEET0x186KEY_SPREADSHEET
CONSUMER_AL_GRAPHICS_EDITOR0x187KEY_GRAPHICSEDITOR
CONSUMER_AL_PRESENTATION_APP0x188KEY_PRESENTATION
CONSUMER_AL_DATABASE_APP0x189KEY_DATABASE
CONSUMER_AL_EMAIL_READER0x18AKEY_MAIL
CONSUMER_AL_NEWSREADER0x18BKEY_NEWS
CONSUMER_AL_VOICEMAIL0x18CKEY_VOICEMAIL
CONSUMER_AL_CONTACTS_ADDRESS_BOOK0x18DKEY_ADDRESSBOOK
CONSUMER_AL_CALENDAR_SCHEDULE0x18EKEY_CALENDAR
CONSUMER_AL_TASK_PROJECT_MANAGER0x18FKEY_TASKMANAGER
CONSUMER_AL_LOG_JOURNAL_TIMECARD0x190KEY_JOURNAL
CONSUMER_AL_CHECKBOOK_FINANCE0x191KEY_FINANCE
CONSUMER_AL_CALCULATOR0x192KEY_CALC
CONSUMER_AL_A_V_CAPTURE_PLAYBACK0x193KEY_PLAYER
CONSUMER_AL_LOCAL_MACHINE_BROWSER0x194KEY_FILE
CONSUMER_AL_LAN_WAN_BROWSER0x195
CONSUMER_AL_INTERNET_BROWSER0x196KEY_WWW
CONSUMER_AL_REMOTE_NETWORKING_ISP_CONNECT0x197
CONSUMER_AL_NETWORK_CONFERENCE0x198
CONSUMER_AL_NETWORK_CHAT0x199KEY_CHAT
CONSUMER_AL_TELEPHONY_DIALER0x19A
CONSUMER_AL_LOGON0x19B
CONSUMER_AL_LOGOFF0x19CKEY_LOGOFF
CONSUMER_AL_LOGON_LOGOFF0x19D
CONSUMER_AL_TERMINAL_LOCK_SCREENSAVER0x19EKEY_COFFEE
CONSUMER_AL_CONTROL_PANEL0x19FKEY_CONTROLPANEL
CONSUMER_AL_COMMAND_LINE_PROCESSOR_RUN0x1A0
CONSUMER_AL_PROCESS_TASK_MANAGER0x1A1
CONSUMER_AL_SELECT_TASK_APPLICATION0x1A2KEY_APPSELECT
CONSUMER_AL_NEXT_TASK_APPLICATION0x1A3KEY_NEXT
CONSUMER_AL_PREVIOUS_TASK_APPLICATION0x1A4KEY_PREVIOUS
CONSUMER_AL_PREEMPTIVE_HALT_TASK_APPLICATION0x1A5
CONSUMER_AL_INTEGRATED_HELP_CENTER0x1A6KEY_HELP
CONSUMER_AL_DOCUMENTS0x1A7KEY_DOCUMENTS
CONSUMER_AL_THESAURUS0x1A8
CONSUMER_AL_DICTIONARY0x1A9
CONSUMER_AL_DESKTOP0x1AA
CONSUMER_AL_SPELL_CHECK0x1ABKEY_SPELLCHECK
CONSUMER_AL_GRAMMAR_CHECK0x1AC
CONSUMER_AL_WIRELESS_STATUS0x1AD
CONSUMER_AL_KEYBOARD_LAYOUT0x1AEKEY_KEYBOARD
CONSUMER_AL_VIRUS_PROTECTION0x1AF
CONSUMER_AL_ENCRYPTION0x1B0
CONSUMER_AL_SCREEN_SAVER0x1B1KEY_SCREENSAVER
CONSUMER_AL_ALARMS0x1B2
CONSUMER_AL_CLOCK0x1B3
CONSUMER_AL_FILE_BROWSER0x1B4KEY_FILE
CONSUMER_AL_POWER_STATUS0x1B5
CONSUMER_AL_IMAGE_BROWSER0x1B6KEY_IMAGES
CONSUMER_AL_AUDIO_BROWSER0x1B7KEY_AUDIO
CONSUMER_AL_MOVIE_BROWSER0x1B8KEY_VIDEO
CONSUMER_AL_DIGITAL_RIGHTS_MANAGER0x1B9
CONSUMER_AL_DIGITAL_WALLET0x1BA
CONSUMER_AL_INSTANT_MESSAGING0x1BCKEY_MESSENGER
CONSUMER_AL_OEM_FEATURES_TIPS_TUTORIAL_BROWSER0x1BDKEY_INFO
CONSUMER_AL_OEM_HELP0x1BE
CONSUMER_AL_ONLINE_COMMUNITY0x1BF
CONSUMER_AL_ENTERTAINMENT_CONTENT_BROWSER0x1C0
CONSUMER_AL_ONLINE_SHOPPING_BROWSER0x1C1
CONSUMER_AL_SMARTCARD_INFORMATION_HELP0x1C2
CONSUMER_AL_MARKET_MONITOR_FINANCE_BROWSER0x1C3
CONSUMER_AL_CUSTOMIZED_CORPORATE_NEWS_BROWSER0x1C4
CONSUMER_AL_ONLINE_ACTIVITY_BROWSER0x1C5
CONSUMER_AL_RESEARCH_SEARCH_BROWSER0x1C6
CONSUMER_AL_AUDIO_PLAYER0x1C7
CONSUMER_AL_MESSAGE_STATUS0x1C8
CONSUMER_AL_CONTACT_SYNC0x1C9
CONSUMER_AL_NAVIGATION0x1CA
CONSUMER_AL_CONTEXT_AWARE_DESKTOP_ASSISTANT0x1CBKEY_ASSISTANT
CONSUMER_GENERIC_GUI_APPLICATION_CONTROLS0x200
CONSUMER_AC_NEW0x201KEY_NEW
CONSUMER_AC_OPEN0x202KEY_OPEN
CONSUMER_AC_CLOSE0x203KEY_CLOSE
CONSUMER_AC_EXIT0x204KEY_EXIT
CONSUMER_AC_MAXIMIZE0x205
CONSUMER_AC_MINIMIZE0x206
CONSUMER_AC_SAVE0x207KEY_SAVE
CONSUMER_AC_PRINT0x208KEY_PRINT
CONSUMER_AC_PROPERTIES0x209KEY_PROPS
CONSUMER_AC_UNDO0x21AKEY_UNDO
CONSUMER_AC_COPY0x21BKEY_COPY
CONSUMER_AC_CUT0x21CKEY_CUT
CONSUMER_AC_PASTE0x21DKEY_PASTE
CONSUMER_AC_SELECT_ALL0x21E
CONSUMER_AC_FIND0x21FKEY_FIND
CONSUMER_AC_FIND_AND_REPLACE0x220
CONSUMER_AC_SEARCH0x221KEY_SEARCH
CONSUMER_AC_GO_TO0x222KEY_GOTO
CONSUMER_AC_HOME0x223KEY_HOMEPAGE
CONSUMER_AC_BACK0x224KEY_BACK
CONSUMER_AC_FORWARD0x225KEY_FORWARD
CONSUMER_AC_STOP0x226KEY_STOP
CONSUMER_AC_REFRESH0x227KEY_REFRESH
CONSUMER_AC_PREVIOUS_LINK0x228
CONSUMER_AC_NEXT_LINK0x229
CONSUMER_AC_BOOKMARKS0x22AKEY_BOOKMARKS
CONSUMER_AC_HISTORY0x22B
CONSUMER_AC_SUBSCRIPTIONS0x22C
CONSUMER_AC_ZOOM_IN0x22DKEY_ZOOMIN
CONSUMER_AC_ZOOM_OUT0x22EKEY_ZOOMOUT
CONSUMER_AC_ZOOM0x22FKEY_ZOOMRESET
CONSUMER_AC_FULL_SCREEN_VIEW0x230
CONSUMER_AC_NORMAL_VIEW0x231
CONSUMER_AC_VIEW_TOGGLE0x232
CONSUMER_AC_SCROLL_UP0x233KEY_SCROLLUP
CONSUMER_AC_SCROLL_DOWN0x234KEY_SCROLLDOWN
CONSUMER_AC_SCROLL0x235
CONSUMER_AC_PAN_LEFT0x236
CONSUMER_AC_PAN_RIGHT0x237
CONSUMER_AC_PAN0x238REL_HWHEEL
CONSUMER_AC_NEW_WINDOW0x239
CONSUMER_AC_TILE_HORIZONTALLY0x23A
CONSUMER_AC_TILE_VERTICALLY0x23B
CONSUMER_AC_FORMAT0x23C
CONSUMER_AC_EDIT0x23DKEY_EDIT
CONSUMER_AC_BOLD0x23E
CONSUMER_AC_ITALICS0x23F
CONSUMER_AC_UNDERLINE0x240
CONSUMER_AC_STRIKETHROUGH0x241
CONSUMER_AC_SUBSCRIPT0x242
CONSUMER_AC_SUPERSCRIPT0x243
CONSUMER_AC_ALL_CAPS0x244
CONSUMER_AC_ROTATE0x245
CONSUMER_AC_RESIZE0x246
CONSUMER_AC_FLIP_HORIZONTAL0x247
CONSUMER_AC_FLIP_VERTICAL0x248
CONSUMER_AC_MIRROR_HORIZONTAL0x249
CONSUMER_AC_MIRROR_VERTICAL0x24A
CONSUMER_AC_FONT_SELECT0x24B
CONSUMER_AC_FONT_COLOR0x24C
CONSUMER_AC_FONT_SIZE0x24D
CONSUMER_AC_JUSTIFY_LEFT0x24E
CONSUMER_AC_JUSTIFY_CENTER_H0x24F
CONSUMER_AC_JUSTIFY_RIGHT0x250
CONSUMER_AC_JUSTIFY_BLOCK_H0x251
CONSUMER_AC_JUSTIFY_TOP0x252
CONSUMER_AC_JUSTIFY_CENTER_V0x253
CONSUMER_AC_JUSTIFY_BOTTOM0x254
CONSUMER_AC_JUSTIFY_BLOCK_V0x255
CONSUMER_AC_INDENT_DECREASE0x256
CONSUMER_AC_INDENT_INCREASE0x257
CONSUMER_AC_NUMBERED_LIST0x258
CONSUMER_AC_RESTART_NUMBERING0x259
CONSUMER_AC_BULLETED_LIST0x25A
CONSUMER_AC_PROMOTE0x25B
CONSUMER_AC_DEMOTE0x25C
CONSUMER_AC_YES0x25D
CONSUMER_AC_NO0x25E
CONSUMER_AC_CANCEL0x25FKEY_CANCEL
CONSUMER_AC_CATALOG0x260
CONSUMER_AC_BUY_CHECKOUT0x261
CONSUMER_AC_ADD_TO_CART0x262
CONSUMER_AC_EXPAND0x263
CONSUMER_AC_EXPAND_ALL0x264
CONSUMER_AC_COLLAPSE0x265
CONSUMER_AC_COLLAPSE_ALL0x266
CONSUMER_AC_PRINT_PREVIEW0x267
CONSUMER_AC_PASTE_SPECIAL0x268
CONSUMER_AC_INSERT_MODE0x269KEY_INSERT
CONSUMER_AC_DELETE0x26AKEY_DELETE
CONSUMER_AC_LOCK0x26B
CONSUMER_AC_UNLOCK0x26C
CONSUMER_AC_PROTECT0x26D
CONSUMER_AC_UNPROTECT0x26E
CONSUMER_AC_ATTACH_COMMENT0x26F
CONSUMER_AC_DELETE_COMMENT0x270
CONSUMER_AC_VIEW_COMMENT0x271
CONSUMER_AC_SELECT_WORD0x272
CONSUMER_AC_SELECT_SENTENCE0x273
CONSUMER_AC_SELECT_PARAGRAPH0x274
CONSUMER_AC_SELECT_COLUMN0x275
CONSUMER_AC_SELECT_ROW0x276
CONSUMER_AC_SELECT_TABLE0x277
CONSUMER_AC_SELECT_OBJECT0x278
CONSUMER_AC_REDO_REPEAT0x279KEY_REDO
CONSUMER_AC_SORT0x27A
CONSUMER_AC_SORT_ASCENDING0x27B
CONSUMER_AC_SORT_DESCENDING0x27C
CONSUMER_AC_FILTER0x27D
CONSUMER_AC_SET_CLOCK0x27E
CONSUMER_AC_VIEW_CLOCK0x27F
CONSUMER_AC_SELECT_TIME_ZONE0x280
CONSUMER_AC_EDIT_TIME_ZONES0x281
CONSUMER_AC_SET_ALARM0x282
CONSUMER_AC_CLEAR_ALARM0x283
CONSUMER_AC_SNOOZE_ALARM0x284
CONSUMER_AC_RESET_ALARM0x285
CONSUMER_AC_SYNCHRONIZE0x286
CONSUMER_AC_SEND_RECEIVE0x287
CONSUMER_AC_SEND_TO0x288
CONSUMER_AC_REPLY0x289KEY_REPLY
CONSUMER_AC_REPLY_ALL0x28A
CONSUMER_AC_FORWARD_MSG0x28BKEY_FORWARDMAIL
CONSUMER_AC_SEND0x28CKEY_SEND
CONSUMER_AC_ATTACH_FILE0x28D
CONSUMER_AC_UPLOAD0x28E
CONSUMER_AC_DOWNLOAD_SAVE_TARGET_AS0x28F
CONSUMER_AC_SET_BORDERS0x290
CONSUMER_AC_INSERT_ROW0x291
CONSUMER_AC_INSERT_COLUMN0x292
CONSUMER_AC_INSERT_FILE0x293
CONSUMER_AC_INSERT_PICTURE0x294
CONSUMER_AC_INSERT_OBJECT0x295
CONSUMER_AC_INSERT_SYMBOL0x296
CONSUMER_AC_SAVE_AND_CLOSE0x297
CONSUMER_AC_RENAME0x298
CONSUMER_AC_MERGE0x299
CONSUMER_AC_SPLIT0x29A
CONSUMER_AC_DISRIBUTE_HORIZONTALLY0x29B
CONSUMER_AC_DISTRIBUTE_VERTICALLY0x29C
CONSUMER_AC_NEXT_KEYBOARD_LAYOUT_SELECT0x29D
CONSUMER_AC_NAVIGATION_GUIDANCE0x29E
CONSUMER_AC_DESKTOP_SHOW_ALL_WINDOWS0x29F
CONSUMER_AC_SOFT_KEY_LEFT0x2A0
CONSUMER_AC_SOFT_KEY_RIGHT0x2A1
CONSUMER_AC_DESKTOP_SHOW_ALL_APPLICATIONS0x2A2KEY_ALL_APPLICATIONS
CONSUMER_AC_IDLE_KEEP_ALIVE0x2B0
CONSUMER_EXTENDED_KEYBOARD_ATTRIBUTES_COLLECTION0x2C0
CONSUMER_KEYBOARD_FORM_FACTOR0x2C1
CONSUMER_KEYBOARD_KEY_TYPE0x2C2
CONSUMER_KEYBOARD_PHYSICAL_LAYOUT0x2C3
CONSUMER_VENDOR_SPECIFIC_KEYBOARD_PHYSICAL_LAYOUT0x2C4
CONSUMER_KEYBOARD_IETF_LANGUAGE_TAG_INDEX0x2C5
CONSUMER_IMPLEMENTED_KEYBOARD_INPUT_ASSIST_CONTROLS0x2C6
CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS0x2C7KEY_KBDINPUTASSIST_PREV
CONSUMER_KEYBOARD_INPUT_ASSIST_NEXT0x2C8KEY_KBDINPUTASSIST_NEXT
CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS_GROUP0x2C9KEY_KBDINPUTASSIST_PREVGROUP
CONSUMER_KEYBOARD_INPUT_ASSIST_NEXT_GROUP0x2CAKEY_KBDINPUTASSIST_NEXTGROUP
CONSUMER_KEYBOARD_INPUT_ASSIST_ACCEPT0x2CBKEY_KBDINPUTASSIST_ACCEPT
CONSUMER_KEYBOARD_INPUT_ASSIST_CANCEL0x2CCKEY_KBDINPUTASSIST_CANCEL
0x29fKEY_SCALE

System Controls (Generic Desktop Page (0x01))

Key nameUsage codeAndroid key codeComment
SYSTEM_POWER_DOWN0x81KEY_POWER
SYSTEM_SLEEP0x82KEY_SLEEPSleep
SYSTEM_WAKE_UP0x83KEY_WAKEUPWake up
SYSTEM_CONTEXT_MENU0x84KEY_CONTEXT_MENU
SYSTEM_MAIN_MENU0x85KEY_MENU
SYSTEM_APP_MENU0x86KEY_PROG1
SYSTEM_MENU_HELP0x87KEY_HELP
SYSTEM_MENU_EXIT0x88KEY_EXIT
SYSTEM_MENU_SELECT0x89KEY_SELECT
SYSTEM_MENU_RIGHT0x8aKEY_RIGHT
SYSTEM_MENU_LEFT0x8bKEY_LEFT
SYSTEM_MENU_UP0x8cKEY_UP
SYSTEM_MENU_DOWN0x8dKEY_DOWN
SYSTEM_COLD_RESTART0x8eKEY_POWER2
SYSTEM_WARM_RESTART0x8fKEY_RESTART

Apple TV

  • Tested with Apple TV 4k, TvOS 17.4

Regular keycodes (Keyboard Keypad Page (0x07))

Key nameUsage codeOKDescription
KEY_A4x
KEY_B5x
KEY_C6x
KEY_D7x
KEY_E8x
KEY_F9x
KEY_G10x
KEY_H11x
KEY_I12x
KEY_J13x
KEY_K14x
KEY_L15x
KEY_M16x
KEY_N17x
KEY_O18x
KEY_P19x
KEY_Q20x
KEY_R21x
KEY_S22x
KEY_T23x
KEY_U24x
KEY_V25x
KEY_W26x
KEY_X27x
KEY_Y28x
KEY_Z29x
KEY_130x
KEY_231x
KEY_332x
KEY_433x
KEY_534x
KEY_635x
KEY_736x
KEY_837x
KEY_938x
KEY_039x
KEY_RETURN40xSelect
KEY_ESC41xBack button
KEY_BACKSPACE42x
KEY_TAB43
KEY_SPACE44x
KEY_MINUS45x
KEY_EQUAL46x
KEY_LEFT_BRACE47x
KEY_RIGHT_BRACE48x
KEY_BACKSLASH49x
KEY_HASH_TILDE50x
KEY_SEMICOLON51x
KEY_APOSTROPHE52x
KEY_GRAVE53x
KEY_COMMA54x
KEY_DOT55x
KEY_SLASH56x
KEY_CAPSLOCK57
KEY_F158-TODO test in apps
KEY_F259-TODO test in apps
KEY_F360-TODO test in apps
KEY_F461-TODO test in apps
KEY_F562-TODO test in apps
KEY_F663-TODO test in apps
KEY_F764-TODO test in apps
KEY_F865-TODO test in apps
KEY_F966-TODO test in apps
KEY_F1067-TODO test in apps
KEY_F1168-TODO test in apps
KEY_F1269-TODO test in apps
KEY_SYSRQ70
KEY_SCROLL_LOCK71
KEY_PAUSE72
KEY_INSERT73
KEY_HOME74
KEY_PAGE_UP75
KEY_DELETE76x
KEY_END77
KEY_PAGE_DOWN78
KEY_RIGHT_ARROW79xNavigation
KEY_LEFT_ARROW80xNavigation
KEY_DOWN_ARROW81xNavigation
KEY_UP_ARROW82xNavigation
KEYPAD_NUMLOCK83
KEYPAD_SLASH84x
KEYPAD_ASTERISK85x
KEYPAD_MINUS86x
KEYPAD_PLUS87x
KEYPAD_ENTER88xSame as KEY_RETURN
KEYPAD_189x
KEYPAD_290x
KEYPAD_391x
KEYPAD_492x
KEYPAD_593x
KEYPAD_694x
KEYPAD_795x
KEYPAD_896x
KEYPAD_997x
KEYPAD_098x
KEYPAD_DOT99x
KEY_102ND100x
KEY_APPLICATION101
KEY_POWER102-
KEYPAD_EQUAL103x
KEY_F13104-
KEY_F14105-
KEY_F15106-
KEY_F16107-
KEY_F17108-
KEY_F18109-
KEY_F19110-
KEY_F20111-
KEY_F21112-
KEY_F22113-
KEY_F23114-
KEY_F24115-
KEY_EXECUTE116-
KEY_HELP117-
KEY_MENU118-
KEY_SELECT119-
KEY_STOP120-
KEY_AGAIN121
KEY_UNDO122
KEY_CUT123
KEY_COPY124
KEY_PASTE125
KEY_FIND126
KEY_MUTE127
KEY_VOLUME_UP128
KEY_VOLUME_DOWN129
KEYPAD_COMMA133
KEY_RO135
KEY_KATAKANA_HIRAGANA136
KEY_YEN137
KEY_HENKAN138
KEY_MUHENKAN139
KEYPAD_JPCOMMA140
KEY_INTERNATIONAL7141
KEY_INTERNATIONAL8142
KEY_INTERNATIONAL9143
KEY_HANGEUL144
KEY_HANJA145
KEY_KATAKANA146
KEY_HIRAGANA147
KEY_ZENKAKU_HANKAKU148
KEY_FURIGANA149
KEY_LANG7150
KEY_LANG8151
KEY_LANG9152
KEY_LEFT_CONTROL224-
KEY_LEFT_SHIFT225-
KEY_LEFT_ALT226-
KEY_LEFT_GUI227-
KEY_RIGHT_CONTROL228-
KEY_RIGHT_SHIFT229-
KEY_RIGHT_ALT230-
KEY_RIGHT_GUI231-
KEY_MEDIA_PLAY_PAUSE232-
KEY_MEDIA_STOP_CD233-
KEY_MEDIA_PREVIOUS_SONG234-
KEY_MEDIA_NEXT_SONG235-
KEY_MEDIA_EJECT_CD236-
KEY_MEDIA_VOLUME_UP237
KEY_MEDIA_VOLUME_DOWN238
KEY_MEDIA_MUTE239
KEY_MEDIA_WWW240-
KEY_MEDIA_BACK241-
KEY_MEDIA_FORWARD242-
KEY_MEDIA_STOP243-
KEY_MEDIA_FIND244-
KEY_MEDIA_SCROLL_UP245-
KEY_MEDIA_SCROLL_DOWN246-
KEY_MEDIA_EDIT247-
KEY_MEDIA_SLEEP248-
KEY_MEDIA_COFFEE249-
KEY_MEDIA_REFRESH250-
KEY_MEDIA_CALC251-

Consumer codes (Consumer Page (0x0C))

Note: it seems that any CONSUMER_ key can be used to wake up the device from standby!

key nameusage codeOKDescription
CONSUMER_INCREMENT_100x020-
CONSUMER_INCREMENT_1000x021-
CONSUMER_AM_PM0x022-
CONSUMER_POWER0x030xSettings menu, power button preselected
CONSUMER_RESET0x031-
CONSUMER_SLEEP0x032-
CONSUMER_SLEEP_AFTER0x033-
CONSUMER_SLEEP_MODE0x034-
CONSUMER_ILLUMINATION0x035-
CONSUMER_FUNCTION_BUTTONS0x036-
CONSUMER_MENU0x040xTV button
CONSUMER_MENU_PICK0x041xSelect
CONSUMER_MENU_UP0x042xNavigation
CONSUMER_MENU_DOWN0x043xNavigation
CONSUMER_MENU_LEFT0x044xNavigation
CONSUMER_MENU_RIGHT0x045xNavigation
CONSUMER_MENU_ESCAPE0x046xBack button - TODO replace CONSUMER_AC_HOME
CONSUMER_MENU_VALUE_INCREASE0x047
CONSUMER_MENU_VALUE_DECREASE0x048
CONSUMER_DATA_ON_SCREEN0x060xTV button
CONSUMER_CLOSED_CAPTION0x061
CONSUMER_CLOSED_CAPTION_SELECT0x062
CONSUMER_VCR_TV0x063
CONSUMER_BROADCAST_MODE0x064
CONSUMER_SNAPSHOT0x065
CONSUMER_STILL0x066xSRF play: pause
CONSUMER_PICTURE_IN_PICTURE_TOGGLE0x067
CONSUMER_PICTURE_IN_PICTURE_SWAP0x068
CONSUMER_RED_MENU_BUTTON0x069
CONSUMER_GREEN_MENU_BUTTON0x06A
CONSUMER_BLUE_MENU_BUTTON0x06B
CONSUMER_YELLOW_MENU_BUTTON0x06C
CONSUMER_ASPECT0x06D
CONSUMER_MODE_SELECT_3D0x06E
CONSUMER_DISPLAY_BRIGHTNESS_INCREMENT0x06F
CONSUMER_DISPLAY_BRIGHTNESS_DECREMENT0x070
CONSUMER_DISPLAY_BRIGHTNESS0x071
CONSUMER_DISPLAY_BACKLIGHT_TOGGLE0x072
CONSUMER_DISPLAY_SET_BRIGHTNESS_TO_MINIMUM0x073
CONSUMER_DISPLAY_SET_BRIGHTNESS_TO_MAXIMUM0x074
CONSUMER_DISPLAY_SET_AUTO_BRIGHTNESS0x075
CONSUMER_CAMERA_ACCESS_ENABLED0x076
CONSUMER_CAMERA_ACCESS_DISABLED0x077
CONSUMER_CAMERA_ACCESS_TOGGLE0x078
CONSUMER_KEYBOARD_BRIGHTNESS_INCREMENT0x079
CONSUMER_KEYBOARD_BRIGHTNESS_DECREMENT0x07A
CONSUMER_KEYBOARD_BACKLIGHT_SET_LEVEL0x07B
CONSUMER_KEYBOARD_BACKLIGHT_OOC0x07C
CONSUMER_KEYBOARD_BACKLIGHT_SET_MINIMUM0x07D
CONSUMER_KEYBOARD_BACKLIGHT_SET_MAXIMUM0x07E
CONSUMER_KEYBOARD_BACKLIGHT_AUTO0x07F
CONSUMER_SELECTION0x080
CONSUMER_ASSIGN_SELECTION0x081
CONSUMER_MODE_STEP0x082
CONSUMER_RECALL_LAST0x083
CONSUMER_ENTER_CHANNEL0x084
CONSUMER_ORDER_MOVIE0x085
CONSUMER_CHANNEL0x086
CONSUMER_MEDIA_SELECTION0x087-
CONSUMER_MEDIA_SELECT_COMPUTER0x088-
CONSUMER_MEDIA_SELECT_TV0x089-
CONSUMER_MEDIA_SELECT_WWW0x08A-
CONSUMER_MEDIA_SELECT_DVD0x08B-
CONSUMER_MEDIA_SELECT_TELEPHONE0x08C-
CONSUMER_MEDIA_SELECT_PROGRAM_GUIDE0x08D-
CONSUMER_MEDIA_SELECT_VIDEO_PHONE0x08E-
CONSUMER_MEDIA_SELECT_GAMES0x08F-
CONSUMER_MEDIA_SELECT_MESSAGES0x090-
CONSUMER_MEDIA_SELECT_CD0x091-
CONSUMER_MEDIA_SELECT_VCR0x092-
CONSUMER_MEDIA_SELECT_TUNER0x093-
CONSUMER_QUIT0x094
CONSUMER_HELP0x095
CONSUMER_MEDIA_SELECT_TAPE0x096-
CONSUMER_MEDIA_SELECT_CABLE0x097-
CONSUMER_MEDIA_SELECT_SATELLITE0x098-
CONSUMER_MEDIA_SELECT_SECURITY0x099-
CONSUMER_MEDIA_SELECT_HOME0x09A-
CONSUMER_MEDIA_SELECT_CALL0x09B-
CONSUMER_CHANNEL_INCREMENT0x09C
CONSUMER_CHANNEL_DECREMENT0x09D
CONSUMER_MEDIA_SELECT_SAP0x09E-
CONSUMER_VCR_PLUS0x0A0-
CONSUMER_ONCE0x0A1
CONSUMER_DAILY0x0A2
CONSUMER_WEEKLY0x0A3
CONSUMER_MONTHLY0x0A4
CONSUMER_PLAY0x0B0xApple Music
CONSUMER_PAUSE0x0B1xApple Music
CONSUMER_RECORD0x0B2
CONSUMER_FAST_FORWARD0x0B3xApple Music: next song
CONSUMER_REWIND0x0B4xApple Music: previous song
CONSUMER_SCAN_NEXT_TRACK0x0B5xApple Music
CONSUMER_SCAN_PREVIOUS_TRACK0x0B6xApple Music
CONSUMER_STOP0x0B7xApple Music
CONSUMER_EJECT0x0B8
CONSUMER_RANDOM_PLAY0x0B9
CONSUMER_SELECT_DISC0x0BA
CONSUMER_ENTER_DISC0x0BB
CONSUMER_REPEAT0x0BC
CONSUMER_TRACKING0x0BD
CONSUMER_TRACK_NORMAL0x0BE
CONSUMER_SLOW_TRACKING0x0BF
CONSUMER_FRAME_FORWARD0x0C0
CONSUMER_FRAME_BACK0x0C1
CONSUMER_MARK0x0C2
CONSUMER_CLEAR_MARK0x0C3
CONSUMER_REPEAT_FROM_MARK0x0C4
CONSUMER_RETURN_TO_MARK0x0C5
CONSUMER_SEARCH_MARK_FORWARD0x0C6
CONSUMER_SEARCH_MARK_BACKWARDS0x0C7
CONSUMER_COUNTER_RESET0x0C8
CONSUMER_SHOW_COUNTER0x0C9
CONSUMER_TRACKING_INCREMENT0x0CA
CONSUMER_TRACKING_DECREMENT0x0CB
CONSUMER_STOP_EJECT0x0CC
CONSUMER_PLAY_PAUSE0x0CDxApple Music
CONSUMER_PLAY_SKIP0x0CE
CONSUMER_VOICE_COMMAND0x0CF
CONSUMER_INVOKE_CAPTURE_INTERFACE0x0D0
CONSUMER_START_OR_STOP_GAME_RECORDING0x0D1
CONSUMER_HISTORICAL_GAME_CAPTURE0x0D2
CONSUMER_CAPTURE_GAME_SCREENSHOT0x0D3
CONSUMER_SHOW_OR_HIDE_RECORDING_INDICATOR0x0D4
CONSUMER_START_OR_STOP_MICROPHONE_CAPTURE0x0D5
CONSUMER_START_OR_STOP_CAMERA_CAPTURE0x0D6
CONSUMER_START_OR_STOP_GAME_BROADCAST0x0D7
CONSUMER_VOLUME0x0E0
CONSUMER_BALANCE0x0E1
CONSUMER_MUTE0x0E2
CONSUMER_BASS0x0E3
CONSUMER_TREBLE0x0E4
CONSUMER_BASS_BOOST0x0E5
CONSUMER_SURROUND_MODE0x0E6
CONSUMER_LOUDNESS0x0E7
CONSUMER_MPX0x0E8
CONSUMER_VOLUME_INCREMENT0x0E9
CONSUMER_VOLUME_DECREMENT0x0EA
CONSUMER_SPEED_SELECT0x0F0
CONSUMER_PLAYBACK_SPEED0x0F1
CONSUMER_STANDARD_PLAY0x0F2
CONSUMER_LONG_PLAY0x0F3
CONSUMER_EXTENDED_PLAY0x0F4
CONSUMER_SLOW0x0F5
CONSUMER_FAN_ENABLE0x100
CONSUMER_FAN_SPEED0x101
CONSUMER_LIGHT_ENABLE0x102
CONSUMER_LIGHT_ILLUMINATION_LEVEL0x103
CONSUMER_CLIMATE_CONTROL_ENABLE0x104
CONSUMER_ROOM_TEMPERATURE0x105
CONSUMER_SECURITY_ENABLE0x106
CONSUMER_FIRE_ALARM0x107
CONSUMER_POLICE_ALARM0x108
CONSUMER_PROXIMITY0x109
CONSUMER_MOTION0x10A
CONSUMER_DURESS_ALARM0x10B
CONSUMER_HOLDUP_ALARM0x10C
CONSUMER_MEDICAL_ALARM0x10D
CONSUMER_BALANCE_RIGHT0x150
CONSUMER_BALANCE_LEFT0x151
CONSUMER_BASS_INCREMENT0x152
CONSUMER_BASS_DECREMENT0x153
CONSUMER_TREBLE_INCREMENT0x154
CONSUMER_TREBLE_DECREMENT0x155
CONSUMER_SPEAKER_SYSTEM0x160
CONSUMER_CHANNEL_LEFT0x161
CONSUMER_CHANNEL_RIGHT0x162
CONSUMER_CHANNEL_CENTER0x163
CONSUMER_CHANNEL_FRONT0x164
CONSUMER_CHANNEL_CENTER_FRONT0x165
CONSUMER_CHANNEL_SIDE0x166
CONSUMER_CHANNEL_SURROUND0x167
CONSUMER_CHANNEL_LOW_FREQUENCY_ENHANCEMENT0x168
CONSUMER_CHANNEL_TOP0x169
CONSUMER_CHANNEL_UNKNOWN0x16A
CONSUMER_SUB_CHANNEL0x170
CONSUMER_SUB_CHANNEL_INCREMENT0x171
CONSUMER_SUB_CHANNEL_DECREMENT0x172
CONSUMER_ALTERNATE_AUDIO_INCREMENT0x173
CONSUMER_ALTERNATE_AUDIO_DECREMENT0x174
CONSUMER_APPLICATION_LAUNCH_BUTTONS0x180
CONSUMER_AL_LAUNCH_BUTTON_CONFIGURATION_TOOL0x181
CONSUMER_AL_PROGRAMMABLE_BUTTON_CONFIGURATION0x182
CONSUMER_AL_CONSUMER_CONTROL_CONFIGURATION0x183
CONSUMER_AL_WORD_PROCESSOR0x184
CONSUMER_AL_TEXT_EDITOR0x185
CONSUMER_AL_SPREADSHEET0x186
CONSUMER_AL_GRAPHICS_EDITOR0x187
CONSUMER_AL_PRESENTATION_APP0x188
CONSUMER_AL_DATABASE_APP0x189
CONSUMER_AL_EMAIL_READER0x18A
CONSUMER_AL_NEWSREADER0x18B
CONSUMER_AL_VOICEMAIL0x18C
CONSUMER_AL_CONTACTS_ADDRESS_BOOK0x18D
CONSUMER_AL_CALENDAR_SCHEDULE0x18E
CONSUMER_AL_TASK_PROJECT_MANAGER0x18F
CONSUMER_AL_LOG_JOURNAL_TIMECARD0x190
CONSUMER_AL_CHECKBOOK_FINANCE0x191
CONSUMER_AL_CALCULATOR0x192
CONSUMER_AL_A_V_CAPTURE_PLAYBACK0x193
CONSUMER_AL_LOCAL_MACHINE_BROWSER0x194
CONSUMER_AL_LAN_WAN_BROWSER0x195
CONSUMER_AL_INTERNET_BROWSER0x196
CONSUMER_AL_REMOTE_NETWORKING_ISP_CONNECT0x197
CONSUMER_AL_NETWORK_CONFERENCE0x198
CONSUMER_AL_NETWORK_CHAT0x199
CONSUMER_AL_TELEPHONY_DIALER0x19A
CONSUMER_AL_LOGON0x19B
CONSUMER_AL_LOGOFF0x19C
CONSUMER_AL_LOGON_LOGOFF0x19D
CONSUMER_AL_TERMINAL_LOCK_SCREENSAVER0x19E
CONSUMER_AL_CONTROL_PANEL0x19F
CONSUMER_AL_COMMAND_LINE_PROCESSOR_RUN0x1A0
CONSUMER_AL_PROCESS_TASK_MANAGER0x1A1
CONSUMER_AL_SELECT_TASK_APPLICATION0x1A2
CONSUMER_AL_NEXT_TASK_APPLICATION0x1A3
CONSUMER_AL_PREVIOUS_TASK_APPLICATION0x1A4
CONSUMER_AL_PREEMPTIVE_HALT_TASK_APPLICATION0x1A5
CONSUMER_AL_INTEGRATED_HELP_CENTER0x1A6
CONSUMER_AL_DOCUMENTS0x1A7
CONSUMER_AL_THESAURUS0x1A8
CONSUMER_AL_DICTIONARY0x1A9
CONSUMER_AL_DESKTOP0x1AA
CONSUMER_AL_SPELL_CHECK0x1AB
CONSUMER_AL_GRAMMAR_CHECK0x1AC
CONSUMER_AL_WIRELESS_STATUS0x1AD
CONSUMER_AL_KEYBOARD_LAYOUT0x1AE
CONSUMER_AL_VIRUS_PROTECTION0x1AF
CONSUMER_AL_ENCRYPTION0x1B0
CONSUMER_AL_SCREEN_SAVER0x1B1
CONSUMER_AL_ALARMS0x1B2
CONSUMER_AL_CLOCK0x1B3
CONSUMER_AL_FILE_BROWSER0x1B4
CONSUMER_AL_POWER_STATUS0x1B5-
CONSUMER_AL_IMAGE_BROWSER0x1B6
CONSUMER_AL_AUDIO_BROWSER0x1B7
CONSUMER_AL_MOVIE_BROWSER0x1B8
CONSUMER_AL_DIGITAL_RIGHTS_MANAGER0x1B9
CONSUMER_AL_DIGITAL_WALLET0x1BA
CONSUMER_AL_INSTANT_MESSAGING0x1BC
CONSUMER_AL_OEM_FEATURES_TIPS_TUTORIAL_BROWSER0x1BD
CONSUMER_AL_OEM_HELP0x1BE
CONSUMER_AL_ONLINE_COMMUNITY0x1BF
CONSUMER_AL_ENTERTAINMENT_CONTENT_BROWSER0x1C0
CONSUMER_AL_ONLINE_SHOPPING_BROWSER0x1C1
CONSUMER_AL_SMARTCARD_INFORMATION_HELP0x1C2
CONSUMER_AL_MARKET_MONITOR_FINANCE_BROWSER0x1C3
CONSUMER_AL_CUSTOMIZED_CORPORATE_NEWS_BROWSER0x1C4
CONSUMER_AL_ONLINE_ACTIVITY_BROWSER0x1C5
CONSUMER_AL_RESEARCH_SEARCH_BROWSER0x1C6
CONSUMER_AL_AUDIO_PLAYER0x1C7
CONSUMER_AL_MESSAGE_STATUS0x1C8
CONSUMER_AL_CONTACT_SYNC0x1C9
CONSUMER_AL_NAVIGATION0x1CA
CONSUMER_AL_CONTEXT_AWARE_DESKTOP_ASSISTANT0x1CB
CONSUMER_GENERIC_GUI_APPLICATION_CONTROLS0x200
CONSUMER_AC_NEW0x201
CONSUMER_AC_OPEN0x202
CONSUMER_AC_CLOSE0x203
CONSUMER_AC_EXIT0x204
CONSUMER_AC_MAXIMIZE0x205
CONSUMER_AC_MINIMIZE0x206
CONSUMER_AC_SAVE0x207
CONSUMER_AC_PRINT0x208
CONSUMER_AC_PROPERTIES0x209
CONSUMER_AC_UNDO0x21A
CONSUMER_AC_COPY0x21B
CONSUMER_AC_CUT0x21C
CONSUMER_AC_PASTE0x21D
CONSUMER_AC_SELECT_ALL0x21E
CONSUMER_AC_FIND0x21F
CONSUMER_AC_FIND_AND_REPLACE0x220
CONSUMER_AC_SEARCH0x221-
CONSUMER_AC_GO_TO0x222-
CONSUMER_AC_HOME0x223xBack button
CONSUMER_AC_BACK0x224-
CONSUMER_AC_FORWARD0x225-
CONSUMER_AC_STOP0x226-
CONSUMER_AC_REFRESH0x227
CONSUMER_AC_PREVIOUS_LINK0x228
CONSUMER_AC_NEXT_LINK0x229
CONSUMER_AC_BOOKMARKS0x22A
CONSUMER_AC_HISTORY0x22B
CONSUMER_AC_SUBSCRIPTIONS0x22C
CONSUMER_AC_ZOOM_IN0x22D
CONSUMER_AC_ZOOM_OUT0x22E
CONSUMER_AC_ZOOM0x22F
CONSUMER_AC_FULL_SCREEN_VIEW0x230
CONSUMER_AC_NORMAL_VIEW0x231
CONSUMER_AC_VIEW_TOGGLE0x232
CONSUMER_AC_SCROLL_UP0x233
CONSUMER_AC_SCROLL_DOWN0x234
CONSUMER_AC_SCROLL0x235
CONSUMER_AC_PAN_LEFT0x236
CONSUMER_AC_PAN_RIGHT0x237
CONSUMER_AC_PAN0x238
CONSUMER_AC_NEW_WINDOW0x239
CONSUMER_AC_TILE_HORIZONTALLY0x23A
CONSUMER_AC_TILE_VERTICALLY0x23B
CONSUMER_AC_FORMAT0x23C
CONSUMER_AC_EDIT0x23D
CONSUMER_AC_BOLD0x23E
CONSUMER_AC_ITALICS0x23F
CONSUMER_AC_UNDERLINE0x240
CONSUMER_AC_STRIKETHROUGH0x241
CONSUMER_AC_SUBSCRIPT0x242
CONSUMER_AC_SUPERSCRIPT0x243
CONSUMER_AC_ALL_CAPS0x244
CONSUMER_AC_ROTATE0x245
CONSUMER_AC_RESIZE0x246
CONSUMER_AC_FLIP_HORIZONTAL0x247
CONSUMER_AC_FLIP_VERTICAL0x248
CONSUMER_AC_MIRROR_HORIZONTAL0x249
CONSUMER_AC_MIRROR_VERTICAL0x24A
CONSUMER_AC_FONT_SELECT0x24B
CONSUMER_AC_FONT_COLOR0x24C
CONSUMER_AC_FONT_SIZE0x24D
CONSUMER_AC_JUSTIFY_LEFT0x24E
CONSUMER_AC_JUSTIFY_CENTER_H0x24F
CONSUMER_AC_JUSTIFY_RIGHT0x250
CONSUMER_AC_JUSTIFY_BLOCK_H0x251
CONSUMER_AC_JUSTIFY_TOP0x252
CONSUMER_AC_JUSTIFY_CENTER_V0x253
CONSUMER_AC_JUSTIFY_BOTTOM0x254
CONSUMER_AC_JUSTIFY_BLOCK_V0x255
CONSUMER_AC_INDENT_DECREASE0x256
CONSUMER_AC_INDENT_INCREASE0x257
CONSUMER_AC_NUMBERED_LIST0x258
CONSUMER_AC_RESTART_NUMBERING0x259
CONSUMER_AC_BULLETED_LIST0x25A
CONSUMER_AC_PROMOTE0x25B
CONSUMER_AC_DEMOTE0x25C
CONSUMER_AC_YES0x25D
CONSUMER_AC_NO0x25E
CONSUMER_AC_CANCEL0x25F
CONSUMER_AC_CATALOG0x260
CONSUMER_AC_BUY_CHECKOUT0x261
CONSUMER_AC_ADD_TO_CART0x262
CONSUMER_AC_EXPAND0x263
CONSUMER_AC_EXPAND_ALL0x264
CONSUMER_AC_COLLAPSE0x265
CONSUMER_AC_COLLAPSE_ALL0x266
CONSUMER_AC_PRINT_PREVIEW0x267
CONSUMER_AC_PASTE_SPECIAL0x268
CONSUMER_AC_INSERT_MODE0x269
CONSUMER_AC_DELETE0x26A
CONSUMER_AC_LOCK0x26B
CONSUMER_AC_UNLOCK0x26C
CONSUMER_AC_PROTECT0x26D
CONSUMER_AC_UNPROTECT0x26E
CONSUMER_AC_ATTACH_COMMENT0x26F
CONSUMER_AC_DELETE_COMMENT0x270
CONSUMER_AC_VIEW_COMMENT0x271
CONSUMER_AC_SELECT_WORD0x272
CONSUMER_AC_SELECT_SENTENCE0x273
CONSUMER_AC_SELECT_PARAGRAPH0x274
CONSUMER_AC_SELECT_COLUMN0x275
CONSUMER_AC_SELECT_ROW0x276
CONSUMER_AC_SELECT_TABLE0x277
CONSUMER_AC_SELECT_OBJECT0x278
CONSUMER_AC_REDO_REPEAT0x279
CONSUMER_AC_SORT0x27A
CONSUMER_AC_SORT_ASCENDING0x27B
CONSUMER_AC_SORT_DESCENDING0x27C
CONSUMER_AC_FILTER0x27D
CONSUMER_AC_SET_CLOCK0x27E
CONSUMER_AC_VIEW_CLOCK0x27F
CONSUMER_AC_SELECT_TIME_ZONE0x280
CONSUMER_AC_EDIT_TIME_ZONES0x281
CONSUMER_AC_SET_ALARM0x282
CONSUMER_AC_CLEAR_ALARM0x283
CONSUMER_AC_SNOOZE_ALARM0x284
CONSUMER_AC_RESET_ALARM0x285
CONSUMER_AC_SYNCHRONIZE0x286
CONSUMER_AC_SEND_RECEIVE0x287
CONSUMER_AC_SEND_TO0x288
CONSUMER_AC_REPLY0x289
CONSUMER_AC_REPLY_ALL0x28A
CONSUMER_AC_FORWARD_MSG0x28B
CONSUMER_AC_SEND0x28C
CONSUMER_AC_ATTACH_FILE0x28D
CONSUMER_AC_UPLOAD0x28E
CONSUMER_AC_DOWNLOAD_SAVE_TARGET_AS0x28F
CONSUMER_AC_SET_BORDERS0x290
CONSUMER_AC_INSERT_ROW0x291
CONSUMER_AC_INSERT_COLUMN0x292
CONSUMER_AC_INSERT_FILE0x293
CONSUMER_AC_INSERT_PICTURE0x294
CONSUMER_AC_INSERT_OBJECT0x295
CONSUMER_AC_INSERT_SYMBOL0x296
CONSUMER_AC_SAVE_AND_CLOSE0x297
CONSUMER_AC_RENAME0x298
CONSUMER_AC_MERGE0x299
CONSUMER_AC_SPLIT0x29A
CONSUMER_AC_DISRIBUTE_HORIZONTALLY0x29B
CONSUMER_AC_DISTRIBUTE_VERTICALLY0x29C
CONSUMER_AC_NEXT_KEYBOARD_LAYOUT_SELECT0x29D
CONSUMER_AC_NAVIGATION_GUIDANCE0x29E
CONSUMER_AC_DESKTOP_SHOW_ALL_WINDOWS0x29F
CONSUMER_AC_SOFT_KEY_LEFT0x2A0
CONSUMER_AC_SOFT_KEY_RIGHT0x2A1
CONSUMER_AC_DESKTOP_SHOW_ALL_APPLICATIONS0x2A2
CONSUMER_AC_IDLE_KEEP_ALIVE0x2B0
CONSUMER_EXTENDED_KEYBOARD_ATTRIBUTES_COLLECTION0x2C0
CONSUMER_KEYBOARD_FORM_FACTOR0x2C1
CONSUMER_KEYBOARD_KEY_TYPE0x2C2
CONSUMER_KEYBOARD_PHYSICAL_LAYOUT0x2C3
CONSUMER_VENDOR_SPECIFIC_KEYBOARD_PHYSICAL_LAYOUT0x2C4
CONSUMER_KEYBOARD_IETF_LANGUAGE_TAG_INDEX0x2C5
CONSUMER_IMPLEMENTED_KEYBOARD_INPUT_ASSIST_CONTROLS0x2C6
CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS0x2C7
CONSUMER_KEYBOARD_INPUT_ASSIST_NEXT0x2C8
CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS_GROUP0x2C9
CONSUMER_KEYBOARD_INPUT_ASSIST_NEXT_GROUP0x2CA
CONSUMER_KEYBOARD_INPUT_ASSIST_ACCEPT0x2CB
CONSUMER_KEYBOARD_INPUT_ASSIST_CANCEL0x2CC

System Controls (Generic Desktop Page (0x01))

Key nameUsage codeOkComment
SYSTEM_POWER_DOWN0x81-
SYSTEM_SLEEP0x82-
SYSTEM_WAKE_UP0x83x

Google Chromecast HD & Ultra

  • Based on generic Android device.
  • Tested with Google Chromecast HD, running Android TV 12 (STTE.240315.002)

Known issues

Regular keycodes (Keyboard Keypad Page (0x07))

Key nameUsage codeOKDescription
KEY_A4x1
KEY_B5x1
KEY_C6x1
KEY_D7x1
KEY_E8x1
KEY_F9x1
KEY_G10x1
KEY_H11x1
KEY_I12x1
KEY_J13x1
KEY_K14x1
KEY_L15x1
KEY_M16x1
KEY_N17x1
KEY_O18x1
KEY_P19x1
KEY_Q20x1
KEY_R21x1
KEY_S22x1
KEY_T23x1
KEY_U24x1
KEY_V25x1
KEY_W26x1
KEY_X27x1
KEY_Y28x1
KEY_Z29x1
KEY_130x1
KEY_231x1
KEY_332x1
KEY_433x1
KEY_534x1
KEY_635x1
KEY_736x1
KEY_837x1
KEY_938x1
KEY_039x1
KEY_RETURN40xNavigation select (same as KEYPAD_ENTER)
KEY_ESC41xNavigation go back (mostly). Better use CONSUMER_AC_BACK to return from all menus!
KEY_BACKSPACE42x1
KEY_TAB43xPlex: next UI element
KEY_SPACE44x1
KEY_MINUS45x1
KEY_EQUAL46x1
KEY_LEFT_BRACE47x1
KEY_RIGHT_BRACE48x1
KEY_BACKSLASH49x1
KEY_HASH_TILDE50x1
KEY_SEMICOLON51x1
KEY_APOSTROPHE52x1
KEY_GRAVE53x1
KEY_COMMA54x1
KEY_DOT55x1
KEY_SLASH56x1
KEY_CAPSLOCK57x
KEY_F158x
KEY_F259x
KEY_F360x
KEY_F461x
KEY_F562x
KEY_F663x
KEY_F764x
KEY_F865x
KEY_F966x
KEY_F1067x
KEY_F1168x
KEY_F1269x
KEY_SYSRQ70x
KEY_SCROLL_LOCK71x
KEY_PAUSE72x
KEY_INSERT73x
KEY_HOME74xScroll to start of list
KEY_PAGE_UP75xScroll list
KEY_DELETE76x1
KEY_END77xScroll to end of list
KEY_PAGE_DOWN78xScroll list
KEY_RIGHT_ARROW79xMenu navigation
KEY_LEFT_ARROW80xMenu navigation
KEY_DOWN_ARROW81xMenu navigation
KEY_UP_ARROW82xMenu navigation
KEYPAD_NUMLOCK83x
KEYPAD_SLASH84x
KEYPAD_ASTERISK85x
KEYPAD_MINUS86x
KEYPAD_PLUS87x
KEYPAD_ENTER88xNavigation select
KEYPAD_189x
KEYPAD_290x
KEYPAD_391x
KEYPAD_492x
KEYPAD_593x
KEYPAD_694x
KEYPAD_795x
KEYPAD_896x
KEYPAD_997x
KEYPAD_098x
KEYPAD_DOT99x
KEY_102ND100-Recognized as BACKSLASH
KEY_APPLICATION101xContext menu (long press select on original remote)
KEY_POWER102xSleep & Wakeup
KEYPAD_EQUAL103x
KEY_F13104-2
KEY_F14105-2
KEY_F15106-2
KEY_F16107-2
KEY_F17108-2
KEY_F18109-2
KEY_F19110-2
KEY_F20111-2
KEY_F21112-2
KEY_F22113-2
KEY_F23114-2
KEY_F24115-2
KEY_EXECUTE116-2
KEY_HELP117-2
KEY_MENU118-2
KEY_SELECT119-2
KEY_STOP120xMEDIA_STOP
KEY_AGAIN121-2
KEY_UNDO122-2
KEY_CUT123x3
KEY_COPY124x3
KEY_PASTE125x3
KEY_FIND126-2
KEY_MUTE127x
KEY_VOLUME_UP128x
KEY_VOLUME_DOWN129x
KEYPAD_COMMA133x
KEY_RO135x3
KEY_KATAKANA_HIRAGANA136x3
KEY_YEN137x3
KEY_HENKAN138x3
KEY_MUHENKAN139x3
KEYPAD_JPCOMMA140-Same as KEYPAD_COMMA
KEY_INTERNATIONAL7141-2
KEY_INTERNATIONAL8142-2
KEY_INTERNATIONAL9143-2
KEY_HANGEUL144xKANA 3
KEY_HANJA145xEISU 3
KEY_KATAKANA146-2
KEY_HIRAGANA147-2
KEY_ZENKAKU_HANKAKU148x3
KEY_FURIGANA149-2
KEY_LANG7150-2
KEY_LANG8151-2
KEY_LANG9152-2
KEY_LEFT_CONTROL224
KEY_LEFT_SHIFT225
KEY_LEFT_ALT226
KEY_LEFT_GUI227
KEY_RIGHT_CONTROL228
KEY_RIGHT_SHIFT229
KEY_RIGHT_ALT230
KEY_RIGHT_GUI231
KEY_MEDIA_PLAY_PAUSE232-2
KEY_MEDIA_STOP_CD233-2
KEY_MEDIA_PREVIOUS_SONG234-2
KEY_MEDIA_NEXT_SONG235-2
KEY_MEDIA_EJECT_CD236-2
KEY_MEDIA_VOLUME_UP237-2
KEY_MEDIA_VOLUME_DOWN238-2
KEY_MEDIA_MUTE239-2
KEY_MEDIA_WWW240-2
KEY_MEDIA_BACK241-2
KEY_MEDIA_FORWARD242-2
KEY_MEDIA_STOP243-2
KEY_MEDIA_FIND244-2
KEY_MEDIA_SCROLL_UP245-2
KEY_MEDIA_SCROLL_DOWN246-2
KEY_MEDIA_EDIT247-2
KEY_MEDIA_SLEEP248-2
KEY_MEDIA_COFFEE249-2
KEY_MEDIA_REFRESH250-2
KEY_MEDIA_CALC251-2

Consumer codes (Consumer Page (0x0C))

key nameusage codeOKDescription
CONSUMER_INCREMENT_100x020-4
CONSUMER_INCREMENT_1000x021-4
CONSUMER_AM_PM0x022-4
CONSUMER_POWER0x030xPower toggle
CONSUMER_RESET0x031-Wakes up device, otherwise doesn't seem to have a function
CONSUMER_SLEEP0x032xPuts device to sleep, but doesn't wake it up when pressed again
CONSUMER_SLEEP_AFTER0x033-4
CONSUMER_SLEEP_MODE0x034xPuts device to sleep, but doesn't wake it up when pressed again
CONSUMER_ILLUMINATION0x035-2
CONSUMER_FUNCTION_BUTTONS0x036x3 BUTTON_1
CONSUMER_MENU0x040xMain screen: context menu (long press select on original remote). Plex: reset customizations
CONSUMER_MENU_PICK0x041xSelect
CONSUMER_MENU_UP0x042xNavigation
CONSUMER_MENU_DOWN0x043xNavigation
CONSUMER_MENU_LEFT0x044xNavigation
CONSUMER_MENU_RIGHT0x045xNavigation
CONSUMER_MENU_ESCAPE0x046xPlex: exit popup menu. NOK: Spotify
CONSUMER_MENU_VALUE_INCREASE0x047x3 NUMPAD_ADD
CONSUMER_MENU_VALUE_DECREASE0x048x3 NUMPAD_SUBTRACT
CONSUMER_DATA_ON_SCREEN0x060-2
CONSUMER_CLOSED_CAPTION0x061x3 CAPTIONS
CONSUMER_CLOSED_CAPTION_SELECT0x062-4
CONSUMER_VCR_TV0x063-2
CONSUMER_BROADCAST_MODE0x064-4
CONSUMER_SNAPSHOT0x065x3 CAMERA
CONSUMER_STILL0x066-4
CONSUMER_PICTURE_IN_PICTURE_TOGGLE0x067-4
CONSUMER_PICTURE_IN_PICTURE_SWAP0x068-4
CONSUMER_RED_MENU_BUTTON0x069x
CONSUMER_GREEN_MENU_BUTTON0x06Ax
CONSUMER_BLUE_MENU_BUTTON0x06Bx
CONSUMER_YELLOW_MENU_BUTTON0x06Cx
CONSUMER_ASPECT0x06D-2
CONSUMER_MODE_SELECT_3D0x06E-4
CONSUMER_DISPLAY_BRIGHTNESS_INCREMENT0x06FxBrightness slider, exit with CONSUMER_AC_BACK
CONSUMER_DISPLAY_BRIGHTNESS_DECREMENT0x070x"
CONSUMER_DISPLAY_BRIGHTNESS0x071-4
CONSUMER_DISPLAY_BACKLIGHT_TOGGLE0x072-2
CONSUMER_DISPLAY_SET_BRIGHTNESS_TO_MINIMUM0x073-2
CONSUMER_DISPLAY_SET_BRIGHTNESS_TO_MAXIMUM0x074-2
CONSUMER_DISPLAY_SET_AUTO_BRIGHTNESS0x075-2
CONSUMER_CAMERA_ACCESS_ENABLED0x076-4
CONSUMER_CAMERA_ACCESS_DISABLED0x077-4
CONSUMER_CAMERA_ACCESS_TOGGLE0x078-4
CONSUMER_KEYBOARD_BRIGHTNESS_INCREMENT0x079-2
CONSUMER_KEYBOARD_BRIGHTNESS_DECREMENT0x07A-2
CONSUMER_KEYBOARD_BACKLIGHT_SET_LEVEL0x07B-4
CONSUMER_KEYBOARD_BACKLIGHT_OOC0x07C-2
CONSUMER_KEYBOARD_BACKLIGHT_SET_MINIMUM0x07D-4
CONSUMER_KEYBOARD_BACKLIGHT_SET_MAXIMUM0x07E-4
CONSUMER_KEYBOARD_BACKLIGHT_AUTO0x07F-4
CONSUMER_SELECTION0x080-4
CONSUMER_ASSIGN_SELECTION0x081-4
CONSUMER_MODE_STEP0x082-2
CONSUMER_RECALL_LAST0x083x3 LAST_CHANNEL
CONSUMER_ENTER_CHANNEL0x084x3 ENTER
CONSUMER_ORDER_MOVIE0x085-4
CONSUMER_CHANNEL0x086-4
CONSUMER_MEDIA_SELECTION0x087-4
CONSUMER_MEDIA_SELECT_COMPUTER0x088-2
CONSUMER_MEDIA_SELECT_TV0x089x3 TV
CONSUMER_MEDIA_SELECT_WWW0x08Ax3 EXPLORER
CONSUMER_MEDIA_SELECT_DVD0x08B-2
CONSUMER_MEDIA_SELECT_TELEPHONE0x08C-Crashes or resets device
CONSUMER_MEDIA_SELECT_PROGRAM_GUIDE0x08Dx3 GUIDE
CONSUMER_MEDIA_SELECT_VIDEO_PHONE0x08E-2
CONSUMER_MEDIA_SELECT_GAMES0x08F-2
CONSUMER_MEDIA_SELECT_MESSAGES0x090-2
CONSUMER_MEDIA_SELECT_CD0x091-2
CONSUMER_MEDIA_SELECT_VCR0x092-2
CONSUMER_MEDIA_SELECT_TUNER0x093-2
CONSUMER_QUIT0x094-2
CONSUMER_HELP0x095-2
CONSUMER_MEDIA_SELECT_TAPE0x096-2
CONSUMER_MEDIA_SELECT_CABLE0x097-2
CONSUMER_MEDIA_SELECT_SATELLITE0x098-2
CONSUMER_MEDIA_SELECT_SECURITY0x099-4
CONSUMER_MEDIA_SELECT_HOME0x09Ax3 DVR
CONSUMER_MEDIA_SELECT_CALL0x09B-4
CONSUMER_CHANNEL_INCREMENT0x09Cx3 CHANNEL_UP
CONSUMER_CHANNEL_DECREMENT0x09Dx3 CHANNEL_DOWN
CONSUMER_MEDIA_SELECT_SAP0x09E-4
CONSUMER_VCR_PLUS0x0A0-2
CONSUMER_ONCE0x0A1-4
CONSUMER_DAILY0x0A2-4
CONSUMER_WEEKLY0x0A3-4
CONSUMER_MONTHLY0x0A4-4
CONSUMER_PLAY0x0B0xPlex: Play / Pause. Spotify: Play
CONSUMER_PAUSE0x0B1xPlex: show overlay menu
CONSUMER_RECORD0x0B2xPlex: record TV
CONSUMER_FAST_FORWARD0x0B3xSpotify: FF, Plex: skip forward
CONSUMER_REWIND0x0B4xSpotify: RW, Plex: skip backwards
CONSUMER_SCAN_NEXT_TRACK0x0B5xNext track (tested in Spotify)
CONSUMER_SCAN_PREVIOUS_TRACK0x0B6xPrevious track (tested in Spotify)
CONSUMER_STOP0x0B7xSpotify: Stop
CONSUMER_EJECT0x0B8xMEDIA_EJECT
CONSUMER_RANDOM_PLAY0x0B9-2
CONSUMER_SELECT_DISC0x0BA-4
CONSUMER_ENTER_DISC0x0BB-4
CONSUMER_REPEAT0x0BC-2
CONSUMER_TRACKING0x0BD-4
CONSUMER_TRACK_NORMAL0x0BE-4
CONSUMER_SLOW_TRACKING0x0BF-2
CONSUMER_FRAME_FORWARD0x0C0-4
CONSUMER_FRAME_BACK0x0C1-4
CONSUMER_MARK0x0C2-4
CONSUMER_CLEAR_MARK0x0C3-4
CONSUMER_REPEAT_FROM_MARK0x0C4-4
CONSUMER_RETURN_TO_MARK0x0C5-4
CONSUMER_SEARCH_MARK_FORWARD0x0C6-4
CONSUMER_SEARCH_MARK_BACKWARDS0x0C7-4
CONSUMER_COUNTER_RESET0x0C8-4
CONSUMER_SHOW_COUNTER0x0C9-4
CONSUMER_TRACKING_INCREMENT0x0CA-4
CONSUMER_TRACKING_DECREMENT0x0CB-4
CONSUMER_STOP_EJECT0x0CC-4
CONSUMER_PLAY_PAUSE0x0CDxPlex, Spotify
CONSUMER_PLAY_SKIP0x0CE-4
CONSUMER_VOICE_COMMAND0x0CFxVoice assistant
CONSUMER_INVOKE_CAPTURE_INTERFACE0x0D0-4
CONSUMER_START_OR_STOP_GAME_RECORDING0x0D1-4
CONSUMER_HISTORICAL_GAME_CAPTURE0x0D2-4
CONSUMER_CAPTURE_GAME_SCREENSHOT0x0D3-4
CONSUMER_SHOW_OR_HIDE_RECORDING_INDICATOR0x0D4-4
CONSUMER_START_OR_STOP_MICROPHONE_CAPTURE0x0D5-4
CONSUMER_START_OR_STOP_CAMERA_CAPTURE0x0D6-4
CONSUMER_START_OR_STOP_GAME_BROADCAST0x0D7-4
CONSUMER_VOLUME0x0E0-
CONSUMER_BALANCE0x0E1-4
CONSUMER_MUTE0x0E2x
CONSUMER_BASS0x0E3-4
CONSUMER_TREBLE0x0E4-4
CONSUMER_BASS_BOOST0x0E5-2
CONSUMER_SURROUND_MODE0x0E6-4
CONSUMER_LOUDNESS0x0E7-4
CONSUMER_MPX0x0E8-4
CONSUMER_VOLUME_INCREMENT0x0E9x
CONSUMER_VOLUME_DECREMENT0x0EAx
CONSUMER_SPEED_SELECT0x0F0-4
CONSUMER_PLAYBACK_SPEED0x0F1-4
CONSUMER_STANDARD_PLAY0x0F2-4
CONSUMER_LONG_PLAY0x0F3-4
CONSUMER_EXTENDED_PLAY0x0F4-4
CONSUMER_SLOW0x0F5-2
CONSUMER_FAN_ENABLE0x100-4
CONSUMER_FAN_SPEED0x101-4
CONSUMER_LIGHT_ENABLE0x102-4
CONSUMER_LIGHT_ILLUMINATION_LEVEL0x103-4
CONSUMER_CLIMATE_CONTROL_ENABLE0x104-4
CONSUMER_ROOM_TEMPERATURE0x105-4
CONSUMER_SECURITY_ENABLE0x106-4
CONSUMER_FIRE_ALARM0x107-4
CONSUMER_POLICE_ALARM0x108-4
CONSUMER_PROXIMITY0x109-4
CONSUMER_MOTION0x10A-4
CONSUMER_DURESS_ALARM0x10B-4
CONSUMER_HOLDUP_ALARM0x10C-4
CONSUMER_MEDICAL_ALARM0x10D-4
CONSUMER_BALANCE_RIGHT0x150-4
CONSUMER_BALANCE_LEFT0x151-4
CONSUMER_BASS_INCREMENT0x152-4
CONSUMER_BASS_DECREMENT0x153-4
CONSUMER_TREBLE_INCREMENT0x154-4
CONSUMER_TREBLE_DECREMENT0x155-4
CONSUMER_SPEAKER_SYSTEM0x160-4
CONSUMER_CHANNEL_LEFT0x161-4
CONSUMER_CHANNEL_RIGHT0x162-4
CONSUMER_CHANNEL_CENTER0x163-4
CONSUMER_CHANNEL_FRONT0x164-4
CONSUMER_CHANNEL_CENTER_FRONT0x165-4
CONSUMER_CHANNEL_SIDE0x166-4
CONSUMER_CHANNEL_SURROUND0x167-4
CONSUMER_CHANNEL_LOW_FREQUENCY_ENHANCEMENT0x168-4
CONSUMER_CHANNEL_TOP0x169-4
CONSUMER_CHANNEL_UNKNOWN0x16A-4
CONSUMER_SUB_CHANNEL0x170-4
CONSUMER_SUB_CHANNEL_INCREMENT0x171-4
CONSUMER_SUB_CHANNEL_DECREMENT0x172-4
CONSUMER_ALTERNATE_AUDIO_INCREMENT0x173-4
CONSUMER_ALTERNATE_AUDIO_DECREMENT0x174-4
CONSUMER_APPLICATION_LAUNCH_BUTTONS0x180-4
CONSUMER_AL_LAUNCH_BUTTON_CONFIGURATION_TOOL0x181-2
CONSUMER_AL_PROGRAMMABLE_BUTTON_CONFIGURATION0x182x3 BOOKMARK
CONSUMER_AL_CONSUMER_CONTROL_CONFIGURATION0x183x3 MUSIC
CONSUMER_AL_WORD_PROCESSOR0x184-2
CONSUMER_AL_TEXT_EDITOR0x185-2
CONSUMER_AL_SPREADSHEET0x186-2
CONSUMER_AL_GRAPHICS_EDITOR0x187-2
CONSUMER_AL_PRESENTATION_APP0x188-2
CONSUMER_AL_DATABASE_APP0x189-2
CONSUMER_AL_EMAIL_READER0x18Ax3 ENVELOPE
CONSUMER_AL_NEWSREADER0x18B-2
CONSUMER_AL_VOICEMAIL0x18C-2
CONSUMER_AL_CONTACTS_ADDRESS_BOOK0x18Dx3 CONTACTS
CONSUMER_AL_CALENDAR_SCHEDULE0x18Ex3 CALENDAR
CONSUMER_AL_TASK_PROJECT_MANAGER0x18F-2
CONSUMER_AL_LOG_JOURNAL_TIMECARD0x190-2
CONSUMER_AL_CHECKBOOK_FINANCE0x191-2
CONSUMER_AL_CALCULATOR0x192x3 CALCULATOR
CONSUMER_AL_A_V_CAPTURE_PLAYBACK0x193-2
CONSUMER_AL_LOCAL_MACHINE_BROWSER0x194-2
CONSUMER_AL_LAN_WAN_BROWSER0x195-4
CONSUMER_AL_INTERNET_BROWSER0x196x3 EXPLORER (same as CONSUMER_MEDIA_SELECT_WWW)
CONSUMER_AL_REMOTE_NETWORKING_ISP_CONNECT0x197-4
CONSUMER_AL_NETWORK_CONFERENCE0x198-4
CONSUMER_AL_NETWORK_CHAT0x199-2
CONSUMER_AL_TELEPHONY_DIALER0x19A-4
CONSUMER_AL_LOGON0x19B-4
CONSUMER_AL_LOGOFF0x19Cx3 PROFILE_SWITCH
CONSUMER_AL_LOGON_LOGOFF0x19D-4
CONSUMER_AL_TERMINAL_LOCK_SCREENSAVER0x19ExSleep
CONSUMER_AL_CONTROL_PANEL0x19F-2
CONSUMER_AL_COMMAND_LINE_PROCESSOR_RUN0x1A0-4
CONSUMER_AL_PROCESS_TASK_MANAGER0x1A1-4
CONSUMER_AL_SELECT_TASK_APPLICATION0x1A2xShows my applications
CONSUMER_AL_NEXT_TASK_APPLICATION0x1A3-4
CONSUMER_AL_PREVIOUS_TASK_APPLICATION0x1A4-4
CONSUMER_AL_PREEMPTIVE_HALT_TASK_APPLICATION0x1A5-4
CONSUMER_AL_INTEGRATED_HELP_CENTER0x1A6-2
CONSUMER_AL_DOCUMENTS0x1A7-2
CONSUMER_AL_THESAURUS0x1A8-4
CONSUMER_AL_DICTIONARY0x1A9-4
CONSUMER_AL_DESKTOP0x1AA-4
CONSUMER_AL_SPELL_CHECK0x1AB-2
CONSUMER_AL_GRAMMAR_CHECK0x1AC-4
CONSUMER_AL_WIRELESS_STATUS0x1AD-4
CONSUMER_AL_KEYBOARD_LAYOUT0x1AE-2
CONSUMER_AL_VIRUS_PROTECTION0x1AF-4
CONSUMER_AL_ENCRYPTION0x1B0-4
CONSUMER_AL_SCREEN_SAVER0x1B1-2
CONSUMER_AL_ALARMS0x1B2-4
CONSUMER_AL_CLOCK0x1B3-4
CONSUMER_AL_FILE_BROWSER0x1B4-2
CONSUMER_AL_POWER_STATUS0x1B5-4
CONSUMER_AL_IMAGE_BROWSER0x1B6-2
CONSUMER_AL_AUDIO_BROWSER0x1B7-2
CONSUMER_AL_MOVIE_BROWSER0x1B8-2
CONSUMER_AL_DIGITAL_RIGHTS_MANAGER0x1B9-4
CONSUMER_AL_DIGITAL_WALLET0x1BA-4
CONSUMER_AL_INSTANT_MESSAGING0x1BC-2
CONSUMER_AL_OEM_FEATURES_TIPS_TUTORIAL_BROWSER0x1BD-2
CONSUMER_AL_OEM_HELP0x1BE-4
CONSUMER_AL_ONLINE_COMMUNITY0x1BF-4
CONSUMER_AL_ENTERTAINMENT_CONTENT_BROWSER0x1C0-4
CONSUMER_AL_ONLINE_SHOPPING_BROWSER0x1C1-4
CONSUMER_AL_SMARTCARD_INFORMATION_HELP0x1C2-4
CONSUMER_AL_MARKET_MONITOR_FINANCE_BROWSER0x1C3-4
CONSUMER_AL_CUSTOMIZED_CORPORATE_NEWS_BROWSER0x1C4-4
CONSUMER_AL_ONLINE_ACTIVITY_BROWSER0x1C5-4
CONSUMER_AL_RESEARCH_SEARCH_BROWSER0x1C6-4
CONSUMER_AL_AUDIO_PLAYER0x1C7-4
CONSUMER_AL_MESSAGE_STATUS0x1C8-4
CONSUMER_AL_CONTACT_SYNC0x1C9-4
CONSUMER_AL_NAVIGATION0x1CA-4
CONSUMER_AL_CONTEXT_AWARE_DESKTOP_ASSISTANT0x1CB-Voice assistant, same as CONSUMER_VOICE_COMMAND
CONSUMER_GENERIC_GUI_APPLICATION_CONTROLS0x200-4
CONSUMER_AC_NEW0x201-2
CONSUMER_AC_OPEN0x202-2
CONSUMER_AC_CLOSE0x203-2
CONSUMER_AC_EXIT0x204-2
CONSUMER_AC_MAXIMIZE0x205-4
CONSUMER_AC_MINIMIZE0x206-4
CONSUMER_AC_SAVE0x207-2
CONSUMER_AC_PRINT0x208-2
CONSUMER_AC_PROPERTIES0x209-2
CONSUMER_AC_UNDO0x21A-2
CONSUMER_AC_COPY0x21Bx3 COPY
CONSUMER_AC_CUT0x21Cx3 CUT
CONSUMER_AC_PASTE0x21Dx3 PASTE
CONSUMER_AC_SELECT_ALL0x21E-4
CONSUMER_AC_FIND0x21F-2
CONSUMER_AC_FIND_AND_REPLACE0x220-4
CONSUMER_AC_SEARCH0x221-Search (voice assist)
CONSUMER_AC_GO_TO0x222-2
CONSUMER_AC_HOME0x223xHome button
CONSUMER_AC_BACK0x224xBack button
CONSUMER_AC_FORWARD0x225x3 FORWARD
CONSUMER_AC_STOP0x226xPlex: stop playback. Does not work in Spotify
CONSUMER_AC_REFRESH0x227-
CONSUMER_AC_PREVIOUS_LINK0x228-4
CONSUMER_AC_NEXT_LINK0x229-4
CONSUMER_AC_BOOKMARKS0x22Ax3 BOOKMARK
CONSUMER_AC_HISTORY0x22B-4
CONSUMER_AC_SUBSCRIPTIONS0x22C-4
CONSUMER_AC_ZOOM_IN0x22D-2
CONSUMER_AC_ZOOM_OUT0x22E-2
CONSUMER_AC_ZOOM0x22F-2
CONSUMER_AC_FULL_SCREEN_VIEW0x230-4
CONSUMER_AC_NORMAL_VIEW0x231-4
CONSUMER_AC_VIEW_TOGGLE0x232-4
CONSUMER_AC_SCROLL_UP0x233xPAGE_UP, scroll list
CONSUMER_AC_SCROLL_DOWN0x234xPAGE_DOWN, scroll list
CONSUMER_AC_SCROLL0x235-4
CONSUMER_AC_PAN_LEFT0x236-4
CONSUMER_AC_PAN_RIGHT0x237-4
CONSUMER_AC_PAN0x238-
CONSUMER_AC_NEW_WINDOW0x239-4
CONSUMER_AC_TILE_HORIZONTALLY0x23A-4
CONSUMER_AC_TILE_VERTICALLY0x23B-4
CONSUMER_AC_FORMAT0x23C-4
CONSUMER_AC_EDIT0x23D-2
CONSUMER_AC_BOLD0x23E-4
CONSUMER_AC_ITALICS0x23F-4
CONSUMER_AC_UNDERLINE0x240-4
CONSUMER_AC_STRIKETHROUGH0x241-4
CONSUMER_AC_SUBSCRIPT0x242-4
CONSUMER_AC_SUPERSCRIPT0x243-4
CONSUMER_AC_ALL_CAPS0x244-4
CONSUMER_AC_ROTATE0x245-4
CONSUMER_AC_RESIZE0x246-4
CONSUMER_AC_FLIP_HORIZONTAL0x247-4
CONSUMER_AC_FLIP_VERTICAL0x248-4
CONSUMER_AC_MIRROR_HORIZONTAL0x249-4
CONSUMER_AC_MIRROR_VERTICAL0x24A-4
CONSUMER_AC_FONT_SELECT0x24B-4
CONSUMER_AC_FONT_COLOR0x24C-4
CONSUMER_AC_FONT_SIZE0x24D-4
CONSUMER_AC_JUSTIFY_LEFT0x24E-4
CONSUMER_AC_JUSTIFY_CENTER_H0x24F-4
CONSUMER_AC_JUSTIFY_RIGHT0x250-4
CONSUMER_AC_JUSTIFY_BLOCK_H0x251-4
CONSUMER_AC_JUSTIFY_TOP0x252-4
CONSUMER_AC_JUSTIFY_CENTER_V0x253-4
CONSUMER_AC_JUSTIFY_BOTTOM0x254-4
CONSUMER_AC_JUSTIFY_BLOCK_V0x255-4
CONSUMER_AC_INDENT_DECREASE0x256-4
CONSUMER_AC_INDENT_INCREASE0x257-4
CONSUMER_AC_NUMBERED_LIST0x258-4
CONSUMER_AC_RESTART_NUMBERING0x259-4
CONSUMER_AC_BULLETED_LIST0x25A-4
CONSUMER_AC_PROMOTE0x25B-4
CONSUMER_AC_DEMOTE0x25C-4
CONSUMER_AC_YES0x25D-4
CONSUMER_AC_NO0x25E-4
CONSUMER_AC_CANCEL0x25F-2
CONSUMER_AC_CATALOG0x260-4
CONSUMER_AC_BUY_CHECKOUT0x261-4
CONSUMER_AC_ADD_TO_CART0x262-4
CONSUMER_AC_EXPAND0x263-4
CONSUMER_AC_EXPAND_ALL0x264-4
CONSUMER_AC_COLLAPSE0x265-4
CONSUMER_AC_COLLAPSE_ALL0x266-4
CONSUMER_AC_PRINT_PREVIEW0x267-4
CONSUMER_AC_PASTE_SPECIAL0x268-4
CONSUMER_AC_INSERT_MODE0x269xINSERT
CONSUMER_AC_DELETE0x26AxFORWARD_DEL
CONSUMER_AC_LOCK0x26B-4
CONSUMER_AC_UNLOCK0x26C-4
CONSUMER_AC_PROTECT0x26D-4
CONSUMER_AC_UNPROTECT0x26E-4
CONSUMER_AC_ATTACH_COMMENT0x26F-4
CONSUMER_AC_DELETE_COMMENT0x270-4
CONSUMER_AC_VIEW_COMMENT0x271-4
CONSUMER_AC_SELECT_WORD0x272-4
CONSUMER_AC_SELECT_SENTENCE0x273-4
CONSUMER_AC_SELECT_PARAGRAPH0x274-4
CONSUMER_AC_SELECT_COLUMN0x275-4
CONSUMER_AC_SELECT_ROW0x276-4
CONSUMER_AC_SELECT_TABLE0x277-4
CONSUMER_AC_SELECT_OBJECT0x278-4
CONSUMER_AC_REDO_REPEAT0x279-2
CONSUMER_AC_SORT0x27A-4
CONSUMER_AC_SORT_ASCENDING0x27B-4
CONSUMER_AC_SORT_DESCENDING0x27C-4
CONSUMER_AC_FILTER0x27D-4
CONSUMER_AC_SET_CLOCK0x27E-4
CONSUMER_AC_VIEW_CLOCK0x27F-4
CONSUMER_AC_SELECT_TIME_ZONE0x280-4
CONSUMER_AC_EDIT_TIME_ZONES0x281-4
CONSUMER_AC_SET_ALARM0x282-4
CONSUMER_AC_CLEAR_ALARM0x283-4
CONSUMER_AC_SNOOZE_ALARM0x284-4
CONSUMER_AC_RESET_ALARM0x285-4
CONSUMER_AC_SYNCHRONIZE0x286-4
CONSUMER_AC_SEND_RECEIVE0x287-4
CONSUMER_AC_SEND_TO0x288-4
CONSUMER_AC_REPLY0x289-2
CONSUMER_AC_REPLY_ALL0x28A-4
CONSUMER_AC_FORWARD_MSG0x28B-2
CONSUMER_AC_SEND0x28C-2
CONSUMER_AC_ATTACH_FILE0x28D-4
CONSUMER_AC_UPLOAD0x28E-4
CONSUMER_AC_DOWNLOAD_SAVE_TARGET_AS0x28F-4
CONSUMER_AC_SET_BORDERS0x290-4
CONSUMER_AC_INSERT_ROW0x291-4
CONSUMER_AC_INSERT_COLUMN0x292-4
CONSUMER_AC_INSERT_FILE0x293-4
CONSUMER_AC_INSERT_PICTURE0x294-4
CONSUMER_AC_INSERT_OBJECT0x295-4
CONSUMER_AC_INSERT_SYMBOL0x296-4
CONSUMER_AC_SAVE_AND_CLOSE0x297-4
CONSUMER_AC_RENAME0x298-4
CONSUMER_AC_MERGE0x299-4
CONSUMER_AC_SPLIT0x29A-4
CONSUMER_AC_DISRIBUTE_HORIZONTALLY0x29B-4
CONSUMER_AC_DISTRIBUTE_VERTICALLY0x29C-4
CONSUMER_AC_NEXT_KEYBOARD_LAYOUT_SELECT0x29D-4
CONSUMER_AC_NAVIGATION_GUIDANCE0x29E-4
CONSUMER_AC_DESKTOP_SHOW_ALL_WINDOWS0x29F-4
CONSUMER_AC_SOFT_KEY_LEFT0x2A0-4
CONSUMER_AC_SOFT_KEY_RIGHT0x2A1-4
CONSUMER_AC_DESKTOP_SHOW_ALL_APPLICATIONS0x2A2xShows control panel
CONSUMER_AC_IDLE_KEEP_ALIVE0x2B0-4
CONSUMER_EXTENDED_KEYBOARD_ATTRIBUTES_COLLECTION0x2C0-4
CONSUMER_KEYBOARD_FORM_FACTOR0x2C1-4
CONSUMER_KEYBOARD_KEY_TYPE0x2C2-4
CONSUMER_KEYBOARD_PHYSICAL_LAYOUT0x2C3-4
CONSUMER_VENDOR_SPECIFIC_KEYBOARD_PHYSICAL_LAYOUT0x2C4-4
CONSUMER_KEYBOARD_IETF_LANGUAGE_TAG_INDEX0x2C5-4
CONSUMER_IMPLEMENTED_KEYBOARD_INPUT_ASSIST_CONTROLS0x2C6-4
CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS0x2C7-2
CONSUMER_KEYBOARD_INPUT_ASSIST_NEXT0x2C8-2
CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS_GROUP0x2C9-2
CONSUMER_KEYBOARD_INPUT_ASSIST_NEXT_GROUP0x2CA-2
CONSUMER_KEYBOARD_INPUT_ASSIST_ACCEPT0x2CB-2
CONSUMER_KEYBOARD_INPUT_ASSIST_CANCEL0x2CC-2

System Controls (Generic Desktop Page (0x01))

Key nameUsage codeOkComment
SYSTEM_POWER_DOWN0x81xPower toggle
SYSTEM_SLEEP0x82xSleep
SYSTEM_WAKE_UP0x83xWake up
SYSTEM_CONTEXT_MENU0x84-
SYSTEM_MAIN_MENU0x85xContext menu (long press select)
SYSTEM_APP_MENU0x86-
SYSTEM_MENU_HELP0x87-
SYSTEM_MENU_EXIT0x88-
SYSTEM_MENU_SELECT0x89xSame as KEY_RETURN
SYSTEM_MENU_RIGHT0x8AxSame as arrow key navigation
SYSTEM_MENU_LEFT0x8Bx
SYSTEM_MENU_UP0x8Cx
SYSTEM_MENU_DOWN0x8Dx
SYSTEM_COLD_RESTART0x8E-
SYSTEM_WARM_RESTART0x8F-
SYSTEM_DPAD_UP0x90-
SYSTEM_DPAD_DOWN0x91-
SYSTEM_DPAD_RIGHT0x92-
SYSTEM_DPAD_LEFT0x93-

  1. Works for text entry ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19 ↩20 ↩21 ↩22 ↩23 ↩24 ↩25 ↩26 ↩27 ↩28 ↩29 ↩30 ↩31 ↩32 ↩33 ↩34 ↩35 ↩36 ↩37 ↩38 ↩39 ↩40 ↩41 ↩42 ↩43 ↩44 ↩45 ↩46 ↩47 ↩48 ↩49 ↩50 ↩51

  2. Not recognized in Button Mapper ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19 ↩20 ↩21 ↩22 ↩23 ↩24 ↩25 ↩26 ↩27 ↩28 ↩29 ↩30 ↩31 ↩32 ↩33 ↩34 ↩35 ↩36 ↩37 ↩38 ↩39 ↩40 ↩41 ↩42 ↩43 ↩44 ↩45 ↩46 ↩47 ↩48 ↩49 ↩50 ↩51 ↩52 ↩53 ↩54 ↩55 ↩56 ↩57 ↩58 ↩59 ↩60 ↩61 ↩62 ↩63 ↩64 ↩65 ↩66 ↩67 ↩68 ↩69 ↩70 ↩71 ↩72 ↩73 ↩74 ↩75 ↩76 ↩77 ↩78 ↩79 ↩80 ↩81 ↩82 ↩83 ↩84 ↩85 ↩86 ↩87 ↩88 ↩89 ↩90 ↩91 ↩92 ↩93 ↩94 ↩95 ↩96 ↩97 ↩98 ↩99 ↩100 ↩101 ↩102 ↩103 ↩104 ↩105 ↩106 ↩107 ↩108 ↩109 ↩110 ↩111 ↩112 ↩113 ↩114 ↩115 ↩116 ↩117 ↩118 ↩119 ↩120 ↩121 ↩122 ↩123 ↩124 ↩125 ↩126 ↩127 ↩128 ↩129 ↩130 ↩131

  3. Recognized in Button Mapper ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19 ↩20 ↩21 ↩22 ↩23 ↩24 ↩25 ↩26 ↩27 ↩28 ↩29 ↩30 ↩31 ↩32 ↩33 ↩34 ↩35 ↩36 ↩37

  4. No Android key code ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19 ↩20 ↩21 ↩22 ↩23 ↩24 ↩25 ↩26 ↩27 ↩28 ↩29 ↩30 ↩31 ↩32 ↩33 ↩34 ↩35 ↩36 ↩37 ↩38 ↩39 ↩40 ↩41 ↩42 ↩43 ↩44 ↩45 ↩46 ↩47 ↩48 ↩49 ↩50 ↩51 ↩52 ↩53 ↩54 ↩55 ↩56 ↩57 ↩58 ↩59 ↩60 ↩61 ↩62 ↩63 ↩64 ↩65 ↩66 ↩67 ↩68 ↩69 ↩70 ↩71 ↩72 ↩73 ↩74 ↩75 ↩76 ↩77 ↩78 ↩79 ↩80 ↩81 ↩82 ↩83 ↩84 ↩85 ↩86 ↩87 ↩88 ↩89 ↩90 ↩91 ↩92 ↩93 ↩94 ↩95 ↩96 ↩97 ↩98 ↩99 ↩100 ↩101 ↩102 ↩103 ↩104 ↩105 ↩106 ↩107 ↩108 ↩109 ↩110 ↩111 ↩112 ↩113 ↩114 ↩115 ↩116 ↩117 ↩118 ↩119 ↩120 ↩121 ↩122 ↩123 ↩124 ↩125 ↩126 ↩127 ↩128 ↩129 ↩130 ↩131 ↩132 ↩133 ↩134 ↩135 ↩136 ↩137 ↩138 ↩139 ↩140 ↩141 ↩142 ↩143 ↩144 ↩145 ↩146 ↩147 ↩148 ↩149 ↩150 ↩151 ↩152 ↩153 ↩154 ↩155 ↩156 ↩157 ↩158 ↩159 ↩160 ↩161 ↩162 ↩163 ↩164 ↩165 ↩166 ↩167 ↩168 ↩169 ↩170 ↩171 ↩172 ↩173 ↩174 ↩175 ↩176 ↩177 ↩178 ↩179 ↩180 ↩181 ↩182 ↩183 ↩184 ↩185 ↩186 ↩187 ↩188 ↩189 ↩190 ↩191 ↩192 ↩193 ↩194 ↩195 ↩196 ↩197 ↩198 ↩199 ↩200 ↩201 ↩202 ↩203 ↩204 ↩205 ↩206 ↩207 ↩208 ↩209 ↩210 ↩211 ↩212 ↩213 ↩214 ↩215 ↩216 ↩217 ↩218 ↩219 ↩220 ↩221 ↩222 ↩223 ↩224 ↩225 ↩226 ↩227 ↩228 ↩229 ↩230 ↩231 ↩232 ↩233 ↩234 ↩235 ↩236 ↩237 ↩238 ↩239 ↩240 ↩241 ↩242 ↩243 ↩244 ↩245 ↩246 ↩247 ↩248 ↩249 ↩250 ↩251 ↩252 ↩253 ↩254 ↩255 ↩256 ↩257 ↩258 ↩259 ↩260

LG TV WebOS

  • Tested with LG OLED77CX6LA
  • Supports keyboard and mouse devices.

Known issues

  • Back key not yet found to exit all menus. Workaround: use home key (KEY_LEFT_GUI), press twice to open home, then exit menu.

Regular keycodes (Keyboard Keypad Page (0x07))

Key nameUsage codeOKDescription
KEY_A4x1
KEY_B5x1
KEY_C6x1
KEY_D7x1
KEY_E8x1
KEY_F9x1
KEY_G10x1
KEY_H11x1
KEY_I12x1
KEY_J13x1
KEY_K14x1
KEY_L15x1
KEY_M16x1
KEY_N17x1
KEY_O18x1
KEY_P19x1
KEY_Q20x1
KEY_R21x1
KEY_S22x1
KEY_T23x1
KEY_U24x1
KEY_V25x1
KEY_W26x1
KEY_X27x1
KEY_Y28x1
KEY_Z29x1
KEY_130xEnter channel number. 1
KEY_231x"
KEY_332x"
KEY_433x"
KEY_534x"
KEY_635x"
KEY_736x"
KEY_837x"
KEY_938x"
KEY_039x"
KEY_RETURN40xSelect
KEY_ESC41xDoes not exit all menus! E.g. channel list or "insert usb" popup
KEY_BACKSPACE42x1
KEY_TAB43-
KEY_SPACE44x1
KEY_MINUS45x1
KEY_EQUAL46x1
KEY_LEFT_BRACE47x1
KEY_RIGHT_BRACE48x1
KEY_BACKSLASH49x1
KEY_HASH_TILDE50x1
KEY_SEMICOLON51x1
KEY_APOSTROPHE52x1
KEY_GRAVE53x1
KEY_COMMA54x1
KEY_DOT55x1
KEY_SLASH56x1
KEY_CAPSLOCK57
KEY_F158-
KEY_F259-
KEY_F360-
KEY_F461-
KEY_F562-
KEY_F663-
KEY_F764-
KEY_F865-
KEY_F966-
KEY_F1067-
KEY_F1168-
KEY_F1269-
KEY_SYSRQ70
KEY_SCROLL_LOCK71
KEY_PAUSE72xPause live TV (requires USB storage). Works in Plex
KEY_INSERT73
KEY_HOME74-TODO test in apps. NOK: Plex
KEY_PAGE_UP75xChannel up
KEY_DELETE76
KEY_END77-TODO test in apps
KEY_PAGE_DOWN78xChannel down
KEY_RIGHT_ARROW79xNavigation
KEY_LEFT_ARROW80x
KEY_DOWN_ARROW81x
KEY_UP_ARROW82x
KEYPAD_NUMLOCK83
KEYPAD_SLASH84x1
KEYPAD_ASTERISK85x1
KEYPAD_MINUS86x1
KEYPAD_PLUS87x1
KEYPAD_ENTER88xDoes not work, use KEY_RETURN instead. Works in Plex
KEYPAD_189x1
KEYPAD_290x1
KEYPAD_391x1
KEYPAD_492x1
KEYPAD_593x1
KEYPAD_694x1
KEYPAD_795x1
KEYPAD_896x1
KEYPAD_997x1
KEYPAD_098x1
KEYPAD_DOT99x1
KEY_102ND100x1
KEY_APPLICATION101-
KEY_POWER102xOnly power off.
KEYPAD_EQUAL103-
KEY_F13104-
KEY_F14105-
KEY_F15106-
KEY_F16107-
KEY_F17108-
KEY_F18109-
KEY_F19110-
KEY_F20111-
KEY_F21112-
KEY_F22113-
KEY_F23114-
KEY_F24115-
KEY_EXECUTE116-
KEY_HELP117-
KEY_MENU118-TODO test in apps. NOK: Plex
KEY_SELECT119-NOK: Plex
KEY_STOP120xWorks in Plex
KEY_AGAIN121-
KEY_UNDO122-
KEY_CUT123-
KEY_COPY124-
KEY_PASTE125-
KEY_FIND126-
KEY_MUTE127x
KEY_VOLUME_UP128x
KEY_VOLUME_DOWN129x
KEYPAD_COMMA133-
KEY_RO135-
KEY_KATAKANA_HIRAGANA136-
KEY_YEN137-
KEY_HENKAN138-
KEY_MUHENKAN139-
KEYPAD_JPCOMMA140-
KEY_INTERNATIONAL7141-
KEY_INTERNATIONAL8142-
KEY_INTERNATIONAL9143-
KEY_HANGEUL144-
KEY_HANJA145-
KEY_KATAKANA146-
KEY_HIRAGANA147-
KEY_ZENKAKU_HANKAKU148-
KEY_FURIGANA149-
KEY_LANG7150-
KEY_LANG8151-
KEY_LANG9152-
KEY_LEFT_CONTROL224-
KEY_LEFT_SHIFT225-
KEY_LEFT_ALT226-
KEY_LEFT_GUI227xHome button
KEY_RIGHT_CONTROL228-
KEY_RIGHT_SHIFT229-
KEY_RIGHT_ALT230-
KEY_RIGHT_GUI231-
KEY_MEDIA_PLAY_PAUSE232-TODO test in apps. NOK: Plex
KEY_MEDIA_STOP_CD233-
KEY_MEDIA_PREVIOUS_SONG234-
KEY_MEDIA_NEXT_SONG235-
KEY_MEDIA_EJECT_CD236-
KEY_MEDIA_VOLUME_UP237xSame as KEY_VOLUME_UP
KEY_MEDIA_VOLUME_DOWN238xSame as KEY_VOLUME_DOWN
KEY_MEDIA_MUTE239xSame as KEY_MUTE
KEY_MEDIA_WWW240-
KEY_MEDIA_BACK241-
KEY_MEDIA_FORWARD242-
KEY_MEDIA_STOP243xSame as KEY_STOP. Works in Plex
KEY_MEDIA_FIND244-
KEY_MEDIA_SCROLL_UP245-Use KEY_PAGE_UP instead
KEY_MEDIA_SCROLL_DOWN246-Use KEY_PAGE_DOWN instead
KEY_MEDIA_EDIT247-
KEY_MEDIA_SLEEP248-
KEY_MEDIA_COFFEE249-
KEY_MEDIA_REFRESH250-
KEY_MEDIA_CALC251-

Consumer codes (Consumer Page (0x0C))

It seems that no consumer codes are supported.

key nameusage codeOKDescription
CONSUMER_INCREMENT_100x020-
CONSUMER_INCREMENT_1000x021-
CONSUMER_AM_PM0x022-
CONSUMER_POWER0x030-
CONSUMER_RESET0x031-
CONSUMER_SLEEP0x032-
CONSUMER_SLEEP_AFTER0x033-
CONSUMER_SLEEP_MODE0x034-
CONSUMER_ILLUMINATION0x035-
CONSUMER_FUNCTION_BUTTONS0x036-
CONSUMER_MENU0x040-TODO test in apps
CONSUMER_MENU_PICK0x041-
CONSUMER_MENU_UP0x042-
CONSUMER_MENU_DOWN0x043-
CONSUMER_MENU_LEFT0x044-
CONSUMER_MENU_RIGHT0x045-
CONSUMER_MENU_ESCAPE0x046-
CONSUMER_MENU_VALUE_INCREASE0x047
CONSUMER_MENU_VALUE_DECREASE0x048
CONSUMER_DATA_ON_SCREEN0x060-
CONSUMER_CLOSED_CAPTION0x061-
CONSUMER_CLOSED_CAPTION_SELECT0x062-
CONSUMER_VCR_TV0x063
CONSUMER_BROADCAST_MODE0x064
CONSUMER_SNAPSHOT0x065
CONSUMER_STILL0x066
CONSUMER_PICTURE_IN_PICTURE_TOGGLE0x067-
CONSUMER_PICTURE_IN_PICTURE_SWAP0x068
CONSUMER_RED_MENU_BUTTON0x069-
CONSUMER_GREEN_MENU_BUTTON0x06A-
CONSUMER_BLUE_MENU_BUTTON0x06B-
CONSUMER_YELLOW_MENU_BUTTON0x06C-
CONSUMER_ASPECT0x06D
CONSUMER_MODE_SELECT_3D0x06E
CONSUMER_DISPLAY_BRIGHTNESS_INCREMENT0x06F
CONSUMER_DISPLAY_BRIGHTNESS_DECREMENT0x070
CONSUMER_DISPLAY_BRIGHTNESS0x071
CONSUMER_DISPLAY_BACKLIGHT_TOGGLE0x072
CONSUMER_DISPLAY_SET_BRIGHTNESS_TO_MINIMUM0x073
CONSUMER_DISPLAY_SET_BRIGHTNESS_TO_MAXIMUM0x074
CONSUMER_DISPLAY_SET_AUTO_BRIGHTNESS0x075
CONSUMER_CAMERA_ACCESS_ENABLED0x076
CONSUMER_CAMERA_ACCESS_DISABLED0x077
CONSUMER_CAMERA_ACCESS_TOGGLE0x078
CONSUMER_KEYBOARD_BRIGHTNESS_INCREMENT0x079
CONSUMER_KEYBOARD_BRIGHTNESS_DECREMENT0x07A
CONSUMER_KEYBOARD_BACKLIGHT_SET_LEVEL0x07B
CONSUMER_KEYBOARD_BACKLIGHT_OOC0x07C
CONSUMER_KEYBOARD_BACKLIGHT_SET_MINIMUM0x07D
CONSUMER_KEYBOARD_BACKLIGHT_SET_MAXIMUM0x07E
CONSUMER_KEYBOARD_BACKLIGHT_AUTO0x07F
CONSUMER_SELECTION0x080
CONSUMER_ASSIGN_SELECTION0x081
CONSUMER_MODE_STEP0x082
CONSUMER_RECALL_LAST0x083
CONSUMER_ENTER_CHANNEL0x084
CONSUMER_ORDER_MOVIE0x085
CONSUMER_CHANNEL0x086
CONSUMER_MEDIA_SELECTION0x087-
CONSUMER_MEDIA_SELECT_COMPUTER0x088-
CONSUMER_MEDIA_SELECT_TV0x089-
CONSUMER_MEDIA_SELECT_WWW0x08A-
CONSUMER_MEDIA_SELECT_DVD0x08B-
CONSUMER_MEDIA_SELECT_TELEPHONE0x08C-
CONSUMER_MEDIA_SELECT_PROGRAM_GUIDE0x08D-
CONSUMER_MEDIA_SELECT_VIDEO_PHONE0x08E-
CONSUMER_MEDIA_SELECT_GAMES0x08F-
CONSUMER_MEDIA_SELECT_MESSAGES0x090-
CONSUMER_MEDIA_SELECT_CD0x091-
CONSUMER_MEDIA_SELECT_VCR0x092-
CONSUMER_MEDIA_SELECT_TUNER0x093-
CONSUMER_QUIT0x094-
CONSUMER_HELP0x095-
CONSUMER_MEDIA_SELECT_TAPE0x096-
CONSUMER_MEDIA_SELECT_CABLE0x097-
CONSUMER_MEDIA_SELECT_SATELLITE0x098-
CONSUMER_MEDIA_SELECT_SECURITY0x099-
CONSUMER_MEDIA_SELECT_HOME0x09A-
CONSUMER_MEDIA_SELECT_CALL0x09B-
CONSUMER_CHANNEL_INCREMENT0x09C-
CONSUMER_CHANNEL_DECREMENT0x09D-
CONSUMER_MEDIA_SELECT_SAP0x09E-
CONSUMER_VCR_PLUS0x0A0-
CONSUMER_ONCE0x0A1
CONSUMER_DAILY0x0A2
CONSUMER_WEEKLY0x0A3
CONSUMER_MONTHLY0x0A4
CONSUMER_PLAY0x0B0-TODO test in apps. NOK: Plex
CONSUMER_PAUSE0x0B1-Use KEY_PAUSE instead
CONSUMER_RECORD0x0B2-
CONSUMER_FAST_FORWARD0x0B3-NOK: Plex
CONSUMER_REWIND0x0B4-NOK: Plex
CONSUMER_SCAN_NEXT_TRACK0x0B5-
CONSUMER_SCAN_PREVIOUS_TRACK0x0B6-
CONSUMER_STOP0x0B7-Use KEY_STOP instead
CONSUMER_EJECT0x0B8
CONSUMER_RANDOM_PLAY0x0B9-
CONSUMER_SELECT_DISC0x0BA
CONSUMER_ENTER_DISC0x0BB
CONSUMER_REPEAT0x0BC
CONSUMER_TRACKING0x0BD
CONSUMER_TRACK_NORMAL0x0BE
CONSUMER_SLOW_TRACKING0x0BF
CONSUMER_FRAME_FORWARD0x0C0
CONSUMER_FRAME_BACK0x0C1
CONSUMER_MARK0x0C2
CONSUMER_CLEAR_MARK0x0C3
CONSUMER_REPEAT_FROM_MARK0x0C4
CONSUMER_RETURN_TO_MARK0x0C5
CONSUMER_SEARCH_MARK_FORWARD0x0C6
CONSUMER_SEARCH_MARK_BACKWARDS0x0C7
CONSUMER_COUNTER_RESET0x0C8
CONSUMER_SHOW_COUNTER0x0C9
CONSUMER_TRACKING_INCREMENT0x0CA
CONSUMER_TRACKING_DECREMENT0x0CB
CONSUMER_STOP_EJECT0x0CC-
CONSUMER_PLAY_PAUSE0x0CD-
CONSUMER_PLAY_SKIP0x0CE
CONSUMER_VOICE_COMMAND0x0CF-
CONSUMER_INVOKE_CAPTURE_INTERFACE0x0D0
CONSUMER_START_OR_STOP_GAME_RECORDING0x0D1
CONSUMER_HISTORICAL_GAME_CAPTURE0x0D2
CONSUMER_CAPTURE_GAME_SCREENSHOT0x0D3
CONSUMER_SHOW_OR_HIDE_RECORDING_INDICATOR0x0D4
CONSUMER_START_OR_STOP_MICROPHONE_CAPTURE0x0D5
CONSUMER_START_OR_STOP_CAMERA_CAPTURE0x0D6
CONSUMER_START_OR_STOP_GAME_BROADCAST0x0D7
CONSUMER_VOLUME0x0E0-
CONSUMER_BALANCE0x0E1-
CONSUMER_MUTE0x0E2-
CONSUMER_BASS0x0E3-
CONSUMER_TREBLE0x0E4-
CONSUMER_BASS_BOOST0x0E5-
CONSUMER_SURROUND_MODE0x0E6-
CONSUMER_LOUDNESS0x0E7-
CONSUMER_MPX0x0E8
CONSUMER_VOLUME_INCREMENT0x0E9-
CONSUMER_VOLUME_DECREMENT0x0EA-
CONSUMER_SPEED_SELECT0x0F0
CONSUMER_PLAYBACK_SPEED0x0F1
CONSUMER_STANDARD_PLAY0x0F2
CONSUMER_LONG_PLAY0x0F3
CONSUMER_EXTENDED_PLAY0x0F4
CONSUMER_SLOW0x0F5
CONSUMER_FAN_ENABLE0x100
CONSUMER_FAN_SPEED0x101
CONSUMER_LIGHT_ENABLE0x102
CONSUMER_LIGHT_ILLUMINATION_LEVEL0x103
CONSUMER_CLIMATE_CONTROL_ENABLE0x104
CONSUMER_ROOM_TEMPERATURE0x105
CONSUMER_SECURITY_ENABLE0x106
CONSUMER_FIRE_ALARM0x107
CONSUMER_POLICE_ALARM0x108
CONSUMER_PROXIMITY0x109
CONSUMER_MOTION0x10A
CONSUMER_DURESS_ALARM0x10B
CONSUMER_HOLDUP_ALARM0x10C
CONSUMER_MEDICAL_ALARM0x10D
CONSUMER_BALANCE_RIGHT0x150
CONSUMER_BALANCE_LEFT0x151
CONSUMER_BASS_INCREMENT0x152
CONSUMER_BASS_DECREMENT0x153
CONSUMER_TREBLE_INCREMENT0x154
CONSUMER_TREBLE_DECREMENT0x155
CONSUMER_SPEAKER_SYSTEM0x160
CONSUMER_CHANNEL_LEFT0x161
CONSUMER_CHANNEL_RIGHT0x162
CONSUMER_CHANNEL_CENTER0x163
CONSUMER_CHANNEL_FRONT0x164
CONSUMER_CHANNEL_CENTER_FRONT0x165
CONSUMER_CHANNEL_SIDE0x166
CONSUMER_CHANNEL_SURROUND0x167
CONSUMER_CHANNEL_LOW_FREQUENCY_ENHANCEMENT0x168
CONSUMER_CHANNEL_TOP0x169
CONSUMER_CHANNEL_UNKNOWN0x16A
CONSUMER_SUB_CHANNEL0x170
CONSUMER_SUB_CHANNEL_INCREMENT0x171
CONSUMER_SUB_CHANNEL_DECREMENT0x172
CONSUMER_ALTERNATE_AUDIO_INCREMENT0x173
CONSUMER_ALTERNATE_AUDIO_DECREMENT0x174
CONSUMER_APPLICATION_LAUNCH_BUTTONS0x180
CONSUMER_AL_LAUNCH_BUTTON_CONFIGURATION_TOOL0x181
CONSUMER_AL_PROGRAMMABLE_BUTTON_CONFIGURATION0x182
CONSUMER_AL_CONSUMER_CONTROL_CONFIGURATION0x183
CONSUMER_AL_WORD_PROCESSOR0x184
CONSUMER_AL_TEXT_EDITOR0x185
CONSUMER_AL_SPREADSHEET0x186
CONSUMER_AL_GRAPHICS_EDITOR0x187
CONSUMER_AL_PRESENTATION_APP0x188
CONSUMER_AL_DATABASE_APP0x189
CONSUMER_AL_EMAIL_READER0x18A
CONSUMER_AL_NEWSREADER0x18B
CONSUMER_AL_VOICEMAIL0x18C
CONSUMER_AL_CONTACTS_ADDRESS_BOOK0x18D
CONSUMER_AL_CALENDAR_SCHEDULE0x18E
CONSUMER_AL_TASK_PROJECT_MANAGER0x18F
CONSUMER_AL_LOG_JOURNAL_TIMECARD0x190
CONSUMER_AL_CHECKBOOK_FINANCE0x191
CONSUMER_AL_CALCULATOR0x192
CONSUMER_AL_A_V_CAPTURE_PLAYBACK0x193
CONSUMER_AL_LOCAL_MACHINE_BROWSER0x194
CONSUMER_AL_LAN_WAN_BROWSER0x195
CONSUMER_AL_INTERNET_BROWSER0x196
CONSUMER_AL_REMOTE_NETWORKING_ISP_CONNECT0x197
CONSUMER_AL_NETWORK_CONFERENCE0x198
CONSUMER_AL_NETWORK_CHAT0x199
CONSUMER_AL_TELEPHONY_DIALER0x19A
CONSUMER_AL_LOGON0x19B
CONSUMER_AL_LOGOFF0x19C
CONSUMER_AL_LOGON_LOGOFF0x19D
CONSUMER_AL_TERMINAL_LOCK_SCREENSAVER0x19E
CONSUMER_AL_CONTROL_PANEL0x19F
CONSUMER_AL_COMMAND_LINE_PROCESSOR_RUN0x1A0
CONSUMER_AL_PROCESS_TASK_MANAGER0x1A1
CONSUMER_AL_SELECT_TASK_APPLICATION0x1A2-
CONSUMER_AL_NEXT_TASK_APPLICATION0x1A3-
CONSUMER_AL_PREVIOUS_TASK_APPLICATION0x1A4-
CONSUMER_AL_PREEMPTIVE_HALT_TASK_APPLICATION0x1A5
CONSUMER_AL_INTEGRATED_HELP_CENTER0x1A6
CONSUMER_AL_DOCUMENTS0x1A7
CONSUMER_AL_THESAURUS0x1A8
CONSUMER_AL_DICTIONARY0x1A9
CONSUMER_AL_DESKTOP0x1AA
CONSUMER_AL_SPELL_CHECK0x1AB
CONSUMER_AL_GRAMMAR_CHECK0x1AC
CONSUMER_AL_WIRELESS_STATUS0x1AD
CONSUMER_AL_KEYBOARD_LAYOUT0x1AE
CONSUMER_AL_VIRUS_PROTECTION0x1AF
CONSUMER_AL_ENCRYPTION0x1B0
CONSUMER_AL_SCREEN_SAVER0x1B1
CONSUMER_AL_ALARMS0x1B2
CONSUMER_AL_CLOCK0x1B3
CONSUMER_AL_FILE_BROWSER0x1B4
CONSUMER_AL_POWER_STATUS0x1B5
CONSUMER_AL_IMAGE_BROWSER0x1B6
CONSUMER_AL_AUDIO_BROWSER0x1B7
CONSUMER_AL_MOVIE_BROWSER0x1B8
CONSUMER_AL_DIGITAL_RIGHTS_MANAGER0x1B9
CONSUMER_AL_DIGITAL_WALLET0x1BA
CONSUMER_AL_INSTANT_MESSAGING0x1BC
CONSUMER_AL_OEM_FEATURES_TIPS_TUTORIAL_BROWSER0x1BD
CONSUMER_AL_OEM_HELP0x1BE
CONSUMER_AL_ONLINE_COMMUNITY0x1BF
CONSUMER_AL_ENTERTAINMENT_CONTENT_BROWSER0x1C0
CONSUMER_AL_ONLINE_SHOPPING_BROWSER0x1C1
CONSUMER_AL_SMARTCARD_INFORMATION_HELP0x1C2
CONSUMER_AL_MARKET_MONITOR_FINANCE_BROWSER0x1C3
CONSUMER_AL_CUSTOMIZED_CORPORATE_NEWS_BROWSER0x1C4
CONSUMER_AL_ONLINE_ACTIVITY_BROWSER0x1C5
CONSUMER_AL_RESEARCH_SEARCH_BROWSER0x1C6
CONSUMER_AL_AUDIO_PLAYER0x1C7
CONSUMER_AL_MESSAGE_STATUS0x1C8
CONSUMER_AL_CONTACT_SYNC0x1C9
CONSUMER_AL_NAVIGATION0x1CA
CONSUMER_AL_CONTEXT_AWARE_DESKTOP_ASSISTANT0x1CB
CONSUMER_GENERIC_GUI_APPLICATION_CONTROLS0x200
CONSUMER_AC_NEW0x201
CONSUMER_AC_OPEN0x202
CONSUMER_AC_CLOSE0x203
CONSUMER_AC_EXIT0x204
CONSUMER_AC_MAXIMIZE0x205
CONSUMER_AC_MINIMIZE0x206
CONSUMER_AC_SAVE0x207
CONSUMER_AC_PRINT0x208
CONSUMER_AC_PROPERTIES0x209
CONSUMER_AC_UNDO0x21A
CONSUMER_AC_COPY0x21B
CONSUMER_AC_CUT0x21C
CONSUMER_AC_PASTE0x21D
CONSUMER_AC_SELECT_ALL0x21E
CONSUMER_AC_FIND0x21F
CONSUMER_AC_FIND_AND_REPLACE0x220
CONSUMER_AC_SEARCH0x221
CONSUMER_AC_GO_TO0x222
CONSUMER_AC_HOME0x223-
CONSUMER_AC_BACK0x224-
CONSUMER_AC_FORWARD0x225
CONSUMER_AC_STOP0x226
CONSUMER_AC_REFRESH0x227
CONSUMER_AC_PREVIOUS_LINK0x228
CONSUMER_AC_NEXT_LINK0x229
CONSUMER_AC_BOOKMARKS0x22A
CONSUMER_AC_HISTORY0x22B
CONSUMER_AC_SUBSCRIPTIONS0x22C
CONSUMER_AC_ZOOM_IN0x22D
CONSUMER_AC_ZOOM_OUT0x22E
CONSUMER_AC_ZOOM0x22F
CONSUMER_AC_FULL_SCREEN_VIEW0x230
CONSUMER_AC_NORMAL_VIEW0x231
CONSUMER_AC_VIEW_TOGGLE0x232
CONSUMER_AC_SCROLL_UP0x233
CONSUMER_AC_SCROLL_DOWN0x234
CONSUMER_AC_SCROLL0x235
CONSUMER_AC_PAN_LEFT0x236
CONSUMER_AC_PAN_RIGHT0x237
CONSUMER_AC_PAN0x238
CONSUMER_AC_NEW_WINDOW0x239
CONSUMER_AC_TILE_HORIZONTALLY0x23A
CONSUMER_AC_TILE_VERTICALLY0x23B
CONSUMER_AC_FORMAT0x23C
CONSUMER_AC_EDIT0x23D
CONSUMER_AC_BOLD0x23E
CONSUMER_AC_ITALICS0x23F
CONSUMER_AC_UNDERLINE0x240
CONSUMER_AC_STRIKETHROUGH0x241
CONSUMER_AC_SUBSCRIPT0x242
CONSUMER_AC_SUPERSCRIPT0x243
CONSUMER_AC_ALL_CAPS0x244
CONSUMER_AC_ROTATE0x245
CONSUMER_AC_RESIZE0x246
CONSUMER_AC_FLIP_HORIZONTAL0x247
CONSUMER_AC_FLIP_VERTICAL0x248
CONSUMER_AC_MIRROR_HORIZONTAL0x249
CONSUMER_AC_MIRROR_VERTICAL0x24A
CONSUMER_AC_FONT_SELECT0x24B
CONSUMER_AC_FONT_COLOR0x24C
CONSUMER_AC_FONT_SIZE0x24D
CONSUMER_AC_JUSTIFY_LEFT0x24E
CONSUMER_AC_JUSTIFY_CENTER_H0x24F
CONSUMER_AC_JUSTIFY_RIGHT0x250
CONSUMER_AC_JUSTIFY_BLOCK_H0x251
CONSUMER_AC_JUSTIFY_TOP0x252
CONSUMER_AC_JUSTIFY_CENTER_V0x253
CONSUMER_AC_JUSTIFY_BOTTOM0x254
CONSUMER_AC_JUSTIFY_BLOCK_V0x255
CONSUMER_AC_INDENT_DECREASE0x256
CONSUMER_AC_INDENT_INCREASE0x257
CONSUMER_AC_NUMBERED_LIST0x258
CONSUMER_AC_RESTART_NUMBERING0x259
CONSUMER_AC_BULLETED_LIST0x25A
CONSUMER_AC_PROMOTE0x25B
CONSUMER_AC_DEMOTE0x25C
CONSUMER_AC_YES0x25D
CONSUMER_AC_NO0x25E
CONSUMER_AC_CANCEL0x25F
CONSUMER_AC_CATALOG0x260
CONSUMER_AC_BUY_CHECKOUT0x261
CONSUMER_AC_ADD_TO_CART0x262
CONSUMER_AC_EXPAND0x263
CONSUMER_AC_EXPAND_ALL0x264
CONSUMER_AC_COLLAPSE0x265
CONSUMER_AC_COLLAPSE_ALL0x266
CONSUMER_AC_PRINT_PREVIEW0x267
CONSUMER_AC_PASTE_SPECIAL0x268
CONSUMER_AC_INSERT_MODE0x269
CONSUMER_AC_DELETE0x26A
CONSUMER_AC_LOCK0x26B
CONSUMER_AC_UNLOCK0x26C
CONSUMER_AC_PROTECT0x26D
CONSUMER_AC_UNPROTECT0x26E
CONSUMER_AC_ATTACH_COMMENT0x26F
CONSUMER_AC_DELETE_COMMENT0x270
CONSUMER_AC_VIEW_COMMENT0x271
CONSUMER_AC_SELECT_WORD0x272
CONSUMER_AC_SELECT_SENTENCE0x273
CONSUMER_AC_SELECT_PARAGRAPH0x274
CONSUMER_AC_SELECT_COLUMN0x275
CONSUMER_AC_SELECT_ROW0x276
CONSUMER_AC_SELECT_TABLE0x277
CONSUMER_AC_SELECT_OBJECT0x278
CONSUMER_AC_REDO_REPEAT0x279
CONSUMER_AC_SORT0x27A
CONSUMER_AC_SORT_ASCENDING0x27B
CONSUMER_AC_SORT_DESCENDING0x27C
CONSUMER_AC_FILTER0x27D
CONSUMER_AC_SET_CLOCK0x27E
CONSUMER_AC_VIEW_CLOCK0x27F
CONSUMER_AC_SELECT_TIME_ZONE0x280
CONSUMER_AC_EDIT_TIME_ZONES0x281
CONSUMER_AC_SET_ALARM0x282
CONSUMER_AC_CLEAR_ALARM0x283
CONSUMER_AC_SNOOZE_ALARM0x284
CONSUMER_AC_RESET_ALARM0x285
CONSUMER_AC_SYNCHRONIZE0x286
CONSUMER_AC_SEND_RECEIVE0x287
CONSUMER_AC_SEND_TO0x288
CONSUMER_AC_REPLY0x289
CONSUMER_AC_REPLY_ALL0x28A
CONSUMER_AC_FORWARD_MSG0x28B
CONSUMER_AC_SEND0x28C
CONSUMER_AC_ATTACH_FILE0x28D
CONSUMER_AC_UPLOAD0x28E
CONSUMER_AC_DOWNLOAD_SAVE_TARGET_AS0x28F
CONSUMER_AC_SET_BORDERS0x290
CONSUMER_AC_INSERT_ROW0x291
CONSUMER_AC_INSERT_COLUMN0x292
CONSUMER_AC_INSERT_FILE0x293
CONSUMER_AC_INSERT_PICTURE0x294
CONSUMER_AC_INSERT_OBJECT0x295
CONSUMER_AC_INSERT_SYMBOL0x296
CONSUMER_AC_SAVE_AND_CLOSE0x297
CONSUMER_AC_RENAME0x298
CONSUMER_AC_MERGE0x299
CONSUMER_AC_SPLIT0x29A
CONSUMER_AC_DISRIBUTE_HORIZONTALLY0x29B
CONSUMER_AC_DISTRIBUTE_VERTICALLY0x29C
CONSUMER_AC_NEXT_KEYBOARD_LAYOUT_SELECT0x29D
CONSUMER_AC_NAVIGATION_GUIDANCE0x29E
CONSUMER_AC_DESKTOP_SHOW_ALL_WINDOWS0x29F
CONSUMER_AC_SOFT_KEY_LEFT0x2A0
CONSUMER_AC_SOFT_KEY_RIGHT0x2A1
CONSUMER_AC_DESKTOP_SHOW_ALL_APPLICATIONS0x2A2
CONSUMER_AC_IDLE_KEEP_ALIVE0x2B0
CONSUMER_EXTENDED_KEYBOARD_ATTRIBUTES_COLLECTION0x2C0
CONSUMER_KEYBOARD_FORM_FACTOR0x2C1
CONSUMER_KEYBOARD_KEY_TYPE0x2C2
CONSUMER_KEYBOARD_PHYSICAL_LAYOUT0x2C3
CONSUMER_VENDOR_SPECIFIC_KEYBOARD_PHYSICAL_LAYOUT0x2C4
CONSUMER_KEYBOARD_IETF_LANGUAGE_TAG_INDEX0x2C5
CONSUMER_IMPLEMENTED_KEYBOARD_INPUT_ASSIST_CONTROLS0x2C6
CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS0x2C7
CONSUMER_KEYBOARD_INPUT_ASSIST_NEXT0x2C8
CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS_GROUP0x2C9
CONSUMER_KEYBOARD_INPUT_ASSIST_NEXT_GROUP0x2CA
CONSUMER_KEYBOARD_INPUT_ASSIST_ACCEPT0x2CB
CONSUMER_KEYBOARD_INPUT_ASSIST_CANCEL0x2CC

System Controls (Generic Desktop Page (0x01))

Key nameUsage codeOkComment
SYSTEM_POWER_DOWN0x81-
SYSTEM_SLEEP0x82-
SYSTEM_WAKE_UP0x83-

  1. Works for text entry ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19 ↩20 ↩21 ↩22 ↩23 ↩24 ↩25 ↩26 ↩27 ↩28 ↩29 ↩30 ↩31 ↩32 ↩33 ↩34 ↩35 ↩36 ↩37 ↩38 ↩39 ↩40 ↩41 ↩42 ↩43 ↩44 ↩45 ↩46 ↩47 ↩48 ↩49 ↩50 ↩51 ↩52 ↩53 ↩54 ↩55 ↩56 ↩57

onn. Streaming Device

  • Based on Google Chromecast (generic Android device).
  • Tested with onn. Streaming Device 4K pro, running Android TV 12

Known issues

  • Native YouTube, Netflix, Disney+, Paramount+ buttons could not be found.
    • Workaround: use Button Mapper: Remap your keys or a similar app to application shortcuts for unused buttons. Suggested keys: KEY_F20 ... KEY_F23
      1. Select "Add buttons"
      2. Add a new Button with "+ Add Buttons"
      3. Send the key (e.g. KEY_F20), either with the Remote in a custom UI page / key mapping, or with a Core-API REST request.
      4. Select the newly added button (Pro feature is not required)
      5. Enable "Customize"
      6. Select "Single tap" and choose "Applications" if not yet pre-selected in the first drop-down list
      7. Choose your application
      8. Done!
    • Note: YouTube button is identified as BUTTON_3 (190), Netflix button as BUTTON_4 (191), Disney+ button as BUTTON_9 (196), Paramount+ button as BUTTON_10 (197) According to Android's KeyEvent class these should be "Generic Game Pad Button #3, #4, #9 & #10".
    • This project had no luck either: https://github.com/designer-living/pi-usb-gadget-controller/blob/main/ANDROID_MAPPING.md
  • Profile switch button could not be found. Button is identified as PROFILE_SWITCH 288, but sending the corresponding consumer HID value 0x0120 has no effect.
    • No workaround known. (It might work with sending a custom keycode with the "Button Mapper" Pro version).
  • Star button could not be found. Button is identified as KEYCODE_MACRO_1 313, but sending the corresponding consumer HID value 0x0139 has no effect.
    • Workaround: use "Button Mapper" as described for the streaming service buttons above.
  • TV button is country specific: Google TV is not available in every country. Corresponding key is CONSUMER_MEDIA_SELECT_PROGRAM_GUIDE.

Regular keycodes (Keyboard Keypad Page (0x07))

Key nameUsage codeOKDescription
KEY_A4x1
KEY_B5x1
KEY_C6x1
KEY_D7x1
KEY_E8x1
KEY_F9x1
KEY_G10x1
KEY_H11x1
KEY_I12x1
KEY_J13x1
KEY_K14x1
KEY_L15x1
KEY_M16x1
KEY_N17x1
KEY_O18x1
KEY_P19x1
KEY_Q20x1
KEY_R21x1
KEY_S22x1
KEY_T23x1
KEY_U24x1
KEY_V25x1
KEY_W26x1
KEY_X27x1
KEY_Y28x1
KEY_Z29x1
KEY_130x1
KEY_231x1
KEY_332x1
KEY_433x1
KEY_534x1
KEY_635x1
KEY_736x1
KEY_837x1
KEY_938x1
KEY_039x1
KEY_RETURN40xNavigation select (same as KEYPAD_ENTER)
KEY_ESC41xNavigation go back (mostly). Better use CONSUMER_AC_BACK to return from all menus!
KEY_BACKSPACE42x1
KEY_TAB43xPlex: next UI element
KEY_SPACE44x1
KEY_MINUS45x1
KEY_EQUAL46x1
KEY_LEFT_BRACE47x1
KEY_RIGHT_BRACE48x1
KEY_BACKSLASH49x1
KEY_HASH_TILDE50x1
KEY_SEMICOLON51x1
KEY_APOSTROPHE52x1
KEY_GRAVE53x1
KEY_COMMA54x1
KEY_DOT55x1
KEY_SLASH56x1
KEY_CAPSLOCK57x
KEY_F158x
KEY_F259x
KEY_F360x
KEY_F461x
KEY_F562x
KEY_F663x
KEY_F764x
KEY_F865x
KEY_F966x
KEY_F1067x
KEY_F1168x
KEY_F1269x
KEY_SYSRQ70x
KEY_SCROLL_LOCK71x
KEY_PAUSE72x
KEY_INSERT73x
KEY_HOME74xScroll to start of list
KEY_PAGE_UP75xScroll list
KEY_DELETE76x1
KEY_END77xScroll to end of list
KEY_PAGE_DOWN78xScroll list
KEY_RIGHT_ARROW79xMenu navigation
KEY_LEFT_ARROW80xMenu navigation
KEY_DOWN_ARROW81xMenu navigation
KEY_UP_ARROW82xMenu navigation
KEYPAD_NUMLOCK83x
KEYPAD_SLASH84x
KEYPAD_ASTERISK85x
KEYPAD_MINUS86x
KEYPAD_PLUS87x
KEYPAD_ENTER88xNavigation select
KEYPAD_189x
KEYPAD_290x
KEYPAD_391x
KEYPAD_492x
KEYPAD_593x
KEYPAD_694x
KEYPAD_795x
KEYPAD_896x
KEYPAD_997x
KEYPAD_098x
KEYPAD_DOT99x
KEY_102ND100-Recognized as BACKSLASH
KEY_APPLICATION101xContext menu (long press select on original remote)
KEY_POWER102xSleep & Wakeup
KEYPAD_EQUAL103x
KEY_F13104x2 PROG_RED
KEY_F14105x2 PROG_GREEN
KEY_F15106x2 PROG_YELLOW
KEY_F16107x2 PROG_BLUE
KEY_F17108x2 APP_SWITCH
KEY_F18109x2 BUTTON_1
KEY_F19110x2 BUTTON_2
KEY_F20111x2 BUTTON_3 (does not start YouTube but can be used in Button Mapper)
KEY_F21112x2 BUTTON_4 (does not start Netflix but can be used in Button Mapper)
KEY_F22113x2 BUTTON_5
KEY_F23114x2 BUTTON_6
KEY_F24115x2 BUTTON_7
KEY_EXECUTE116-2 F4
KEY_HELP117-2 F8
KEY_MENU118x2 MEDIA_RECORD
KEY_SELECT119-2 F2
KEY_STOP120xMEDIA_STOP
KEY_AGAIN121x2 MEDIA_EJECT
KEY_UNDO122-2 F1
KEY_CUT123x2
KEY_COPY124x2
KEY_PASTE125x2
KEY_FIND126-2 F6
KEY_MUTE127x
KEY_VOLUME_UP128x
KEY_VOLUME_DOWN129x
KEYPAD_COMMA133x
KEY_RO135x2
KEY_KATAKANA_HIRAGANA136x2
KEY_YEN137x2
KEY_HENKAN138x2
KEY_MUHENKAN139x2
KEYPAD_JPCOMMA140-Same as KEYPAD_COMMA
KEY_INTERNATIONAL7141-3 recognized as TV_SATELLITE_SERVICE, but likely a catch-all default value
KEY_INTERNATIONAL8142-3 "
KEY_INTERNATIONAL9143-3 "
KEY_HANGEUL144xKANA 2
KEY_HANJA145xEISU 2
KEY_KATAKANA146-2 MEDIA_FAST_FORWARD
KEY_HIRAGANA147-2 MUTE
KEY_ZENKAKU_HANKAKU148x2
KEY_FURIGANA149-3 recognized as TV_SATELLITE_SERVICE, but likely a catch-all default value
KEY_LANG7150-3 "
KEY_LANG8151-3 "
KEY_LANG9152-3 "
KEY_LEFT_CONTROL224x
KEY_LEFT_SHIFT225x
KEY_LEFT_ALT226x
KEY_LEFT_GUI227x
KEY_RIGHT_CONTROL228x
KEY_RIGHT_SHIFT229x
KEY_RIGHT_ALT230x
KEY_RIGHT_GUI231x
KEY_MEDIA_PLAY_PAUSE232xWorks with Spotify in background
KEY_MEDIA_STOP_CD233x"
KEY_MEDIA_PREVIOUS_SONG234x"
KEY_MEDIA_NEXT_SONG235x"
KEY_MEDIA_EJECT_CD236
KEY_MEDIA_VOLUME_UP237?3
KEY_MEDIA_VOLUME_DOWN238?3
KEY_MEDIA_MUTE239x
KEY_MEDIA_WWW240x2 EXPLORER
KEY_MEDIA_BACK241x
KEY_MEDIA_FORWARD242x
KEY_MEDIA_STOP243xWorks with Spotify in background
KEY_MEDIA_FIND2442 F6
KEY_MEDIA_SCROLL_UP245x2 PAGE_UP
KEY_MEDIA_SCROLL_DOWN246x2 PAGE_DOWN
KEY_MEDIA_EDIT247x2 SETTINGS
KEY_MEDIA_SLEEP248xPuts device to sleep, but doesn't wake it up when pressed again
KEY_MEDIA_COFFEE249xPower toggle
KEY_MEDIA_REFRESH250x2 REFRESH
KEY_MEDIA_CALC251x2 CALCULATOR

Consumer codes (Consumer Page (0x0C))

key nameusage codeOKDescription
CONSUMER_INCREMENT_100x020-4
CONSUMER_INCREMENT_1000x021-4
CONSUMER_AM_PM0x022-4
CONSUMER_POWER0x030xPower toggle
CONSUMER_RESET0x031-Wakes up device, otherwise doesn't seem to have a function
CONSUMER_SLEEP0x032xPuts device to sleep, but doesn't wake it up when pressed again
CONSUMER_SLEEP_AFTER0x033-4
CONSUMER_SLEEP_MODE0x034xPuts device to sleep, but doesn't wake it up when pressed again
CONSUMER_ILLUMINATION0x035-2 12
CONSUMER_FUNCTION_BUTTONS0x036x2 BUTTON_1, starts Netflix (but only from home screen and not from within an app)
CONSUMER_MENU0x040xMain screen: context menu (long press select on original remote). Plex: reset customizations
CONSUMER_MENU_PICK0x041xSelect
CONSUMER_MENU_UP0x042xNavigation
CONSUMER_MENU_DOWN0x043xNavigation
CONSUMER_MENU_LEFT0x044xNavigation
CONSUMER_MENU_RIGHT0x045xNavigation
CONSUMER_MENU_ESCAPE0x046xPlex: exit popup menu. NOK: Spotify
CONSUMER_MENU_VALUE_INCREASE0x047x2 NUMPAD_ADD
CONSUMER_MENU_VALUE_DECREASE0x048x2 NUMPAD_SUBTRACT
CONSUMER_DATA_ON_SCREEN0x060-2 358
CONSUMER_CLOSED_CAPTION0x061x2 CAPTIONS
CONSUMER_CLOSED_CAPTION_SELECT0x062-4
CONSUMER_VCR_TV0x063-2 379
CONSUMER_BROADCAST_MODE0x064-4
CONSUMER_SNAPSHOT0x065x2 CAMERA
CONSUMER_STILL0x066-4
CONSUMER_PICTURE_IN_PICTURE_TOGGLE0x067-4
CONSUMER_PICTURE_IN_PICTURE_SWAP0x068-4
CONSUMER_RED_MENU_BUTTON0x069x
CONSUMER_GREEN_MENU_BUTTON0x06Ax
CONSUMER_BLUE_MENU_BUTTON0x06Bx
CONSUMER_YELLOW_MENU_BUTTON0x06Cx
CONSUMER_ASPECT0x06D-2 375
CONSUMER_MODE_SELECT_3D0x06E-4
CONSUMER_DISPLAY_BRIGHTNESS_INCREMENT0x06FxBrightness slider, exit with CONSUMER_AC_BACK
CONSUMER_DISPLAY_BRIGHTNESS_DECREMENT0x070x"
CONSUMER_DISPLAY_BRIGHTNESS0x071-4
CONSUMER_DISPLAY_BACKLIGHT_TOGGLE0x072-2 431
CONSUMER_DISPLAY_SET_BRIGHTNESS_TO_MINIMUM0x073-2 592
CONSUMER_DISPLAY_SET_BRIGHTNESS_TO_MAXIMUM0x074-2 593
CONSUMER_DISPLAY_SET_AUTO_BRIGHTNESS0x075-2 TV_INPUT_HDMI_2
CONSUMER_CAMERA_ACCESS_ENABLED0x076-4
CONSUMER_CAMERA_ACCESS_DISABLED0x077-4
CONSUMER_CAMERA_ACCESS_TOGGLE0x078-4
CONSUMER_KEYBOARD_BRIGHTNESS_INCREMENT0x079x2 TV_DATA_SERVICE
CONSUMER_KEYBOARD_BRIGHTNESS_DECREMENT0x07Ax2 LAST_CHANNEL
CONSUMER_KEYBOARD_BACKLIGHT_SET_LEVEL0x07B-4
CONSUMER_KEYBOARD_BACKLIGHT_OOC0x07C-2 12
CONSUMER_KEYBOARD_BACKLIGHT_SET_MINIMUM0x07D-4
CONSUMER_KEYBOARD_BACKLIGHT_SET_MAXIMUM0x07E-4
CONSUMER_KEYBOARD_BACKLIGHT_AUTO0x07F-4
CONSUMER_SELECTION0x080-4
CONSUMER_ASSIGN_SELECTION0x081-4
CONSUMER_MODE_STEP0x082x2 TV_NETWORK
CONSUMER_RECALL_LAST0x083x2 LAST_CHANNEL
CONSUMER_ENTER_CHANNEL0x084x2 ENTER
CONSUMER_ORDER_MOVIE0x085-4
CONSUMER_CHANNEL0x086-4
CONSUMER_MEDIA_SELECTION0x087-4
CONSUMER_MEDIA_SELECT_COMPUTER0x088-2 376
CONSUMER_MEDIA_SELECT_TV0x089x2 TV
CONSUMER_MEDIA_SELECT_WWW0x08Ax2 EXPLORER
CONSUMER_MEDIA_SELECT_DVD0x08B-2 389
CONSUMER_MEDIA_SELECT_TELEPHONE0x08C-Crashes or resets device
CONSUMER_MEDIA_SELECT_PROGRAM_GUIDE0x08Dx2 GUIDE
CONSUMER_MEDIA_SELECT_VIDEO_PHONE0x08E-2 416
CONSUMER_MEDIA_SELECT_GAMES0x08F-2 417
CONSUMER_MEDIA_SELECT_MESSAGES0x090-2 396
CONSUMER_MEDIA_SELECT_CD0x091-2 383
CONSUMER_MEDIA_SELECT_VCR0x092-2 379
CONSUMER_MEDIA_SELECT_TUNER0x093-2 386
CONSUMER_QUIT0x094x2 BOOKMARK
CONSUMER_HELP0x095-2 F8
CONSUMER_MEDIA_SELECT_TAPE0x096-2 384
CONSUMER_MEDIA_SELECT_CABLE0x097-2 378
CONSUMER_MEDIA_SELECT_SATELLITE0x098-2 381
CONSUMER_MEDIA_SELECT_SECURITY0x099-4
CONSUMER_MEDIA_SELECT_HOME0x09Ax2 DVR
CONSUMER_MEDIA_SELECT_CALL0x09B-4
CONSUMER_CHANNEL_INCREMENT0x09Cx2 CHANNEL_UP
CONSUMER_CHANNEL_DECREMENT0x09Dx2 CHANNEL_DOWN
CONSUMER_MEDIA_SELECT_SAP0x09E-4
CONSUMER_VCR_PLUS0x0A0-2 380
CONSUMER_ONCE0x0A1-4
CONSUMER_DAILY0x0A2-4
CONSUMER_WEEKLY0x0A3-4
CONSUMER_MONTHLY0x0A4-4
CONSUMER_PLAY0x0B0xPlex: Play / Pause. Spotify: Play
CONSUMER_PAUSE0x0B1xPlex: show overlay menu
CONSUMER_RECORD0x0B2xPlex: record TV
CONSUMER_FAST_FORWARD0x0B3xSpotify: FF, Plex: skip forward
CONSUMER_REWIND0x0B4xSpotify: RW, Plex: skip backwards
CONSUMER_SCAN_NEXT_TRACK0x0B5xNext track (tested in Spotify)
CONSUMER_SCAN_PREVIOUS_TRACK0x0B6xPrevious track (tested in Spotify)
CONSUMER_STOP0x0B7xSpotify: Stop
CONSUMER_EJECT0x0B8xMEDIA_EJECT
CONSUMER_RANDOM_PLAY0x0B9-2 410
CONSUMER_SELECT_DISC0x0BA-4
CONSUMER_ENTER_DISC0x0BB-4
CONSUMER_REPEAT0x0BC-2 439
CONSUMER_TRACKING0x0BD-4
CONSUMER_TRACK_NORMAL0x0BE-4
CONSUMER_SLOW_TRACKING0x0BF-2 409
CONSUMER_FRAME_FORWARD0x0C0-4
CONSUMER_FRAME_BACK0x0C1-4
CONSUMER_MARK0x0C2-4
CONSUMER_CLEAR_MARK0x0C3-4
CONSUMER_REPEAT_FROM_MARK0x0C4-4
CONSUMER_RETURN_TO_MARK0x0C5-4
CONSUMER_SEARCH_MARK_FORWARD0x0C6-4
CONSUMER_SEARCH_MARK_BACKWARDS0x0C7-4
CONSUMER_COUNTER_RESET0x0C8-4
CONSUMER_SHOW_COUNTER0x0C9-4
CONSUMER_TRACKING_INCREMENT0x0CA-4
CONSUMER_TRACKING_DECREMENT0x0CB-4
CONSUMER_STOP_EJECT0x0CC-4
CONSUMER_PLAY_PAUSE0x0CDxPlex, Spotify, YouTube
CONSUMER_PLAY_SKIP0x0CE-4
CONSUMER_VOICE_COMMAND0x0CFxVoice assistant
CONSUMER_INVOKE_CAPTURE_INTERFACE0x0D0-4
CONSUMER_START_OR_STOP_GAME_RECORDING0x0D1-4
CONSUMER_HISTORICAL_GAME_CAPTURE0x0D2-4
CONSUMER_CAPTURE_GAME_SCREENSHOT0x0D3-4
CONSUMER_SHOW_OR_HIDE_RECORDING_INDICATOR0x0D4-4
CONSUMER_START_OR_STOP_MICROPHONE_CAPTURE0x0D5-4
CONSUMER_START_OR_STOP_CAMERA_CAPTURE0x0D6-4
CONSUMER_START_OR_STOP_GAME_BROADCAST0x0D7-4
CONSUMER_VOLUME0x0E0-
CONSUMER_BALANCE0x0E1-4
CONSUMER_MUTE0x0E2x
CONSUMER_BASS0x0E3-4
CONSUMER_TREBLE0x0E4-4
CONSUMER_BASS_BOOST0x0E5x2 MUSIC
CONSUMER_SURROUND_MODE0x0E6-4
CONSUMER_LOUDNESS0x0E7-4
CONSUMER_MPX0x0E8-4
CONSUMER_VOLUME_INCREMENT0x0E9x
CONSUMER_VOLUME_DECREMENT0x0EAx
CONSUMER_SPEED_SELECT0x0F0-4
CONSUMER_PLAYBACK_SPEED0x0F1-4
CONSUMER_STANDARD_PLAY0x0F2-4
CONSUMER_LONG_PLAY0x0F3-4
CONSUMER_EXTENDED_PLAY0x0F4-4
CONSUMER_SLOW0x0F5-2 409
CONSUMER_FAN_ENABLE0x100-4
CONSUMER_FAN_SPEED0x101-4
CONSUMER_LIGHT_ENABLE0x102-4
CONSUMER_LIGHT_ILLUMINATION_LEVEL0x103-4
CONSUMER_CLIMATE_CONTROL_ENABLE0x104-4
CONSUMER_ROOM_TEMPERATURE0x105-4
CONSUMER_SECURITY_ENABLE0x106-4
CONSUMER_FIRE_ALARM0x107-4
CONSUMER_POLICE_ALARM0x108-4
CONSUMER_PROXIMITY0x109-4
CONSUMER_MOTION0x10A-4
CONSUMER_DURESS_ALARM0x10B-4
CONSUMER_HOLDUP_ALARM0x10C-4
CONSUMER_MEDICAL_ALARM0x10D-4
CONSUMER_BALANCE_RIGHT0x150-4
CONSUMER_BALANCE_LEFT0x151-4
CONSUMER_BASS_INCREMENT0x152-4
CONSUMER_BASS_DECREMENT0x153-4
CONSUMER_TREBLE_INCREMENT0x154-4
CONSUMER_TREBLE_DECREMENT0x155-4
CONSUMER_SPEAKER_SYSTEM0x160-4
CONSUMER_CHANNEL_LEFT0x161-4
CONSUMER_CHANNEL_RIGHT0x162-4
CONSUMER_CHANNEL_CENTER0x163-4
CONSUMER_CHANNEL_FRONT0x164-4
CONSUMER_CHANNEL_CENTER_FRONT0x165-4
CONSUMER_CHANNEL_SIDE0x166-4
CONSUMER_CHANNEL_SURROUND0x167-4
CONSUMER_CHANNEL_LOW_FREQUENCY_ENHANCEMENT0x168-4
CONSUMER_CHANNEL_TOP0x169-4
CONSUMER_CHANNEL_UNKNOWN0x16A-4
CONSUMER_SUB_CHANNEL0x170-4
CONSUMER_SUB_CHANNEL_INCREMENT0x171-4
CONSUMER_SUB_CHANNEL_DECREMENT0x172-4
CONSUMER_ALTERNATE_AUDIO_INCREMENT0x173-4
CONSUMER_ALTERNATE_AUDIO_DECREMENT0x174-4
CONSUMER_APPLICATION_LAUNCH_BUTTONS0x180-4
CONSUMER_AL_LAUNCH_BUTTON_CONFIGURATION_TOOL0x181-2 576
CONSUMER_AL_PROGRAMMABLE_BUTTON_CONFIGURATION0x182x2 BOOKMARK
CONSUMER_AL_CONSUMER_CONTROL_CONFIGURATION0x183x2 MUSIC
CONSUMER_AL_WORD_PROCESSOR0x184-2 421
CONSUMER_AL_TEXT_EDITOR0x185-2 422
CONSUMER_AL_SPREADSHEET0x186-2 423
CONSUMER_AL_GRAPHICS_EDITOR0x187-2 424
CONSUMER_AL_PRESENTATION_APP0x188-2 425
CONSUMER_AL_DATABASE_APP0x189-2 426
CONSUMER_AL_EMAIL_READER0x18Ax2 ENVELOPE
CONSUMER_AL_NEWSREADER0x18B-2 427
CONSUMER_AL_VOICEMAIL0x18C-2 428
CONSUMER_AL_CONTACTS_ADDRESS_BOOK0x18Dx2 CONTACTS
CONSUMER_AL_CALENDAR_SCHEDULE0x18Ex2 CALENDAR
CONSUMER_AL_TASK_PROJECT_MANAGER0x18F-2 577
CONSUMER_AL_LOG_JOURNAL_TIMECARD0x190-2 578
CONSUMER_AL_CHECKBOOK_FINANCE0x191x2 ASSIST
CONSUMER_AL_CALCULATOR0x192x2 CALCULATOR
CONSUMER_AL_A_V_CAPTURE_PLAYBACK0x193-2 387
CONSUMER_AL_LOCAL_MACHINE_BROWSER0x194-2 NUMPAD_0
CONSUMER_AL_LAN_WAN_BROWSER0x195-4
CONSUMER_AL_INTERNET_BROWSER0x196x2 EXPLORER (same as CONSUMER_MEDIA_SELECT_WWW)
CONSUMER_AL_REMOTE_NETWORKING_ISP_CONNECT0x197-4
CONSUMER_AL_NETWORK_CONFERENCE0x198-4
CONSUMER_AL_NETWORK_CHAT0x199x2 YEN
CONSUMER_AL_TELEPHONY_DIALER0x19A-4
CONSUMER_AL_LOGON0x19B-4
CONSUMER_AL_LOGOFF0x19C-2 433
CONSUMER_AL_LOGON_LOGOFF0x19D-4
CONSUMER_AL_TERMINAL_LOCK_SCREENSAVER0x19ExSleep
CONSUMER_AL_CONTROL_PANEL0x19F-2 579
CONSUMER_AL_COMMAND_LINE_PROCESSOR_RUN0x1A0-4
CONSUMER_AL_PROCESS_TASK_MANAGER0x1A1-4
CONSUMER_AL_SELECT_TASK_APPLICATION0x1A2xShows my applications
CONSUMER_AL_NEXT_TASK_APPLICATION0x1A3-4
CONSUMER_AL_PREVIOUS_TASK_APPLICATION0x1A4-4
CONSUMER_AL_PREEMPTIVE_HALT_TASK_APPLICATION0x1A5-4
CONSUMER_AL_INTEGRATED_HELP_CENTER0x1A6x2 F8
CONSUMER_AL_DOCUMENTS0x1A7x2 TV_TERRESTRIAL_ANALOG
CONSUMER_AL_THESAURUS0x1A8-4
CONSUMER_AL_DICTIONARY0x1A9-4
CONSUMER_AL_DESKTOP0x1AA-4
CONSUMER_AL_SPELL_CHECK0x1AB-2 432
CONSUMER_AL_GRAMMAR_CHECK0x1AC-4
CONSUMER_AL_WIRELESS_STATUS0x1AD-4
CONSUMER_AL_KEYBOARD_LAYOUT0x1AE-2 374
CONSUMER_AL_VIRUS_PROTECTION0x1AF-4
CONSUMER_AL_ENCRYPTION0x1B0-4
CONSUMER_AL_SCREEN_SAVER0x1B1-2 581
CONSUMER_AL_ALARMS0x1B2-4
CONSUMER_AL_CLOCK0x1B3-4
CONSUMER_AL_FILE_BROWSER0x1B4-2 NUMPAD_0
CONSUMER_AL_POWER_STATUS0x1B5-4
CONSUMER_AL_IMAGE_BROWSER0x1B6-2 442
CONSUMER_AL_AUDIO_BROWSER0x1B7-2 392
CONSUMER_AL_MOVIE_BROWSER0x1B8-2 393
CONSUMER_AL_DIGITAL_RIGHTS_MANAGER0x1B9-4
CONSUMER_AL_DIGITAL_WALLET0x1BA-4
CONSUMER_AL_INSTANT_MESSAGING0x1BC-2 430
CONSUMER_AL_OEM_FEATURES_TIPS_TUTORIAL_BROWSER0x1BD-2 358
CONSUMER_AL_OEM_HELP0x1BE-4
CONSUMER_AL_ONLINE_COMMUNITY0x1BF-4
CONSUMER_AL_ENTERTAINMENT_CONTENT_BROWSER0x1C0-4
CONSUMER_AL_ONLINE_SHOPPING_BROWSER0x1C1-4
CONSUMER_AL_SMARTCARD_INFORMATION_HELP0x1C2-4
CONSUMER_AL_MARKET_MONITOR_FINANCE_BROWSER0x1C3-4
CONSUMER_AL_CUSTOMIZED_CORPORATE_NEWS_BROWSER0x1C4-4
CONSUMER_AL_ONLINE_ACTIVITY_BROWSER0x1C5-4
CONSUMER_AL_RESEARCH_SEARCH_BROWSER0x1C6-4
CONSUMER_AL_AUDIO_PLAYER0x1C7-4
CONSUMER_AL_MESSAGE_STATUS0x1C8-4
CONSUMER_AL_CONTACT_SYNC0x1C9-4
CONSUMER_AL_NAVIGATION0x1CA-4
CONSUMER_AL_CONTEXT_AWARE_DESKTOP_ASSISTANT0x1CB-Voice assistant, same as CONSUMER_VOICE_COMMAND
CONSUMER_GENERIC_GUI_APPLICATION_CONTROLS0x200-4
CONSUMER_AC_NEW0x201x2 AVR_POWER
CONSUMER_AC_OPEN0x202x2 F4
CONSUMER_AC_CLOSE0x203x2 3D_MODE
CONSUMER_AC_EXIT0x204x2 BOOKMARK
CONSUMER_AC_MAXIMIZE0x205-4
CONSUMER_AC_MINIMIZE0x206-4
CONSUMER_AC_SAVE0x207x2 TV_NUMBER_ENTRY
CONSUMER_AC_PRINT0x208x2 CALCULATOR
CONSUMER_AC_PROPERTIES0x209x2 MEDIA_RECORD
CONSUMER_AC_UNDO0x21Ax2 F1
CONSUMER_AC_COPY0x21Bx2 COPY
CONSUMER_AC_CUT0x21Cx2 CUT
CONSUMER_AC_PASTE0x21Dx2 PASTE
CONSUMER_AC_SELECT_ALL0x21E-4
CONSUMER_AC_FIND0x21Fx2 F6
CONSUMER_AC_FIND_AND_REPLACE0x220-4
CONSUMER_AC_SEARCH0x221-Search (voice assist)
CONSUMER_AC_GO_TO0x222-2 354
CONSUMER_AC_HOME0x223xHome button
CONSUMER_AC_BACK0x224xBack button
CONSUMER_AC_FORWARD0x225x2 FORWARD
CONSUMER_AC_STOP0x226xPlex: stop playback. Does not work in Spotify
CONSUMER_AC_REFRESH0x227-
CONSUMER_AC_PREVIOUS_LINK0x228-4
CONSUMER_AC_NEXT_LINK0x229-4
CONSUMER_AC_BOOKMARKS0x22Ax2 BOOKMARK
CONSUMER_AC_HISTORY0x22B-4
CONSUMER_AC_SUBSCRIPTIONS0x22C-4
CONSUMER_AC_ZOOM_IN0x22D-2 418
CONSUMER_AC_ZOOM_OUT0x22E-2 419
CONSUMER_AC_ZOOM0x22F-2 420
CONSUMER_AC_FULL_SCREEN_VIEW0x230-4
CONSUMER_AC_NORMAL_VIEW0x231-4
CONSUMER_AC_VIEW_TOGGLE0x232-4
CONSUMER_AC_SCROLL_UP0x233xPAGE_UP, scroll list
CONSUMER_AC_SCROLL_DOWN0x234xPAGE_DOWN, scroll list
CONSUMER_AC_SCROLL0x235-4
CONSUMER_AC_PAN_LEFT0x236-4
CONSUMER_AC_PAN_RIGHT0x237-4
CONSUMER_AC_PAN0x238-3
CONSUMER_AC_NEW_WINDOW0x239-4
CONSUMER_AC_TILE_HORIZONTALLY0x23A-4
CONSUMER_AC_TILE_VERTICALLY0x23B-4
CONSUMER_AC_FORMAT0x23C-4
CONSUMER_AC_EDIT0x23Dx2 SETTINGS
CONSUMER_AC_BOLD0x23E-4
CONSUMER_AC_ITALICS0x23F-4
CONSUMER_AC_UNDERLINE0x240-4
CONSUMER_AC_STRIKETHROUGH0x241-4
CONSUMER_AC_SUBSCRIPT0x242-4
CONSUMER_AC_SUPERSCRIPT0x243-4
CONSUMER_AC_ALL_CAPS0x244-4
CONSUMER_AC_ROTATE0x245-4
CONSUMER_AC_RESIZE0x246-4
CONSUMER_AC_FLIP_HORIZONTAL0x247-4
CONSUMER_AC_FLIP_VERTICAL0x248-4
CONSUMER_AC_MIRROR_HORIZONTAL0x249-4
CONSUMER_AC_MIRROR_VERTICAL0x24A-4
CONSUMER_AC_FONT_SELECT0x24B-4
CONSUMER_AC_FONT_COLOR0x24C-4
CONSUMER_AC_FONT_SIZE0x24D-4
CONSUMER_AC_JUSTIFY_LEFT0x24E-4
CONSUMER_AC_JUSTIFY_CENTER_H0x24F-4
CONSUMER_AC_JUSTIFY_RIGHT0x250-4
CONSUMER_AC_JUSTIFY_BLOCK_H0x251-4
CONSUMER_AC_JUSTIFY_TOP0x252-4
CONSUMER_AC_JUSTIFY_CENTER_V0x253-4
CONSUMER_AC_JUSTIFY_BOTTOM0x254-4
CONSUMER_AC_JUSTIFY_BLOCK_V0x255-4
CONSUMER_AC_INDENT_DECREASE0x256-4
CONSUMER_AC_INDENT_INCREASE0x257-4
CONSUMER_AC_NUMBERED_LIST0x258-4
CONSUMER_AC_RESTART_NUMBERING0x259-4
CONSUMER_AC_BULLETED_LIST0x25A-4
CONSUMER_AC_PROMOTE0x25B-4
CONSUMER_AC_DEMOTE0x25C-4
CONSUMER_AC_YES0x25D-4
CONSUMER_AC_NO0x25E-4
CONSUMER_AC_CANCEL0x25Fx2 SLEEP
CONSUMER_AC_CATALOG0x260-4
CONSUMER_AC_BUY_CHECKOUT0x261-4
CONSUMER_AC_ADD_TO_CART0x262-4
CONSUMER_AC_EXPAND0x263-4
CONSUMER_AC_EXPAND_ALL0x264-4
CONSUMER_AC_COLLAPSE0x265-4
CONSUMER_AC_COLLAPSE_ALL0x266-4
CONSUMER_AC_PRINT_PREVIEW0x267-4
CONSUMER_AC_PASTE_SPECIAL0x268-4
CONSUMER_AC_INSERT_MODE0x269xINSERT
CONSUMER_AC_DELETE0x26AxFORWARD_DEL
CONSUMER_AC_LOCK0x26B-4
CONSUMER_AC_UNLOCK0x26C-4
CONSUMER_AC_PROTECT0x26D-4
CONSUMER_AC_UNPROTECT0x26E-4
CONSUMER_AC_ATTACH_COMMENT0x26F-4
CONSUMER_AC_DELETE_COMMENT0x270-4
CONSUMER_AC_VIEW_COMMENT0x271-4
CONSUMER_AC_SELECT_WORD0x272-4
CONSUMER_AC_SELECT_SENTENCE0x273-4
CONSUMER_AC_SELECT_PARAGRAPH0x274-4
CONSUMER_AC_SELECT_COLUMN0x275-4
CONSUMER_AC_SELECT_ROW0x276-4
CONSUMER_AC_SELECT_TABLE0x277-4
CONSUMER_AC_SELECT_OBJECT0x278-4
CONSUMER_AC_REDO_REPEAT0x279x2 AVR_INPUT
CONSUMER_AC_SORT0x27A-4
CONSUMER_AC_SORT_ASCENDING0x27B-4
CONSUMER_AC_SORT_DESCENDING0x27C-4
CONSUMER_AC_FILTER0x27D-4
CONSUMER_AC_SET_CLOCK0x27E-4
CONSUMER_AC_VIEW_CLOCK0x27F-4
CONSUMER_AC_SELECT_TIME_ZONE0x280-4
CONSUMER_AC_EDIT_TIME_ZONES0x281-4
CONSUMER_AC_SET_ALARM0x282-4
CONSUMER_AC_CLEAR_ALARM0x283-4
CONSUMER_AC_SNOOZE_ALARM0x284-4
CONSUMER_AC_RESET_ALARM0x285-4
CONSUMER_AC_SYNCHRONIZE0x286-4
CONSUMER_AC_SEND_RECEIVE0x287-4
CONSUMER_AC_SEND_TO0x288-4
CONSUMER_AC_REPLY0x289x2 TV_RADIO_SERVICE
CONSUMER_AC_REPLY_ALL0x28A-4
CONSUMER_AC_FORWARD_MSG0x28Bx2 TV_TELETEXT
CONSUMER_AC_SEND0x28Cx2 VOICE_ASSIST
CONSUMER_AC_ATTACH_FILE0x28D-4
CONSUMER_AC_UPLOAD0x28E-4
CONSUMER_AC_DOWNLOAD_SAVE_TARGET_AS0x28F-4
CONSUMER_AC_SET_BORDERS0x290-4
CONSUMER_AC_INSERT_ROW0x291-4
CONSUMER_AC_INSERT_COLUMN0x292-4
CONSUMER_AC_INSERT_FILE0x293-4
CONSUMER_AC_INSERT_PICTURE0x294-4
CONSUMER_AC_INSERT_OBJECT0x295-4
CONSUMER_AC_INSERT_SYMBOL0x296-4
CONSUMER_AC_SAVE_AND_CLOSE0x297-4
CONSUMER_AC_RENAME0x298-4
CONSUMER_AC_MERGE0x299-4
CONSUMER_AC_SPLIT0x29A-4
CONSUMER_AC_DISRIBUTE_HORIZONTALLY0x29B-4
CONSUMER_AC_DISTRIBUTE_VERTICALLY0x29C-4
CONSUMER_AC_NEXT_KEYBOARD_LAYOUT_SELECT0x29D-4
CONSUMER_AC_NAVIGATION_GUIDANCE0x29E-4
CONSUMER_AC_DESKTOP_SHOW_ALL_WINDOWS0x29F-4
CONSUMER_AC_SOFT_KEY_LEFT0x2A0-4
CONSUMER_AC_SOFT_KEY_RIGHT0x2A1-4
CONSUMER_AC_DESKTOP_SHOW_ALL_APPLICATIONS0x2A2xShows or hides control panel
CONSUMER_AC_IDLE_KEEP_ALIVE0x2B0-4
CONSUMER_EXTENDED_KEYBOARD_ATTRIBUTES_COLLECTION0x2C0-4
CONSUMER_KEYBOARD_FORM_FACTOR0x2C1-4
CONSUMER_KEYBOARD_KEY_TYPE0x2C2-4
CONSUMER_KEYBOARD_PHYSICAL_LAYOUT0x2C3-4
CONSUMER_VENDOR_SPECIFIC_KEYBOARD_PHYSICAL_LAYOUT0x2C4-4
CONSUMER_KEYBOARD_IETF_LANGUAGE_TAG_INDEX0x2C5-4
CONSUMER_IMPLEMENTED_KEYBOARD_INPUT_ASSIST_CONTROLS0x2C6-4
CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS0x2C7-2 608
CONSUMER_KEYBOARD_INPUT_ASSIST_NEXT0x2C8-2 609
CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS_GROUP0x2C9-2 610
CONSUMER_KEYBOARD_INPUT_ASSIST_NEXT_GROUP0x2CA-2 611
CONSUMER_KEYBOARD_INPUT_ASSIST_ACCEPT0x2CB-2 612
CONSUMER_KEYBOARD_INPUT_ASSIST_CANCEL0x2CC-2 613

System Controls (Generic Desktop Page (0x01))

Key nameUsage codeOkComment
SYSTEM_POWER_DOWN0x81xPower toggle
SYSTEM_SLEEP0x82xSleep
SYSTEM_WAKE_UP0x83xWake up
SYSTEM_CONTEXT_MENU0x84-
SYSTEM_MAIN_MENU0x85xContext menu (long press select)
SYSTEM_APP_MENU0x86-
SYSTEM_MENU_HELP0x87-
SYSTEM_MENU_EXIT0x88-
SYSTEM_MENU_SELECT0x89xSame as KEY_RETURN
SYSTEM_MENU_RIGHT0x8AxSame as arrow key navigation
SYSTEM_MENU_LEFT0x8Bx
SYSTEM_MENU_UP0x8Cx
SYSTEM_MENU_DOWN0x8Dx
SYSTEM_COLD_RESTART0x8E-
SYSTEM_WARM_RESTART0x8F-
SYSTEM_DPAD_UP0x90-
SYSTEM_DPAD_DOWN0x91-
SYSTEM_DPAD_RIGHT0x92-
SYSTEM_DPAD_LEFT0x93-

  1. Works for text entry ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19 ↩20 ↩21 ↩22 ↩23 ↩24 ↩25 ↩26 ↩27 ↩28 ↩29 ↩30 ↩31 ↩32 ↩33 ↩34 ↩35 ↩36 ↩37 ↩38 ↩39 ↩40 ↩41 ↩42 ↩43 ↩44 ↩45 ↩46 ↩47 ↩48 ↩49 ↩50 ↩51

  2. Recognized in Button Mapper ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19 ↩20 ↩21 ↩22 ↩23 ↩24 ↩25 ↩26 ↩27 ↩28 ↩29 ↩30 ↩31 ↩32 ↩33 ↩34 ↩35 ↩36 ↩37 ↩38 ↩39 ↩40 ↩41 ↩42 ↩43 ↩44 ↩45 ↩46 ↩47 ↩48 ↩49 ↩50 ↩51 ↩52 ↩53 ↩54 ↩55 ↩56 ↩57 ↩58 ↩59 ↩60 ↩61 ↩62 ↩63 ↩64 ↩65 ↩66 ↩67 ↩68 ↩69 ↩70 ↩71 ↩72 ↩73 ↩74 ↩75 ↩76 ↩77 ↩78 ↩79 ↩80 ↩81 ↩82 ↩83 ↩84 ↩85 ↩86 ↩87 ↩88 ↩89 ↩90 ↩91 ↩92 ↩93 ↩94 ↩95 ↩96 ↩97 ↩98 ↩99 ↩100 ↩101 ↩102 ↩103 ↩104 ↩105 ↩106 ↩107 ↩108 ↩109 ↩110 ↩111 ↩112 ↩113 ↩114 ↩115 ↩116 ↩117 ↩118 ↩119 ↩120 ↩121 ↩122 ↩123 ↩124 ↩125 ↩126 ↩127 ↩128 ↩129 ↩130 ↩131 ↩132 ↩133 ↩134 ↩135 ↩136 ↩137 ↩138 ↩139 ↩140 ↩141 ↩142 ↩143 ↩144 ↩145 ↩146 ↩147 ↩148

  3. Not recognized in Button Mapper ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10

  4. No Android key code ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19 ↩20 ↩21 ↩22 ↩23 ↩24 ↩25 ↩26 ↩27 ↩28 ↩29 ↩30 ↩31 ↩32 ↩33 ↩34 ↩35 ↩36 ↩37 ↩38 ↩39 ↩40 ↩41 ↩42 ↩43 ↩44 ↩45 ↩46 ↩47 ↩48 ↩49 ↩50 ↩51 ↩52 ↩53 ↩54 ↩55 ↩56 ↩57 ↩58 ↩59 ↩60 ↩61 ↩62 ↩63 ↩64 ↩65 ↩66 ↩67 ↩68 ↩69 ↩70 ↩71 ↩72 ↩73 ↩74 ↩75 ↩76 ↩77 ↩78 ↩79 ↩80 ↩81 ↩82 ↩83 ↩84 ↩85 ↩86 ↩87 ↩88 ↩89 ↩90 ↩91 ↩92 ↩93 ↩94 ↩95 ↩96 ↩97 ↩98 ↩99 ↩100 ↩101 ↩102 ↩103 ↩104 ↩105 ↩106 ↩107 ↩108 ↩109 ↩110 ↩111 ↩112 ↩113 ↩114 ↩115 ↩116 ↩117 ↩118 ↩119 ↩120 ↩121 ↩122 ↩123 ↩124 ↩125 ↩126 ↩127 ↩128 ↩129 ↩130 ↩131 ↩132 ↩133 ↩134 ↩135 ↩136 ↩137 ↩138 ↩139 ↩140 ↩141 ↩142 ↩143 ↩144 ↩145 ↩146 ↩147 ↩148 ↩149 ↩150 ↩151 ↩152 ↩153 ↩154 ↩155 ↩156 ↩157 ↩158 ↩159 ↩160 ↩161 ↩162 ↩163 ↩164 ↩165 ↩166 ↩167 ↩168 ↩169 ↩170 ↩171 ↩172 ↩173 ↩174 ↩175 ↩176 ↩177 ↩178 ↩179 ↩180 ↩181 ↩182 ↩183 ↩184 ↩185 ↩186 ↩187 ↩188 ↩189 ↩190 ↩191 ↩192 ↩193 ↩194 ↩195 ↩196 ↩197 ↩198 ↩199 ↩200 ↩201 ↩202 ↩203 ↩204 ↩205 ↩206 ↩207 ↩208 ↩209 ↩210 ↩211 ↩212 ↩213 ↩214 ↩215 ↩216 ↩217 ↩218 ↩219 ↩220 ↩221 ↩222 ↩223 ↩224 ↩225 ↩226 ↩227 ↩228 ↩229 ↩230 ↩231 ↩232 ↩233 ↩234 ↩235 ↩236 ↩237 ↩238 ↩239 ↩240 ↩241 ↩242 ↩243 ↩244 ↩245 ↩246 ↩247 ↩248 ↩249 ↩250 ↩251 ↩252 ↩253 ↩254 ↩255 ↩256 ↩257 ↩258 ↩259 ↩260

Samsung Smart Monitor

  • Tested with M7
  • Supports keyboard and mouse devices.

Known issues

  • The monitor disconnects Bluetooth peripherals after power off.
    • The device cannot be turned on again with Bluetooth, only with the original Samsung remote.
    • Workaround: use infrared power commands (Samsung, Generic TV1).

Regular keycodes (Keyboard Keypad Page (0x07))

Key nameUsage codeOKDescription
KEY_A4x
KEY_B5x
KEY_C6x
KEY_D7x
KEY_E8x
KEY_F9x
KEY_G10x
KEY_H11x
KEY_I12x
KEY_J13x
KEY_K14x
KEY_L15x
KEY_M16x
KEY_N17x
KEY_O18x
KEY_P19x
KEY_Q20x
KEY_R21x
KEY_S22x
KEY_T23x
KEY_U24x
KEY_V25x
KEY_W26x
KEY_X27x
KEY_Y28x
KEY_Z29x
KEY_130x
KEY_231x
KEY_332x
KEY_433x
KEY_534x
KEY_635x
KEY_736x
KEY_837x
KEY_938x
KEY_039x
KEY_RETURN40x
KEY_ESC41x
KEY_BACKSPACE42x
KEY_TAB43x
KEY_SPACE44x
KEY_MINUS45x
KEY_EQUAL46x
KEY_LEFT_BRACE47x
KEY_RIGHT_BRACE48x
KEY_BACKSLASH49x
KEY_HASH_TILDE50x
KEY_SEMICOLON51x
KEY_APOSTROPHE52x
KEY_GRAVE53x
KEY_COMMA54x
KEY_DOT55x
KEY_SLASH56x
KEY_CAPSLOCK57x
KEY_F158?
KEY_F259?
KEY_F360?
KEY_F461?
KEY_F562xHome
KEY_F663xInput source
KEY_F764?
KEY_F865xMute toggle
KEY_F966xVolume down
KEY_F1067xVolume up
KEY_F1168?
KEY_F1269?
KEY_SYSRQ70-
KEY_SCROLL_LOCK71-
KEY_PAUSE72xOk: Teleboy
KEY_INSERT73?
KEY_HOME74xWeb browser scroll to start
KEY_PAGE_UP75xWeb browser scrolling
KEY_DELETE76x
KEY_END77xWeb browser scroll to end
KEY_PAGE_DOWN78xWeb browser scrolling
KEY_RIGHT_ARROW79xMenu navigation
KEY_LEFT_ARROW80xMenu navigation
KEY_DOWN_ARROW81xMenu navigation
KEY_UP_ARROW82xMenu navigation
KEYPAD_NUMLOCK83-1
KEYPAD_SLASH84x
KEYPAD_ASTERISK85x
KEYPAD_MINUS86x
KEYPAD_PLUS87x
KEYPAD_ENTER88xNavigation select
KEYPAD_189-1
KEYPAD_290-1
KEYPAD_391-1
KEYPAD_492-1
KEYPAD_593-1
KEYPAD_694-1
KEYPAD_795-1
KEYPAD_896-1
KEYPAD_997-1
KEYPAD_098-1
KEYPAD_DOT99-1
KEY_102ND100x
KEY_APPLICATION101-
KEY_POWER102xPower toggle
KEYPAD_EQUAL103-1
KEY_F13104-
KEY_F14105-
KEY_F15106-
KEY_F16107-
KEY_F17108-
KEY_F18109-
KEY_F19110-
KEY_F20111-
KEY_F21112-
KEY_F22113-
KEY_F23114-
KEY_F24115-
KEY_EXECUTE116-
KEY_HELP117xe-Manual
KEY_MENU118xApp specific (Teleboy: program guide). System: 2
KEY_SELECT119?2
KEY_STOP120-
KEY_AGAIN121-
KEY_UNDO122-
KEY_CUT123-
KEY_COPY124xPicture mode
KEY_PASTE125xHDMI 1 input
KEY_FIND126-
KEY_MUTE127x
KEY_VOLUME_UP128x
KEY_VOLUME_DOWN129x
KEYPAD_COMMA133xAlso language specific: dot or comma
KEY_RO135?2
KEY_KATAKANA_HIRAGANA136-
KEY_YEN137?2
KEY_HENKAN138-
KEY_MUHENKAN139-
KEYPAD_JPCOMMA140?2
KEY_INTERNATIONAL7141-
KEY_INTERNATIONAL8142-
KEY_INTERNATIONAL9143-
KEY_HANGEUL144-
KEY_HANJA145-
KEY_KATAKANA146-
KEY_HIRAGANA147-
KEY_ZENKAKU_HANKAKU148xVoice guide: off
KEY_FURIGANA149-
KEY_LANG7150-
KEY_LANG8151-
KEY_LANG9152-
KEY_LEFT_CONTROL224-
KEY_LEFT_SHIFT225-
KEY_LEFT_ALT226-
KEY_LEFT_GUI227xSettings menu
KEY_RIGHT_CONTROL228-
KEY_RIGHT_SHIFT229-
KEY_RIGHT_ALT230-
KEY_RIGHT_GUI231-
KEY_MEDIA_PLAY_PAUSE232NOK: Spotify, Teleboy
KEY_MEDIA_STOP_CD233xOk: Spotify, Teleboy
KEY_MEDIA_PREVIOUS_SONG234NOK: Spotify
KEY_MEDIA_NEXT_SONG235NOK: Spotify
KEY_MEDIA_EJECT_CD236-
KEY_MEDIA_VOLUME_UP237xSame as KEY_VOLUME_UP
KEY_MEDIA_VOLUME_DOWN238xSame as KEY_VOLUME_DOWN
KEY_MEDIA_MUTE239xSame as KEY_MUTE
KEY_MEDIA_WWW240xWeb browser
KEY_MEDIA_BACK241x
KEY_MEDIA_FORWARD242?2 , NOK browser
KEY_MEDIA_STOP243-NOK: Spotify, Teleboy
KEY_MEDIA_FIND244-NOK browser
KEY_MEDIA_SCROLL_UP245-NOK system, browser
KEY_MEDIA_SCROLL_DOWN246-NOK system, browser
KEY_MEDIA_EDIT247-
KEY_MEDIA_SLEEP248xSleep timer popup
KEY_MEDIA_COFFEE249-
KEY_MEDIA_REFRESH250xBrowser: close tab
KEY_MEDIA_CALC251xNumber input popup (?)

Consumer codes (Consumer Page (0x0C))

key nameusage codeOKDescription
CONSUMER_INCREMENT_100x020-
CONSUMER_INCREMENT_1000x021-
CONSUMER_AM_PM0x022-
CONSUMER_POWER0x030xPower toggle, same as KEY_POWER
CONSUMER_RESET0x031-
CONSUMER_SLEEP0x032xSleep menu
CONSUMER_SLEEP_AFTER0x033-
CONSUMER_SLEEP_MODE0x034xSleep menu
CONSUMER_ILLUMINATION0x035-
CONSUMER_FUNCTION_BUTTONS0x036-
CONSUMER_MENU0x040x
CONSUMER_MENU_PICK0x041-
CONSUMER_MENU_UP0x042xSame as arrow navigation key
CONSUMER_MENU_DOWN0x043xSame as arrow navigation key
CONSUMER_MENU_LEFT0x044xSame as arrow navigation key
CONSUMER_MENU_RIGHT0x045xSame as arrow navigation key
CONSUMER_MENU_ESCAPE0x046x
CONSUMER_MENU_VALUE_INCREASE0x047-
CONSUMER_MENU_VALUE_DECREASE0x048-
CONSUMER_DATA_ON_SCREEN0x060-
CONSUMER_CLOSED_CAPTION0x061-
CONSUMER_CLOSED_CAPTION_SELECT0x062-
CONSUMER_VCR_TV0x063-
CONSUMER_BROADCAST_MODE0x064-
CONSUMER_SNAPSHOT0x065-
CONSUMER_STILL0x066-
CONSUMER_PICTURE_IN_PICTURE_TOGGLE0x067-
CONSUMER_PICTURE_IN_PICTURE_SWAP0x068-
CONSUMER_RED_MENU_BUTTON0x069xTeleboy: select audio track
CONSUMER_GREEN_MENU_BUTTON0x06A?
CONSUMER_BLUE_MENU_BUTTON0x06B?
CONSUMER_YELLOW_MENU_BUTTON0x06C?
CONSUMER_ASPECT0x06DxDisplay port (only works from HDMI input)
CONSUMER_MODE_SELECT_3D0x06ExWorkspace
CONSUMER_DISPLAY_BRIGHTNESS_INCREMENT0x06Fx
CONSUMER_DISPLAY_BRIGHTNESS_DECREMENT0x070x
CONSUMER_DISPLAY_BRIGHTNESS0x071-
CONSUMER_DISPLAY_BACKLIGHT_TOGGLE0x072?3
CONSUMER_DISPLAY_SET_BRIGHTNESS_TO_MINIMUM0x073?3
CONSUMER_DISPLAY_SET_BRIGHTNESS_TO_MAXIMUM0x074?2
CONSUMER_DISPLAY_SET_AUTO_BRIGHTNESS0x075-
CONSUMER_CAMERA_ACCESS_ENABLED0x076-
CONSUMER_CAMERA_ACCESS_DISABLED0x077-
CONSUMER_CAMERA_ACCESS_TOGGLE0x078-
CONSUMER_KEYBOARD_BRIGHTNESS_INCREMENT0x079-
CONSUMER_KEYBOARD_BRIGHTNESS_DECREMENT0x07A-
CONSUMER_KEYBOARD_BACKLIGHT_SET_LEVEL0x07B-
CONSUMER_KEYBOARD_BACKLIGHT_OOC0x07C-
CONSUMER_KEYBOARD_BACKLIGHT_SET_MINIMUM0x07D-
CONSUMER_KEYBOARD_BACKLIGHT_SET_MAXIMUM0x07E-
CONSUMER_KEYBOARD_BACKLIGHT_AUTO0x07F-
CONSUMER_SELECTION0x080-
CONSUMER_ASSIGN_SELECTION0x081-
CONSUMER_MODE_STEP0x082-
CONSUMER_RECALL_LAST0x083-
CONSUMER_ENTER_CHANNEL0x084-
CONSUMER_ORDER_MOVIE0x085-
CONSUMER_CHANNEL0x086-
CONSUMER_MEDIA_SELECTION0x087-
CONSUMER_MEDIA_SELECT_COMPUTER0x088-
CONSUMER_MEDIA_SELECT_TV0x089-
CONSUMER_MEDIA_SELECT_WWW0x08Axweb browser, same as KEY_MEDIA_WWW.
CONSUMER_MEDIA_SELECT_DVD0x08B-
CONSUMER_MEDIA_SELECT_TELEPHONE0x08C-
CONSUMER_MEDIA_SELECT_PROGRAM_GUIDE0x08D-
CONSUMER_MEDIA_SELECT_VIDEO_PHONE0x08E-
CONSUMER_MEDIA_SELECT_GAMES0x08F-
CONSUMER_MEDIA_SELECT_MESSAGES0x090-
CONSUMER_MEDIA_SELECT_CD0x091-
CONSUMER_MEDIA_SELECT_VCR0x092-
CONSUMER_MEDIA_SELECT_TUNER0x093-
CONSUMER_QUIT0x094xquit app, similar but not the same as KEY_ESC
CONSUMER_HELP0x095xe-Manual, same as KEY_HELP
CONSUMER_MEDIA_SELECT_TAPE0x096-
CONSUMER_MEDIA_SELECT_CABLE0x097-
CONSUMER_MEDIA_SELECT_SATELLITE0x098-
CONSUMER_MEDIA_SELECT_SECURITY0x099-
CONSUMER_MEDIA_SELECT_HOME0x09A-
CONSUMER_MEDIA_SELECT_CALL0x09B-
CONSUMER_CHANNEL_INCREMENT0x09CxOk: Teleboy
CONSUMER_CHANNEL_DECREMENT0x09DxOk: Teleboy
CONSUMER_MEDIA_SELECT_SAP0x09E-
CONSUMER_VCR_PLUS0x0A0xHDMI input
CONSUMER_ONCE0x0A1-
CONSUMER_DAILY0x0A2-
CONSUMER_WEEKLY0x0A3-
CONSUMER_MONTHLY0x0A4-
CONSUMER_PLAY0x0B0xOk: Spotify (play/pause), Teleboy
CONSUMER_PAUSE0x0B1xOk: Spotify, Teleboy
CONSUMER_RECORD0x0B2NOK: Teleboy
CONSUMER_FAST_FORWARD0x0B3?NOK: Spotify, Teleboy
CONSUMER_REWIND0x0B4xOk: Spotify, Teleboy
CONSUMER_SCAN_NEXT_TRACK0x0B5NOK: Spotify, Teleboy
CONSUMER_SCAN_PREVIOUS_TRACK0x0B6NOK: Spotify, Teleboy
CONSUMER_STOP0x0B7xOk: Spotify, Teleboy
CONSUMER_EJECT0x0B8-
CONSUMER_RANDOM_PLAY0x0B9-NOK: Spotify
CONSUMER_SELECT_DISC0x0BA-
CONSUMER_ENTER_DISC0x0BB-
CONSUMER_REPEAT0x0BC-NOK: Spotify
CONSUMER_TRACKING0x0BD
CONSUMER_TRACK_NORMAL0x0BE
CONSUMER_SLOW_TRACKING0x0BF
CONSUMER_FRAME_FORWARD0x0C0
CONSUMER_FRAME_BACK0x0C1
CONSUMER_MARK0x0C2
CONSUMER_CLEAR_MARK0x0C3
CONSUMER_REPEAT_FROM_MARK0x0C4
CONSUMER_RETURN_TO_MARK0x0C5
CONSUMER_SEARCH_MARK_FORWARD0x0C6
CONSUMER_SEARCH_MARK_BACKWARDS0x0C7
CONSUMER_COUNTER_RESET0x0C8
CONSUMER_SHOW_COUNTER0x0C9
CONSUMER_TRACKING_INCREMENT0x0CA
CONSUMER_TRACKING_DECREMENT0x0CB
CONSUMER_STOP_EJECT0x0CC-
CONSUMER_PLAY_PAUSE0x0CD-NOK: Spotify, Teleboy
CONSUMER_PLAY_SKIP0x0CE-NOK: Spotify
CONSUMER_VOICE_COMMAND0x0CF
CONSUMER_INVOKE_CAPTURE_INTERFACE0x0D0-
CONSUMER_START_OR_STOP_GAME_RECORDING0x0D1-
CONSUMER_HISTORICAL_GAME_CAPTURE0x0D2-
CONSUMER_CAPTURE_GAME_SCREENSHOT0x0D3-
CONSUMER_SHOW_OR_HIDE_RECORDING_INDICATOR0x0D4-
CONSUMER_START_OR_STOP_MICROPHONE_CAPTURE0x0D5-
CONSUMER_START_OR_STOP_CAMERA_CAPTURE0x0D6-
CONSUMER_START_OR_STOP_GAME_BROADCAST0x0D7-
CONSUMER_VOLUME0x0E0-
CONSUMER_BALANCE0x0E1-
CONSUMER_MUTE0x0E2x
CONSUMER_BASS0x0E3-
CONSUMER_TREBLE0x0E4-
CONSUMER_BASS_BOOST0x0E5-
CONSUMER_SURROUND_MODE0x0E6-
CONSUMER_LOUDNESS0x0E7-
CONSUMER_MPX0x0E8-
CONSUMER_VOLUME_INCREMENT0x0E9xSame as KEY_VOLUME_UP
CONSUMER_VOLUME_DECREMENT0x0EAxSame as KEY_VOLUME_DOWN
CONSUMER_SPEED_SELECT0x0F0
CONSUMER_PLAYBACK_SPEED0x0F1
CONSUMER_STANDARD_PLAY0x0F2
CONSUMER_LONG_PLAY0x0F3
CONSUMER_EXTENDED_PLAY0x0F4
CONSUMER_SLOW0x0F5
CONSUMER_FAN_ENABLE0x100
CONSUMER_FAN_SPEED0x101
CONSUMER_LIGHT_ENABLE0x102
CONSUMER_LIGHT_ILLUMINATION_LEVEL0x103
CONSUMER_CLIMATE_CONTROL_ENABLE0x104
CONSUMER_ROOM_TEMPERATURE0x105
CONSUMER_SECURITY_ENABLE0x106
CONSUMER_FIRE_ALARM0x107
CONSUMER_POLICE_ALARM0x108
CONSUMER_PROXIMITY0x109
CONSUMER_MOTION0x10A
CONSUMER_DURESS_ALARM0x10B
CONSUMER_HOLDUP_ALARM0x10C
CONSUMER_MEDICAL_ALARM0x10D
CONSUMER_BALANCE_RIGHT0x150
CONSUMER_BALANCE_LEFT0x151
CONSUMER_BASS_INCREMENT0x152
CONSUMER_BASS_DECREMENT0x153
CONSUMER_TREBLE_INCREMENT0x154
CONSUMER_TREBLE_DECREMENT0x155
CONSUMER_SPEAKER_SYSTEM0x160
CONSUMER_CHANNEL_LEFT0x161
CONSUMER_CHANNEL_RIGHT0x162
CONSUMER_CHANNEL_CENTER0x163
CONSUMER_CHANNEL_FRONT0x164
CONSUMER_CHANNEL_CENTER_FRONT0x165
CONSUMER_CHANNEL_SIDE0x166
CONSUMER_CHANNEL_SURROUND0x167
CONSUMER_CHANNEL_LOW_FREQUENCY_ENHANCEMENT0x168
CONSUMER_CHANNEL_TOP0x169
CONSUMER_CHANNEL_UNKNOWN0x16A
CONSUMER_SUB_CHANNEL0x170
CONSUMER_SUB_CHANNEL_INCREMENT0x171
CONSUMER_SUB_CHANNEL_DECREMENT0x172
CONSUMER_ALTERNATE_AUDIO_INCREMENT0x173
CONSUMER_ALTERNATE_AUDIO_DECREMENT0x174
CONSUMER_APPLICATION_LAUNCH_BUTTONS0x180
CONSUMER_AL_LAUNCH_BUTTON_CONFIGURATION_TOOL0x181
CONSUMER_AL_PROGRAMMABLE_BUTTON_CONFIGURATION0x182
CONSUMER_AL_CONSUMER_CONTROL_CONFIGURATION0x183
CONSUMER_AL_WORD_PROCESSOR0x184
CONSUMER_AL_TEXT_EDITOR0x185
CONSUMER_AL_SPREADSHEET0x186
CONSUMER_AL_GRAPHICS_EDITOR0x187
CONSUMER_AL_PRESENTATION_APP0x188
CONSUMER_AL_DATABASE_APP0x189
CONSUMER_AL_EMAIL_READER0x18A
CONSUMER_AL_NEWSREADER0x18B
CONSUMER_AL_VOICEMAIL0x18C
CONSUMER_AL_CONTACTS_ADDRESS_BOOK0x18D
CONSUMER_AL_CALENDAR_SCHEDULE0x18E
CONSUMER_AL_TASK_PROJECT_MANAGER0x18F
CONSUMER_AL_LOG_JOURNAL_TIMECARD0x190
CONSUMER_AL_CHECKBOOK_FINANCE0x191
CONSUMER_AL_CALCULATOR0x192
CONSUMER_AL_A_V_CAPTURE_PLAYBACK0x193
CONSUMER_AL_LOCAL_MACHINE_BROWSER0x194
CONSUMER_AL_LAN_WAN_BROWSER0x195
CONSUMER_AL_INTERNET_BROWSER0x196xweb browser, same as KEY_MEDIA_WWW
CONSUMER_AL_REMOTE_NETWORKING_ISP_CONNECT0x197
CONSUMER_AL_NETWORK_CONFERENCE0x198
CONSUMER_AL_NETWORK_CHAT0x199
CONSUMER_AL_TELEPHONY_DIALER0x19A
CONSUMER_AL_LOGON0x19B
CONSUMER_AL_LOGOFF0x19C
CONSUMER_AL_LOGON_LOGOFF0x19D
CONSUMER_AL_TERMINAL_LOCK_SCREENSAVER0x19E
CONSUMER_AL_CONTROL_PANEL0x19F
CONSUMER_AL_COMMAND_LINE_PROCESSOR_RUN0x1A0
CONSUMER_AL_PROCESS_TASK_MANAGER0x1A1
CONSUMER_AL_SELECT_TASK_APPLICATION0x1A2
CONSUMER_AL_NEXT_TASK_APPLICATION0x1A3
CONSUMER_AL_PREVIOUS_TASK_APPLICATION0x1A4
CONSUMER_AL_PREEMPTIVE_HALT_TASK_APPLICATION0x1A5
CONSUMER_AL_INTEGRATED_HELP_CENTER0x1A6
CONSUMER_AL_DOCUMENTS0x1A7
CONSUMER_AL_THESAURUS0x1A8
CONSUMER_AL_DICTIONARY0x1A9
CONSUMER_AL_DESKTOP0x1AA
CONSUMER_AL_SPELL_CHECK0x1AB
CONSUMER_AL_GRAMMAR_CHECK0x1AC
CONSUMER_AL_WIRELESS_STATUS0x1AD-
CONSUMER_AL_KEYBOARD_LAYOUT0x1AE-
CONSUMER_AL_VIRUS_PROTECTION0x1AF-
CONSUMER_AL_ENCRYPTION0x1B0-
CONSUMER_AL_SCREEN_SAVER0x1B1-
CONSUMER_AL_ALARMS0x1B2-
CONSUMER_AL_CLOCK0x1B3-
CONSUMER_AL_FILE_BROWSER0x1B4-
CONSUMER_AL_POWER_STATUS0x1B5-
CONSUMER_AL_IMAGE_BROWSER0x1B6-
CONSUMER_AL_AUDIO_BROWSER0x1B7-
CONSUMER_AL_MOVIE_BROWSER0x1B8-
CONSUMER_AL_DIGITAL_RIGHTS_MANAGER0x1B9
CONSUMER_AL_DIGITAL_WALLET0x1BA
CONSUMER_AL_INSTANT_MESSAGING0x1BC
CONSUMER_AL_OEM_FEATURES_TIPS_TUTORIAL_BROWSER0x1BD
CONSUMER_AL_OEM_HELP0x1BE
CONSUMER_AL_ONLINE_COMMUNITY0x1BF
CONSUMER_AL_ENTERTAINMENT_CONTENT_BROWSER0x1C0
CONSUMER_AL_ONLINE_SHOPPING_BROWSER0x1C1
CONSUMER_AL_SMARTCARD_INFORMATION_HELP0x1C2
CONSUMER_AL_MARKET_MONITOR_FINANCE_BROWSER0x1C3
CONSUMER_AL_CUSTOMIZED_CORPORATE_NEWS_BROWSER0x1C4
CONSUMER_AL_ONLINE_ACTIVITY_BROWSER0x1C5
CONSUMER_AL_RESEARCH_SEARCH_BROWSER0x1C6
CONSUMER_AL_AUDIO_PLAYER0x1C7
CONSUMER_AL_MESSAGE_STATUS0x1C8
CONSUMER_AL_CONTACT_SYNC0x1C9
CONSUMER_AL_NAVIGATION0x1CA
CONSUMER_AL_CONTEXT_AWARE_DESKTOP_ASSISTANT0x1CB
CONSUMER_GENERIC_GUI_APPLICATION_CONTROLS0x200
CONSUMER_AC_NEW0x201
CONSUMER_AC_OPEN0x202
CONSUMER_AC_CLOSE0x203
CONSUMER_AC_EXIT0x204
CONSUMER_AC_MAXIMIZE0x205
CONSUMER_AC_MINIMIZE0x206
CONSUMER_AC_SAVE0x207
CONSUMER_AC_PRINT0x208
CONSUMER_AC_PROPERTIES0x209
CONSUMER_AC_UNDO0x21A
CONSUMER_AC_COPY0x21B
CONSUMER_AC_CUT0x21C
CONSUMER_AC_PASTE0x21D
CONSUMER_AC_SELECT_ALL0x21E
CONSUMER_AC_FIND0x21F
CONSUMER_AC_FIND_AND_REPLACE0x220
CONSUMER_AC_SEARCH0x221
CONSUMER_AC_GO_TO0x222
CONSUMER_AC_HOME0x223x
CONSUMER_AC_BACK0x224x
CONSUMER_AC_FORWARD0x225
CONSUMER_AC_STOP0x226
CONSUMER_AC_REFRESH0x227
CONSUMER_AC_PREVIOUS_LINK0x228
CONSUMER_AC_NEXT_LINK0x229
CONSUMER_AC_BOOKMARKS0x22A
CONSUMER_AC_HISTORY0x22B
CONSUMER_AC_SUBSCRIPTIONS0x22C
CONSUMER_AC_ZOOM_IN0x22D
CONSUMER_AC_ZOOM_OUT0x22E
CONSUMER_AC_ZOOM0x22F
CONSUMER_AC_FULL_SCREEN_VIEW0x230
CONSUMER_AC_NORMAL_VIEW0x231
CONSUMER_AC_VIEW_TOGGLE0x232
CONSUMER_AC_SCROLL_UP0x233
CONSUMER_AC_SCROLL_DOWN0x234
CONSUMER_AC_SCROLL0x235
CONSUMER_AC_PAN_LEFT0x236
CONSUMER_AC_PAN_RIGHT0x237
CONSUMER_AC_PAN0x238
CONSUMER_AC_NEW_WINDOW0x239
CONSUMER_AC_TILE_HORIZONTALLY0x23A
CONSUMER_AC_TILE_VERTICALLY0x23B
CONSUMER_AC_FORMAT0x23C
CONSUMER_AC_EDIT0x23D
CONSUMER_AC_BOLD0x23E
CONSUMER_AC_ITALICS0x23F
CONSUMER_AC_UNDERLINE0x240
CONSUMER_AC_STRIKETHROUGH0x241
CONSUMER_AC_SUBSCRIPT0x242
CONSUMER_AC_SUPERSCRIPT0x243
CONSUMER_AC_ALL_CAPS0x244
CONSUMER_AC_ROTATE0x245
CONSUMER_AC_RESIZE0x246
CONSUMER_AC_FLIP_HORIZONTAL0x247
CONSUMER_AC_FLIP_VERTICAL0x248
CONSUMER_AC_MIRROR_HORIZONTAL0x249
CONSUMER_AC_MIRROR_VERTICAL0x24A
CONSUMER_AC_FONT_SELECT0x24B
CONSUMER_AC_FONT_COLOR0x24C
CONSUMER_AC_FONT_SIZE0x24D
CONSUMER_AC_JUSTIFY_LEFT0x24E
CONSUMER_AC_JUSTIFY_CENTER_H0x24F
CONSUMER_AC_JUSTIFY_RIGHT0x250
CONSUMER_AC_JUSTIFY_BLOCK_H0x251
CONSUMER_AC_JUSTIFY_TOP0x252
CONSUMER_AC_JUSTIFY_CENTER_V0x253
CONSUMER_AC_JUSTIFY_BOTTOM0x254
CONSUMER_AC_JUSTIFY_BLOCK_V0x255
CONSUMER_AC_INDENT_DECREASE0x256
CONSUMER_AC_INDENT_INCREASE0x257
CONSUMER_AC_NUMBERED_LIST0x258
CONSUMER_AC_RESTART_NUMBERING0x259
CONSUMER_AC_BULLETED_LIST0x25A
CONSUMER_AC_PROMOTE0x25B
CONSUMER_AC_DEMOTE0x25C
CONSUMER_AC_YES0x25D
CONSUMER_AC_NO0x25E
CONSUMER_AC_CANCEL0x25F
CONSUMER_AC_CATALOG0x260
CONSUMER_AC_BUY_CHECKOUT0x261
CONSUMER_AC_ADD_TO_CART0x262
CONSUMER_AC_EXPAND0x263
CONSUMER_AC_EXPAND_ALL0x264
CONSUMER_AC_COLLAPSE0x265
CONSUMER_AC_COLLAPSE_ALL0x266
CONSUMER_AC_PRINT_PREVIEW0x267
CONSUMER_AC_PASTE_SPECIAL0x268
CONSUMER_AC_INSERT_MODE0x269
CONSUMER_AC_DELETE0x26A
CONSUMER_AC_LOCK0x26B
CONSUMER_AC_UNLOCK0x26C
CONSUMER_AC_PROTECT0x26D
CONSUMER_AC_UNPROTECT0x26E
CONSUMER_AC_ATTACH_COMMENT0x26F
CONSUMER_AC_DELETE_COMMENT0x270
CONSUMER_AC_VIEW_COMMENT0x271
CONSUMER_AC_SELECT_WORD0x272
CONSUMER_AC_SELECT_SENTENCE0x273
CONSUMER_AC_SELECT_PARAGRAPH0x274
CONSUMER_AC_SELECT_COLUMN0x275
CONSUMER_AC_SELECT_ROW0x276
CONSUMER_AC_SELECT_TABLE0x277
CONSUMER_AC_SELECT_OBJECT0x278
CONSUMER_AC_REDO_REPEAT0x279
CONSUMER_AC_SORT0x27A
CONSUMER_AC_SORT_ASCENDING0x27B
CONSUMER_AC_SORT_DESCENDING0x27C
CONSUMER_AC_FILTER0x27D
CONSUMER_AC_SET_CLOCK0x27E
CONSUMER_AC_VIEW_CLOCK0x27F
CONSUMER_AC_SELECT_TIME_ZONE0x280
CONSUMER_AC_EDIT_TIME_ZONES0x281
CONSUMER_AC_SET_ALARM0x282
CONSUMER_AC_CLEAR_ALARM0x283
CONSUMER_AC_SNOOZE_ALARM0x284
CONSUMER_AC_RESET_ALARM0x285
CONSUMER_AC_SYNCHRONIZE0x286
CONSUMER_AC_SEND_RECEIVE0x287
CONSUMER_AC_SEND_TO0x288
CONSUMER_AC_REPLY0x289
CONSUMER_AC_REPLY_ALL0x28A
CONSUMER_AC_FORWARD_MSG0x28B
CONSUMER_AC_SEND0x28C
CONSUMER_AC_ATTACH_FILE0x28D
CONSUMER_AC_UPLOAD0x28E
CONSUMER_AC_DOWNLOAD_SAVE_TARGET_AS0x28F
CONSUMER_AC_SET_BORDERS0x290
CONSUMER_AC_INSERT_ROW0x291
CONSUMER_AC_INSERT_COLUMN0x292
CONSUMER_AC_INSERT_FILE0x293
CONSUMER_AC_INSERT_PICTURE0x294
CONSUMER_AC_INSERT_OBJECT0x295
CONSUMER_AC_INSERT_SYMBOL0x296
CONSUMER_AC_SAVE_AND_CLOSE0x297
CONSUMER_AC_RENAME0x298
CONSUMER_AC_MERGE0x299
CONSUMER_AC_SPLIT0x29A
CONSUMER_AC_DISRIBUTE_HORIZONTALLY0x29B
CONSUMER_AC_DISTRIBUTE_VERTICALLY0x29C
CONSUMER_AC_NEXT_KEYBOARD_LAYOUT_SELECT0x29D
CONSUMER_AC_NAVIGATION_GUIDANCE0x29E
CONSUMER_AC_DESKTOP_SHOW_ALL_WINDOWS0x29F
CONSUMER_AC_SOFT_KEY_LEFT0x2A0
CONSUMER_AC_SOFT_KEY_RIGHT0x2A1
CONSUMER_AC_DESKTOP_SHOW_ALL_APPLICATIONS0x2A2
CONSUMER_AC_IDLE_KEEP_ALIVE0x2B0
CONSUMER_EXTENDED_KEYBOARD_ATTRIBUTES_COLLECTION0x2C0
CONSUMER_KEYBOARD_FORM_FACTOR0x2C1
CONSUMER_KEYBOARD_KEY_TYPE0x2C2
CONSUMER_KEYBOARD_PHYSICAL_LAYOUT0x2C3
CONSUMER_VENDOR_SPECIFIC_KEYBOARD_PHYSICAL_LAYOUT0x2C4
CONSUMER_KEYBOARD_IETF_LANGUAGE_TAG_INDEX0x2C5
CONSUMER_IMPLEMENTED_KEYBOARD_INPUT_ASSIST_CONTROLS0x2C6
CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS0x2C7
CONSUMER_KEYBOARD_INPUT_ASSIST_NEXT0x2C8
CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS_GROUP0x2C9
CONSUMER_KEYBOARD_INPUT_ASSIST_NEXT_GROUP0x2CA
CONSUMER_KEYBOARD_INPUT_ASSIST_ACCEPT0x2CB
CONSUMER_KEYBOARD_INPUT_ASSIST_CANCEL0x2CC

System Controls (Generic Desktop Page (0x01))

Key nameUsage codeOkComment
SYSTEM_POWER_DOWN0x81xPower toggle, same as KEY_POWER
SYSTEM_SLEEP0x82xSleep timer menu
SYSTEM_WAKE_UP0x83-
SYSTEM_CONTEXT_MENU0x84-
SYSTEM_MAIN_MENU0x85xSystem: settings menu, Teleboy: app menu
SYSTEM_APP_MENU0x86-
SYSTEM_MENU_HELP0x87xe-Manual, same as KEY_HELP
SYSTEM_MENU_EXIT0x88xExit app, same as CONSUMER_QUIT
SYSTEM_MENU_SELECT0x89-
SYSTEM_MENU_RIGHT0x8AxNavigation, same as KEY_*_ARROW keys
SYSTEM_MENU_LEFT0x8Bx"
SYSTEM_MENU_UP0x8Cx"
SYSTEM_MENU_DOWN0x8Dx"
SYSTEM_COLD_RESTART0x8ExAccessibility shortcuts
SYSTEM_WARM_RESTART0x8F-
SYSTEM_DPAD_UP0x90-
SYSTEM_DPAD_DOWN0x91-
SYSTEM_DPAD_RIGHT0x92-
SYSTEM_DPAD_LEFT0x93-

  1. not exposed to reduce number of commands. Not aware of any apps which would require this. KEYPAD_* keys are only usable with KEYPAD_NUMLOCK active. ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13

  2. popup: not available ↩2 ↩3 ↩4 ↩5 ↩6 ↩7

  3. popup: no app assigned to key ↩2