Ajustez automatiquement la luminosité de l'écran en fonction du lever et du coucher du soleil

10

Il existe des questions et réponses similaires dans Ask Ubuntu qui pointent vers ces solutions:

mais ils nécessitent soit la saisie manuelle des heures de lever et de coucher du soleil, soit ils ajustent simplement l'équilibre des couleurs et ajoutent plus de rouge la nuit.

Je recherche une solution qui obtient automatiquement les heures de lever et de coucher du soleil chaque jour et ajuste physiquement la luminosité de l'écran. De plus je veux un effet de transition sur une période de 60 à 120 minutes donc je ne remarque pas le changement d'affichage.

La reconfiguration les jours nuageux (gradateur à l'extérieur) ou lorsque le soleil se couche entre deux bâtiments de trois étages au lieu de leurs toits (plus lumineux avant le coucher du soleil) devrait être un processus rapide et facile.

WinEunuuchs2Unix
la source

Réponses:

7

Message mis à jour à partir de 2019 - Eyesome

Eyesome est un script bash fonctionnant comme démon et dormant la plupart du temps 24h / 24 et 7j / 7. Il ajuste automatiquement la luminosité de l'écran (et éventuellement le gamma aussi) pour l'affichage de votre ordinateur portable via l'interface matérielle et jusqu'à deux autres moniteurs à l'aide du contrôle logiciel de xrandr.

Au lever du soleil (l'heure est automatiquement obtenue sur Internet chaque jour), la luminosité de votre écran (et éventuellement le gamma aussi) est ajustée progressivement. L'ajustement progressif est défini par vous mais, 120 minutes me conviennent. Pour garder les réglages imperceptibles, définissez un intervalle de sommeil entre les réglages. N'importe où entre 15 et 60 secondes est probablement le meilleur et la valeur par défaut est 60.

Le démon génial dort de nombreuses heures jusqu'au début de la transition au coucher du soleil. Inversement à la transition au lever du soleil, la transition au coucher du soleil diminue progressivement la luminosité de l'écran (et éventuellement le gamma aussi) de sorte qu'elle est imperceptible. 90 minutes avant le coucher du soleil est recommandé mais vous pouvez définir n'importe quelle période que vous aimez.

Pendant le coucher du soleil, le gamma peut être défini pour augmenter. Par exemple, le gamma rouge peut être défini comme 1,0 pendant le jour et 1,2 pendant la nuit pour réduire la fatigue oculaire. Le gamma bleu à son tour peut être défini comme 1,0 pendant le jour et 0,8 pendant la nuit, il diminuera donc à la place.

Pour réduire les ressources, un sommeil somnolent pendant toute la période entre les transitions du coucher et du lever du soleil. Il existe des exceptions uniques lors de la reprise de la suspension ou de la connexion à chaud de moniteurs externes. Cela dépend de l'endroit où vous vivez et de la saison de l'année, mais le sommeil moyen sera de 12 heures.

Vous pouvez télécharger Eyesome depuis Github


Message original de 2017

introduction

C'est une solution bash sans avoir besoin d'installer de programmes supplémentaires. Il nécessite une connexion Internet (si vous lisez ceci, vous en avez une) pour obtenir automatiquement les heures de lever et de coucher du soleil chaque jour. Il fournit un écran de configuration convivial. Il démarre automatiquement avec cronet ne nécessite aucune interaction de l'utilisateur.

Cette réponse est divisée en plusieurs parties

  • Obtenez automatiquement les heures de lever et de coucher du soleil chaque jour avec cron
  • Configurer les paramètres de luminosité et le temps de transition
  • Script principal pour régler la luminosité en fonction de l'heure de la journée
  • Démarrez automatiquement l'affichage-luminosité à chaque démarrage avec cron
  • Réglage instantané / transparent de la luminosité reprenant la suspension
  • Résumé

Obtenez automatiquement les heures de lever et de coucher du soleil chaque jour avec cron

Il existe de nombreux sites Web pour signaler les heures de lever et de coucher du soleil pour votre emplacement. Ce script utilise ( https://www.timeanddate.com/ ) qui est un site bien connu depuis longtemps.

Avec les pouvoirs sudo, éditez le fichier /usr/local/bin/sun-hourset collez ceci:

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

Avant d'enregistrer le script, remplacez les deux occurrences de /canada/edmontonpar votre propre pays et ville. Visitez le site www.timeanddate.compour obtenir le nom ou le numéro exact. Par exemple, "Paris, USA" a des dizaines de noms, donc ils contiendront un numéro tel que /worldclock/@5205082"Paris, PA USA".

Utilisez cron pour exécuter le script sun-hours chaque jour

Avec les pouvoirs sudo, éditez le fichier /etc/cron.daily/sun-hourset collez ceci:

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

Marquez les deux fichiers comme exécutables avec sudo chmod a+x ___/sun-hoursoù "___" est le répertoire de chaque fichier.

Utilisez Conky pour surveiller les changements d'heure du lever / coucher du soleil chaque jour

Conky est un outil populaire pour surveiller votre système. Voici les commandes pour afficher le réglage du lever, du coucher du soleil et de la 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}

Voici à quoi ça ressemble:

affichage-auto-luminosité conky

Remarque: ce code Conky utilise intel_backlightque vous devez modifier en fonction de votre carte graphique, comme décrit dans les sections ci-dessous.

Configurer les paramètres de luminosité et le temps de transition

Vous ne voulez pas que votre écran passe en pleine luminosité au lever du soleil et en pleine luminosité au coucher du soleil. Une période de transition est nécessaire. De plus, un fichier de configuration est requis pour enregistrer les variables de pleine luminosité et de pleine luminosité. Voici l'écran de configuration:

affichage-auto-luminosité-config

L'écran est construit à l'aide de la commande de zénité standard et en tant que telles, les valeurs existantes sont affichées dans les étiquettes avec la balise "(valeur)" et vous saisissez de nouvelles valeurs si nécessaire. Sinon, les fichiers existants sont conservés lorsque les nouvelles valeurs sont vides.

Remplacez-le intel_backlightpar votre pilote d'affichage s'il est différent. Pour connaître votre utilisation du nom: ls /sys/class/backlight/*/brightness.

En utilisant les pouvoirs sudo, créez le fichier /usr/local/bin/auto-brightness-configet collez-le dans ce code:

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

Marquez le fichier comme exécutable en utilisant:

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

Programme principal display-auto-brightness

En utilisant les pouvoirs sudo, créez le fichier /usr/local/bin/display-auto-brightnesset collez-le dans ce code:

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

Marquez le fichier comme exécutable en utilisant:

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

REMARQUE: le 26 août 2017 a été révisé sans succès pour corriger le bogue où le programme s'arrêtait lorsque le dernier niveau de luminosité était égal à la luminosité minimale ou maximale et la valeur de réglage de la minute actuelle est vide (zéro). Fixé avec succès le 2 décembre 2017 mais pas publié avant le 17 février 2018. Oups!

Démarrez automatiquement l'affichage-luminosité à chaque démarrage avec cron

Cron est utilisé pour démarrer l'application principale à chaque démarrage. Créez le fichier /etc/cron.d/display-auto-brightnessavec les pouvoirs sudo et copiez-le:

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

Réglage instantané de la luminosité reprenant la suspension

Vous pouvez suspendre votre ordinateur à 6 heures quand avant le lever du soleil et le réglage est à 300. Vous pouvez la reprendre à 16 heures quand le soleil est lumineux et le réglage doit être 2000 , mais vous devez attendre 1 à 59 secondes display-auto-brightnessà réinitialiser l'affichage. Lorsque l'affichage se réinitialise, le changement est spectaculaire. Pour résoudre ce problème, un systemdscript est nécessaire. Créez le fichier /lib/systemd/system-sleep/display-auto-brightnesscontenant:

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

Marquez le fichier comme exécutable en utilisant:

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

Résumé

L'affichage du niveau de luminosité actuel est systray

En plus de l'exemple Conky présenté plus tôt, indicateur-sysmonitor, vous pouvez afficher la luminosité actuelle dans le systray via bash:

affichage-auto-luminosité systray

Dans cet exemple systray, la luminosité est réglée sur 418et c'est environ 20 minutes avant le coucher du soleil. Au coucher du soleil, la valeur sera de 250 et la luminosité maximale pendant la journée est de 1200. Sur cette machine, intel_backlight = 4882 est possible, mais si vous êtes à l'intérieur avec des rideaux ouverts, l'écran est comme regarder le soleil.

L'indicateur systray est configuré à l'aide de ce code:

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

Ce Q&A ( BASH peut-il s'afficher dans la barre d'état système en tant qu'indicateur d'application? ) Décrit comment configurer l'indicateur-sysmonitor.

Améliorations futures

  • Migration des scripts bash pour cette réponse à github
  • Ajout de la prise en charge des moniteurs externes à l'aide xrandr
  • Ajout du support pour plus de rouge / moins de bleu en utilisant xrandr
WinEunuuchs2Unix
la source
Excellent article, mais pourriez-vous m'aider à accéder à l'écran pour configurer la transition, etc.?
Marek Urbanowicz,
@MU Merci pour votre aimable commentaire. Je suis en train de réorganiser le document avec des modifications de suspension / reprise écrites il y a quelques mois. De plus, j'écrirai bientôt du code hybride WSL (Windows Subsystem for Linux). Je voudrais également faire part de vos préoccupations dans le nouveau document. Vous rencontrez des problèmes pour créer le /usr/local/bin/auto-brightness-configscript? Vous rencontrez des problèmes pour identifier le /sys/class/backlight/??????/brightnessnom du pilote? J'aimerais en faire un excellent utilitaire et votre question est importante.
WinEunuuchs2Unix
Je n'ai juste aucune idée sur la base de votre message comment obtenir la configuration d'affichage Auto Brithness
Marek Urbanowicz
@MU copiez le code ci-dessus pour /usr/local/bin/auto-brightness-configdans votre /usr/local/binrépertoire dans un fichier nommé auto-brightness-config. Puis, depuis le terminal, marquez-le comme exécutable chmod a+x /usr/local/bin/auto-brightness-config. Exécutez ensuite le script à partir du terminal en tapant /usr/local/bin/auto-brightness-config. Vous pouvez configurer un raccourci de bureau vers le script pour éviter d'ouvrir un terminal et de taper le nom du script.
WinEunuuchs2Unix
1
@dessert J'ai enfin configuré une page github pour eyesomela prochaine incarnation de display-auto-brightness: github.com/WinEunuuchs2Unix/eyesome Elle sera mise à jour fréquemment au cours des prochaines semaines avec de la documentation et des améliorations à l'interface.
WinEunuuchs2Unix
3

Je viens d'écrire un programme qui fait presque ce que vous cherchez. Il modifie la luminosité de l'écran en fonction des images prises par votre webcam pour obtenir la luminosité environnante. Vous pouvez choisir vous-même l'intervalle de détection de la luminosité et de la vitesse de variation.

https://github.com/Wandersalamander/Dimmer

wandersalamander
la source
1
Cela semble être une excellente idée pour la plupart des gens - sauf ceux d'entre nous qui ont du ruban adhésif sur webcam ...
WinEunuuchs2Unix
1
@ WinEunuuchs2Unix Même pour les «concernés» avec du ruban adhésif sur la caméra, cela peut être génial! Vous n'avez pas besoin de couvrir la webcam avec du ruban noir pour rendre les captures inutiles - un morceau de papier blanc obtient à peu près le même effet d'anonymat et conserve la capacité de l'appareil photo à mesurer la luminosité de la pièce. En fait, la feuille de papier pourrait effectivement l'améliorer, car elle mesurerait plus uniformément la quantité de lumière qui frappe réellement la caméra, qui sonne à peu près la même que celle qui frappe l'écran du moniteur, si la caméra est juste au-dessus. =)
Vinícius M
0

Si vous n'avez pas accès à Internet, vous pouvez utiliser hdate:

hdate -s -l N50 -L E14 -z2

Production:

Wednesday, 26 June 2019, 23 Sivan 5779

sunrise: 04:55

sunset: 21:17

-s coucher de soleil lever du soleil

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

-z zone SELC = + 2

xerostomus
la source