README.md

July 31, 2026 ยท View on GitHub

Hotkeys PHAL plugin

This plugin maps keyboard hotkeys to OVOS bus events. You define key combinations, and the plugin sends the matching bus event when you press or release the keys.

Install

Add your user to the tty and input groups.

sudo usermod -a -G tty,input $USER

You can find more information in this issue.

Then install the plugin.

pip install ovos-PHAL-plugin-hotkeys

Configuration

Add a bus message and a key combo under "key_down" or "key_up".

Use "key_down" to react when a key is pressed. Use "key_up" to react when a key is released.

Here is a complete example based on events from a generic G20 USB remote.

 "PHAL": {
    "ovos-PHAL-plugin-hotkeys": {
        "debug": false,
        "key_down": {
            "mycroft.mic.listen": 582,
            "mycroft.mic.mute.toggle": 190,
            "mycroft.mic.mute": "shift+m",
            "mycroft.mic.unmute": "shift+u",
            "mycroft.volume.increase": 115,
            "mycroft.volume.decrease": 114,
            "mycroft.volume.mute.toggle": 113,
            "mycroft.volume.mute": "ctrl+shift+m",
            "mycroft.volume.unmute": "ctrl+shift+u",
            "homescreen.manager.show_active": 144,
            "ovos.common_play.play_pause": 164
       }
    }
}

For the Mark2 drivers, you can find the emitted key events in the sj201-buttons-overlay.dts file.

 "PHAL": {
    "ovos-PHAL-plugin-hotkeys": {
        "key_down": {
            "mycroft.mic.listen": 582,
            "mycroft.mic.mute": 248,
            "mycroft.volume.increase": 115,
            "mycroft.volume.decrease": 114
       },
        "key_up": {
            "mycroft.mic.unmute": 248
       }
    }
}

gpios 22-24 are the momentary switches. gpio 25 is MuteMic SW, connected to 3.3v or GND.

Finding keys

You can find a list of valid key scancodes here.

Some key presses are not detected correctly and show up as "unknown". Some devices also emit the wrong keycodes.

In this case, enable the debug flag in the config, then check the logs.

DEBUG {"event_type": "down", "scan_code": 57, "name": "space", "time": 1711050758.24674, "device": "/dev/input/event4", "is_keypad": false, "modifiers": []}
DEBUG {"event_type": "down", "scan_code": 24, "name": "o", "time": 1711050758.510758, "device": "/dev/input/event4", "is_keypad": false, "modifiers": []}
DEBUG {"event_type": "down", "scan_code": 115, "name": "unknown", "time": 1711050858.940323, "device": "/dev/input/event3", "is_keypad": false, "modifiers": []}
DEBUG {"event_type": "down", "scan_code": 114, "name": "unknown", "time": 1711050864.262953, "device": "/dev/input/event3", "is_keypad": false, "modifiers": []}

Use the scan_code integer in your config instead of the name string.

Credits

License

This plugin is available under the Apache-2.0 license.