Ajustar automaticamente o brilho da tela com base no nascer e no pôr do sol


10

Existem perguntas e respostas semelhantes no Ask Ubuntu que apontam para estas soluções:

mas eles exigem a entrada manual do horário do nascer e do pôr do sol ou apenas ajustam o equilíbrio de cores e adicionam mais vermelho à noite.

Estou procurando uma solução que obtenha automaticamente os horários de nascer e pôr do sol todos os dias e ajuste fisicamente o brilho da tela. Além disso, eu quero um efeito de transição por um período de 60 a 120 minutos, para que eu não note a alteração na exibição.

A reconfiguração em dias nublados (mais escuro do lado de fora) ou quando o sol se põe entre dois prédios de três andares em vez de seus telhados (mais brilhante antes do pôr do sol) deve ser um processo rápido e fácil.

Respostas:


7

Post atualizado de 2019 - Eyesome

Eyesome é um script bash que funciona como um daemon e dorme a maior parte do tempo 24/7. Ele ajusta automaticamente o brilho da tela (e também opcionalmente gama) para a exibição do seu laptop via interface de hardware e até dois outros monitores usando o controle de software da xrandr.

Ao nascer do sol (a hora é obtida automaticamente da Internet todos os dias), o brilho da tela (e também opcionalmente gama) é ajustado gradualmente. O ajuste gradual é definido por você, mas 120 minutos funcionam para mim. Para manter os ajustes imperceptíveis, defina um intervalo de suspensão entre os ajustes. Qualquer lugar entre 15 e 60 segundos é provavelmente o melhor e o padrão é 60.

O daemon impressionante dorme muitas horas até o início da transição do pôr do sol. Inversamente à transição do nascer do sol, a transição do pôr do sol diminui gradualmente o brilho da tela (e, opcionalmente, também gama), tornando-a imperceptível. Recomenda-se 90 minutos antes do pôr do sol, mas você pode definir o período que desejar.

Durante a transição do pôr do sol, gama pode ser definida para aumentar. Por exemplo, gama vermelha pode ser definida como 1,0 durante o dia e 1,2 durante a noite para reduzir a fadiga ocular. A gama azul, por sua vez, pode ser definida como 1,0 durante o dia e 0,8 durante a noite, diminuindo.

Para reduzir recursos, alguns dormem o período inteiro entre as transições do pôr do sol e do nascer do sol. Há exceções únicas ao retomar a partir de monitores externos de suspensão ou conexão a quente. Depende de onde você mora e da estação do ano, mas a média de sono será de 12 horas.

Você pode baixar Eyesome no Github


Correio original de 2017

Introdução

Esta é uma solução bash sem a necessidade de instalar programas adicionais. Requer uma conexão com a Internet (se você estiver lendo isso, você tem um) para obter automaticamente os horários de nascer e pôr do sol todos os dias. Ele fornece uma tela de configuração amigável. Ele inicia automaticamente crone não requer interação do usuário.

Esta resposta está dividida em várias partes

  • Obter automaticamente os horários de nascer e pôr do sol todos os dias com cron
  • Definir configurações de brilho e tempo de transição
  • Script principal para ajustar o brilho com base na hora do dia
  • Inicie o brilho automático da tela automaticamente a cada inicialização com cron
  • Ajuste de brilho instantâneo / transparente retomado da suspensão
  • Sumário

Obter automaticamente horários do nascer e pôr do sol todos os dias com cron

Existem muitos sites para relatar os horários de nascer e pôr do sol para a sua localização. Este script usa ( https://www.timeanddate.com/ ), que é um site conhecido há muito tempo.

Com poderes sudo, edite o arquivo /usr/local/bin/sun-hourse cole-o:

#!/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 salvar o script, substitua as duas ocorrências de /canada/edmontoncom seu próprio país e cidade. Visite o site www.timeanddate.compara obter o nome ou número exato. Por exemplo, "Paris, EUA" possui dezenas de nomes, portanto eles contêm um número como /worldclock/@5205082"Paris, PA EUA".

Use cron para executar o script das horas de sol todos os dias

Com poderes sudo, edite o arquivo /etc/cron.daily/sun-hourse cole-o:

#!/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 os dois arquivos como executáveis ​​com sudo chmod a+x ___/sun-hoursonde "___" é o diretório de cada arquivo.

Use Conky para monitorar as mudanças de hora do nascer e do pôr do sol todos os dias

Conky é uma ferramenta popular para monitorar seu sistema. Aqui estão os comandos para exibir a configuração do nascer do sol, pôr do sol e brilho:

${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}

Isto é o que parece:

display-brilho automático conky

Nota: este código da Conky usa as intel_backlightquais você precisa alterar dependendo do seu adaptador de vídeo, conforme descrito nas seções abaixo.

Definir configurações de brilho e tempo de transição

Você não deseja que sua tela mude para brilho total ao nascer do sol e escuridão total ao pôr do sol. É necessário um período de transição. Além disso, é necessário um arquivo de configuração para registrar as variáveis ​​para brilho total e escurecimento total. Esta é a tela de configuração:

display-auto-brightness-config

A tela é construída usando o comando zenity padrão e, como tal, os valores existentes são mostrados nos rótulos com a tag "(value)" e você digita novos valores, se necessário. Caso contrário, os arquivos existentes serão mantidos quando novos valores estiverem em branco.

Substitua intel_backlightpelo seu driver de vídeo, se diferente. Para descobrir seu uso name: ls /sys/class/backlight/*/brightness.

Usando o sudo powers, crie o arquivo /usr/local/bin/auto-brightness-confige cole neste 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 o arquivo como executável usando:

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

Programa principal display-auto-brightness

Usando o sudo powers, crie o arquivo /usr/local/bin/display-auto-brightnesse cole neste 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 o arquivo como executável usando:

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

NOTA: Revisto sem êxito em 26 de agosto de 2017 para corrigir o erro em que o programa parava quando o último nível de brilho era igual ao brilho mínimo ou máximo e o valor de ajuste do minuto atual está em branco (zero). Corrigido com êxito em 2 de dezembro de 2017, mas não publicado até 17 de fevereiro de 2018. Opa!

Inicie o brilho automático da tela automaticamente a cada inicialização com cron

Cron é usado para iniciar o aplicativo principal a cada inicialização. Crie o arquivo /etc/cron.d/display-auto-brightnesscom poderes sudo e copie isto:

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 instantâneo do brilho retomado da suspensão

Você pode suspender o computador às 6 da manhã quando ele antes do sol nascer e sua configuração está em 300. Você pode retomá-lo às 4 da tarde, quando o sol é brilhante ea configuração deve ser 2000, mas você tem que esperar 1 a 59 segundos para display-auto-brightnessa redefina a exibição. Quando a tela é reiniciada, a mudança é dramática. Para resolver isso, systemdé necessário um script. Crie o arquivo que /lib/systemd/system-sleep/display-auto-brightnesscontém:

#!/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 o arquivo como executável usando:

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

Sumário

O nível de brilho atual da tela é systray

Além do exemplo de Conky apresentado anteriormente, o indicador-sysmonitor pode exibir o brilho atual na bandeja do sistema através do bash:

sistema de exibição com brilho automático

Neste exemplo de dispersão, o brilho é definido em 418cerca de 20 minutos antes do pôr do sol. Ao pôr do sol, o valor será 250 e o brilho total durante o dia é 1200. Nesta máquina, intel_backlight = 4882 é possível, mas, se você estiver dentro de casa com cortinas abertas, a tela será como olhar para o sol.

O indicador systray é configurado usando 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

Esta seção de perguntas e respostas ( O BASH pode ser exibido na bandeja do sistema como indicador de aplicativo? ) Descreve como configurar o sysmonitor de indicador.

Melhorias futuras

  • Migrando scripts bash para esta resposta no github
  • Adicionando suporte para monitores externos usando xrandr
  • Adicionando suporte para mais vermelho / menos azul usando xrandr

Ótimo post, mas você poderia me ajudar como entrar na tela para configurar a transição etc?
Marek Urbanowicz 08/11

@ MU Obrigado pelo seu amável comentário. Estou no processo de reformular o documento com as alterações Suspender / Reiniciar escritas há alguns meses. Além disso, em breve vou escrever o código híbrido WSL (Windows Subsystem for Linux). Também gostaria de abordar suas preocupações no novo documento. Você está tendo problemas para criar o /usr/local/bin/auto-brightness-configscript? Você está tendo problemas para identificar o /sys/class/backlight/??????/brightnessnome do driver? Gostaria de fazer deste um ótimo utilitário e sua pergunta é importante.
WinEunuuchs2Unix 9/17/17

Eu simplesmente não tenho idéia com base em seu post como obter a exibição Configuração Automática Brithness
Marek Urbanowicz

@MU copie o código acima para o /usr/local/bin/auto-brightness-configseu /usr/local/bindiretório em um arquivo chamado auto-brightness-config. Em seguida, no terminal, marque-o como executável chmod a+x /usr/local/bin/auto-brightness-config. Em seguida, execute o script no terminal digitando /usr/local/bin/auto-brightness-config. Você pode configurar um atalho na área de trabalho para o script para evitar a abertura de um terminal e digitar o nome do script.
WinEunuuchs2Unix 11/11

1
@dessert Finalmente configurei uma página do github para eyesomea próxima encarnação de display-auto-brightness: github.com/WinEunuuchs2Unix/eyesome Ela será atualizada frequentemente nas próximas semanas com documentação e aprimoramentos para interface.
WinEunuuchs2Unix 16/09

3

Acabei de escrever um programa que quase faz o que você está procurando. Ele altera o brilho da tela com base nas imagens captadas pela sua webcam para obter o brilho do ambiente. Você pode escolher o intervalo para detectar o brilho e a velocidade de escurecimento sozinho.

https://github.com/Wandersalamander/Dimmer


1
Soa como uma ótima idéia para a maioria das pessoas - exceto para aqueles com fita adesiva na webcam ... #
WinEunuuchs2Unix 17/17/17 /

1
@ WinEunuuchs2Unix Mesmo para os 'preocupados' com fita adesiva na câmera, pode ser ótimo! Você não precisa cobrir a webcam com fita preta para tornar as capturas inúteis - um pedaço de papel branco atinge praticamente o mesmo efeito de anonimato e ainda mantém a capacidade da câmera de medir o brilho da sala. De fato, a folha de papel poderia melhorá-la, uma vez que mediria mais uniformemente a quantidade de luz que realmente atinge a câmera, que soa aproximadamente a mesma que atinge a tela do monitor, se a câmera estiver logo acima dela. =)
Vinícius M


0

Se você não tiver acesso à Internet, poderá usar o hdate:

hdate -s -l N50 -L E14 -z2

Resultado:

Wednesday, 26 June 2019, 23 Sivan 5779

sunrise: 04:55

sunset: 21:17

-s nascer do sol

-l -L Altitude e latitude de Praga (50 ° 05′N 14 ° 25′E)

-z zona SELC = + 2

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.