颯爽退勤日記

日々の考えごととか、ねことの日常とか

Raspberry Piと人感センサーでトイレの電気のON/OFFを自動にした

目次

はじめに

2019年、家にAmazon Echo PlusとPhillips Hueを迎え入れておうちをスマートホーム化しはじめました。 「アレクサ、ただいま」で電気全部つけて、流しかけのSpotify流してくれるし、「アレクサ、おやすみ」でちょうどいい明るさにして1時間後に全部明かりが切れるようにしてくれるし、めっちゃ便利です*1

そんな中家のトイレに一つ不満がありました。 それは、明らかに電気スイッチがある場所がおかしい!!のです。

f:id:nyanco888:20191231175541j:plain
我が家のトイレと洗面所のスイッチ。これ、玄関にあります。

これだけ見てもよくわからないので、間取り図的なやつがこちら。

f:id:nyanco888:20191231175557j:plain

わかりますかね?普通に電気つけてトイレ行こうと思うと、青の導線を通ることになるのですが、狭い廊下にある引き戸のため、ドアを開けるとスイッチとかぶって押せないため、洗面所へのドアは閉めたままスイッチつけて、ドア開けて、さらにもう一つドア開けてやっとトイレです。

結構面倒臭いです。

なので、大学とかビルにあるみたいに、生体反応式で電気つく方式になればいいなーーと思ってました。

そんなこと思ってる時に、大学でふとRaspberry Piを見つけました*2。実際ラズパイは今まで触ったことなかったのですが、からあげさんのブログ*3とかはよく見ていたので、色々できるなんかすごいちっちゃい奴!*4という認識はありました。

大学としては自由に使って良いとのことだったので、ありがたく頂戴*5して、ラズパイでトイレの電気自動化を試みることにしました。これはその記録です。

手順

準備したもの

  • Raspberry Pi 3B+*6
  • 赤外線人感モジュール*7
  • ジャンプワイヤ(メス-メス)*8
  • Phillips Hue 電球 *9
  • Phillips Hue ブリッジ*10

人感センサーとジャンパワイヤはAmazonで買いました。

f:id:nyanco888:20191231201200j:plainf:id:nyanco888:20191231201054j:plain
購入した赤外線人間モジュール(3個で800円ぐらい)と、ジャンプワイヤ。絶対こんなに本数いらない。

ラズパイのセットアップ

ググればいろんな方の記事が参考になると思うのですが、自分はからあげさんの記事を参考にしました。

karaage.hatenadiary.jp

といっても最初からOS入ってるSDだったので繋いで少し設定いじるだけでした。

あとはsshで手元のmacから操作できるようにします。 この辺りの記事が参考になります。

qiita.com

ラズパイと人感センサーモジュールを接続

f:id:nyanco888:20191231204218j:plain

センサーモジュールの方は左から順に+, out, -(緑、黄、黒のワイヤー)です。なので、ラズパイの方には順に、DC5V(02or04)、Ground、GPIO18に繋ぎました。ピンを繋ぐ時は電源を切ってからです。

f:id:nyanco888:20191231205020p:plain
Raspberry Pi 3のGPIO位置

なおセンサーの感度はこちらのつまみで調節できるみたい。

f:id:nyanco888:20191231205401j:plain
赤外線人感センサーの感度調節つまみ

写真で見て左側のつまみが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にアクセスすれば、

f:id:nyanco888:20191231211429p:plain

このようにAPIをいじれる画面になります。 それぞれAPIのURL、Request body、Responseです。

まずユーザーを作成するため、Hueブリッジ本体のボタンを押してから

f:id:nyanco888:20191231201211j:plain
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でログインして実行するの面倒臭いです。

なので電源つけたら勝手に実行するようにします。

これもからあげさんがまとめてくれていました。

qiita.com

自分はこの記事の最初の、/etc/rc.localに実行ファイルを置くことで起動時に実行されるようになりました。

おわりに

最終的に、こんな感じになりました。

これは便利だ〜〜〜。電気の消し忘れも気にしなくて大丈夫ですね。

次回はここに音楽流すのをプラスした記事を書きますね。ラズパイ 楽しい!