
MonitorControl: Control external monitor brightness and volume on your Mac - danso
https://github.com/MonitorControl/MonitorControl
======
throwanem
For a command-line option, ddcctl
([https://github.com/kfix/ddcctl](https://github.com/kfix/ddcctl)) works
nicely in my experience, with a Dell Ultrasharp connected via USB-C.

I have a script hacked together to fetch the internal display's brightness
once a minute and apply it, with a scaling factor, to the external, so that
they're both effectively controlled by the laptop's ambient light sensor. It's
really nice for working in a room with lots of windows.

A more batteries-included alternative, which appears to also provide
brightness sync, is Lunar ([https://lunar.fyi/](https://lunar.fyi/)). I
haven't had a chance to try it, but the Github repo makes it look pretty
solid.

~~~
andy_ppp
Could you share the script? I think lots of people would find it very useful!

~~~
throwanem
No, but the only thing in it that isn't trivial or already discussed is the
invocation for getting the internal display's current brightness values, which
is this:

    
    
        ioreg -c AppleBacklightDisplay | grep brightness | cut -d= -f2- | perl -pe's@=@:@g'
    

(The cut and perl commands cause it to spit out a JSON blob, instead of the
vaguely JSONish format ioreg gives you.)

------
neal_jones
This works with my Caldigit dock and Dell monitors and I love it.

No one else in my house cares though.

~~~
willdub
"No one else in my house cares though." This is my favorite comment on hn.

------
crazygringo
Wow, I didn't know this was even possible. It says the controls operate via
DDC [1].

How do you know if your monitor, television, or project supports this? And
does it depend on the connector used? (HDMI, DisplayPort, VGA?)

Does this work for most display peripherals, only newest/expensive ones, or
something in between?

[1]
[https://en.wikipedia.org/wiki/Display_Data_Channel](https://en.wikipedia.org/wiki/Display_Data_Channel)

~~~
garaetjjte
It works for virtually all monitors on HDMI/DisplayPort/VGA. I guess not for
TVs.

More specifically it is called MCCS:
[https://milek7.pl/ddcbacklight/mccs.pdf](https://milek7.pl/ddcbacklight/mccs.pdf)

------
hysan
Great codebase. I stumbled on this while trying to figure out how to
programmatically control screen brightness in a macOS app. Turns out that this
is far more difficult than imagined. Even controlling just the built-in
screen, something I assumed would be included in Apple's libraries, was not
included. The source code in MonitorControl is very well written and commented
and helped me catch the mistakes I was doing in my very hacky solution.

~~~
mgsk
Doing anything on macOS is more difficult than I imagine it to be. For
example, writing an alt-tab-type app, enumerating the list of apps and their
windows. Good luck.

~~~
qmmmur
I really would love something like rofi for macos

~~~
jamesgeck0
I think a combination of Alfred and Hammerspoon could get you most of the way
there?

------
etaioinshrdlu
I have often wondered if you could exploit a monitor over the DDC bus sending
i2c commands. There have just got to be memory corruption bugs in the display
controller code.

They probably also typically have some flash memory, so perhaps one could
permanently reprogram a monitor after the exploit?

~~~
gardaani
Could monitors be malicious and exploit vulnerabilities in computers by
sending corrupted data over the DDC bus?

The crazy thing is that computers send +5V over the DDC bus to the monitor so
that they are able to read data even if the monitor is powered off and not
connected to the mains! So, simply connecting something to the computer's
display port could be enough.

------
0xCMP
I love this thing. It only seems to work over DisplayPort cables for me. HDMI
doesn't work. I'm using a MBP mid-2014.

Saved me from buying a new monitor or something silly like getting an iMac.
Seriously weird why they don't just support DDD/CI natively.

~~~
aaronmiler
It does work over USB-C on 2019/2020s

~~~
0xCMP
That's good to hear. If/when I get forced into a new MBP I can look forward to
that working at least.

------
will_raw
Sometimes I just wonder why does apple don't provide such a basic
features/necessities.

~~~
jakear
If you have a touch bar it does, in my experience. Tap the brightness button
to open up controls for each monitor.

~~~
vladvasiliu
I don't have a touchbar mac to test, but does it work with external _non-
apple_ displays? Via Karabiner you can configure keys to change the external
display brightness. Works great on a Thunderbolt Display. Completely ignores
my Dell / LG.

The main reason why I think this wouldn't work is because in the display
properties there's no brightness slider for non Apple external displays. There
is one for Apple displays.

~~~
jakear
Yep, works with my external non-Apple display, LG.

------
minikites
There's software that does this on Windows too:
[https://clickmonitorddc.bplaced.net/](https://clickmonitorddc.bplaced.net/)

~~~
sotsoguk
Fantastic program. Not the nicest UI but very capable

------
morsch
On linux: `ddcutil setvcp 0x10 + <value>` to increase brightness (and -
<value> to lower it). Ymmv.

~~~
garaetjjte
Alternatively, you could use kernel module to expose it as standard backlight
control:
[https://milek7.pl/ddcbacklight/ddcci_bl.c](https://milek7.pl/ddcbacklight/ddcci_bl.c)

    
    
        insmod ddcci_bl.ko
        modprobe i2c-dev
        echo ddcci_bl 0x37 > /sys/bus/i2c/devices/i2c-2/new_device     (replace i2c-2 with bus number for your monitor)

~~~
voltagex_
Disabling Secure Boot so you can have control of your monitors seems very
2020.

~~~
vladvasiliu
That's not necessary. There is ddcci-dkms which can be built against the
running kernel and signed as all the other modules. I use it on both Ubuntu
(via shim + grub) and Arch (via direct boot).

This allows controlling the screen brightness from the usual places (gnome
power menu thingy or via light for the i3 crowd). See the Arch Linux Wiki for
more info [0].

Arch : ddcci-driver-linux-dkms (aur)

Ubuntu : ddcci-dkms

[0]
[https://wiki.archlinux.org/index.php/Backlight#External_moni...](https://wiki.archlinux.org/index.php/Backlight#External_monitors)

------
GekkePrutser
Oh wow great, I hope this works for me too! I have an LG 4K screen and the LG
tool to change brightness and contrast is really terrible, it has some stupid
built-in fake Picture in Picture mode which is constantly flashing red borders
around the screen when you use it. And the UI is really bad and slow.

This little menubar control looks like just what I wanted.

Edit: Yes it works great! On my LG24UD58. Perfect! Unfortunately it doesn't
seem to work with my Eizo L568 but that's ancient. And I think it had some
special USB-based control method. But really glad to be able to get rid of the
LG software now.

PS: You have to enable the contrast with a tickbox, otherwise that slider is
not shown.

~~~
k0stas
I use Brightness Sync ([https://github.com/OCJvanDijk/Brightness-
Sync](https://github.com/OCJvanDijk/Brightness-Sync)) for my external LG 5K
screen attached to my iMac.

The iMac light sensor controls the brightness of both monitors automatically.
You can even insert a fixed offset to match the absolute brightness of both
monitors.

~~~
GekkePrutser
Oh thanks as well!

But my Mac has no brightness sensor (it's a mini). I use the screen with my PC
and a raspberry pi as well so I couldn't use an iMac, though I have one at the
office (if I ever go back there...). It's really a shame they got rid of the
target display function, this would have been perfect :(

------
nico_h
Worked over VGA with my DELL monitor and MacBook Air (both from 2012). Where
has this been all my life!

I didn't even know it was a thing and thought there was a special chip in the
Apple screens to be able to control your screen from your computer.

~~~
alin23
If this works for you, please also give Lunar[1] a try! It's free, and has a
handy mode where it can sync your already adaptive built-in brightness to the
external monitors.

I'm the developer of Lunar so feel free to ask any questions about it.

[1] [https://lunar.fyi](https://lunar.fyi)

------
dawnerd
Not if only someone could figure out how to make external monitors on mac
actually work consistently. Macos still tends to not pick up the correct
refresh rate or even the monitor itself.

------
lucaspiller
On Linux you can do the same with ddccontrol. I wrote an article last year
explaining how I have my monitor automatically dim at night, in combination
with Redshift:

[https://www.stackednotion.com/blog/2019/05/07/automatically-...](https://www.stackednotion.com/blog/2019/05/07/automatically-
dimming-your-monitor-at-night/)

------
turdnagel
I would love to be able to donate to continued development & support of this
software - it's great! There doesn't appear to be a Patreon/tip jar but I'd
love to contribute if there is one.

------
farns
This works great in my setup: MBP 15-Inch, 2018, macOS Catalina 10.15.5,
Installed via Homebrew Cask, LG 34" 5k2k 34WK95U-W via Thunderbolt 3, Sonnet
Echo 11 Thunderbolt 3 Dock, Dell U3417W 34" via HDMI via Echo 11 Dock. Volume
and brightness work on both displays. Contrast only works on the Dell (after
enabling in the preferences) - no big deal. I can adjust brightness on both
displays at the same time via the keyboard... that is spectacular. Volume
controls work as expected - finally!! Fantastic!!

------
muska3
For those on Windows there's Twinkle Tray, works remarkably well. It has the
ability to set timers, which I set to dim my monitor at night and increase the
brightness during the day.

~~~
voltagex_
I have 2 Dell monitors and I haven't been able to get this to work either on
the built-in Intel graphics or with HDMI plugged into an AMD card.

~~~
thesandlord
I just tried this with two Dell U2711s connected via DisplayPort to a USB-C
adapter[0] and everything is working really well!

I have a laptop with a Ryzen 3 and a 1660ti, so it might be the Nvidia
graphics that is enabling this.

[0] [https://smile.amazon.com/Cable-Matters-Multiport-
DisplayPort...](https://smile.amazon.com/Cable-Matters-Multiport-DisplayPort-
Ethernet/dp/B0746NKVBN/ref=asc_df_B0746NKVBN)

------
leo150
Happy to see this app mentioned on HN.

If you have Swift experience please check the issues of the repo. Need
assistance with the identical monitors issue, it’s there for two years
already.

~~~
alin23
You could try Lunar[1] for that issue. It supports any number of monitors and
contains a workaround that seems to also work with multiple identical monitors
that can't be uniquely identified through their EDID data.

There are still some issues with some multiple port docks but so far that only
turned out to be hardware related.

I'm the developer of Lunar so feel free to ask any questions about it.

[1] [https://lunar.fyi](https://lunar.fyi)

------
perryizgr8
[https://twinkletray.com/](https://twinkletray.com/)

Brilliant app that does the same for windows 10.

------
xenonite
There also is
[https://github.com/Bensge/NativeDisplayBrightness/](https://github.com/Bensge/NativeDisplayBrightness/)
(I use it on macOS 10.11 with an external Dell P2415Q, with Fn+F1 and Fn+F2)

------
nghiatran_feels
I use External Display Brightens app
([https://github.com/fnesveda/ExternalDisplayBrightness](https://github.com/fnesveda/ExternalDisplayBrightness))
and it seems to be easier to use

~~~
alin23
If you like keyboard shortcuts you might like to give Lunar[1] a try. It also
has shortcuts for changing contrast and volume of the monitor as well as do
that automatically for you based on the builtin monitor brightness or the sun
elevation in your location.

[1] [https://lunar.fyi](https://lunar.fyi)

------
wu_tang_chris
OMG, thank you so much danso and all the developers of this app! This is the
biggest inconvenience and overall PITA docking my MBP, it annoys me constantly
on a daily basis. just tried it out, it's like my prayers were answered!

------
igornadj
Might be useful to some: LG Ultrafine 4k/5k brightness can be controlled with
the touch bar. Press the Brightness icon on the touch bar and two sliders show
up, one for your mac and one for the LG.

------
aaomidi
I'm so annoyed my OS doesn't integrate with DDC :/

------
fwip
I haven't had my office monitor in a while, but from what I remember,
ctrl+brightness button would change the external screen's brightness.

This might not work with all monitors.

------
syntaxing
This is too awesome! Adjusting the brightness of my monitor has been a pain
especially at night since WFH. Does this work with dynamic lighting?

~~~
alin23
You could try Lunar[1] for that. It syncs your builtin monitor brightness to
all your external monitors. As long as you have adaptive brightness enabled on
your Macbook, the external monitors will also be adaptive.

[1] [https://lunar.fyi](https://lunar.fyi)

------
divbzero
macOS should ship with this feature by default.

------
toyg
Works great with my Iiyama ProLite 82888UHSU / MBP 15" late 2016 / CalDigit
dock. Nice one!

------
jimmcslim
What are the keys anyway? I'm using a WASD Code Tenkeyless keyboard so only
have F1 through F12.

------
kosma
I dropped the author ten bucks as a thank you. This is exactly the program
that I needed.

~~~
turdnagel
How? Trying to do the same thing.

------
Zaheer
Does anyone have trouble with their Macbook recognizing an external display? I
have a new 2020 Macbook Pro and it struggles to recognize my Samsung display.
I often have to reboot the Mac for it to be recognized.

~~~
0x202020
I’ve got issues where macOS sees both monitors but won’t send output to both
every time I come out of sleep. Like one of the displays will turn on like it
has signal, then hang for a second and go back to sleep, repeat. I use a
program called disable monitor, which shows all the profiles for the display.
For some reason when one doesn’t connect it goes into the first profile for
the resolution/refresh rate/color depth, then I manually select the third and
it connects right away

~~~
vladvasiliu
I wonder wether there's some problem with the usb-c alternate modes and their
implementations / drivers.

Below are a bunch of my experiences with this which shows that behaviours are
all over the place which kind of excludes an outright broken OS or piece of
equipment. To me it looks much more like a compatibility issue.

I don't own a usb-c mac, but I've never had any problems whatsoever with my
2013 retina, always works perfectly even with 4k@60Hz screens.

I have a desktop PC which exhibits the same kind of weird behaviour you have.
It has a thunderbolt 3 / usb-c / dp connector which is downright awful.

I've managed to connect an Apple thunderbolt display to it with official tb2
-> tb3 adapter, it works well most of the time. Put the computer to sleep
though and the screen never comes back on. Sometimes it doesn't detect the USB
ports on it either. Mostly works if I force the thunderbolt mode to
DisplayPort only in the bios.

I've next connected a regular usb-c monitor to it (DP alternate mode + usb2
for peripherals). Works great in bios. Mostly works on Linux. On windows it
turns off when getting to the login screen. I don't know how, but I've managed
to get it to work exactly once. When I turned the computer back on the next
morning, it was again off on the windows login screen. The monitor IS
detected, it shows up in the Display Preferences if I connect it to both usb-c
and display port. It just won't turn on.

On Linux, it kinda works. I would say there's a 50/50 chance it won't detect
it at 60 Hz. Sometimes, if it works at 60Hz, if the display goes to sleep it
won't come back on at 60Hz. I guess at least there is _some_ output, so it's
got that going over windows.

I found an option on the bios to enable "high speed display output". No idea
what exactly that means, it didn't do anything.

This same screen works perfectly with a usb-c (no thunderbolt) laptop on
linux. Never had any issue, always detected as 4k@60Hz.

The same monitor and same PC over DP: no problem.

------
pantulis
Volume control is the killer feature for me.

------
chrismorgan
I believe that the difficulty of controlling external monitor brightness is a
significant factor in almost all people running external displays too bright
(often _much_ too bright). Because the standard software that comes out of the
box doesn’t let you adjust the brightness of external monitors in any
operating system I know of, and adjusting brightness by pressing buttons on
the monitor’s on-screen display is invariably a pain.

Windows has two completely different APIs for adjusting screen brightness: one
seems to only work on internal displays, the other seems to only work on
external displays. I say “seems to” because they don’t _document_ these facts,
this is just what I observe by fiddling with the APIs. And only the first one
is exposed anywhere in the UI: in Settings → System → Display (where you
change the screen resolution and such) it lets you change the brightness of an
internal display, but says something like “you can’t adjust the brightness of
this device” for external monitors.

Laptop brightness keys (what Linux calls XF86BrightnessUp and
XF86BrightnessDown) can’t be remapped by any means I know of. I don’t know of
any way of being notified when the internal display brightness changes,
either. I _think_ you can poll the value, though it’s three years since I
prodded this stuff and my memory is vague. Even so, it’d always be a delayed
reaction. Kinda wish I were back on my last laptop where I used Arch Linux +
i3 and handled XF86Brightness{Up,Down} myself.

(That brings me to my second major annoyance about built-in monitor brightness
control software: stepping by a linear 10% the whole way is stupid; something
like a logarithmic scale is much more sensible. The difference between 1% and
10% is at least as important in low lighting as the difference between 10% and
50%. I wrapped xbacklight to make it logarithmic on Arch, but I can’t do that
on Windows, where the keys just jump by 10%. Similar deal with phone
brightness, the difference two millimetres makes at the left end of the scale
is more than the whole right hand half of the scale. Who on earth thought
linear brightness was the right thing? Do they know _nothing_ about human
perception of brightness? Why is this obviously-badly-wrong practice
universally adopted?)

What would be rather nice would be the ability to calibrate internal and
external displays to match, so that the brightness of connected external
displays could match my internal monitor immediately, following my chosen
curve.

As it is, I use ScreenBright and script it so I can do both my external
displays at once. (Now, I could reimplement the needed functionality from the
relevant API in a short time, but ScreenBright does the job so I don’t
bother.) I tend to type `b 20` in the mornings, sometimes `b 40` in the
afternoons, and `b 0` in the evening. Seldom do I want to go past 40%. As I
said, most people run their external monitors too bright, often _much_ too
bright.

------
Animats
Aw. I was expecting this would involve a phone app and a service you sign up
for.

------
anoncareer0212
did they disable this in OS X? Used to work fine for me, but I gave up buying
$2,500 iPads after the keyboard debacle and ensuing 1984 treatment

~~~
p_l
DDC was afaik never officially supported, and whatever they did with the
connection path means that there's enough reports of "crash whole OS trying to
change brightness of display"

