ラズパイでおうちハック

導入

Nefrockでアルバイトをしている,ビルの2Fシェアハウス在住の渋谷樹弥です.

最近,スマートホームというワードを耳にするようになりました.

スマートホームとは,リモート操作に対応した家電をgoogle homeなどのハブと接続することで,スマホ操作や音声で照明をON/OFFさせたり,電子的に家の鍵を開け締めさせたりするものです.

普通の家電は,壁のスイッチやリモコンで操作するため,常に持ってるスマホから全部コントロールできるようになればとても便利そうです.

しかし,こういった製品はかゆいところに手が届かないことがあり,各機能をもっと細かく調整できればもっと便利になるのに,と思ったことはありませんか?

そこで,今回はラズパイを使ってスマートフォンから家電を操作する環境を構築する方法をこの記事にまとめました.

ラズパイ上にAppleのHomekitを模擬するhomebridgeというサービスを常駐させ,iPhoneのhomeアプリやsiriからLED照明とエアコンをスマホから操作できるようしています.

材料

・ラズパイ3B+(なんでも良いが,無線LANモジュール付き推奨)

・ブレボ

・赤外線LED,受信モジュール

・抵抗,ジャンパ

スマート化する家電

・Philips Hue スマートライト+ブリッジ

・家庭用エアコン

 

主な手順

・赤外線送受信回路の作成,

・エアコンのリモコンの信号を記録

・Philips Hueの操作を確認

・家電を操作するスクリプトを作成

・ラズパイ上にhomebridge(appleのhomeで操作可能なサーバーアプリケーション)を構築

・siriや画面のスイッチで家電を操作できるようにすることを確認

 

赤外線送受信回路の作成

f:id:shibushibuya:20211027203003j:plain

ブレボ上に組んだエアコン操作用回路

エアコンは,リモコンから発信された赤外線LEDの点滅により一方的に情報を受け取ります.

一般的に,赤外線LEDは搬送波と呼ばれる38kHzの高速な点滅が一定時間続く(ビット0)か消灯(ビット0)かで表されるビットを並べて情報伝達を行います.

赤外線受信モジュールは,38kHzの搬送波で変調された信号のみをピックアップして元の0/1の信号を出力するので,それをラズパイのIOにそのまま入力します.

赤外線LEDはラズパイのIOでは電流が小さくて光量が足りないため,トランジスタで増幅します.

ブレッドボードにこんな回路を組みました(10Ω抵抗でLEDをオーバードライブしているので,定格にする場合は30Ωに変える).

f:id:shibushibuya:20211027205049j:plain

赤外線送受信回路図

エアコンのリモコンの信号を記録

 

このスクリプト*を使ってリモコンの信号を記録・送信します.

※ オリジナルのirrp.pyには,エアコンなど長い信号を記録できても送信できないバグがあるので,通信コードを分割してエラーを修正した

 

記録

今回は18pinを入力に使っているので,-gに18を指定します.

例えば,26度設定のエアコンの信号を記録するときはこんな感じのコマンドを打ちます.

python3 irrp.py -r -g18 -f codes aircon:26 --no-confirm --post 130

 

送信

先程記録した信号でエアコンを操作できることをチェックします.

17pinを出力に使っているので,-g17がついています.

python3 irrp.py -p -g17 -f codes aircon:26

 

操作できない場合,回路を確認したり,赤外線が出ているかをスマホなどのカメラでチェックしたりしてください.

ラズパイのクロック設定が不適切だと,搬送波の周波数が19kHzになってる可能性があるので,このサイトに従ってクロックを修正してみてください(これを特定するのに1日かかった).

 

 

Philips Hueの操作を確認

Philips Hueのスマートライトをラズパイから操作可能なことを確認します.

このスマートライトはHTTPベースのAPIが用意されており,ブリッジのIPアドレスにHTTPのPUTを送ることで操作ができるなど,ハックしやすいです.

リクエストを送るスクリプトを組んで

python3 hue_client.py -i 1 -u [ユーザー名が書かれたファイル]

このようにコマンドで操作できることが確認できればOKです.

 

API用のユーザー名とはブリッジから与えられるランダムな文字列で,一度生成したらそのブリッジでは同じものを使い続けることができます.

今回は-uオプションで与えられたファイルの中身を読み込んでユーザー名をスクリプトに教えるようになっています.

ユーザー名の取得方法はこちらなどを参照ください.

 

homebridgeサーバーの構築

こちらのリポジトリのプログラムを使います.

動作にnodeが必要なので,適当にインストールします.

aptのサーバーにあるnodeのバージョンが古いという話ですが,今回は問題なかったので詳しく調べてません.

sudo apt update
sudo apt install -y nodejs npm

 

続けてnpmにhomebridgeをインストールします.

ホストが送る司令に対してコマンドを実行したいので,homebridge-cmdも必要です.

sudo npm install -g homebridge
sudo npm install -g homebridge-cmd

 

homebridgeをサービスとして常駐させるためのコンフィグを/etc/systemd/system内に配置します.

 

sudo systemctl enable homebridge.service
sudo systemctl start homebridge.service

で起動するはず.

 

homebridge自体の挙動を制御するコンフィグ~/homebridge/config.jsonを作成します.

公式のサンプルを元に,主としてaccesoriesタグの中をいじってあります.

"accesory": "CMD" でhomebridge-cmdへの記述である事を指定し,

name, on_cmd, off_cmdでアプリに表示する名前やスイッチ操作をどう受け付けるかを決められます.

今回のライトとエアコンの様に複数のスイッチを定義することもできます.

 

f:id:shibushibuya:20211103225027j:plain

エアコンをONにする様子

f:id:shibushibuya:20211103225207j:plain

電気をON,OFFする様子

 

まとめ

今回はラズパイでライトやエアコンのON/OFFの操作をするスマートホーム環境を立ち上げ,スマートフォンと実際に連携が可能なことがわかりました.

しかしながら,これだけではまだ市販のブリッジと比べてできることが同等か少し劣る程度にとどまっています.

今後は操作対象の家電やセンサーを充実させて機能をもりもり盛っていきたいと考えています!(続編あるかも)

センサの拡張

・寝ているか起きているかをカメラで検出

・人感センサーで入退室を検出

ハードウェアの充実

・カーテンを決まった時間に開け閉めしたい

多段階調整

・まだON/OFFの制御しかできないが,将来的にはライトの明るさなどを段階的に調整可能にしたい