到这里,Homeassistant的主要功能就了解的差不多了,其实所谓“智能”主要就是自动化加上想象力。

脚本

就是手动触发,然后执行一个或多个动作,详见文档。比如下面这个就是延迟三十分钟关闭电扇,这里其实是延迟和关闭开关两个动作了。

script:
  delay_turn_off_switch
    alias: 延迟关闭电扇
    sequence:
      - delay: '00:30'
      - service: homeassistant.turn_off
        entity_id: switch.xiaomi_switch_one

自动化

自动化其实也是去执行动作,不过不需要手动触发,而是由某个状态发生改变触发,如时间、开关打开、温度变化等;此外可能还需要一个环境条件,比如人在家、某个时间段内。

举个例子,如果人在家的话,每天早上9点播报天气情况。这里每天9点就是触发条件,人在家就是环境条件,播报天气就是动作。每个自动化实例可以有多个触发条件和环境条件。

这里我写了个自动重启HomeAssistant的脚本,shell_command可以执行linux命令,添加了一个脚本去执行这个命令;自动化中trigger是触发条件,这里设定的时间11:30(似乎有简单的写法);condition是环境条件,这里是设备组的状态,没有设备在家(这个组排除了智能设备)才会执行;action是动作,执行重启的脚本。

shell_command:
  restart_hass: sudo service home-assistant@pi restart

script:
  restart_hass:
    alias: 重启HomeAssistant
    sequence:
      - service: shell_command.restart_hass

automation:
- alias: restart_hass_daily
  initial_state: true
  trigger:
    - platform: time
      hours: 11
      minutes: 30
      seconds: 00
  condition:
  - condition: state
    entity_id: group.human_device
    state: not_home
  action:
    - service: script.turn_on
      entity_id: script.restart_hass

Package

这个东西还挺有用的,就是把一些配置打包成一个文件(上面那个自动重启的代码其实就是了),因为很多功能是需要多个部分的配置,打包后配置更清晰,也方便分享。

需要在configuration.yaml中添加packages: !include_dir_named packages,然后下载的或自己写的配置直接扔到配置目录下的packages文件夹即可。

这里需要说明一点,如果antomations.yaml中没有内容,而在包里面有自动化的内容,重启之后会出错,而脚本好像没这个问题,感觉是很奇怪的Bug,所以要先往antomations.yaml里面放至少一个自动化。

分享一个我参考网上代码修改的延时开关配置,需要修改xiaomi_switch_one为你自己的开关,保存为.yaml后缀放入packages。(需安装Custom UI,参考上一篇

homeassistant:
  customize:
    input_boolean.alarm_clock:
      friendly_name: 延时开关

    sensor.relative_alarm_time:
      friendly_name: 设定时间
      custom_ui_state_card: state-card-custom-ui
      extra_data_template: if (entities['switch.xiaomi_switch_one'].state === 'on') return '延时关闭时间'; else return '延时开启时间';

sensor:
  - platform: template
    sensors:
      relative_alarm_time:
        value_template: >
                       {% set relative_time =  (states.input_number.alarmhour.state|float|multiply(60) + states.input_number.alarmminutes.state|float) + (now().hour|float|multiply(60) + now().minute|float) %}
                       {%- if relative_time > 1440 -%}
                          {{((relative_time-1920) |int |multiply(60)) | timestamp_custom("%H:%M")}}
                        {%- else -%}
                          {{((relative_time-480) |int |multiply(60)) | timestamp_custom("%H:%M")}}
                       {%- endif %}
        unit_of_measurement: "min"

input_boolean:
  alarm_clock:
    initial: off
    icon: mdi:timer

input_number:
  alarmhour:
    name: 小时
    icon: mdi:timer
    initial: 0
    min: 0
    max: 5
    step: 1
  alarmminutes:
    name: 分钟
    icon: mdi:timer
    initial: 30
    min: 0
    max: 55
    step: 1
    
group:
  switch1:
    name: 电扇
    control: hidden
    view: no
    entities:
      - switch.xiaomi_switch_one
      - input_boolean.alarm_clock
      - sensor.relative_alarm_time
      - input_number.alarmhour
      - input_number.alarmminutes

automation:
- alias: countdown time
  initial_state: true
  trigger:
    platform: time
    minutes: '/1'
    seconds: 00
  condition:
    condition: and
    conditions:
      - condition: state
        entity_id: input_boolean.alarm_clock
        state: 'on'
      - condition: template
        value_template: '{{ (now().hour|float|multiply(60) + now().minute|float - 480 ) |multiply(60) | timestamp_custom("%H:%M") == states.sensor.relative_alarm_time.state }}'
  action:
    - service_template: >
        {% if is_state('switch.xiaomi_switch_one', 'off') %}
          switch.turn_on
        {% else %}
          switch.turn_off
        {% endif %}
      data:
        entity_id: switch.xiaomi_switch_one
    - service: homeassistant.turn_off
      entity_id: input_boolean.alarm_clock
    

参考

https://bbs.hassbian.com/forum.php?mod=viewthread&tid=1806&highlight=%E5%BB%B6%E6%97%B6
https://community.home-assistant.io/t/solved-automation-in-package-not-working/24768
https://www.home-assistant.io/components/script/
https://www.hachina.io/docs/1848.html