@kotyのブログ

PythonとかAWSとか勉強会のこととかを、田舎者SEがつづります。記事のライセンスは"CC BY"でお願いします。

後付け自動窓開け閉め装置「ムーブウィンドウ」をプログラムから操作する

背景

自分は暑いのが苦手で仕事のパフォーマンスは落ちるしQoLは落ちるしで、夏はいつも憂鬱な日々を過ごしている。 特に夜に気温が下がらないのが辛い。かといって夜中エアコンをつけるのもそれはそれで冷えるので無理。

この対策として以下をやりたいと常々思ってきた。

  • エアコンをタイマーで稼働させておき、就寝後1,2時間で切れるようにしておく。
  • 一定の温度になったら窓を開ける

イケてる人だったらハンズで材料を買ってきてサーボモーターか何かで窓を開け閉めできるようにするんだろうけど、 あいにく自分にはそのスキルが無い。

しかし最近になってホームオートメーションのデバイスやエコシステムががそろってきた。時はきたれりである。

今回以下を導入してみた。 www.thanko.jp なかなかのお値段がするが、QoLのためなので仕方がないし、これでハッピーになるならむしろ安いくらいだ。

設置

取説通りにやればOK。取り付けたかった窓はこの製品が対応する幅よりも狭いので、10cmほど切断した。 切断方法も取説に書いてあるので大きな問題はなかった。金ノコがないと切断は厳しいかも。

Smart Lifeアプリから操作できるところまで確認できた。 しかしアプリから操作したいのではない。アプリは不要。ほしいのはAPI。アプリなんて飾りなのです。

事前にサンコー社のサポートにAPIによる操作ができるか確認してみたら、「APIは公開しておりません」との冷たいご回答が返ってきた。 しかし調べてみるとSmart Life対応デバイスはtuya APIなるプラットフォームで操作できるらしい。できるではないか。 サポートさんはちゃんとしてほしい。

APIからの操作

初期設定

基本的には以下に記載されている手順でできる。 qiita.com

WiFiのAPが複数ある場合は、狙ったAP以外は切っておかないとうまく接続できなかった。ここがかなり苦労した。

操作方法

取得した情報を使って以下のコマンドでデバイスの状態を取得できるようになる。

tuya-cli get -all --id <id> --key <key>

各dps値の意味

しかしこの値の意味が分からない。ググってもどこにも情報がない。

{ devId: 'xxx',
  dps:
   {
     '6': false,
     '101': 0,
     '102': 'pause',
     '103': false,
     '104': '6',
     '105': '7',
     '106': 'left',
     '107': 'cancel',
     '108': false,
     '109': false } }

仕方がないので、取説に掲載されているアプリの画面を参考に各dps値の意味を予測しつつ、値を実際に変更してみた。

以下のコマンドで全開する。

tuya-cli set --dps 102 --set open  --id <id> --key <key>

まとめたのが以下。必要なdps値しか実際に動かしていない。

{ devId: 'xxxx',
  dps:   {
      '6': false, <— アラームロック
      '101': 0, <- 1以上全開 0全閉
      '102': 'pause’, <-現在の状態。指定も可。open/close/pause
      '103': false, <- ロック(たぶん)
      '104': '6’, <- 動作速度(たぶん)
      '105': '7’, <- Anti clamp strength
      '106': 'left’, <- 窓を開く方向
      '107': 'cancel’, <-infared control
      '108': false, <- infered fortification
      '109': false <- Manual start(たぶん)
   }
}

dps値102にopenコマンドを送って途中どこかでpauseコマンドを送ればちょっと開けることができる。

しかし動作遅延の関係で、open送出してから何秒後にpauseを送出すれば良いのかよく分からんし、そもそも再現性が怪しい。 現実的には、ストッパーか何か(つっかえ棒?)を使って所望の位置で止まるようにしとくってもんかな。

CLIだと使いにくいのでWeb APIを直接叩けないかとCLIのソースをざっと眺めると、httpじゃないっぽいな。MQTTかな。なので、CLIでがんばってみる。

今後の展望

何らかの手段で温度を取り、一定のしきい値を超えたら窓を開閉したい。

目の前にRasPi Zero Wがある。これで何とか。