Configure Windows Creators Update Night Light via Registry

With a bunch of experimentation, I managed to more or less work out the format of that Registry value (see below for the details on that).

I made this PowerShell script:

Function Set-BlueLightReductionSettings {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory=$true)] [ValidateRange(0, 23)] [int]$StartHour,
        [Parameter(Mandatory=$true)] [ValidateSet(0, 15, 30, 45)] [int]$StartMinutes,
        [Parameter(Mandatory=$true)] [ValidateRange(0, 23)] [int]$EndHour,
        [Parameter(Mandatory=$true)] [ValidateSet(0, 15, 30, 45)] [int]$EndMinutes,
        [Parameter(Mandatory=$true)] [bool]$Enabled,
        [Parameter(Mandatory=$true)] [ValidateRange(1200, 6500)] [int]$NightColorTemperature
    )
    $data = (2, 0, 0, 0)
    $data += [BitConverter]::GetBytes((Get-Date).ToFileTime())
    $data += (0, 0, 0, 0, 0x43, 0x42, 1, 0)
    If ($Enabled) {$data += (2, 1)}
    $data += (0xCA, 0x14, 0x0E)
    $data += $StartHour
    $data += 0x2E
    $data += $StartMinutes
    $data += (0, 0xCA, 0x1E, 0x0E)
    $data += $EndHour
    $data += 0x2E
    $data += $EndMinutes
    $data += (0, 0xCF, 0x28)
    $tempHi = [Math]::Floor($NightColorTemperature / 64)
    $tempLo = (($NightColorTemperature - ($tempHi * 64)) * 2) + 128
    $data += ($tempLo, $tempHi)
    $data += (0xCA, 0x32, 0, 0xCA, 0x3C, 0, 0)
    Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\Cache\DefaultAccount\$$windows.data.bluelightreduction.settings\Current' -Name 'Data' -Value ([byte[]]$data) -Type Binary
}

To use it, save it as a .ps1 file and follow the instructions in the Enabling Scripts section of the PowerShell tag wiki. You can then import the script's contents by dot-sourcing:

. ./bluelightmanagement.ps1

And then use the cmdlet-like function that it supplies:

Set-BlueLightReductionSettings -StartHour 7 -StartMinutes 0 -EndHour 21 -EndMinutes 15 -Enabled $true -NightColorTemperature 6000

the results

The Settings app even updates everything (except the color slider) immediately if you have the blue light reduction page open when you run the command.

The format

  • 4 constant bytes - seemingly a signature common to all CloudStore values
  • The last-modified time of the setting as a 64-bit FILETIME value (8 bytes, little endian)
  • 8 more constant bytes
  • The bytes 2 then 1 if the blue light reduction feature is enabled, just gone if it's disabled
  • 3 more constant bytes
  • The start time's hour (1 byte)
  • 1 constant byte
  • The start time's minutes (1 byte)
  • 4 constant bytes
  • The end time's hour (1 byte)
  • 1 constant byte
  • The end time's minutes (1 byte)
  • 3 constant bytes
  • The night-time color temperature in Kelvin, after some weird binary math (2 bytes)
  • 7 constant bytes

The color temperature is stored as two bytes in little endian. The high-value one is the integer part of the result of dividing the temperature by 64. The low-value byte is the remainder multiplied by two, then added to 128. To calculate the temperature from the bytes, multiply the high byte by 64 and add what you get when you divide by two the difference between the low byte and 128.


Several hours of experiments and voila:
How to turn Night Light on/off in Win10 1903

The Registry key is:

HKCU\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Current\default$windows.data.bluelightreduction.bluelightreductionstate\windows.data.bluelightreduction.bluelightreductionstate\

Value name: Data

To enable Night Light:

  1. Add bytes "10" and "00" to Data on 24 and 25 indexes respectively so all data length increases (don't change existing values, just add two more bytes)
  2. Increment value in 11 or 12 indexes by 1 (for example: if it was FF 01 than now it needs to be 00 02 respectively) Actually it seems it's time here and it's written in 8 bytes in little endian format, so you'll need also 13, 14, 15, 16, 17 and 18 indexes if you want to do it precise.

To disable Night Light:

  1. Remove bytes "10" and "00" from Data on 24 and 25 indexes respectively so all data length decreases
  2. Increment value in 11 or 12 indexes by 1 (for example: if it was FF 01 than now it needs to be 00 02 respectively)

I only needed to turn Night Light on/off for my program, so unfortunately all other options still need research. But it seems that the key option to all other tweaks to work (like changing temperature and schedule) is to properly increment time. These mods need to be done in another Data value in neighboring registry key windows.data.bluelightreduction.settings.


Update for Windows 10 2004.

Created mainly to set the time Minutes-exact. 19:57 is three Minutes before "Tagesschau" in Germany.

How to use: Edit this commented registry file to your start and end times. Activate night light in the control panel since I don't know whether this reg file is enough. Import it. You can change the strength in the control panel, as long as you don't change the time setting it will stick to the values you set, showing it as "activated until 06:57" in your main display control panel.

If you know how to disable that syntax coloring on superuser.com, which fails here, tell. Using ```text or ```plaintext does not work.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Current\default$windows.data.bluelightreduction.settings\windows.data.bluelightreduction.settings]
; 4 bytes whatever, CloudStore Signature ?
"Data"=hex:43,42,01,00,\
; Might still be 64 Bit filetime, last time the setting was changed in the control panel
  0a,02,01,00,2a,06,c1,98,\
; 11 bytes whatever
  99,fb,05,2a,2b,0e,1f,43,42,01,00,\
; Acivated flag. It is is missing (i.e. ce,14, is here) is is off!
  02,01,\
; 3 bytes whatever
  ca,14,0e,\
; Starting Hour, 0x13 = 19
  13,\
; A constant
  2e,\
; Starting Minute, 0x39 = 57
  39,\
; 4 bytes whatever
  00,ca,1e,0e,\
; Ending Hour, 0x06 = 6 Uhr
  06,\
; A constant
  2e,\
; Ending Minute
  39,\
; 3 bytes constant
  00,cf,28,\
; Strength, here "33".
  9e,4a,\
; 10 bytes whatever (why so many trailing zeroes?)
  ca,32,00,ca,3c,00,00,00,00,00