Sympapaのスマートホーム日記

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

Deebot X1 OMNI (2): Home Assistant連携難航中(ちと進展)

Sympapaです。

前回の記事で書いたとおり、ロボット掃除機:Ecovacs Deebot X1 OMNIのHome Assistant連携が難航しています。
Home Assistant純正のEcovacsインテグレーションは何故かインストールできず、唯一開発がアクティブなカスタムインテグレーションである"Deebot-4-Home-Assistant"をインストールしましたが、一応動くものの色々問題がありました。
github.com

今回はその問題解決がちょっとだけ進展したので、備忘録を兼ねてやったことを書いていきます。
前回の記事のコピペも多用するので、同じ記事だと錯覚しないようご注意ください(笑)

■DeebotとHome Assistantの連携のゴール

まぁ大体は、Deebotのアプリでやると面倒くさいことを家のコントロールパネルから簡単に出来るようにしたいって感じです。以下のことを実現したいと考えています。
・ワンタッチで部屋を指定して掃除できるようにしたい
・ワンタッチで場所(食卓の下など)を指定して掃除できるようにしたい
・掃除機のステータスが見れるようにしたい
・ステーションのタンクの水の量が見れるようにしたい →これは"Deebot-4-Home-Assistant"でサポートされてないし無理そうかな?


そんなワケでできるかどうか知らんけどHome Assistantと連携してやりたいことのゴールをイメージにすると下の図のような感じです。あくまでゴールのイメージなので現時点で実現出来ているのはこの半分くらいです(笑)

■Deebot-4-Home-Assistantの問題点

大枠として動くには動くのですが、暫く使用した結果以下のような不具合があります。
1)起動後数時間(?)するとロボット掃除機のステータスを取得(更新)しなくなる(しかし操作は可能)
2)掃除完了時に受け取るはずのイベントが発生しない
3)"Last Cleaning"エンティティが「不明」のまま
4)マップが正常に表示されない


1)のステータスの取得が停止してしまう問題については、Deebot-4-Home-Assistantのインテグレーション再読込をすればまた数時間は復活します。インテグレーションの再読込は手動でしか出来ないと思っていましたが、自動的に実行する方法を見つけたので、これで1)の問題は強引に解決することはできそうです。この方法については別記事で書きたいと思います。
そして2)の掃除完了イベントを受け取らない問題が一番厄介です。
"Deebot-4-Home-Assistant"から部屋を指定して掃除させるには「部屋コード」が必要で、エリアを指定して掃除させるには「座標」が必要なのですが、それらを知るにはDeebot-4-Home-Assistantのページによると「掃除完了時に受け取るイベント」が必要なのです。
deebot.readthedocs.io

■部屋コードと座標を別の方法で取得する

Home Assistant以外のホームオートメーションシステムを含めると、現在、最もアクティブにEcovacsロボット掃除機のハックをされているのがこちらの"ecovacs-deebot.js"ではないかと思います。"Deebot-4-Home-Assistant"のディベロッパーさんとも連携されている様子です。
github.com


ライブラリなので単体では動きませんが、開発者さんはこのライブラリを利用したNode-red用のノードとか、Home AssistantみたいなホームオートメーションシステムであるioBroker用のアダプタも公開されています。
そして"ecovacs-deebot.js"のパッケージにはサンプルアプリが入っているので、これを動かしてみてどんな情報が取れるのかを見てみることにしました。
今回はNode.jsをインストールしたWindowsマシン上で実行します。


1.ecovacs-deebot.jsのインストール
コマンドプロンプトを起動し以下のようにコマンドを叩きます。

git clone https://github.com/mrbungle64/ecovacs-deebot.js.git
cd ecovacs-deebot.js
npm install


2.設定
exampleフォルダの中にsettings.jsがあるのでこれをエディタで開き、設定を編集して保存します。
DEVICE_NUMBER は1台の場合"0"でいいみたいです。

exports.ACCOUNT_ID = 'Your_ecovacs_ID';
exports.PASSWORD = 'Your ecovacs_password';
exports.COUNTRY_CODE = 'JP';
exports.DEVICE_NUMBER = 0;


3.実行

cd example
node ./app2.js


4.結果
サンプルアプリを実行すると以下のように返って来ました。

Devices: [{"did":"..."deviceNumber":0}]
{
...
}
- Name: Omni
- Model: DEEBOT X1 OMNI
- Image url: https://xxxxx
- Is known device: true
- Is supported device: false
- Is 950 type model: true
- V2 commands are implemented: true
- Communication protocol: MQTT
- Main brush: true
- Mapping capabilities: true
- Edge cleaning mode: false
- Spot cleaning mode: false
- Spot area cleaning mode: true
- Custom area cleaning mode: true
- Mopping system: true
- Voice reports: true
- Auto empty station: true
- Canvas module available: true
- Using country: Japan
- Using continent code: as
iot/atr/xxxxxxx

vacbot ready

CleanReport: idle
CurrentCustomAreaValues:
CurrentSpotAreas:
DeebotPosition: -600,-55,0
CurrentSpotAreaID: unknown
ChargePosition: -597,-55,0
CurrentMapMID: xxxxxxx
CurrentMapName: LDK
CurrentMapIndex: 0
ChargeState: charging
BatteryInfo: 100
CleanLog: []
ChargeState: charging
Volume: 10
water level: 1
CleanSpeed: 2
Error: Request Timeout (command 'getMapSubSet')
Error: Request Timeout (command 'getMapSubSet')
Error: NoError: Robot is operational
CleanSpeed: 2
water level: 1
Volume: 10

"Deebot-4-Home-Assistant"でマップが正常に表示されませんが、こちらでもエラーになっています。機種依存なのかな?
そして、Deebot-4-Home-Assistantでのログイン時にcontinent codeを"jp"にするとログイン出来なかったので"ww"でログインしていましたが、実際は"as"であることも判りました。


Ecovacsアプリから部屋を指定して清掃する「エリア清掃」を実行すると下のように返って来ました。
"CurrentSpotAreas"が部屋コードで、私の今の設定だとキッチンが”0”、リビングが"1"みたいです。

DeebotPosition: -587,-63,0
CurrentCustomAreaValues:
CurrentSpotAreas: 0

Home Assistantから部屋コードを指定して掃除するコマンドを送ると、ちゃんとEcovacsアプリ側でも指定した部屋のエリア清掃モードになっていました。

service: vacuum.send_command
target:
  entity_id: vacuum.omni
data:
  command: spot_area
  params:
    rooms: 1
    cleanings: 1


次に範囲を指定するカスタムエリア清掃をEcovacsアプリから実行するとこんな風に返って来ました。
"CurrentCustomAreaValues"が指定している場所の座標です。
たまに”waterBoxInfo”が現れますがいつも"0"みたいです。。。

CurrentCustomAreaValues: 1360,916,2360,-83; ←ダイニングテーブルあたりを指定
DeebotPosition: -21,-543,86
CurrentSpotAreaID: 0
waterBoxInfo: 0

こちらも座標指定してカスタムエリア清掃にするコマンドを送ると、Ecovacsアプリ側でも指定した範囲のカスタム清掃モードになっていることを確認しました。

service: vacuum.send_command
target:
  entity_id: vacuum.omni
data:
  command: custom_area
  params:
    coordinates: 1360,916,2360,-83

■まとめ

部屋コードと座標を知ることができるようになったので、これでおそらくHome Assistantからエリアを指定して掃除を実行することが出来るようになると思います。
次回は家のコントロールパネルのダッシュボートを設定していきたいと思います。


それでは。つづく