web-dev-qa-db-ja.com

日の出と日没に基づいてディスプレイの輝度を自動的に調整します

これらのソリューションを指すUbuntuにも同様の質問と回答があります:

ただし、日の出と日没の時間を手動で入力するか、カラーバランスを調整して夜に赤を追加するだけです。

毎日日の出と日の入り時刻を自動的に取得し、ディスプレイの明るさを物理的に調整するソリューションを探しています。さらに、60〜120分間の移行効果が必要なので、表示の変更に気付きません。

曇りの日(屋外での調光)または屋根が屋根の代わりに2つの3階建ての建物の間に沈むとき(日没前に明るくなる)の再構成は、迅速かつ簡単なプロセスです。

10

2019年から投稿を更新-Eyesome

Eyesomeは、デーモンとして実行され、ほとんどの時間、24時間年中無休で動作するbashスクリプトです。 xrandrのソフトウェアコントロールを使用して、ハードウェアインターフェイスと最大2つのモニターを介して、ラップトップディスプレイの画面の明るさ(およびオプションでガンマも)を自動的に調整します。

日の出時には(毎日インターネットから時刻が自動的に取得されます)、画面の明るさ(およびオプションでガンマも)が徐々に調整されます。段階的な調整はユーザーが定義しますが、120分で十分です。調整が目立たないようにするには、調整間のスリープ間隔を設定します。おそらく15秒から60秒の間が最適で、デフォルトは60秒です。

Eyesomeデーモンは、日没移行が始まるまで何時間もスリープします。日の出の遷移とは逆に、日没の遷移は画面の明るさを徐々に低下させます(オプションでガンマも低下させます)。日没の90分前が推奨されますが、好きな期間を設定できます。

日没移行時、ガンマは増加するように定義されます。たとえば、目の疲れを軽減するために、レッドガンマは日中は1.0、夜間は1.2と定義できます。青色のガンマは、日中は1.0、夜間は0.8と定義されるため、代わりに減少します。

リソースを削減するために、目障りな人は日没から日の出への移行の間の全期間スリープします。外部モニタのサスペンドまたはホットプラグからの再開には、1回限りの例外があります。それはあなたが住んでいる場所と一年の季節に依存しますが、平均睡眠は12時間になります。

ダウンロードできます GithubのEyesome


2017年の最初の投稿

前書き

これは、追加のプログラムをインストールする必要のないbashソリューションです。毎日自動的に日の出時刻と日没時刻を取得するには、インターネット接続が必要です(これを読んでいる場合は、インターネット接続が必要です)。ユーザーフレンドリーな設定画面を提供します。 cronで自動的に起動し、ユーザーの操作は必要ありません。

この答えは複数の部分に分かれています

  • cronを使用して、毎日日の出時刻と日没時刻を自動的に取得します
  • 輝度設定と遷移時間を構成する
  • 時刻に基づいて明るさを調整するメインスクリプト
  • cronで起動するたびにdisplay-auto-brightnessを自動的に開始します
  • サスペンドから再開するインスタント/透明な輝度調整
  • 概要

Cronで毎日日の出時刻と日没時刻を自動的に取得します

あなたの場所の日の出と日没の時間を報告する多くのウェブサイトがあります。このスクリプトは( https://www.timeanddate.com/ )を使用します。これは長い間有名なサイトでした。

Sudo powersを使用して、ファイル/usr/local/bin/Sun-hoursを編集し、これを貼り付けます。

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

スクリプトを保存する前に、/canada/edmontonの2つの出現箇所を自分の国と都市に置き換えます。サイトwww.timeanddate.comにアクセスして、正確な名前または番号を取得してください。たとえば、「Paris、USA」には何十もの名前があるため、「Paris、PA USA」の場合は/worldclock/@5205082などの番号が含まれます。

Cronを使用して毎日日曜日のスクリプトを実行する

Sudo powersを使用して、ファイル/etc/cron.daily/Sun-hoursを編集し、これを貼り付けます。

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

Sudo chmod a+x ___/Sun-hoursで両方のファイルを実行可能としてマークします。ここで、「___」は各ファイルのディレクトリです。

Conkyを使用して、毎日日の出/日の入りの変化を監視します

Conkyは、システムを監視するための一般的なツールです。日の出、日没、明るさの設定を表示するコマンドは次のとおりです。

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

これは次のようになります。

display-auto-brightness conky

注:このConkyコードはintel_backlightを使用します。これは、以下のセクションで説明するように、ディスプレイアダプターに応じて変更する必要があります。

輝度設定と遷移時間を構成する

日の出時にはディスプレイを完全な明るさに、日没時には完全な薄暗さに変えたくありません。移行期間が必要です。さらに、完全な明るさと完全な暗さの変数を記録するには、構成ファイルが必要です。これは設定画面です:

display-auto-brightness-config

画面は標準zenityコマンドを使用して構築されるため、既存の値は「(value)」タグ付きのラベルに表示され、必要に応じて新しい値を入力します。それ以外の場合、新しい値が空白の場合、既存のファイルは保持されます。

異なる場合は、intel_backlightをディスプレイドライバーに置き換えます。名前を調べるには、ls /sys/class/backlight/*/brightnessを使用します。

Sudo powersを使用して、ファイル/usr/local/bin/auto-brightness-configを作成し、次のコードに貼り付けます。

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

次を使用して、ファイルを実行可能としてマークします。

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

メインプログラムdisplay-auto-brightness

Sudo powersを使用して、ファイル/usr/local/bin/display-auto-brightnessを作成し、次のコードに貼り付けます。

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

次を使用して、ファイルを実行可能としてマークします。

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

注:最後の輝度レベルが最小または最大輝度に等しく、現在の分の調整値が空白(ゼロ)。 2017年12月2日に正常に修正されましたが、2018年2月17日まで公開されませんでした。

cronで起動するたびにdisplay-auto-brightnessを自動的に開始します

Cronは、起動するたびにメインアプリケーションを起動するために使用されます。 Sudo powersを使用してファイル/etc/cron.d/display-auto-brightnessを作成し、これをコピーします。

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

サスペンドから再開するインスタント輝度調整

太陽が昇る前の午前6時にコンピューターをサスペンドでき、設定は300です。太陽が明るく設定が2000になるはずの午後4時にコンピューターを再開できますが、display-auto-brightnessには1〜59秒待つ必要があります。ディスプレイをリセットします。ディスプレイがリセットされると、変化は劇的です。これを解決するには、systemdスクリプトが必要です。以下を含むファイル/lib/systemd/system-sleep/display-auto-brightnessを作成します。

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

次を使用して、ファイルを実行可能としてマークします。

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

概要

ディスプレイの現在の輝度レベルはsystrayです

前に示したConkyの例(indicator-sysmonitor)に加えて、bashを介してシステムトレイに現在の明るさを表示できます。

display-auto-brightness systray

このシステムトレイの例では、輝度は418に設定されており、日没の約20分前です。日没時の値は250で、昼間の最大輝度は1200です。このマシンではintel_backlight = 4882が可能ですが、カーテンが開いている屋内では、画面は太陽を見つめているようなものです。

システムトレイインジケータは、次のコードを使用してセットアップされます。

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

このQ&A( アプリケーションインジケーターとしてシステムトレイにBASHを表示できますか? )は、インジケーターsysmonitorのセットアップ方法を説明しています。

今後の機能強化

  • この回答のbashスクリプトをgithubに移行する
  • xrandrを使用した外部モニターのサポートの追加
  • xrandrを使用して、より多くの赤/より少ない青のサポートを追加します
7

私はちょうどあなたが探しているものをほぼ実行するプログラムを書きました。 Webカメラで撮影した画像に基づいて画面の明るさを変更し、周囲の明るさを取得します。明るさを検出する間隔と調光速度を自分で選択できます。

https://github.com/Wandersalamander/Dimmer

3

このスクリプトは、ウェブカメラの画像データに基づいてディスプレイのバックライトの明るさを調整します。たぶんこれはあなたの問題を解決するのに役立ちます。

https://github.com/unxed/brightness.sh/blob/master/backlight.sh

0
unxed

インターネットにアクセスできない場合は、hdateを使用できます。

hdate -s -l N50 -L E14 -z2

出力:

Wednesday, 26 June 2019, 23 Sivan 5779

sunrise: 04:55

sunset: 21:17

-s日の出日の入り

-l -Lプラハの高度と緯度(50°05′N 14°25′E)

-zゾーンSELC = + 2

0
xerostomus