1. 从“能用”到“好用”:为什么你需要自定义 Home Assistant
如果你已经成功在 VirtualBox 里跑起了 Home Assistant,看着那个默认的仪表盘,心里大概会想:“嗯,不错,我的设备都加进来了。” 但很快,你就会发现,这个“能用”的状态,距离你想象中的智能家居,还差着十万八千里。默认的界面可能杂乱无章,自动化逻辑藏在复杂的 YAML 文件里,想要一个简单的“观影模式”都得折腾半天。这,就是自定义 Home Assistant 的起点——它不是为了让系统变得更复杂,恰恰相反,是为了让它变得更简单、更贴合你的生活习惯,真正成为你家里的“智能大脑”。
Home Assistant 的强大之处在于其极致的可定制性。它不像那些商业闭源系统,给你什么你就只能用什么。在这里,从界面布局、主题配色,到自动化逻辑的精细控制、第三方服务的深度集成,你几乎可以重塑一切。自定义的核心目的,是让信息呈现更直观,让控制触手可及,让自动化真正“懂你”。比如,把全家灯光状态集中在一个卡片上,用滑块控制所有窗帘的开合度,或者创建一个一键场景,同时关闭灯光、拉上窗帘、打开投影仪并播放电影。这些体验,都需要通过自定义来实现。
2. 界面自定义:打造你的专属控制中心
刚安装好的 Home Assistant,其 Lovelace 界面(即默认的仪表盘)是相当基础的。它只是把你添加的设备和服务,以一种默认的、信息密度不高的方式罗列出来。我们的目标,是把它改造成一个高效、美观、符合个人使用习惯的控制面板。
2.1 理解 Lovelace 的两种配置模式
这是自定义界面的第一个关键选择。Home Assistant 提供了两种配置 Lovelace 的方式:基于 UI 的配置和YAML 配置。
- 基于 UI 的配置(推荐新手起步):在仪表盘右上角点击“编辑仪表盘”,然后通过“添加卡片”的图形化界面进行操作。这种方式直观,所见即所得,非常适合快速搭建和调整布局。你可以添加各种预定义的卡片类型,如实体卡片、标记卡片、图片卡片等,并通过拖拽来排列它们。
- YAML 配置(追求极致与复用):这是更高级、更强大的方式。你需要编辑
ui-lovelace.yaml文件(如果不存在,需手动创建于配置目录下)。在这种模式下,整个仪表盘的布局、卡片、视图都通过代码定义。它的优势在于:- 版本控制:你可以用 Git 等工具管理配置文件的变更历史。
- 复用与模块化:可以定义变量、复用代码片段,便于管理复杂的界面。
- 解锁高级功能:一些社区开发的优秀卡片或复杂布局,必须通过 YAML 配置才能实现。
对于大多数用户,我建议从 UI 配置开始,快速搭建出雏形。当你觉得 UI 配置无法满足你的精细化需求(比如想精确控制卡片的 CSS 样式,或者使用条件显示等高级功能)时,再逐步过渡到 YAML 配置。两者并非互斥,你可以在 YAML 配置的框架下,部分使用 UI 编辑器进行微调。
2.2 核心卡片类型与实战布局
卡片是界面的基本组成单元。理解每种卡片的用途,是高效布局的前提。
- 实体卡片:最常用的卡片,用于显示和控制单个设备或传感器。你可以自定义它的图标、名称、以及显示的属性(如温度传感器的当前温度、历史曲线)。
- 标记卡片:将多个实体组合在一个卡片内,通常以紧凑的网格或列表形式呈现。这是整理同一区域(如“客厅”)所有设备的神器。
- 图片卡片:可以显示一张图片,并可以设置可点击区域(图片实体)来触发自动化或控制设备。我常用它来制作家庭平面图,在地图上直接点击房间图标来控制该房间的灯光和空调,直观无比。
- 按钮卡片:创建一个自定义按钮,用于触发一个脚本、场景或服务调用。比如“一键观影”、“离家模式”。
- 历史图表卡片:展示传感器(如温度、湿度、功耗)随时间变化的曲线图,对于分析趋势非常有用。
- 地图卡片:如果你有设备追踪器(如手机 GPS),可以在地图上显示家庭成员的位置。
布局实战心得:不要试图把所有东西都塞在一个页面上。善用“视图”功能。你可以创建多个视图标签页,例如:
- 概览:放置最常用、最全局的控制和状态信息,如全屋灯光开关、安防状态、天气。
- 房间/区域:为每个房间(客厅、卧室、厨房)创建一个视图,里面只放该房间的设备。
- 媒体:集中所有媒体播放器、电视、音响的控制。
- 能源(如果你有相关传感器):展示功耗、太阳能发电等图表。
- 管理:放置一些后台管理用的按钮,如重启服务器、清理数据库等。
这样的结构清晰,操作时能快速定位,避免了在几十个卡片中寻找某个开关的尴尬。
2.3 主题与视觉美化:不止于换肤
更换主题是提升观感最直接的方式。HACS(Home Assistant Community Store)中有海量的社区主题可供安装。安装后,在“配置” -> “仪表盘” -> “主题”中应用即可。
但美化不止于此。通过“卡片模组”这类自定义卡片,你可以实现更精细的视觉控制:
- CSS 注入:直接编写 CSS 代码,修改卡片的边框、阴影、字体、背景色,甚至动画效果。
- 条件格式:让卡片根据状态动态改变样式。例如,当温度高于 28°C 时,温度卡片背景变成橙色;当门锁被打开时,门锁卡片闪烁红色。这极大地提升了信息的可读性。
- 自定义布局:打破默认的网格布局,实现更自由的排版。
注意:过度美化可能会影响界面加载速度,尤其是在性能较低的设备(如树莓派)上运行 Home Assistant 时。建议先追求功能和效率,稳定后再进行深度美化。
3. 自动化与脚本:赋予家居以“智能”
设备接入和界面布置只是骨架,自动化和脚本才是让智能家居拥有“灵魂”的肌肉和神经。Home Assistant 的自动化引擎非常强大,但也因此有一定的学习曲线。
3.1 自动化编辑器 vs. YAML:选择你的武器
和界面一样,自动化也有图形化编辑器和 YAML 两种编写方式。
- 自动化编辑器(UI):对于简单的“如果...就...”逻辑非常友好。它清晰地分为了“触发器”、“条件”、“动作”三个部分,降低了入门门槛。你可以通过下拉菜单选择设备、状态作为触发条件,选择要执行的服务作为动作。
- YAML 自动化:当逻辑变得复杂时,图形化编辑器会显得力不从心。YAML 提供了完全的灵活性和强大的功能,例如:
- 使用模板:在条件或动作中嵌入动态的 Python 表达式,计算复杂的逻辑。
- 选择器:更精细地筛选目标实体。
- 变量:在自动化执行过程中传递和使用变量。
- 更复杂的触发类型:如事件触发器、时间模式触发器、地理围栏触发器等。
我的经验是:从 UI 编辑器入手,建立对自动化三要素(触发、条件、动作)的直观理解。当你遇到 UI 无法实现的逻辑时,再去学习对应的 YAML 写法。很多复杂的自动化,其实是多个简单自动化的组合。
3.2 构建实用自动化案例拆解
让我们通过几个具体案例,来理解如何设计一个健壮、好用的自动化。
案例一:智能灯光
- 初级版(运动感应开灯):
- 触发器:人体传感器状态从“关”变为“开”。
- 条件:时间是晚上(例如,日落之后,日出之前);且环境光传感器亮度低于某个值。
- 动作:打开该区域的灯。
- 陷阱:人不动了,传感器关闭,灯就灭了。需要加一个“持续时间”条件,或者使用更智能的“区域占用”方案(需要多个传感器协同)。
- 进阶版(回家场景灯):
- 触发器:设备追踪器(你的手机)状态变为“在家”。
- 条件:时间是日落后;且没有其他人在家(避免重复触发)。
- 动作:调用一个“回家”脚本,脚本内依次执行:打开门厅灯(亮度50%),等待2秒,打开客厅主灯(亮度70%),关闭门厅灯。
案例二:空调自动化
- 目标:夏季工作日下午6点,如果室内温度高于26°C,且我即将到家(距离家小于5公里),则提前打开客厅空调到25°C。
- 触发器1:时间触发,每天下午6点。
- 触发器2:设备追踪器状态更新(任何位置变化)。
- 条件:使用“或”条件,满足任一触发器即可进入判断。然后判断:季节是夏季;室内温度传感器 > 26°C;我的手机距离家的距离 < 5km;空调当前状态是“关闭”。
- 动作:打开客厅空调,模式设为“制冷”,温度设为25°C。
- 要点:这里使用了“或”条件来合并两个触发器,并用模板(
{{ is_state('sensor.season', 'summer') }})来判断季节(需要一个季节传感器或通过月份计算)。还需要一个“防呆”条件,避免空调已经开着还重复发送指令。
案例三:通知与告警
- 雨水关窗提醒:
- 触发器:天气传感器的“下雨”状态变为“是”。
- 条件:任何一扇窗户的传感器状态是“开”。
- 动作:向手机发送一条通知:“正在下雨,但 [窗户实体名] 还开着,记得关窗哦!”。
- 洗衣机完成通知:
- 触发器:洗衣机的功率传感器从高功率(>20W)下降到低功率(<10W)并持续5分钟。
- 条件:无。
- 动作:发送通知“洗衣已完成”,并同时让客厅的智能音箱语音播报一次。
3.3 脚本:可重用的动作序列
脚本是一系列动作的集合,可以被自动化或其他脚本调用。它非常适合封装那些常用的、多步骤的操作。
例如,你可以创建一个名为scene_movie_night的脚本:
alias: “观影模式” sequence: - service: light.turn_off target: entity_id: light.living_room_main, light.dining_room - service: light.turn_on target: entity_id: light.tv_backlight data: brightness_pct: 30 rgb_color: [0, 100, 255] - service: cover.close_cover target: entity_id: cover.living_room_curtain - service: media_player.turn_on target: entity_id: media_player.projector - delay: seconds: 5 # 等待投影仪启动 - service: media_player.select_source target: entity_id: media_player.av_receiver data: source: “HDMI 1” mode: single # 确保同一时间只能运行一个实例然后,你可以在自动化中调用这个脚本,也可以在界面上放一个按钮卡片直接触发它。脚本的mode参数很重要,single表示如果脚本正在运行,新的调用会被忽略,这避免了重复触发造成混乱。
4. 高级集成与 HACS:扩展 Home Assistant 的边界
Home Assistant 官方支持数以千计的集成,但社区的力量更为惊人。HACS 是你的必备神器。
4.1 HACS 安装与使用指南
HACS 不是一个集成,而是一个“商店”管理器。它允许你轻松地浏览、安装、更新社区开发的自定义集成、前端卡片、主题和自动化。
安装步骤(在 Home Assistant 中操作):
- 确保你的 Home Assistant 有互联网访问权限,并且以高级模式运行(在“配置”->“系统”->“高级模式”中开启)。
- 通过 SSH 或 Samba 连接到你的 Home Assistant 服务器,进入配置目录(通常是
/config或你安装的目录)。 - 在终端中运行 HACS 的安装命令(具体命令请参考 HACS 官网,通常是一个 curl 命令)。
- 重启 Home Assistant。
- 重启后,在侧边栏会出现“HACS”选项。首次进入需要登录 GitHub 授权(因为 HACS 从 GitHub 获取资源)。
- 授权后,你就可以在 HACS 的“集成”、“前端”、“自动化”等分类中浏览和安装了。
使用心得:
- 谨慎选择:HACS 中的组件质量参差不齐。优先选择星标多、最近有更新、文档齐全的项目。
- 注意兼容性:安装前务必查看组件说明,确认其支持你当前运行的 Home Assistant 版本。
- 备份:在通过 HACS 安装或更新任何重要组件前,习惯性地备份你的 Home Assistant 配置(快照功能)。社区组件可能引入不稳定因素。
4.2 必装自定义集成推荐
通过 HACS,你可以接入一些官方集成无法覆盖或功能更强的服务:
xiaomi_miot_raw或Xiaomi Miot Auto:如果你有大量小米/米家设备,这个集成比官方的xiaomi_miio支持更广泛,本地化程度更高,能接入更多传感器类型。browser_mod:将你电脑或平板上的浏览器变成一个可被 Home Assistant 控制的媒体播放器、传感器和通知器。你可以用它在电脑上弹出通知,或者显示一个全屏的仪表盘。adaptive_lighting:根据一天中的时间自动调节灯光的色温和亮度,模拟自然光的变化,非常护眼,体验远超简单的“自动化”。circadian_lighting:与上一个类似,也是根据昼夜节律调整灯光。local_calendar:在本地创建一个日历,用于触发自动化,无需依赖谷歌或苹果日历,隐私性更好。file_upload:允许你通过网页界面上传文件到 Home Assistant 配置目录,方便管理自定义图片、音频等资源。
4.3 使用 Node-RED 进行可视化流程编排
对于觉得 YAML 自动化语法晦涩,又认为图形化编辑器功能太弱的朋友,Node-RED 是终极解决方案。它是一个基于流的低代码编程工具,可以独立运行,并与 Home Assistant 深度集成。
- 工作原理:Node-RED 通过 Home Assistant 的 WebSocket API 或 REST API 连接,可以读取所有实体状态,并调用任何服务。你在 Node-RED 中创建“流”,用节点表示触发器、条件判断、函数处理、服务调用等,然后用线连接它们,形成一个可视化的逻辑流程图。
- 优势:
- 极度直观:复杂的逻辑关系一目了然,调试方便。
- 功能强大:内置函数节点支持 JavaScript,可以实现任何复杂逻辑。
- 易于复用:可以创建子流,将常用逻辑模块化。
- 社区节点丰富:有大量针对 Home Assistant 优化的节点。
- 安装:可以通过官方插件库(Add-on Store)安装,也可以作为独立容器安装。
- 一个简单流示例:你可以拖入一个
events: state节点监听门锁开门事件,连接一个switch节点判断是否是晚上,再连接一个function节点编写逻辑判断是否家中无人,最后连接一个call service节点打开玄关灯并发送警报通知。整个过程就像搭积木一样。
对于逻辑复杂、涉及多个设备状态交织的自动化(例如真正的“离家模式”:需要判断所有人的手机都不在家、所有门窗已关闭、没有正在运行的电器,然后执行一系列关闭动作),Node-RED 的优势是无可比拟的。
5. 底层配置优化与维护
当你的自定义程度越来越深,系统稳定性和性能就变得至关重要。
5.1 配置文件 (configuration.yaml) 的结构化管理
初期,你可能把所有配置都堆在configuration.yaml这一个文件里。随着设备增多,这个文件会变得难以维护。最佳实践是使用!include指令进行分拆。
推荐的文件结构:
/config ├── configuration.yaml # 主文件,只包含 include 指令和最基本配置 ├── secrets.yaml # 存放所有密码、API密钥等敏感信息 ├── automations.yaml # 或 automations/ 目录 ├── scripts.yaml # 或 scripts/ 目录 ├── scenes.yaml ├── sensors.yaml ├── lights.yaml ├── switches.yaml └── packages/ # 按房间或功能打包配置 ├── living_room.yaml ├── bedroom.yaml └── security.yaml在configuration.yaml中,你可以这样写:
default_config: # 包含敏感信息 homeassistant: packages: !include_dir_named packages/ # 包含其他配置 automation: !include automations.yaml script: !include scripts.yaml sensor: !include sensors.yaml light: !include lights.yaml在packages/living_room.yaml中,你可以把客厅所有的设备、实体、自动化都放在一起,管理起来非常清晰。!include_dir_named会自动引入packages目录下所有.yaml文件。
5.2 性能监控与数据库优化
Home Assistant 默认使用 SQLite 数据库记录历史数据。长期运行后,这个数据库文件会变得非常大,影响查询速度和备份效率。
- 迁移到 MariaDB/MySQL:对于重度用户,这是最重要的性能提升手段之一。通过插件库安装 MariaDB 插件,然后将历史记录和记录器指向新的数据库。速度会有显著提升,尤其是在查询长期历史数据时。
- 清理历史数据:即使使用 MariaDB,也需要定期清理。在
configuration.yaml中配置recorder组件:recorder: purge_keep_days: 30 # 只保留30天数据 commit_interval: 30 # 每30秒提交一次,平衡性能和数据安全 exclude: domains: # 排除不需要记录的域 - updater - sun entities: # 排除不需要记录的实体 - sensor.last_boot - 监控系统资源:安装
systemmonitor集成,监控 CPU、内存、磁盘使用情况。如果运行在虚拟机或容器中,确保为其分配了足够的资源(建议至少 2核 CPU, 2GB 内存)。
5.3 备份与灾难恢复策略
你的智能家居越依赖 Home Assistant,备份就越重要。
- 定期快照:使用 Home Assistant 内置的“快照”功能进行完整备份。建议每周一次,并保留2-3个历史版本。快照包含了配置、数据库和所有插件。
- 关键配置版本控制:将你的配置文件目录 (
/config) 用 Git 进行管理。每次做出重大更改后,提交一次。这样你可以清晰地追踪每一次修改,并且可以轻松回滚到任意版本。切记不要将secrets.yaml文件提交到公开仓库! - 测试恢复流程:定期(比如每季度)在测试环境(如另一台 VirtualBox 虚拟机)中恢复你的快照,确保备份是有效的。不要等到真正崩溃时才第一次尝试恢复。
- 文档化:记录下你所有重要的自定义步骤、遇到的坑和解决方案。一个简单的
README.md放在配置目录里,未来你自己或者别人维护时会感激不尽。
自定义 Home Assistant 是一个持续的过程,而不是一次性的任务。从整理界面开始,逐步添加实用的自动化,再探索高级集成和优化,你的智能家居系统会随着你的需求一起成长,最终成为一个真正贴心、高效、可靠的伙伴。记住,最好的智能家居系统,是那个让你感觉不到它存在,却又无处不在为你服务的系统。