Deep Tech. Blog

ガジェットや技術についての紹介や自身のメモとして記事を書いていくブログ

【Raspberry Pi】人感センサで自室の照明ON/OFFを自動化(人感センサと照明ON/OFFの連携編)

概要

 前回の記事では,Raspberry Piと赤外線モーションセンサをジャンパ線で接続して,Pythonスクリプトでセンサの値を取得して人感センサとして利用出来ることを確認しました.今回の記事では,人を検知したら照明をONにしたり,人がしばらく検知されなければ照明をOFFにするといった操作を自動的に実行出来るようにしたいと思います.

 大まかな作業の流れは下記の2ステップになると思います.まだやっていないので未確定情報です.

  1. Nature Remo APIで自室の照明をON/OFFするためのURLを取得
  2. Pythonスクリプトで人の検知と未検知状態に合せて上記URLにポスト処理

Nature Remo APIでの自室照明操作

 Nature Remoは,クラウドに接続された赤外線学習リモコンといった感じでしょうか.うちではリビングや自室にそれぞれおいて,照明やエアコンをタイマー操作しています.Nature Remoの優れた点として,Nature Remo APIが公開されており,自作のプログラム等からこのAPIを介してNature Remoに登録した家電を操作することが出来るようになります.

アクセストークンの取得

 Nature Remo APIを使うにはアクセストークンが必要になります.このアクセストークンは専用サイト(https://home.nature.global/)にアクセスして取得します.

上記専用サイトにアクセスすると下記の表示が出ます.(なんだかフィッシングサイトっぽいが・・・)Loginボタンを押して進みます. f:id:deep_tech:20190103164118p:plain

利用可能なメールアドレスを入力して「ログインメールを送る」ボタンを押すと確認メールが届くので,メールに記載のURLに移動します. f:id:deep_tech:20190103164210p:plain

下記のようにNature Remoがアクセスのリクエストをしてくるので特に問題無ければ「許可する」を押して進む. f:id:deep_tech:20190103164344p:plain

下図のようになればOK.Goボタンを押して進みます. f:id:deep_tech:20190103164446p:plain

アクセストークン一覧が表示されているので,今回アクセスするためのトークンを新たに生成します.「+Generate access token」ボタンで生成できます. f:id:deep_tech:20190103164516p:plain

下図のように(黒塗りしていますが)トークンの文字列が表示されればアクセストークンの取得完了です. f:id:deep_tech:20190103164726p:plain

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操作を連携させることで自動的な照明操作を可能にしました.しばらく動作確認してみたところ不在時から自室に入室した際のレスポンスがイマイチ良くない印象です.また,入室した人物に関係なく動作するのでもっと賢く動作するようにしたいところです.

参考サイト