[小ネタ] 日の出、日の入りに合わせて機器を制御する

(更新

Control equipments according to sunrise and sunset.

知り合いの技術者と話をしていた際に、「日の出」や「日の入り」の時刻に合わせて機器を制御するにはどうしたら良いか、という話題になりました。

一般に、屋外の照明機器などの制御では、周囲の明るさに応じてオン・オフするのが普通だと思いますが、場合によっては、天候や周辺光に左右されずに、日の出や日の入りの時刻に合わせて機器を制御したい、という場合もあるでしょう。

これは、Python であれば簡単に実現できます。(C 言語でも可能のようです。)

こちらのウェブサイトを御参考ください。

以下に、観測地の緯度と経度と時刻から、太陽の高度を計算する簡単なプログラムを示します。

from datetime import datetime

import ephem

LAT = 35.5  # 緯度
LON = 139.4  # 経度

sun = ephem.Sun()

observer = ephem.Observer()
observer.lat = str(LAT)  # 角度は文字列で指定する
observer.lon = str(LON)  # 角度は文字列で指定する
observer.date = datetime.utcnow()
# observer.date = "2023/5/6 10:00:00"   # 協定世界時で指定する場合
print(observer.date)

sun.compute(observer)
print(sun.az, sun.alt)
print(sun.alt + 0.0)  # ラジアンで表示する場合

if sun.alt > 0:
    print("日は出ています")
else:
    print("日は沈んでいます")

簡単ですね。素晴らしいライブラリを提供なさっている方々に感謝です!

補足(もう少し厳密な話)

ところで、日の出や日の入りについて計算する場合に、いくつかの注意点があります。その一つとして、日の出や日の入りの定義があります。一般に、日の出や日の入りの時刻は、太陽の上端が地平線に重なった時刻と定義されます。(月や、他の天体では異なります。)

そのため、上記プログラムでは sun.alt > 0 を使って日の出と日の入りを判断していますが、これは正確ではありません。太陽の視半径は(角度で)16分ほどとされていますので、より正確には sun.alt が(約)-0.0046 ラジアンになる時刻が、日の出、日の入りとなります。(国立天文台のウェブサイト、理科年表、新聞などに記載されている値は、全てこれを考慮して掲載されています。)

他にも、天体の位置計算について調べていくと、非常に込み入った話がたくさんあります。御興味のある方のために、以下にいくつか参考資料を挙げさせて頂きます。

今日はここまで。(なお、アイキャッチ画像は Stellarium によるものです。)

お問い合わせはお気軽に!

お問い合わせを頂いた後、継続して営業活動をしたり、ニュースレター等をお送りしたりすることはございません。
御返答は 24時間以内(営業時間中)とさせて頂いております。必ず返信致しますが、時々アドレス誤りと思われる返信エラーがございます。返答が届かない場合、大変お手数ではございますが別のメールアドレスで督促頂けますと幸いです。