Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

やりたいこと

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

環境

-赤外線リモコンの回路を接続した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を使ってみたかっただけ。

mitazet
@求職中
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away