人感センサーを活用してPhilips Hue 電球専用のオンオフを自動化、省電力化を実現

Philips Hue Whiteスターターセットを買ってHomeKitとGoogle Homeでホームオートメーション!

Amazon Dash ButtonでPhilips Hue 電球専用のDimmer スイッチを作ってみました (1)

Amazon Dash ButtonでPhilips Hue 電球専用のDimmer スイッチを作ってみました (2)“の続きです。

 

前回までで、”Philips Hue“と”Amazon Dash Button“を活用して、書斎の照明が随分とオートメーション化できたわけですが、Philips Hueのオプション・アクセサリーをチェックしてみると、”Philips Hue(ヒュー) モーションセンサー 929001260763“という別売のアクセサリーがあることに気が付き、値段もお手頃なので、これ買っちゃおうかな、と思ったのですが、ふと、人感センサーでHue電球のオン・オフをするぐらいだったら、前回までの経験値で何とかなりそうかも、と思いとどまり、早速、いろいろ調べてみました。

 

(1) まずは必要な電子パーツ等を購入しましょう

今回は、”aitendo“というお店で、人感センサーを含め、電子パーツを何種類か購入してみました。ちなみに、右側にあるジャンパーワイヤーは、アマゾンで買って”ブレッドボード・ジャンパーワイヤ(メス-メス)(20cm)40本“です。

今回、使うことにした”PIRセンサーモジュール [DSUN-PIR ]“はこちらです。

aitendo“で買うことにした大きな理由は、このように、ジャンパーワイヤー用のピンが既に実装されていたからです。これなら、ブレッドボードを介さなくても、ジャンパーワイヤーを使って、直接、”Raspbbery Pi“のGPIOピンヘッドに接続することができます。

 

(2) PIRセンサーモジュールをラズパイに接続します

PIRセンサーモジュールの方は、左から順に、+、out、- に沿ったジャンパーワイヤーを接続します。

続いて、ラズパイの方は、”Raspberry Pi 3 Model B GPIO 40 Pin Block Pinout“を確認しながら、POOHの場合は、+をpin #02 (DC Power 5V)、outをpin #12 (GPIO18)、-をpin #06 (Ground)に接続しました。

PIRセンサーモジュールは、ピンヘッドの反対側に、検知感度(右に回すと感度が敏感になるそうです。)、検知間隔(右に回すと間隔がゆっくりになるそうです。)を調整するネジ?が付いています。こちらは、実際に、作成したプログラムを動かしながら、数回、試行錯誤したうえで、自分的にこんなモンかなあ、と思った位置で固定して下さい。ちなみに、デフォルトのままですと、折角書いたプログラムがうまく動作していないように見えてしまう場合もありますので、最初のうちは、センサーモジュールのレスポンスが早そうなところを見つけながら調整しておくと、デバッグが楽になるはずです。

POOHの場合は、こんな感じで、開発用のラズパイにセンサーを取り付け、洗濯バサミでセンサーの位置を仮固定したうえで、以降の作業を進めていきました。ちなみに、左側がPIRセンサーモジュール、右側がラズパイ純正のカメラです。

 

(3) 動作確認、センサー調整用のスクリプトを書いてみます (Python編)

今回は、実運用では使用しませんが、Pythonバージョンのスクリプトを書いてみます。

まずは、必要なライブラリをインストールします。

sudo apt-get install python-dev python-pip

sudo pip install wiringpi2

 

続いて、スクリプトを書きます。

#!/usr/bin/env python

import wiringpi as pi

import time

SENSOR_PIN = 18 #GPIO18番を使用

pi.wiringPiSetupGpio()

pi.pinMode( SENSOR_PIN, pi.INPUT )

while True:

    if ( pi.digitalRead( SENSOR_PIN ) == pi.HIGH ):

        print ("Someone is here.")

    else:

        print ("Nobody is here.")

    time.sleep(1) #ポーリング間隔(秒)

で、このスクリプトを実行しながら、センサーの感度や検知間隔を調整しておきます。

python pir_sensor_hue.py

表示している文言はスクリプトと異なりますが、こんな感じで、PIRセンサーモジュールの動作をチェックできます。

 

(4) 動作確認、センサー調整用のスクリプトを書いてみます (シェルスクリプト編)

続いて、Pythonバージョンと同じ動作をするシェルスクリプトを書いてみます。

#!/bin/bash

gpio=18       #GPIO18番を使用

dulation=1    #ポーリング間隔(秒)

# gpio がまだ初期化されていなければ初期化

if [ ! -d /sys/class/gpio/gpio${gpio} ]

then

echo $gpio > /sys/class/gpio/export

fi

value=/sys/class/gpio/gpio${gpio}/value #gpio の値

prev_value=`cat $value`

while :

do

current_value=`cat $value`

if [ ${prev_value} -eq 0 ]

then

echo 'Nobody is here.'

fi

if [ $current_value -eq 1 ]

then

echo 'Someone is here.'

fi

prev_value=${current_value}

sleep ${dulation}s

done

 

(5) 実運用で実行するスクリプトに仕上げていきましょう

先程書いた動作確認、センサー調整用のシェルスクリプトをベースにして、Hue 電球をコントロールするスクリプトを追加していきます。Hue 電球のスクリプト部分については、前回のTALKAmazon Dash ButtonでPhilips Hue 電球専用のDimmer スイッチを作ってみました (2)“をご覧ください。

実際にスクリプトを動かしてみると、人はいるのに、ある一定の時間、じっとしていると、PIRセンサーモジュールは、人がいないと判定してしまうことが分かりました。例えば、PCに向かって、数分、プログラムを眺めていたりすると、Hue 電球が消えてしまいます。そこで、下のスクリプトに、経過時間に関するスクリプトを追記して、PIRセンサーモジュールが無人だと判断しても、すぐにHue 電球を消さず、ある程度、待機する時間を設けてみました。この辺りは、部屋に出入りする頻度や、在席中の人がどのような状態にいるのかによって、工夫すべき箇所が違うはずですので、まずはプロトタイプのスクリプトを実行しながら、どのように改良すれば実態に即した内容になるのか考えてみて下さい。

 

#!/bin/bash

gpio=18       #GPIO18番を使用

dulation=3    #ポーリング間隔(秒)

time=0        #経過時間(秒)

start_time=0

end_time=0

# gpio がまだ初期化されていなければ初期化

if [ ! -d /sys/class/gpio/gpio${gpio} ]

then

echo $gpio > /sys/class/gpio/export

fi

value=/sys/class/gpio/gpio${gpio}/value #gpio の値

prev_value=`cat $value`

state=\"on\":true\,\"bri\"

start_time=`date +%s`

while :

do

current_value=`cat $value`

if [ ${prev_value} -eq 0 ]

then

echo 'NOT EXIST'

echo $time

if [ ${time} -gt 300 ]; then

#hueのブリッジに対象ライトのステータスを取得しに行く

statesearch=$(curl -X GET 'http://192.168.1.xx/api/xxxxx/lights/1')

#取得したhueのステータスがtrueだった場合

if [[ ${statesearch:10:15} = ${state} ]]; then

#hueのブリッジに対象ライトをOFFさせに行く

curl -X PUT 'http://192.168.1.xx/api/xxxxx/lights/1/state' -d '{"on": false}'

fi

start_time=`date +%s`

end_time=`date +%s`

time=$((end_time - start_time))

else

end_time=`date +%s`

time=$((end_time - start_time))

fi

fi

if [ $current_value -eq 1 ]

then

echo 'EXIST'

#hueのブリッジに対象ライトのステータスを取得しに行く

statesearch=$(curl -X GET 'http://192.168.1.17/api/xxxxx/lights/1')

#取得したhueのステータスがfalseだった場合

if [[ ${statesearch:10:15} != ${state} ]]; then

#hueのブリッジに対象ライトをONさせに行く

curl -X PUT 'http://192.168.1.xx/api/xxxxx/lights/1/state' -d '{"on": true}'

fi

start_time=`date +%s`

time=0

fi

prev_value=${current_value}

sleep ${dulation}s

done

 

こちらが、スクリプトを実行中のターミナル画面の表示例です。ご参照までに。

 

(6) スクリプトを自動実行するようにしておきましょう

ラズパイを起動したり、リスタートする都度、スクリプトを実行し直すのは面倒なので、以下の手順で、自動実行するよう手続きをしておきます。

まずは、Unitファイルを作成します。

sudo nano /etc/systemd/system/pir_sensor_hue.service

 

Description=pir_sensor_hue.service

After=syslog.target

[Service]

Type=simple

WorkingDirectory=/home/pi/

ExecStart=/home/pi/pir_sensor_hue.sh

Restart=always

TimeoutStopSec=5

StandardOutput=null

RestartSec=10

[Install]

WantedBy = multi-user.target

 

続いて、作成したUnitファイルをサービスに登録します。

sudo systemctl daemon-reload

sudo systemctl enable pir_sensor_hue.service

sudo systemctl start pir_sensor_hue.service

 

ラズパイをリスタート後、ちゃんと実行されているか確認しておきます。

sudo systemctl status pir_sensor_hue.service

以上で、完了です。

 

 

 

Adobe Stock“でベストショットな写真素材を販売中です。是非ご覧下さい。
ホームページ “THE POOH FILES” にも是非お立ち寄り下さい。

tomohiko

長年に渡りMacintosh向けの自作アプリを作り続けているPOOHです。最近はiPhone,iPad向けアプリ開発にも挑戦中。グルメ、旅行、露天風呂、写真、サイクリング、映画、STAR TREKが大好き。レトロでSFなおもちゃを大量にコレクション。プレーリードッグと同居中。

おすすめ

コメントを残す