書斎の家電3台、新品を買わずmandoの2ボタンに乗せた
書斎で作業に集中しているとき、エアコンやサーキュレーターを操作するのに「スマホのロックを解除して、ブラウザを開いて、mando を開いて、スクロールしてボタンを押す」のは正直めんどうです。理想は机の上に専用ボタンが1つあることでした。
買うか、使うか
机の上のボタンとして使えそうな市販品は2つ候補がありました。小さな無線スイッチを置いて casad に拾わせる方式と、WiFiマイコンから mando へ直接リクエストを送る方式です。どちらも普通に買えば作れます。
ただ、いまは新しいガジェットをしばらく買わない方針にしています。手持ちの機器にも転用できるものはありませんでした。キーボードはPCとのKVM共用でホットキーが使えず、タブレットは家族と共用、スマートスピーカーは別の部屋です。
そこで、新しいハードは買わずに、すでにある mando の画面を1枚増やす方向を選びました。書斎のエアコン・サーキュレーター・植物ライトの3つを、mando の「🔌 スイッチ」セクションにカードとして追加します。
状態が読めない機器がある
エアコンはECHONET Lite経由なので、on/offの状態を読めます。これは mando に元々ある kind = "switch"(enlの on/off 機器専用。同期確認ありでタイル表示)にそのまま乗ります。
サーキュレーターと植物ライトはそうはいきませんでした。どちらもSwitchBot Hub2の赤外線経由で、電源は一方通行にしか送れません。クラウドAPIに状態を問い合わせても、赤外線機器には「wrong deviceId」というエラーが返ってくるだけで、いまonかoffかは原理的にわかりません。
mando の設計原則の1つは「setのあとは必ずstateを取り直し、実際に変化したことを確認してから表示する」です。状態が読めない機器にこの原則をそのまま当てはめると、UIはずっと「不明」を出し続けるトグルになってしまいます。確認できないものを確認できたかのように見せるのは、違うと判断しました。
選んだこと: 状態を持たないswitch
mando に stateless = true を新設しました。この印が付いたswitchは get_state を持てません(両方指定すると設定エラーで弾く)。UIはトグルではなく、ON/OFFの独立した2つのボタンにしました。
押すと「送信しました」という結果だけを2.5秒表示して消えます。状態が確定したという意味の表示ではないので、確定したように見せる表現はあえて避けています。ポーリングの対象からも外し、アクティブ窓で監視し続けることもしません。
POST /api/devices/study_fan/on
裏で叩いているコマンドは、casad の自動化ルールが使っているのと同じ swb cmd turnOn / turnOff です。人が押すボタンと、ルールが自動で押すボタンが、同じ経路を通ります。
見送ったこと: ロック画面からのワンタップ
Androidには、アプリのショートカットをクイック設定タイルに登録できる仕組みがあります。これを使えば、ロック画面からワンタップでエアコンやサーキュレーターを操作できるはずでした。手順まで確認しましたが、実際に設定するのは見送りました。3枚のカードを mando に足すだけで、机の上のボタンという最初の目的には十分だと判断したためです。
住んでみた答え合わせ
3枚のカードは配備したその日のうちに動作確認まで終わりました。エアコンは開閉のシャッターと同じように状態が確定してから表示され、サーキュレーターと植物ライトはON/OFFのボタンとして迷わず押せます。
1つだけ覚えておく必要がある挙動があります。サーキュレーターには「在室でOFF・不在でON・21時にOFF」という casad のルールが別に生きています。手でONにしても、次の在室判定が来るまでは上書きされません。ただし退室してから再入室すると、そこでルールが発火してOFFに戻ります。手動操作とルールが同じ機器を触るときは、この優先順位を頭に入れておく必要がありました。
専用の物理ボタンという最初の理想は、まだ叶っていません。新しいガジェットを買わない方針が明けたら、小さなマイコンで机の上のボタン箱を作る案は残したままにしています。それまでは、スマホの mando を開く手間で十分だという結論です。