A Homebridge plugin for controlling a garage door opener via a Raspberry Pi GPIO relay, with optional door state sensor support.
Compatible with Homebridge 1.x and Homebridge 2.0.
- Raspberry Pi (any model with GPIO, including Pi 5)
- Node.js >= 18
- Homebridge >= 1.1.7 (including 2.0)
gpiodsystem package — install with:sudo apt install gpiod- Provides
gpiogetandgpiosetwhich this plugin uses for GPIO access - Works on all Pi models including Pi 5 (uses
/dev/gpiochip*character device, not legacy sysfs) - Raspberry Pi 5 note: gpiod is pre-installed on Raspberry Pi OS Bookworm — no extra install step needed
- Provides
- A relay module wired to a GPIO output pin
- (Optional) A magnetic reed sensor or similar wired to a GPIO input pin
Search for homebridge-garage-door-wsensor in the Homebridge UI plugin tab and click Install.
npm install -g homebridge-garage-door-wsensorcd /var/lib/homebridge/node_modules
sudo git clone https://github.com/skirkpatrickMSFT/homebridge-garage-door-wsensor.git
cd homebridge-garage-door-wsensor
sudo npm install
sudo hb-service restartTo update to the latest version from GitHub later:
cd /var/lib/homebridge/node_modules/homebridge-garage-door-wsensor
sudo git pull
sudo npm install
sudo hb-service restartcd /path/to/this/folder
npm install
npm linkAdd the following to the accessories array in your Homebridge config.json (usually located at /var/lib/homebridge/config.json):
{
"accessory": "Garage Door Opener",
"name": "Garage Door",
"doorRelayPin": 8,
"doorSensorPin": 23,
"duration_ms": 500,
"invertDoorState": false,
"invertSensorState": false,
"input_pull": "up"
}Note:
doorRelayPinanddoorSensorPinuse BCM GPIO numbers — not physical board pin numbers. See the GPIO Pin Map section below to find your BCM number.
Example of where it fits inside config.json:
{
"bridge": { ... },
"accessories": [
{
"accessory": "Garage Door Opener",
"name": "Garage Door",
"doorRelayPin": 8,
"doorSensorPin": 23,
"duration_ms": 500,
"invertDoorState": false,
"invertSensorState": false,
"input_pull": "up"
}
],
"platforms": []
}| Option | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | Yes | — | Name of the accessory as it appears in HomeKit |
doorRelayPin |
integer | Yes | — | BCM GPIO number connected to the relay (see pin map below) |
doorSensorPin |
integer | Yes | — | BCM GPIO number connected to the door sensor (see pin map below) |
duration_ms |
integer | No | 200 |
How long (in milliseconds) to pulse the relay. 200–500 ms works for most garage openers |
invertDoorState |
boolean | No | false |
Invert the relay output logic (HIGH/LOW) for the door |
invertSensorState |
boolean | No | false |
Invert the sensor reading logic |
input_pull |
string | No | "none" |
Pull resistor for sensor pin: "up", "down", or "none" (configured via pinctrl) |
gpiochip |
string | No | auto | GPIO chip device. Auto-detected at startup by scanning gpiodetect output for pinctrl. Override only if auto-detection fails |
The Pi 5 uses the RP1 I/O controller which breaks compatibility with older GPIO libraries (e.g. rpio, pigpio, onoff). This plugin works correctly on Pi 5 because it uses the gpiod command-line tools which support the modern /dev/gpiochip* interface.
Key differences on Pi 5:
| Pi 4 | Pi 5 | |
|---|---|---|
| GPIO chip | gpiochip0 |
gpiochip0 |
| GPIO interface | /sys/class/gpio or /dev/gpiochip0 |
/dev/gpiochip0 only (sysfs removed) |
| gpiod version | v1 (Bullseye) or v2 (Bookworm) | v2 (Bookworm) |
| Pull resistors | raspi-gpio or pigpio |
pinctrl |
This plugin auto-detects all of the above at startup. You'll see log lines like:
[Garage Door] Auto-detected GPIO chip: gpiochip0
[Garage Door] gpiod syntax: v2 (default) chip: gpiochip0 sensor cmd: gpioget -c gpiochip0 23
If auto-detection picks the wrong chip, add "gpiochip": "gpiochip0" (or the correct chip name) to your config to force it.
- Connect the relay signal wire to the GPIO pin specified by
doorRelayPin. - Connect relay COM/NO terminals in parallel with the garage door button.
- Connect one leg of the sensor to the GPIO pin specified by
doorSensorPin. - Connect the other leg to ground (if using
input_pull: "up") or to 3.3V (if usinginput_pull: "down").
Important: This plugin uses BCM GPIO numbers — NOT physical board pin numbers. Use the table below to find the correct value for your config. GPIO is accessed via the
gpiodsystem tools (gpioget/gpioset), which work on all Pi models including Pi 5.
If you were previously using this plugin with rpio, your config used physical board pin numbers. You must convert them to BCM numbers:
| Old rpio config value (physical pin) | New BCM config value |
|---|---|
| 11 | 17 |
| 12 | 18 |
| 13 | 27 |
| 15 | 22 |
| 16 | 23 |
| 18 | 24 |
| 19 | 10 |
| 21 | 9 |
| 22 | 25 |
| 23 | 11 |
| 24 | 8 |
| 26 | 7 |
For any pin not listed, use the full GPIO Pin Map below.
The Raspberry Pi header has 40 physical pins. Only the GPIO pins are usable — use the BCM column in your config.json.
Physical BCM | Physical BCM
Pin 1 3.3V | Pin 2 5V
Pin 3 2 | Pin 4 5V
Pin 5 3 | Pin 6 GND
Pin 7 4 | Pin 8 14
Pin 9 GND | Pin 10 15
Pin 11 17 | Pin 12 18
Pin 13 27 | Pin 14 GND
Pin 15 22 | Pin 16 23
Pin 17 3.3V | Pin 18 24
Pin 19 10 | Pin 20 GND
Pin 21 9 | Pin 22 25
Pin 23 11 | Pin 24 8
Pin 25 GND | Pin 26 7
Pin 27 0 | Pin 28 1
Pin 29 5 | Pin 30 GND
Pin 31 6 | Pin 32 12
Pin 33 13 | Pin 34 GND
Pin 35 19 | Pin 36 16
Pin 37 26 | Pin 38 20
Pin 39 GND | Pin 40 21
Common examples:
| Physical Pin | BCM GPIO | Use in config |
|---|---|---|
| 11 | 17 | "doorRelayPin": 17 |
| 13 | 27 | "doorSensorPin": 27 |
| 15 | 22 | "doorRelayPin": 22 |
| 16 | 23 | "doorSensorPin": 23 |
| 18 | 24 | "doorRelayPin": 24 |
| 22 | 25 | "doorSensorPin": 25 |
Tip: You can also run
pinouton the Raspberry Pi terminal for a live visual diagram of your board.
Start Homebridge normally — the plugin will be loaded automatically:
homebridgeOr with the service manager (if configured as a service):
sudo systemctl start homebridgeTo view logs:
sudo journalctl -fu homebridge- "You must provide a config value for 'doorRelayPin'" — Ensure
doorRelayPinis set in yourconfig.json. - "You must provide a config value for 'doorSensorPin'" — Ensure
doorSensorPinis set in yourconfig.json. - Relay fires but door doesn't move — Check your wiring and try toggling
invertDoorState. - Sensor always shows wrong state — Try toggling
invertSensorStateor changinginput_pull. - Permission denied on GPIO — Run Homebridge as root or add the user to the
gpioanddialoutgroups:sudo usermod -aG gpio,dialout $USER. Thegpiodtools typically require either root or membership in thegpiogroup. - Wrong chip number — Run
gpiodetecton the Pi to list available chips. Pi 5 with Bookworm reportsgpiochip0 [pinctrl-rp1]. Force it with"gpiochip": "gpiochip0"in your config. gpioget: command not found— Install the gpiod tools:sudo apt install gpiod(usually pre-installed on Bookworm/Pi 5).- Pin numbering — Always use BCM numbers, not physical board pin numbers. Physical pin 16 = BCM 23, physical pin 24 = BCM 8.
ISC