<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>www.msly.cn</title>
  <id>http://www.msly.cn/</id>
  <subtitle>This site is all about www.msly.cn.</subtitle>
  <generator uri="https://github.com/madskristensen/Miniblog.Core" version="1.0">Miniblog.Core</generator>
  <updated>2026-07-26T15:01:06Z</updated>
  <entry>
    <id>http://www.msly.cn/blog/ha-asr-part2/</id>
    <title>sherpa-onnx+SenseVoiceSmall FP32</title>
    <updated>2026-07-27T22:56:28Z</updated>
    <published>2026-07-26T15:01:06Z</published>
    <link href="http://www.msly.cn/blog/ha-asr-part2/" />
    <author>
      <name>test@example.com</name>
      <email>www.msly.cn</email>
    </author>
    <content type="html">&lt;p&gt;sherpa-onnx+SenseVoiceSmall FP32= stt server&lt;/p&gt;
&lt;p&gt;描述推理框架的选型&lt;/p&gt;
&lt;p&gt;描述模型的选型&lt;/p&gt;
&lt;div class="mce-toc"&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#mcetoc_1jufh85tu3"&gt;推理框架&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mcetoc_1jufh85tu4"&gt;模型&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="mcetoc_1jufh85tu3"&gt;推理框架&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Sherpa-ONNX 和 ONNX Runtime 是上下层关系。Sherpa-ONNX 内部调用 ONNX Runtime。&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;                    你的应用
                        │
        Home Assistant / Wyoming / Python / 
                        │
                        ▼
               sherpa-onnx（语音框架）
        ┌──────────────────────────────┐
        │ STT（ASR）                   │
        │ TTS                          │
        │ VAD                          │
        │ Speaker ID                   │
        │ Keyword Spotting             │
        │ Streaming                    │
        └──────────────────────────────┘
                        │
                        ▼
             ONNX Runtime（推理引擎）
        ┌──────────────────────────────┐
        │ 加载 .onnx                   │
        │ 图优化                        │
        │ CPU 执行             │
        │ Memory 管理                  │
        │ Thread Pool                  │
        └──────────────────────────────┘
                        │
                        ▼
                     ARM CPU&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sherpa-ONNX 是 k2-fsa 团队开发的语音 AI SDK。&lt;/p&gt;
&lt;p&gt;ONNX Runtime 是微软开发的通用 ONNX 模型推理引擎。&lt;/p&gt;
&lt;p&gt;Sherpa 官方支持ONNX Runtime CPU。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="mcetoc_1jufh85tu4"&gt;模型&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;官方SenseVoice FP32提供了 FP32 和 INT8 两种模型&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;STT 的核心不是 while 循环，而是事件驱动。&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>http://www.msly.cn/blog/ha-storage-part1/</id>
    <title>Home Assistant storage</title>
    <updated>2026-07-23T16:49:51Z</updated>
    <published>2026-07-23T16:46:11Z</published>
    <link href="http://www.msly.cn/blog/ha-storage-part1/" />
    <author>
      <name>test@example.com</name>
      <email>www.msly.cn</email>
    </author>
    <category term="storage" />
    <content type="html">&lt;p&gt;.storage/ 文件夹下的这些 JSON 文件是由 Home Assistant 自动化管理的内部数据库。&lt;/p&gt;
&lt;p&gt;如果手动改，必先停止 Home Assistant 服务，否则在 HA 退出时会用内存中的配置覆盖你的修改。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Git版本控制中会同时修改这三个&lt;/p&gt;
&lt;p&gt;&amp;nbsp;modified:&amp;nbsp; &amp;nbsp;.storage/core.config_entries&amp;nbsp; -&amp;nbsp;集成配置 (Integration)&lt;/p&gt;
&lt;p&gt;&amp;nbsp; modified:&amp;nbsp; &amp;nbsp;.storage/core.device_registry -&amp;nbsp;设备注册表 (Device)&lt;/p&gt;
&lt;p&gt;&amp;nbsp; modified:&amp;nbsp; &amp;nbsp;.storage/core.entity_registry&amp;nbsp; -&amp;nbsp;实体注册表 (Entity)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;解释他们之间的关系&lt;/p&gt;
&lt;p&gt;它们是父子嵌套关系：&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;[ core.config_entries ] (集成配置: Xiaomi Miot)
       │
       └──&amp;gt; [ core.device_registry ] (物理设备: 小米空气净化器)
                   │
                   ├──&amp;gt; [ core.entity_registry ] (实体 1: switch.air_purifier_power)
                   ├──&amp;gt; [ core.entity_registry ] (实体 2: sensor.air_quality_pm25)
                   └──&amp;gt; [ core.entity_registry ] (实体 3: fan.air_purifier_speed)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>http://www.msly.cn/blog/ha-matter-server-part-2/</id>
    <title>Home assistant matter server part2 - 版本历史变化</title>
    <updated>2026-07-17T19:32:54Z</updated>
    <published>2026-07-17T18:41:53Z</published>
    <link href="http://www.msly.cn/blog/ha-matter-server-part-2/" />
    <author>
      <name>test@example.com</name>
      <email>www.msly.cn</email>
    </author>
    <category term="matter server" />
    <content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="mce-toc"&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#mcetoc_1jtop094n5"&gt;2022 年-Python Matter Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mcetoc_1jtop094o6"&gt;2026-Matter Server 9.x（）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="mcetoc_1jtop094n5"&gt;2022 年-Python Matter Server&lt;/h2&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;Home Assistant
      │
 Matter Integration
      │
 Python Matter Server
      │
 CHIP(C++) SDK&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;底层实现:&lt;/p&gt;
&lt;p&gt;Python + CHIP(C++) SDK,官方 Matter SDK 包&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="mcetoc_1jtop094o6"&gt;2026-Matter Server 9.x（）&lt;/h2&gt;
&lt;p&gt;matter.js (TypeScript/JavaScript)&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;Home Assistant
      │
 Matter Integration
      │
 Matter Server 9.x
      │
 matter.js&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;底层实现:&lt;/p&gt;
&lt;p&gt;matter.js (TypeScript/JavaScript)&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>http://www.msly.cn/blog/ha-infrared-part3/</id>
    <title>Home assistant Infrared integration 工作原理</title>
    <updated>2026-07-18T01:40:02Z</updated>
    <published>2026-07-17T17:37:25Z</published>
    <link href="http://www.msly.cn/blog/ha-infrared-part3/" />
    <author>
      <name>test@example.com</name>
      <email>www.msly.cn</email>
    </author>
    <category term="infrared" />
    <content type="html">&lt;p&gt;Infrared integration&amp;nbsp;不能单独添加或直接使用，而是供其他红外设备集成调用。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Home assistant现有LG、Samsung、Sony、Daikin、Panasonic 等红外设备集成&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;结构&lt;/h2&gt;
&lt;p&gt;这一架构将发射器（Emitter）、接收器（Receiver）和具体设备控制（Consumer）解耦，使不同硬件能够通过统一的 Infrared API 与各种红外设备集成协同工作&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;                     Home Assistant
                            │
        ┌───────────────────┴───────────────────┐
        │                                       │
   LG Infrared                         Samsung Infrared
   Daikin Infrared                     Sony Infrared
        │                                       │
        └───────────────┬───────────────────────┘
                        │
              Infrared (Building Block)
                        │
        InfraredEmitterEntity / ReceiverEntity
                        │
      ┌─────────────────┼───────────────────────┐
      │                 │                       │
   ESPHome          Broadlink                 SMLIGHT
 (实现Emitter/Receiver) (实现Emitter/Receiver)    (实现Emitter/Receiver)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;LG Infrared Integration&lt;/p&gt;
&lt;p&gt;知道 LG 遥控协议、生成 LG 红外码、提供 Media Player/Button/Event 实体。&lt;/p&gt;
&lt;p&gt;上层设备集成（如 LG、三星或大金空调集成）有内置的红外码库。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Infrared Integration&lt;/p&gt;
&lt;p&gt;提供统一 API（Emitter/Receiver）、路由命令和事件&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;ESPHome / Broadlink / SMLIGHT Integration&lt;/p&gt;
&lt;p&gt;驱动具体红外发射器/接收器，将命令转换为真实 IR 信号。&lt;/p&gt;
&lt;p&gt;也就是说，只有实现了 Infrared 平台（Infrared Entity）Infrared Emitter、Infrared Receiver的硬件集成，才能被 LG Infrared、Samsung Infrared 等上层集成使用。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Infrared Receiver&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;电视遥控器
      │
      ▼
Broadlink IR Receiver
      │
      ▼
Infrared Receiver Entity
      │
      ▼
LG Integration
Samsung Integration
Automation&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Receiver Entity 产生事件：&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;infrared.received&lt;/code&gt;&lt;/pre&gt;</content>
  </entry>
  <entry>
    <id>http://www.msly.cn/blog/ha-infrared-part2/</id>
    <title>Siri控制空调｜涂鸦远程红外遥控器 + Home Assistant 接入苹果家庭(homekit)</title>
    <updated>2026-07-18T18:05:06Z</updated>
    <published>2026-07-14T11:39:00Z</published>
    <link href="http://www.msly.cn/blog/ha-infrared-part2/" />
    <author>
      <name>test@example.com</name>
      <email>www.msly.cn</email>
    </author>
    <category term="infrared" />
    <content type="html">&lt;h2&gt;接入思路&lt;/h2&gt;
&lt;p&gt;Homepod mini作为语音入口控制 HA中的设备、&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;系统环境&lt;/h2&gt;
&lt;p&gt;HA 版本：&lt;/p&gt;
&lt;p&gt;Core2026.7.1&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;准备&lt;/h2&gt;
&lt;p&gt;1 个Broadlink rm mini3的 WiFi 红外遥控器&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;流程&lt;/h2&gt;
&lt;p&gt;在Broadlink App添加 Broadlink rm3&lt;/p&gt;
&lt;p&gt;在Broadlink App打开局域网开关&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;在路由器后台设置Broadlink rm3为静态IP&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;在home assistant中，添加Broadlink Integration&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;在home assistant中，学习红外发射命令（开发者工具）&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;虚拟出一个开关（Template switch）- in&amp;nbsp;configuration.yaml&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;在home assistant中配置homekit bridge - in configuration.yaml&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;apple home 扫描二维码&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;useful links&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;HomeAssistant连接博联(Broadlink)万能遥控（学习红外指令）&lt;/p&gt;
&lt;p&gt;https://www.cnblogs.com/Luad/p/18606087&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Siri控制空调｜涂鸦远程红外遥控器 + Home Assistant 接入苹果家庭(homekit)&lt;/p&gt;
&lt;p&gt;https://zhuanlan.zhihu.com/p/1920988695982486609&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>http://www.msly.cn/blog/ha-infrared-part1/</id>
    <title>Home Assistant (HA) 集成 Broadlink 红外转发器</title>
    <updated>2026-07-27T15:07:31Z</updated>
    <published>2026-07-13T13:39:19Z</published>
    <link href="http://www.msly.cn/blog/ha-infrared-part1/" />
    <author>
      <name>test@example.com</name>
      <email>www.msly.cn</email>
    </author>
    <category term="infrared" />
    <content type="html">&lt;p&gt;智能遥控(Broadlink RM mini4)&lt;/p&gt;
&lt;p&gt;本系列包括：&lt;/p&gt;
&lt;p&gt;博联黑豆连接到HA&lt;/p&gt;
&lt;p&gt;HA官方推荐的博联遥控器学习射频和红外方法&lt;/p&gt;
&lt;p&gt;broadlink博联万能遥控器HA使用方法&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="mce-toc"&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#mcetoc_1jte72cnt8"&gt;1.Broadlink&amp;nbsp; App 完成初始联网&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mcetoc_1jte72cnt9"&gt;2.集成到Home Assistant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mcetoc_1jte72cnta"&gt;3.学习控制红外信号&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mcetoc_1jte72cntb"&gt;4.发送红外编码&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id="mcetoc_1jte72cnt8"&gt;1.Broadlink&amp;nbsp; App 完成初始联网&lt;/h3&gt;
&lt;p&gt;将 Broadlink 设备连接到与 HA 相同的局域网内&lt;/p&gt;
&lt;p&gt;关闭&amp;ldquo;云锁&amp;rdquo; (Lock device) 功能，否则 HA 无法本地控制&lt;/p&gt;
&lt;p&gt;在路由器中设置Broadlink 设备的静态 IP 地址&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="mcetoc_1jte72cnt9"&gt;2.集成到Home Assistant&lt;/h3&gt;
&lt;p&gt;添加集成 (Add Broadlink Integration)&lt;/p&gt;
&lt;h3 id="mcetoc_1jte72cnta"&gt;3.学习控制红外信号&lt;/h3&gt;
&lt;p&gt;通过 HA 的&amp;ldquo;开发者工具&amp;rdquo;来学习发送红外编码：&lt;/p&gt;
&lt;p&gt;录制红外编码信号：调用 remote.learn_command 服务，选择你的 Broadlink 实体，输入自定义的设备名和按键名（例如 device: tv, command: power），然后按下物理遥控器对准 Broadlink 录制。&lt;/p&gt;
&lt;p&gt;The learned codes are stored in /config/.storage/ in a JSON file called&lt;/p&gt;
&lt;p&gt;config/.storage/broadlink_remote_&amp;lt;uid&amp;gt;_codes&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="mcetoc_1jte72cntb"&gt;4.发送红外编码&lt;/h3&gt;
&lt;p&gt;Broadlink 作为底层发射器&lt;/p&gt;
&lt;p&gt;发送红外编码信号信号：调用 remote.send_command 服务，选择对应的实体、设备名和按键名即可控制家电。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>http://www.msly.cn/blog/ha-asr-part1/</id>
    <title>Qwen-ASR / FunASR：中文生态极佳的方案</title>
    <updated>2026-07-26T15:29:58Z</updated>
    <published>2026-07-10T20:06:40Z</published>
    <link href="http://www.msly.cn/blog/ha-asr-part1/" />
    <author>
      <name>test@example.com</name>
      <email>www.msly.cn</email>
    </author>
    <content type="html">&lt;p&gt;Qwen-ASR / FunASR：ASR中文生态极佳的方案。&lt;/p&gt;
&lt;p&gt;国内玩家常通过本地 API 或第三方 Docker 将阿里 FunASR 模型接入 HA，实现极高精度的中文语音识别。&lt;/p&gt;
&lt;div class="mce-toc"&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#mcetoc_1jufg30mg1"&gt;方案&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#mcetoc_1juffl4c01d"&gt;1.FunASR语音 AI 框架&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mcetoc_1juffl4c01e"&gt;2.FunASR ONNX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mcetoc_1juffl4c01f"&gt;3.sherpa-onnx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;可运行 Parakeet 等多语言模型，速度相比传统 Whisper 快数倍，且准确率极佳&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;HA 官方原生支持的默认本地 STT 引擎。包含从 tiny 到 large 等不同尺寸，全本地运行，但对硬件算力有一定要求。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;夸克在客户端离线（端侧）&lt;/p&gt;
&lt;p&gt;运行 SenseVoice 语音大模型，&lt;/p&gt;
&lt;p&gt;采用 ONNX Runtime作为核心推理引擎，使用微软开源的 ONNX Runtime 引擎。&lt;/p&gt;
&lt;p&gt;算子优化：它负责直接加载经过 INT8 量化的 ASR 计算图，在不依赖独立显卡的情况下，直接调用低功耗的 CPU 端侧推理，完成极速解码。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="mcetoc_1jufg30mg1"&gt;方案&lt;/h2&gt;
&lt;h3 id="mcetoc_1juffl4c01d"&gt;1.FunASR语音 AI 框架&lt;/h3&gt;
&lt;p&gt;FunASR 的 Runtime 可替换&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;               AutoModel
                    │
    ┌───────────────┼───────────────┐
    ▼               ▼               ▼
 PyTorch      ONNX Runtime      GGUF Runtime&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;已测试方案 FunASR 1.3 + PyTorch。&lt;/p&gt;
&lt;h3 id="mcetoc_1juffl4c01e"&gt;2.FunASR ONNX&lt;/h3&gt;
&lt;p&gt;未测试方案 FunASR 1.5 + ONNX&lt;/p&gt;
&lt;h3 id="mcetoc_1juffl4c01f"&gt;3.sherpa-onnx&lt;/h3&gt;
&lt;p&gt;在用方案：Sherpa-ONNX + ONNX Runtime 1.34 + SenseVoiceSmall onnx FP32&lt;/p&gt;
&lt;p&gt;sherpa-onnx 是 Next-gen Kaldi 团队基于 ONNX Runtime 的开源语音工具库。负责加载并执行转换为ONNX格式的语音AI模型，实现本地离线的低延迟推理。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;ONNX Runtime&lt;/p&gt;
&lt;p&gt;微软开源的跨平台、跨硬件的通用AI推理运行时&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;esp32音箱接入https://esphome.io/components/voice_assistant.html&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;github:https://github.com/k2-fsa/sherpa-onnx/&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>http://www.msly.cn/blog/ha-ecovacs-part1/</id>
    <title>科沃斯扫地机器人接入home assistant-没有实体</title>
    <updated>2026-07-18T08:50:36Z</updated>
    <published>2026-07-04T16:41:20Z</published>
    <link href="http://www.msly.cn/blog/ha-ecovacs-part1/" />
    <author>
      <name>test@example.com</name>
      <email>www.msly.cn</email>
    </author>
    <category term="vacuum" />
    <content type="html">&lt;p&gt;本篇描述用ha内置的Ecovacs 集成接入ha&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="mce-toc"&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#mcetoc_1jtq6n5grg"&gt;资源&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mcetoc_1jtq6n5grh"&gt;原因&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mcetoc_1jtq6n5gri"&gt;解决步骤&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mcetoc_1jtq6n5grj"&gt;存在的问题&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="mcetoc_1jtq6n5grg"&gt;资源&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;官方 Ecovacs 集成（清扫结束并返回基站）&lt;/p&gt;
&lt;p&gt;https://www.home-assistant.io/integrations/ecovacs&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;查看官方最新的支持扫地机型号&lt;/p&gt;
&lt;p&gt;https://github.com/DeebotUniverse/client.py/tree/dev/deebot_client/hardware&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;查看你自己的Ha支持扫地机型号&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt; docker exec -it ha  sh
/config # cd  /usr/local/lib/python3.14/site-packages/deebot_client/hardware/
/usr/local/lib/python3.14/site-packages/deebot_client/hardware # ls -l
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="mcetoc_1jtq6n5grh"&gt;原因&lt;/h2&gt;
&lt;p&gt;Home Assistant 添加了一台HA官方不支持的Ecovacs扫地机型号。&lt;/p&gt;
&lt;p&gt;集成到ha，与三个因素有关：&lt;/p&gt;
&lt;p&gt;ha版本：&lt;/p&gt;
&lt;p&gt;机器人内部型号：&lt;/p&gt;
&lt;p&gt;机器人当前的固件版本：&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;其中任何一项不匹配，都会导致机器人无实体，或部分功能缺失。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Homeassistant core更新至12.x后部分用户出现老设备无法识别的原因，作者本人表示因科沃斯官方始终不开放api接口，且官方设备码命名混乱（同一型号可能存在多个class设备名）导致维护困难。&lt;/p&gt;
&lt;p&gt;作者去除了部分难以管理的设备导致集成无法正常识别。&lt;/p&gt;
&lt;p&gt;detail：&lt;a href="https://github.com/DeebotUniverse/client.py"&gt;https://github.com/DeebotUniverse/client.py&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_1jtq6n5gri"&gt;解决步骤&lt;/h2&gt;
&lt;p&gt;step 1.查看你的扫地及型号&lt;/p&gt;
&lt;p&gt;查看系统日志，找到科沃斯的告警日志，其中有个日志里面会有你机器的型号和class参数&lt;/p&gt;
&lt;p&gt;先正常重载Ecovacs集成，在系统core日志中搜索Ecovacs会得到类似以下报错：&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;Device "DEEBOT T9 POWER" not supported. More information at https://github.com/DeebotUniverse/client.py/issues/612: {'did': '38559xxxxxxx', 'name': 'E07H01xxxxxx', 'class': 'dj8zpr', 'resource': 'CV4R', 'company': 'eco-ng', 'bindTs': xxxxxxx, 'service': {'jmq': 'jmq-ngiot-cn.dc.cn.ecouser.net', 'mqs': 'api-ngiot.dc-cn.cn.ecouser.net'}, 'deviceName': 'DEEBOT T9 POWER', 'icon': 'https://portal.ecouser.net/api/pim/file/get/6087d70898318f000894a259', 'ota': True, 'UILogicId': 'T9_PRO', 'materialNo': 'xxxxxxx', 'pid': '6087d70xxxxxx', 'product_category': 'DEEBOT', 'model': 'T9_ECOVACS_ECO', 'updateInfo': {'needUpdate': False, 'changeLog': ''}, 'nick': 'xxxxx', 'homeId': '626xxxxxx', 'homeSort': 1, 'status': 1, 'otaUpgrade': {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;举例：&lt;/p&gt;
&lt;p&gt;1.Device "DEEBOT X5 PRO" not supported.表示集成不支持这个型号。&lt;/p&gt;
&lt;p&gt;2.class为你的科沃斯型号代码，例如：DEEBOT T9 POWER为 dj8zpr&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;step 2.查看官方支持的已有的扫地机型号&lt;/p&gt;
&lt;p&gt;https://github.com/DeebotUniverse/client.py/tree/dev/deebot_client/hardware&lt;/p&gt;
&lt;p&gt;官方集成支持2200个型号&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;total 2200
-rw-r--r--    1 root     root         11199 Jun 19 21:05 02qwum.py
-rw-r--r--    1 root     root          7927 Jun 19 21:05 0bdtzz.py
-rw-r--r--    1 root     root          5117 Jun 19 21:05 0jbd6s.py
-rw-r--r--    1 root     root         11240 Jun 19 21:05 0jv4ti.py
-rw-r--r--    1 root     root          4653 Jun 19 21:05 12baap.py
-rw-r--r--    1 root     root          8547 Jun 19 21:05 1b23du.py
...
-rw-r--r--    1 root     root          8547 Jun 19 21:05 1vxt52.py
-rw-r--r--    1 root     root          5117 Jun 19 21:05 2ap5uq.py
-rw-r--r--    1 root     root          5117 Jun 19 21:05 2i0fns.py
...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你的型号在上面的目录里并没有，所以不支持。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;step 3.找一个型号最接近的现有定义，复制一份、改个名字&lt;/p&gt;
&lt;p&gt;没有对应型号的配置文件，是不是就没办法了？并不是。&lt;/p&gt;
&lt;p&gt;方法是找一个类似的扫地机型号接入进来，因为有些机器的功能是类似的，也就是说，它们的api接口是类似的。&lt;/p&gt;
&lt;p&gt;接下来的工作，就是找一个和你的扫地机类似的型号。&lt;/p&gt;
&lt;p&gt;例如：&lt;span style="color: #444444; font-family: Tahoma, Helvetica, 'Microsoft Yahei', sans-serif;"&gt;用的是T8 power ，class类型为no61kx，建立链接替换成0bdtzz可以使用&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;haos&lt;/p&gt;
&lt;p&gt;装Advanced SSH &amp;amp; Web Terminal加载项，关闭保护模式，启动加载项&lt;/p&gt;
&lt;p&gt;然后打开网页界面后输：&lt;/p&gt;
&lt;p&gt;docker exec -it homeassistant /bin/bash&lt;/p&gt;
&lt;p&gt;然后：&lt;/p&gt;
&lt;p&gt;cd /usr/local/lib/python3.13/site-packages/deebot_client/hardware&lt;/p&gt;
&lt;p&gt;然后&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;ln -svfT ucn2xe.py dj8zpr.py&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;p&gt;cp 找到的同名或者相似的文件名.py 你看到的class值.py&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;然后重启ha&lt;/p&gt;
&lt;p&gt;举例1：&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;# Step 1: 获取正在运行的 Docker 容器 ID，其中包含 Home Assistant 的实例
docker ps | grep homeassistant
# `docker ps` 列出所有正在运行的容器，`grep` 筛选出名字中包含 "homeassistant" 的容器。

# Step 2: 使用容器 ID 进入 Home Assistant 容器内部
docker exec -it &amp;lt;CONTAINERID&amp;gt; sh
# 替换 &amp;lt;CONTAINERID&amp;gt; 为上一步中返回的容器 ID。
# `-it` 以交互模式进入容器，`sh` 打开一个 Shell 环境。

# Step 3: 定位到 deebot_client 的 hardware/deebot 目录
cd /usr/local/lib/python3.13/site-packages/deebot_client/hardware/deebot
# 这里的路径是 Python 的 site-packages 目录，存放 Python 库文件。
# deebot_client 是与扫地机器人（如 Ecovacs Deebot）交互的模块。

# Step 4: 创建一个符号链接，将 x5d34r.py 文件指向 lhbd50.py
ln -svfT x5d34r.py lhbd50.py
# `ln` 是创建链接的命令。
# `-s` 创建符号链接，类似于快捷方式。
# `-v` 显示创建链接的详细信息。
# `-f` 强制覆盖已存在的目标文件。
# `-T` 明确目标是文件（而非目录）。
# 这一步确保任何对 lhbd50.py 的引用都指向 x5d34r.py。

# Step 5: 重启 Home Assistant 以使更改生效
restart home assistant
# 通过重启让新的符号链接及代码修改生效。&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;举例2：&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;【Home Assistant OS 官方集成支持 DEEBOT N9+（a7lhb1）最简操作指南】
适用于：
使用官方 Ecovacs 集成（非第三方插件）
Home Assistant OS / Container / Supervised 2025.8.x 及以上
不想等官方合并，希望 今天就能用 的用户
一、准备工作（1 分钟）
确认版本
设置 &amp;rarr; 系统 &amp;rarr; 信息 &amp;rarr; Home Assistant Core &amp;ge; 2025.8.x。
确认设备
日志里出现
Device "DEEBOT N9+" not supported. &amp;hellip; class: a7lhb1
即为本文适用场景。
二、取得容器写权限（3 分钟）
安装 Advanced SSH &amp;amp; Web Terminal
配置 &amp;rarr; 加载项 &amp;rarr; 加载项商店
搜索 Advanced SSH &amp;amp; Web Terminal &amp;rarr; 安装 &amp;rarr; 启动
关闭保护模式
进入该插件 &amp;rarr; 配置 &amp;rarr; 把 &amp;ldquo;保护模式&amp;rdquo; 开关设为 关 &amp;rarr; 保存 &amp;rarr; 重启插件
进入容器
打开插件的 Web 终端，执行：
bash

docker exec -it homeassistant sh
三、复制模板文件（30 秒）
进入目标目录
bash

cd /usr/local/lib/python3.13/site-packages/deebot_client/hardware/deebot
找到 功能最全的模板（示例用 x5d34r.py，若列表不同，选文件最大的即可）
bash

cp x5d34r.py a7lhb1.py
Tips：用 ls -lS | head 可快速找最大文件。
四、重启 Home Assistant（1 分钟）
bash

exit          # 退出容器
ha core restart   # 或 Supervisor &amp;rarr; 系统 &amp;rarr; 重启主机
五、重新绑定集成（30 秒）
删除旧集成：
配置 &amp;rarr; 设备与服务 &amp;rarr; 找到 Ecovacs &amp;rarr; 删除
重新添加：
添加集成 &amp;rarr; Ecovacs &amp;rarr; 登录账号 &amp;rarr; 选择国家/地区 cn &amp;rarr; 完成
验证：
设备列表出现 &amp;ldquo;DEEBOT N9+ (a7lhb1)&amp;rdquo; 即成功。

六、一键回退（官方合并后）
bash

docker exec -it homeassistant sh \
  rm /usr/local/lib/python3.13/site-packages/deebot_client/hardware/deebot/a7lhb1.py
ha core restart
一句话总结
官方集成 + 容器内复制模板 &amp;rarr; 今天就能用 N9+，升级/回退零侵入&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="mcetoc_1jtq6n5grj"&gt;存在的问题&lt;/h2&gt;
&lt;p&gt;1.细节功能不适配&amp;mdash;&amp;mdash;风量档位多了一档、水量本该是离散三档却被当连续滑块、自动集尘频率对不上、地图协议版本错位&amp;hellip;&amp;hellip;表象是「某个实体不工作」，根因都是同一个：整机最像 &amp;ne; 每个模块都最像。&lt;/p&gt;
&lt;p&gt;举例：&lt;/p&gt;
&lt;p&gt;1.科沃斯接入HA之后，只有返回基站和定位功能有用，启动按键没反应。&lt;/p&gt;
&lt;p&gt;2.HA一升级就不能正常链接了&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;有些复杂，我还是等等有没有大佬把他救活&lt;/p&gt;
&lt;p&gt;39216600，可以加我下，微信或者qq&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>http://www.msly.cn/blog/ha-ecovacs-part2/</id>
    <title>科沃斯扫地机器人接入Home Assistant（mqtt 编程源代码解析）</title>
    <updated>2026-07-07T21:07:33Z</updated>
    <published>2026-07-01T17:58:25Z</published>
    <link href="http://www.msly.cn/blog/ha-ecovacs-part2/" />
    <author>
      <name>test@example.com</name>
      <email>www.msly.cn</email>
    </author>
    <category term="vacuum" />
    <content type="html">&lt;p&gt;在 Home Assistant 官方内置的科沃斯依赖库 deebot_client 中，底层代码采用的是（Capability 模块化）设计；为 X5 PRO 手写一个专属的 mxse7w.py 并不需要从零去写网络协议或解密通信，只需要按照它的结构规范进行配置即可。&lt;/p&gt;
&lt;div class="mce-toc"&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#mcetoc_1jsmqgva56"&gt;源代码分析&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mcetoc_1jsmq1li42"&gt;完整源代码（mxse7w.py）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mcetoc_1jsmqgva57"&gt;为扫地机器人添加基站烘干能力（Mop Drying Capability）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;根据实战总结，科沃斯 X5 PRO（mxse7w）的整机骨架、风量四档（Quiet/Normal/Max/Max+）和地图协议版本与 X8 PRO 完全一致，但它的三档水量调节和拖布检测逻辑则与 X2 一致。&lt;/p&gt;
&lt;p&gt;因此，最完美的&amp;ldquo;手写&amp;rdquo;方案是组合 X8 PRO 的框架与 X2 的水量模块。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="mcetoc_1jsmqgva56"&gt;源代码分析&lt;/h2&gt;
&lt;p&gt;https://github.com/DeebotUniverse/client.py/blob/dev/deebot_client/hardware/lr4qcs.py&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;https://github.com/DeebotUniverse/client.py/blob/dev/deebot_client/hardware/p1jij8.py&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;true&lt;/p&gt;
&lt;p&gt;https://github.com/DeebotUniverse/client.py/blob/dev/deebot_client/hardware/mxse7w.py&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;在面向对象的软件设计中，StaticDeviceInfo这段代码的本质是一个&amp;ldquo;静态能力描述器&amp;rdquo;（Capability Descriptor）。它没有包含任何复杂的业务执行逻辑，而是通过纯粹的数据结构化配置.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;def get_device_info()树形拓扑图&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;[StaticDeviceInfo] (根节点 Root)
                         │
                  [Capabilities] (分支节点)
     ┌───────────────────┼───────────────────┬───────────────────┐
     ▼                   ▼                   ▼                   ▼
 [clean]             [map]              [settings]          [station] (子树/分支)
   ├── action          ├── cached_info     ├── advanced_mode   ├── action
   ├── continuous      ├── changed         ├── carpet_boost    ├── auto_empty
   ├── count           ├── info            ├── child_lock      └── state
   ├── log             ├── major           ├── ota
   ├── preference      ├── minor           ├── true_detect
   └── work_mode       ├── multi_state     ├── voice_assistant
                       ├── position        └── volume
                       ├── relocation
                       ├── rooms
                       ├── set
                       └── trace&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;树形结构的角色分工&lt;/p&gt;
&lt;p&gt;这个树形结构划分为三个层级：&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. 根节点 (Root Node) &amp;mdash;&amp;mdash; StaticDeviceInfo&lt;/p&gt;
&lt;p&gt;整个结构的入口。它除了包含&amp;ldquo;能力树&amp;rdquo;之外，还定义了树的全局环境参数，比如控制数据交换格式的叶子节点 DataType.JSON。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Posts/files/x5--pro-mqtt-1_639187901894127996.JPG" alt="x5--pro-mqtt-1.JPG" width="380" height="155" /&gt;&lt;/p&gt;
&lt;p&gt;2. 分支节点 (Branch Nodes) &amp;mdash;&amp;mdash; 核心功能分类&lt;/p&gt;
&lt;p&gt;即 Capabilities 下的第一层属性，如 clean（清扫）、map（地图）、settings（系统设置）、station（基站）。&lt;/p&gt;
&lt;p&gt;&lt;img src="/Posts/files/x5--pro-mqtt-2_639187901894257698.JPG" alt="x5--pro-mqtt-2.JPG" width="941" height="511" /&gt;&lt;/p&gt;
&lt;p&gt;设计目的： 在软件工程中这叫高内聚（High Cohesion）。它将数十个零散的底层传感器和执行机构，按照人类的认知习惯归类成几个核心大组，方便上层应用（如 Home Assistant）按组调用。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. 叶子节点 (Leaf Nodes) &amp;mdash;&amp;mdash; 能力&lt;/p&gt;
&lt;p&gt;树结构的最末端，也就是真正干活的逻辑单元。每个叶子节点本身又是另一个微型组合对象：&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;例如叶子节点 child_lock（童锁），它包含了：&lt;/p&gt;
&lt;p&gt;事件（Event）： ChildLockEvent&lt;/p&gt;
&lt;p&gt;获取状态（Get）： [GetChildLock()]&lt;/p&gt;
&lt;p&gt;设置状态（Set）： SetChildLock&lt;/p&gt;
&lt;p&gt;&lt;img src="/Posts/files/x5--pro-mqtt-3_639187904607323153.JPG" alt="x5--pro-mqtt-3.JPG" width="950" height="667" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;当需要给扫地机器人增加配置一项&amp;ldquo;能力&amp;rdquo;时，需在底层绑定了三样东西：属性对象（Capability）、发送指令（Commands）、接收事件（Events）&lt;/p&gt;
&lt;pre class="language-markup"&gt;&lt;code&gt;┌──────────────────────────────────────────────┐
   │        get_device_info() 静态能力描述         │
   │  (声明 DEEBOT X5 PRO OMNI 认识哪些参数和动作)  │
   └──────────────────────────────────────────────┘
          │
          ├─► 1. 属性实体 (Capability) ───► 例如: fan_speed (风速)
          │
          ├─► 2. 发送指令 (Commands) ─────► 例如: GetFanSpeed(), SetFanSpeed
          │
          └─► 3. 接收事件 (Events) ───────► 例如: FanSpeedEvent (云端/机器状态主动推送)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如：配置风扇速度能力&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt; fan_speed=CapabilitySetTypes(
                event=FanSpeedEvent,
                get=[GetFanSpeed()],
                set=SetFanSpeed,
                types=(
                    FanSpeedLevel.QUIET,
                    FanSpeedLevel.NORMAL,
                    FanSpeedLevel.MAX,
                    FanSpeedLevel.MAX_PLUS,
                ),
            ),&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="mcetoc_1jsmq1li42"&gt;完整源代码（&lt;span style="color: #222222; font-family: 'Open Sans', Ubuntu, 'Nimbus Sans L', Avenir, AvenirNext, 'Segoe UI', Helvetica, Arial, sans-serif; font-size: 19px;"&gt;mxse7w.py&lt;/span&gt;&lt;span style="font-size: 14px;"&gt;）&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;https://github.com/DeebotUniverse/client.py/blob/dev/deebot_client/hardware/mxse7w.py&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;"""Deebot DEEBOT X5 PRO OMNI Capabilities."""

from __future__ import annotations

# 从 deebot_client 库导入各种&amp;ldquo;能力（Capability）&amp;rdquo;基类与设备类型定义
from deebot_client.capabilities import (
    Capabilities,
    CapabilityClean,
    CapabilityCleanAction,
    CapabilityCustomCommand,
    CapabilityEvent,
    CapabilityExecute,
    CapabilityExecuteTypes,
    CapabilityLifeSpan,
    CapabilityMap,
    CapabilitySet,
    CapabilitySetEnable,
    CapabilitySettings,
    CapabilitySetTypes,
    CapabilityStation,
    CapabilityStats,
    CapabilityWater,
    DeviceType,
)
# 导入控制基站动作和 JSON 序列化的相关指令
from deebot_client.commands import StationAction
from deebot_client.commands.json import station_action
from deebot_client.commands.json.advanced_mode import GetAdvancedMode, SetAdvancedMode
from deebot_client.commands.json.auto_empty import GetAutoEmpty, SetAutoEmpty
from deebot_client.commands.json.battery import GetBattery
from deebot_client.commands.json.carpet import (
    GetCarpetAutoFanBoost,
    SetCarpetAutoFanBoost,
)
from deebot_client.commands.json.charge import Charge
from deebot_client.commands.json.charge_state import GetChargeState
from deebot_client.commands.json.child_lock import GetChildLock, SetChildLock
from deebot_client.commands.json.clean import CleanAreaV2, CleanV2
from deebot_client.commands.json.clean_count import GetCleanCount, SetCleanCount
from deebot_client.commands.json.clean_logs import GetCleanLogs
from deebot_client.commands.json.clean_preference import (
    GetCleanPreference,
    SetCleanPreference,
)
from deebot_client.commands.json.continuous_cleaning import (
    GetContinuousCleaning,
    SetContinuousCleaning,
)
from deebot_client.commands.json.custom import CustomCommand
from deebot_client.commands.json.efficiency import GetEfficiencyMode, SetEfficiencyMode
from deebot_client.commands.json.error import GetError
from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed
from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan
from deebot_client.commands.json.map import (
    GetCachedMapInfo,
    GetMajorMap,
    GetMapInfoV2,
    GetMapSetV2,
    GetMapTrace,
    GetMinorMap,
    SetMajorMap,
)
from deebot_client.commands.json.multimap_state import (
    GetMultimapState,
    SetMultimapState,
)
from deebot_client.commands.json.network import GetNetInfo
from deebot_client.commands.json.ota import GetOta, SetOta
from deebot_client.commands.json.play_sound import PlaySound
from deebot_client.commands.json.pos import GetPos
from deebot_client.commands.json.relocation import SetRelocationState
from deebot_client.commands.json.stats import GetStats, GetTotalStats
from deebot_client.commands.json.sweep_mode import GetSweepMode, SetSweepMode
from deebot_client.commands.json.true_detect import GetTrueDetect, SetTrueDetect
from deebot_client.commands.json.voice_assistant_state import (
    GetVoiceAssistantState,
    SetVoiceAssistantState,
)
from deebot_client.commands.json.volume import GetVolume, SetVolume
from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo
from deebot_client.commands.json.work_mode import GetWorkMode, SetWorkMode
from deebot_client.commands.json.work_state import GetWorkState
from deebot_client.const import DataType

# 导入当扫地机状态改变时，通知客户端的&amp;ldquo;事件（Event）&amp;rdquo;和枚举定义
from deebot_client.events import (
    AdvancedModeEvent,
    AvailabilityEvent,
    BatteryEvent,
    CachedMapInfoEvent,
    CarpetAutoFanBoostEvent,
    ChildLockEvent,
    CleanCountEvent,
    CleanLogEvent,
    CleanPreferenceEvent,
    ContinuousCleaningEvent,
    CustomCommandEvent,
    EfficiencyModeEvent,
    ErrorEvent,
    FanSpeedEvent,
    FanSpeedLevel,
    LifeSpan,
    LifeSpanEvent,
    MajorMapEvent,
    MapChangedEvent,
    MapTraceEvent,
    MultimapStateEvent,
    NetworkInfoEvent,
    OtaEvent,
    PositionsEvent,
    ReportStatsEvent,
    RoomsEvent,
    StateEvent,
    StationEvent,
    StatsEvent,
    SweepModeEvent,
    TotalStatsEvent,
    TrueDetectEvent,
    VoiceAssistantStateEvent,
    VolumeEvent,
    WorkMode,
    WorkModeEvent,
    auto_empty,
    water_info,
)
from deebot_client.events.auto_empty import AutoEmptyEvent
from deebot_client.events.efficiency_mode import EfficiencyMode
from deebot_client.models import StaticDeviceInfo


def get_device_info() -&amp;gt; StaticDeviceInfo:
    """获取 DEEBOT X5 PRO OMNI 模型支持的所有静态设备信息与能力映射。"""
    return StaticDeviceInfo(
        DataType.JSON,  # 该机型通信采用 JSON 数据格式
        Capabilities(
            device_type=DeviceType.VACUUM,  # 设备类型：吸尘/扫地机器人
            
            # --- 基础状态能力 ---
            availability=CapabilityEvent(
                AvailabilityEvent, [GetBattery(is_available_check=True)]
            ),  # 可用性状态（通过检查电池状态来判断设备是否在线）
            battery=CapabilityEvent(BatteryEvent, [GetBattery()]),  # 电池电量状态
            charge=CapabilityExecute(Charge),  # 充电控制指令（回充）
            
            # --- 清扫控制能力 ---
            clean=CapabilityClean(
                action=CapabilityCleanAction(command=CleanV2, area=CleanAreaV2),  # 全局清扫与选区清扫
                continuous=CapabilitySetEnable(
                    ContinuousCleaningEvent,
                    [GetContinuousCleaning()],
                    SetContinuousCleaning,
                ),  # 断点续扫（获取/设置/事件）
                count=CapabilitySet(CleanCountEvent, [GetCleanCount()], SetCleanCount),  # 清扫次数（例如：清扫1次或2次）
                log=CapabilityEvent(CleanLogEvent, [GetCleanLogs()]),  # 清扫日志/历史记录
                preference=CapabilitySetEnable(
                    CleanPreferenceEvent, [GetCleanPreference()], SetCleanPreference
                ),  # 清扫偏好设置
                work_mode=CapabilitySetTypes(
                    event=WorkModeEvent,
                    get=[GetWorkMode()],
                    set=SetWorkMode,
                    types=(
                        WorkMode.MOP,               # 仅拖地
                        WorkMode.MOP_AFTER_VACUUM,  # 先吸后拖
                        WorkMode.VACUUM,            # 仅吸地
                        WorkMode.VACUUM_AND_MOP,    # 吸拖一体
                    ),
                ),  # 工作模式切换
            ),
            
            # --- 自定义指令与错误处理 ---
            custom=CapabilityCustomCommand(
                event=CustomCommandEvent, get=[], set=CustomCommand
            ),  # 透传/自定义底层指令能力
            error=CapabilityEvent(ErrorEvent, [GetError()]),  # 故障与报错事件
            
            # --- 风扇风速设置 ---
            fan_speed=CapabilitySetTypes(
                event=FanSpeedEvent,
                get=[GetFanSpeed()],
                set=SetFanSpeed,
                types=(
                    FanSpeedLevel.QUIET,     # 静音
                    FanSpeedLevel.NORMAL,    # 标准
                    FanSpeedLevel.MAX,       # 强效
                    FanSpeedLevel.MAX_PLUS,  # 超强
                ),
            ),
            
            # --- 耗材与维护生命周期 ---
            life_span=CapabilityLifeSpan(
                types=(
                    LifeSpan.BRUSH,              # 滚刷
                    LifeSpan.FILTER,             # 尘盒滤网
                    LifeSpan.HAND_FILTER,        # 手持/精细滤网
                    LifeSpan.SIDE_BRUSH,         # 边刷
                    LifeSpan.UNIT_CARE,          # 整机保养
                    LifeSpan.CLEANING_SOLUTION,  # 清洁液
                    LifeSpan.SEWAGE_BOX,         # 污水箱维护
                ),
                event=LifeSpanEvent,
                get=[
                    GetLifeSpan(
                        [
                            LifeSpan.BRUSH,
                            LifeSpan.FILTER,
                            LifeSpan.HAND_FILTER,
                            LifeSpan.SIDE_BRUSH,
                            LifeSpan.CLEANING_SOLUTION,
                            LifeSpan.SEWAGE_BOX,
                        ]
                    )
                ],
                reset=ResetLifeSpan,  # 重置耗材计时指令
            ),
            
            # --- 地图相关能力 ---
            map=CapabilityMap(
                cached_info=CapabilityEvent(CachedMapInfoEvent, [GetCachedMapInfo()]),  # 缓存的地图信息
                changed=CapabilityEvent(MapChangedEvent, []),  # 地图更新/改变事件
                info=CapabilityExecute(GetMapInfoV2),  # 获取地图基础详情
                major=CapabilitySet(MajorMapEvent, [GetMajorMap()], SetMajorMap),  # 主地图管理
                minor=CapabilityExecute(GetMinorMap),  # 次要/多楼层地图管理
                multi_state=CapabilitySetEnable(
                    MultimapStateEvent, [GetMultimapState()], SetMultimapState
                ),  # 多地图管理开关状态
                position=CapabilityEvent(PositionsEvent, [GetPos()]),  # 机器人在地图上的实时坐标位置
                relocation=CapabilityExecute(SetRelocationState),  # 重新定位指令
                rooms=CapabilityEvent(RoomsEvent, [GetCachedMapInfo()]),  # 地图中的房间/分区信息
                set=CapabilityExecute(GetMapSetV2),  # 地图配置设置
                trace=CapabilityEvent(MapTraceEvent, [GetMapTrace()]),  # 清扫轨迹/移动路径
            ),
            
            # --- 网络与声音 ---
            network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]),  # Wi-Fi 及网络状态信息
            play_sound=CapabilityExecute(PlaySound),  # 寻找地宝/播放提示音
            
            # --- 高级常规设置 (Settings) ---
            settings=CapabilitySettings(
                advanced_mode=CapabilitySetEnable(
                    AdvancedModeEvent, [GetAdvancedMode()], SetAdvancedMode
                ),  # 高级模式开关
                carpet_auto_fan_boost=CapabilitySetEnable(
                    CarpetAutoFanBoostEvent,
                    [GetCarpetAutoFanBoost()],
                    SetCarpetAutoFanBoost,
                ),  # 地毯自动增压吸力开关
                child_lock=CapabilitySetEnable(
                    ChildLockEvent, [GetChildLock()], SetChildLock
                ),  # 童锁开关
                efficiency_mode=CapabilitySetTypes(
                    event=EfficiencyModeEvent,
                    get=[GetEfficiencyMode()],
                    set=SetEfficiencyMode,
                    types=(
                        EfficiencyMode.ENERGY_EFFICIENT_MODE, # 节能模式
                        EfficiencyMode.STANDARD_MODE,         # 标准模式
                    ),
                ),  # 清扫效率/能耗模式
                ota=CapabilitySetEnable(OtaEvent, [GetOta()], SetOta),  # 固件在线升级状态与设置
                sweep_mode=CapabilitySetEnable(
                    SweepModeEvent, [GetSweepMode()], SetSweepMode
                ),  # 扫地模式设置
                true_detect=CapabilitySetEnable(
                    TrueDetectEvent, [GetTrueDetect()], SetTrueDetect
                ),  # TrueDetect 3D 结构光避障功能开关
                voice_assistant=CapabilitySetEnable(
                    VoiceAssistantStateEvent,
                    [GetVoiceAssistantState()],
                    SetVoiceAssistantState,
                ),  # YIKO 语音助手状态与开关
                volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume),  # 播报音量大小设置
            ),
            
            # --- 工作与基站状态监控 ---
            state=CapabilityEvent(StateEvent, [GetChargeState(), GetWorkState()]),  # 机器人的主状态（充电中/工作中）
            station=CapabilityStation(
                action=CapabilityExecuteTypes(
                    station_action.StationAction, types=(StationAction.EMPTY_DUSTBIN,)
                ),  # 控制基站执行动作（例如：手动控制集尘）
                auto_empty=CapabilitySetTypes(
                    event=AutoEmptyEvent,
                    get=[GetAutoEmpty()],
                    set=SetAutoEmpty,
                    types=(
                        auto_empty.Frequency.AUTO,  # 自动集尘
                        auto_empty.Frequency.SMART, # 智能集尘
                    ),
                ),  # 自动集尘频率设置
                state=CapabilityEvent(StationEvent, [GetWorkState()]),  # 全能基站自身的工作状态
            ),
            
            # --- 清扫统计数据 ---
            stats=CapabilityStats(
                clean=CapabilityEvent(StatsEvent, [GetStats()]),  # 当前/单次清扫统计（面积、时间）
                report=CapabilityEvent(ReportStatsEvent, []),  # 数据上报事件
                total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]),  # 历史累计清扫统计
            ),
            
            # --- 水箱与拖地模组控制 ---
            water=CapabilityWater(
                amount=CapabilitySetTypes(
                    event=water_info.WaterAmountEvent,
                    get=[GetWaterInfo()],
                    set=SetWaterInfo,
                    types=(
                        water_info.WaterAmount.LOW,    # 低水量
                        water_info.WaterAmount.MEDIUM, # 中水量
                        water_info.WaterAmount.HIGH,   # 高水量
                    ),
                ),  # 拖地出水量调节
                mop_attached=CapabilityEvent(
                    water_info.MopAttachedEvent, [GetWaterInfo()]
                ),  # 检测拖地支架/抹布是否已安装
            ),
        ),
    )&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="mcetoc_1jsmqgva57"&gt;为扫地机器人添加基站烘干能力（Mop Drying Capability）&lt;/h2&gt;
&lt;p&gt;要为这款扫地机器人添加基站烘干能力（Mop Drying Capability），我们需要遵循代码原有的声明式树形结构。首先要确定属于哪个分支节点 (Branch Nodes)。其次在这个分支节点下添加一项能力。&lt;/p&gt;
&lt;p&gt;具体到本例，烘干能力是在 station（基站）分支节点下，扩展一个新的叶子节点（能力）。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;先看官方的基站的能力源代码&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;@unique
class StationAction(IntEnum):
    """Enum class for all possible station actions."""

    EMPTY_DUSTBIN = 1
    DRY_MOP = 2
    CLEAN_BASE = 3
    WASH_MOP = 4&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;source code：https://github.com/DeebotUniverse/client.py/blob/2a7b432a036f8ec9b053d9b1a6399aecc3bfd24d/deebot_client/commands/__init__.py#L36&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;通过分析科沃斯底层的通用 JSON 协议结构，添加此功能通常需要以下 4 个步骤：&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;step 1. 修改步骤与核心代码&lt;/p&gt;
&lt;p&gt;1. 导入必要的控制指令与事件（假设命名）&lt;/p&gt;
&lt;p&gt;在文件顶部的 import 区域，需要引入负责获取/设置烘干状态的指令，以及对应的事件类和烘干状态枚举（具体类名需与你的 deebot_client 库底层保持一致，以下为标准命名示例）：&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;# 1. 导入烘干相关的 JSON 指令 (根据实际库路径调整)
from deebot_client.commands.json.drying import GetDryingState, SetDryingState

# 2. 导入烘干相关的事件与状态枚举
from deebot_client.events import DryingEvent
from deebot_client.events.drying import DryingState  # 通常包含：DRYING, STOPPED 等&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;step 2. 在 station 子树中挂载新能力&lt;/p&gt;
&lt;p&gt;找到 station=CapabilityStation(...) 所在的位置，我们看到已经有清空基站能力；&lt;/p&gt;
&lt;p&gt;我们需要做的，是在内部添加一个名为 drying（或 mop_drying）的叶子节点（能力）；&lt;/p&gt;
&lt;p&gt;这个能力使用 CapabilitySetTypes 或 CapabilitySetEnable 进行包装，代码需包括：属性对象（Capability）、发送指令（Commands）、接收事件（Events）三个部分。&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;station=CapabilityStation(
                action=CapabilityExecuteTypes(
                    station_action.StationAction, types=(StationAction.EMPTY_DUSTBIN,)
                ),
                auto_empty=CapabilitySetTypes(
                    event=AutoEmptyEvent,
                    get=[GetAutoEmpty()],
                    set=SetAutoEmpty,
                    types=(
                        auto_empty.Frequency.AUTO,
                        auto_empty.Frequency.SMART,
                    ),
                ),
                # ─── 新增：基站抹布烘干能力 ──────────────────────────────────
                drying=CapabilitySetTypes(
                    event=DryingEvent,               # 监听烘干状态变化的事件
                    get=[GetDryingState()],          # 初始化或主动获取烘干状态的指令
                    set=SetDryingState,              # 控制开启/关闭烘干的指令
                    types=(
                        DryingState.STOPPED,         # 停止烘干
                        DryingState.DRYING,          # 正在烘干
                        DryingState.RAPID_DRYING,    # 快速烘干（若硬件支持）
                    ),
                ),
                # ───────────────────────────────────────────────────────────
                state=CapabilityEvent(StationEvent, [GetWorkState()]),
            ),&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;step 3.结构变化对比&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;旧的station（基站）分支节点：                     新的station（基站）分支节点（添加烘干后）：
   [station]                         [station]
     ├── action                        ├── action
     ├── auto_empty                    ├── auto_empty
     └── state                         ├── drying ◄── [新加入的叶子节点]
                                       └── state&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;step 4.调用方式&lt;/p&gt;
&lt;p&gt;上层应用（如 Home Assistant 的实体组件）可以直接对基站烘干进行双向控制了：&lt;/p&gt;
&lt;p&gt;主动触发/停止烘干：&lt;/p&gt;
&lt;p&gt;device.capabilities.station.drying.set(DryingState.DRYING)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;前端 UI ：&lt;/p&gt;
&lt;p&gt;上层应用会自动读取 types 里的枚举，在 App 或智能家居面板上自动生成对应的&amp;ldquo;开始烘干 / 停止烘干&amp;rdquo;下拉菜单或开关。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;step 5.最终结果&lt;/p&gt;
&lt;p&gt;烘干拖布&lt;/p&gt;
&lt;p&gt;&lt;img src="/Posts/files/x5--pro-mqtt-ui4_639187900810954055.JPG" alt="x5--pro-mqtt-ui4.JPG" width="327" height="344" /&gt;&lt;/p&gt;
&lt;p&gt;基站自清洁&lt;/p&gt;
&lt;p&gt;&lt;img src="/Posts/files/x5--pro-mqtt-ui5_639187900811149611.JPG" alt="x5--pro-mqtt-ui5.JPG" width="347" height="380" /&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>http://www.msly.cn/blog/xiaomi-home-part4/</id>
    <title>小米中枢网关接入Home Assistant</title>
    <updated>2026-06-28T20:36:13Z</updated>
    <published>2026-06-28T20:18:37Z</published>
    <link href="http://www.msly.cn/blog/xiaomi-home-part4/" />
    <author>
      <name>test@example.com</name>
      <email>www.msly.cn</email>
    </author>
    <category term="mijia" />
    <content type="html">&lt;p&gt;Xiaomi official&amp;lsquo;s Xiaomi Home Integration for Home Assistant&lt;/p&gt;
&lt;p&gt;xiaomi home integration&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/XiaoMi/ha_xiaomi_home"&gt;https://github.com/XiaoMi/ha_xiaomi_home&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;小米中枢网关云端控制原理&lt;/h2&gt;
&lt;p&gt;小米智能家居云控制架构 - 设备通过小米云与Home Assistant的通信流程&lt;/p&gt;
&lt;p&gt;&lt;img src="/Posts/files/xiaomi-home-integration-1_639182747171603426.jpg" alt="xiaomi-home-integration-1.jpg" width="822" height="814" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;小米中枢网关本地控制原理&lt;/h2&gt;
&lt;p&gt;小米智能家居本地控制架构 - 通过小米中枢网关实现局域网内快速响应&lt;/p&gt;
&lt;p&gt;&lt;img src="/Posts/files/xiaomi-home-integration-3_639182747862166955.jpg" alt="xiaomi-home-integration-3.jpg" width="706" height="734" /&gt;、&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #222222; font-family: 'Open Sans', Ubuntu, 'Nimbus Sans L', Avenir, AvenirNext, 'Segoe UI', Helvetica, Arial, sans-serif; font-size: 19px;"&gt;xiaomi home integration&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;核心文件结构&lt;/p&gt;
&lt;p&gt;了解项目的核心模块有助于使用：&lt;/p&gt;
&lt;pre class="language-csharp"&gt;&lt;code&gt;miot/ - 核心代码目录
miot/miot_client.py - 用户登录管理
miot/miot_cloud.py - 云服务相关功能
miot/miot_spec.py - MIoT-Spec-V2解析
miot/miot_lan.py - 设备局域网控制&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content>
  </entry></feed>