树莓派 + Home Assistant + HomeKit 从零开始打造个人智能家居系统(6):自动化

树莓派 + Home Assistant + HomeKit

通过本篇教程,你将了解 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

在上图所示界面,我们可以获得一个设备或服务的ID(Entity ID)、状态(State)及附加属性(Attributes)。

▼设备参数

名称 描述 示例
Entity ID 实例的唯一标识符。 light.couch_lamp
State 设备的当前状态 on、off
Attributes 设备的的 brightness

这些实例状态变化,被用作触发源,而其实时状态用作判断能否执行条件

在 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

▲Floorplan via Carlo

Floorplan

▲Floorplan via Carlo

PS:这种嵌入插座哪里能买得到……

当然,你也可以采用这样的形式:

3D Floorplan
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容