日の出と日の入りに基づいてディスプレイの明るさを自動調整


10

Ask Ubuntuには、これらのソリューションを指摘する同様の質問と回答があります。

しかし、日の出と日の入り時刻を手動で入力する必要があるか、カラーバランスを調整して夜に赤を追加するだけです。

毎日日の出時刻と日の入り時刻を自動的に取得し、ディスプレイの明るさを物理的に調整するソリューションを探しています。さらに、ディスプレイの変化に気付かないように、60〜120分のトランジションエフェクトが必要です。

曇りの日(屋外の調光器)や、2つの3階建ての建物の間に、屋根ではなく(日没前に明るく)太陽が沈むときに再構成するのは、すばやく簡単なプロセスです。

回答:


7

2019年からの更新された投稿-Eyesome

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

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

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

日没の移行中、ガンマは増加するように定義できます。たとえば、赤のガンマは、目の疲労を軽減するために、日中は1.0、夜間は1.2と定義できます。次に、青いガンマは、日中は1.0、夜間は.8と定義されるため、代わりに減少します。

リソースを削減するために、目を見張るようなものは、日没から日の出への移行の間の全期間を眠ります。一時停止または外部モニターのホットプラグから再開する場合、1回限りの例外があります。お住まいの地域や季節によって異なりますが、平均睡眠時間は12時間です。

EyesomeはGithubからダウンロードできます。


2017年の元の投稿

前書き

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

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

  • 自動的に毎日日の出と日の入り時刻を取得します cron
  • 明るさの設定と移行時間を構成する
  • 時刻に基づいて明るさを調整するメインスクリプト
  • 起動ごとに自動的にディスプレイ自動輝度を開始します cron
  • 一時停止から再開する瞬時/透過の明るさ調整
  • 概要

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

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

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}

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

ディスプレイ自動輝度コンキー

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

明るさの設定と移行時間を構成する

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

display-auto-brightness-config

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

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年8月26日の改訂に失敗しました。2017年12月2日に修正されましたが、2018年2月17日まで公開されていません。

起動ごとに自動的にディスプレイ自動輝度を開始します cron

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

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

サスペンドから再開する瞬時の明るさ調整

あなたはそれが太陽が昇る前に、あなたの設定が300であるとき、太陽が明るく、設定は2000であるべきときには午後4時でそれを再開することができます午前6時に、コンピュータを中断することができますが、ため1〜59秒を待たなければならないdisplay-auto-brightnessとディスプレイをリセットします。ディスプレイがリセットされると、変化は劇的です。これを解決するには、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

概要

ディスプレイの現在の輝度レベルはシステムトレイです

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

ディスプレイ自動輝度システムトレイ

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

systrayインジケーターは、次のコードを使用して設定されます。

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

素晴らしい投稿ですが、遷移を構成するために画面に入る方法を教えてくれませんか?
Marek Urbanowicz 2017年

@MU親切なコメントをありがとう。数か月前に書かれたSuspend / Resumeの変更でドキュメントを改訂しているところです。さらに、WSL(Linux用Windowsサブシステム)ハイブリッドコードもまもなく作成します。新しいドキュメントでもあなたの懸念に対応したいと思います。/usr/local/bin/auto-brightness-configスクリプトの作成に問題がありますか?/sys/class/backlight/??????/brightnessドライバー名の特定に問題がありますか?これをすばらしいユーティリティにしたいのですが、あなたの質問は重要です。
WinEunuuchs2Unix 2017年

私はちょうど画面の自動Brithness設定を取得する方法をあなたのポストに基づいて見当がつかない
マレクUrbanowicz

@MUは、上記のコードを、という名前のファイルのディレクトリにコピー/usr/local/bin/auto-brightness-configします。次に、ターミナルからそれを実行可能としてマークします。次に、ターミナルからと入力してスクリプトを実行します。スクリプトへのデスクトップショートカットを設定して、ターミナルを開いたり、スクリプト名を入力したりする必要がなくなります。/usr/local/binauto-brightness-configchmod a+x /usr/local/bin/auto-brightness-config/usr/local/bin/auto-brightness-config
WinEunuuchs2Unix 2017

1
@dessert私はついにeyesome次の化身のためのgithubページをセットアップしましたdisplay-auto-brightnessgithub.com/WinEunuuchs2Unix/eyesomeこれは、ドキュメントとインターフェイスの改良により、今後数週間にわたって頻繁に更新されます。
WinEunuuchs2Unix 2018

3

私はあなたが探していることをほぼ実行するプログラムを書いたところです。ウェブカメラで撮影した画像に基づいて画面の明るさを変更し、周囲の明るさを取得します。明るさや減光速度を検知する間隔はご自身で選択できます。

https://github.com/Wandersalamander/Dimmer


1
ほとんどの人にとって素晴らしいアイデアのように
聞こえ

1
@ WinEunuuchs2Unixカムの上にテープが貼られている「心配な」ものでも、それは素晴らしいことです!キャプチャを役に立たなくするために、ウェブカメラを黒いテープで覆う必要はありません。白い紙でも、ほぼ同じ匿名性の効果が得られ、部屋の明るさを測定するカメラの機能は維持されます。実際には、紙が実際にカメラに当たる光の量をより均等に測定するため、紙が実際にそれを改善する可能性があります。これは、カメラが真上にある場合、モニター画面に当たる量とほぼ同じ音です。=)
ViníciusM


0

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

hdate -s -l N50 -L E14 -z2

出力:

Wednesday, 26 June 2019, 23 Sivan 5779

sunrise: 04:55

sunset: 21:17

-日の入り日の出

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

-zゾーンSELC = + 2

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.