#日没頃に自動で照明をつけてみる
##やりたいこと
部屋が暗くなったら作業しにくいので、自動で照明がつくようにする。
##環境
-赤外線リモコンの回路を接続したRaspberyPiはある
(赤外線リモコンの作り方はMake.を参照)
-RaspberryPiからリモコン操作できるシーリングライトはある
-照度センサーはない
-インターネット環境はある
##方針
インターネットで日没の時間を調べてその時間頃にRaspberryPiリモコンで照明をつける。
##調査
###日没の時間はどうやって調べるか?
→日没の時間を取得するWebAPIがある。
おはこん番地は⁈API
・パラメータ指定例
- 日の出・日の入り、月の出・月の入り時刻を計算
?mode=sun_moon_rise_set&year=2017&month=10&day=12&lat=35.8554&lng=139.6512
パラメータはmode、日付、緯度/経度が必要。
###緯度/経度はどうやって取得するか?
GPSは持ってない→住所から取得する
###住所から緯度/経度はどうやって取得するか?
GoogleMAPのWebAPIがある。
Geocoding API
調べたところ郵便番号からも緯度/経度を取得できるようだ。
精度は高くなくてよいので、これで十分。
##やり方
(1)RaspberryPiの置いてある住所の郵便番号から緯度経度を調べる。
(2)緯度経度と日付から日没時間を調べる。
(3)日没時間-20分に照明をつけるスクリプトをスケジューリングする。
(4)上記を毎日午後3時(この時間は日が沈まないだろう)に行う。
##コード
コードはWebAPIを利用するにはrequestsが簡単そうなのでPythonにした。
このコードは上記(1)(2)(3)の処理を行う。
import requests
import json
import xml.etree.ElementTree as etree
from datetime import date
import subprocess
from math import modf
#日没時刻を取得する関数
def get_time_sunset(year, month, day, lat,lng):
url = 'http://labs.bitmeister.jp/ohakon/api/?'
payload = {'mode':'sun_moon_rise_set', 'year':year, 'month':month, 'day':day, 'lat':lat, 'lng':lng}
response = requests.get(url, params=payload)
data = etree.fromstring(response.content)
return data[3][1].text
#郵便番号から緯度/経度を取得する関数
def get_geocode(zipcode):
url = 'https://maps.googleapis.com/maps/api/geocode/json?'
key = 'SetYourKey'
payload = {'address':zipcode, 'key':key}
response = requests.get(url, params=payload)
dict_json = response.json()
lat = dict_json['results'][0]['geometry']['location']['lat']
lng = dict_json['results'][0]['geometry']['location']['lng']
return (lat,lng)
#緯度/経度を取得
lat, lng = get_geocode('YourZipCode')
#日付を取得
today = date.today()
#日没時刻を取得
time_sunset = get_time_sunset(today.year, today.month, today.day, lat, lng)
#約20分前に点灯するように調整
num_time_light_on = float(time_sunset)-0.33
#時刻をHH:MMの形の文字列に変換
decimal, integer = modf(num_time_light_on)
minutes = int(60 * decimal)
hour = int(integer)
str_time_light_on = str(hour) + ':' + str(minutes)
#照明をつけるコマンド
cmd_light_on = '/home/pi/python_code/light_on.sh'
#ATでスケジューリング
at_cmd = "at -f " + cmd_light_on + ' ' + str_time_light_on
subprocess.call(at_cmd, shell=True)
(4)の「午後3時に」はRaspbianでcronを利用する。
crontabを設定しておく。
# crontab -e
0 15 * * 1-5 python3 /home/pi/python_code/light_on_sunset.py
これにて自動照明点灯システムが完成した!
##最後に
日没頃に家の照明がついても、うれしくないことは分かっている。
WebAPIを使ってみたかっただけ。