• t.t

SwitchBotで自宅のスマートホーム化

コロナ禍が続く現在、DX研究開発事業部では在宅勤務体制を継続しています。

そうした中で私は、机や椅子をグレードアップしてみたりと自宅仕事環境の改善を試みているのですが、その一環で自宅のスマートホーム化にも取り組んでみることにしました。今回はその取り組みについてご紹介いたします。


天井照明のスイッチを遠隔操作できるようにする

スマートホーム化にあたって、まずどうにかしたいと思ったのが天井の照明です。自宅の天井照明は、壁面スイッチでオン・オフを切り替えるタイプのものでして、仕事机から少し離れたスイッチのもとまで歩いていかないと操作できません。仕事中に薄暗くなってきても、キリのよいところまで作業を進めてから照明を点けようと後回しにしていたら、部屋が真っ暗になっているといったことがよくありました。


そこで、席にいながら照明をコントロールする方法がないものかと探してみたのですが、その際見つけたのがSwitchBotという製品です。以下の写真のようにスイッチに両面テープで取りつけることで、スイッチを遠隔操作可能にするデバイスとなっています。

さっそく購入し、照明スイッチへ取り付けを行いました。仕事机に座ったままで、スマートフォンやスマートスピーカーから照明を点けたり消したりできるというのは、なかなか快適です。


SwitchBotとRaspberry Piで点灯を自動化

しかし、楽をできるのであれば、より楽をしたいと思うのが人のさがです。しだいに、自分で操作するのではなく、暗くなったら自動で点灯するようにできないものかと思うようになりました。

実現可能か調べてみると、PythonのコードからSwitchBotを操作できるようにするライブラリを公開している方がいらっしゃいました。このライブラリを利用すれば実現できそうです。そのようなわけで実際にやってみました。


1. 構成


2. 点灯条件

点灯の条件は、以下の条件をすべてを満たす場合としました。

  1. 自分が自宅にいること → Raspberry Piから自分のスマートフォンのBluetooth信号が検出できること

  2. 部屋が暗いこと → 照度センサーで計測した照度が60ルクス以下であること

  3. 就寝時間帯でないこと → 時刻が12~24時であること

3. SwitchBotのスイッチ操作

Raspberry Piに必要なパッケージ、ライブラリをインストールし、PythonのコードからSwitchBotを操作できるか確認します。 


3.1. 必要パッケージをインストール

以下のコマンドを実行し、Python3のパッケージインストーラをインストールします。

$ sudo apt update
$ sudo apt install -y python3-pip

3.2. ライブラリをインストール

SwitchBot操作用のライブラリをインストールします。

$ pip3 install switchbotpy

3.3. SwitchBotのMACアドレスを確認

SwitchBotスマートフォンアプリを開き、操作したいSwitchBotデバイスの 設定 → 本体情報からMACアドレスを確認します。


3.4. 動作確認

次のようにテストプログラム"test_switchbot.py"を作成します(MACアドレスは置き換えてください)。

from switchbotpy import Bot

SWITCHBOT_MAC_ADDRESS = '【SwitchBotのMACアドレス】'

bot = Bot(bot_id=0, mac=SWITCHBOT_MAC_ADDRESS, name='bot0')
print('スイッチをONにします')
# SwitchBotのスイッチをONにする
bot.switch(True)

テストプログラムを実行し、SwitchBotのスイッチがONになることを確認します。

$ python3 test_switchbot.py
スイッチをONにします

4. 自宅にいるかどうかの判定

外出の際は、だいたいスマートフォンを持ち歩いていますので、自宅にいるかどうかの判定は、Raspberry Piから自分のスマートフォンをBluetoothで検出できるかどうかで行うことにしました。


4.1. ライブラリをインストール

PythonからBluetoothを扱うために必要なライブラリをインストールします。

$ pip3 install pybluez

4.2. 自分のスマートフォンのMACアドレスを確認

ご利用のスマートフォンがAndroidの場合は、設定 → デバイス情報 → BluetoothアドレスでMACアドレスを確認します。iOSの場合は、設定 → 一般 → 情報 → Bluetoothで確認することができます。


4.3. 検出確認

次のようにテストプログラム"test_detect_myphone.py"を作成します(MACアドレスは置き換えてください)。なお、bluetooth.lookup_nameは、Bluetoothデバイスの名前を問い合わせるメソッドです。問い合わせの応答があるかどうかを検出結果としています。

import bluetooth

MYPHONE_MAC_ADDRESS = '【スマートフォンのMACアドレス】'

if bluetooth.lookup_name(MYPHONE_MAC_ADDRESS, timeout=2):
    print('検出できました')
else:
    print('検出できませんでした')

テストプログラムを実行し、スマートフォンのBluetoothがONかつ自宅にある場合に「検出できました」と表示されること、および、スマートフォンのBluetoothがOFFあるいは屋外に持ち出した場合に「検出できませんでした」と表示されることを確認します。

$ python3 test_detect_myphone.py
検出できました

5. 部屋の明るさの取得

Raspberry Piに照度センサーBH1750FVIを接続し、部屋の明るさ(照度)を取得します。


5.1. 配線

Raspberry Pi Zero WHとBH1750FVIは、I2Cと呼ばれる通信方式で接続を行います。配線は以下のようになります。

  • GND (BH1750FVI) → GND (Raspberry Pi)

  • VCC (BH1750FVI) → 3.3V電源 (Raspberry Pi)

  • SDA (BH1750FVI) → GPIO2(I2C SDA1) (Raspberry Pi)

  • SCL (BH1750FVI) → GPIO3(I2C SCL1) (Raspberry Pi)


5.2. I2C接続の有効化

Raspberry Piは初期状態では、I2Cでの通信が無効化されているので、有効化します。

raspi-configコマンドで設定画面を起動し、「3 Interface Options」->「P5 I2C」->「はい」を選択します。

$ sudo raspi-config

5.3. 照度センサーが正しく接続できているか確認

I2C接続確認のためのコマンドをインストールします。

$ sudo apt install -y i2c-tools

i2cdetectコマンドを実行し、Raspberry Piに接続されているI2Cデバイスの一覧とそのアドレスを表示します。正しく接続できていれば、照度センサーBH1750FVIのアドレス0x23が表示されます。

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- 23 -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

5.4. ライブラリのインストール

コマンドを実行し、照度センサーにアクセスするためのライブラリをインストールします。

$ pip3 install smbus i2csense

5.5. 動作確認

次のようなテストプログラム"test_bh1750_sensor.py"を作成します。

import smbus
from i2csense.bh1750 import BH1750

bus = smbus.SMBus(1)
sensor = BH1750(bus)
# センサーから値を取得
sensor.update()
# 結果表示
print('現在の部屋の明るさは', sensor.light_level, 'ルクスです')

テストプログラムを実行し、センサー値が取得できることを確認します。

$ python3 test_bh1750_sensor.py
現在の部屋の明るさは 382.0 ルクスです

6. 点灯制御プログラム

以上を組み合わせて作ったのが以下の制御プログラム"light_controller.py"です。

import smbus
from i2csense.bh1750 import BH1750
import bluetooth
from switchbotpy import Bot
from datetime import datetime
import time

MYPHONE_MAC_ADDRESS = '【スマートフォンのMACアドレス】'
SWITCHBOT_MAC_ADDRESS = '【SwitchBotのMACアドレス】'

bus = smbus.SMBus(1)
sensor = BH1750(bus)
bot = Bot(bot_id=0, mac=SWITCHBOT_MAC_ADDRESS, name='bot0')

while True:
    # 照度センサーから値を取得
    sensor.update()
    # 明るさが60ルクス以下で、時刻が1224時で、
    # なおかつスマートフォンのBluetooth信号が検出できたら点灯
    if (sensor.light_level < 60.0
        and (12 <= datetime.now().hour < 24)
        and bluetooth.lookup_name(MYPHONE_MAC_ADDRESS, timeout=2) is not None):
        bot.switch(True)
    time.sleep(3)

実行は次のようにします。

$ python3 light_controller.py


まとめ

比較的簡単にスマートホーム化、ホームオートメーションが実現できました。今回の制御プログラムを少し書き換えれば、外出時に自動で消灯するようにすることも可能です。


また、今回は扱いませんでしたが、別のセンサーと組み合わせることで空気がよどんできたら換気扇を回すとか、時間になったら自動でお風呂を沸かすとか他にも色々できそうですね。

スマートホーム化は非常に取り組み甲斐があるので、ぜひ皆さんもお試しください。