117 lines
4 KiB
Markdown
117 lines
4 KiB
Markdown
---
|
|
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*
|
|
```
|