画像取得までは設定済みの状態から、Slack 通知を追加する手順
Eufy と Home Assistant の連携が済んでいて、すでに Event Image を取得できる 状態なら、次はその画像を Slack に投げるだけです。
この記事では、次の前提で進めます。
- Eufy のカメラは Home Assistant に連携済み
-
image.xxx_event_imageが使える - 必要なら
binary_sensor.xxx_pet_detectedのような検出センサーも使える - Eufy からの画像取得まではすでに設定済み
やることはシンプルです。
- Slack App を作る
- Home Assistant に Slack 統合を追加する
- 既存 automation に「Slack へ画像投稿」を足す
- 添付時に詰まりやすい権限や YAML を調整する
手順
1. まず全体の流れを確認する
今回やる構成はこうです。
Eufy Event Image 更新
↓
Home Assistant automation 起動
↓
画像を /media/eufy_snapshots に保存
↓
Slack にその画像を添付して投稿
すでに Eufy 側から Event Image を取れているなら、追加するのは Slack 投稿部分です。
既存構成では、/media/eufy_snapshots への保存まで進める流れが組めています。
2. Slack App を作る
Slack に Home Assistant から投稿するには、Slack App を1つ作ります。
これは「通知専用の bot」を作るイメージです。
手順
- Slack API の管理画面で新しい App を作成
- 投稿先ワークスペースを選択
- OAuth & Permissions を開く
- Bot Token Scopes を設定する
最低限入れておきたい scope
テキスト投稿だけでなく、ファイル添付までやるなら次を入れておくのが安全です。
chat:writechat:write.publicchat:write.customizefiles:writechannels:readgroups:readmpim:readim:read
今回の会話では、テキストだけ送れるのにファイル付きだと失敗するケースがあり、原因は missing_scope でした。conversations.list 実行時に、channels:read, groups:read, mpim:read, im:read が不足していると失敗します。
終わったらやること
scope を追加したら、ワークスペースへ再インストールします。
これをしないと新しい権限が反映されません。
3. Bot Token を控える
Slack App を再インストールすると、Bot User OAuth Token が発行されます。
xoxb-... で始まる token です。
これはあとで Home Assistant の Slack 統合に入れるので、控えておきます。
4. bot を投稿先チャンネルに参加させる
これも忘れやすいポイントです。
たとえば投稿先が #pet-camera なら、そのチャンネルで bot を招待します。
/invite @あなたのbot名
bot がチャンネルに入っていないと、投稿や添付で失敗することがあります。
5. Home Assistant に Slack 統合を追加する
Home Assistant 側で Slack 統合を追加します。
画面の場所
- Settings
- Devices & Services
- Add Integration
- Slack
入れる内容
-
API Key
→ Slack の Bot User OAuth Token -
Default Channel
→ 例:#pet-camera -
Username / Icon
→ 必要に応じて設定
ここで作られる notify.xxx が、あとで automation から呼ぶ通知サービスになります。
6. notify.xxx のサービス名を確認する
Slack 統合を追加すると、Home Assistant 内で通知サービス名が作られます。
例:
notify.myworkspacenotify.slack_teamname
この名前は環境依存なので、Developer Tools → Actions で notify. と打って確認しておくと確実です。
ここでの注意
ワークスペース名に 漢字や日本語を使っている場合、notify.XXX のサービス名が、期待したローマ字ではなく中国語読みベースのアルファベット転写のような形になることがあります。
見た目で推測せず、必ず実際のサービス名を確認したほうがよいです。
これは今回の会話の中で実際に引っかかったポイントでした。
7. 画像保存先が allowlist に入っているか確認する
Slack 添付でローカルファイルを送るには、保存先が Home Assistant に許可されている必要があります。
既存構成では、画像保存用に次の設定が入っています。
homeassistant:
allowlist_external_dirs:
- /media/eufy_snapshots
まだ入っていなければ configuration.yaml に追加し、Home Assistant を再起動します。
8. まずはテキスト投稿だけテストする
いきなり automation を触る前に、Slack 連携だけテストします。
Developer Tools → Actions から、作成された notify.xxx を使って実行します。
message: "テスト投稿です"
title: "Home Assistant テスト"
target: "#pet-camera"
これでテキストだけ届けば、認証や基本設定は通っています。
9. 次に固定画像で添付テストする
次は画像ファイル付き投稿を試します。
いきなりテンプレート変数を使わず、固定パスの画像で試すのが切り分けしやすいです。
message: "画像テスト"
title: "test image"
data:
file:
path: /media/eufy_snapshots/test.jpg
最初は target を省略して、Slack 統合の Default Channel に送る形でも構いません。
ここで通れば、添付の基本動作は OK です。
10. automation に Slack 投稿を追加する
ここから本番です。
すでに Event Image を保存する automation があるなら、その最後に Slack 通知を足します。
以下は例です。
alias: Eufy pet detection posts image to Slack
description: ""
triggers:
- trigger: state
entity_id:
- image.living_room_event_image
conditions:
- condition: state
entity_id: binary_sensor.living_room_pet_detected
state:
- "on"
actions:
- variables:
ts: "{{ now().strftime('%Y%m%d-%H%M%S') }}"
file: /media/eufy_snapshots/pet_{{ ts }}.jpg
- action: image.snapshot
metadata: {}
target:
entity_id: image.living_room_event_image
data:
filename: "{{ file }}"
- delay:
hours: 0
minutes: 0
seconds: 2
milliseconds: 0
- action: notify.YOUR_SLACK_SERVICE
data:
message: ""
data:
file:
path: "{{ file }}"
この automation の考え方
- Event Image が更新されたら起動
- ペット検出センサーが
onのときだけ動作 - Event Image を JPEG として保存
- 少し待つ
- 保存したそのファイルを Slack に添付して投稿
Eufy 画像保存のベース部分は、すでに組まれている Event Image 保存構成をそのまま流用しています。
11. automation を反映する
automations.yaml を直接編集した場合、保存しただけでは反映されません。
方法
-
Developer Tools → Actions で
automation.reload - もしくは Home Assistant 再起動
12. 実際に動作確認する
最後に実機確認です。
- ペットや人物をカメラ前に映す
-
binary_sensor.xxx_pet_detectedがonになるか確認 -
image.xxx_event_imageが更新されるか確認 -
/media/eufy_snapshotsに画像が増えるか確認 - Slack に画像付きで投稿されるか確認
保存確認の例:
ls -lh ~/ha-stack/homeassistant/media/eufy_snapshots
引っ掛かりやすい点の補足
ここからは、実際に詰まりやすかったポイントをまとめます。
1. テキスト投稿はできるのに、ファイル添付だけ失敗する
この場合、かなり多いのは Slack App の scope 不足です。
実際に起きたエラーはこれでした。
Error getting channel IDmissing_scopeneeded: channels:read,groups:read,mpim:read,im:read
つまり、テキスト投稿に必要な chat:write はあるが、チャンネル解決に必要な read 系 scope が足りない状態です。
対処
以下を Bot Token Scopes に追加します。
channels:readgroups:readmpim:readim:read
さらに、ファイル添付のために files:write も入れておきます。
その後、ワークスペースへ再インストールします。
今回の会話では、files:write を追加し、WS へ再インストールしたことで解決しました。
2. notify.XXX のサービス名を見た目で決めない
Slack ワークスペース名に 日本語や漢字を使っていると、Home Assistant 側の notify.XXX の生成名が想像とずれることがあります。
今回の会話では、漢字のワークスペース名が中国語読みっぽいアルファベット転写になったため、意図した名前と違って見えるケースがありました。
対処
- 予想で書かない
-
Developer Tools → Actions で
notify.を打って確認する
これが確実です。
3. Message malformed: extra keys not allowed @ data['0']
これは Slack の問題ではなく、YAML の形がおかしいときに出やすいエラーです。
特に多いのは、
- automation 全体を貼る場所に action 単体 YAML を貼った
- action 単体を貼る場所に automation 全体を貼った
- 先頭の
-が不要な場所に配列形式で貼った
というケースです。
典型例
Automation UI の 1 件編集画面では、先頭に - を付けた配列形式をそのまま貼ると壊れやすいです。
NG になりやすい例
- alias: ...
trigger:
...
1件編集ならこちら
alias: ...
trigger:
...
condition:
...
action:
...
Developer Tools で通知だけ試す場合
通知アクション単体を書くなら、automation 全体ではなく、最小限にします。
action: notify.YOUR_SLACK_SERVICE
data:
message: "画像テスト"
title: "test image"
data:
file:
path: /media/eufy_snapshots/test.jpg
貼る場所ごとに YAML の期待構造が違う、というのが本質です。
4. 画像保存はできるのに、添付だけ失敗する
この場合は次を順番に見ると切り分けしやすいです。
確認順
-
files:writeがあるか -
channels:readなどの read 系 scope があるか - bot が投稿先チャンネルに入っているか
-
pathのファイルが本当に存在するか -
allowlist_external_dirsに保存先が入っているか -
notify.xxxのサービス名が正しいか
5. まず固定ファイルで試したほうがよい
テンプレート変数付きの automation でいきなり試すと、失敗時の原因が見えづらくなります。
最初は必ず、固定ファイルでこの形を試すのが安全です。
message: "画像テスト"
title: "test image"
data:
file:
path: /media/eufy_snapshots/test.jpg
これが通ってから {{ file }} に置き換えると、問題が切り分けやすくなります。
6. target は最初は省略してもよい
チャンネル解決が絡むと切り分けが面倒になります。
そのため最初は target を省略し、Slack 統合の Default Channel に送る形で試すのがよいです。
これで通れば、あとから target: "#pet-camera" を足せます。
7. 画像保存直後は少し待ったほうが安定する
保存してすぐ添付すると、タイミングによってはファイルがまだ扱いきれていないことがあります。
そのため automation では、保存直後に少し待つのが無難です。
- delay:
seconds: 2
小さい差ですが、安定性は上がります。
まとめ
Eufy からの画像取得まですでに設定できているなら、Slack への自動投稿は次の追加で実現できます。
- Slack App を作る
- scope を正しく付ける
- Home Assistant に Slack 統合を追加する
- 既存 automation に添付付き通知を足す
今回いちばん重要だったのは次の3点です。
- ファイル添付時は
files:writeだけでなく read 系 scope も必要 - ワークスペース名が日本語だと
notify.xxx名が予想外になることがある Message malformed: extra keys not allowed @ data['0']は YAML の構造ミス
Eufy 側の Event Image 保存までできていれば、残りは Slack 側の権限と Home Assistant の YAML を丁寧に合わせるだけです。
そこさえ押さえれば、「検出画像を Slack に自動投稿する」 ところまでは比較的素直に組めます。