Ok, after some rabbithole digging, i have found that brightnessctl ddoesn’t support external monitors, without a kernel module for loading ddc/ci protocols, to load the backlight as a system device.
I’m not sure if your issue will be the same, as you are on a laptop, but depending on the interface you’re laptop manufacturer decided on, it may help?
People seemed to have varying degrees of success installing the ddcci-driver-linux-dkmsAUR package.
I noticed issues in the comments of the AUR package, regarding it being out of date, and not working on modern kernels, with the resolution being to use the ddcci-driver-linux-dkms-gitAUR package instead.
I don’t personally like running stuff from the AUR if i can help it, especially git versions (not pinned to a release), so i kept hunting.
After trying a few methods to get it working, i found the ddcutil package, which worked fine for me.
Here is the process i followed on Arch Linux. (If you are on a different distro, im sure it should be the same, except for possibly a slightly differently named package, and obviously a different package manager)
Install brightness support for external monitor
Required packages
- ddcutil
- read-edid (optional but allows better hardware detection)
Install (for arch linux)
sudo pacman -S ddcutil read-edid
Note: Needed a reboot to load the i2c-dev kernel module (automatically added by ddcutil)
Detect monitor id
ddcutil detect
output looks like:
Display 1 #<-- This is the ID for your monitor
I2C bus: /dev/i2c-4
DRM_connector: card1-DP-1
EDID synopsis:
Mfg id: GSM - LG Electronics
Model: LG ULTRAGEAR+
Product code: 23676 (0x5c7c)
Serial number: xxxxxxxxxxxx
Binary serial number: 44407 (0x0000ad77)
Manufacture year: 2024, Week: 3
VCP version: 2.1
Get current monitor brightness
# ddcutil <operation> <featurecode 10 = brightness> --display <diplayId>
ddcutil getvcp 10 --display 1
Outputs:
VCP code 0x10 (Brightness ): current value = 100, max value = 100
Set current monitor brightness
Set to 80% brightness
# ddcutil <operation> <featurecode 10 = brightness> <new brightness value> --display <diplayId>
ddcutil setvcp 10 80 --display 1
Set back to 100% brightness
# ddcutil <operation> <featurecode 10 = brightness> <new brightness value> --display <diplayId>
ddcutil setvcp 10 100 --display 1
Decrease brightness by 10%
# ddcutil <operation> <featurecode 10 = brightness> <new brightness value> --display <diplayId>
ddcutil setvcp 10 - 10 --display 1
Increase brightness by 10%
# ddcutil <operation> <featurecode 10 = brightness> <new brightness value> --display <diplayId>
ddcutil setvcp 10 + 10 --display 1