カメラをつけて、お部屋のチェックなど便利に使おう!
第1回: ウェイクワードで操作できるスマートホーム・デバイスを作り始める
第2回: 独自のウェイクワードでお部屋をチェックする
第3回: 声でリモコンを操作して便利に使う
こんにちは、ヨシケンです!
ラズパイでスマートホーム化の第4回。これまでラズパイを使って、声による起動、部屋の温湿度チェック、そしてリモコン機器の操作を行ってきました。
今回はカメラを付けて、部屋のチェックをしたり、お子さんの帰宅を知らせたりするなど、画像を使った機能を付けましょう。(左側の丸い窓にカメラを設置しています。)
また、「おはよう!」や「ただいま!」などのシンプルな挨拶で、家の中の事を自動化する仕組みも作って、スマートホームの完成です!
今回の記事で必要な物一覧
・Raspberry Pi 3B+ (最新版のラズパイ本体)
・パイ・カメラ
(ラズパイ公式カメラです。これと同形状で夜間撮影が可能なPiNoIRカメラもあります。)
・小型バッテリー(小型ならどんなものでも構いません)
・LED、抵抗やケーブル類
・(100円ショップなどで手に入る)木のケースなど装飾部品
今回の記事の流れ
1.カメラをセットアップして写真撮影
2.写真をLINEに添付、送付
3.スマートホーム・デバイスにカメラを組み込む
4.音声と連携させて、室内で便利に使う
5.まとめ
1.カメラをセットアップして写真撮影
まずラズパイにカメラをセットしましょう。ラズパイの中ほどにあるカメラ端子の白いフックを引き上げ、ケーブルを差して、フックを固定します。
右写真のように黒い端子を上の向きにすると、そのままで上下正しく撮る事ができます。(オプションで写真の向きなどを変更する事もできます)
smartフォルダ下に、imageという写真保存場所を作って、raspistillコマンドで試し撮りしてみます。(-w 480 -h 360は画像サイズの指定です。)
$ cd smart/$ sudo mkdir image
$ raspistill -w 480 -h 360 -o image.jpg
今後のpythonプログラムで使えるように、camera.pyプログラムを作って、imageフォルダ下に、日付時間毎の画像ファイルを保存するようにします。
[camera.py]
# -*- coding: utf-8 -*- | |
import subprocess, os, sys, re | |
from datetime import datetime | |
import time | |
def camera(): | |
now = datetime.now() | |
dir_name = now.strftime('%Y%m%d') | |
dir_path = '/home/pi/smart/image/' + dir_name + '/' | |
file_name= now.strftime('%H%M%S') + '.jpg' | |
fname = dir_path + file_name | |
try: | |
os.mkdir(dir_path) | |
except OSError: | |
print('Date dir already exists') | |
os.system('raspistill -w 480 -h 360 -o ' + fname) | |
return fname | |
def main(image=""): | |
if image == "": | |
fname = camera() | |
else: | |
fname = image | |
print(fname) | |
if __name__ == '__main__': | |
main() | |
2.写真のLINEへの送付
写真を撮った時に、それをLINEに送って、遠隔からでも簡単にチェックできるようにします。
LINEのNotifyというAPIを使うと、ラズパイから簡単に写真付きメッセージを送る事ができます。
LINE Notifyのページから、LINEアカウントでセットアップをしてみて下さい。
以下画面が出たら、“トークンを発行する”ボタンを押します。
写真を送りたいグループなどを指定します。ここでは“スマートホーム“グループを作っています。
ここでNotify用のトークンを取得します。一度しか表示されないので、しっかりコピーしておいて下さいね。
またLINE側で、写真を送るグループにLINE Notifyというユーザを招待するのをお忘れなく。
それでは先ほどのカメラ機能と合わせてcamera_line.pyを作ります。取得したトークンを使ってLINE送付用のコマンドを追加(黄色部分)しています。
[camera_line.py]
# -*- coding: utf-8 -*- | |
… | |
def line(fname): | |
url = "https://notify-api.line.me/api/notify" | |
token = "xxx" #ここにトークンを入力 | |
headers = {"Authorization" : "Bearer "+ token} | |
message = "写真を撮りました!" | |
payload = {"message" : message} | |
files = {"imageFile": open(fname, "rb")} | |
r = requests.post(url, headers = headers, params=payload, files=files) | |
print(r.text) | |
def main(image=""): | |
if image == "": | |
fname = camera() | |
else: | |
fname = image | |
print(fname) | |
if fname: | |
line(fname) | |
camera_line.pyを流してみると、ラズパイで撮った写真が、このようにLINEに送られてきました。
3.スマートホーム・デバイスにカメラを組み込む
それでは、前回まで作っていたスマートホーム・デバイスに、カメラを組み込んでいきます。
ちょうど空いた穴から、レンズ部分を出し、固定します。
ケーブルが多くなってしまった部分は、赤い屋根でふたをしておきます。
これを部屋に置いておいて、定期的に室内写真を撮るようにしてみましょう。例えば、10時と15時に自動的に写真を撮って、LINE送付するようにします。
これにはcronという定期的にプログラムを実行する仕組みを利用します。
cronに必要なライブラリをインストールして、スタートさせます。
$ sudo apt-get install chkconfig$ sudo /etc/init.d/cron start
$ sudo chkconfig cron
cronエディタ(crontab -e)を実行し、その一番最後に以下2つの実行プログラムを記述します。(この場合、毎日10時と15時に実行)
その後リスト(-l)でcronが正常に登録されているか確認してください。
00 10 * * * python /home/pi/smart/camera_line.py
00 15 * * * python /home/pi/smart/camera_line.py$ crontab -l
またcronから正常にプログラムが動いているか確認する為、cronのログを残すようにします。
rsyslog.confという設定ファイルのうち、#cron.*となっている部分のコメントアウトを外せば、/var/log/cron.logとしてログファイルが書き込まれます。
$ sudo vi /etc/rsyslog.confcron.* /var/log/cron.log #コメントアウトを外す
$ sudo /etc/init.d/rsyslog restart
$ sudo cat /var/log/cron.log
[/etc/rsyslog.conf]
cronが動いているかどうかの確認
これで部屋に置いて電源を入れておくだけで、定期的に室内の写真をLINEに送ってきてくれるようになります。
4.音声と連動させて、室内で便利に使う
それでは最後に、発話内容に応じて、室内で便利に使えるように、これまで作った機能を連携させましょう。
以下例のような、普段の“おはよう”や“ただいま”などのあいさつに連動して、自動で動かす仕組みを作ってみてはどうでしょうか?
そのために、前回作成した日本語認識のJuliusのプログラムを改修して、julius_remote.pyプログラムを作りました。プログラムはリンクからダウンロードできるようになっています。
内容的には、以下の部分で、あいさつに応じて、返答のメッセージや、リモコンのコマンドを指定しています。
[julius_remote.pyの一部]
if u'おはよう' in word: | |
msg = 'おはようございます!今は' + datetimestr + 'です!' | |
#device = "light" | |
command= ["tv", "tvon"] | |
elif u'いってきます' in word: | |
msg = 'いってらっしゃい!今日はきっといい事ありますよ!' | |
command= ["light", "loff"] | |
elif u'ただいま' in word: | |
msg = 'おかえりなさい!おつかれさまでした!' | |
command = ["tv", "tvon"] | |
elif u'おやすみ' in word: | |
msg = 'おやすみなさい!良い夢を!' | |
command= ["light", "loff"] | |
elif u'テレビオン' in word: | |
msg = 'テレビを付けます!' | |
command = ["tv", "tvon"] | |
elif u'加湿器オン' in word: | |
msg = '加湿器を付けます!' | |
command = ["humid", "hon"] | |
elif u'さよなら' in word or u'バイバイ' in word: | |
msg = 'また話しかけてね!' | |
以下の部分で、コマンドに応じて赤外線送信や、室温のチェック、写真、LINE送付などを定義しています。取り入れたい機能に応じて、プログラムの記述を変えてみて下さい。
[julius_remote.pyの一部]
args = ['irsend', '-#', '1', 'SEND_ONCE', command[0], command[1]] | |
try: | |
led_blink("red",1) | |
print(msg) | |
os.system(aquest_dir + msg + ' | aplay') | |
os.system('python ' + bme_command) | |
os.system('python ' + camera_command) | |
cam_msg = '写真を撮ってラインに送りました!' | |
os.system(aquest_dir + cam_msg + ' | aplay') | |
subprocess.Popen(args) | |
print(command) | |
led_blink("green",3) | |
except OSError: | |
print('command not found.') | |
また室内の温湿度を測って、その結果に応じて赤外線を操るために、bme.pyを以下のように追加、修正します。このプログラムは、bme_remote.pyとして、こちらに保存しています。
[bme_remote.pyの一部]
if temp > 30: | |
room = "暑くないですか?" | |
command = ["air", "cool"] | |
led_blink("red", 5) | |
elif temp < 15: | |
room = "寒いですね!" | |
command = ["air", "warm"] | |
led_blink("red", 4) | |
elif hum > 70: | |
room = "蒸し蒸ししますねー" | |
command = ["air", "dry"] | |
led_blink("red", 3) | |
elif hum < 50: | |
room = "乾燥してますね!" | |
command = ["humid", "hon"] | |
led_blink("red", 2) | |
elif press < 1000: | |
room = "低気圧ですね" | |
led_blink("red", 1) | |
else: | |
room = "快適です!" | |
led_blink("green", 3) | |
if room: | |
print room | |
os.system(aquest_dir + "AquesTalkPi " + room + " | aplay") | |
print command | |
args = ['irsend', '-#', '1', 'SEND_ONCE', command[0], command[1]] | |
subprocess.Popen(args) | |
これらのプログラムができたら、スマートホーム・デバイスを室内の好きなところに置いてください。赤外線機器の近くの方がリモコンの効きは良いと思います。
それではこのjulius_remote.pyプログラムを実行するか、以前の記事を見て自動実行プログラムにして、走らせます。
さあ、まずは「おはよう!」と挨拶してみましょう。
この動画のように、「おはようございます!」の返答と共に、室温などを測って、リモコン操作してくれると思います。
また、「いってきます!」や「ただいま!」のあいさつで、スナップ写真を撮ってくれています。
特に家に帰ってきた子どもの写真がLINEに送られてくると、親御さんは安心ですし、ほっこり和むこと請け合いですね!
これ以外にも第2回で扱ったSnowboyで「ねぇ、お部屋チェック!」などのウェイクワードを登録し、こちらのプログラムを使えば、似たような操作が可能です。
[wake_remote.pyの一部]
callbacks = [lambda: camera_line.main(),
lambda: bme_remote.main()]
print(“「ねぇ、お部屋チェック!」や「ねぇ、お部屋測って!」などウェイクワードを発話して下さい。Ctrl+Cで終了します。”)
ぜひ色々組み合わせて、ご自分の部屋や使い方にあった機能を付け加えてみて下さい!
5.まとめ
ラズパイでスマートホーム化として、カメラをつないで室内をチェックできるようにしました。
合わせてLINEと連携させる事により、離れた所からでも家がチェックできるようになりました。
最後に、これまで作った温湿度センサ、赤外線リモコン、日本語音声認識などを組み合わせて、シンプルなあいさつから、様々な機能を呼び出せるようにしました。
一人暮らしの方は挨拶に応えてくれるだけでも嬉しいですし、お子さんがいる方は、帰宅時などのチェックができて、安心ですね。画像解析機能を活用すれば、不審者検知カメラや、ペット監視にも使えるかもしれません。
それではこれからも、ラズパイと、センサ、カメラ、音声機能などを使って、家の中を便利に、スマートホーム化していってください!
(ヨシケン)
今回の連載の流れ
第1回: ウェイクワードで操作できるスマートホーム・デバイスを作り始める
第2回: 独自のウェイクワードでお部屋をチェックする
第3回: 声でリモコンを操作して便利に使う
第4回:カメラをつけて、お部屋のチェックなど便利に使おう!(今回)