欢迎光临
我们一直在努力

【Hermes:实战场景】36、Hermes Agent + Home Assistant 集成全攻略:让 AI 替你控制全屋智能

在这里插入图片描述

Hermes Agent + Home Assistant 集成全攻略:让 AI 替你控制全屋智能

从长连接令牌到自然语言场景联动,手把手教你用 MCP 打通 Agent 与智能家居

前言:为什么你的 AI 助手不该只是“聊聊天”?

AI Agent 的边界正在被重新定义。

2026 年 2 月,Hermes Agent 在 GitHub 上悄然发布,截至 2026 年 4 月底,GitHub Star 已突破 10 万颗,仅用 48 天就从 0 增长到 97,000+ Stars。不到 53 天突破了 10 万大关,跻身全球最受关注的 AI 基础设施项目之列。

为什么它能在这么短的时间内引爆开发者社区?一个关键原因是:Hermes 不是又一个“聊天壳子”,它是一套 带 MCP 协议、跨会话记忆、自动技能沉淀和 cron 调度 的完整 Agent 运行时,能实实在在地介入真实世界的操作——其中最具代表性的能力,就是与 Home Assistant 的深度集成。

在所有的 AI 对话场景中,Home Assistant 可能是最接近“走出屏幕、进入物理世界”的集成目标。

通过 MCP(模型上下文协议),Hermes 可以像调用本地函数一样控制 Home Assistant 中的灯光、空调、窗帘、场景——你可以对它说“我准备写代码了”,它就能自动调暗灯光、播放 Lofi 音乐、关闭不必要的通知。这种体验超越了“智能音箱”式的单人指令,变成一套 场景驱动的全屋自动化系统。

一、两种集成方案:内置工具 vs MCP 服务器

Hermes Agent 为 Home Assistant 提供了两条同源的集成路径:

路径对比

对比维度Hermes 内置 HA 工具MCP Server 集成
实现方式 Hermes 原生支持,开箱即用 通过外部 MCP Server 接入
功能边界 基础设备控制 自动化创建、脚本调用、实体搜索、历史追踪等高级能力
配置复杂度 极低(仅需 Token + URL) 中等(需安装 MCP 服务器并配置)
扩展性 有限 高(支持社区扩展、自定义工具集)
适用场景 快速上手、轻量控制 深度集成、全功能管理
社区维护 Hermes 内置维护 由 Home Assistant 社区或第三方维护

两条路径的互操作核心至今完全相同——都需要通过 Home Assistant Long-Lived Access Token 进行认证,并通过 REST API 或 WebSocket 实现操作。Hermes 对哪条路径都支持 MCP,可连接任意 MCP server 扩展工具能力。因此,你可以根据实际需求自由切换两条路径,甚至同时使用,不必二选一。

二、基础集成步骤(两种路径通用)

不管选哪条路径,核心准备环节完全一致。

2.1 在 Home Assistant 中生成 Long-Lived Access Token

这是 AI 与 Home Assistant 之间建立信任的“钥匙”。

详细步骤:

  • 登录 Home Assistant 前端界面
  • 点击左下角用户头像 / 用户名,进入 Profile 页面
  • 向下滚动至 Long-Lived Access Tokens 区域
  • 点击 Create Token 按钮,输入名称如 Hermes-MCP-Token
  • 点击 Create,系统将生成一段一次性显示的长字符串
  • 立即复制保存,存入密码管理器——这是你获得该 Token 的唯一机会
  • 此时,系统会自动弹出一段 JSON 包含 Bearer Authentication 验证码。

    验证 Token 有效性的快速测试:

    curl -H "Authorization: Bearer YOUR_TOKEN_HERE" -H "Content-Type: application/json" http://localhost:8123/api/states

    正确返回 JSON 数据说明 Token 有效且 Home Assistant API 已就绪。

    2.2 在 Hermes 中配置 Token

    #mermaid-svg-EJXiVShXvS9z6PEH{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-EJXiVShXvS9z6PEH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-EJXiVShXvS9z6PEH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-EJXiVShXvS9z6PEH .error-icon{fill:#552222;}#mermaid-svg-EJXiVShXvS9z6PEH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EJXiVShXvS9z6PEH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-EJXiVShXvS9z6PEH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EJXiVShXvS9z6PEH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EJXiVShXvS9z6PEH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-EJXiVShXvS9z6PEH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EJXiVShXvS9z6PEH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EJXiVShXvS9z6PEH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EJXiVShXvS9z6PEH .marker.cross{stroke:#333333;}#mermaid-svg-EJXiVShXvS9z6PEH svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EJXiVShXvS9z6PEH p{margin:0;}#mermaid-svg-EJXiVShXvS9z6PEH .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-EJXiVShXvS9z6PEH .cluster-label text{fill:#333;}#mermaid-svg-EJXiVShXvS9z6PEH .cluster-label span{color:#333;}#mermaid-svg-EJXiVShXvS9z6PEH .cluster-label span p{background-color:transparent;}#mermaid-svg-EJXiVShXvS9z6PEH .label text,#mermaid-svg-EJXiVShXvS9z6PEH span{fill:#333;color:#333;}#mermaid-svg-EJXiVShXvS9z6PEH .node rect,#mermaid-svg-EJXiVShXvS9z6PEH .node circle,#mermaid-svg-EJXiVShXvS9z6PEH .node ellipse,#mermaid-svg-EJXiVShXvS9z6PEH .node polygon,#mermaid-svg-EJXiVShXvS9z6PEH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-EJXiVShXvS9z6PEH .rough-node .label text,#mermaid-svg-EJXiVShXvS9z6PEH .node .label text,#mermaid-svg-EJXiVShXvS9z6PEH .image-shape .label,#mermaid-svg-EJXiVShXvS9z6PEH .icon-shape .label{text-anchor:middle;}#mermaid-svg-EJXiVShXvS9z6PEH .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-EJXiVShXvS9z6PEH .rough-node .label,#mermaid-svg-EJXiVShXvS9z6PEH .node .label,#mermaid-svg-EJXiVShXvS9z6PEH .image-shape .label,#mermaid-svg-EJXiVShXvS9z6PEH .icon-shape .label{text-align:center;}#mermaid-svg-EJXiVShXvS9z6PEH .node.clickable{cursor:pointer;}#mermaid-svg-EJXiVShXvS9z6PEH .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-EJXiVShXvS9z6PEH .arrowheadPath{fill:#333333;}#mermaid-svg-EJXiVShXvS9z6PEH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-EJXiVShXvS9z6PEH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-EJXiVShXvS9z6PEH .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EJXiVShXvS9z6PEH .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-EJXiVShXvS9z6PEH .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EJXiVShXvS9z6PEH .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-EJXiVShXvS9z6PEH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-EJXiVShXvS9z6PEH .cluster text{fill:#333;}#mermaid-svg-EJXiVShXvS9z6PEH .cluster span{color:#333;}#mermaid-svg-EJXiVShXvS9z6PEH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-EJXiVShXvS9z6PEH .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-EJXiVShXvS9z6PEH rect.text{fill:none;stroke-width:0;}#mermaid-svg-EJXiVShXvS9z6PEH .icon-shape,#mermaid-svg-EJXiVShXvS9z6PEH .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EJXiVShXvS9z6PEH .icon-shape p,#mermaid-svg-EJXiVShXvS9z6PEH .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-EJXiVShXvS9z6PEH .icon-shape .label rect,#mermaid-svg-EJXiVShXvS9z6PEH .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EJXiVShXvS9z6PEH .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-EJXiVShXvS9z6PEH .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-EJXiVShXvS9z6PEH :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    验证连通

    Hermes 侧

    Home Assistant 侧

    生成 Long-Lived Access Token

    配置 REST API

    写入 ~/.hermes/.env

    写入 config.yaml 环境变量或 mcp_servers 配置

    hermes restart

    测试工具调用

    2.3 路径 A:通过 Hermes 内置 Home Assistant 工具(轻量方案)

    Hermes Agent 自带 homeassistant 工具集,包含 ha_call_service(调用 Service)、ha_get_entity_state(查询实体状态)、ha_list_entities(列出实体)等功能。

    只需在 ~/.hermes/.env 中配置:

    # ~/.hermes/.env
    HOME_ASSISTANT_TOKEN=your_long_lived_token_here

    然后在 ~/.hermes/config.yaml 中启用:

    tools:
    homeassistant:
    base_url: "http://192.168.1.10:8123" # 替换为你的 HA 实例地址
    token: ${env:HOME_ASSISTANT_TOKEN}

    保存后重启 Hermes:

    hermes restart

    验证配置是否生效:

    hermes tools | grep ha_

    应当能看到 ha_call_service、ha_get_entity_state、ha_list_entities 等工具名称。

    配置完成后即可在自然语言对话中直接调用:

    hermes chat
    > 列出 home assistant 中的所有灯光实体

    2.4 路径 B:通过 MCP Server 集成(增强方案)

    如果希望获得更丰富的操作能力——例如读写 YAML 配置、批量查询历史数据——推荐通过 MCP Server 集成。

    社区最活跃的 MCP Server 实现之一是 ha-mcp(来自 Home Assistant 社区官方推荐)。步骤如下:

    Step 1 – 配置 MCP Server 在 ~/.hermes/config.yaml 中添加 mcp_servers 条目:

    mcp_servers:
    homeassistant:
    command: "npx"
    args: ["-y", "ha-mcp"]
    env:
    HA_MCP_TOKEN: ${env:HOME_ASSISTANT_TOKEN}
    HA_MCP_URL: "http://homeassistant.local:8123"

    Step 2 – 自动发现与工具注入 Hermes 启动时自动完成三件事:建立连接 → 发现工具 → 注册工具。无需写任何胶水代码,Hermes 就能识别 MCP Server 暴露的所有 Tools,并将它们附上注册表,Agent 可直接调用。

    Step 3 – 验证集成

    hermes restart
    hermes tools | grep mcp

    检查输出中是否包含类似 mcp_homeassistant 的动态工具集名称。

    三、可用的工具与操作指令(详细清单)

    一旦集成完成,Hermes 可以根据 MCP Server 实现级别的差异,获得下面两种能力:

    核心工具列表(基于 ha-mcp 实现)

    工具名称功能描述参数示例
    get_states 查询当前所有实体状态 domain=“light”, limit=50
    get_state 获取特定实体的详细信息 entity_id=“light.living_room”
    call_service 调用 Home Assistant 服务 domain=“light”, service=“turn_on”, entity_id=…
    fire_event 触发自定义事件 event_type=“my_custom_event”
    list_entities 按条件列出所有实体 q=“temperature”, limit=10
    list_services 列出可用的服务类型 domain=“climate”

    高级能力(通过 enhanced-homeassistant-mcp 实现)

    工具/能力功能描述
    automation control 启用、禁用或手动触发自动化规则
    scene activation 激活 Home Assistant 中的场景(如“电影模式”)
    script execution 执行预定义的脚本序列
    history & logbook 查询实体历史状态变化与日志记录
    device discovery 按设备类、域条件筛选全部设备
    system administration 查看系统健康状态、重启 HA 服务

    capability matrix(能力差异图):

    #mermaid-svg-UpERLSLATIsrROnX{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-UpERLSLATIsrROnX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-UpERLSLATIsrROnX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-UpERLSLATIsrROnX .error-icon{fill:#552222;}#mermaid-svg-UpERLSLATIsrROnX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UpERLSLATIsrROnX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-UpERLSLATIsrROnX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UpERLSLATIsrROnX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UpERLSLATIsrROnX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-UpERLSLATIsrROnX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UpERLSLATIsrROnX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UpERLSLATIsrROnX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UpERLSLATIsrROnX .marker.cross{stroke:#333333;}#mermaid-svg-UpERLSLATIsrROnX svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UpERLSLATIsrROnX p{margin:0;}#mermaid-svg-UpERLSLATIsrROnX .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-UpERLSLATIsrROnX .cluster-label text{fill:#333;}#mermaid-svg-UpERLSLATIsrROnX .cluster-label span{color:#333;}#mermaid-svg-UpERLSLATIsrROnX .cluster-label span p{background-color:transparent;}#mermaid-svg-UpERLSLATIsrROnX .label text,#mermaid-svg-UpERLSLATIsrROnX span{fill:#333;color:#333;}#mermaid-svg-UpERLSLATIsrROnX .node rect,#mermaid-svg-UpERLSLATIsrROnX .node circle,#mermaid-svg-UpERLSLATIsrROnX .node ellipse,#mermaid-svg-UpERLSLATIsrROnX .node polygon,#mermaid-svg-UpERLSLATIsrROnX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-UpERLSLATIsrROnX .rough-node .label text,#mermaid-svg-UpERLSLATIsrROnX .node .label text,#mermaid-svg-UpERLSLATIsrROnX .image-shape .label,#mermaid-svg-UpERLSLATIsrROnX .icon-shape .label{text-anchor:middle;}#mermaid-svg-UpERLSLATIsrROnX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-UpERLSLATIsrROnX .rough-node .label,#mermaid-svg-UpERLSLATIsrROnX .node .label,#mermaid-svg-UpERLSLATIsrROnX .image-shape .label,#mermaid-svg-UpERLSLATIsrROnX .icon-shape .label{text-align:center;}#mermaid-svg-UpERLSLATIsrROnX .node.clickable{cursor:pointer;}#mermaid-svg-UpERLSLATIsrROnX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-UpERLSLATIsrROnX .arrowheadPath{fill:#333333;}#mermaid-svg-UpERLSLATIsrROnX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-UpERLSLATIsrROnX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-UpERLSLATIsrROnX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UpERLSLATIsrROnX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-UpERLSLATIsrROnX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UpERLSLATIsrROnX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-UpERLSLATIsrROnX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-UpERLSLATIsrROnX .cluster text{fill:#333;}#mermaid-svg-UpERLSLATIsrROnX .cluster span{color:#333;}#mermaid-svg-UpERLSLATIsrROnX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-UpERLSLATIsrROnX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-UpERLSLATIsrROnX rect.text{fill:none;stroke-width:0;}#mermaid-svg-UpERLSLATIsrROnX .icon-shape,#mermaid-svg-UpERLSLATIsrROnX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UpERLSLATIsrROnX .icon-shape p,#mermaid-svg-UpERLSLATIsrROnX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-UpERLSLATIsrROnX .icon-shape .label rect,#mermaid-svg-UpERLSLATIsrROnX .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UpERLSLATIsrROnX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-UpERLSLATIsrROnX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-UpERLSLATIsrROnX :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    enhanced MCP

    标准 ha-mcp

    扩展

    扩展

    扩展

    get_states

    call_service

    fire_event

    list_entities

    automation control

    history tracking

    template rendering

    supervisor management

    实际操作示例:

    hermes chat
    > 打开客厅的台灯,亮度调节到 50%
    > 把客厅灯的色温调到 4000K
    > 列出所有温度传感器,按温度值从高到低排序
    > 查询客厅灯在过去 24 小时的历史状态,绘制成文本摘要

    四、Skill 实战:创建“编码氛围”自动化场景

    Skill 是 Hermes 的“职业记忆”。通过 Skill,我们可以将“写代码时的理想环境”固化为一条可重复使用的知识模块,每次你开始工作时就自动“一键执行”。

    4.1 设计目标

    启动“编码氛围”时,自动执行:

    • 🔦 调暗书房灯光至 40% 亮度
    • 🎵 混放 Lofi / 氛围音乐
    • 📴 关闭不必要的智能设备(非必要)
    • ☕(可选)如果时间合适,自动启用电热水壶

    4.2 Skill 文件结构

    Hermes 的 Skill 按 agentskills.io 标准的 Markdown 格式编写:


    name: coding-ambience
    description: 当开始编程工作时,自动调节书房灯光、播放环境音乐并关闭非必要设备
    license: MIT
    allowed-tools: ha_call_service, ha_get_entity_state, send_message

    # 编码环境自动配置

    ## 触发条件
    用户发送指令包含“编码氛围”、“开始编程”、“写代码了”。

    ## 执行步骤
    1. 检查当前环境:
    – 使用 ha_get_entity_state 获取 light.study_ceiling 状态
    2. 调暗灯光:
    – 调用 ha_call_service
    – domain: light
    – service: turn_on
    – entity_id: light.study_ceiling
    – service_data: { "brightness": 102, "color_temp": 4000, "transition": 3 }
    3. 启动音乐:
    – 调用 ha_call_service
    – domain: media_player
    – service: play_media
    – entity_id: media_player.study_speaker
    – service_data: { "media_content_id": "https://open.spotify.com/playlist/xxxx", "media_content_type": "playlist" }
    4. 发送通知:
    – 调用 send_message 告知“书房氛围已准备好”

    ## 错误处理
    – 如灯光无响应,跳过并记录日志
    – 如媒体播放失败,通过 send_message 发送告警

    4.3 安装技能

    # 创建技能目录
    mkdir -p ~/.hermes/skills

    # 创建技能文件
    nano ~/.hermes/skills/coding-ambience.md
    # 粘贴上面的模板内容,保存

    # 验证技能可用性
    hermes skills list

    最终,手动执行技能:

    hermes skills run coding-ambience

    4.4 技能自动生成:让 Hermes 为你提供“现场教学”

    Hermes 本身的 built-in learning loop 会自动生成技能——如果你让它完成一个复杂任务(比如配置灯光 + 音乐 + 定时),Hermes 会将这套成功经验自动打包成新的 SKILL.md 文件。

    这相当于手把手教一次,就拥有了“数字肌肉记忆”。

    五、安全考虑:限制设备范围与访问控制

    将 AI Agent 接入 Home Assistant 需要注意一个核心原则:可控且最小化。具体来说,有四个关键策略:

    5.1 最小权限 Token

    为 Hermes Agent 单独生成一个 Long-Lived Access Token,尽量避免使用全局或 Admin 级别的 Token,不要为每个 MCP server 重用同一个主账号的 universal token。

    5.2 Home Assistant 端:限制实体暴露范围

    如果使用 HA MCP Server Integration(官方推荐) ,在 Settings → Devices & Services → Model Context Protocol Server 的配置选项中,可以针对每个集成筛选具体暴露给 Agent 访问的实体和服务——只勾选灯光、音响等操作必需的 entity,而不暴露门锁、摄头这类敏感设备。这个细粒度的暴露控制是 Home Assistant 官方对 MCP 访问的核心安全防线。

    5.3 使用 tools.include 白名单限制

    在 Hermes 配置文件或 per-server 层面,通过 tools.include 白名单限制 Agent 能够调用的 MCP 工具。例如只暴露灯光和媒体操作,而不暴露自动化创建等高危工具。

    5.4 控制在主要网络且启用认证

    推荐 Home Assistant 实例与 Hermes Agent 运行在同一安全的内网环境中,实现零信任访问控制。如果必须暴露至外网,务必通过反向代理 + TLS + 强认证实现完整分层防护。

    安全防护架构示意:

    #mermaid-svg-RWfjJsiZtEzIfh36{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-RWfjJsiZtEzIfh36 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-RWfjJsiZtEzIfh36 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-RWfjJsiZtEzIfh36 .error-icon{fill:#552222;}#mermaid-svg-RWfjJsiZtEzIfh36 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-RWfjJsiZtEzIfh36 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-RWfjJsiZtEzIfh36 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-RWfjJsiZtEzIfh36 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-RWfjJsiZtEzIfh36 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-RWfjJsiZtEzIfh36 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-RWfjJsiZtEzIfh36 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-RWfjJsiZtEzIfh36 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-RWfjJsiZtEzIfh36 .marker.cross{stroke:#333333;}#mermaid-svg-RWfjJsiZtEzIfh36 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-RWfjJsiZtEzIfh36 p{margin:0;}#mermaid-svg-RWfjJsiZtEzIfh36 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-RWfjJsiZtEzIfh36 .cluster-label text{fill:#333;}#mermaid-svg-RWfjJsiZtEzIfh36 .cluster-label span{color:#333;}#mermaid-svg-RWfjJsiZtEzIfh36 .cluster-label span p{background-color:transparent;}#mermaid-svg-RWfjJsiZtEzIfh36 .label text,#mermaid-svg-RWfjJsiZtEzIfh36 span{fill:#333;color:#333;}#mermaid-svg-RWfjJsiZtEzIfh36 .node rect,#mermaid-svg-RWfjJsiZtEzIfh36 .node circle,#mermaid-svg-RWfjJsiZtEzIfh36 .node ellipse,#mermaid-svg-RWfjJsiZtEzIfh36 .node polygon,#mermaid-svg-RWfjJsiZtEzIfh36 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-RWfjJsiZtEzIfh36 .rough-node .label text,#mermaid-svg-RWfjJsiZtEzIfh36 .node .label text,#mermaid-svg-RWfjJsiZtEzIfh36 .image-shape .label,#mermaid-svg-RWfjJsiZtEzIfh36 .icon-shape .label{text-anchor:middle;}#mermaid-svg-RWfjJsiZtEzIfh36 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-RWfjJsiZtEzIfh36 .rough-node .label,#mermaid-svg-RWfjJsiZtEzIfh36 .node .label,#mermaid-svg-RWfjJsiZtEzIfh36 .image-shape .label,#mermaid-svg-RWfjJsiZtEzIfh36 .icon-shape .label{text-align:center;}#mermaid-svg-RWfjJsiZtEzIfh36 .node.clickable{cursor:pointer;}#mermaid-svg-RWfjJsiZtEzIfh36 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-RWfjJsiZtEzIfh36 .arrowheadPath{fill:#333333;}#mermaid-svg-RWfjJsiZtEzIfh36 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-RWfjJsiZtEzIfh36 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-RWfjJsiZtEzIfh36 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RWfjJsiZtEzIfh36 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-RWfjJsiZtEzIfh36 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RWfjJsiZtEzIfh36 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-RWfjJsiZtEzIfh36 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-RWfjJsiZtEzIfh36 .cluster text{fill:#333;}#mermaid-svg-RWfjJsiZtEzIfh36 .cluster span{color:#333;}#mermaid-svg-RWfjJsiZtEzIfh36 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-RWfjJsiZtEzIfh36 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-RWfjJsiZtEzIfh36 rect.text{fill:none;stroke-width:0;}#mermaid-svg-RWfjJsiZtEzIfh36 .icon-shape,#mermaid-svg-RWfjJsiZtEzIfh36 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RWfjJsiZtEzIfh36 .icon-shape p,#mermaid-svg-RWfjJsiZtEzIfh36 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-RWfjJsiZtEzIfh36 .icon-shape .label rect,#mermaid-svg-RWfjJsiZtEzIfh36 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RWfjJsiZtEzIfh36 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-RWfjJsiZtEzIfh36 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-RWfjJsiZtEzIfh36 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    公网访问层

    内网隔离区

    禁止访问

    TLS

    Hermes AgentServer

    Home Assistant核心实例

    受限实体集light/media/cover

    敏感实体lock/camera/bulb

    Cloudflare / Reverse Proxy

    远程用户

    六、扩展:定时任务 + 消息推送

    Cron 调度与 Gateway 消息推送是 Hermes 自动化走向“主动式场景”的两个核心组件。

    6.1 创建定时自动化

    # 晚上 23:00 自动夜间模式
    hermes cron add "0 23 * * *" "调用 ha_call_service:打开夜灯 light.night_light,关闭客厅电视"

    # 早上 8:00 自动开启工作时灯光
    hermes cron add "0 8 * * *" "启动早晨模式,灯光调至 80%,播放晨间播客"

    6.2 跨渠道推送提示

    Gateway 可以将 Home Assistant 中的动态(例如电量传感器报警、门窗打开事件)主动推送到 Telegram、飞书、企业微信、Slack 等 15+ 平台。

    # ~/.hermes/config.yaml
    gateway:
    platforms:
    telegram:
    bot_token: ${env:TELEGRAM_BOT_TOKEN}
    home_channel: -1001234567890
    feishu:
    app_id: ${env:FEISHU_APP_ID}
    home_channel: "your_group_id"

    hermes cron add "0 9 * * 1" "获取 home assistant 所有电量的传感器,推送到团队群,提示即将需要更换电池的设备"

    6.3 关于日程稳定性的重要提示

    Hermes 内置 /cron 自然语言命令当前存在一定的执行稳定性误问题,尤其不适用于按分钟级或秒级的高精度监控。对于长期固定日程,推荐使用 系统 crontab 或 systemd timer 触发 Hermes CLI 脚本来执行,这能显著提升纯生产环境的可靠性。

    七、高级场景:Hermes 作为语音对话的“大脑”补充

    你问:Google Assistant、Siri 或 Alexa 已经能控制 Home Assistant 里的设备了,为什么还要用 Hermes?因为三者存在根本的角色分工:

    能力维度智能音箱(Siri/Alexa/Google)Hermes Agent + MCP
    核心交互 点对点语音控制 场景化 + 桌面 + 多模态对话
    环境感知 依赖单一 trigger word 定时监控、技能调用、需学习用户行为
    复杂自动化能力 有限(需人工编辑脚本) 高,Agent 可自主执行 multi-step 技能
    信息记录 不保留长期记忆 三层记忆体系跨会话保留偏好
    审批决策 不具备 支持“子Agent 委派 + 冲突仲裁”
    离线运行 通常受云依赖限制 可以在本地完全离线部署

    实际应用价值:当你想一次性执行“灯光 + 音量 + 定时任务 + 发消息”的全链自动化,语音助手的传统指令(“嘿 Siri,打开书房灯”)力不从心;而 Hermes + MCP 可以通过自然语言一句话驱动多个步骤,通过外部智能调度实现更稳定、更私密的端到端控制。

    此外,Hermes 的三层记忆体系让跨会话的场景记忆更自然。例如,你可以在 USER.md 中记录“书房灯光偏暖 4000K”,那么在“编码氛围”Skill 中,Agent 会自动沿用该项偏好,无需每次手动指定。

    八、常见问题排查

    #报错现象可能原因解决方法
    1 401 Unauthorized Token 无效或过期 在 HA 中重新生成长期访问令牌,更新至 Hermes 配置
    2 404 Not Found Home Assistant URL 不正确 或 API 未启用 检查 config.yaml 中的 base_url,确认 port 8123 且 http: config 已正确设置
    3 Request Timeout MCP Server 响应超时 提升 config.yaml 中 timeout 设定(默认可调至 180 秒以上)
    4 Entity not found 实体名称 misspelled 先用 ha_list_entities 或 list_entities 扫描全集 entity_id,确认名称精确匹配
    5 MCP 服务启动后立即退出 运行环境配置问题,Hermes 找不到命令路径 通过 which npx 判断命令行是否存在;采用 hermes doctor 详细调试
    6 连接建立但无法调用工具 暴露实体未按要求筛选 在 Home Assistant MCP Server Integration 的配置选项中启用额外服务/实体

    多试错几个轮次后再回顾:仅同时启用一个 MCP server 测试连通性,仅当它运行稳定并完整测试所有预期工具后,再添加其他 servers。

    九、总结:Hermes Agent + Home Assistant = 永不休息的智能管家

    Hermes 赋能 Home Assistant 的四大优势说明
    🎯 自然语言全场景触发 通过 MCP 将自然语言转化为完全的设备操作
    📌 跨平台消息推送 Telegram、飞书、Slack 15+ 渠道自动通知,无额外 App 对设备产生绑定
    🔄 Skill 固化的长期记忆 只教一次“coding-ambience”,以后就能自动触发那一整套灯光与音乐配置
    ⏰ 定时 + 触发 Cron 调度 + Gateway 将 HA 变成智能中枢

    从“Hey Siri, turn on the light” 到 “Hermes,我要开始 coding 了”,之间不是一个空洞的营销口号,而是 Hermes Agent 通过从内置 Home Assistant 工具与动态 MCP Server 双重集成实现的完整物联闭环。它在端到端打通了自然语言 → LLM 推理 → Service Call → 设备执行 → 渠道推送的全链路。

    无论你是想要一个用 AI 调节情绪环境的开发者,还是想批量改造全屋逻辑的极客,Hermes 方案都值得一试。它的学习成本很低、安全性可控、自进化的技能会内化成坚不可摧的智能家居新基建。

    🔗 参考文献与延伸阅读

    • Hermes Agent GitHub 官方仓库
    • Home Assistant MCP Server Integration 官方文档
    • ha-mcp (Python) – PyPI 主页
    • enhanced-homeassistant-mcp – NPM 包
    • agentskills.io 开放标准指南

    本文作者:[RickyIT] 原创不易,欢迎点赞、收藏、转发

    赞(0)
    未经允许不得转载:171主机测评 » 【Hermes:实战场景】36、Hermes Agent + Home Assistant 集成全攻略:让 AI 替你控制全屋智能
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址