Skip to main content

可操作的通知

可操作的通知是一种独特的通知类型,因为它允许用户在通知中添加按钮,点击后可以向 Home Assistant 发送一个 事件。该事件可以在自动化中使用,允许你执行多种操作。这些通知可以发送到 iOS 或 Android 设备。

一些可操作通知的有用示例:

  • 当你不在家或正在睡觉时,每当家中检测到运动,就会发送通知。通知旁边会显示一个“发出警报”的操作按钮,点击后将响起你的防盗警报。
  • 有人按响了你的门铃。你会收到一条包含外部访客的 实时摄像头画面 的通知,同时还附带锁定或解锁前门的操作按钮。
  • 每当车库门打开时接收通知,并附带打开或关闭车库的操作按钮。

可操作的通知允许用户将命令发送回 Home Assistant。

iOS 如果你有多个服务器连接到 iOS 或 Mac 应用,通知操作将在发送通知的服务器上触发。

版本兼容性

iOS 和 macOS 上的基于类别的通知已被弃用。有关转换现有通知的更多信息,请参阅 迁移指南

Apple Watch

在 watchOS 上的操作需要安装 Watch 应用。你可以在系统的 Watch 应用中安装它。

创建可操作通知

你可以在你的操作中包含一个 actions 数组。

Android Android 允许 3 个通知操作。
iOS iOS 允许大约 10 个通知操作。如果超出,系统 UI 在通知操作中将开始出现滚动问题。

action: notify.mobile_app_<你的设备 ID>
data:
message: "家里发生了某件事!"
data:
actions:
- action: "ALARM" # 你发送的事件键
title: "发出警报" # 按钮标题
- action: "URI" # 如果你计划使用 URI,必须设置为 URI
title: "打开网址"
uri: "https://google.com" # 选择操作时打开的 URL,也可以是一个 lovelace 视图/仪表板

每个操作可能包含以下键:

含义注释
action必填。在事件中返回的标识符当设置为 REPLY 时,你将被提示输入文本以随事件发送。
title必填。在通知中显示的按钮标题
uri可选。点击时打开的 URLAndroid Android 要求将 action 设置为 URI 以使用此键。请参阅 下方的注释
behavior可选。设置为 textInput 以提示输入文本随事件返回。当将操作设置为 REPLY 时,也会发生这种情况。使用此键允许你使用 action 键区分操作。

Android Android 特定选项

以下所有键都是可选的。

含义注释
目前没有 Android 特定键。

iOS 特定选项

以下所有键都是可选的。

含义注释
activationMode设置为 foreground 以在点击时启动应用。默认为 background,仅触发事件。提供 uri 时自动设置为 foreground
authenticationRequiredtrue 要求输入密码使用该操作。
destructivetrue 将操作的标题颜色设置为红色,表示这是一个破坏性操作。
textInputButtonTitle用于提示的动作的文本输入标题。
textInputPlaceholder用于提示的动作的文本输入占位符。
icon用于通知的图标。需要版本 2021.10。请参阅下方的注释。

图标值

版本兼容性

这需要 iOS 应用版本 2021.10 或更高版本,适用于 iOS 15 或更高版本,或在 macOS 12 或更高版本上运行的 macOS 应用未来版本。

通知操作的图标仅允许使用 SF Symbols 库,这与来自 Material Design Icons 库 的其他图标不同。这是由于苹果对这些操作施加的限制。

你必须在图标名称前加上 sfsymbols: 前缀(与在其他地方加 mdi: 前缀类似),因为我们希望将其扩展以支持将来的 MDI。例如:

action:
- action: notify.mobile_app_<你的设备 ID>
data:
message: "家里发生了某件事!"
data:
actions:
- action: "ALARM"
title: "发出警报"
icon: "sfsymbols:bell"
- action: "SILENCE"
title: "静音警报"
icon: "sfsymbols:bell.slash"

uri

要导航到前端页面,请使用格式 /lovelace/test,其中 test 替换为你在定义视图中定义的 path。如果你计划使用仪表板,格式将是 /lovelace-dashboard/view,其中 /lovelace-dashboard/ 替换为你定义的 dashboard URL,view 替换为该仪表板内定义的 path。例如:

- action: "URI"
title: "打开摄像头"
uri: "/lovelace/cameras"

Android Android 特定

如果你想打开一个应用,你需要将操作设置为 URI。格式将是 app://<package>,其中 <package> 替换为你希望打开的包(例如:app://com.twitter.android)。如果设备没有安装该应用,则 Home Assistant 应用将打开默认页面。

- action: "URI"
title: "打开 Twitter"
# 要打开的应用程序的包名称
uri: "app://com.twitter.android"

将操作设置为 URI 时,你还可以触发任何实体的更多信息面板。格式将是 entityId:<entity_ID>,其中 <entity_id> 替换为你希望查看的实体 ID。例如:entityId:sun.sun

- action: "URI"
title: "查看太阳"
uri: "entityId:sun.sun"

你也可以在使用 settings://notification_history 格式时打开通知历史记录。

- action: "URI"
title: "通知历史"
uri: "settings://notification_history"

Android

你还可以使用 意图方案 URI 来启动已安装应用中的操作。

- action: "URI"
title: "意图方案"
uri: "intent://scan/#Intent;scheme=zxing;package=com.google.zxing.client.android;end"

Android

你可以通过使用 deep-link://<deep_link> 发送特定的 深度链接 给应用,其中 <deep_link> 是你希望发送的实际深度链接。

例如,要拨打电话:

- action: "URI"
title: "拨打必胜客"
uri: "deep-link://tel:2125551212"

iOS 特定

你还可以使用应用启动 URL。例如,拨打电话:

- action: "CALL"
title: "拨打必胜客"
uri: "tel:2125551212"

或者在默认浏览器中打开页面:

- action: "OPEN"
title: "打开 Safari"
uri: "https://example.com"

创建通知操作脚本

在构建可操作通知时,有一些重要事项需要牢记:

  1. 你的脚本或自动化可能会被多次运行
  2. 你的通知的操作在所有通知之间是共享的

为避免问题,你可以为每次运行脚本创建唯一的操作。通过结合上下文和变量,这可以相当简单:

# 在自动化操作或脚本序列内部
- alias: "为操作设置变量"
variables:
# 在操作中包含 ID 允许我们识别此脚本的运行
# 并且不会意外触发其他通知操作
action_open: "{{ 'OPEN_' ~ context.id }}"
action_close: "{{ 'CLOSE_' ~ context.id }}"
- alias: "询问是否关闭或打开窗帘"
action: notify.mobile_app_<你的设备>
data:
message: "窗帘半开。你想调整吗?"
data:
actions:
- action: "{{ action_open }}"
title: 打开
- action: "{{ action_close }}"
title: 关闭
- alias: "等待回应"
wait_for_trigger:
- platform: event
event_type: mobile_app_notification_action
event_data:
# 等待特定操作避免意外继续
# 其他脚本/自动化的通知操作
action: "{{ action_open }}"
- platform: event
event_type: mobile_app_notification_action
event_data:
action: "{{ action_close }}"
- alias: "执行操作"
choose:
- conditions: "{{ wait.trigger.event.data.action == action_open }}"
sequence:
- action: cover.open_cover
target:
entity_id: cover.some_cover
- conditions: "{{ wait.trigger.event.data.action == action_close }}"
sequence:
- action: cover.close_cover
target:
entity_id: cover.some_cover

上述脚本会发送通知,等待响应,然后执行请求的操作。

当执行通知操作时,mobile_app_notification_action 事件会触发并包含以下数据:

{
"event_type": "mobile_app_notification_action",
"data": {
"action": "OPEN_<context_id_here>",
// 会出现:
// - 当 `REPLY` 被用作操作标识符时
// - 当 `behavior` 设置为 `textInput` 时
"reply_text": "用户回复",
// 仅限于 iOS,如果在通知中发送则会包括
"action_data": {
"entity_id": "light.test",
"my_custom_data": "foo_bar"
},
// Android 用户也可以期望在此响应中看到与通知一起发送的所有数据字段,例如 “tag”
"tag": "TEST"
},
"origin": "REMOTE",
"time_fired": "2020-02-02T04:45:05.550251+00:00",
"context": {
"id": "abc123",
"parent_id": null,
"user_id": "123abc"
}
}

进一步考虑

阻塞行为

上述示例将等待,直到执行通知操作。这可能导致意外的行为,具体取决于脚本的 自动化模式。对于 “single” 模式,如果先前的通知操作尚未执行,则脚本不会再次执行。对于 “queue” 和 “parallel”,如果某些通知尚未执行,也会发生此情况。对于 “restart” 模式,这意味着一旦脚本再次被触发,旧实例的通知操作将不会触发相应的操作。根据使用场景,有几种选项:

  • 你可以使用 超时 让脚本的新执行得以进行。但这会导致手机上出现悬而未决的通知。
  • 可以 清除通知,这可以与超时和并行执行模式结合使用以实现良好效果。
  • 在 Android 上,你可以监听何时关闭通知的 notification cleared event,并相应处理。可以通过添加以下行实现:
      - platform: event
event_type: mobile_app_notification_cleared
event_data:
action_1_key: '{{ action_open }}'

    - conditions: "{{ wait.trigger.event.event_type == 'mobile_app_notification_cleared' }}"
sequence:
- action: persistent_notification.create
data:
title: 应用通知结果
message: 通知已关闭

请记住,当 Home Assistant 应用崩溃或关闭时,此事件将不会被触发,因此仍应考虑超时。

捕获所有触发器

你还可以创建在任何通知操作上触发的自动化。例如,如果你想在各种通知上包括一个 SILENCE 操作,但仅在一个地方处理它:

automation:
- alias: "静音警报"
trigger:
- platform: event
event_type: mobile_app_notification_action
event_data:
action: "SILENCE"
action:
...

从类别迁移

从 iOS 版本 2021.5 开始,操作是在通知中内联指定的。要迁移,请执行以下操作:

  1. actions 数组添加到每个通知。例如:
# 原始
action:
- action: notify.mobile_app_<你的设备 ID>
data:
message: "家里发生了某件事!"
data:
push:
category: "ALARM"
url:
_: "/lovelace/cameras" # 如果点击通知本身
ALARM: "/lovelace/alarm" # 如果点击 'ALARM' 操作
# 替代
action:
- action: notify.mobile_app_<你的设备 ID>
data:
message: "家里发生了某件事!"
data:
url: "/lovelace/cameras" # 如果没有选择操作则启动
actions:
# 为兼容性,可以使用动作的 YAML 定义
# 例如,你可以使用 `identifier` 代替 `action`
- action: "ALARM"
title: "发出警报"
destructive: true
uri: "/lovelace/alarm"
- action: "SILENCE"
title: "静音警报"
  1. 将你的事件触发器转换为新值
# 原始
automation:
- alias: "iOS 发出警报"
trigger:
- platform: event
event_type: ios.notification_action_fired
event_data:
actionName: "ALARM"
action:
...
# 替代
automation:
- alias: "iOS 发出警报"
trigger:
- platform: event
event_type: mobile_app_notification_action
event_data:
action: "ALARM"
action:
...

上述内容是迁移所需的最低条件。你还可以像以前的示例一样重写自动化以使用 wait_for_trigger,尽管这工作量更大且不是严格必要的。

与不同设备的兼容性

iOS 特定

iOS 13 及更高版本

  • 所有设备支持通过向右滑动并在锁屏上按 '查看' 来扩展通知,或按住,但在支持 3D Touch 的设备上你可能仍需施加一些力量才能做到。如果不在锁屏上,你也可以向下拉通知以扩展它。

iOS 13 之前

  • 对于支持 3D Touch 的设备 - 在通知上用力按下将扩展通知,显示下面的操作按钮。支持的设备包括 iPhone 6S、iPhone 6S Plus、iPhone 7、iPhone 7 Plus、iPhone 8、iPhone 8 Plus、iPhone X、iPhone XS 和 iPhone XS Max。如果不在锁屏上,你还可以向下拉通知以扩展它。

  • 对于不支持 “3D Touch” 的设备(如 iPhone 6 及以下、iPhone SE、iPhone XR 和 iPads),你可以在通知上向左滑动,然后点击 '查看' 按钮。这将扩展通知并显示下面相关的操作按钮。如果不在锁屏上,你需要向下拉通知以扩展它。