<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>智能家居 on 搁浅St的blog</title>
        <link>https://blog.huirongis.me/categories/%E6%99%BA%E8%83%BD%E5%AE%B6%E5%B1%85/</link>
        <description>Recent content in 智能家居 on 搁浅St的blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-CN</language>
        <lastBuildDate>Sun, 08 Nov 2026 16:13:21 +0000</lastBuildDate><atom:link href="https://blog.huirongis.me/categories/%E6%99%BA%E8%83%BD%E5%AE%B6%E5%B1%85/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>xiaodu bridge 使用说明：把 Home Assistant 设备接进小度</title>
        <link>https://blog.huirongis.me/post/xiaodu-bridge-connect-home-assistant-devices/</link>
        <pubDate>Mon, 31 Aug 2026 23:40:00 +0800</pubDate>
        
        <guid>https://blog.huirongis.me/post/xiaodu-bridge-connect-home-assistant-devices/</guid>
        <description>&lt;p&gt;&lt;code&gt;xiaodu_bridge&lt;/code&gt; 是一个 Home Assistant 自定义集成。它把 HA 里已经接好的设备重新组织成 DuerOS 语义设备，再交给小度音箱和小度 App 发现、查询和控制。商店里的名字是 &lt;code&gt;xiaodu bridge&lt;/code&gt;，集成 domain 是 &lt;code&gt;xiaodu_bridge&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;它不是把 HA 实体一对一转成小度设备，而是有一个桥接层：一台浴霸可以把照明、取暖、换气等多个 HA 实体聚合成一台浴霸；一个房间也能从 HA 区域同步成小度房间分组。小度发来的控制请求先进入这个桥接层，再由它调用 HA 的实体服务。&lt;/p&gt;
&lt;p&gt;整体链路是：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TB
  subgraph home[&amp;#34;家里&amp;#34;]
    direction TB
    devices[&amp;#34;米家 / Zigbee / 蓝牙 / Matter&amp;#34;]
    ha[&amp;#34;Home Assistant&amp;lt;br/&amp;gt;实体 + 区域 + 能力&amp;#34;]
    bridge[&amp;#34;xiaodu bridge&amp;lt;br/&amp;gt;DuerOS 语义设备模型&amp;#34;]
    entry[&amp;#34;公网入口&amp;lt;br/&amp;gt;域名 / DDNS / NGINX&amp;#34;]
  end
  cloud[&amp;#34;小度云端&amp;#34;]
  speaker[&amp;#34;小度音箱&amp;#34;]
  app[&amp;#34;小度 App&amp;#34;]

  devices --&amp;gt;|&amp;#34;标准化实体&amp;#34;| ha
  ha --&amp;gt;|&amp;#34;选中设备&amp;#34;| bridge
  cloud --&amp;gt;|&amp;#34;OAuth / 控制请求&amp;#34;| entry
  entry --&amp;gt; bridge
  bridge --&amp;gt;|&amp;#34;发现 / 控制 / 查询&amp;#34;| ha
  bridge --&amp;gt;|&amp;#34;Change Report&amp;#34;| cloud
  cloud --&amp;gt; speaker
  cloud --&amp;gt; app
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;整套配置从 HA 侧往小度侧推，一次走完大致是：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
  a[&amp;#34;设备接进 HA&amp;lt;br/&amp;gt;改名字 / 分区域&amp;#34;]
  b[&amp;#34;安装 xiaodu bridge&amp;lt;br/&amp;gt;HACS 或手动&amp;#34;]
  c[&amp;#34;配置公网 HTTPS 入口&amp;lt;br/&amp;gt;DDNS + 证书 + 反向代理&amp;#34;]
  d[&amp;#34;小度后台创建智能家居技能&amp;#34;]
  e[&amp;#34;HA 里配置 Client / botId / Callback&amp;#34;]
  f[&amp;#34;选择暴露设备和能力&amp;lt;br/&amp;gt;开启 sync_areas&amp;#34;]
  g[&amp;#34;小度发现设备&amp;lt;br/&amp;gt;模拟测试 + 语音测试&amp;#34;]

  a --&amp;gt; b --&amp;gt; c --&amp;gt; d --&amp;gt; e --&amp;gt; f --&amp;gt; g
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;仓库地址：&lt;a class=&#34;link&#34; href=&#34;https://github.com/Jackroyal/xiaodu-bridge&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/Jackroyal/xiaodu-bridge&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;准备设备&#34;&gt;准备设备
&lt;/h1&gt;&lt;p&gt;装桥接之前，先把设备名字和房间理好。&lt;/p&gt;
&lt;p&gt;小度侧的设备名就是 HA 实体名，房间就是 HA 区域。&lt;code&gt;switch.switch_1&lt;/code&gt; 这种名字说不出来，小度也就没法控制了。改名字只做两件事：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1. 名字改成适合说话的：客厅吸顶灯、卧室空调、书房插座。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2. 房间分对：客厅就是客厅，卧室就是卧室。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;改名字最省事的位置是源头：小米的设备名和房间从米家 App 直接同步到 HA，HA 再同步给小度，一路下来不用重复修改，源头设置好后续链路可以自动同步。&lt;/p&gt;
&lt;p&gt;米家、蓝牙、美的空调 等设备都有各自的接入方式，Xiaomi Home、Sonoff、Midea Smart Home 这些集成我都在用，大家根据各自设备按需选择自己对应的集成，善用大模型或搜索。&lt;/p&gt;
&lt;h1 id=&#34;安装集成&#34;&gt;安装集成
&lt;/h1&gt;&lt;p&gt;要求 Home Assistant &lt;code&gt;2025.1.0&lt;/code&gt; 或更高版本。本文按 &lt;code&gt;xiaodu bridge&lt;/code&gt; v0.9.17 写。&lt;/p&gt;
&lt;h2 id=&#34;hacs-安装推荐&#34;&gt;HACS 安装（推荐）
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;xiaodu bridge&lt;/code&gt; 已经进了 HACS 默认商店，不用再加自定义仓库：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;HACS → Integrations，搜索 &lt;strong&gt;xiaodu bridge&lt;/strong&gt;，下载。&lt;/li&gt;
&lt;li&gt;重启 Home Assistant。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;HACS 下载只是把文件装到位。重启后还要去 &lt;strong&gt;设置 → 设备与服务 → 添加集成&lt;/strong&gt;，搜 &lt;code&gt;xiaodu bridge&lt;/code&gt; 添加一次——填 OAuth 凭证、botId、公网地址就在这一步。只下载不添加，集成不会生效。&lt;/p&gt;
&lt;h2 id=&#34;手动安装&#34;&gt;手动安装
&lt;/h2&gt;&lt;p&gt;不想用 HACS 就手动复制：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/Jackroyal/xiaodu-bridge.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp -R xiaodu-bridge/custom_components/xiaodu_bridge /config/custom_components/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;复制完检查路径，别多套一层：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;正确：/config/custom_components/xiaodu_bridge/manifest.json
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;错误：/config/custom_components/xiaodu_bridge/xiaodu_bridge/manifest.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;确认没套错后重启：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ha core restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;手动和 HACS 两条路到这里都只是「文件装好了」，最后一步是一样的：去 &lt;strong&gt;设置 → 设备与服务 → 添加集成&lt;/strong&gt;里搜 &lt;code&gt;xiaodu bridge&lt;/code&gt; 添加。&lt;/p&gt;
&lt;p&gt;添加完成后，集成列表里就能看到它：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.huirongis.me/images/xiaodu-bridge/ha-integrations.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;集成列表里的 Xiaodu Bridge&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;点进详情页，会看到版本号、一个「小度中枢」设备，以及右上角的齿轮（配置）和三个点（菜单）按钮（截图停在 0.9.13，之后的版本界面没变）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.huirongis.me/images/xiaodu-bridge/ha-xiaodu-detail.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Xiaodu Bridge 详情页&#34;
	
	
&gt;&lt;/p&gt;
&lt;h1 id=&#34;配置公网访问&#34;&gt;配置公网访问
&lt;/h1&gt;&lt;p&gt;正式接入时，小度云端会回调 &lt;code&gt;xiaodu bridge&lt;/code&gt; 提供的三个 HTTPS 接口（必须按这个填写，写死的path）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/api/xiaodu/oauth/authorize
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/api/xiaodu/oauth/token
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/api/xiaodu/service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;所以纯内网地址完成不了正式接入，小度云端必须能从外面访问到 HA 的这几个路径。推荐结构：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;小度云端
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  → 公网域名
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  → 路由器端口转发
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  → HAOS 反向代理
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  → HA Core 8123
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  → xiaodu bridge
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我家里是电信光纤，有公网 IPv4，主路由是华硕路由器。华硕自带 DDNS，但它内置的服务商里只有花生壳这类要实名的，我常用的 cloudflare / dnspod 都不在里面。&lt;/p&gt;
&lt;p&gt;所以我在局域网的软路由上装了 iStoreOS，用它来做域名解析更新：软路由是长期开机的，在上面跑一个 ddns 插件，公网 IP 一变就调 cloudflare / dnspod 的 API 把 A 记录改掉。华硕路由器该干嘛干嘛，DDNS 这件事交给软路由，和 HAOS 在哪台机器上没关系。&lt;/p&gt;
&lt;h2 id=&#34;1-确认真的有公网-ipv4&#34;&gt;1. 确认真的有公网 IPv4
&lt;/h2&gt;&lt;p&gt;路由器 WAN IP 和手机流量看到的出口 IP 一致才算数。WAN IP 是 &lt;code&gt;100.x.x.x&lt;/code&gt;、&lt;code&gt;10.x.x.x&lt;/code&gt;、&lt;code&gt;172.16.x.x&lt;/code&gt;、&lt;code&gt;192.168.x.x&lt;/code&gt; 这些，就是运营商套了一层，说明你没有公网ip，别折腾端口转发了。&lt;/p&gt;
&lt;h2 id=&#34;2-域名和-ddns&#34;&gt;2. 域名和 DDNS
&lt;/h2&gt;&lt;p&gt;先准备一个域名，比如 &lt;code&gt;ha.example.com&lt;/code&gt;，在你使用的域名解析后台（cloudflare/dnspod/aliyun之类的）加一条 A 记录指向公网 IP。IP 会变就配 DDNS，公网 IP 一变，域名跟着变。&lt;/p&gt;
&lt;p&gt;我用的是 ddns-go。在 iStoreOS 的应用商店里搜「ddns-go」装上，装完它会起一个 Web 配置页，浏览器打开 &lt;code&gt;软路由IP:9876&lt;/code&gt; 就能看到面板，填完配置它会以服务形式常驻，公网 IP 一变就自动更新解析。&lt;/p&gt;
&lt;p&gt;面板上要填的就几项：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;配置项&lt;/th&gt;
          &lt;th&gt;填什么&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;DNS服务商&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;顶部单选，支持阿里云 / DnsPod / Cloudflare / 华为云 等二十来家&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Token&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;对应服务商的 API 凭据（截图里 Cloudflare 就一个 Token 输入框，面板上还带生成令牌的指引链接）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;TTL&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;域名解析的缓存时间，默认「自动」即可；测试阶段可以设短一点，便于改动快速生效&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;域名&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;要更新的那条记录，比如 &lt;code&gt;ha.example.com&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;IP 获取方式&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;默认「通过接口获取」就行——软路由自己不持有公网 IP 时，靠本地网卡读不到真实出口地址，让它去外部接口查更准&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.huirongis.me/images/xiaodu-bridge/ddns-go-panel.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;ddns-go 配置面板：DNS 服务商单选、Token、TTL&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;配完在面板上点「测试」或等一个更新周期，然后在电脑上用 &lt;code&gt;nslookup ha.example.com&lt;/code&gt; 或 &lt;code&gt;dig&lt;/code&gt; 看一眼解析结果对不对。DNS 记录用“仅 DNS”模式。&lt;/p&gt;
&lt;p&gt;平常用多个服务商的话，面板顶部有「配置切换」，可以建多套配置（比如一套 cloudflare、一套 dnspod），点「添加」新建、切换下拉选择，互不影响。
大致的原理，其实就是起个脚本监听ip变化，如果发生变化则调用cloudflare或者dnspod等的api接口更新一下域名对应的ip，变更肯定会有一定延迟，但够用了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这里的 API Token 后面配证书还要用——HAOS 的 Let&amp;rsquo;s Encrypt add-on 走 DNS 校验，连的就是同一个 provider。&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;3-端口转发&#34;&gt;3. 端口转发
&lt;/h2&gt;&lt;p&gt;家宽对 80 和 443 的入站管控挺常见，可以用 &lt;code&gt;8443&lt;/code&gt; 这种非标端口：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;外部协议：TCP
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;外部端口：8443
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;内部目标：HAOS 主机 IP，例如 192.168.1.10
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;内部端口：443
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;里面的 443 给 HAOS 反向代理监听。HA 的 8123 端口不要直接暴露，公网统一走 HTTPS，由反向代理转 8123。&lt;/p&gt;
&lt;p&gt;为了安全起见不建议使用DMZ开放过多内容，使用端口转发只开放一个端口，相对更安全。&lt;/p&gt;
&lt;p&gt;华硕路由器自身远程控制用的是8443（使用华硕的子域名，我要使用自定义域名，所以不复用8443），所以我使用的是8663端口。&lt;/p&gt;
&lt;h2 id=&#34;4-证书和反向代理&#34;&gt;4. 证书和反向代理
&lt;/h2&gt;&lt;p&gt;HAOS 可以直接用 Let&amp;rsquo;s Encrypt 和 NGINX SSL proxy 这两个 add-on。跑 Docker / Core 或其他安装方式的，这两个 add-on 用不了，需要在宿主机或容器旁边准备等价方案（Caddy、NGINX 或带 DNS 模块的 Caddy）。&lt;/p&gt;
&lt;p&gt;HAOS 上这两个 add-on 的证书走 DNS 校验，不依赖 80 端口，证书目录和文件名默认就是配套的，装完不用手动挪证书。&lt;/p&gt;
&lt;p&gt;Cloudflare DNS 的例子：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;challenge&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;dns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;dns&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;provider&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;dns-cloudflare&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;cloudflare_api_token&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;&amp;lt;你的Cloudflare API Token&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;domains&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;ha.example.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;email&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;&amp;lt;你的邮箱&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;NGINX SSL proxy 只需要配域名和其他选项：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;domain&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ha.example.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;hsts&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;max-age=31536000; includeSubDomains&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;client_max_body_size_megabytes&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;cloudflare&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;反向代理只放行小度需要的那三个路径（前面列过），其他公网请求返回 404。&lt;/p&gt;
&lt;p&gt;别为了省事把整个 HA 管理页面开放到公网。&lt;/p&gt;
&lt;p&gt;然后到 HA 的 设置 → 系统 → 网络，外部地址填：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;https://ha.example.com:8443
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;外网请求返回 400、日志里出现 forwarded 或 trusted proxy 相关内容，多半是反向代理网段没进 &lt;code&gt;trusted_proxies&lt;/code&gt;。把 NGINX 所在网段加进去，并开启 &lt;code&gt;use_x_forwarded_for&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.huirongis.me/images/xiaodu-bridge/ha-network-trusted-proxy.webp&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;HA 网络设置：信任 X-Forwarded-For 与受信任的代理&#34;
	
	
&gt;&lt;/p&gt;
&lt;h1 id=&#34;在小度后台建技能&#34;&gt;在小度后台建技能
&lt;/h1&gt;&lt;p&gt;登录小度开发者平台，创建智能家居技能。技能的「配置服务」里要填的东西，来自两个地方：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;小度后台基础信息页：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  botId          技能 ID，后面要填回 HA 集成里
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HA 集成确认页给出的三个地址（这里用它们）：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  授权地址        Authorize，HA 公网地址 + /api/xiaodu/oauth/authorize
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Token地址       HA 公网地址 + /api/xiaodu/oauth/token
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  WebService      HA 公网地址 + /api/xiaodu/service
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;自己定义、两边配一致：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Client_Id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ClientSecret
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;假设公网地址是 &lt;code&gt;https://ha.example.com:8443&lt;/code&gt;，三个地址就是把上面的路径拼在它后面，比如 &lt;code&gt;https://ha.example.com:8443/api/xiaodu/oauth/authorize&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;后台「配置服务」页填起来就长这样（授权地址 / Client_Id / 回调地址 / Token 地址 / ClientSecret / WebService）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.huirongis.me/images/xiaodu-bridge/dueros-config-service.webp&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;小度后台配置服务：授权地址、Token 地址、WebService 的填法&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;授权和设备发现的过程是：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;sequenceDiagram
  autonumber
  participant U as 用户 / 浏览器
  participant D as 小度云端
  participant X as 公网入口 / xiaodu bridge
  participant H as Home Assistant

  U-&amp;gt;&amp;gt;D: 开始绑定账号
  D-&amp;gt;&amp;gt;U: 打开 Authorize URL
  U-&amp;gt;&amp;gt;X: 访问授权页并同意
  X--&amp;gt;&amp;gt;D: 返回到小度 Callback
  D-&amp;gt;&amp;gt;X: 请求 Token URL
  X--&amp;gt;&amp;gt;D: 下发私有 Access / Refresh Token
  D-&amp;gt;&amp;gt;X: 调用 WebService 发现设备
  X-&amp;gt;&amp;gt;H: 读取已选实体、区域和能力
  H--&amp;gt;&amp;gt;X: 返回实体状态
  X--&amp;gt;&amp;gt;D: 返回 DuerOS 语义设备
  D--&amp;gt;&amp;gt;U: 展示可控制设备
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;两个容易搞混的点：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1. Client_Id 和 ClientSecret 是自己定义的，不是百度分配的，两边配一致就行。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Secret 用长随机串，别用 123456 这种。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2. 回调地址不是你的 HA 地址，是小度平台生成的那个，填回 HA 集成里时要原样照抄。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;填写-oauth-配置&#34;&gt;填写 OAuth 配置
&lt;/h1&gt;&lt;p&gt;重启 HA 后打开：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;设置 → 设备与服务 → 添加集成 → xiaodu bridge
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;按下面填（界面是中文标签，括号里是它的含义）：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;界面字段&lt;/th&gt;
          &lt;th&gt;填什么&lt;/th&gt;
          &lt;th&gt;示例&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Client_Id&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;自定义客户端 ID&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;dueros_xxx&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ClientSecret&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;自定义随机密钥&lt;/td&gt;
          &lt;td&gt;一段长随机串&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;小度技能ID（botId）&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;小度后台技能 ID&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;12345678&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;回调地址&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;小度平台生成的地址，不可修改&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;https://xiaodu.baidu.com/...&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;公网访问地址（HTTPS）&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;HA 公网基础地址&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;https://ha.example.com:8443&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;保存后确认页会把授权地址、Token地址、WebService 三个地址直接列出来，照着填到小度后台就行，不用自己拼。&lt;code&gt;Client_Id&lt;/code&gt; / &lt;code&gt;ClientSecret&lt;/code&gt; 两边保持一致即可——它们是你自己定义的，不是百度分配的。&lt;/p&gt;
&lt;p&gt;回调地址不用操心调试环境：集成自动兼容小度的正式环境（&lt;code&gt;xiaodu.baidu.com&lt;/code&gt;）与调试环境（&lt;code&gt;xiaodu-dbp.baidu.com&lt;/code&gt;），后台只用填平台生成的那一个。&lt;/p&gt;
&lt;p&gt;填错了想改，打开集成条目右上角 &lt;code&gt;⋮&lt;/code&gt; →「重新配置」（OAuth 配置）就能重填，不用删掉集成。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.huirongis.me/images/xiaodu-bridge/ha-single-instance.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;OAuth 配置&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;OAuth token 这块集成自己管：Access Token 有效期 7 天，Refresh Token 30 天，到期用 refresh_token 续。这个 token 是桥接层自己的私有不透明串，只能打小度桥接的接口，碰不到 HA 的 API。&lt;/p&gt;
&lt;h1 id=&#34;选择要暴露给小度的设备&#34;&gt;选择要暴露给小度的设备
&lt;/h1&gt;&lt;p&gt;添加成功后，打开集成条目 →「配置」，进入「小度中枢」页：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.huirongis.me/images/xiaodu-bridge/ha-hub-menu.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;小度中枢：配置菜单&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;注意：从 v0.9.15 起，设备暴露改成按需选择。全新安装、或者从没保存过设备选项的实例，默认不会向小度发送任何设备，必须在这里选好并保存。&lt;/p&gt;
&lt;p&gt;建议别一次全选，先拿两三台练手：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;点「添加 / 移除设备」。&lt;/li&gt;
&lt;li&gt;选择要暴露的 HA 设备（列表按「房间 · 设备名」展示，重名的实体也能分清）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.huirongis.me/images/xiaodu-bridge/ha-device-select.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;添加 / 移除设备：设备按房间分组&#34;
	
	
&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;点进某台设备，先选「设备能力」勾选能力；需要时再进「高级配置」限制能力、隐藏实体、绑定语义角色或改小度侧的展示名。&lt;/li&gt;
&lt;li&gt;保存后让小度重新发现。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;已选设备可以在「已选设备」列表里逐台检查：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.huirongis.me/images/xiaodu-bridge/ha-device-selected.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;已选设备列表&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;设备默认暴露全部可用能力，想省事可以直接用默认；想精细控制再一台台进能力编辑。控制类设备的开关能力是强制的，温湿度这种只读能力按需勾。底部那个「同步 HA 房间到小度」开关打开后，HA 的区域会同步成小度的房间分组。&lt;/p&gt;
&lt;p&gt;暴露得越精准，后面误触发越少，不需要把 HA 里每个实体都丢给小度。&lt;/p&gt;
&lt;h1 id=&#34;测试&#34;&gt;测试
&lt;/h1&gt;&lt;p&gt;按这个顺序来：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;小度开发者后台触发设备发现。&lt;/li&gt;
&lt;li&gt;看设备有没有出现在小度侧。&lt;/li&gt;
&lt;li&gt;查询一个温湿度传感器。&lt;/li&gt;
&lt;li&gt;打开一个灯或插座，再关掉。&lt;/li&gt;
&lt;li&gt;手动动一下设备状态，看小度 App 是否同步。&lt;/li&gt;
&lt;li&gt;用音箱和 App 试真实语音。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;HAOS 上看日志：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ha core logs -f | grep --line-buffered &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Xiaodu access&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;成功的发现请求里能看到这样一段（实际是一行）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kind=dueros namespace=DuerOS.ConnectedHome.Discovery \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;name=DiscoverAppliancesRequest result=DiscoverAppliancesResponse status=200
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里连请求都没有，就别急着改 HA 配置，先查域名、端口转发、证书和反向代理。&lt;/p&gt;
&lt;p&gt;语音可以试这些：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;小度小度，打开客厅灯。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;小度小度，把卧室空调调到 26 度。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;小度小度，客厅温度是多少？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;小度小度，明天早上八点打开书房插座。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;几个值得说的特性&#34;&gt;几个值得说的特性
&lt;/h1&gt;&lt;p&gt;这几个特性单独拎出来说。&lt;/p&gt;
&lt;h2 id=&#34;主动状态上报&#34;&gt;主动状态上报
&lt;/h2&gt;&lt;p&gt;可控设备状态一变，集成会主动推 Change Report 给小度，小度 App 里的状态会跟着刷新。纯只读传感器不上报，这类本来也没有“被控制”的状态可推。小度云端偶尔会拒绝一次（开机那波最常见），集成会在 60 秒窗口后补发一次，不会无限重试。&lt;/p&gt;
&lt;h2 id=&#34;房间分组&#34;&gt;房间分组
&lt;/h2&gt;&lt;p&gt;HA 区域同步成小度房间分组后，“打开客厅的灯”这类指令小度能自己圈范围，不用每台设备都指名道姓。前提还是第一步：房间得分对。&lt;/p&gt;
&lt;h2 id=&#34;定时开关&#34;&gt;定时开关
&lt;/h2&gt;&lt;p&gt;支持小度侧的 timingTurnOn 和 timingTurnOff。定时信息存在 HA Storage 里，HA 重启后任务仍然保留。&lt;/p&gt;
&lt;h2 id=&#34;语义设备模型&#34;&gt;语义设备模型
&lt;/h2&gt;&lt;p&gt;这是桥接层最核心的设计。它不是把 HA 实体一对一递给小度，而是先在桥接层把设备组装成 DuerOS 语义设备：浴霸就是一台浴霸，照明取暖换气都在它身上；洗衣机、晾衣杆、扫地机同理。小度协议定义了六十多种设备类型，这个集成实现了常用的十几种：灯、开关、插座、空调、窗帘、风扇、传感器、媒体播放器，外加浴霸、晾衣杆、扫地机、洗衣机四个专用档案。&lt;/p&gt;
&lt;p&gt;晾衣杆的语义按小度的实际模型处理：开关控制的是照明，升降走上升 / 下降动作；没有灯实体的机型回退为控制杆子本身。&lt;/p&gt;
&lt;h1 id=&#34;常见排查&#34;&gt;常见排查
&lt;/h1&gt;&lt;h2 id=&#34;集成搜索不到&#34;&gt;集成搜索不到
&lt;/h2&gt;&lt;p&gt;先看目录有没有多套一层，再看 &lt;code&gt;manifest.json&lt;/code&gt; 是否存在，然后重启 HA。HACS 里搜不到的话，先把 HACS 更新到最新版并刷新商店列表；还是没有就改用手动安装。&lt;/p&gt;
&lt;h2 id=&#34;ha-里正常小度发现不到&#34;&gt;HA 里正常，小度发现不到
&lt;/h2&gt;&lt;p&gt;按顺序查：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1. 小度后台 WebService 地址对不对。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2. 地址里的端口有没有少。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3. 公网能不能访问 HA。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4. 反向代理有没有放行 /api/xiaodu。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5. HA 集成里有没有选中设备。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6. HA 日志里有没有 Xiaodu access。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果小度云端访问不到 HA，音箱和后台都会持续失败，先把公网链路查完。&lt;/p&gt;
&lt;p&gt;授权页打不开也是同一类问题，从外面测一下入口通不通：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -I https://ha.example.com:8443/api/xiaodu/service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;能拿到 HTTP 状态码说明入口至少通了；TLS 都失败的话，先解决证书、DNS 和端口转发。&lt;/p&gt;
&lt;h2 id=&#34;米家设备状态不准&#34;&gt;米家设备状态不准
&lt;/h2&gt;&lt;p&gt;问题多半不在桥接层。先回 Xiaomi Home 或米家集成里看：HA 页面能不能控制，状态会不会变，实体有没有被禁用。HA 侧不稳，桥接写得再好也没办法。&lt;/p&gt;
&lt;h2 id=&#34;控制失败但发现成功&#34;&gt;控制失败但发现成功
&lt;/h2&gt;&lt;p&gt;能力没勾全，或设备类型映射不对。空调要有温度、模式、风速这些能力；窗帘要有打开、关闭能力。回集成选项里改完，再让小度重新发现。&lt;/p&gt;
&lt;h2 id=&#34;状态不同步&#34;&gt;状态不同步
&lt;/h2&gt;&lt;p&gt;先确认这台设备是可控设备，只读传感器本来就不主动上报。再手动动一下设备，看日志里有没有状态推送的记录。&lt;/p&gt;
&lt;h1 id=&#34;最后&#34;&gt;最后
&lt;/h1&gt;&lt;p&gt;这套方案的核心是让 HA 当统一中间层。桥接层把 HA 设备按 DuerOS 的语义组装好交给小度，状态变化也主动往小度推。小度 App 能拿到较新的状态，浴霸这类多实体设备也能当成一台设备控制。&lt;/p&gt;
&lt;p&gt;设备命名和房间分好，语音体验会顺很多。先暴露少量设备测试，稳定后再慢慢加。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>xiaodu bridge 折腾记：把米家和其他 HA 设备接进小度</title>
        <link>https://blog.huirongis.me/post/ha-xiaodu-connect-home-assistant-devices/</link>
        <pubDate>Fri, 28 Aug 2026 01:00:00 +0800</pubDate>
        
        <guid>https://blog.huirongis.me/post/ha-xiaodu-connect-home-assistant-devices/</guid>
        <description>&lt;p&gt;最近在整理家里的设备，米家有一部分，Zigbee有一部分，空调、窗帘、传感器又散在不同集成里。Home Assistant这边倒是能统一看，自动化也好写，但小度这边一直不够听话：有些设备发现不了，有些能力不全，状态还经常对不上。&lt;/p&gt;
&lt;p&gt;后来我把 HA 当中间层来用，做了一个自定义集成 &lt;code&gt;xiaodu bridge&lt;/code&gt;（domain &lt;code&gt;xiaodu_bridge&lt;/code&gt;）。简单说，它把 HA 里的设备映射成 DuerOS 认识的设备，再交给小度发现和控制。这个集成早先叫 &lt;code&gt;ha-xiaodu&lt;/code&gt;，后来改名并换了仓库，下面统一用新名字。链路大概是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;米家 / Zigbee / 蓝牙 / Matter / 其他 HA 集成
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Home Assistant 实体和房间
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xiaodu bridge
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;小度云端
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;小度音箱 / 小度 App
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;xiaodu bridge&lt;/code&gt; 的仓库在这里：&lt;a class=&#34;link&#34; href=&#34;https://github.com/Jackroyal/xiaodu-bridge&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/Jackroyal/xiaodu-bridge&lt;/a&gt;，已经收录进 HACS 默认商店。&lt;/p&gt;
&lt;p&gt;我建议不要一上来就改小度配置，先把 HA 里的设备搞稳，再装桥接层，最后解决小度云端访问 HA 的问题。公网入口这篇用 DDNS 举例；内网穿透后面有空再补。&lt;/p&gt;
&lt;h1 id=&#34;第一步先把设备接进-ha&#34;&gt;第一步：先把设备接进 HA
&lt;/h1&gt;&lt;p&gt;这一步比后面所有配置都重要。&lt;code&gt;xiaodu bridge&lt;/code&gt; 暴露的是 HA 里已有的实体。如果 HA 里点不开、状态不动、实体名乱七八糟，小度那边只会更乱。&lt;/p&gt;
&lt;h2 id=&#34;接米家&#34;&gt;接米家
&lt;/h2&gt;&lt;p&gt;我这里用 HA 的 Xiaomi Home 集成接米家。流程不复杂：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在 HACS 里安装 Xiaomi Home。&lt;/li&gt;
&lt;li&gt;打开 &lt;strong&gt;设置 -&amp;gt; 设备与服务 -&amp;gt; 添加集成&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;搜索 Xiaomi Home，登录米家账号。&lt;/li&gt;
&lt;li&gt;选择家庭，等设备同步进来。&lt;/li&gt;
&lt;li&gt;先在 HA 页面里手动开几次灯、空调、插座，确认状态能变。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;接完别急着下一步，先在 HA 设备页里看一遍。Xiaomi Home 可以直接把米家里的设备名称和房间同步过来，所以大部分设备不用在 HA 里重新起名。要确认的主要是两件事：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1. 名字改成适合说话的。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   比如：客厅吸顶灯、卧室空调、书房插座。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2. 房间分配。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   客厅就是客厅，卧室就是卧室。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   后面开小度房间同步会省很多事。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果发现某个设备没带上米家名称，或者变成了 &lt;code&gt;switch.switch_1&lt;/code&gt; 这种不好念的名字，再回米家 App 里改名，或者直接在 HA 里调整。这种名字直接丢给小度，语音体验会很差。&lt;/p&gt;
&lt;h2 id=&#34;其他设备怎么接&#34;&gt;其他设备怎么接
&lt;/h2&gt;&lt;p&gt;Zigbee2MQTT、ZHA、Matter、品牌集成都行，关键是它们最后要变成 HA 能控制的标准实体。&lt;/p&gt;
&lt;p&gt;常见对应关系大概这样：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;light          -&amp;gt; 开关、亮度、色温、颜色
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;switch         -&amp;gt; 开关
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;climate        -&amp;gt; 空调开关、温度、模式、风速
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cover          -&amp;gt; 窗帘打开、关闭、位置
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fan            -&amp;gt; 风扇开关、风速、模式
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sensor         -&amp;gt; 温度、湿度
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vacuum         -&amp;gt; 扫地机启动、暂停、回充
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;media_player   -&amp;gt; 播放、暂停、音量
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;有些设备没有现成的小度能力，比如某个自定义场景或私有协议设备。能包装成 &lt;code&gt;switch&lt;/code&gt; 的，就先在 HA 里做成一个开关实体，再让小度控制这个开关。不能包装的，就别硬塞进去。&lt;/p&gt;
&lt;h1 id=&#34;安装-xiaodu-bridge&#34;&gt;安装 xiaodu bridge
&lt;/h1&gt;&lt;p&gt;装法有两种。用 HACS 方便一点，手动复制更适合调试。&lt;/p&gt;
&lt;h2 id=&#34;hacs-安装&#34;&gt;HACS 安装
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;xiaodu bridge&lt;/code&gt; 已经进了 HACS 默认商店，不用再加自定义仓库（本文按 v0.9.17 写）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;HACS → Integrations，搜索 &lt;strong&gt;xiaodu bridge&lt;/strong&gt;，下载。&lt;/li&gt;
&lt;li&gt;重启 HA。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;手动安装&#34;&gt;手动安装
&lt;/h2&gt;&lt;p&gt;先把仓库拉下来，然后把 &lt;code&gt;custom_components/xiaodu_bridge&lt;/code&gt; 整个目录复制到 HA 的 &lt;code&gt;custom_components&lt;/code&gt; 下面：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/Jackroyal/xiaodu-bridge.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp -R xiaodu-bridge/custom_components/xiaodu_bridge /config/custom_components/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用 HAOS 的 Terminal and SSH 时，也可以直接从电脑传：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scp -r custom_components/xiaodu_bridge root@192.168.1.10:/config/custom_components/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里面的 &lt;code&gt;192.168.1.10&lt;/code&gt; 是我举的例子，换成你自己的 HAOS 内网地址。&lt;/p&gt;
&lt;p&gt;复制完检查一下路径：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;正确：/config/custom_components/xiaodu_bridge/manifest.json
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;错误：/config/custom_components/xiaodu_bridge/xiaodu_bridge/manifest.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;多套一层是老问题。确认没套错后重启：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ha core restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;小度为什么必须能访问-ha&#34;&gt;小度为什么必须能访问 HA
&lt;/h1&gt;&lt;p&gt;正式接入时，DuerOS 云端会回调 &lt;code&gt;xiaodu bridge&lt;/code&gt; 提供的几个 HTTPS 接口：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/api/xiaodu/oauth/authorize
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/api/xiaodu/oauth/token
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/api/xiaodu/service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;所以纯内网地址不能完成正式接入。小度云端不是运行在你家局域网里的，它必须能从外面访问到你 HA 里的这些路径。&lt;/p&gt;
&lt;p&gt;我的结构是这样：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;小度云端
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -&amp;gt; 公网域名
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -&amp;gt; 路由器端口转发
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -&amp;gt; HAOS 反向代理
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -&amp;gt; HA Core 8123
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -&amp;gt; xiaodu bridge
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;用-ddns-暴露公网入口&#34;&gt;用 DDNS 暴露公网入口
&lt;/h1&gt;&lt;p&gt;我这次走的是「有公网 IPv4 + DDNS」的路线。它不是唯一方案，只是对我来说最直接。没有公网 IP 的话可以看内网穿透，这部分这篇先不写。&lt;/p&gt;
&lt;h2 id=&#34;1-确认真的有公网-ipv4&#34;&gt;1. 确认真的有公网 IPv4
&lt;/h2&gt;&lt;p&gt;去路由器看 WAN IP，再用手机流量查一下出口 IP。两边一致才算比较靠谱。&lt;/p&gt;
&lt;p&gt;如果路由器 WAN IP 是 &lt;code&gt;100.x.x.x&lt;/code&gt;、&lt;code&gt;10.x.x.x&lt;/code&gt;、&lt;code&gt;172.16.x.x&lt;/code&gt; 或者 &lt;code&gt;192.168.x.x&lt;/code&gt;，基本就是运营商侧又套了一层，不是能直接入站的公网 IP。这种就先别折腾端口转发了。&lt;/p&gt;
&lt;h2 id=&#34;2-配域名和-ddns&#34;&gt;2. 配域名和 DDNS
&lt;/h2&gt;&lt;p&gt;准备一个自己的域名，比如 &lt;code&gt;ha.example.com&lt;/code&gt;。DNS 里加一条 A 记录：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ha.example.com.    A    你的公网IP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;公网 IP 会变的话，就配 DDNS。路由器自带 DDNS、NAS 上的脚本、Cloudflare API 更新都可以，关键是 IP 变了以后域名要跟着变。&lt;/p&gt;
&lt;p&gt;测试阶段建议 DNS 用“仅 DNS”，别急着套 CDN，不然证书和回源问题会混在一起，排错会麻烦很多。&lt;/p&gt;
&lt;h2 id=&#34;3-端口转发&#34;&gt;3. 端口转发
&lt;/h2&gt;&lt;p&gt;国内家宽对 &lt;code&gt;80&lt;/code&gt; 和 &lt;code&gt;443&lt;/code&gt; 的入站管控挺常见，有的地区直接拦，有的时好时坏。所以我没把公网入口放在 &lt;code&gt;443&lt;/code&gt;，用的是 &lt;code&gt;8443&lt;/code&gt; 这种非标端口：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;外部协议：TCP
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;外部端口：8443
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;内部目标：HAOS 主机 IP，例如 192.168.1.10
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;内部端口：443
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;外面的 &lt;code&gt;8443&lt;/code&gt; 是给公网访问用的；里面的 &lt;code&gt;443&lt;/code&gt; 还是给 HAOS 反向代理监听。你的反向代理如果也能改成其他监听端口，也可以自己调整，但公网那一段尽量别用 &lt;code&gt;443&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;另外，不要把 HA 的 &lt;code&gt;8123&lt;/code&gt; 直接暴露出去。公网入口统一走 HTTPS，后面由反向代理转到 HA Core 的 &lt;code&gt;8123&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;4-证书和反向代理&#34;&gt;4. 证书和反向代理
&lt;/h2&gt;&lt;p&gt;HAOS 上可以用 Let&amp;rsquo;s Encrypt 和 NGINX SSL proxy。我用 DNS 校验，这样不依赖 80 端口。这两个 add-on 的证书目录和文件名默认就是配套的：Let&amp;rsquo;s Encrypt 签出来的证书放到 &lt;code&gt;/ssl&lt;/code&gt;，NGINX SSL proxy 默认也从 &lt;code&gt;/ssl&lt;/code&gt; 读同名文件。所以装完不需要手动挪证书，也不用改证书路径。&lt;/p&gt;
&lt;p&gt;Cloudflare DNS 的例子大概是这样：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;challenge&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;dns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;dns&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;provider&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;dns-cloudflare&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;cloudflare_api_token&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;&amp;lt;你的Cloudflare API Token&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;domains&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;ha.example.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;email&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;&amp;lt;你的邮箱&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;NGINX SSL proxy 只需要配域名和其他选项：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;domain&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ha.example.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;hsts&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;max-age=31536000; includeSubDomains&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;client_max_body_size_megabytes&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;cloudflare&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;为了少暴露东西，我建议反向代理只放行小度需要的路径，其他公网请求直接 404。至少要放行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/api/xiaodu
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/api/xiaodu/oauth/authorize
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/api/xiaodu/oauth/token
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/api/xiaodu/service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果 HA 里还有别的 OAuth 回调路径，再按需放行，不要为了省事把整个 HA 管理页面开放到公网。&lt;/p&gt;
&lt;p&gt;然后到 HA 的 &lt;strong&gt;设置 -&amp;gt; 系统 -&amp;gt; 网络&lt;/strong&gt; 里设置外部地址：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;https://ha.example.com:8443
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果外网请求返回 400，HA 日志里又出现 forwarded 或 trusted proxy 相关内容，多半是反向代理网段没进 &lt;code&gt;trusted_proxies&lt;/code&gt;。把 NGINX 所在网段加进去，并开启 &lt;code&gt;use_x_forwarded_for&lt;/code&gt;。&lt;/p&gt;
&lt;h1 id=&#34;在小度后台建技能&#34;&gt;在小度后台建技能
&lt;/h1&gt;&lt;p&gt;登录小度开发者平台，创建一个智能家居技能。这里会用到几样东西：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;botId                 小度后台基础信息里的技能 ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;回调地址               小度平台生成的回调地址
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Client_Id             自己定义
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ClientSecret          自己定义
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;授权地址               HA 里的授权地址
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Token地址              HA 里的 token 地址
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WebService            HA 里的小度服务地址
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;假设公网地址是 &lt;code&gt;https://ha.example.com:8443&lt;/code&gt;，那三个 HA 地址就是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;https://ha.example.com:8443/api/xiaodu/oauth/authorize
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;https://ha.example.com:8443/api/xiaodu/oauth/token
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;https://ha.example.com:8443/api/xiaodu/service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Client_Id&lt;/code&gt; 和 &lt;code&gt;ClientSecret&lt;/code&gt; 不是百度后台分配的，是自己定义，然后把两边配一致。Secret 别太短，别用 &lt;code&gt;123456&lt;/code&gt; 这种。&lt;/p&gt;
&lt;p&gt;还有一个容易搞反的地方：&lt;code&gt;回调地址&lt;/code&gt; 不是你的 HA 地址，而是小度平台生成出来的地址。它要填到 HA 集成里。&lt;/p&gt;
&lt;h1 id=&#34;在-ha-里配置-xiaodu-bridge&#34;&gt;在 HA 里配置 xiaodu bridge
&lt;/h1&gt;&lt;p&gt;重启 HA 后，打开：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;设置 -&amp;gt; 设备与服务 -&amp;gt; 添加集成 -&amp;gt; xiaodu bridge
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;按下面这些填：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;界面字段&lt;/th&gt;
          &lt;th&gt;填什么&lt;/th&gt;
          &lt;th&gt;示例&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Client_Id&lt;/td&gt;
          &lt;td&gt;自定义客户端 ID&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;dueros_xxx&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ClientSecret&lt;/td&gt;
          &lt;td&gt;自定义随机密钥&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;&amp;lt;长随机字符串&amp;gt;&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;小度技能ID（botId，控制台基础信息页可见）&lt;/td&gt;
          &lt;td&gt;小度后台技能 ID&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;12345678&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;回调地址（小度平台生成，不可修改）&lt;/td&gt;
          &lt;td&gt;小度平台生成的地址&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;https://xiaodu.baidu.com/...&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;公网访问地址（HTTPS）&lt;/td&gt;
          &lt;td&gt;HA 公网基础地址&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;https://ha.example.com:8443&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;保存后集成会把授权地址、Token地址、WebService 显示出来。再对照小度后台检查一遍，尤其是端口：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;https://ha.example.com:8443/...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用 &lt;code&gt;8443&lt;/code&gt; 后，所有相关地址都要带 &lt;code&gt;:8443&lt;/code&gt;。不能有些带端口，有些不带。&lt;/p&gt;
&lt;h1 id=&#34;选择要暴露给小度的设备&#34;&gt;选择要暴露给小度的设备
&lt;/h1&gt;&lt;p&gt;添加成功后，打开集成条目 →「配置」，会进入 &lt;strong&gt;小度中枢&lt;/strong&gt; 页。这里我建议别一次全选。&lt;/p&gt;
&lt;p&gt;注意：从 v0.9.15 起，设备暴露改成按需选择。全新安装、或者从没保存过设备选项的实例，默认不会向小度发送任何设备，必须在这里选好并保存。&lt;/p&gt;
&lt;p&gt;先拿两三台设备练手，比如客厅灯、卧室空调、一个插座。流程是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;点「添加 / 移除设备」。&lt;/li&gt;
&lt;li&gt;选择要暴露的 HA 设备，顺便决定要不要「同步 HA 房间到小度」。&lt;/li&gt;
&lt;li&gt;点进某个设备，先选「设备能力」勾选能力；需要时再进「高级配置」限制能力、隐藏实体、绑定语义角色或改小度侧的展示名。&lt;/li&gt;
&lt;li&gt;保存后让小度重新发现。&lt;/li&gt;
&lt;li&gt;用小度后台的模拟测试试一遍。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;能力大概可以这样理解：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;灯：开关、亮度、色温、颜色
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;插座：开关
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;空调：开关、目标温度、模式、风速
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;窗帘：打开、关闭、位置
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;传感器：温度、湿度
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;扫地机：启动、暂停、回充
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;开关能力始终启用，不能取消。温湿度这种只读能力按需勾。你不需要把 HA 里的每个实体都丢给小度，暴露得越精准，后面误触发越少。&lt;/p&gt;
&lt;h1 id=&#34;测试&#34;&gt;测试
&lt;/h1&gt;&lt;p&gt;我一般按这个顺序来：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;小度开发者后台触发设备发现。&lt;/li&gt;
&lt;li&gt;看设备有没有出现在小度侧。&lt;/li&gt;
&lt;li&gt;查询一个温湿度传感器。&lt;/li&gt;
&lt;li&gt;打开一个灯或插座。&lt;/li&gt;
&lt;li&gt;关掉它。&lt;/li&gt;
&lt;li&gt;再用音箱和 App 试试真实语音。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;HAOS 上可以看日志：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ha core logs -f | grep &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Xiaodu access&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;成功的发现请求会看到类似这样的内容：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kind=dueros
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;namespace=DuerOS.ConnectedHome.Discovery
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;name=DiscoverAppliancesRequest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;result=DiscoverAppliancesResponse
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;status=200
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果这里连请求都没有，就别急着改 HA 配置，先查域名、端口转发、证书和反向代理。&lt;/p&gt;
&lt;p&gt;语音可以试这些：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;小度小度，打开客厅灯。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;小度小度，把卧室空调调到 26 度。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;小度小度，关闭书房插座。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;小度小度，客厅温度是多少？
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;我踩到的坑&#34;&gt;我踩到的坑
&lt;/h1&gt;&lt;h2 id=&#34;集成搜索不到&#34;&gt;集成搜索不到
&lt;/h2&gt;&lt;p&gt;先看目录有没有多套一层：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;错误：/config/custom_components/xiaodu_bridge/xiaodu_bridge
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;正确：/config/custom_components/xiaodu_bridge
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再看 &lt;code&gt;manifest.json&lt;/code&gt; 是否存在，然后重启 HA。&lt;/p&gt;
&lt;h2 id=&#34;ha-里正常小度发现不到&#34;&gt;HA 里正常，小度发现不到
&lt;/h2&gt;&lt;p&gt;按顺序查：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1. 小度后台 WebService 地址对不对。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2. 地址里的端口有没有少。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3. 公网能不能访问 HA。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4. 反向代理有没有放行 /api/xiaodu。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5. HA 集成里有没有选中设备。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6. HA 日志里有没有 Xiaodu access。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;别只盯音箱。正式链路里，小度云端访问不到 HA，音箱喊破天也没用。&lt;/p&gt;
&lt;h2 id=&#34;米家设备状态不准&#34;&gt;米家设备状态不准
&lt;/h2&gt;&lt;p&gt;这时候问题多半不在 &lt;code&gt;xiaodu bridge&lt;/code&gt;。先回 Xiaomi Home 或米家集成里看：HA 页面能不能控制，状态会不会变，实体有没有被禁用。HA 侧不稳定，桥接层写得再好也没办法。&lt;/p&gt;
&lt;h2 id=&#34;授权页打不开&#34;&gt;授权页打不开
&lt;/h2&gt;&lt;p&gt;多半是公网入口没通。可以从外面测：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -I https://ha.example.com:8443/api/xiaodu/service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;能拿到 HTTP 状态码，说明入口至少通了。TLS 都失败的话，先解决证书、DNS 和端口转发。&lt;/p&gt;
&lt;h2 id=&#34;控制失败但发现成功&#34;&gt;控制失败但发现成功
&lt;/h2&gt;&lt;p&gt;这类多半是能力没勾全，或者设备类型映射得不对。比如空调要有温度、模式、风速这些能力；窗帘要有打开、关闭能力。回集成选项里改完，再让小度重新发现。&lt;/p&gt;
&lt;h1 id=&#34;安全上要注意&#34;&gt;安全上要注意
&lt;/h1&gt;&lt;p&gt;公网入口开了以后，就别图省事了：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1. 只转发需要的非标端口，比如 8443。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2. 不把 HA 管理页面对公网开放。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3. ClientSecret 用长随机串。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4. Cloudflare Token 只给必要权限。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;5. Token、私钥、真实 IP 别提交到 Git。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6. 定期更新 HA、Xiaomi Home、xiaodu bridge 和加载项。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;最后&#34;&gt;最后
&lt;/h1&gt;&lt;p&gt;这套东西的核心不是“米家转小度”，而是让 HA 当家里的统一中间层。米家、Zigbee、Matter、其他品牌集成都先进 HA，&lt;code&gt;xiaodu bridge&lt;/code&gt; 再把这些实体交给小度。&lt;/p&gt;
&lt;p&gt;设备命名和房间分好，后面语音体验会顺很多。先暴露少量设备测试，稳定后再慢慢加。&lt;/p&gt;
&lt;p&gt;这篇先记录到这，内网穿透那部分等后面补。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
