Regola automaticamente la luminosità del display in base all'alba e al tramonto


10

Ci sono domande e risposte simili in Ask Ubuntu che indicano queste soluzioni:

ma richiedono l'immissione manuale delle ore di alba e tramonto o semplicemente regolano il bilanciamento del colore e aggiungono più rosso durante la notte.

Sto cercando una soluzione che ottenga automaticamente i tempi di alba e tramonto ogni giorno e regoli fisicamente la luminosità del display. Inoltre, voglio un effetto di transizione per un periodo da 60 a 120 minuti, quindi non noto il cambiamento del display.

La riconfigurazione nei giorni nuvolosi (più fioco all'esterno) o quando il sole tramonta tra due edifici a tre piani anziché i loro tetti (più luminosi prima del tramonto) dovrebbe essere un processo semplice e veloce.

Risposte:


7

Post aggiornato dal 2019 - Fantastico

Eyesome è uno script bash che gira come un demone e dorme per la maggior parte del tempo 24 ore su 24, 7 giorni su 7. Regola automaticamente la luminosità dello schermo (e facoltativamente anche la gamma) per il display del tuo laptop tramite interfaccia hardware e fino a altri due monitor utilizzando il controllo software di xrandr.

All'alba (l'ora viene automaticamente ottenuta da Internet ogni giorno), la luminosità dello schermo (e facoltativamente anche la gamma) viene regolata gradualmente. La regolazione graduale è definita da te ma 120 minuti funzionano per me. Per mantenere le regolazioni impercettibili, impostare un intervallo di sospensione tra le regolazioni. È preferibile un intervallo compreso tra 15 e 60 secondi e il valore predefinito è 60.

Il fantastico demone dorme molte ore prima dell'inizio della transizione al tramonto. Inversamente alla transizione all'alba, la transizione al tramonto riduce gradualmente la luminosità dello schermo (e facoltativamente anche la gamma), quindi è impercettibile. Si consiglia 90 minuti prima del tramonto, ma è possibile impostare qualsiasi periodo desiderato.

Durante la transizione al tramonto è possibile definire la gamma per aumentare. Ad esempio, la gamma rossa può essere definita come 1,0 durante il giorno e 1,2 durante la notte per ridurre l'affaticamento degli occhi. A sua volta, la gamma blu può essere definita come 1.0 durante il giorno e .8 durante la notte, quindi diminuirà invece.

Per ridurre le risorse, il sonno dormiente durante tutto il periodo tra le transizioni del tramonto e dell'alba. Ci sono eccezioni una volta quando si riprende da sospendere o collegare a caldo monitor esterni. Dipende da dove vivi e dalla stagione dell'anno, ma il sonno medio sarà di 12 ore.

Puoi scaricare Eyesome da Github


Post originale dal 2017

introduzione

Questa è una soluzione bash senza la necessità di installare programmi aggiuntivi. Richiede una connessione a Internet (se stai leggendo questo ne hai uno) per ottenere automaticamente gli orari di alba e tramonto ogni giorno. Fornisce una schermata di configurazione intuitiva. Si avvia automaticamente con crone non richiede interazione da parte dell'utente.

Questa risposta è divisa in più parti

  • Ottieni automaticamente orari di alba e tramonto ogni giorno con cron
  • Configura le impostazioni di luminosità e il tempo di transizione
  • Script principale per regolare la luminosità in base all'ora del giorno
  • Avvia automaticamente display-auto-luminosità ad ogni avvio cron
  • La regolazione della luminosità istantanea / trasparente riprende dalla sospensione
  • Sommario

Ottieni cronologicamente l'ora dell'alba e del tramonto ogni giorno

Esistono molti siti Web per segnalare l'orario di alba e tramonto per la tua posizione. Questo script utilizza ( https://www.timeanddate.com/ ) che è stato un sito ben noto per molto tempo.

Con i poteri sudo modifica il file /usr/local/bin/sun-hourse incollalo:

#!/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

Prima di salvare la sceneggiatura, sostituisci le due occorrenze /canada/edmontoncon il tuo paese e la tua città. Visita il sito www.timeanddate.comper ottenere il nome o il numero esatti. Ad esempio, "Parigi, USA" ha dozzine di nomi, quindi conterrà un numero come /worldclock/@5205082"Parigi, Stati Uniti d'America".

Usa cron per eseguire lo script dell'ora solare ogni giorno

Con i poteri sudo modifica il file /etc/cron.daily/sun-hourse incollalo:

#!/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

Contrassegnare entrambi i file come eseguibili con sudo chmod a+x ___/sun-hours"___" come directory per ciascun file.

Utilizzare Conky per monitorare le variazioni di ora di alba / tramonto ogni giorno

Conky è uno strumento popolare per il monitoraggio del sistema. Ecco i comandi per visualizzare le impostazioni di alba, tramonto e luminosità:

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

Ecco come appare:

display-auto-luminosità conky

Nota: questo codice Conky utilizza ciò intel_backlightche è necessario modificare a seconda della scheda di visualizzazione come descritto nelle sezioni seguenti.

Configura le impostazioni di luminosità e il tempo di transizione

Non vuoi che il tuo display cambi alla piena luminosità all'alba e alla penombra al tramonto. È necessario un periodo di transizione. Inoltre è necessario un file di configurazione per registrare le variabili per la massima luminosità e luminosità. Questa è la schermata di configurazione:

Display-auto-luminosità-config

La schermata viene creata utilizzando il comando zenity standard e pertanto i valori esistenti vengono visualizzati nelle etichette con il tag "(valore)" e, se necessario, si digitano nuovi valori. Altrimenti i file esistenti vengono mantenuti quando i nuovi valori sono vuoti.

Sostituire intel_backlightcon il driver dello schermo se diverso. Per scoprire il vostro uso nome: ls /sys/class/backlight/*/brightness.

Utilizzando i poteri sudo, crea il file /usr/local/bin/auto-brightness-confige incolla questo codice:

#!/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

Contrassegna il file come eseguibile utilizzando:

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

Programma principale display-auto-brightness

Utilizzando i poteri sudo, crea il file /usr/local/bin/display-auto-brightnesse incolla questo codice:

#!/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

Contrassegna il file come eseguibile utilizzando:

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

NOTA: Revisionata senza successo il 26 agosto 2017 per correggere l'errore in cui il programma si fermava quando l'ultimo livello di luminosità era uguale alla luminosità minima o massima e il valore di regolazione del minuto corrente è vuoto (zero). Risolto con successo il 2 dicembre 2017 ma non pubblicato fino al 17 febbraio 2018. Ops!

Avvia automaticamente display-auto-luminosità ad ogni avvio cron

Cron viene utilizzato per avviare l'applicazione principale ad ogni avvio. Crea il file /etc/cron.d/display-auto-brightnesscon i poteri sudo e copia in questo:

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

La regolazione istantanea della luminosità riprende dalla sospensione

È possibile sospendere il computer alle 6 del mattino, quando prima che il sole sorge e la vostra impostazione è a 300. È possibile riprenderla alle 4 del pomeriggio, quando il sole è luminoso e la regolazione dovrebbe essere 2000, ma bisogna aspettare 1 a 59 secondi per display-auto-brightnessa resettare il display. Quando il display si resetta, la modifica è drammatica. Per risolvere questo systemdè necessario uno script. Crea il file /lib/systemd/system-sleep/display-auto-brightnesscontenente:

#!/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

Contrassegna il file come eseguibile utilizzando:

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

Sommario

Visualizza il livello di luminosità corrente è systray

Oltre all'esempio Conky presentato in precedenza, indicatore-sysmonitor è possibile visualizzare la luminosità corrente nel systray tramite bash:

display-auto-luminosità systray

In questo esempio di systray la luminosità è impostata su 418ed è circa 20 minuti prima del tramonto. Al tramonto il valore sarà 250 e la piena luminosità diurna è 1200. Su questa macchina è possibile intel_backlight = 4882 ma, se sei in casa con le tende aperte, lo schermo è come fissare il sole.

L'indicatore systray è configurato utilizzando questo codice:

#!/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

Questo D&R ( BASH può essere visualizzato nel systray come indicatore dell'applicazione? ) Descrive come impostare l'indicatore-sysmonitor.

Miglioramenti futuri

  • Migrazione degli script bash per questa risposta a github
  • Aggiunta del supporto per monitor esterni tramite xrandr
  • Aggiunta del supporto per più rosso / meno blu usando xrandr

Ottimo post ma potresti aiutarmi come accedere allo schermo per configurare la transizione ecc.?
Marek Urbanowicz,

@MU Grazie per il tuo gentile commento. Sono in procinto di rinnovare il documento con le modifiche Suspend / Resume scritte un paio di mesi fa. Inoltre scriverò presto il codice ibrido WSL (sottosistema Windows per Linux). Vorrei rivolgere le tue preoccupazioni anche nel nuovo documento. Stai riscontrando problemi nella creazione dello /usr/local/bin/auto-brightness-configscript? Stai riscontrando problemi nell'identificare il /sys/class/backlight/??????/brightnessnome del driver? Vorrei renderlo una grande utilità e la tua domanda è importante.
WinEunuuchs2Unix

Non ho idea, in base al tuo post, come ottenere la configurazione di visualizzazione automatica Brithness
Marek Urbanowicz,

@MU copia il codice sopra riportato /usr/local/bin/auto-brightness-confignella tua /usr/local/bindirectory in un file chiamato auto-brightness-config. Quindi dal terminale contrassegnare con eseguibile chmod a+x /usr/local/bin/auto-brightness-config. Quindi eseguire lo script dal terminale digitando /usr/local/bin/auto-brightness-config. È possibile impostare un collegamento sul desktop per lo script per evitare di aprire un terminale e digitare il nome dello script.
WinEunuuchs2Unix

1
@dessert Ho finalmente impostato una pagina github per eyesomela prossima incarnazione di display-auto-brightness: github.com/WinEunuuchs2Unix/eyesome Verrà aggiornato frequentemente nelle prossime settimane con documentazione e perfezionamenti da interfacciare.
WinEunuuchs2Unix

3

Ho appena scritto un programma che fa quasi quello che stai cercando. Cambia la luminosità dello schermo in base alle immagini riprese dalla tua webcam per ottenere la luminosità circostante. Puoi scegliere da solo l'intervallo per rilevare la luminosità e la velocità di regolazione.

https://github.com/Wandersalamander/Dimmer


1
Sembra un'ottima idea per la maggior parte delle persone - tranne quelle di noi con nastro adesivo su webcam ...
WinEunuuchs2Unix

1
@ WinEunuuchs2Unix Anche per quelli "preoccupati" con nastro adesivo sulla camma può essere fantastico! Non è necessario coprire la webcam con nastro adesivo nero per rendere inutili le acquisizioni: un pezzo di carta bianca ottiene praticamente lo stesso effetto di anonimato e mantiene la capacità della fotocamera di misurare la luminosità della stanza. In effetti il ​​foglio di carta potrebbe effettivamente migliorarlo, poiché misurerebbe in modo più uniforme la quantità di luce che colpisce effettivamente la fotocamera, il cui suono sarà circa uguale alla quantità che colpisce lo schermo del monitor, se la fotocamera si trova proprio sopra di essa. =)
Vinícius M,


0

Se non si dispone di un accesso a Internet, è possibile utilizzare hdate:

hdate -s -l N50 -L E14 -z2

Produzione:

Wednesday, 26 June 2019, 23 Sivan 5779

sunrise: 04:55

sunset: 21:17

-s alba al tramonto

-l -L Altitudine e latitudine di Praga (50 ° 05′N 14 ° 25′E)

-z zona SELC = + 2

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.