目录

Home Assistant Core:开源智能家居控制中心的架构与理念

Home Assistant Core:开源智能家居控制中心的架构与理念

学习目标

  • 理解 Home Assistant 的实体(Entity)/状态(State)数据模型
  • 掌握集成(Integration)的加载机制与通信模式
  • 了解自动化引擎(Automation Engine)的触发-条件-动作执行模型
  • 认识 Home Assistant 本地优先(Local-First)的设计哲学及其对隐私的意义
  • 理解与服务(Service)、场景(Scene)相关的事件驱动架构

1. 项目概览

Home Assistant 是一个开源的智能家居控制中心软件,由荷兰开发者 Paulus Schoutsen 于 2013 年创建。它的核心目标是:将本地控制和数据隐私放在首位,让用户能够在自己的硬件上(树莓派、NAS、本地服务器)运行完整的智能家居系统,而不必将数据交给云端。

Home Assistant Core 的核心数据:

指标数值
GitHub Stars86,672
GitHub Forks37,370
主要语言Python
LicenseApache-2.0
维护模式高度活跃,由 Open Home Foundation 支持
集成数量2000+(涵盖主流 IoT 设备、品牌、云服务)
运行要求Python 3.10+,推荐 4GB+ RAM

Home Assistant 不同于米家、Google Home、Apple HomeKit 等商业平台。它是一个纯粹的、运行在用户本地的控制中枢,通过集成(Integration)连接各类设备和服务。


2. 核心设计哲学:本地优先

Home Assistant 的首要设计原则是本地运行,数据不上云

这意味着:

  • 设备状态、自动化规则、历史数据都存储在本地
  • 即使互联网中断,本地控制的设备仍可正常运行
  • 所有自动化逻辑可以在本地评估,不依赖云端延迟
  • 用户对自己的数据拥有完全控制权

这对隐私敏感的用户来说至关重要——你的家居使用数据不会经过厂商的服务器。


3. 实体 / 状态模型:一切皆 Entity

Home Assistant 的数据模型非常简洁:一切皆 Entity(实体),每个 Entity 有 State(状态)和 Attributes(属性)

3.1 Entity 的结构

# 实体示例:一个灯泡的状态
{
    "entity_id": "light.living_room",
    "state": "on",
    "attributes": {
        "brightness": 255,
        "color_temp": 400,
        "friendly_name": "Living Room Light",
        "supported_color_modes": ["brightness", "color_temp"],
    },
    "last_changed": "2026-04-27T10:30:00.000000+00:00",
    "last_updated": "2026-04-27T14:22:00.000000+00:00",
    "context": {
        "id": "01JXXXXXXXXXXXXXXX",
        "user_id": None,
        "parent_id": None,
    }
}

每个 Entity 有:

  • entity_id:全局唯一标识符,格式为 <domain>.<name>
  • state:当前状态(字符串,如 “on”/“off”/“playing”)
  • attributes:键值对,包含该实体的详细属性
  • last_changed:状态首次变为当前值的时间
  • last_updated:状态任意变化的时间

3.2 领域(Domain)

Entity 按类型划分为 Domain,常见的 Domain 有:

Domain含义state 示例
light灯光on / off
switch开关on / off
sensor传感器任意数值或字符串
climate温控heat / cool / idle
cover窗帘/门open / closed
automation自动化规则on / off
scene场景/scene.activate

3.3 状态机(State Machine)

Home Assistant 内部有一个全局状态机(State Machine),管理所有 Entity 的状态。

# 开发者可以通过 Python API 访问状态机
state = hass.states.get("light.living_room")
hass.states.set("light.living_room", "off")

# 监听状态变化
hass.bus.listen("state_changed", on_state_changed)

4. 集成(Integration)架构

集成是 Home Assistant 连接外部设备和服务的方式。每个集成负责与特定品牌或协议通信,并将设备映射为 Entity。

4.1 集成的工作原理

以 MQTT 集成为例:

[物理设备] --MQTT协议--> [MQTT Broker] --发布主题--> [Home Assistant MQTT集成]
                                                              |
                                                              v
                                                        [Entity/State]

每个集成通常包含:

  • __init__.py:包的入口,负责 setup 和配置验证
  • config_flow.py:前端配置流程(Web UI 中添加集成的向导)
  • diagnostic.py:诊断信息
  • entity.py:一个或多个实体类,继承 Entity 基类
  • manifest.json:元数据(版本、依赖、作者等)

4.2 集成的配置模式

Home Assistant 支持多种配置方式:

YAML 配置(传统方式):

# configuration.yaml
light:
  - platform: hue
    bridge: 192.168.1.100
    allow_unused: true

UI 配置(新方式): 通过"设置 → 设备与服务 → 添加集成"在 Web UI 中配置,不需要编辑 YAML。

UI 配置的优势在于:

  • 配置实时验证,错误立即提示
  • 可以在不重启 HA 的情况下加载/卸载集成
  • 支持 OAuth 等需要交互式认证的集成

4.3 设备(Device)与实体(Entity)的关系

Home Assistant 0.107 引入了设备(Device)概念,将实体分组到设备中:

Device: "Philips Hue Bridge"
  - Entity: light.living_room (灯泡)
  - Entity: light.bedroom (灯泡)
  - Entity: sensor.living_room_temperature (温度传感器)

这样在 UI 中显示时,同一物理设备的多个实体被组织在一起,用户体验更直观。


5. 自动化引擎

自动化(Automation)是 Home Assistant 的核心能力之一。它允许用户定义规则:当某个条件满足时,自动执行一系列动作。

5.1 自动化结构

automation:
  - alias: "人来灯亮"
    trigger:
      - platform: state
        entity_id: binary_sensor.motion_garage
        to: "on"
    condition:
      - condition: time
        after: "06:00:00"
        before: "23:00:00"
    action:
      - service: light.turn_on
        target:
          entity_id: light.living_room
        data:
          brightness: 255

自动化三要素:

  • Trigger(触发器):什么事件启动自动化(状态变化、时间、API调用等)
  • Condition(条件):附加的前置条件(时间、设备状态、用户在场等)
  • Action(动作):触发后执行的操作(开灯、发送通知、调用服务等)

5.2 触发器类型

Home Assistant 支持丰富的触发器:

触发器说明
state实体状态变化
numeric_state传感器数值超过/低于阈值
time指定时间触发
time_pattern定时重复(如每5分钟)
event任意事件(来自总线或外部)
homeassistantHA 启动/关闭事件
mqttMQTT 主题收到消息
webhookHTTP Webhook 触发
geo_locationGPS 位置进入/离开某区域
zone用户进入/离开地理围栏

5.3 脚本(Script)与场景(Scene)

脚本是可重用的动作序列,可以被自动化调用:

script:
  goodbye:
    sequence:
      - service: light.turn_off
        target:
          entity_id: light.all
      - service: climate.set_temperature
        data:
          temperature: 20

场景是预先定义的一组实体状态,一键切换:

scene:
  - name: 观影模式
    entities:
      light.living_room:
        state: on
        brightness: 80
      light.bedroom:
        state: off

6. 服务(Service)机制

服务是 Home Assistant 中对实体执行操作的方式。每个 Domain 暴露一组服务。

6.1 调用服务

# 在自动化中调用服务
action:
  - service: light.turn_on
    data:
      brightness: 255
      color_name: red
    target:
      entity_id: light.living_room
# 在开发者工具中调用
hass.services.call(
    domain="light",
    service="turn_on",
    {"entity_id": "light.living_room", "brightness": 255}
)

6.2 服务调用的一次性语义

服务调用是"即发即忘"(fire-and-forget)的。如果目标实体不存在,服务调用静默失败。这是设计选择,保持了系统的松耦合。


7. 事件总线(Event Bus)

Home Assistant 的各组件通过事件总线通信。这是一个发布-订阅模型:

# 监听所有状态变化
hass.bus.listen("state_changed", on_state_changed)

# 监听特定事件
hass.bus.listen("call_service", on_service_call)

# 发布自定义事件
hass.bus.fire("my_custom_event", {"key": "value"})

自动化触发器本质上就是事件总线上的订阅者。集成通过发布事件(state_changed 等)来通知 Home Assistant,自动化引擎订阅这些事件并执行匹配规则。


8. 数据分析与长期存储

Home Assistant 内置**记录器(Recorder)**集成,将状态变化历史存入本地 SQLite(默认)/ PostgreSQL / MariaDB 数据库。

# recorder 配置示例
recorder:
  db_url: mysql://user:pass@localhost/hass?charset=utf8mb4
  purge_keep_days: 30
  commit_interval: 5

有了长期历史数据后,可以通过历史面板查看设备状态变化曲线,或在自动化中用 numeric_state 触发器检测异常。


9. 适用场景与优势

Home Assistant 适合的场景

  1. 多品牌设备整合:家中同时有米家、Yeelight、Philips Hue、IKEA TRÅDFRI、Zigbee 设备?不问题,HA 全部支持
  2. 本地私有化部署:对隐私有要求,不希望数据上云
  3. 跨品牌联动:例如"门锁打开时自动开灯"、“PM2.5 超标时自动关窗”
  4. 数据可视化:内置仪表板(Dashboard)展示传感器历史数据

Home Assistant 的优势

  1. 2000+ 集成:支持几乎所有主流 IoT 品牌和协议(Zigbee, Z-Wave, MQTT, Matter等)
  2. 活跃社区:庞大的用户和开发者社区,大量自定义组件和主题
  3. 开源可控:代码透明,可以自托管
  4. 跨平台:可运行在树莓派、NUC、NAS、Docker、虚拟机等几乎任何硬件上

10. 总结

Home Assistant 代表了一种智能家居的正确打开方式:本地控制、隐私优先、开源协作。它的 Entity/State 模型简洁优雅,集成架构支持了惊人的生态广度,自动化引擎功能完整且灵活。

如果你对 IoT 技术有兴趣,Home Assistant 是一个极好的学习和实践平台——它用 Python 编写,代码质量高,文档完善,而且有真实的使用场景驱动。

延伸资源: