ambientd/ambientd.py

74 lines
2.3 KiB
Python
Raw Normal View History

2024-10-06 12:47:51 +02:00
#!/usr/bin/python
# Simple daemon to change brightness based on luminance
# TODO: add a config
# TODO: add debug option
# TODO: add dry-run
# TODO automatically find the right brightness path and do not assume intel_backlight
import time
# Open the luminance sensor device file
try:
luminance_file = open('/sys/bus/iio/devices/iio:device0/in_illuminance_raw', 'r')
except OSError as err:
print(err)
exit(1)
# max luminance of the screen - 100 (maybe)
2024-10-09 10:03:30 +02:00
max_luminance = 400
2024-10-06 12:47:51 +02:00
# get luminance value, on fail return the max
def get_luminance():
try:
l = int(luminance_file.read())
luminance_file.seek(0)
except:
l = max_luminance
return l
# Get the max brightness
max_brightness = 100
with open('/sys/class/backlight/intel_backlight/max_brightness', 'r') as f:
max_brightness = int(f.read())
min_brightness = int(max_brightness * 0.05)
# loop delay in seconds
delay = 3
2024-10-06 12:47:51 +02:00
lum = [get_luminance()]*4
user_offset = 0
brightness_target = min_brightness
brightness_old = min_brightness
2024-10-06 12:47:51 +02:00
while True:
lum.append(lum.pop(0))
lum[0] = get_luminance()
luminance = sum(lum)/len(lum)
luminance_percent = min(luminance/max_luminance, 1.0)
brightness_old = brightness_target
2024-10-06 12:47:51 +02:00
brightness_target = max(int(luminance_percent * max_brightness), min_brightness)
brightness_delta = abs((brightness_target - brightness_old)/brightness_old)
2024-10-06 12:47:51 +02:00
# if the brightness changes by more than 10% reduce the user offset, scaling
# with the delta, this accounts for large changes in brightness no longer
# corresponding to the adjustments that the user made to the brightness
if brightness_delta > 0.1:
user_offset = int(user_offset * max(min(1-(brightness_delta*1.2), 1), 0))
brightness_adjusted = min(max(brightness_target + user_offset, min_brightness), max_brightness)
2024-10-06 12:47:51 +02:00
b = open('/sys/class/backlight/intel_backlight/brightness', 'w')
b.write(str(brightness_adjusted))
b.close()
time.sleep(delay)
2024-10-06 12:47:51 +02:00
# if the value of the brightness changed then update the user offset
a = open('/sys/class/backlight/intel_backlight/actual_brightness')
x = int(a.read()) - brightness_target
a.close()
if brightness_target != max_brightness or x < 0:
user_offset = x
2024-10-09 10:03:30 +02:00
print("brightness target: ", brightness_target, "user offset: ", user_offset, "brightness adjusted: ", brightness_adjusted)