Sympapaのスマートホーム日記

スマートなんとかはスマートじゃない方法でつくられている

Deebot X1 OMNI (3): Home Assistantのダッシュボード設定

Sympapaです。

前回までの記事で書いたとおり、ロボット掃除機:Ecovacs Deebot X1 OMNIのHome Assistant連携にカスタムインテグレーションである"Deebot-4-Home-Assistant"を使わせていただいています。
機種依存なのかちょっと不具合はありますが、APIの公開されていないクラウド経由の制御をハックするとか凄すぎるしありがたやです。
github.com


不具合はあれどなんとか回避策も判ってきたので、今回はおウチのコントロールパネルのUIとなるHome Assistantのダッシュボードを作っていきたいと思います。

■とりあえずこれまでのDeebot関連記事

■DeebotとHome Assistant連携のゴール

嫁様の要求により我が家初のロボット掃除機としてDeebot X1 OMNIを仕方なく購入したワケですが、使い始めて3週間経った今も嫁様は使い方を覚えていません(笑)
そんなワケでDeebotのアプリで部屋を指定したりして掃除させるのは面倒くさいので、おウチのコントロールパネルから簡単に出来るようにしたいって感じです。以下のことを実現したいと考えていますが、とりあえず今回は1)~3)を実現したいと思います。
1)簡単に部屋を指定して掃除できるようにしたい
2)簡単に場所(食卓の下など)を指定して掃除できるようにしたい
3)掃除機のステータスが見れるようにしたい
4)ステーションのタンクの水の量が見れるようにしたい →これは"Deebot-4-Home-Assistant"でサポートされてないし無理そうかな?

■部屋指定の掃除と場所指定の掃除のUI

”Deebot X1 OMNI”はEcovacsのアプリからは"自動清掃"以外に、部屋を指定する"エリア清掃"と、特定の場所(例えば食卓の下)を指定する"カスタムエリア清掃"が出来ます。
部屋を指定する"エリア清掃"の方はマップ上のその部屋が「キッチン」であるとか「リビング」であるとかを選択して設定しておけば、内臓の音声アシスタントで「キッチンを掃除して」なんてことも出来ます。残念ながら部屋の名前を自由に付けることは出来ません。音声認識のハードルとかもあるんかな。
部屋ごとに掃除回数、吸引力、水拭き時の水の量を設定しておくことが出来ます。
一方の"カスタムエリア清掃"はマップ上で手動で四角く囲ったエリアを清掃してくれますが、こちらはプリセットは出来ず掃除する範囲を毎回指定する必要があります。


部屋を指定する"エリア清掃"の方はEcovacsアプリや音声アシスタントからの操作で出来ますが、アプリからの操作は手数が多いので快適とはいえません。
"カスタムエリア清掃"の方は四角をドラッグして範囲を指定する方式なので、毎回同じ範囲を指定することすら難しいです。

"Deebot-4-Home-Assistant"を使ってHome AssistantとDeebotを連携させると、Home Assistantからコマンドで座標を指定して"カスタムエリア清掃"をさせることが出来るのでプリセットを作ることが可能になります。
実際の座標の取得方法は前回の記事に書いています。
sympapa.hatenablog.com

【カスタムエリア清掃のコマンド例】

service: vacuum.send_command
target:
  entity_id: vacuum.omni
data:
  command: custom_area
  params:
    coordinates: 1360,916,2360,-83 ←カスタム清掃する範囲の座標(x1,y1,x2,y2)


もちろん部屋を指定して掃除させることも可能です。
部屋コードはEcovacsのサーバの方で部屋に番号が振られているのでそれを使用し、","で区切れば複数の部屋を順に掃除してくれます。
部屋コードはデバイスを開いて「属性」のところで確認できます。

【エリア清掃のコマンド例】

service: vacuum.send_command
target:
  entity_id: vacuum.omni
data:
  command: spot_area
  params:
    rooms: 1,0,2 ←部屋コード
    cleanings: 1


これを使用して、おウチのコントロールパネル上での簡単な操作で、掃除したい部屋やプリセットしてある「カスタムエリア」の掃除が開始されるようにしたいと思います。
部屋を指定するUIは"Deebot-4-Home-Assistant"のExampleページにあったAdvanced UIを使わせて貰いました。
deebot.readthedocs.io
複数の部屋を指定し、指定した順序で掃除してくれるという素晴らしさです。
清掃中は部屋を選択するボタンがグレーアウトしたりしてUIの見た目も凝ってます。
。。。が、どこでどう失敗したのか掃除開始のスクリプトがDeebotに指定した部屋を渡してくれず、結構中身を弄くりまわしました。なかなか苦労した大人の夏休みの自由研究でした(笑)
そしてこれをベースに改造して「カスタムエリア」も選択できるようにしました。
(後で画面のgifアニメーションを載せます)

■ステータスの表示や設定の切替

"Deebot-4-Home-Assistant"ではDeebotアプリで設定できる項目の内の一部の設定を変更でき、また一部ステータスを取得してくれます。新しい機種における機種依存の項目は対応していないんじゃないかと思います。
設定できる項目は多くはないので、とりあえず可能なものは全ておウチのコントロールパネル上で切替できるようにしておきます。
ステータス表示の方は既にVacuum-card上に消耗品の交換時期というか残りのパーセンテージは表示されているし、追加で表示したいのは「モップの有無」くらいかな。本当はステーションのタンクの水の量を表示させたいんですが、Ecovacsアプリでは確認できるけど"Deebot-4-Home-Assistant"では取得できないんですよね。
開発者さんはX1 OMNIを使用されてはいないので、ここはX1 OMNIを使用されている方で通信を解析できる神の登場待ちか。。。


【備忘録】
・オートメーションやスクリプトからモップの水量を変える
設定はservice: "select.select_optin"を使えばできます。

・吸引力とバッテリー残量を取得する
吸引力とバッテリー残量はエンティティではなくロボット掃除機の属性となっています。
template sensorを使ってステータスをエンティティとして使えるようにしました。

- platform: template
  sensors:
    deebot_omni_fan_level:
      friendly_name: "deebot_omni_fan_level"    
      value_template: '{{ states.vacuum.omni.attributes.fan_speed }}'

オートメーションやスクリプトからの設定の方はservice: "vacuum.set fan speed"を使えばできます。

・掃除回数を設定する
Deebotは掃除回数(1回掃除 or 2回掃除)を設定できます。掃除の丁寧さみたいなもんです。
"Deebot-4-Home-Assistant"ではDeebot側の掃除回数の設定を取得出来ませんが、掃除開始コマンドのパラメータには"cleanings"がありたぶんこれが掃除回数だと思うので、これをおウチのコントロールパネルのUIから設定できるようにしてみました。

■こうなった

元にさせていただいたExample UIのコードが凄く長い上に更に追加していて長く汚くしてしまった(笑)のでコードを載せるのは止めておきますが、動かすとこんな感じになってます。

あとは掃除の開始時にGoogle Nest Hubから「水拭き清掃を開始します。」or「モップは装着されていません。吸引清掃を開始します。」→「〇〇を清掃します。」と話すようにしました。


さて、あとはこれで嫁様がDeebotを使いやすくなるのかどうかですね(笑)


それでは。