树莓派 + Home Assistant + HomeKit 从零开始打造个人智能家居系统 篇四:自动化(Automation)
通过本篇教程,你将了解 Home Assistant 自动化概念,以及自动化的组成,并通过一些例子学习如何编写自己的自动化配置。( 官方文档与官方示例 )
提示:慎入!这是一篇非常无趣的基础技术文。(这是我完成此文前后的状态,完成前: ,完成后:。 )
智能家居为人诟病的一点往往是它不够“智能”,而国内的厂家又爱拿“智能”、“云”、“物联网+”之类高大上的词语做噱头,当你将这些设备买回家后,你发现它没有想象中的那么好用,难免就会失望。目前的智能家居系统,与其强调“智能”(Smart),我认为不如 Home Assistant 中的描述的“自动化”(Automation)来的贴切,事实上,在 HomeKit 以及 米家 App 中的都是以“自动化”来命名它们的。
正是“自动化”的加入,使得 Home Assistant 不再呆板,在特定情况下,你甚至可以不再使用那些操作界面,让一切自动运转,真正的“智能”起来。以我自己举例,家中除了我,没人捣鼓这些东西,都是靠“自动化”设置,实现灯光、新风、监控、警戒、夜间空调等的日常使用。
一、自动化基础
HomeKit 新建自动化
为了让大家对相关概念有一个更直观的认识,我先以 HomeKit 为例做一个展示。
如图所示我新建了“星期日落日后就打开餐厅的落地灯”这样一个自动化(仅作示例),可见 iOS 的家庭 App 新建自动化非常直观。
在这个自动化中,我们的触发条件是一个时间,即“落日”并且限制在“星期日”,当到达这一时间点时,系统自动执行“打开餐厅落地灯”这一动作。这样一个最简单的自动化,由三个不同的部分组成:触发(Trigger)、条件(Condition)、动作(Action)。
这里我们也可以看到一般为了简化操作与保证设置的可行性,如 HomeKit、米家、阿里智能,都仅提供了较少的触发条件与可执行项,这大大限制了我们发挥的余地。
自动化组成
触发:即触发自动化规则,比如到达特定的时间点、到达某一地点、天气变化、系统变化。
条件:条件是可选的,可以将自动化规则限制为仅在特定情况下执行。如一周之中我们只在周日让这个自动化起作用。
动作:当规则被触发并满足所有条件,将被执行,如开灯、调节温度、激活场景。
以官方一个简单的 Home Assistant 自动化配置为例,格式如下:
automation:
- alias: 'Rainy Day' #自动化名称
trigger: #触发
- platform: state
entity_id: sensor.precip_intensity
to: 'rain'
condition: #条件
- condition: state
entity_id: group.all_devices
state: 'home'
- condition: time
after: '14:00'
before: '23:00'
action: #动作
service: light.turn_on
entity_id: light.couch_lamp
对应流程如下:
这个自动化表示,在下雨天,下午到晚上有人在家的话,就打开灯。
自动化配置在 "configuration.yaml" 中,"automation: "字段下,也可以使用 "automation: !include automations.yaml" 将所有自动化信息独立出来。
系统内部参数
在上篇 Home Assistant 的进阶设置中我们讲到过,Home Assistant 的每一个一个设备或服务,都是通过自身唯一的实例 ID(Entity ID)被系统调用的,而在自动化配置中,我们设置触发、条件、动作的对象,也是如此。
在上图所示界面,我们可以获得一个设备或服务的ID(Entity ID)、状态(State)及附加属性(Attributes)。
这些实例状态的变化,被用作触发源,而其实时状态用作判断能否执行的条件。
在 Home Assistant 中,所有设备或服务,包括灯、开关、人,甚至太阳等等,都被视为一个实例(Entity)。
所有的动作(Action)都被称作服务(Services),所有可执行的服务都可以在下图开发者工具(Developer Tools)中找到,包括自定义的设备与服务。比如上例中的 light.turn_on 能够打开系统中的任何灯,只需要添加类似 entity_id: light.couch_lamp 的指定参数即可。
二、自动化编辑器
0.45 版本之后,Home Assistant 还提供了一个自动化编辑器,在侧边栏找到 Configuration > Automations。
继续以上个自动化为例,用图像界面编辑器添加,如下图所示:
自动化编辑器能够使得相关配置工作简化,它提供了触发、条件和动作的类别选择,但是你还需要在开发者工具(Developer Tools)中找到你需要的实例 ID(Entity ID)、状态(State)和服务(Service)的详细信息并手动填入编辑器。
注意:自动化编辑器 Data 参数采用 JSON 格式,与配置文件 YAML 语法有所不同,请按开发者工具(Developer Tools)中的示例编写。
因为自动化编辑器需要调用 automations.yaml 文件,需要采用 automation: !include automations.yaml 将自动化信息独立出来。
三、自动化详解
触发(Trigger)
触发是启动自动化的规则,可以为同一规则设置多个触发器。一旦触发,Home Assistant 将验证相关条件,并执行动作。
事件触发
automation:
trigger:
platform: event
event_type: MY_CUSTOM_EVENT
# 可选
event_data:
mood: happy
Home Assistant 触发
由 Home Assistant 的启动或停止来触发。
automation:
trigger:
platform: homeassistant
event: start # 或者是 'shutdown'
MQTT触发
收到来自 topic 的消息后触发。
automation:
trigger:
platform: mqtt
topic: living_room/switch/ac
payload: 'on' # 可选项
数值触发
设备的状态达到预设范围时触发,如温度低于xx度。
automation:
trigger:
platform: numeric_state
entity_id: sensor.temperature
value_template: '{{ state.attributes.battery }}' # 可选 定义数据格式
# above below 至少有一个
above: 17
below: 25
状态触发
设备的状态变化来触发。
automation:
trigger:
platform: state
entity_id: device_tracker.paulus, device_tracker.anne_therese
# from to 可选一个或全部
from: 'not_home'
to: 'home'
# 可选项 状态为1:10:05时触发
for:
hours: 1
minutes: 10
seconds: 5
日出日落触发
顾名思义,日出或日落时触发,可设置提前或推迟时间。
automation:
trigger:
platform: sun
event: sunset # sunset或sunrise
offset: '-00:45:00' # 可选项,此例为日落前 45 分钟触发
模板触发
模板值为 True 时触发。
automation:
trigger:
platform: template
value_template: "{% if is_state('device_tracker.paulus', 'home') %}true{% endif %}"
时间触发
在某时刻触发。
automation:
trigger:
platform: time
# 每小时的第5分钟触发
minutes: 5
seconds: 00
automation 2:
trigger:
platform: time
# 15:32:00 触发
at: '15:32:00'
automation 3:
trigger:
platform: time
# 每 5分钟 触发一次
minutes: '/5'
seconds: 00
区域触发
到达或离开某地时触发,目前仅支持 OwnTracks 平台以及 iCloud 平台。
automation:
trigger:
platform: zone
entity_id: device_tracker.paulus # 此设备到达 home 时触发
zone: zone.home
# 到达或离开时触发
event: enter # or "leave"
多个触发
触发其中一个,自动化就会被被执行。
automation:
trigger:
# 第一个
- platform: time
minutes: 5
seconds: 00
# 第二个
- platform: sun
event: sunset
条件(Condition)
条件是自动化规则的可选部分,用来限制触发后的执行,防止误操作。
逻辑关系
与(AND)
同时满足所有条件才执行。
condition:
condition: and
conditions:
- condition: state
entity_id: 'device_tracker.paulus'
state: 'home'
- condition: numeric_state
entity_id: 'sensor.temperature'
below: '20'
或(OR)
只要满足一个条件就执行。
condition:
condition: or
conditions:
- condition: state
entity_id: 'device_tracker.paulus'
state: 'home'
- condition: numeric_state
entity_id: 'sensor.temperature'
below: '20'
混合 AND 和 OR
示例:下雨或者温度低于20℃,同时有人在家时执行。
condition:
condition: and
conditions:
- condition: state
entity_id: 'device_tracker.paulus'
state: 'home'
- condition: or
conditions:
- condition: state
entity_id: sensor.weather_precip
state: 'rain'
- condition: numeric_state
entity_id: 'sensor.temperature'
below: '20'
条件类型
数值条件
condition:
condition: numeric_state
entity_id: sensor.temperature
above: 17
below: 25
# 可选
value_template: {{ float(state.state) + 2 }}
状态条件
condition:
condition: state
entity_id: device_tracker.paulus
state: not_home
# 可选
for:
hours: 1
minutes: 10
seconds: 5
日出日落条件
condition:
condition: sun
after: sunset
# 可选
after_offset: "-1:00:00"
模板条件
condition:
condition: template
value_template: '{{ states.device_tracker.iphone.attributes.battery > 50 }}'
时间条件
condition:
condition: time
# 需要以下至少一项
after: '15:00:00'
before: '02:00:00'
weekday:
- mon
- wed
- fri
区域条件
condition:
condition: zone
entity_id: device_tracker.paulus
zone: zone.home
示例
condition:
- condition: numeric_state
entity_id: sun.sun
value_template: ''
below: 1
- condition: state
entity_id: light.living_room
state: 'off'
- condition: time
before: '23:00:00'
after: '14:00:00'
- condition: state
entity_id: script.light_turned_off_5min
state: 'off'
动作(Action)
动作通过服务或事件与其他内容进行交互。在服务中需要指定实例 ID(entity_id)和可选的参数(data)。
automation:
# 日落后将厨房与客厅的灯打开,并调到 亮度150,红色。
trigger:
platform: sun
event: sunset
action:
service: light.turn_on
entity_id:
- light.kitchen
- light.living_room
data:
brightness: 150
rgb_color: [255, 0, 0]
automation 2:
# 推送消息
trigger:
platform: sun
event: sunset
offset: -00:30
action:
# 可以有多个service
- service: notify.notify
data:
message: Beautiful sunset!
- delay: 0:35
- service: notify.notify
data:
message: Oh wow you really missed something great.
四、后期预告
说实话,没有想到大家有如此高的热情,毕竟除开一些演示图片,技术文当真是枯燥又无趣,而自动化这一篇更是其中的巅峰,还好到这里整个系列文章算是告一段落。
每个人的情况不同、设备不同,由于篇幅有限,这些基础篇章中我没有非常具体的讲一些设备和组件,当然我也不可能做到面面俱到,但是我希望通过之前的文章能够引领大家入门,能够让大家少走些弯路。除了官方文档、官方论坛,大家还可以到中文论坛瀚思彼岸进行 Home Assistant 相关讨论,其中有很多具体的设备接入与插件配置。
这个系列不会结束,但是应该不会如此密集地发文了,后期或许会做一两期个性化的内容,比如 Floorplan 或是 HADashboard,有机会再做智能音箱接入的内容。同时希望能与大家分享更多关于智能家居的内容,用心打造我们每一个人自己的智能家居与生活。
效果展示:
PS:这种嵌入插座哪里能买得到……
当然,你也可以采用这样的形式:
csshan
校验提示文案
oneloya
校验提示文案
小海哥哥
校验提示文案
qbenny
外网控制不方便的话,感觉还不如米家自带的app
校验提示文案
上帝也忙着数钱
校验提示文案
阿布test
校验提示文案
moyixn
校验提示文案
jujusoft
校验提示文案
kevin_zhangzj
校验提示文案
一张超级纸牌
校验提示文案
蒙特锅儿飞
校验提示文案
congcong_23
校验提示文案
jujusoft
1,进门检测门磁自动开灯默认2分钟后关灯,到这里都没问题,再接下来就搞不定了 这两分钟里如果物理上或者ha里动过这个灯的开关了那之前设置的两分钟后关灯就需要不执行,这个怎么实现
2,灯带调亮度这没问题,但我怎么能通过ha在指定时长内把亮度从a渐变到b
校验提示文案
zrcool2
校验提示文案
再溅就再见
校验提示文案
阿龍先生
校验提示文案
梦碎大道
校验提示文案
nnnnbp
校验提示文案
jaymrx
校验提示文案
鱼要吃鱼
校验提示文案
值友9433131925
校验提示文案
jujusoft
1,进门检测门磁自动开灯默认2分钟后关灯,到这里都没问题,再接下来就搞不定了 这两分钟里如果物理上或者ha里动过这个灯的开关了那之前设置的两分钟后关灯就需要不执行,这个怎么实现
2,灯带调亮度这没问题,但我怎么能通过ha在指定时长内把亮度从a渐变到b
校验提示文案
值友1599136989
校验提示文案
JustWP7
校验提示文案
sfjnjau
校验提示文案
中二青年
校验提示文案
addlehead_pure
校验提示文案
congcong_23
校验提示文案
蒙特锅儿飞
校验提示文案
蒙特锅儿飞
校验提示文案
maomaoqiu
校验提示文案
一张超级纸牌
校验提示文案
罗歌佑派
是个底座壁挂座之类的东西,里面有一个面板开关的位置而已
校验提示文案
csshan
校验提示文案
kevin_zhangzj
校验提示文案
水水88
校验提示文案
jujusoft
校验提示文案
moyixn
校验提示文案
值友6460462301
校验提示文案
鬼皇
校验提示文案