COCORO AIRのAlexa Skillに不満があるが、改善方法が分からない。
Raspberry PiとAlexaで家電制御を行っているため、スマホアプリを使わなくても制御できる方法を教えて欲しい。
こんなお悩みを解決します。
最近、エアコンを買い替えました。最近の家電はインターネットに接続でき、どこからでも操作できるようになりました。
ただ、シャープのCOCORO AIRのAlexa Skillは、音声認識した結果に対して応答を待つという仕様のため、非常に使いづらいです。
ここでは、Raspberry PiやAlexaから操作できるようにしたいと思います。
今回は、シャープのエアコンを対象に、家電を操作する部分を構築していきます。
家電操作部分の詳細については、下記の記事を参考にしてください。
【解説】Node.jsによるWebサーバ構築
続きを見る
前提
以下の2点を前提とします。
- COCORO HOMEのユーザ登録や機器の登録は完了している。
- mitmproxy/mitmwebを起動できる環境が整っている。
また、mitmproxy/mitmwebを起動するサーバのIPアドレスは、192.168.0.2とします。
準備
GitHubからコードを取得し、一連の処理をします。
初期設定
# コードを取得
git clone https://github.com/yuruto-free/cocorohome.git
# build
cd cocorohome
docker-compose build
# .envファイルの作成
cat <<- _EOF_ > .env
DOCKER_COCOROHOME_MEMBERID=your-email-address
DOCKER_COCOROHOME_PASSWORD=your-password
_EOF_
.env
ファイルには、それぞれ、以下の情報を記入します。
変数 | 内容 |
---|---|
DOCKER_COCOROHOME_MEMBERID | COCORO HOME/AIRでログインする際のメールアドレス |
DOCKER_COCOROHOME_PASSWORD | COCORO HOME/AIRでログインする際のパスワード |
.env
ファイルに反映する内容configファイルの作成
COCORO AIRで家電を操作するためには、操作に対応するコマンドが必要になります。
このコマンドは公開されていないため、通信の内容を確認することで再現します。
ここでは、mitmproxy/mitmwebを用いて、通信の内容を確認し、家電を操作する際に送信されるJSONデータを取得することを目標にします。
mitmproxy/mitmwebの起動
mitmproxy/mitmwebがインストールされている環境で、以下のコマンドを実行します。
# mitmproxy の場合
mitmproxy
# mitmweb の場合
mitmweb --web-port 8000 --web-host 0.0.0.0 --listen-host 0.0.0.0 --listen-port 8080 --ssl-insecure --no-web-open-browser
Webブラウザを起動し、アドレスバーに以下を入力します。
http://192.168.0.2:8000
実際にアクセスすると以下のようなページが表示されます。
プロキシの設定
スマホの設定画面から、mitmproxy/mitmwebのプロキシ経由でインターネットにアクセスできるように設定します。
今回の場合、サーバとポートを以下のように設定します。
対象 | 内容 |
---|---|
サーバ | 192.168.0.2 |
ポート | 8080 |
COCORO AIRにアクセス
スマホから以下のリンクにアクセスします。
https://cocoroplusapp.jp.sharp/air/devicelist
アクセス後、mitmproxy/mitmwebにログが表示されていると思います。
ここで、ログは、「~d /*.jp.sharp
」でフィルタリングしています。
COCORO AIRから家電を操作
ログが表示されていることが確認出来たら実際に操作してみます。
COCORO AIR経由でエアコンをONにしてみます。
エアコンをONにした後、mitmproxy/mitmweb上でログが更新されていることを確認します。
エアコンの場合、以下のリクエストが投げられるので、mitmproxy/mitmwebから探します。
https://cocoroplusapp.jp.sharp/v1/cocoro-air/sync/air-conditioner
該当箇所を押下すると、右側のRequestタブに詳細と送信されたJSONデータが表示されます。
表示されたJSONファイルの内容をもとに、以下の構成でconfigファイルを作成します。
{
"air-conditioner": {
"start": {
{
"data": [
{
"edt": "0xFF",
"epc": "0xFF"
},
{
"edt": "0x11",
"epc": "0xBB"
},
{
"edt": "0xCC",
"epc": "0x44"
}
],
"deviceToken": "0123456789abcdef",
"event_key": "network_control",
"map_ver": 1234567890,
"model_name": "my-machine"
}
}
}
}
ここで、以下の点に注意してconfigファイルを作成してください。
同様の手順を踏み、エアコンをOFFにした場合の情報も取得し、設定します。
作成したconfigファイルは、使用しやすい名前を付けて以下のディレクトリに保存します。
cocorohome/src/config
参考情報として、上記のディレクトリにdummy.json
を格納しております。必要に応じてご活用ください。
以上で、configファイルの作成は終了となります。
使い方
ここでは、configファイルにair-conditioner
が登録されており、その中にstart
コマンドが登録されている場合について解説します。
この操作自体は、エアコンONに相当します。
GitHubからcocorohomeのリポジトリをcloneしたマシン上において、以下のコマンドを実行することにより、家電を操作できます。
# 移動
cd cocorohome
# ビルド
docker-compose build
# コンテナを起動する
docker-compose up -d
# コンテナに入る
docker exec -it cocorohome bash
# コマンドを実行する
/usr/local/bin/remote_IoT_device.sh -config IoT.json -device "air-conditioner" -mode start
# configファイル名:IoT.json # 実際に利用する場合は、自身で作成したファイルを指定
# 操作する家電: air-conditioner # エアコン
# 操作モード: start # 起動
カスタマイズ
操作モードとして、start/stopが登録されています。
これらを変更したい場合は、JSONファイルに加え、remote_IoT_device.sh
も修正が必要になります。
ここでは、プラズマクラスターを追加する場合を例に取り上げ、説明します。
まず、「configファイルの作成」の記載内容を参考に、JSONファイルを更新します。
{
"air-conditioner": {
"start": {
# 省略
},
"stop": {
# 省略
},
"plasmacluster": { # 追加
# 「configファイルの作成」の記載内容を参考に定義
}
}
}
次に、remote_IoT_device.sh
の下記の記載を探します。
# ===================
# = execute command =
# ===================
target_config=${BASE_DIR}/target.json
case "${exec_mode}" in
start | stop)
cat ${config_path} | ${JQ} ".[\"${target_device}\"].${exec_mode}" > ${target_config}
execute_command ${target_device} ${target_config}
rm -f ${target_config}
;;
deviceinfo)
get_device_list
;;
*)
;;
esac
上記を以下のように修正します。
# ===================
# = execute command =
# ===================
target_config=${BASE_DIR}/target.json
case "${exec_mode}" in
start | stop | plasmacluster) # plasmaclusterを追加
cat ${config_path} | ${JQ} ".[\"${target_device}\"].${exec_mode}" > ${target_config}
execute_command ${target_device} ${target_config}
rm -f ${target_config}
;;
deviceinfo)
get_device_list
;;
*)
;;
esac
上記を設定した上で、コンテナを再構築後、コンテナに入り、コマンドを実行すると操作できる家電が増えているはずです。
# コンテナ終了&ビルド
docker-compose down
docker-compose build
docker-compose up -d
# コンテナに入る
docker exec -it cocorohome bash
# コマンドを実行する
/usr/local/bin/remote_IoT_device.sh -config IoT.json -device "air-conditioner" -mode plasmacluster
まとめ
今回の実装はGitHubにまとめています。
https://github.com/yuruto-free/cocorohome/tree/v0.10
使い方
ここでは、configファイルにair-conditioner
が登録されており、その中にstart
コマンドが登録されている場合について解説します。
configファイルの作成方法は、本記事の「configファイルの作成」を参照してください。
GitHubからcocorohomeのリポジトリをcloneしたマシン上において、以下のコマンドを実行することにより、家電を操作できます。
# 移動
cd cocorohome
# ビルド
docker-compose build
# コンテナを起動する
docker-compose up -d
# コンテナに入る
docker exec -it cocorohome bash
# コマンドを実行する
/usr/local/bin/remote_IoT_device.sh -config IoT.json -device "air-conditioner" -mode start
# configファイル名:IoT.json # 実際に利用する場合は、自身で作成したファイルを指定
# 操作する家電: air-conditioner # エアコン
# 操作モード: start # 起動
カスタマイズ
操作モードとして、start/stopが登録されています。
これらを変更したい場合は、JSONファイルに加え、remote_IoT_device.sh
も修正が必要になります。
ここでは、プラズマクラスターを追加する場合を例に取り上げ、説明します。
まず、「configファイルの作成」の記載内容を参考に、JSONファイルを更新します。
{
"air-conditioner": {
"start": {
# 省略
},
"stop": {
# 省略
},
"plasmacluster": { # 追加
# 「configファイルの作成」の記載内容を参考に定義
}
}
}
次に、remote_IoT_device.sh
の下記の記載を探します。
# ===================
# = execute command =
# ===================
target_config=${BASE_DIR}/target.json
case "${exec_mode}" in
start | stop)
cat ${config_path} | ${JQ} ".[\"${target_device}\"].${exec_mode}" > ${target_config}
execute_command ${target_device} ${target_config}
rm -f ${target_config}
;;
deviceinfo)
get_device_list
;;
*)
;;
esac
上記を以下のように修正します。
# ===================
# = execute command =
# ===================
target_config=${BASE_DIR}/target.json
case "${exec_mode}" in
start | stop | plasmacluster) # plasmaclusterを追加
cat ${config_path} | ${JQ} ".[\"${target_device}\"].${exec_mode}" > ${target_config}
execute_command ${target_device} ${target_config}
rm -f ${target_config}
;;
deviceinfo)
get_device_list
;;
*)
;;
esac
上記を設定した上で、コンテナを再構築後、コンテナに入り、コマンドを実行すると操作できる家電が増えているはずです。
# コンテナ終了&ビルド
docker-compose down
docker-compose build
docker-compose up -d
# コンテナに入る
docker exec -it cocorohome bash
# コマンドを実行する
/usr/local/bin/remote_IoT_device.sh -config IoT.json -device "air-conditioner" -mode plasmacluster