広告 デバイス

【解説】Raspberry Piからシャープのエアコンをアプリ外から操作する

※本ページには、プロモーション(広告)が含まれています。

悩んでいる人

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_MEMBERIDCOCORO HOME/AIRでログインする際のメールアドレス
DOCKER_COCOROHOME_PASSWORDCOCORO 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

実際にアクセスすると以下のようなページが表示されます。

mitmwebアクセス時の画面

プロキシの設定

スマホの設定画面から、mitmproxy/mitmwebのプロキシ経由でインターネットにアクセスできるように設定します。

今回の場合、サーバとポートを以下のように設定します。

対象内容
サーバ192.168.0.2
ポート8080
プロキシの設定

COCORO AIRにアクセス

スマホから以下のリンクにアクセスします。

https://cocoroplusapp.jp.sharp/air/devicelist

アクセス後、mitmproxy/mitmwebにログが表示されていると思います。

ここで、ログは、「~d /*.jp.sharp」でフィルタリングしています

cocoroplusへアクセス時のログ

COCORO AIRから家電を操作

ログが表示されていることが確認出来たら実際に操作してみます。

COCORO AIR経由でエアコンをONにしてみます。

エアコンをONにした後、mitmproxy/mitmweb上でログが更新されていることを確認します。

エアコンON後のログ

エアコンの場合、以下のリクエストが投げられるので、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ファイルを作成してください。

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

スポンサードリンク



-デバイス
-, ,