ITと雑記とド田舎と

ド田舎在住エンジニアがIT備忘録と雑記を書くブログです

Raspberry Piで人感通知システムを作ろう[2]

 

今回は前回の続きの記事になります。

人感センサーをPythonから制御する方法と、人感センサーが反応したときにLINEに通知を送る方法の説明です。

 

 人感センサーのPython制御

 コーディングはPython3系です。ソースコードは以下のようになります。

import RPi.GPIO as GPIO
import time

# 設定値
SENSOR_PIN = 24

# 初期化 INモードに設定
GPIO.setmode(GPIO.BCM)
GPIO.setup(SENSOR_PIN, GPIO.IN)

try:
    print ("App Start")
    print ("ctrl+c : if you want to stop app")
    while True:
        if (GPIO.input(SENSOR_PIN) == GPIO.HIGH):
            print("detect!")
        else:
            print("not detect!")
        time.sleep(1)
except KeyboardInterrupt:
    print("Quit")
finally:
    print("GPIO clean up")
    GPIO.cleanup()

 GPIOの制御にはRPi.GPIOライブラリを使用しています。

人感センサーに反応があると、センサーのOUTのピンからGPIOに入力電圧が発生します。ですので、Pythonスクリプトでは制御するPIN番号に人感センサーのOUTを接続した24ピンを指定して、GPIOの24番ピンからRaspberry Piに入力があったら「detect!」と表示しています。

 

 PythonでLINE通知

トークンの発行

LINE Notifyにログインしましょう。

notify-bot.line.me

ログインしたら、マイページに移動してトークンを発行します。

f:id:kdn-1017-wttd:20180621230520p:plain

f:id:kdn-1017-wttd:20180621230545p:plain

トークン名はお好きな名前で大丈夫です。通知目的に合った分かりやすい名前を付けておくと良いと思います。通知先を選んで発行するボタンをクリックするとトークンが表示されるので、忘れずにメモをしておきましょう。

 

Pythonから通知

Python3のコードは以下のようになります。

import requests

class LineNotify:
    def __init__(self, token, api):
        self.line_notify_token = token # 発行したトークン
        self.line_notify_api = api

    def send_message(self, message):
        payload = {'message': message}
        headers = {'Authorization': 'Bearer ' + self.line_notify_token} 
        line_notify = requests.post(self.line_notify_api, data=payload, headers=headers)
        return line_notify

LINE Notifyからメッセージを送るクラスを作成しました。tokenに先ほど発行したトークンを 文字列で渡します。apiはURL「https://notify-api.line.me/api/notify」です。

あとは、send_messageの引数に任意の文字列を渡してあげるとLINEにその文字列を通知してくれます。

 

人感センサー+LINE通知

 さて、ここまでくれば紹介した2つのコードを合わせるだけです。以下のようになります。

import RPi.GPIO as GPIO
import time
import line_notify as ln
from datetime import datetime
from logging import basicConfig, getLogger, INFO

# LINE notifyによる通知設定
lne = ln.LineNotify('発行したトークン', 'https://notify-api.line.me/api/notify')

## 設定値
SENSOR_PIN = 24

## 初期化 INモードに設定
GPIO.setmode(GPIO.BCM)
GPIO.setup(SENSOR_PIN, GPIO.IN)

basicConfig(level=INFO)
logger = getLogger('HelpCall')

try:
    print ("App Start")
    print ("ctrl+c : if you want to stop app")
    while True:
        if (GPIO.input(SENSOR_PIN) == GPIO.HIGH):
            print("detect!")
            logger.info(datetime.now().strftime('%Y/%m/%d %H:%M:%S'))
            res = lne.send_message("おばあちゃんが呼んでいます!")
            time.sleep(59)
        time.sleep(1)
except KeyboardInterrupt:
    print("Quit")
finally:
    print("GPIO clean up")
    GPIO.cleanup()

LINE通知クラスは別ファイルにしてimportすることで利用しています。

「発行したトークン」の部分はご自身で取得したトークンを入れてください。

これで人感センサーが反応すると「おばあちゃんが呼んでいます!」とLINEに通知が飛びます。一度通知が飛ぶと1分間スリープするように設定しました。

Python3系の記法ですのでRaspberry Piで実行する際は「python3 hoge.py」とすることに注意してください。

 

今回はここまでにしたいと思います。次回は通知スクリプトをサービス(デーモン)化してRaspberry Piの起動時に自動的に開始する方法と、WebアプリからRaspberry Piを操作する方法をご紹介する予定です。

 

参考

PythonでLINEに通知を送る

ラズベリー・パイで遊ぼう!

ラズベリー・パイで遊ぼう!