{
  "$schema": "https://o2csi.github.io/candeo/device-definition.schema.json",
  "name": "HyperX Alloy Elite 2",
  "notes": [
    "Unverified, protocol included: never tried on a HyperX keyboard. Written on 2026-09-27 by hyperx.mjs from OpenRGB, https://gitlab.com/CalcProgrammer1/OpenRGB, commit 0f8f2dcc (2026-09-25): Controllers/HyperXKeyboardController — HyperXAlloyOriginsController and HyperXAlloyElite2Controller: the product ids and interfaces in their Detect files, the reports and the positions left dark in their controllers, the order of the lights in their RGBController files.",
    "Feature reports: 04 f2, then nine of sixteen lights, 81 and the colour, in the keyboard's order of its lights. The grid is that order, nine rows of sixteen; the drawing is the board's.",
    "OpenRGB opens interface 0 outside Windows: this file names interface 3, as it does on Windows.",
    "The firmware takes its own lighting back when images stop coming: an effect keeps it, a still image may not.",
    "Left out, having no place on the board drawn: RGB Strip 1 to 18, the light bar.",
    "Drawn as an ISO board: on an ANSI one, the key left of Z is absent and the backslash lights above Enter.",
    "Does it light? Say so: https://github.com/o2csi/candeo/issues/new?template=device-report.yml"
  ],
  "match": { "vid": "0951", "pid": "1711", "interface": 3, "usagePage": "ff90" },
  "report": { "wire": "feature", "length": 64, "prefix": "00" },
  "frame": { "open": ["04 f2"], "each": { "by": "row", "send": ["{lights}"], "light": "81 {r} {g} {b}" } },
  "lights": {
    "kind": "keys",
    "rows": 9,
    "cols": 16,
    "items": [
      { "row": 0, "col": 0, "address": 0, "scancode": "01", "rect": [0, 0, 1, 1] },
      { "row": 0, "col": 1, "address": 1, "scancode": "29", "rect": [0, 1.5, 1, 1] },
      { "row": 0, "col": 2, "address": 2, "scancode": "0f", "rect": [0, 2.5, 1.5, 1] },
      { "row": 0, "col": 3, "address": 3, "scancode": "3a", "rect": [0, 3.5, 1.75, 1] },
      { "row": 0, "col": 4, "address": 4, "scancode": "2a", "rect": [0, 4.5, 1.25, 1] },
      { "row": 0, "col": 5, "address": 5, "scancode": "1d", "rect": [0, 5.5, 1.25, 1] },
      { "row": 0, "col": 6, "address": 6, "scancode": "56", "rect": [1.25, 4.5, 1, 1] },
      { "row": 0, "col": 7, "address": 7, "scancode": "02", "rect": [1, 1.5, 1, 1] },
      { "row": 0, "col": 8, "address": 8, "scancode": "10", "rect": [1.5, 2.5, 1, 1] },
      { "row": 0, "col": 9, "address": 9, "scancode": "1e", "rect": [1.75, 3.5, 1, 1] },
      { "row": 0, "col": 10, "address": 10, "scancode": "2c", "rect": [2.25, 4.5, 1, 1] },
      { "row": 0, "col": 11, "address": 11, "scancode": "e05b", "rect": [1.25, 5.5, 1.25, 1] },
      { "row": 0, "col": 12, "address": 12, "scancode": "3b", "rect": [2, 0, 1, 1] },
      { "row": 0, "col": 13, "address": 13, "scancode": "03", "rect": [2, 1.5, 1, 1] },
      { "row": 0, "col": 14, "address": 14, "scancode": "11", "rect": [2.5, 2.5, 1, 1] },
      { "row": 0, "col": 15, "address": 15, "scancode": "1f", "rect": [2.75, 3.5, 1, 1] },
      { "row": 1, "col": 0, "address": 16, "scancode": "2d", "rect": [3.25, 4.5, 1, 1] },
      { "row": 1, "col": 1, "address": 17, "scancode": "38", "rect": [2.5, 5.5, 1.25, 1] },
      { "row": 1, "col": 2, "address": 18, "scancode": "3c", "rect": [3, 0, 1, 1] },
      { "row": 1, "col": 3, "address": 19, "scancode": "04", "rect": [3, 1.5, 1, 1] },
      { "row": 1, "col": 4, "address": 20, "scancode": "12", "rect": [3.5, 2.5, 1, 1] },
      { "row": 1, "col": 5, "address": 21, "scancode": "20", "rect": [3.75, 3.5, 1, 1] },
      { "row": 1, "col": 6, "address": 22, "scancode": "2e", "rect": [4.25, 4.5, 1, 1] },
      { "row": 1, "col": 8, "address": 24, "scancode": "3d", "rect": [4, 0, 1, 1] },
      { "row": 1, "col": 9, "address": 25, "scancode": "05", "rect": [4, 1.5, 1, 1] },
      { "row": 1, "col": 10, "address": 26, "scancode": "13", "rect": [4.5, 2.5, 1, 1] },
      { "row": 1, "col": 11, "address": 27, "scancode": "21", "rect": [4.75, 3.5, 1, 1] },
      { "row": 1, "col": 12, "address": 28, "scancode": "2f", "rect": [5.25, 4.5, 1, 1] },
      { "row": 1, "col": 14, "address": 30, "scancode": "3e", "rect": [5, 0, 1, 1] },
      { "row": 1, "col": 15, "address": 31, "scancode": "06", "rect": [5, 1.5, 1, 1] },
      { "row": 2, "col": 0, "address": 32, "scancode": "14", "rect": [5.5, 2.5, 1, 1] },
      { "row": 2, "col": 1, "address": 33, "scancode": "22", "rect": [5.75, 3.5, 1, 1] },
      { "row": 2, "col": 2, "address": 34, "scancode": "30", "rect": [6.25, 4.5, 1, 1] },
      { "row": 2, "col": 3, "address": 35, "scancode": "39", "rect": [3.75, 5.5, 6.25, 1] },
      { "row": 2, "col": 4, "address": 36, "scancode": "3f", "rect": [6.5, 0, 1, 1] },
      { "row": 2, "col": 5, "address": 37, "scancode": "07", "rect": [6, 1.5, 1, 1] },
      { "row": 2, "col": 6, "address": 38, "scancode": "15", "rect": [6.5, 2.5, 1, 1] },
      { "row": 2, "col": 7, "address": 39, "scancode": "23", "rect": [6.75, 3.5, 1, 1] },
      { "row": 2, "col": 8, "address": 40, "scancode": "31", "rect": [7.25, 4.5, 1, 1] },
      { "row": 2, "col": 10, "address": 42, "scancode": "40", "rect": [7.5, 0, 1, 1] },
      { "row": 2, "col": 11, "address": 43, "scancode": "08", "rect": [7, 1.5, 1, 1] },
      { "row": 2, "col": 12, "address": 44, "scancode": "16", "rect": [7.5, 2.5, 1, 1] },
      { "row": 2, "col": 13, "address": 45, "scancode": "24", "rect": [7.75, 3.5, 1, 1] },
      { "row": 2, "col": 14, "address": 46, "scancode": "32", "rect": [8.25, 4.5, 1, 1] },
      { "row": 3, "col": 0, "address": 48, "scancode": "41", "rect": [8.5, 0, 1, 1] },
      { "row": 3, "col": 1, "address": 49, "scancode": "09", "rect": [8, 1.5, 1, 1] },
      { "row": 3, "col": 2, "address": 50, "scancode": "17", "rect": [8.5, 2.5, 1, 1] },
      { "row": 3, "col": 3, "address": 51, "scancode": "25", "rect": [8.75, 3.5, 1, 1] },
      { "row": 3, "col": 4, "address": 52, "scancode": "33", "rect": [9.25, 4.5, 1, 1] },
      { "row": 3, "col": 5, "address": 53, "scancode": "e038", "rect": [10, 5.5, 1.25, 1] },
      { "row": 3, "col": 6, "address": 54, "scancode": "42", "rect": [9.5, 0, 1, 1] },
      { "row": 3, "col": 7, "address": 55, "scancode": "0a", "rect": [9, 1.5, 1, 1] },
      { "row": 3, "col": 8, "address": 56, "scancode": "18", "rect": [9.5, 2.5, 1, 1] },
      { "row": 3, "col": 9, "address": 57, "scancode": "26", "rect": [9.75, 3.5, 1, 1] },
      { "row": 3, "col": 10, "address": 58, "scancode": "34", "rect": [10.25, 4.5, 1, 1] },
      { "row": 3, "col": 11, "address": 59, "scancode": "e05d", "rect": [12.5, 5.5, 1.25, 1] },
      { "row": 3, "col": 12, "address": 60, "scancode": "43", "rect": [11, 0, 1, 1] },
      { "row": 3, "col": 13, "address": 61, "scancode": "0b", "rect": [10, 1.5, 1, 1] },
      { "row": 3, "col": 14, "address": 62, "scancode": "19", "rect": [10.5, 2.5, 1, 1] },
      { "row": 3, "col": 15, "address": 63, "scancode": "27", "rect": [10.75, 3.5, 1, 1] },
      { "row": 4, "col": 0, "address": 64, "scancode": "35", "rect": [11.25, 4.5, 1, 1] },
      { "row": 4, "col": 1, "address": 65, "scancode": "e05c", "rect": [11.25, 5.5, 1.25, 1] },
      { "row": 4, "col": 2, "address": 66, "scancode": "44", "rect": [12, 0, 1, 1] },
      { "row": 4, "col": 3, "address": 67, "scancode": "0c", "rect": [11, 1.5, 1, 1] },
      { "row": 4, "col": 4, "address": 68, "scancode": "1a", "rect": [11.5, 2.5, 1, 1] },
      { "row": 4, "col": 5, "address": 69, "scancode": "28", "rect": [11.75, 3.5, 1, 1] },
      { "row": 4, "col": 8, "address": 72, "scancode": "57", "rect": [13, 0, 1, 1] },
      { "row": 4, "col": 9, "address": 73, "scancode": "0d", "rect": [12, 1.5, 1, 1] },
      { "row": 4, "col": 10, "address": 74, "scancode": "1b", "rect": [12.5, 2.5, 1, 1] },
      { "row": 4, "col": 11, "address": 75, "scancode": "2b", "rect": [12.75, 3.5, 1, 1] },
      { "row": 4, "col": 14, "address": 78, "scancode": "58", "rect": [14, 0, 1, 1] },
      { "row": 4, "col": 15, "address": 79, "scancode": "0e", "rect": [13, 1.5, 2, 1] },
      { "row": 5, "col": 0, "address": 80, "scancode": "2b", "rect": [13.5, 2.5, 1.5, 1] },
      { "row": 5, "col": 1, "address": 81, "scancode": "1c", "rect": [13.75, 3.5, 1.25, 1] },
      { "row": 5, "col": 2, "address": 82, "scancode": "36", "rect": [12.25, 4.5, 2.75, 1] },
      { "row": 5, "col": 3, "address": 83, "scancode": "e01d", "rect": [13.75, 5.5, 1.25, 1] },
      { "row": 5, "col": 4, "address": 84, "scancode": "e037", "rect": [15.25, 0, 1, 1] },
      { "row": 5, "col": 5, "address": 85, "scancode": "e052", "rect": [15.25, 1.5, 1, 1] },
      { "row": 5, "col": 6, "address": 86, "scancode": "e053", "rect": [15.25, 2.5, 1, 1] },
      { "row": 5, "col": 9, "address": 89, "scancode": "e04b", "rect": [15.25, 5.5, 1, 1] },
      { "row": 5, "col": 10, "address": 90, "scancode": "46", "rect": [16.25, 0, 1, 1] },
      { "row": 5, "col": 11, "address": 91, "scancode": "e047", "rect": [16.25, 1.5, 1, 1] },
      { "row": 5, "col": 12, "address": 92, "scancode": "e04f", "rect": [16.25, 2.5, 1, 1] },
      { "row": 5, "col": 14, "address": 94, "scancode": "e048", "rect": [16.25, 4.5, 1, 1] },
      { "row": 5, "col": 15, "address": 95, "scancode": "e050", "rect": [16.25, 5.5, 1, 1] },
      { "row": 6, "col": 0, "address": 96, "scancode": "e11d", "rect": [17.25, 0, 1, 1] },
      { "row": 6, "col": 1, "address": 97, "scancode": "e049", "rect": [17.25, 1.5, 1, 1] },
      { "row": 6, "col": 2, "address": 98, "scancode": "e051", "rect": [17.25, 2.5, 1, 1] },
      { "row": 6, "col": 5, "address": 101, "scancode": "e04d", "rect": [17.25, 5.5, 1, 1] },
      { "row": 6, "col": 7, "address": 103, "scancode": "45", "rect": [18.5, 1.5, 1, 1] },
      { "row": 6, "col": 8, "address": 104, "scancode": "47", "rect": [18.5, 2.5, 1, 1] },
      { "row": 6, "col": 9, "address": 105, "scancode": "4b", "rect": [18.5, 3.5, 1, 1] },
      { "row": 6, "col": 10, "address": 106, "scancode": "4f", "rect": [18.5, 4.5, 1, 1] },
      { "row": 6, "col": 11, "address": 107, "scancode": "52", "rect": [18.5, 5.5, 2, 1] },
      { "row": 6, "col": 13, "address": 109, "scancode": "e035", "rect": [19.5, 1.5, 1, 1] },
      { "row": 6, "col": 14, "address": 110, "scancode": "48", "rect": [19.5, 2.5, 1, 1] },
      { "row": 6, "col": 15, "address": 111, "scancode": "4c", "rect": [19.5, 3.5, 1, 1] },
      { "row": 7, "col": 0, "address": 112, "scancode": "50", "rect": [19.5, 4.5, 1, 1] },
      { "row": 7, "col": 2, "address": 114, "scancode": "e020", "rect": [21.5, 0, 1, 1] },
      { "row": 7, "col": 3, "address": 115, "scancode": "37", "rect": [20.5, 1.5, 1, 1] },
      { "row": 7, "col": 4, "address": 116, "scancode": "49", "rect": [20.5, 2.5, 1, 1] },
      { "row": 7, "col": 5, "address": 117, "scancode": "4d", "rect": [20.5, 3.5, 1, 1] },
      { "row": 7, "col": 6, "address": 118, "scancode": "51", "rect": [20.5, 4.5, 1, 1] },
      { "row": 7, "col": 7, "address": 119, "scancode": "53", "rect": [20.5, 5.5, 1, 1] },
      { "row": 7, "col": 8, "address": 120, "scancode": "e010", "rect": [18.5, 0, 1, 1] },
      { "row": 7, "col": 9, "address": 121, "scancode": "4a", "rect": [21.5, 1.5, 1, 1] },
      { "row": 7, "col": 10, "address": 122, "scancode": "4e", "rect": [21.5, 2.5, 1, 2] },
      { "row": 7, "col": 11, "address": 123, "scancode": "e022", "rect": [19.5, 0, 1, 1] },
      { "row": 7, "col": 12, "address": 124, "scancode": "e019", "rect": [20.5, 0, 1, 1] },
      { "row": 7, "col": 13, "address": 125, "scancode": "e01c", "rect": [21.5, 4.5, 1, 2] }
    ]
  },
  "examples": [
    {
      "colours": ["ff0000", "00ff00", "0000ff"],
      "reports": [
        "04 f2",
        "81 ff 00 00 81 00 ff 00 81 00 00 ff 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81",
        "81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81",
        "81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81",
        "81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81",
        "81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81",
        "81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81",
        "81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81",
        "81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81",
        "81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81 00 00 00 81"
      ]
    }
  ]
}
