Homebridge Blinds Wired
HomeKit support for non-smart motorized blinds through wires.
homebridge-blinds-wired is a Homebridge plugin that allows you to raise, lower, and stop your window blinds by wires. It makes a HomeKit window covering accessory available to you that can report status and be controlled entirely through wires.
These days, there is a decent selection of window blinds available on the market with native HomeKit support. However, there are also blinds systems, such as Somfy, which don't have any meaningful HomeKit support. Add to that the proprietary remote protocols and you're in for a challenge in trying to make window blinds part of your HomeKit smart home.
Installation
If you are new to Homebridge, please first read the Homebridge documentation and installation instructions before proceeding.
If you have installed the Homebridge Config UI, you can intall this plugin by going to the Plugins tab and searching for homebridge-blinds-wired and installing it.
If you prefer to install homebridge-blinds-wired from the command line, you can do so by executing:
sudo npm install -g homebridge-blinds-wired
Dependencies
Make sure libgpiod is installed on the Raspberry Pi:
sudo apt install -y build-essential python3 make g++ gpiod libgpiod-dev
Version 2.0.2 supports Homebridge 2.x on Node.js 22.12 or Node.js 24.
Configuration
I strongly recommend using the Homebridge Config UI rather than editing your config.json directly. It does a good job of showing you all the options and always generating a valid configuration so you don't get stuck on typos or looking for stray commas in your config.json.
For those that prefer configuring things directly, add the platform in config.json in your home directory inside .homebridge.
"platforms": [
{
"platform": "Blinds Wired",
"blinds": [
{
"name": "Livingroom Curtains",
"upPin": 17,
"downPin": 27,
"stopPin": 99,
"gpioChip": 0,
"pulseDuration": 200,
"activeLow": true,
"transitionInterval": 15,
"manufacturer": "Somfy",
"model": "DCT",
"serial": "1234-5678"
}
]
}
]
Options
upPin,downPinandstopPinshould point to BCM GPIO / libgpiod line numbers, not physical board pins.gpioChipis optional and defaults to0, which is the usual GPIO chip number on Raspberry Pi.- Setting a
stopPinin conjunction with atransitionIntervalallows partial positions, such as asking HomeKit to open a blind to 30%. For Somfy DCT, stopping is performed by pulsing bothupPinanddownPin; use99forstopPin. This is also the default. pulseDurationis the pulse length in milliseconds. It defaults to200, which is suitable for Somfy DCT.activeLowselects the relay polarity and defaults totrue.transitionIntervalis an optional setting that allows you to simulate a blind transition movement between open and closed. If it takes 15 seconds for the blinds to open, enter15here andhomebridge-blinds-wiredwill simulate the time it takes to complete that transition in HomeKit. The default is 10 seconds.manufacturer,model, andserialare optional settings to allow you to further identify your blinds in HomeKit.
Each blind must have a unique name. upPin and downPin must be different; a physical stopPin must also use a separate GPIO line.
Upgrading from v1.x
Version 2.0.0 changed the GPIO backend from rpi-gpio/sysfs to node-libgpiod. The pin options now use BCM GPIO / libgpiod line numbers, not physical board pins.
For example:
- Raspberry Pi physical pin 11 is BCM GPIO 17, so use
"upPin": 17. - Raspberry Pi physical pin 13 is BCM GPIO 27, so use
"downPin": 27. stopPin: 99is unchanged for Somfy DCT and still pulses both the Up and Down pins.
Before installing v2.x, install the libgpiod development headers:
sudo apt install -y build-essential python3 make g++ gpiod libgpiod-dev
Notes
This plugin cannot query the physical position of the blinds. It estimates position from the configured travel duration, remembers the most recent estimate, and reports that value to HomeKit. Calibrate transitionInterval to the actual full travel time for the best partial-position accuracy.
When transitionInterval and stopPin are configured, the plugin can estimate partial positions. For example, to open a blind to 20%, it pulses upPin, calculates the movement time from transitionInterval, and then pulses the configured stop command. Accurate calibration produces reasonably precise placement even for systems such as Somfy DCT that do not report their physical position.