树莓派 + Home Assistant + HomeKit 从零开始打造个人智能家居系统 篇四:自动化(Automation)
通过本篇教程,你将了解 Home Assistant 自动化概念,以及自动化的组成,并通过一些例子学习如何编写自己的自动化配置。( 官方文档与官方示例 )
提示:慎入!这是一篇非常无趣的基础技术文。 (这是我完成此文前后的状态,完成前: ,完成后: 。 )
智能家居为人诟病的一点往往是它不够“智能”,而国内的厂家又爱拿“智能”、“云”、“物联网+”之类高大上的词语做噱头,当你将这些设备买回家后,你发现它没有想象中的那么好用,难免就会失望。目前的智能家居系统,与其强调“智能”(Smart ),我认为不如 Home Assistant 中的描述的“自动化 ”(Automation )来的贴切,事实上,在 HomeKit 以及 米家 App 中的都是以“自动化”来命名它们的。
正是“自动化”的加入,使得 Home Assistant 不再呆板,在特定情况下,你甚至可以不再使用那些操作界面,让一切自动运转,真正的“智能”起来。以我自己举例,家中除了我,没人捣鼓这些东西,都是靠“自动化”设置,实现灯光、新风、监控、警戒、夜间空调等的日常使用。
一、自动化基础 HomeKit 新建自动化 为了让大家对相关概念有一个更直观的认识,我先以 HomeKit 为例做一个展示。
▲HomeKit 新建自动化
▲HomeKit 新建自动化
如图所示我新建了“星期日落日后就打开餐厅的落地灯”这样一个自动化(仅作示例),可见 iOS 的家庭 App 新建自动化非常直观。
▲HomeKit 自动化
在这个自动化中,我们的触发 条件是一个时间,即“落日”并且限制 在“星期日”,当到达这一时间点时,系统自动执行 “打开餐厅落地灯”这一动作。这样一个最简单的自动化,由三个不同的部分组成:触发(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
在上图所示界面,我们可以获得一个设备或服务的ID(Entity ID )、状态(State )及附加属性(Attributes )。
设备参数
这些实例状态 的变化,被用作触发 源,而其实时状态 用作判断能否执行 的条件 。
在 Home Assistant 中,所有设备或服务,包括灯、开关、人,甚至太阳等等,都被视为一个实例(Entity)。
所有的动作 (Action )都被称作服务 (Services ),所有可执行的服务都可以在下图开发者工具(Developer Tools )中找到,包括自定义的设备与服务。比如上例中的 light.turn_on 能够打开系统中的任何灯,只需要添加类似 entity_id: light.couch_lamp 的指定参数即可。
▲Services 工具
二、自动化编辑器 0.45 版本之后,Home Assistant 还提供了一个自动化编辑器,在侧边栏找到 Configuration > Automations 。
▲自动化编辑器
继续以上个自动化为例,用图像界面编辑器添加,如下图所示:
▲自动化“Rainy Day”
自动化编辑器能够使得相关配置工作简化,它提供了触发、条件和动作的类别选择,但是你还需要在开发者工具(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,有机会再做智能音箱接入的内容。同时希望能与大家分享更多关于智能家居的内容,用心打造我们每一个人自己的智能家居与生活。
效果展示:
▲Floorplan
▲Floorplan
▲HomeKit
▲Floorplan via Carlo
▲Floorplan via Carlo
PS:这种嵌入插座哪里能买得到……
当然,你也可以采用这样的形式:
▲3D Floorplan
香港服务器多少钱一个月?哪家的香港服务器
4核4g6M50G盘20G防御云服务器价格多少钱?T
特发集团与华为签署全面合作协议
【身边的AI】高空抛物智能追溯解决方案,站
中海&华为签署战略深化合作协议
华为赵博:数字化转型成为地产企业最确定的
这款TCL K6V指纹锁不到千元即可买到?大品
凯迪仕指纹锁哪款好用?买凯迪仕指纹锁选哪