こんにちは! SJC共同開発推進室の鈴木です。
前編では、Home Assistantに「Zone」を設定し、「自宅の半径300m圏内に入ったらエアコンをONにする」という仕組みを作りました。
しかし、その結果、「近くを車で素通りしただけでエアコンが全開になる」可能性があったり、 家は「近くにいる」ことは理解しましたが、「帰ってくる」のか「通り過ぎる」のかまでは理解しておりませんでした。
このままでは、「賢い家」どころか、ただ「電気代のかかる家」になってしまいます。 後編となる今回は、この問題を解決するために、「Proximity」という機能をご紹介します。家が「場所」だけでなく「人の意思(ベクトル)」を理解する、スマートホーム化を進めたいと思います。
目次
1.「素通り」と「寄り道」の可能性を考える
前編で設定した「Zone(面)」の判定は、あくまで「そのエリアに入ったかどうか」しか見ていません。 例えば、目的地へ向かう途中、自宅近くの道路を通りました。この時、スマホのGPSは一瞬だけ「Zone」の端をかすめます。 この場合、家のHome Assistantはエアコンを起動してしまいます。車で通り過ぎて、家にはしばらく戻ってこないですが、無人の家ではエアコンがフル稼働してしまいます。これでは、家が「空気を読み違える」状況となってしまします。
この状況を防ぐには、家に「距離」と「方向」を教える必要があります。
2.「Proximity」の導入
そこで今回ご紹介するのが、Home Assistant標準のインテグレーションである「Proximity(近接)」です。
「Zone」が「中か外か」という判定だったのに対し、「Proximity」は「自宅まであと何mか」という数値を計算し続けます。
「設定 → デバイスとサービス → 統合を追加 → Proximity(近接)」から設定を追加し、監視対象の「Zone(自宅)」と「Person(自分)」を紐づけることができます。

このように、「距離(自宅まであと何メートルか)」と「方向(近づいてるかどうか)」の2つを組み合わせることで、家は空気を読めるようになります。
この設定により、以下のようにスマホにインストールしたHome Assistantコンパニオンアプリでも確認できるようになります。

- 自宅までの距離:260m
- 進行方向:towards(接近中)
この「自宅までの距離」をトリガーにすることで、「半径300m」という固定された円ではなく、柔軟な対応が可能になります。
3. 「ベクトル」で意思を読む
「Proximity」は、距離だけでなく「進行方向」を持っております。 そのため、Home Assistantは、GPSの履歴からベクトルを計算し、現在の移動状態を以下のいずれかで教えてくれます。
- towards(接近中):家に向かっている状態
- away_from(離反中):家から遠ざかっている状態
- stationary(静止中):立ち止まっている状態
- arrived(到着済み):Zone内に既に入っている状態
ここで重要になるのが、「その状態でいた時間」です。
- 素通りの場合: 時速40km前後で通り過ぎると、自宅付近で「towards」でいられる時間はわずか数秒〜十数秒。
- 帰宅の場合: 家に向かって進んでいるため、数分間にわたって「towards」の状態が継続します。
つまり、オートメーションの条件に「距離が近い」だけでなく、「数分間継続してtowards(接近中)であること」という時間軸のフィルターを加えることで、正確な帰宅を判別できる確率が上がります。
4. 「帰宅予知」オートメーションの構築
それでは、これらを組み合わせて、「空気が読める」オートメーションを作成してみたいと思います。 前編でご紹介したYAML形式の記述を改良し、以下の内容で実装します。
(※以下サンプルYAMLに距離などの数値は適宜ご自身の環境に合わせて設定いただければと思います。)

【改良版】
- Zone圏内に入ったら監視
- 進行方向が 「towards」(家に向かっている状態)
- 平日かつ18時以降である
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
alias: 平日の夜の帰宅意志確定でエアコンON description: ゾーン侵入後、距離が縮まり続け、直近2分間「帰宅方向」ならエアコンON triggers: - trigger: zone entity_id: person.atsufumi_suzuki zone: zone.home event: enter conditions: - condition: time after: "18:00:00" weekday: - mon - tue - wed - thu - fri actions: # 1. ゾーン侵入後、即実行せずに「距離が200mを切る」まで待機する - wait_for_trigger: - trigger: numeric_state # Proximityインテグレーションが提供する距離センサー entity_id: sensor.proximity_home_distance below: 200 timeout: "00:05:00" # 5分待っても200m以内にならなければキャンセル(通り過ぎたと判断して終了) continue_on_timeout: false # タイムアウト時は以降のアクションを実行しない # 2. 200mまで来たが、それは「ずっと家に向かっていた」か?(2分間の継続確認) - condition: state # Proximityインテグレーションが提供する方向センサー entity_id: sensor.proximity_home_direction_of_travel state: "towards" for: "00:02:00" # 2分間継続して towards だった場合のみ通過 # 3. 意思確認完了。エアコン稼働 - action: climate.set_temperature target: device_id: 4902xxxxxxxxxxxxxxx # お使いのエアコンID data: temperature: 24 - action: climate.turn_on target: device_id: 4902xxxxxxxxxxxxxxxxxxxx |
この設定をすることで、「Zone」で設定した範囲から、さらに遠くに行く場合「away_from」は反応しません。 「家に向かっている」という意思(ベクトル)が確認できた時だけ、家は準備を始めてくれるようになります。
まとめ
前後編にわたり、Home Assistantによる位置情報活用の機能をご紹介しました。
- Zone(面): エリアに入った事実を検知する。
- Proximity(距離とベクトル): 向かっているのか、離れているのかという意思を推測する。
スマートホームの醍醐味の一つに、家が人の気配を察し、先回りして心地よさを整えてくれることがあると感じております。
今回ご紹介した、複数の条件を組み合わせることで、より便利なスマートホームになります。
今後も引き続きHome Assistantの記事を定期的に発信していきたいと思いますので、よろしくお願いいたします。
エコモットでは、ともに未来の常識を創る仲間を募集しています。
弊社に少しでも興味がある方はぜひ下記の採用ページをご覧ください!




