如何做到 HA 与米家云同时在线不重复?MenuBarMijia 双源设备去重算法完整解析
【免费下载链接】MenuBarMijiaControl Xiaomi Mijia from your Mac menu bar or Windows tray. Home Assistant supported on macOS.项目地址https://gitcode.com/gh_mirrors/me/MenuBarMijia点击查看免费下载MenuBarMijia 是一款 Mac 菜单栏 / Windows 托盘的小米米家控制工具支持同时接入 Home Assistant 与米家云直连两条数据源。它的双源设备去重算法Join Key 多级匹配 整卡级择优评分让同一台物理设备只出现一张卡片并在家网络断开时自动无缝回落到云端无需手动切换。 这篇文章用尽量少的代码把「键怎么设计、分数怎么打、赢了怎么路由」讲清楚。一、为什么两边都在线会出重复设备MenuBarMijia 的两种连接方式各有优势数据源优势短板Home Assistant局域网 WebSocket低延迟、实体能力全TTS、场景、传感器必须部署、离开家庭网络即不可达米家云端直连手机扫码即用、外网可远程控制新型号依赖 MIoT 云端能力延迟略高如果简单把两边设备列表相加同一台空调会出现两张卡片如果把两边字段硬拼进同一张卡片再混发指令乐观锁、撤销快照和状态回读会在两个不同步的数据源之间产生竞态撕裂。设计决策记录在 docs/adr/0008-dual-source-device-deduplication.md核心结论是三个词配对、整卡、路由——先判定是不是同一台设备再整卡选出唯一胜出的数据源最后所有指令只从胜出方下发。⚠️ 注意跨源合并目前仅在 macOS 端执行。Windows 端支持 Home Assistant、米家云与演示模式三选一单源切换。二、键设计两级身份匹配Join Key两台设备是不是同一台是整个算法的地基。MenuBarMijia 采用多级降级匹配匹配逻辑在 Sources/MijiaCore/DeviceDeduplicator.swift。2.1 一级硬件标识精确匹配解析 HA 设备注册表的identifiers与connections含实体unique_id用三种硬证据配对小米did官方xiaomi_home集成把标识符写成server_did如cn_123456789xiaomi_miot则直接用裸did。MenuBarMijia 的规范化器 DeviceSourceIdentity.swift 会把这些变体拆解、小写化后还原出did候选集合MAC 地址去掉分隔符、转小写成 12 位十六进制后比对配对顺序上先跑did轮、再跑 MAC 轮避免共享网关 MAC 抢走子设备的精确did匹配。只有恰好一对一命中才会配对一台 HA 设备匹配到多台米家设备时直接放弃该轮宁可慢也不错配。2.2 二级同房同款唯一兜底很多 HA 集成并不写入硬件标识。此时退到启发式规则归一化后的同一房间内两边各仅有唯一一台相同型号或相同归一化名称且相同类别的设备才自动归并为一台。关键设计是拒绝猜测同房间有两台同款小米灯时不合并两张卡片会原样保留留给人工判断。兜底键的构造见 DeviceDeduplicator.swift格式为「前缀:房间|归一化值|类别」同名多实例会被计数排除。三、评分策略整卡级择优而不是拼字段配对成功后两张候选卡片必须选出一个胜出方。规则按优先级排列实现见 preferredCandidate优先级规则用户价值① 在线优先一边在线一边离线直接选在线方在家走 HA 低延迟出门 HA 断连同一张卡自动切到米家云② 能力评分两边都在线时按可控特性项数量打分分高者胜自动挑能控得动更多东西的那一端③ 同分 HA 优先分数相同时选局域网的 Home Assistant稳定偏向低延迟路径能力评分capabilityScore怎么做它对每种设备类别逐项累加这张卡实际暴露的可控/可读特性例如️ 音箱媒体播放 1、TTS 播报 2、文本指令 2、静音/睡眠等实体各 1 灯光开关 1、亮度 1、色温 1、灯效列表非空 2️ 空调开关/温度/模式/风速/摆风/室温各 1 插座开关 1、功率 1、电量统计 1、童锁 1。评分是卡级的不会把 HA 的亮度字段和米家云的 TTS 字段拼成一张缝合卡。这样HomeStore的 3 秒乐观锁、逆向指令撤销与批量操作语义完全不用重写。胜出后还有两个贴心细节房间互补胜出方没分配房间、另一方有明确房间时自动借用对方的房间归属手动固定卡片右键可把来源固定为 HA 或米家云固定只有在该源在线时才生效离线仍走自动回退。四、Canonical ID切换来源时设置不丢设备源来回切换最怕的是星标、排序、卡片大小、自定义分组全乱了。MenuBarMijia 给配对成功的双源设备分配一个统一稳定主键Canonical ID注册表定义在 DeviceSourceIdentity.swift。它的键集合同时包含pair:HA id|米家 id、ha:HA id、mi:米家 id、共享的did:与mac:前缀键——只要任意一个键能对上卡片就复用历史主键。再配合偏好 ID 记忆用户已在米家源下收藏过某设备时优先沿用米家 ID两端互相回退时收藏、排序、重命名完全保留。五、路由层一张卡只认一个后端合并不是终点。DualSourceHomeProvider.swift 持续监听两条数据流任何一端快照或连接状态变化都会重跑去重合并并为每张卡记录当前路由后端 源端设备 ID控制指令只发给胜出方撤销逆操作也由同一后端生成状态回读、传感器历史、摄像头取流全部按路由转发摄像头流遇到路由切换时先停旧流再开新流不会两条流叠播。六、如何在你的 Mac 上体验双源去重打开菜单栏面板的偏好设置 →「连接」页分别填写 Home Assistant 服务器地址 长期访问令牌并点击「扫码登录米家账号」完成云端直连两端配置完成后无需额外开关应用会自动并行连接并合并重复设备面板底部状态栏展示双源连接状态右键卡片可查看/固定当前驱动来源。合并后面板上每台设备只有一张卡片常用控制、场景胶囊与全关动作照常工作七、延伸阅读想深挖 HA 侧identifiers/connections线格式与各小米集成的写入差异项目内有一份源码级调研文档docs/research/ha-xiaomi-device-identity.md。配对与评分的回归用例在 Tests/MijiaCoreTests/DualSourceMergeTests.swift双端集成测试见 Tests/MijiaCoreTests/DualSourceIntegrationTests.swift。模块文件去重合并核心Sources/MijiaCore/DeviceDeduplicator.swift身份规范化与主键注册表Sources/MijiaCore/DeviceSourceIdentity.swift双源 Provider 与指令路由Sources/MijiaCore/DualSourceHomeProvider.swift设计决策记录docs/adr/0008-dual-source-device-deduplication.md一句话总结用硬件标识说话、用能力评分决胜负、用稳定主键守设置——这就是 MenuBarMijia 让 HA 与米家云同时在线却从不重复的完整思路。赞分享【免费下载链接】MenuBarMijiaControl Xiaomi Mijia from your Mac menu bar or Windows tray. Home Assistant supported on macOS.项目地址https://gitcode.com/gh_mirrors/me/MenuBarMijia点击查看免费下载相关推荐TheRemoteFreelancer资源去重算法如何避免重复收录同一平台TheRemoteFreelancer资源去重算法如何避免重复收录同一平台 你是否曾在自由职业平台列表中遇到重复出现的网站同一平台多次收录不仅浪费用户浏览时教程戴森球计划工厂蓝图7000 免费产线布局4 步装进游戏戴森球计划工厂蓝图7000 免费产线布局4 步装进游戏 戴森球计划工厂蓝图仓库 FactoryBluePrints 收录了社区贡献的 7000 多张免费工数据集VideOCR 的 SSIM 帧去重算法如何省下 90% 的重复 OCR 计算VideOCR 的 SSIM 帧去重算法如何省下 90% 的重复 OCR 计算 VideOCR 是一款通过图形界面从视频中提取硬字幕的开源工具支持 200上一篇Readest Android 启动崩溃修复实录Reading Widget 缩略图 1 像素封面引发的 width must be 0 进程崩溃分析下一篇brpc Dummy Server 实战指南为纯 Client / 无 RPC 程序挂载内置服务与 bvar 监控创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考