目次
はじめに
2019年、家にAmazon Echo PlusとPhillips Hueを迎え入れておうちをスマートホーム化しはじめました。 「アレクサ、ただいま」で電気全部つけて、流しかけのSpotify流してくれるし、「アレクサ、おやすみ」でちょうどいい明るさにして1時間後に全部明かりが切れるようにしてくれるし、めっちゃ便利です*1。
そんな中家のトイレに一つ不満がありました。 それは、明らかに電気スイッチがある場所がおかしい!!のです。
これだけ見てもよくわからないので、間取り図的なやつがこちら。
わかりますかね?普通に電気つけてトイレ行こうと思うと、青の導線を通ることになるのですが、狭い廊下にある引き戸のため、ドアを開けるとスイッチとかぶって押せないため、洗面所へのドアは閉めたままスイッチつけて、ドア開けて、さらにもう一つドア開けてやっとトイレです。
結構面倒臭いです。
なので、大学とかビルにあるみたいに、生体反応式で電気つく方式になればいいなーーと思ってました。
そんなこと思ってる時に、大学でふとRaspberry Piを見つけました*2。実際ラズパイは今まで触ったことなかったのですが、からあげさんのブログ*3とかはよく見ていたので、色々できるなんかすごいちっちゃい奴!*4という認識はありました。
大学としては自由に使って良いとのことだったので、ありがたく頂戴*5して、ラズパイでトイレの電気自動化を試みることにしました。これはその記録です。
手順
準備したもの
人感センサーとジャンパワイヤはAmazonで買いました。
ラズパイのセットアップ
ググればいろんな方の記事が参考になると思うのですが、自分はからあげさんの記事を参考にしました。
といっても最初からOS入ってるSDだったので繋いで少し設定いじるだけでした。
あとはsshで手元のmacから操作できるようにします。 この辺りの記事が参考になります。
ラズパイと人感センサーモジュールを接続
センサーモジュールの方は左から順に+, out, -(緑、黄、黒のワイヤー)です。なので、ラズパイの方には順に、DC5V(02or04)、Ground、GPIO18に繋ぎました。ピンを繋ぐ時は電源を切ってからです。
なおセンサーの感度はこちらのつまみで調節できるみたい。
写真で見て左側のつまみがDeley Time Adjustで遅延時間の調整(つまみを右に回すと、検知時間がゆっくりになる)、右側のつまみがSensitivity Adjustで感度の調整(つまみを右に回すと、感度が敏感になる)です。後で適度に調整します。
Phillips Hueとの接続について
Hueとの接続はAPI*11を用いて行います。 下記URLにアクセスすれば、LAN内にあるHue BridgeのIPアドレスを取得することができます。
https://www.meethue.com/api/nupnp
取得したアドレスを入れてhttp://Hue BridgeのIPアドレス/debug/clip.html
にアクセスすれば、
このようにAPIをいじれる画面になります。 それぞれAPIのURL、Request body、Responseです。
まずユーザーを作成するため、Hueブリッジ本体のボタンを押してから
URL:/api
Message Body:{“devicetype”:”myhue(ここはなんでもいい)”}
でPOSTします。
すると
[ { "success": { "username": "自分のusernameが得られる" } } ]
となり、ここで得られるusernameをコピーします。
そしてURL欄にapi/取得したusername/lights
としてGETすると、以下のようにブリッジに繋がっているHueのライトの一覧の情報がJSONで取得できます。
{ "7": { "state": { "on": false, "bri": 254, "ct": 366, "alert": "none", "colormode": "ct", "mode": "homeautomation", "reachable": true }, "swupdate": { "state": "noupdates", "lastinstall": "2019-11-09T01:27:23" }, "type": "Color temperature light", "name": "ホワイトライト1", "modelid": "LTW001", "manufacturername": "Philips", "productname": "Hue ambiance lamp", "capabilities": { "certified": true, "control": { "mindimlevel": 1000, "maxlumen": 806, "ct": { "min": 153, "max": 454 } }, "streaming": { "renderer": false, "proxy": false } }, "config": { "archetype": "sultanbulb", "function": "functional", "direction": "omnidirectional", "startup": { "mode": "safety", "configured": true } }, "uniqueid": "00:17:88:01:04:7e:76:70-0b", "swversion": "5.127.1.26420" }, "8": {...繰り返し
ここから、操りたい電球のIDや操りたいJSON構造を確認することができます。 例えば、この7番の電球の電気を点灯させたければ、 http://IPアドレス/api/username/light/7/state
で、
{'on':True}
とPUTすれば電球を点灯させることができます。
これで、操りたい電球のAPIも確認できました。
ラズパイ側からセンサー入力とHueへの出力をプログラムする
あとは、ラズパイ側でセンサーを認識し、センサーがONになったら電球をONにするプログラムを作成すれば完成です。
#coding=utf-8 #!/bin/bash #!/usr/bin/env python3 from datetime import datetime import time import datetime import RPi.GPIO as GPIO import requests # 1秒ごとにセンサー確認 INTERVAL = 1 # 一度電気をつけたあと2分間はセンサー確認を止める SLEEPTIME = 120 # 使用するGPIOは18番(繋いだピン位置による) GPIO_PIN = 18 GPIO.setmode(GPIO.BCM) GPIO.setup(GPIO_PIN, GPIO.IN) def turning_hue(ID, status): HUE_API = 'http://IPアドレス/api/username/lights' requests.put(HUE_API + '/ID/state', json = {"on":status}) if __name__ == '__main__': try: cnt = 1 day = datetime.date.today().strftime('%Y/%m/%d') while True: if day == datetime.date.today().strftime('%Y/%m/%d'): # センサー感知 if(GPIO.input(GPIO_PIN) == GPIO.HIGH): print(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')+ ":本日" + str("{0:02d}".format(cnt)) + "回目のトイレでの人感知") cnt = cnt + 1 turning_hue(1, True) time.sleep(SLEEPTIME) # センサー感知オフ else: print(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S') + ":" + 'トイレに人はいません') turning_hur(1, False) time.sleep(INTERVAL) else: day = datetime.date.today().strftime('%Y/%m/%d') cnt = 1 except KeyboardInterrupt: print("終了処理中......") finally: GPIO.cleanup() print("GPIO is cleaned.")
実行ファイルを、電源つけたらいつも実行するようにする
このファイルを一度実行すれば人感センサーで電気ON/OFFが作動するのですが、いちいち電源つけたあとsshでログインして実行するの面倒臭いです。
なので電源つけたら勝手に実行するようにします。
これもからあげさんがまとめてくれていました。
自分はこの記事の最初の、/etc/rc.local
に実行ファイルを置くことで起動時に実行されるようになりました。
おわりに
最終的に、こんな感じになりました。
できた! pic.twitter.com/VktYhZxSVH
— okuda (@nyanco888) 2019年11月8日
これは便利だ〜〜〜。電気の消し忘れも気にしなくて大丈夫ですね。
次回はここに音楽流すのをプラスした記事を書きますね。ラズパイ 楽しい!
*1:家でアレクサと猫に喋りかけてる
*2:所属しているプログラムのおかげで、ありがたいことに研究とは別に3Dプリンターとかがが使えるのですが、その部屋にたくさんラズパイが余っていました
*3:https://karaage.hatenadiary.jp/archive/category/Raspberry%20Pi
*4:超適当
*5:買うと結構良いお値段するからラッキーでした
*6:今回僕はComplete Starter Kitという全部揃ってるやつを使いました
*7:HiLetgo® 3個セット HC-SR501人体赤外線感応モジュール 人体の赤外線の感応器 [並行輸入品]
*8:ブレッドボード・ジャンパーワイヤー(メス-メス)(20cm)40本
*9:Philips Hue ホワイトグラデーション シングルランプ(電球色~昼光色) | E26スマートLEDライト1個 |【Amazon Echo、Google Home、Apple HomeKit、LINEで音声コントロール】
*10:Philips Hueブリッジ |スマートデバイス| 【Amazon Echo、Google Home、Apple HomeKit、LINE対応】