【Raspberry Pi】人感センサで自室の照明ON/OFFを自動化(人感センサと照明ON/OFFの連携編)
概要
前回の記事では,Raspberry Piと赤外線モーションセンサをジャンパ線で接続して,Pythonスクリプトでセンサの値を取得して人感センサとして利用出来ることを確認しました.今回の記事では,人を検知したら照明をONにしたり,人がしばらく検知されなければ照明をOFFにするといった操作を自動的に実行出来るようにしたいと思います.
大まかな作業の流れは下記の2ステップになると思います.まだやっていないので未確定情報です.
Nature Remo APIでの自室照明操作
Nature Remoは,クラウドに接続された赤外線学習リモコンといった感じでしょうか.うちではリビングや自室にそれぞれおいて,照明やエアコンをタイマー操作しています.Nature Remoの優れた点として,Nature Remo APIが公開されており,自作のプログラム等からこのAPIを介してNature Remoに登録した家電を操作することが出来るようになります.
アクセストークンの取得
Nature Remo APIを使うにはアクセストークンが必要になります.このアクセストークンは専用サイト(https://home.nature.global/)にアクセスして取得します.
上記専用サイトにアクセスすると下記の表示が出ます.(なんだかフィッシングサイトっぽいが・・・)Loginボタンを押して進みます.
利用可能なメールアドレスを入力して「ログインメールを送る」ボタンを押すと確認メールが届くので,メールに記載のURLに移動します.
下記のようにNature Remoがアクセスのリクエストをしてくるので特に問題無ければ「許可する」を押して進む.
下図のようになればOK.Goボタンを押して進みます.
アクセストークン一覧が表示されているので,今回アクセスするためのトークンを新たに生成します.「+Generate access token」ボタンで生成できます.
下図のように(黒塗りしていますが)トークンの文字列が表示されればアクセストークンの取得完了です.
Nature Remoに登録された家電情報を取得
これから自室の照明を操作するために,Nature Remoに登録された家電情報を取得し,どのような情報になっているかを確認します. 登録された家電情報の取得はcurlでHTTP GETすればJson形式で取得出来ます.
例えば下記のようなcurlコマンドになります.$TOKEN
は上記で取得したアクセストークンに置き換えて下さい.
curl -H 'Authorization: Bearer $TOKEN' -H 'accept: application/json' -X GET 'https://api.nature.global/1/appliances'
上記コマンドを実行すると登録された家電情報がjson形式で出力されるので,自室の照明ONとOFFに対応する操作のidをsignalsから見つけます. 例えば下記のような情報になります.
"signals":[{"id":"94c59bda-XXXX-XXXX-b5e5-708eb940be0c","name":"点灯","image":"ico_io"},{"id":"8f52b7f7-XXXX-XXXX-bcca-a3e8c91ee92f","name":"消灯","image":"ico_off"}]
自室の照明ON/OFFのテスト
上記で取得した自室照明のON/OFF操作のidを使って実際に機器が操作出来るかを確認しておきます.これは情報の取得と同様にcurlでHTTP POSTすることで操作を実行することができます.
照明ON(点灯) curl -H 'Authorization: Bearer $TOKEN' -H 'accept: application/json' -X POST 'https://api.nature.global/1/signals/8f52b7f7-XXXX-XXXX-bcca-a3e8c91ee92f/send' 照明OFF(消灯) curl -H 'Authorization: Bearer $TOKEN' -H 'accept: application/json' -X POST 'https://api.nature.global/1/signals/94c59bda-XXXX-XXXX-b5e5-708eb940be0c/send'
人感センサと自室照明のON/OFF操作の連携
ここまでの作業でcurlコマンドによって自室照明のON/OFF操作を行なうことが可能になりました.次はPythonスクリプトで人感センサによる人の検出または未検出状態に応じてcurlコマンドのようにHTTP POSTを行なって照明を操作してみます.
Pythonスクリプトの作成
前回の記事で作成したsensor_test.pyをベースとしてHTTP POST部を追加したautomatic_light.pyを作成します.スクリプトは下記のようになりました.
from datetime import datetime import time import RPi.GPIO as GPIO import requests headers = { 'Authorization': 'Bearer $TOKEN', 'accept': 'application/json', } SLEEP_TIME = 0.1 LEAVE_TIME = 600 STAY_FLAG = False GPIO_PIN = 17 GPIO.setmode(GPIO.BCM) GPIO.setup(GPIO_PIN, GPIO.IN) last_detection_datetime = datetime(2000, 1, 1) if __name__ == '__main__': try: print("Starting detection...") while True: if GPIO.input(GPIO_PIN) == GPIO.HIGH: print(datetime.now().strftime('%Y/%m/%d %H:%M:%S') + ":" + "detected!") STAY_FLAG = True dt = datetime.now()-last_detection_datetime if dt.seconds > LEAVE_TIME: print('send on') response = requests.post('https://api.nature.global/1/signals/94c59bda-XXXX-XXXX-b5e5-708eb940be0c/send', headers=headers) last_detection_datetime = datetime.now() else: print(GPIO.input(GPIO_PIN)) dt = datetime.now()-last_detection_datetime if dt.seconds > LEAVE_TIME and STAY_FLAG: STAY_FLAG = False print('send off') response = requests.post('https://api.nature.global/1/signals/8f52b7f7-XXXX-XXXX-bcca-a3e8c91ee92f/send', headers=headers) time.sleep(SLEEP_TIME) except KeyboardInterrupt: print("exit process...") finally: GPIO.cleanup() print("GPIO cleanup")
コードの内容としては,
- 0.1秒間隔で人感センサの出力をチェック
- 人が検知されており,最終人検知時刻から600秒(不在だった)経っていた場合照明ON操作
- 人が検知されておらず,最終人検知時刻から600秒を超えた場合,不在と判断して照明OFF操作
という内容になっています.
Pythonスクリプトの自動実行
上記で作成したPythonスクリプトをRaspberry Piの起動時に自動的に実行するようにしておきます.Raspberry Piでスクリプトを自動実行する方法はいくつかありますが,ここではsystemdによる実行方法を選びました.
下記コマンドでserviceファイル(automatic_light.service)を作成します.
sudo nano /etc/systemd/system/automatic_light.service
automatic_light.serviceの内容は下記の通りです.
[Unit] Description = Automatic Light [Service] ExecStart=/usr/bin/python2.7 /home/pi/Scripts/automatic_light.py Restart=always Type=simple [Install] WantedBy=multi-user.target
下記コマンドでサービスを起動するように登録することが出来ます.
sudo systemctl enable automatic_light
登録解除する場合は,下記のコマンドです.
sudo systemctl disable automatic_light
その他,サービスの起動や停止,状態確認は下記コマンドで出来ます.
サービスの起動 sudo systemctl start automatic_light サービスの停止 sudo systemctl stop automatic_light サービスの状態確認 sudo systemctl status automatic_light
まとめ
本記事では人感センサと照明ON/OFF操作を連携させることで自動的な照明操作を可能にしました.しばらく動作確認してみたところ不在時から自室に入室した際のレスポンスがイマイチ良くない印象です.また,入室した人物に関係なく動作するのでもっと賢く動作するようにしたいところです.