Home Assistant Core:开源智能家居控制中心的架构与理念
posts posts 2026-04-27T15:00:00+08:00Home Assistant 是开源智能家居领域最活跃的项目之一,以本地优先、私有化为核心理念。本文解析 Home Assistant Core 的实体/状态模型、集成(Integration)架构、自动化引擎与数据流设计,帮助读者理解其为何能支持 2000+ 设备集成。技术笔记Home Assistant, 智能家居, Python, IoT, MQTT, 本地优先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 Stars | 86,672 |
| GitHub Forks | 37,370 |
| 主要语言 | Python |
| License | Apache-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: trueUI 配置(新方式): 通过"设置 → 设备与服务 → 添加集成"在 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 | 任意事件(来自总线或外部) |
homeassistant | HA 启动/关闭事件 |
mqtt | MQTT 主题收到消息 |
webhook | HTTP Webhook 触发 |
geo_location | GPS 位置进入/离开某区域 |
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: off6. 服务(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 适合的场景
- 多品牌设备整合:家中同时有米家、Yeelight、Philips Hue、IKEA TRÅDFRI、Zigbee 设备?不问题,HA 全部支持
- 本地私有化部署:对隐私有要求,不希望数据上云
- 跨品牌联动:例如"门锁打开时自动开灯"、“PM2.5 超标时自动关窗”
- 数据可视化:内置仪表板(Dashboard)展示传感器历史数据
Home Assistant 的优势
- 2000+ 集成:支持几乎所有主流 IoT 品牌和协议(Zigbee, Z-Wave, MQTT, Matter等)
- 活跃社区:庞大的用户和开发者社区,大量自定义组件和主题
- 开源可控:代码透明,可以自托管
- 跨平台:可运行在树莓派、NUC、NAS、Docker、虚拟机等几乎任何硬件上
10. 总结
Home Assistant 代表了一种智能家居的正确打开方式:本地控制、隐私优先、开源协作。它的 Entity/State 模型简洁优雅,集成架构支持了惊人的生态广度,自动化引擎功能完整且灵活。
如果你对 IoT 技术有兴趣,Home Assistant 是一个极好的学习和实践平台——它用 Python 编写,代码质量高,文档完善,而且有真实的使用场景驱动。
延伸资源: