🔌

Merossのスマートプラグとスマート電球をハックして間接照明をリモコン操作できるようにした話

2020/03/02に公開

こんにちは、たつきちです。

僕は家電やデジタルガジェットが大好きで、自宅の賃貸マンションをめっちゃスマートホーム化しています。

この記事では、Merossというメーカーのスマートプラグ(コンセントをスマート化するガジェット)とスマート電球をハックした話をお伝えします。

結果的に、リモコン式でない普通のフロアライトと天井照明を、flicというスマートボタンを使って遠隔でON/OFFできるようになっていて、とても快適です✨

ぜひ最後までお付き合いください。

以前の構成

もともと、以下のような構成で、リモコン式でない間接照明をスマートボタンを使ってON/OFFできる構成にはしていました。

  • 対象の照明器具はフロアライトとペンダントライト
  • フロアライトはコンセントに、ペンダントライトは天井のシーリングに接続
  • フロアライトとコンセントの間に オーム電機のOCR-05W を設置
  • ペンダントライトとシーリングの間に オーム電機のOCR-CRS01W を設置
  • いずれも付属の赤外線リモコンによってコンセント・シーリングそれぞれの根元で電源のON/OFFが制御できるようになるというもの
  • これらの赤外線信号を Nature Remo に登録しておく
  • スマートボタン「flic」(こちらの記事で詳しく紹介しています)からNature RemoのAPI経由でコンセント・シーリングのON/OFFを行う

しかし、この構成には以下の点で不満がありました。

  • flic → Nature Remo → OCR-05W/OCR-CRS01W と信号の経路が長いので、ボタンの操作から実際に電気がON/OFFするまでにまあまあのラグがある(1秒〜数秒)
  • OCR-05Wの見た目がとにかくダサい

というわけで、最近の時流に乗る意味でも、OCR-05W/OCR-CRS01Wを使うのをやめて、Wi-Fiベースのスマートプラグ・スマート電球に乗り換えてみようと考えました。

今の構成

検討の結果、現在は以下のような構成になっています。

  • 対象の照明器具は同じくフロアライトとペンダントライト
  • フロアライトはコンセントに、ペンダントライトは天井のシーリングに接続
  • フロアライトとコンセントの間に Merossのスマートプラグ を設置
  • ペンダントライトは直接シーリングに接続し、使う電球を Merossのスマート電球 に変更
  • いずれも Merossのスマホアプリから直接Wi-Fi経由で制御可能
  • flicから「Merossアプリがスマートプラグ・スマート電球に送るのと同等のHTTPリクエスト」を送信してON/OFFを制御

見た目がとにかくダサい OCR-05W/OCR-CRS01Wを取り除くことに成功し、結果的に通信経路も flic → Meross と短縮され他ので、flicの操作からほとんどタイムラグなしで照明がON/OFFできるようになりました🙌

この構成のポイントは言うまでもなく太字にした最後の2つです。

  • いずれも Merossのスマホアプリから直接Wi-Fi経由で制御可能
  • flicから「Merossアプリがスマートプラグ・スマート電球に送るのと同等のHTTPリクエスト」を送信してON/OFFを制御

スマートプラグ・スマート電球をflicから操作するためには、正式にAPIが公開されているか、無理やりハックして任意の場所から正常な信号を送信できるようにする必要がありましたが、僕が知る限りAPIが公開されているスマートプラグは現状市販されていませんでした。

そんな中、こちらの記事 を見てMerossのスマートプラグなら少なくとも通信内容をハックすることができるということが分かったので、これを選択しました。

Merossのスマートガジェットの通信は簡単にハックできる

先ほどから「ハック」とかっこいい言葉を連呼していますが、やったことは全然大したことではなくて、ただアプリがスマートプラグ・スマート電球に送っているON/OFFの信号(HTTPリクエスト)の内容をキャプチャしただけです。

具体的な手順の流れとしては、

  1. PCとスマホを同じWi-Fiに接続
  2. PCでパケットキャプチャツール「Charles」を起動
  3. スマホのネットワーク設定を変更して、Charlesのプロキシサーバーを経由するようにする
  4. その状態でMerossアプリでスマートプラグ・スマート電球を操作して、そのときのHTTPリクエストをキャプチャする
  5. それと同一の内容のHTTPリクエストをflicから送るように設定する

という感じです。以下、手順に沿って詳しく説明していきます。

1. PCとスマホを同じWi-Fiに接続

スマホからの送信パケットをPCを使ってキャプチャしたいので、同じWi-Fiに接続しておく必要があります。

2. PCでパケットキャプチャツール「Charles」を起動

Charles はパケットキャプチャツールの一つです。同種のツールでは Wireshark が有名ですが、CharlesはHTTPに特化していて、その分UIが直感的で使いやすい印象です。

Charlesは有料ツールですが、無料トライアル版でも起動時に広告が表示されることを我慢すればずっと使い続けられるようです。

Macの場合はbrew caskでインストールできます。

$ brew cask install charles

他のOSの場合は、こちらからダウンロード してインストールしてください。

インストールしたら、さっそく起動してみましょう。

アプリを起動すれば、パケットをキャプチャするためのプロキシサーバーが自動で起動しますが、少しだけ設定内容を確認&修正する必要があります。

まず、メニューの Proxy > Proxy Settings... を開いて設定内容を確認しましょう。

おそらくデフォルトで 8888 ポートが設定されているので、このままでOKです。

また、スマホからCharlesのプロキシサーバーを利用できるように、アクセスコントロールの設定をしておきましょう。

Proxy > Access Control Settings... を開いて、 0.0.0.0/0 を追加しておけばとりあえず全許可になります。

あとは、この次の工程で必要になるので、PCのプライベートIPアドレス(=Charlesサーバーのホストアドレス)を ip コマンドなどで確認しておきましょう。

Charlesの Help > Local IP Address でも調べることができます。

3. スマホのネットワーク設定を変更して、Charlesのプロキシサーバーを経由するようにする

ここはiOSを例に解説します。Androidの方は適宜読み替えてください🙏

設定 > Wi-Fi から、現在接続しているWi-Fiの詳細設定を開いて、

一番下にある プロキシを構成 がオフになっているはずなので、これを開きます。

手動 に切り替えて、 サーバ に先ほど確認したPCのプライベートIPアドレスを、 ポート に先ほど確認したCharlesのポート番号(デフォルトでは 8888 )をそれぞれ入力して、保存します。

これで、iPhoneのHTTP通信がすべてCharlesのプロキシサーバーを経由するようになります。

※ 使い終わったら「プロキシ構成」を「オフ」に戻すのを忘れないようにしましょう。これを忘れると「なんかiPhoneがネットに繋がらないよー!」と無駄にハマることになります。

ちなみに、HTTPS通信もCharlesで覗けるようにするには

ここまでの設定だけだと、HTTPS通信の中身は暗号化されていてCharlesから覗けないので、別の用途でHTTPS通信をキャプチャしたい場合は追加で以下の設定が必要になります。(iPhoneの場合)

  1. Safariアプリで http://charlesproxy.com/getssl にアクセスする
  2. 画面の案内に従ってプロファイルをダウンロードする
  3. ダウンロードしたプロファイルを、 設定 > 一般 > プロファイル でインストールする
  4. 設定 > 一般 > 情報 > 証明書信頼設定 でCharlesの証明書の信頼をONにする
  5. PCのCharles側で、 Proxy > SSL Proxy Settings...*:* を追加する

詳しくは こちらの記事 などをご参照ください。

4. その状態でMerossアプリでスマートプラグ・スマート電球を操作して、そのときのHTTPリクエストをキャプチャする

ここまででパケットキャプチャの準備は整っているので、普通にスマホのMerossアプリを操作して、目的のスマートプラグ・スマート電球をON/OFF操作してみましょう。

すると、Charles側で以下のようなパケットが確認できます。(無関係なパケットも大量に流れるので、左下のフィルタにMerossデバイスのIPアドレスを入れておくと便利です)

これがMerossデバイスをON/OFFするためのHTTPリクエストのペイロードになっています。

{
	"payload": {
		"togglex": {
			"onoff": 1, // ←これが1ならON、0ならOFF
			"channel": 0
		}
	},
	"header": {
		"messageId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
		"method": "SET",
		"from": "http:\/\/xxx.xxx.xxx.xxx\/config",
		"sign": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
		"namespace": "Appliance.Control.ToggleX",
		"triggerSrc": "iOS",
		"timestamp": 1583076745,
		"payloadVersion": 1
	}
}

改竄防止のためっぽい "sign" のようなプロパティもありますが、 "timestamp" の値と整合していればOKのようで、丸ごとコピペすればそのまま流用できます。

4行目の "onoff" の値を 1 にするとON、 0 にするとOFFの操作になります。

この時点で、以下のようにしてcurlからMerossデバイスを操作できることを確認できます。(送信先の xxx.xxx.xxx.xxx はもちろん対象のMerossデバイスのプライベートIPアドレスです)

curl -X POST  http://xxx.xxx.xxx.xxx/config -H "Content-Type: application/json" -d '{
	"payload": {
		"togglex": {
			"onoff": 1,
			"channel": 0
		}
	},
	"header": {
		"messageId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
		"method": "SET",
		"from": "http:\/\/xxx.xxx.xxx.xxx\/config",
		"sign": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
		"namespace": "Appliance.Control.ToggleX",
		"triggerSrc": "iOS",
		"timestamp": 1583076745,
		"payloadVersion": 1
	}
}'

5. それと同一の内容のHTTPリクエストをflicから送るように設定する

あとは、curlでやったのと同じHTTPリクエストをflicから送るように設定するだけです。

flicアプリでのHTTPリクエストアクションの設定方法の詳細は、ここでは割愛させていただきます🙏

これでめでたく、flicボタンの操作でMerossのスマートプラグとスマート電球をON/OFFできるようになりました!🙌

まとめ

  • オーム電機のOCR-05W/OCR-CRS01Wを使った運用から、Merossのスマートプラグ・スマート電球を使った運用に切り替えたら、動作のタイムラグも削減できたし、スマートプラグの見た目も美しいし、満足度大幅アップ!
  • Charlesでスマホのパケットキャプチャができると色々なアプリのHTTP通信が覗けて夢が広がる!
GitHubで編集を提案

Discussion