Ajusta automáticamente el brillo de la pantalla según el amanecer y el atardecer


10

Hay preguntas y respuestas similares en Ask Ubuntu que apuntan a estas soluciones:

pero requieren la entrada manual de las horas de salida y puesta del sol o simplemente ajustan el balance de color y agregan más rojo por la noche.

Estoy buscando una solución que obtenga automáticamente las horas de salida y puesta del sol cada día y ajuste físicamente el brillo de la pantalla. Además, quiero un efecto de transición durante un período de 60 a 120 minutos, así que no noto el cambio de visualización.

La reconfiguración en días nublados (más oscuro fuera) o cuando el sol se pone entre dos edificios de tres pisos en lugar de sus tejados (más brillante antes del atardecer) debería ser un proceso rápido y fácil.

Respuestas:


7

Publicación actualizada de 2019 - Eyesome

Eyesome es un script de bash que se ejecuta como un demonio y que duerme la mayor parte del tiempo 24/7. Ajusta automáticamente el brillo de la pantalla (y opcionalmente gamma también) para la pantalla de su computadora portátil a través de la interfaz de hardware y hasta otros dos monitores utilizando el control de software de xrandr.

Al amanecer (la hora se obtiene automáticamente de Internet todos los días), el brillo de la pantalla (y opcionalmente el gamma también) se ajusta gradualmente. Usted define el ajuste gradual, pero 120 minutos me funcionan. Para mantener los ajustes imperceptibles, establezca un intervalo de suspensión entre los ajustes. Probablemente sea mejor entre 15 y 60 segundos y el valor predeterminado es 60.

El demonio molesto duerme muchas horas hasta que comienza la transición del atardecer. Inversamente a la transición de la salida del sol, la transición de la puesta del sol disminuye gradualmente el brillo de la pantalla (y opcionalmente el gamma también) por lo que es imperceptible. Se recomiendan 90 minutos antes del atardecer, pero puede establecer el período que desee.

Durante la puesta de sol, la transición gamma puede definirse para aumentar. Por ejemplo, la gamma roja se puede definir como 1.0 durante el día y 1.2 durante la noche para reducir la fatiga visual. La gamma azul a su vez puede definirse como 1.0 durante el día y .8 durante la noche, por lo que disminuirá en su lugar.

Para reducir los recursos, el sueño duerme todo el período entre las transiciones de la puesta del sol y la del amanecer. Hay excepciones únicas cuando se reanuda la suspensión o la conexión en caliente de monitores externos. Depende de dónde vivas y la estación del año, pero el sueño promedio será de 12 horas.

Puedes descargar Eyesome desde Github


Publicación original de 2017

Introducción

Esta es una solución bash sin necesidad de instalar programas adicionales. Requiere una conexión a Internet (si está leyendo esto, tiene una) para obtener automáticamente las horas de salida y puesta del sol cada día. Proporciona una pantalla de configuración fácil de usar. Se inicia automáticamente con crony no requiere interacción del usuario.

Esta respuesta se divide en varias partes.

  • Obtenga automáticamente las horas de salida y puesta del sol cada día con cron
  • Configurar ajustes de brillo y tiempo de transición
  • Guión principal para ajustar el brillo según la hora del día
  • Comience el brillo automático de la pantalla automáticamente cada arranque con cron
  • Ajuste de brillo instantáneo / transparente que se reanuda desde la suspensión
  • Resumen

Obtenga automáticamente las horas de salida y puesta del sol cada día con cron

Hay muchos sitios web para informar las horas de salida y puesta del sol para su ubicación. Este script utiliza ( https://www.timeanddate.com/ ), que ha sido un sitio conocido durante mucho tiempo.

Con sudo powers edita el archivo /usr/local/bin/sun-hoursy pega esto:

#!/bin/bash

# Called daily from /etc/cron.daily/sun-hours
while true; do

### "-q"= quiet, "-O-" pipe output
echo $(wget -q -O- https://www.timeanddate.com/sun/canada/edmonton | grep -oE 'Sunrise Today.{35}' | awk -F\> '{print $3}' | tr --delete "<") > /tmp/sunrise
echo $(wget -q -O- https://www.timeanddate.com/sun/canada/edmonton | grep -oE 'Sunset Today.{35}' | awk -F\> '{print $3}' | tr --delete "<") > /tmp/sunset

## If network is down files will have one byte size
size1=$(wc -c < /tmp/sunrise)
size2=$(wc -c < /tmp/sunset)

if [ $size1 -gt 1 ] && [ $size2 -gt 1 ] ; then
    cp /tmp/sunrise /usr/local/bin/sunrise
    cp /tmp/sunset  /usr/local/bin/sunset
    chmod 666 /usr/local/bin/sunrise
    chmod 666 /usr/local/bin/sunset
    rm /tmp/sunrise
    rm /tmp/sunset
    exit 0
else
    logger "/etc/cron.daily/sun-hours: Network is down. Waiting 5 minutes to try again."
    sleep 300
fi

done

Antes de guardar el script, reemplace las dos ocurrencias de /canada/edmontoncon su propio país y ciudad. Visite el sitio www.timeanddate.compara obtener el nombre o número exacto. Por ejemplo, "París, EE. UU." Tiene docenas de nombres, por lo que contendrán un número como el /worldclock/@5205082de "París, EE. UU.".

Use cron para ejecutar el script de sun-hours cada día

Con sudo powers edita el archivo /etc/cron.daily/sun-hoursy pega esto:

#!/bin/sh
#
# Each day /etc/cron.daily/sun-hours will get sunrise and sunset times.

sleep 60 # give time for network to come up.
/usr/local/bin/sun-hours

Marque ambos archivos como ejecutables con sudo chmod a+x ___/sun-hours"___" es el directorio para cada archivo.

Use Conky para monitorear los cambios de la hora del amanecer / atardecer cada día

Conky es una herramienta popular para monitorear su sistema. Estos son los comandos para que muestre la configuración de amanecer, atardecer y brillo:

${color orange}${voffset 2}${hr 1}
${color}${goto 5}Day: ${color green}${execpi 300 cat /usr/local/bin/sunrise}  ${color}Night: ${color green}${execpi 300 cat /usr/local/bin/sunset}  ${color}Level: ${color green}${execpi 10 cat cat /sys/class/backlight/intel_backlight/brightness}
${color orange}${voffset 2}${hr 1}

Esto es lo que parece:

display-auto-brillo conky

Nota: este código Conky utiliza el intel_backlightque necesita cambiar según su adaptador de pantalla como se describe en las secciones a continuación.

Configurar ajustes de brillo y tiempo de transición

No desea que su pantalla cambie a brillo completo al amanecer y a oscuridad total al atardecer. Se necesita un período de transición. Además, se requiere un archivo de configuración para registrar las variables de brillo completo y atenuación total. Esta es la pantalla de configuración:

pantalla-auto-brillo-config

La pantalla se construye utilizando el comando zenity estándar y, como tal, los valores existentes se muestran en etiquetas con la etiqueta "(valor)" y usted ingresa nuevos valores si es necesario. De lo contrario, los archivos existentes se conservan cuando los nuevos valores están en blanco.

Reemplace intel_backlightcon su controlador de pantalla si es diferente. Para determinar su utilización nombre: ls /sys/class/backlight/*/brightness.

Usando sudo powers crea el archivo /usr/local/bin/auto-brightness-configy pega en este código:

#!/bin/bash

# Read hidden configuration file with entries separated by " " into array
IFS=' ' read -ra CfgArr < /usr/local/bin/.auto-brightness-config

# Zenity form with current values in entry label
# because initializing multiple entry data fields not supported
output=$(zenity --forms --title="Display Auto Brightness Configuration" \
        --text="Enter new settings or leave entries blank to keep (existing) settings" \
   --add-entry="/sys/class/backlight/??????/brightness driver : (${CfgArr[0]})" \
   --add-entry="Day time maximum display brightness : (${CfgArr[1]})" \
   --add-entry="Transition minutes after sunrise to maximum : (${CfgArr[2]})" \
   --add-entry="Night time minimum display brightness : (${CfgArr[3]})" \
   --add-entry="Transition minutes before sunset to minimum : (${CfgArr[4]})")

IFS='|' read -a ZenArr <<<$output # Split zenity entries separated by "|" into array elements

# Update non-blank zenity array entries into configuration array
for i in ${!ZenArr[@]}; do
    if [[ ${ZenArr[i]} != "" ]]; then CfgArr[i]=${ZenArr[i]} ; fi
done

# write hidden configuration file using array (fields automatically separated by " ")
echo "${CfgArr[@]}" > /usr/local/bin/.auto-brightness-config

Marque el archivo como ejecutable usando:

chmod a+x /usr/local/bin/auto-brightness-config

Programa principal display-auto-brightness

Usando sudo powers crea el archivo /usr/local/bin/display-auto-brightnessy pega en este código:

#!/bin/bash

# NAME: display-auto-brightness
# PATH: /usr/local/bin
# DESC: Set display brightness based on min/max values, sun rise/set time
#       and transition minutes.
# CALL: Called from cron on system startup with @reboot option.
# DATE: Feb 17, 2017. Modified: Dec 2, 2017.

# NOTE: Only sleep for 1 minute to make display brightness changes gradual.
#       Configuration file can change any time so variables reread when waking.
#       The file is maintained by /usr/local/bin/auto-brightness-config script.

#       Sunrise and sunset time obtained from www.dateandtime.com using
#       /usr/local/bin/sun-hours script. The script is called from cron using
#       /etc/cron.daily/cron-daily-sun-hours. Variables stored in am/pm format
#       in /usr/local/bin/sunrise and /usr/local/bin/sunset.

#       When suspending at 6 am it might be dark with setting at 300. When 
#       resuming at 4:30pm it might be full sun and setting needs to be 2000.
#       It will take between 1 and 59 seconds to adjust screen brightness with
#       sudden jump in brightness. To correct this create kill sleep command
#       during suspend with /lib/systemd/system-sleep/display-auto-brightness
#       script.

# TODO: Add support for external monitors connected via HDMI / DisplayPort.
#       xrandr --output HDMI-0  --brightness .799
#       xrandr --output DP-1-1  --brightness 1.15

if [[ $(id -u) != 0 ]]; then # root powers needed to call this script
    echo display-auto-brightness must be called with sudo powers
    exit 1
fi

# global variable
LastSetting=""

function set-and-sleep {
    if [[ "$1" != "$LastSetting" ]]; then
        sudo sh -c "echo $1 | sudo tee $backlight"
        echo "$1" > "/tmp/display-current-brightness"
        LastSetting="$1"
    fi
    sleep 60
}  

re='^[0-9]+$'   # regex for valid numbers

function calc-level-and-sleep {
    # Parms $1 = number of minutes for total transition
    #       $2 = number of seconds into transition

    secTotal=$(( $1 * 60 )) # Convert total transition minutes to seconds
    Adjust=$( bc <<< "scale=6; $transition_spread * ( $2 / $secTotal )" )
    Adjust=$( echo $Adjust | cut -f1 -d"." ) # Truncate number to integer

    if ! [[ $Adjust =~ $re ]] ; then
        Adjust=0   # When we get to last minute $Adjust can be non-numeric
    fi

    calc_bright=$(( $min_bright + $Adjust ))
    set-and-sleep "$calc_bright"
}


while true ; do

    # Although variables change once a day it could be weeks between reboots.
    sunrise=$(cat /usr/local/bin/sunrise)
    sunset=$(cat /usr/local/bin/sunset)

    # Read hidden configuration file with entries separated by " " into array
    IFS=' ' read -ra CfgArr < /usr/local/bin/.auto-brightness-config
    backlight="/sys/class/backlight/${CfgArr[0]}/brightness"
    max_bright="${CfgArr[1]}"
    after_sunrise="${CfgArr[2]}"
    min_bright="${CfgArr[3]}"
    before_sunset="${CfgArr[4]}"

    # Current seconds
    secNow=$(date +"%s")
    secSunrise=$(date --date="$sunrise today" +%s)
    secSunset=$(date --date="$sunset today" +%s)

    # Is it night time?
    if [ "$secNow" -gt "$secSunset" ] || [ "$secNow" -lt "$secSunrise" ]; then
        # MINIMUN: after sunset or before sunrise nightime setting
        set-and-sleep "$min_bright"
        continue
    fi

    # We're somewhere between sunrise and sunset
    secMaxCutoff=$(( $secSunrise + ( $after_sunrise * 60 ) ))
    secMinStart=$((  $secSunset  - ( $before_sunset * 60 ) ))

    # Is it full bright day time?
    if [ "$secNow" -gt "$secMaxCutoff" ] && [ "$secNow" -lt "$secMinStart" ]; then
        # MAXIMUN: after sunrise transition AND before nightime transition
        set-and-sleep "$max_bright"
        continue
    fi

    # Daytime - nightime = transition brightness levels
    transition_spread=$(( $max_bright - $min_bright ))

    # Are we between sunrise and full brightness?
    if [ "$secNow" -gt "$secSunrise" ] && [ "$secNow" -lt "$secMaxCutoff" ]; then
        # Current time - Sunrise = progress through transition
        secPast=$(( $secNow - $secSunrise ))
        calc-level-and-sleep $after_sunrise $secPast
        continue
    fi

    # Are we between beginning to dim and sunset (full dim)?
    if [ "$secNow" -gt "$secMinStart" ] && [ "$secNow" -lt "$secSunset" ]; then
        # Sunset - Current time = progress through transition
        secBefore=$(( $secSunset - $secNow ))
        calc-level-and-sleep $before_sunset $secBefore
        continue
    fi

    # At this stage brightness was set with manual override outside this program
    # or exactly at a testpoint, then it will change next minute so no big deal.
    sleep 60 # reset brightness once / minute.

done # End of forever loop

Marque el archivo como ejecutable usando:

chmod a+x /usr/local/bin/display-auto-brightness

NOTA: El 26 de agosto de 2017 se revisó sin éxito para corregir el error en el que el programa se detendría cuando el último nivel de brillo fuera igual al brillo mínimo o máximo y el valor de ajuste del minuto actual esté en blanco (cero). Se solucionó correctamente el 2 de diciembre de 2017, pero no se publicó hasta el 17 de febrero de 2018. ¡Vaya!

Comience el brillo automático de la pantalla automáticamente cada arranque con cron

Cron se utiliza para iniciar la aplicación principal en cada arranque. Crea el archivo /etc/cron.d/display-auto-brightnesscon sudo powers y copia en esto:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot   root    /usr/local/bin/display-auto-brightness

Ajuste de brillo instantáneo que se reanuda desde la suspensión

Puede suspender su ordenador a las 6 am cuando antes de que salga el sol y su ajuste es al 300. Puede reanude a las 4 pm cuando el sol es brillante y el ajuste debe ser 2000, pero hay que esperar de 1 a 59 segundos para que display-auto-brightnessa restablecer la pantalla. Cuando la pantalla se reinicia, el cambio es dramático. Para resolver esto systemdse necesita un script. Crea el archivo que /lib/systemd/system-sleep/display-auto-brightnesscontiene:

#!/bin/sh

# NAME: display-auto-brightness
# PATH: /lib/systemd/system-sleep/
# DESC: Restart display brightness when resuming from suspend
# CALL: Automatically called when system goes to sleep and wakes up
# DATE: August 2017. Modified: June 10, 2018.

# NOTE: Gives instant display brightness adjustment instead of waiting 1 to 59 seconds.

logger -t "logger -t "test" "\$0=$0, \$1=$1, \$2=$2" test" "\$0=$0, \$1=$1, \$2=$2"

case $1/$2 in
  pre/*)
    echo "/lib/systemd/system-sleep/display-auto-brightness: Going to $2..."
    ;;
  post/*)
    # March 28, 2018 On AW17R3 this script runs too fast
    sleep 2

    echo "/lib/systemd/system-sleep/display-auto-brightness: Resuming from $2..."

    # Find running tree processes containing "display-auto" AND "sleep"
    ProgramTree=$(pstree -g -p | grep display-auto | grep sleep)
    # echo's below will print in /var/log/syslog. Comment out with # to suppress
    echo "pstree -g -p | grep display-auto | grep sleep"
    echo "============================================="
    echo "$ProgramTree"

    # extract sleep program ID within `pstree`. eg we would want "16621" below:
    # |-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(16621,1308)
    pID=$(echo "$ProgramTree" | cut -f 6 -d '(' )
    pID=$(echo "$pID" | cut -f1 -d",")

    kill $pID  # kill sleep command forcing screen brightness to adjust immediately
    rm /tmp/display-current-brightness
    echo "display-auto-brightness: sleep pID: '$pID' has been killed."
    ;;
esac

Marque el archivo como ejecutable usando:

chmod a+x /lib/systemd/system-sleep/display-auto-brightness

Resumen

El nivel de brillo actual de la pantalla es systray

Además del ejemplo de Conky presentado anteriormente, el indicador-monitor del sistema puede mostrar el brillo actual en la bandeja del sistema a través de bash:

bandeja de pantalla con brillo automático

En este ejemplo de bandeja del sistema, el brillo se establece en 418y es aproximadamente 20 minutos antes del atardecer. Al atardecer, el valor será de 250 y el brillo total durante el día es de 1200. En esta máquina, es posible intel_backlight = 4882, pero si está en interiores con cortinas abiertas, la pantalla es como mirar al sol.

El indicador de la bandeja del sistema se configura con este código:

#!/bin/bash

if [ -f ~/.lock-screen-timer-remaining ]; then
    text-spinner
    Spinner=$(cat ~/.last-text-spinner) # read last text spinner used
    Minutes=$(cat ~/.lock-screen-timer-remaining)
    systray=" $Spinner Lock screen in: $Minutes"
else
    systray=" Lock screen: OFF"
fi

if [ -f /tmp/display-current-brightness ]; then
    Brightness=$(cat /tmp/display-current-brightness)
    systray="$systray Brightness: $Brightness"
else
    systray="$systray Brightness: OFF"
fi

echo "$systray" # sysmon-indidicator will put echo string into systray for us.

exit 0

Este Q&A ( ¿Puede BASH mostrarse en la bandeja del sistema como indicador de la aplicación? ) Describe cómo configurar el indicador-monitor del sistema.

Mejoras futuras

  • Migración de scripts de bash para esta respuesta a github
  • Agregar soporte para monitores externos usando xrandr
  • Agregar soporte para más rojo / menos azul usando xrandr

Gran publicación, pero ¿podría ayudarme a ingresar a la pantalla para configurar la transición, etc.?
Marek Urbanowicz

@ MU Gracias por tu amable comentario. Estoy en el proceso de modernizar el documento con los cambios de Suspender / Reanudar escritos hace un par de meses. Además, pronto escribiré código híbrido WSL (Windows Subsystem for Linux). Me gustaría abordar sus inquietudes en el nuevo documento también. ¿Tienes problemas para crear el /usr/local/bin/auto-brightness-configscript? ¿Tiene problemas para identificar el /sys/class/backlight/??????/brightnessnombre del conductor? Me gustaría hacer de esto una gran utilidad y su pregunta es importante.
WinEunuuchs2Unix

Simplemente no tengo idea, en base a su publicación, sobre cómo obtener la configuración de visualización de brillo automático
Marek Urbanowicz

@MU copia el código anterior /usr/local/bin/auto-brightness-configen tu /usr/local/bindirectorio en un archivo llamado auto-brightness-config. Luego, desde la terminal, márquelo como ejecutable chmod a+x /usr/local/bin/auto-brightness-config. Luego ejecute el script desde la terminal escribiendo /usr/local/bin/auto-brightness-config. Puede configurar un acceso directo de escritorio al script para evitar abrir un terminal y escribir el nombre del script.
WinEunuuchs2Unix

1
@dessert Finalmente configuré una página de github para eyesomela próxima encarnación de display-auto-brightness: github.com/WinEunuuchs2Unix/eyesome Se actualizará con frecuencia durante las próximas semanas con documentación y mejoras para la interfaz.
WinEunuuchs2Unix

3

Acabo de escribir un programa que casi hace lo que estás buscando. Cambia el brillo de la pantalla en función de las imágenes tomadas por su cámara web para obtener el brillo circundante. Puede elegir el intervalo para detectar el brillo y la velocidad de atenuación usted mismo.

https://github.com/Wandersalamander/Dimmer


1
Suena como una gran idea para la mayoría de la gente - excepto aquellos de nosotros con cinta adhesiva sobre cámara ...
WinEunuuchs2Unix

1
@ WinEunuuchs2Unix Incluso para los 'interesados' con cinta sobre la cámara, ¡puede ser genial! No es necesario cubrir la cámara web con cinta negra para que las capturas resulten inútiles: un papel blanco logra prácticamente el mismo efecto de anonimato y aún conserva la capacidad de la cámara para medir el brillo de la habitación. De hecho, la hoja de papel podría mejorarlo, ya que mediría de manera más uniforme la cantidad de luz que realmente golpea la cámara, cuyo sonido es casi igual a la cantidad que golpea la pantalla del monitor, si la cámara está justo encima de ella. =)
Vinícius M


0

Si no tiene acceso a Internet, puede usar hdate:

hdate -s -l N50 -L E14 -z2

Salida:

Wednesday, 26 June 2019, 23 Sivan 5779

sunrise: 04:55

sunset: 21:17

-s puesta de sol salida del sol

-l -L Altitud y latitud de Praga (50 ° 05′N 14 ° 25′E)

-z zona SELC = + 2

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.