---
layout: page
title: "Keyboard Remote"
description: "Instructions how to use a keyboard to remote control Home Assistant."
date: 2016-09-28 14:39
sidebar: true
comments: false
sharing: true
footer: true
logo: keyboard.png
ha_category: Other
ha_release: 0.29
ha_iot_class: "Local Push"
---

Receive signals from a keyboard and use it as a remote control.

This component allows you to use a keyboard as remote control. It will fire `keyboard_remote_command_received` events which can then be used in automation rules. 

The `evdev` package is used to interface with the keyboard and thus this is Linux only. It also means you can't use your normal keyboard for this because `evdev` will block it.


```yaml
# Example configuration.yaml entry
keyboard_remote:
  type: 'key_up'
```

Configuration variables:

- **type** (*Required*): Possible values are `key_up`, `key_down`, and `key_hold`. Be careful, `key_hold` will fire a lot of events.
- **device_descriptor** (*Optional*): Path to the local event input device file that corresponds to the keyboard.
- **device_name** (*Optional*): Name of the keyboard device.

Either `device_name` or `device_descriptor` must be present in the configuration entry. Indicating a device name is useful in case of repeating disconnections and re-connections of the device (for example, a bluetooth keyboard): the local input device file might change, thus breaking the configuration, while the name remains the same.
In case of presence of multiple devices of the same model, `device_descriptor` must be used.

A list of possible device descriptors and names is reported in the debug log at startup when the device indicated in the configuration entry could not be found.

A full configuration for Keyboard Remote could look like the one below:

```yaml
keyboard_remote:
  device_descriptor: '/dev/input/by-id/bluetooth-keyboard'
  type: 'key_up'
```

or like the following:

```yaml
keyboard_remote:
  device_name: 'Bluetooth Keyboard'
  type: 'key_down'
```

And an automation rule to breathe life into it:

```yaml
automation:
  alias: Keyboard all lights on
  trigger:
    platform: event
    event_type: keyboard_remote_command_received
    event_data:
      key_code: 107 # inspect log to obtain desired keycode
  action:
    service: light.turn_on
    entity_id: light.all
```

## {% linkable_title Disconnections %}
This component manages disconnections and re-connections of the keyboard, for example in the case of a bluetooth device that turns off automatically to preserve battery.

If the keyboard disconnects, the component will fire an event `keyboard_remote_disconnected`.
When the keyboard reconnects, an event `keyboard_remote_connected` will be fired.

Here's an automation example that plays a sound through a media player whenever the keyboard connects/disconnects:
```yaml
automation:
  - alias: Keyboard Connected
    trigger:
      platform: event
      event_type: keyboard_remote_connected
    action:
      - service: media_player.play_media
        data:
          entity_id: media_player.speaker
          media_content_id: keyboard_connected.wav
          media_content_type: music
  - alias: Keyboard Disconnected
    trigger:
      platform: event
      event_type: keyboard_remote_disconnected
    action:
      - service: media_player.play_media
        data:
          entity_id: media_player.speaker
          media_content_id: keyboard_disconnected.wav
          media_content_type: music
```

## {% linkable_title Permissions %}
There might be permissions problems with the event input device file. If this is the case, the user that hass runs as must be allowed read and write permissions with:
```
sudo setfacl -m u:HASS_USER:rw /dev/input/event*
```
where `HASS_USER` is the user hass runs as.

If you want to make this permanent, you can use a udev rule that sets it for all event input devices. Add a file `/etc/udev/rules.d/99-userdev-input.rules` containing:
```
KERNEL=="event*", SUBSYSTEM=="input", RUN+="/usr/bin/setfacl -m u:HASS_USER:rw $env{DEVNAME}"
```

You can check ACLs permissions with
```
getfacl /dev/input/event*
```
