目标: 为每个 Zigbee 设备提供可见(和可用的)两个关键信息:
- 链接 质量 无线电健康(Radio Health)和
- Last_seen 的 (最后一次通信)
这是为了立即检测『丢失』警报器或HS电池,而不必等待偶然发现它。

为什么我把这个放到位
与 69 Zigbee 设备, 我没有简单的能见度来回答两个基本问题: 设备是否正确捕获? 以及 他最近有沟通吗?
在A 警笛 号, 发现『随机』是不可接受的: 我想立即看看她是哑巴,离网,还是在无线电故障。
因此,我决定到处展示:
- 链接 质量 : 无线电链路质量指标(LQI)。 (这是一个有用的『照片』来识别薄弱区域。
- Last_seen 的 : 最后一次通信的日期/时间(或相对时间): 12s,4m,2h…)。
《 ⚠ 陷阱 》 #1: 有两个"configuration.yaml"
起初,我被告知: 在家庭助理中,有两个不同的文件。
- Home Assistant的主要文件: /config/configuration.yaml
- Zigbee2MQTT 文件: /config/zigbee2mqtt/configuration.yaml
重要: 为 Last_seen 的 并且(在实践中)默认曝光/激活,一切都是侧向配置的。 Zigbee2MQTT, 即 /config/zigbee2mqtt/configuration.yaml.

陷阱 陷阱 #2: Zigbee2MQTT插件UI可以『清理』选项

我表现得非常痛苦: 我添加了高级选项,保存了……然后附加界面似乎通过删除它不理解的内容来『简化』文件。
可靠的方法(在家):
- 我直接编辑
/config/zigbee2mqtt/configuration.yaml(文件编辑器或SSH) - 我 拯救
- 重新启动 Zigbee2MQTT
激活 激活 Last_seen 的 Zigbee2MQTT(强制性)
默认情况下,Zigbee2MQTT 可能无法发布 Last_seen 的 (禁用值)。
为了激活它,我在部分中添加了这个。 先进 先进 从 /config/zigbee2mqtt/configuration.yaml :
先进: # 在MQTT消息中添加"last_seen" # 可能的值: 禁用,ISO_8601,ISO_8601_local,epoch last_seen: ISO_8601 _ 本地
此设置告诉 Zigbee2MQTT 添加属性 Last_seen 的 MQTT消息,具有本地时间可读格式。
有用的格式(可供选择)
- ISO_8601 _ 本地 : 清晰+本地主轴(每天最实用)。
- ISO_8601 标准 : 可读性,但在UTC中(用于集中UTC中的所有内容)。
- 时代 时代 时代 : Timetamp Unix(用于脚本/处理的实践)。
激活 激活 Last_seen 的 以及 链接 质量 Home Assistant(可选)

一次 Last_seen 的 在Zigbee2MQTT侧激活,还有一点: 在家庭助理中,这些实体通常被归类为『诊断』,因此可以创建它们。 残疾 者 自动。
为了让每个新的Zigbee设备直接到达『准备监督』,我添加了这一点。 /config/zigbee2mqtt/configuration.yaml :
device_options : HomeAssistant: Last_seen : 启用_by_default : 真正的链接质量: 启用_by_default : 真实 的
然后重新启动Zigbee2MQTT。
重要: 对已经安装的设备的影响
这种设置特别有助于 新设备 (或重新发现的设备)。
对于已经存在的设备,通常需要手动激活家庭助理中的相应实体。
数据库: 保持信息可见而不『污染』历史
『风险』不是Zigbee2MQTT(它只是在消息中添加了一个时间戳字段),而是Home Assistant,如果你保存每个更新。 Last_seen 的 在数据库中: 它可以通过许多传感器生成大量的文字。
我的选择: 我要 见 这些值无处不在,但我不需要逐分钟的图表。 因此,我将这些实体排除在记录仪之外。
我把什么放进去了 /config/recorders.yaml
记录器: 不包括: entity_globs : 传感器*_last _seen - sensor.*_linkquality
之后,我重新启动 Home Assistant: 这些价值观是实时可见的,但我强烈限制了不必要的历史的创造。
视觉监督: "无线电+新鲜度"计划
我不希望『一个实体在列表中丢失』: 我想 视觉监督, 立即可辨认。
原则:
- 每个Zigbee设备在平面上显示为一个小矩形。
- 批量显示的数字= 链接 质量.
- 右下方的时间= Last_seen 的 相对数(s/m/h/d)。
- 黑框=路由器(可变) 路由器: 1快速识别路由器。

排污卡(可重用)
我使用我三年前在这个页面上描述的整洁_模板卡的魔力:
因此 整理 _ 模板 + custom:decluttering-card 为了在任何地方重复使用相同的组件,只需更改4个变量。
我简单地定义了每个设备不同的四个元素:
- 面积: 传感器将被处理
- 顶部: 它的位置从顶部
- 左: 左侧位置
- 路由器: 1 如果它是路由器,否则 0
示例: 非常简单的仪表板页面
类型 : 图片元素图像: /local/house/1920x1000/off_0800.png 元素: 类型: custom:decluttering-card 模板 : 链接质量变量 : 面积: Sensor.light_chambre_parents - 顶部: 20% 左: 35% 路由器: 1 - 类型: custom:decluttering-card 模板 : 链接质量变量 : 面积: Sensor.fenetre_de_la_chambre_des_parents - 顶部: 15% 左: 37% 路由器: 0
模板 链接 质量 (『大块』)
Decluttering _templates : 链接质量: 默认值 : 顶端: 5% 左: 95% 路由器: 0个元素: 类型 : custom:button-card 实体: | [[[[[] 返回 "[[zone]]_linkquality"; ]]] show _icon : 假名: | [[返回 '[[zone]]]' .replace(/^sensor \./i, '').replace(/_/g, ' ' ' ').trim(); ]]] show _state : 真 show_units : false custom_fields : Lastseen: | [[const obj = state[[[[zone]]_last _seen]]; 如果(!obj ||!obj.state θ obj.state === 'unavailable')返回'! const last = new Date(obj.state); 如果(isNaN(last.getTime())返回 '! const now = new Date(); const seconds = Math.floor((now - last)/ 1000); 如果(秒 < 60)返回 '${seconds}s; const minutes = Math.floor(seconds / 60); 如果(分钟 < 60)返回 '${minutes}m; const hours = Math.floor(minutes / 60); if(hours < 24)返回${hours}h; const days = Math.floor(hours/24); 返回 》${days}d; ] 样式: 卡 : 边界: | [[[[return([router]]] == 1)? 2px Solid Black: 『无』; )-box-shadow: 无 - 位置: 相对 - 边界半径: 8px - min-width: 100px - 高度: 45px - 显示: Flex - flex-direction: 列 - 合理内容: 中心 - 对齐项目: 中心 - 颜色 : 白色名字: 字体大小: 10px - line-height: "1" - 填充: 0 - 保证金: 0 - text-align : 中心 - 颜色 : White-flex: 1、最大宽度: 95px - 字封装: break-word - overflow : 隐藏 - 空白空间 : 正常状态: 字体大小: 15px - 字体重量: Bold-line-height: "1" - 填充: 0 - 保证金: 0 - text-align : 中心 - 颜色 : White-flex: 1 custom_fields : Lastseen: 位置: 绝对 - 底部: 0px - 右: 0px - font-size : 10px - 颜色: Black-padding : 2px 4px - border-radius: 4px -box-shadow: 0 1px 3px rgba(0,0,0,0,0.3)- 背景: | [[const obj = state[[[[zone]]_last _seen]]; 如果(!obj ||!obj.state)返回 'rgba(128,128,128,0.5)'; const last = new Date(obj.state); const now = new Date(); const seconds = Math.floor((now - last)/ 1000); if(seconds < 1200)返回 'rgba(0.255,0,0.9)'; // green <20min if(seconds < 1800)返回 'rgba(255,255,0,0.9)'; // 黄色 20-30 分钟,如果(秒 < 7200)返回 'rgba(255,165,0,0.9)'; // orange <2h 返回 'rgba(255,0,0,0.9)'; // red >2h ]] 状态: 值 : 不可用的样式 : 卡 : 背景: RGBA(255,0,0,0.3)- 操作符: '> 值: 200种风格: 卡 : 背景: RGBA(0,180,0,0.3)- 操作符: '> 值: 150种风格: 卡 : 背景: RGBA(34,255,34,0.3)- 操作符: '> 值: 130种风格: 卡 : 背景: RGBA(255,255,0,0.3)- 操作符: '>=' 值 : 80种风格: 卡 : 背景: RGBA(255,165,0,0.3)- 操作符: '<' 值 : 80种风格: 卡 : 背景: RGBA(255,107,53,0.3)样式: 顶部: [[top]] 左: [[左]
简单地说,这个代码是做什么的?
此模板定义了您对所有 Zigbee 设备重用的唯一映射模板,仅更改 [[zone]] 变量。
实体属性在 JavaScript 中动态构建,指向 [[zone]] _linkquality 实体,该实体会自动显示设备的链接质量(由 Zigbee2MQTT 或 ZHA 返回的 LQI 值)。
名称也在客户端生成: 传感器前缀被移除, _ 被空格替换,并创建一个 trim(),从实体 ID 中产生可读标签。
最后看到的自定义字段读取实体 [[[zone]] _last _seen in state[],将其值转换为 Date 对象,然后计算与当前时间的差值以显示相对时间(s, m, h, d)。 如果值为空、不可用或无效日期,则显示 ! 而不是显示不一致的值。
右下角的最后一个徽章样式使用JavaScript函数,该函数根据上次通信的年龄返回不同的RGBA颜色(灰色如果没有值,那么绿色→黄色→橙色→红色取决于所经过的秒数),它可以直观地编码数据的新鲜度。
该节指出: 按钮卡定义了链接质量值的几个阈值: 不可用,然后切片 >200, >150, >130, >=80, <80,每个应用一个卡片特定的颜色背景,这将一个数字值变成一个立即可读的无线电质量指示器。
格式化属性(flex、min-width、 height、边框半径、绝对徽章位置等)确保了紧凑和均匀的渲染,当[[[路由器]] == 1时,可选的黑色边框与简单的终端相比,可以直观地识别Zigbee路由器。
有用的补充: Zigbee2MQTT 全球 健康 信息

这是这张卡的代码。
类型 : 图片元素图像: /local/house/1920x1000/off_0800.png 元素: 类型: 自定义:mod-card 卡 : 类型 : 实体名称: Zigbee2MQTT 显示 _header _toggle: 虚假实体: - 实体: switch.zigbee2mqtt _bridge _permit _ 加入名称: 允许纳入 - 实体: button.zigbee2mqtt _bridge _restart 名称: 重新启动 - 实体 : select.zigbee2mqt_bridge _log _level name : 日志级别 - 实体: binary_sensor.zigbee2mqtt _bridge _connection _state name: 连接状态 - 类型 : 自定义:template-entity-row name : 从国家启动: > {% 设置 e = state.binary_sensor.zigbee2mqtt _bridge _connection _state %} {% 如果 e 不是 no,e.state not in ['unavailable', 'unknown'] %{{{((now()- e.last _changed).total _seconds()/ 3600)| round(1)} h {% 其他 其它 %不可用 {% Endif 的 %} - 实体: Sensor.zigbee2mqtt _bridge _coordinator _version 名称: 协调版本 - 实体: Sensor.zigbee2mqtt _bridge _version 名称: Zigbee2MQTT版本 - 实体: Sensor.number_de _sensors_linkq_en _error 名称: 无法访问的图标 : MDI:alert-circle - 实体: Sensor.number_de _sensors_linkq 名称: 总图标 : MDI:devices - 实体: Sensor.zigbee _linkquality _mean name: 平均链接质量图标: MDI: 信号样式: 顶部: 35% 左: 75% 宽度 : 450px 的
我添加了一个传感器来计算链路质量的平均值。
![]()
这个传感器被添加到Templates.yaml文件中,这里是它的代码:
姓名: "zigbee_linkquality_average": ZigBee _linkquality _ 中单位 _ 测量: "LQI" state_class: 测量状态: >- {% 设置linkqualities = state.sensor | selectattr('entity_id', 'search', '_linkquality')θ selectattr('state', 'is_number')θ map('attribute='state')。 %} {% 如果 linkqualities | 长度 > 0 %} {{{(linkqualities | sum / linkqualities θ length)round(1)} {{(linkqualities | sum / linkqualities Ω length){ { {(linkqualities | sum / linkqualities θ length)。% 其他 其它 %} 0 {% Endif 的 %}
我添加了一个传感器来计算传感器的数量。
![]()
姓名: "number of sensor LinkQ" unique _id: Sensor.number _sensors _linkq 状态: >- {% 设置 lq _sensors = state.sensor | selectattr('entity _id', 'search', '_linkquality')$) | 列表 %}{{LQ _sensors | count }} 图标: MDI:signal-variant unit_of_measurement : 『传感器』
我添加了一个传感器来计算错误设备的数量。
![]()
姓名: "错误中的 LinkQ 传感器数量" 唯一 _id: Sensor.number _sensors _linkq _ 错误状态: >- {% 设置 lq _sensors = state.sensor | selectattr('entity _id', 'search', '_linkquality')$')| selectattr('state', 'in', ['unavailable', 'unknown', 'None'])) 列表 %}{{LQ _sensors | count }} 图标: MDI:alert-circle unit_of_measurement: 『传感器』
我在主仪表板上添加了一个指示器来报告错误的数字。

首先,此模板在错误 / yy 中显示 xx
姓名: "ZigBee _unreachable _synthese" 唯一 _id: Sensor.zigbee _reachable _synthese 状态: {state('sensor.number_de _sensors _linkq _en _error')}/{ state('sensor.number_de _sensors _linkq')} } 图标: mdi:alert-circle
在我的图片元素中,我补充说:
类型: 条件条件: 条件: 国家实体: Sensor.number _de _sensors _linkq _en _en 错误状态 _ 不是: "0"元素: 类型: custom:button-card 实体: Sensor.zigbee _reachable _synthese 图标: MDI:zigbee show_name: false show_state : 真实风格: 顶部: 5% 左: 5% 变换: 翻译(-50)%, -50%风格: 州 : 颜色: 红色 - font-weight : 700 - font-size : 16px 图标: 颜色: 红宽度: 20px - 高度: 20px卡: border-radius: 999px - 填充: 4px 6px - 背景: 透明 - 盒子阴影: 无
此块用于在仪表板计划中显示一个小红色指示器"Zigbee in error" 仅 当至少有一个有问题的传感器时。
这是图片元素卡中的一个条件元素: 它只显示其内容,当 sensor.number _sensors _linkq _en _ 错误与"0"不同(因此,如果至少有一个传感器无法到达或链接质量错误)。
当条件为真时,它会显示一个自定义:按钮卡基于 sensor.zigbee _unreachable _synthese,其中可能包含"3 in error"或类似的文本。
按钮放置在飞机左上角(5) % / 5 %以变换为中心: 翻译(-50)%, -50%)具有透明的背景,没有阴影,只保留Zigbee图标和文本。
Zigbee图标和状态的样式为红色,粗体和大小为16 px,具有边框半径: 999px给一个贴片/标签的外观,使它成为一个谨慎但清晰可见的视觉警告,只要有传感器在错误。
找出谁错了

要查看错误设备列表,以下是必要的代码。
模板声明
姓名: "错误中的 LinkQ 传感器数量" 唯一 _id: Sensor.number _sensors _linkq _ 错误状态: >- {% 设置 lq _sensors = state.sensor | selectattr('entity _id', 'search', '_linkquality')$')| selectattr('state', 'in', ['unavailable', 'unknown', 'None'])) 列表 %}{{LQ _sensors | count }} 图标: MDI:alert-circle unit_of_measurement: 『传感器』 - 名称: single _id "linkquality Sensor List in Error": Sensor.liste _sensors _linkquality _error 状态: >- {% 设置 lq _sensors = state.sensor | selectattr('entity _id', 'search', '_linkquality')$')| selectattr('state', 'in', ['unavailable', 'unavailable', 'unknown', 'None'])map('regex _replace', 'sensor \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\)_linkquality 。$',\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ %} {% 设置计数 = lq _sensors | 长度 %} {% 如果计数=0 %没有 {\displaystyle }% Elif count <= 5 %} {{ LQ _sensors | join(', ')} { { LQ _sensors | join(', ')} { { LQ _sensors | join(', ')} { {LQ _sensors | join(', ')% 其他 其它 %} {{ LQ _sensors[:5] | join(', ')~ ' + ' ~ count } {% Endif 的 %} 属性: 伯爵: >- {% 设置 lq _sensors = state.sensor | selectattr('entity _id', 'search', '_linkquality')$')| selectattr('state', 'in', ['unavailable', 'unavailable', 'unknown', 'None'])map('regex _replace', 'sensor \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\)_linkquality 。$',\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ %}{{LQ _sensors | length }} 完整 _list: >- {% 设置 lq _sensors = state.sensor | selectattr('entity _id', 'search', '_linkquality')$')| selectattr('state', 'in', ['unavailable', 'unavailable', 'unknown', 'None'])map('regex _replace', 'sensor \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\)_linkquality 。$',\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ %} {{ LQ _sensors | join('')'', ')default('None')}} 图标: mdi:alert-circle
在Dasboard上,总是在画面中
类型 : 图片元素图像: /local/house/1920x1000/off_0800.png 元素: 类型: 自定义:mod-card 卡 : 类型 : 实体名称: 错误实体中的 ZigBee 传感器: 类型: custom:template-entity-row entity : Sensor.liste _sensors _linkquality _en _error name : 列表状态: > {% 设置 s = state('sensor.liste _sensors _linkquality _en _error') %} {% 如果s不在['未知','unavailable', ''] %{{ s.replace(',', '\\\\\\\n')} { { s.replace(',','\\\\\\\n')} { { s.replace(',','\\\\\\n')} {s.replace('% 其他 其它 %没有 {\displaystyle }% Endif 的 %风格: 顶部: 80% 左: 75% 宽度 : 450px 的
✅ 简单 总结 ( 3 个 基本 块 )
1. Zigbee2MQTT: 激活 last_seen
先进: Last_seen : ISO_8601 _ 本地
2. Zigbee2MQTT: 在HA中默认启用(可选但方便)
device_options : HomeAssistant: Last_seen : 启用_by_default : 真正的链接质量: 启用_by_default : 真实 的
3. 家庭助理: 未在DB中注册这些实体
记录器: 不包括: entity_globs : 传感器*_last _seen - sensor.*_linkquality
它每天都在改变什么
- 我立刻看见了 弱区域(链接质量低)我知道要加强什么(路由器、位置、通道等)。
- 我完全知道 当美人鱼停止说话时(最后一次看到),所以我不再『假设』。
- 我有一个健康的数据库。 (在一直移动的传感器上没有不必要的历史记录)。
需要澄清吗? 问题?
此讨论(如果仍然开放)是可用的:



