Python
WebAPI
JSON
RaspberryPi
IoT

日没頃に自動で照明をつけてみる

日没頃に自動で照明をつけてみる

やりたいこと

部屋が暗くなったら作業しにくいので、自動で照明がつくようにする。

環境

-赤外線リモコンの回路を接続したRaspberyPiはある
(赤外線リモコンの作り方はMake.を参照)
-RaspberryPiからリモコン操作できるシーリングライトはある
-照度センサーはない
-インターネット環境はある
7C53C73B-45FB-4B9F-94A5-B2A2D87E293C.png

方針

インターネットで日没の時間を調べてその時間頃にRaspberryPiリモコンで照明をつける。

調査

日没の時間はどうやって調べるか?

→日没の時間を取得するWebAPIがある。
おはこん番地は⁈API

・パラメータ指定例
1. 日の出・日の入り、月の出・月の入り時刻を計算
?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)の処理を行う。

light_on_sunset.py
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を使ってみたかっただけ。