Raspberry Piで人を感知したらスマホにプッシュ通知するものを作った

f:id:sho_yamane:20150607185307j:plain

Raspberry PIにセンサーをつけて動くものを感知したらスマホにプッシュ通知をするものを作りました。防犯対策にも使えそうですね。カメラをつければ近づいてきた人の写真も同時に撮影できそうですがカメラがなかったのでそこまではやってないです。

仕組み

上のPIR Motion Sensorで動くものを感知するとメールをIFTTTのトリガーとなる”trigger@recipe.ifttt.com”に送信。するとIFTTTがスマホにプッシュ通知を送るという仕組みです。

デモ動画

f:id:sho_yamane:20150607193838p:plain

作り方

以下は必要なモノやソースコードになります。必要の無い方は読み飛ばして下さい。

必要なもの

Raspberry Pi 赤外線モーションセンサー PIR Infrared Motion Sensor

Raspberry Pi 赤外線モーションセンサー PIR Infrared Motion Sensor

ジャンパワイヤ(メス?メス) 10本セット

ジャンパワイヤ(メス?メス) 10本セット

その他にGmailのアカウントが必要となります。今回の仕組みはGmailからIFTTTにメールを送るという流れとなっている為。

配線図

f:id:sho_yamane:20150607184731p:plain

  • RaspberryPi(GND:25)↔PIR Motion Sensor(GND)
  • RaspberryPi(3.3V)↔PIR Motion Sensor(VCC)
  • RaspberryPi(GPIO25:22)↔PIR Motion Sensor(OUT)

ソースコード等

RaspberryPiで人感センサーを作る

上記のサイトを参考にさせて頂きました。

まずは下準備としてセンサーが動いているかどうかの確認とIFTTTの設定をします。

pi@raspberrypi:~$ sudo su
root@raspberrypi:/# cd /home/pi

GPIOに接続するにはroot権限が必要なので現在のアカウントからrootに変更。その後、/home/piに移動する。

root@raspberrypi:/home/pi# echo 25 > /sys/class/gpio/export

今回はOUTPUTをGPIO25を使っているのでGPIO25をユーザー空間にエクスポート。

root@raspberrypi:/home/pi# cd /sys/class/gpio/gpio25
root@raspberrypi:/sys/class/gpio/gpio25# echo in > direction

先ほどのechoコマンドでexportファイルにアクセスすると/sys/class/gpio/gpio25という新しいフォルダが作成される。この中でGPIO25のアウトプットの情報が拾えるので移動。そしてンサーからの入力を判定するので、directionファイルにinを設定。

root@raspberrypi:/sys/class/gpio/gpio25# cat value

センサーが反応していない時点で上記コマンドを打ち込むと「0」という結果に。センサーが反応している”途中”でコマンドを打ち込むと「1」という結果がかえってきたのならセンサーは正常に反応しています。

そして次はIFTTTの設定です。

IF by IFTTT

IF by IFTTT

  • IFTTT
  • 仕事効率化
  • 無料

IFTTTのアプリをインストールして、ユーザー情報を入力。ここの登録メールアドレスは今回使うGmailにするのが重要。IFTTTは登録したGmailからしかトリガーを発動してくれない模様。

f:id:sho_yamane:20150607192623p:plain

レシピ作成へ。

f:id:sho_yamane:20150607192633p:plain

E-mailの「send IFTTT any E-mail」を選択。

f:id:sho_yamane:20150607192641p:plain

そしてthenの設定へ。

f:id:sho_yamane:20150607192651p:plain

iOSの場合は「iOS Notifications」のSend a notificationを選択、Androidの場合は「Android Notifications」のSend a notificationを選択して下さい。

f:id:sho_yamane:20150607192706p:plain

どのような文字をプッシュ通知させるかの設定は後で「Edit」というところから変更できます。Subjectはメールの件名、Bodyはメールの本文が表示されます。

f:id:sho_yamane:20150607193838p:plain

こんな感じです。今回は件名「侵入者あり!」、本文「たった今侵入者がありました!警戒してください!」と設定しています。

さてpythonのソースコード(ファイル名: sensor_push.py)は以下の通りです。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import os.path
import datetime
import smtplib
import socket
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.IN)
from contextlib import closing
from email import Encoders
from email.Utils import formatdate
from email.MIMEBase import MIMEBase
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
#Gmailアカウント
ADDRESS = "Gmailアドレス"
PASSWARD = "Gmailパスワード"
#SMTPサーバの設定(Gmail用)
SMTP = "smtp.gmail.com"
PORT = 587
def create_message(from_addr, to_addr, subject, body, mime=None, attach_file=None):
"""
    メッセージを作成する
    @:param from_addr 差出人
    @:param to_addr 宛先
    @:param subject 件名
    @:param body 本文
    @:param mime MIME
    @:param attach_file 添付ファイル
    @:return メッセージ
    """
msg = MIMEMultipart()
msg["From"] = from_addr
msg["To"] = to_addr
msg["Date"] = formatdate()
msg["Subject"] = subject
body = MIMEText(body)
msg.attach(body)
# 添付ファイル
if mime != None and attach_file != None:
attachment = MIMEBase(mime['type'],mime['subtype'])
file = open(attach_file['path'])
attachment.set_payload(file.read())
file.close()
Encoders.encode_base64(attachment)
msg.attach(attachment)
attachment.add_header("Content-Disposition","attachment", filename=attach_file['name'])
return msg
def send(from_addr, to_addrs, msg):
"""
    メールを送信する
    @:param from_addr 差出人
    @:param to_addr 宛先(list)
    @:param msg メッセージ
    """
smtpobj = smtplib.SMTP(SMTP, PORT)
smtpobj.ehlo()
smtpobj.starttls()
smtpobj.ehlo()
smtpobj.login(ADDRESS, PASSWARD)
smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
smtpobj.close()
if __name__ == '__main__':
#宛先アドレス
to_addr = "trigger@recipe.ifttt.com"
#件名と本文
subject = "侵入者あり!"
body = "たった今侵入者がありました!警戒してください!"
#添付ファイル設定(text.txtファイルを添付)
mime={'type':'text', 'subtype':'comma-separated-values'}
attach_file={'name':'test.txt', 'path':'./text.txt'}
#メッセージの作成(添付ファイルあり)
#msg = create_message(ADDRESS, to_addr, subject, body, mime, attach_file)
#メッセージ作成(添付ファイルなし)
while True:
inputValue = GPIO.input(25)
if (inputValue == True):
msg = create_message(ADDRESS, to_addr, subject, body)
send(ADDRESS, [to_addr], msg)
time.sleep(1)

ADDRESS,PASSWARDにGmailアカウントのメールアドレスとパスワードを設定して下さい。またsubjectには件名、bodyにはメール本文を設定して下さい。今回は「侵入者あり!」「たった今侵入者がありました!警戒してください!」となっています。

Gmailの2段階認証をしている方は動かないと思いますので設定の解除をお願いします。また、セキュリティをきつくしているとGoogleからはねられるようなのでその後Googleから送られてくるメールに従ってセキュリティの設定をして下さい。

ソースコードは以下の2サイトを参考にしました。

$ sudo python sensor_push.py

準備ができればPythonファイルのあるディレクトリに移動し、上記のPython起動のコマンドを打ち込めば起動してセンサーが反応するとお持ちのスマホにプッシュ通知がくるかと思います。

© 2011 - 2017 ShoYamane