この記事は記事は道メン(身内向け)アドベントカレンダーの2日目の記事です。
はじめに
Qiitaの記事投稿は100万年ぶりです。なずなです。
ある程度いろいろなプログラムを書けるようになってきたので、そろそろアウトプットが必要な頃合いでしょうということで投稿します。
空気清浄機が欲しかったので買いました。
購入したのはシャープの加湿空気清浄機 KI-LS40-Wです。
特徴は気化式の加湿機能を備えている点と、COCORO AIRに対応にしており、外部から操作が可能な点です。
...今、「外部から操作が可能」と言いました。
つまり、APIが存在してるということです。
botから制御ができたら、さらに便利になるのではないでしょうか?
ということで早速調べたのですが、公式に提供されているものはなく、実際にスマートフォン等の端末のCOCORO AIRアプリの通信を覗き見て解析する必要がある、ということがわかりました。
調べた結果ヒットした記事はこれだけ。
シャープの加湿空気清浄機をアプリ外から操作する(https://rcmdnk.com/blog/2021/03/03/computer-iot-raspberrypi/)
記事にあったのは私の触ったことが無いPythonのサンプルコードでした。
「じゃあPythonを勉強しよう」でもよかったのですが、いろんな都合でNode.jsばかり触っているのと時間があまり取れないので「じゃあNode.js版も作ろう」ということに。
プロキシを利用していろいろ取得
mitmproxyを利用して通信を覗き見する部分は完全に同一であるためスキップします。
ちなみにWSLでmitmproxy導入して見てやろうと思ったらポートフォワーディング関係で沼った話もありますが、それは別の機会に。素直にWindows版使うのがいいかもしれません。
コード
コードはこちら(Github)
npm install
して、state_sample.jsonやら.env_sampleやらのファイル名から末尾の_sample
を消していい感じにします。
先に挙げたページを見ると、何を取得すればいいのかわかるかと思います。
流れ
JSESSIONIDの取得(get_JSESSIONID
)→コマンドをシャープのサーバーへ送信(sendCommand
)
sendCommand
の引数として、JSESSIONIDと操作用のコードを渡しています。
非同期処理周りなにもわからないのでGithubCopilotの力を借りています。
サンプルコードでは、毎回JSESSIONIDを取得しているので、あまりスマートなやり方ではないです。有効期限切れるまで保持して切れたら更新する、とか前回使用したJSESSIONIDを再利用してみて、エラーが返ったら再取得して再試行するとかがいい気がします。公式のアプリは後者のやり方をしてたはず。
応用例
私はIFTTTとDiscordBotと組み合わせて、毎朝おやすみモードから自動運転モードに切り替えるような使い方をしています。
最後に
あんまり内容が濃いものではなかった気もしますが、ここまで。ありがとうございました。
最後、関係ないんですがおすすめのReact入門の記事や書籍あれば教えてほしいです。