AmazHA 是一款面向 Amazfit 手表的 Home Assistant 应用,它的大部分功能都是单向的:把你的灯、窗帘和温控器放到手腕上。它的手表传感器功能则反过来工作。手表读取它自己的数据,从步数到睡眠状态再到电量,然后作为传感器实体发送到 Home Assistant,你可以用它们绘制图表、放到仪表盘上,或者用在自动化里。
下文包括:会发送什么、数据如何到达、如何开启、传感器为什么会缺失,以及十个可以直接粘贴使用的自动化。
简短回答
借助 AmazHA,Amazfit 手表最多可以向 Home Assistant 发送 18 项读数:步数、距离、卡路里、心率、静息心率、血氧、压力、睡眠评分、睡眠时长、实时的睡着/醒着状态、佩戴状态、气压、电量等。它们通过 Home Assistant 的 Mobile App 集成以 sensor.<prefix>_<key> 的形式到达,每次打开应用时发送一次,之后在后台每 1 到 6 分钟发送一次。
哪些数据会到达 Home Assistant
共十八个传感器,分为四组,每个都可以单独开启。下面是完整列表,包括实体 ID 末尾的键名,以及你会在 Home Assistant 中看到的状态:
| 键名 | 单位 | 含义 | 状态示例 |
|---|---|---|---|
steps |
步 | 今日步数 | 6412 |
distance |
m | 今日步行距离 | 4870 |
calories |
kcal | 今日消耗的卡路里 | 1834 |
stand |
h | 今日站立小时数 | 7 |
fat_burning |
min | 今日高强度运动分钟数 | 22 |
pai |
— | PAI 分数 | 68 |
heart_rate |
bpm | 手表最近一次的心率读数 | 71 |
resting_heart_rate |
bpm | 静息心率 | 58 |
spo2 |
% | 最近一次的血氧测量值 | 97 |
stress |
— | 当前压力值 | 34 |
body_temperature |
°C | 体温,保留一位小数 | 36.4 |
sleep_score |
— | 上一次睡眠的评分 | 81 |
sleep_duration |
min | 上一次睡眠的时长 | 452 |
sleep_state |
— | 此刻是否在睡觉 | asleep / awake |
pressure |
hPa | 气压,保留一位小数 | 1013.2 |
altitude |
m | 由气压计得出的海拔 | 212 |
battery |
% | 手表自身的电量 | 64 |
wear |
— | 手表是否戴在手腕上 | not_worn / worn / in_motion / unknown |
在 AmazHA 设置中,它们分为活动、健康、环境和设备四组,对应的名称分别是步数、距离、卡路里、站立小时数、高强度运动分钟数、PAI、心率、静息心率、血氧(SpO2)、压力、体温、睡眠评分、睡眠时长、睡眠状态、气压、海拔、手表电量和佩戴状态。
单位、类别与长期统计
这些传感器都带有 Home Assistant 元数据,所以它们的表现和其他任何传感器一样。电量的设备类别是 battery,因此会显示电池图标,也适合放进仪表。距离和海拔是 distance,气压是 atmospheric_pressure,体温是 temperature,高强度运动分钟数和睡眠时长是 duration。每个传感器都有自己的图标。
每日计数类传感器(步数、距离、卡路里、站立小时数、高强度运动分钟数)使用 total_increasing 状态类别:手表开始新的一天时它们会归零,Home Assistant 会把这理解为重置,而不是下降。测量类传感器(心率、电量、气压等)使用 measurement。无论哪种,Home Assistant 都会为它们保存长期统计,所以无需额外设置,就能为你的步数画出统计图表。
sleep_state 和 wear 是文本状态,没有单位,也没有类别。请把它们用在状态触发器和条件中。
被跳过的读数
手表只在有有效读数时才发送某个传感器。它不会用零或占位值来代替:
- 心率、静息心率、压力、睡眠评分和睡眠时长在手表报告为 0(即还没有测量)时会被跳过。手表没有新的睡眠数据时,睡眠类传感器会保持上一次的数值。
- 血氧是一次测量,而不是连续信号。AmazHA 会发送它能找到的最新一次:刚刚测量的值、过去两小时的采样,或者 24 小时内最后一个有效值。所以
spo2表示“最近一次测量”,而不是“此刻”。 - 体温只在配备该传感器的手表上发送,而且要等它有了数据之后。
- 气压和海拔只在配备气压计的手表上发送。
- 睡眠状态只在手表明确报告睡着或醒着时发送。
某个读数被跳过时,Home Assistant 会保留它已有的最后一个值。这对自动化很重要:一个没有变化的传感器,可能只是还没有被更新。
实体 ID
每个实体都是 sensor.<prefix>_<key>。前缀就是你在**实体前缀(可选)**中填写的内容;留空时,使用你手表的名称,并转换成实体 ID 可用的形式,因此“Amazfit GTS 4”会生成 sensor.amazfit_gts_4_steps、sensor.amazfit_gts_4_battery 等。手表传感器页面会在每个传感器下方列出确切的 ID 及其单位,所以你永远不用去猜。
前缀在手表第一次发送数据时就固定下来了。之后给手表改名,不会让你的实体跟着变。自己更改前缀则会:它会注册第二个设备,带有一组新的实体 ID,旧设备会一直留在 Home Assistant 中,直到你删除它。请在基于它构建自动化之前选好前缀。
工作原理:手表成为一个 Mobile App 设备
手表注册到 Home Assistant 的 Mobile App 集成,也就是 Home Assistant 自己的 Companion 应用所用的那个集成。你的手表成为一个设备,它的读数成为该设备的传感器,不需要在 HACS 中安装任何东西,也不需要在 configuration.yaml 中写任何内容。
具体过程如下:
- 手表读取你开启的传感器,通过 Bluetooth 发送到你的手机。
- AmazHA 的手机端运行在 Zepp 应用内,它会在 Home Assistant 的 Mobile App 集成中注册一次手表。该设备的制造商显示为 Amazfit。
- 每个传感器会连同其单位、类别和图标注册一次。此后,每次更新都是一次包含所有传感器的批量调用。
由于它们是 Home Assistant 注册表中带有唯一 ID 的真实实体,你可以在 Home Assistant 界面中给它们改名、更换图标、隐藏它们或把它们放进某个区域。Home Assistant 重启后它们依然存在。如果你在 Home Assistant 中删除了这个设备,AmazHA 会在下一次推送时重新注册它。
Mobile App 集成是 Home Assistant 默认配置的一部分,所以几乎每个安装都已经有了它。如果你的安装没有加载它,AmazHA 会退而直接写入状态,这样也能用,但得到的实体无法在 Home Assistant 界面中管理,并且会在重启时消失。如果你是这种情况,请在配置中加入 mobile_app:。
手表本身从不直接与 Home Assistant 通信。是手机在通信,使用的地址与 AmazHA 其他部分相同:在家时用本地地址,外出时用远程地址。如果你只设置了本地地址,那么离家时发送的更新就无法到达 Home Assistant。手表的远程访问一文介绍了各种方案。
逐步开启
首先,你需要完整版以及一个正常工作的 Home Assistant 连接。之后只需一分钟,如教程 9:手表传感器所示:
- 打开手表传感器。 在 AmazHA 设置中(Zepp 应用里的我的 › 你的手表 › 应用 › AmazHA › 设置),点按手表传感器。第 1 步。
- 开启它。 开启发送到 Home Assistant。第 2 步。
- 起个名字(可选)。 **实体前缀(可选)**用于为每个实体命名(
sensor.<prefix>_…)。留空时,使用你手表的名称。第 3 步。 - 设定频率。 更新间隔决定后台发送的间隔,可设为 1 到 6 分钟。第 4 步。
- 挑选传感器。 开启你想要的传感器。它们默认全部关闭。第 5 步。
- 在手表上打开 AmazHA。 手表会发送第一批读数,并请求后台活动权限。请允许。第 6 步。
- 在 Home Assistant 中找到它。 进入设置 › 设备与服务 › Mobile App,打开你的手表。第 7 步。
如果手表传感器页面显示的是解锁卡片,说明完整版尚未激活:请看解锁完整版。如果它提示请先连接 Home Assistant,请按照连接 Home Assistant设置连接。
数据到达之后,手表传感器页面会显示一行类似已发送 6 个传感器 · 14:05 的文字;如果数据来自后台更新,末尾还会有 · 后台。这一行是确认一切正常的最快方法。
后台更新:每 1 到 6 分钟
每次打开应用时,手表都会发送它的传感器数据;之后,只要授予了后台活动权限,它就会在后台按你选择的间隔发送。没有这个权限,传感器只会在你打开 AmazHA 时更新。
| 何时 | 需要 | |
|---|---|---|
| 打开应用时 | 每次在手表上打开 AmazHA 时 | 除了上述设置外无需其他 |
| 应用打开期间 | 按你设置的间隔 | 除了上述设置外无需其他 |
| 在后台 | 应用关闭时,按你设置的间隔,1 到 6 分钟(默认 5 分钟) | 在手表上允许后台活动 |
两者都需要手机在附近、开启 Bluetooth 并运行 Zepp 应用,因为把数据发送到 Home Assistant 的是手机。
授予权限
如果手表上的 AmazHA 是从 Zepp App Store 安装的,那么在你开启该功能之后,下次打开 AmazHA 时,手表会请求后台活动权限。它只会请求一次。如果你拒绝了,或者请求根本没有出现,还有两种办法:
- 在手表自己的设置中允许:应用权限(或隐私,取决于手表),然后选择 AmazHA,再允许后台活动。
- 或者在 AmazHA 设置中把发送到 Home Assistant 关闭再打开,然后在手表上打开 AmazHA:它会再询问一次。
其他须知
- 更改会在下次打开应用时传到后台。 如果你开启或关闭了某个传感器,或者更改了更新间隔,请在手表上打开一次 AmazHA。在此之前,后台更新会沿用旧的选择。
- 省电模式会停止后台更新。 手表处于省电模式时不会运行任何后台任务,所以传感器会暂停;之后打开 AmazHA,它们会立即恢复。
- 手表重启并不意味着结束。 短暂重启之后,后台更新会自行恢复,通常在一小时之内。打开 AmazHA 会让它们立刻恢复。
手表传感器为什么不显示
传感器缺失时,原因几乎总是下面中的某一项。请按顺序逐一检查:
- 发送到 Home Assistant 是关闭的。 设置菜单会显示手表传感器为开或关。它必须是开。
- 单个传感器是关闭的。 每个传感器默认都是关闭的。手表传感器页面会显示你发送了多少个,例如“已向 HA 发送 6/18 个传感器”。
- 之后你还没在手表上打开过 AmazHA。 第一批数据是在你打开应用时从手表发出的。更改任何设置后,请打开一次。
- 完整版未激活。 没有许可证时,页面显示解锁卡片,什么都不会发送。
- Home Assistant 没有连接。 页面会提示请先连接 Home Assistant。请修复连接:教程 4;如果有错误提示,请看出问题时怎么办。
- 该传感器还没有有效读数。 血氧、压力和体温要在测量之后才会出现;气压和海拔只在配备气压计的手表上出现。如果状态行显示未启用任何传感器,说明你开启的传感器都没有可发送的读数。
- 它只在打开应用时更新。 那是后台活动权限的问题:见上文。
- 你找错了地方。 这些传感器属于设置 › 设备与服务 › Mobile App 下的一个设备,以你的前缀命名。你也可以在设置 › 设备与服务的实体选项卡中搜索这个前缀。
- 手机无法访问 Home Assistant。 离家时,手机需要一个远程地址。在手机的浏览器中打开你的 Home Assistant 地址:如果那里打不开,传感器也一样发不过去。故障排除教程的第 3 步讲解了这种情况。
- 数值看起来停住了。 看看状态行上的时间。如果时间很旧,说明手机或手表此后没有发送过任何东西:手机超出范围、Zepp 应用已关闭、省电模式开着,或者缺少权限。
十个自动化
下面的十个自动化涵盖了被反复问到的需求:电量低、入睡、醒来、手表落在充电器上、活动目标。它们使用当前的 Home Assistant 语法,可以直接粘贴使用。
添加方法:设置 › 自动化与场景 › 创建自动化 › 创建新的自动化,然后点按三点菜单中的以 YAML 编辑,再粘贴进去。
这里的每个实体 ID 都是示例。手表传感器使用的前缀是 amazfit_gts_4,请换成你自己的。notify.mobile_app_your_phone 是运行 Home Assistant Companion 应用的手机的通知动作;你可以在开发者工具 › 动作中输入“notify”找到你自己的。灯、窗帘、场景和人员实体都是占位,请换成你自己的。阈值只是起点:在确定你自己的阈值之前,先看一周的历史数据。
1. 手表电量低
手表电量低于 15 % 时发送通知。
alias: 手表电量低
description: 手表电量低于 15 % 时发送通知
triggers:
- trigger: numeric_state
entity_id: sensor.amazfit_gts_4_battery
below: 15
actions:
- action: notify.mobile_app_your_phone
data:
title: 手表电量低
message: "手表电量只剩 {{ states('sensor.amazfit_gts_4_battery') }} %。"
mode: single
numeric_state 触发器在数值越过阈值时触发,而不是在低于阈值后的每次更新时都触发,所以每次放电它只会通知你一次。
2. 睡前记得充电
如果你想追踪睡眠,手表的电得撑过一整夜。电量不够时,晚上提醒你一下:
alias: 睡前给手表充电
triggers:
- trigger: time
at: "21:30:00"
conditions:
- condition: numeric_state
entity_id: sensor.amazfit_gts_4_battery
below: 30
actions:
- action: notify.mobile_app_your_phone
data:
message: "手表电量 {{ states('sensor.amazfit_gts_4_battery') }} %:现在充电,才能记录今晚的睡眠。"
mode: single
3. 入睡:关灯、调低暖气
当手表显示你已经睡着,并且持续了十分钟时,关掉客厅的灯,并调低卧室温控器的温度。
alias: 入睡 - 关灯
triggers:
- trigger: state
entity_id: sensor.amazfit_gts_4_sleep_state
to: "asleep"
for:
minutes: 10
conditions:
- condition: time
after: "21:00:00"
before: "04:00:00"
actions:
- action: light.turn_off
target:
area_id: living_room
- action: climate.set_temperature
target:
entity_id: climate.bedroom
data:
temperature: 18
mode: single
时间窗口能防止下午的小憩把整个家关掉;在时间条件中,跨越午夜的窗口没有问题。for: 的十分钟能过滤掉在沙发上打的短暂瞌睡。请记住,状态要到下一次更新时才会到达 Home Assistant,所以实际的延迟是你的更新间隔再加上 for: 的时间。
4. 醒来:早晨例行程序
工作日早晨醒来时,打开卧室的百叶窗、打开厨房的灯、启动咖啡机,每天只执行一次。
alias: 醒来 - 早晨例行程序
triggers:
- trigger: state
entity_id: sensor.amazfit_gts_4_sleep_state
from: "asleep"
to: "awake"
for:
minutes: 5
conditions:
- condition: time
after: "05:30:00"
before: "10:30:00"
weekday:
- mon
- tue
- wed
- thu
- fri
- condition: template
value_template: >-
{{ this.attributes.last_triggered is none
or this.attributes.last_triggered < today_at() }}
actions:
- action: cover.open_cover
target:
entity_id: cover.bedroom_blinds
- action: light.turn_on
target:
entity_id: light.kitchen
data:
brightness_pct: 60
- action: switch.turn_on
target:
entity_id: switch.coffee_machine
mode: single
from: "asleep" 很重要:只有从睡着到醒着的真正变化才算数,传感器从 unknown 或 unavailable 恢复时不算,否则你的早晨可能会在凌晨 3 点开始。模板条件让它每天只运行一次,所以 6 点醒来、又睡过去、7 点再醒来,百叶窗也只会打开一次。
5. 充满电后还留在充电器上
手表已经充满,却还没戴回手腕上:提醒你把它戴上。
alias: 手表已充满,记得戴上
triggers:
- trigger: state
entity_id: sensor.amazfit_gts_4_wear
to: "not_worn"
for:
minutes: 45
conditions:
- condition: numeric_state
entity_id: sensor.amazfit_gts_4_battery
above: 90
- condition: time
after: "07:00:00"
before: "22:00:00"
actions:
- action: notify.mobile_app_your_phone
data:
message: 手表已充满电,并且已经离开手腕 45 分钟了。
mode: single
不在手腕上而电量又很高,通常意味着它在充电器上或者放在桌上。注意,unknown 也是 wear 的一个合法取值:表示手表不确定。在 Home Assistant 中,它看起来和没有数据的传感器的“unknown”一模一样,所以永远不要用它来触发。
6. 静息心率高于平时
当你的静息心率持续高于正常范围时,温和地提醒你一下。这只是提醒你留意自己的感觉,而不是医疗警报。
alias: 静息心率高于平时
triggers:
- trigger: numeric_state
entity_id: sensor.amazfit_gts_4_resting_heart_rate
above: 80
for:
hours: 1
actions:
- action: notify.mobile_app_your_phone
data:
message: "静息心率 {{ states('sensor.amazfit_gts_4_resting_heart_rate') }} bpm,高于平时。"
mode: single
请根据你自己的历史数据设定阈值:在 Home Assistant 中打开这个传感器,看看几周的数据。比你平时的静息心率高 10 到 15 bpm,是一个合理的起点。
7. 达成步数目标
步数超过 10,000 的那一刻发送通知。
alias: 达成步数目标
triggers:
- trigger: numeric_state
entity_id: sensor.amazfit_gts_4_steps
above: 9999
actions:
- action: notify.mobile_app_your_phone
data:
message: "今天已走 10,000 步,干得漂亮。"
mode: single
above 表示严格大于,所以写 9999。手表开始新的一天时步数会归零,所以第二天触发器又会准备就绪。
8. 傍晚散步提醒
18:30 时,如果你戴着手表,而步数仍不到 5,000,就建议你出去走走。
alias: 傍晚散步提醒
triggers:
- trigger: time
at: "18:30:00"
conditions:
- condition: numeric_state
entity_id: sensor.amazfit_gts_4_steps
below: 5000
- condition: state
entity_id: sensor.amazfit_gts_4_wear
state:
- worn
- in_motion
actions:
- action: notify.mobile_app_your_phone
data:
message: "今天到目前为止走了 {{ states('sensor.amazfit_gts_4_steps') }} 步。出去散散步吧?"
mode: single
佩戴条件能避免在手表整天都放在充电器上的日子里打扰你:那时步数低的是手表,而不是你。
9. 早晨睡眠报告
9:00 发送一份关于昨晚的简短摘要,以小时和分钟表示。
alias: 早晨睡眠报告
triggers:
- trigger: time
at: "09:00:00"
conditions:
- condition: template
value_template: "{{ states('sensor.amazfit_gts_4_sleep_duration') | is_number }}"
actions:
- variables:
mins: "{{ states('sensor.amazfit_gts_4_sleep_duration') | int(0) }}"
- action: notify.mobile_app_your_phone
data:
title: 昨晚
message: >-
{{ mins // 60 }} 小时 {{ mins % 60 }} 分钟,
睡眠评分 {{ states('sensor.amazfit_gts_4_sleep_score') }}。
mode: single
睡眠评分和时长来自手表自己的睡眠总结,手表会按自己的节奏更新它。在你起床之后很久的某个固定时间发送报告,比在你醒来的那一刻触发更可靠。
10. 压力大的晚上:调暗灯光
当你在家时,如果晚上的压力值持续高达一刻钟,就把客厅切换到一个舒缓的场景。
alias: 压力高 - 舒缓灯光
triggers:
- trigger: numeric_state
entity_id: sensor.amazfit_gts_4_stress
above: 75
for:
minutes: 15
conditions:
- condition: state
entity_id: person.you
state: "home"
- condition: time
after: "17:00:00"
before: "23:00:00"
actions:
- action: scene.turn_on
target:
entity_id: scene.living_room_calm
mode: single
在家与否来自 person.you,而不是手表。for: 的 15 分钟意味着数值必须在多次更新中都保持很高,这能过滤掉爬完楼梯后的一次性峰值。
关于时间的说明
上面的每个自动化,都是对 Home Assistant 从手机收到的状态做出反应。如果间隔是 5 分钟,手表上的变化最长可能要 5 分钟才能到达,而 for: 还会在此基础上再加上它自己的时间。请选择那些晚几分钟也无所谓的自动化:入睡后关灯,可以;离家时的警报,不行。
仪表盘创意
手表传感器都是普通的 Home Assistant 传感器,所以每一种标准卡片都能用。下面是几种看起来不错的布局:
- 手机仪表盘顶部的一张手表卡片: 用 Tile card(磁贴卡片)把
battery、wear和sleep_state并排放在一起。 - 用仪表显示电量: 在
battery上使用带有严重程度颜色的 Gauge card(仪表卡片),例如低于 20 显示红色,低于 40 显示琥珀色。 - 一天中的心率: 用 History graph card(历史图表卡片)显示 24 小时内的
heart_rate和resting_heart_rate。 - 每日步数: 在
steps上使用 Statistics graph card(统计图表卡片),周期选每天,统计类型选“change”(变化量)。之所以可行,是因为每日计数类传感器使用total_increasing状态类别。 - 一行看完整晚: 用 Entities card(实体卡片)显示
sleep_score、sleep_duration和spo2。 - 手腕上的气象站: 在配备气压计的手表上,用 History graph card 显示两三天内的
pressure,可以看出天气变化带来的趋势。
睡眠时长以分钟为单位。如果你更想在仪表盘上看到小时,可以添加一个模板传感器:设置 › 设备与服务 › 辅助元素 › 创建辅助元素 › 模板 › Template a sensor(模板传感器),使用下面的状态模板,单位设为 h:
{{ (states('sensor.amazfit_gts_4_sleep_duration') | float(0) / 60) | round(1) }}
它不是什么
手表传感器适合那些可以等几分钟的自动化。它们不能替代专用传感器,在依赖它们之前,有三个限制值得了解。
不是即时的。 更新在每次打开应用时到达,之后按你设置的间隔到达,从 1 到 6 分钟不等。手表上的状态变化可能要这么久才能到达 Home Assistant;当手机超出范围、Zepp 应用关闭或省电模式开启时,还会更久。后台更新还取决于后台活动权限。
不是在家检测传感器。 18 个传感器中没有一个能说明你在哪里。wear 说明的是手表是否戴在手腕上,而不是谁的手腕、在哪所房子里。更新需要手机在附近,但这完全说明不了你是否在家。在家检测请用你的手机、人员实体或房间传感器。
不是医疗数据。 心率、血氧、压力和体温来自手表自身的传感器。它们适合观察趋势和温和的提醒,不适合用于诊断,也不适合作为你要拿健康来押注的警报。尤其是血氧,它是手表最近一次的测量值,可能已经是几小时前的了。
你的数据始终属于你。 读数从手表经由 Bluetooth 到你的手机,再从手机到你自己的 Home Assistant。AmazHA 没有账户、没有统计分析,也没有自己的服务器,健康数据绝不会被发送给开发者或任何第三方。在 Home Assistant 中,它们和其他传感器一样,按照你的保留设置存储。每个传感器在你开启之前都是关闭的,所以你发送的恰好就是你选择的。隐私政策有详细说明。