HA设置警戒

原来是通过米家设置警戒,也就是从23点到早上6点,要是外门打开,网关就发出狗叫的声音,不过存在一个问题,假如我出差很晚才回到家又忘记关掉警戒,自己一打开外门,大声的狗叫会把家里人吵醒。

因为我经常通过HOME ASSISTANT看看家里的动态,比如门有没有关好之类的,想到HA也有调用网关狗叫的功能,要是通过HA设置网关警戒,那出差的时候就不太会忘记关掉这个警戒功能,而且HA是网页打开,速度快,比起米家应用,方便很多。

先设置警戒开启和结束的时间,在HA的CONFIGURATION里添加以下信息。

input_datetime:
  dog_bark_starts_at:
    name: Input with only time
    has_date: false
    has_time: true
  dog_bark_ends_at:
    name: Input with only time
    has_date: false
    has_time: true

然后增加以下AUTOMATION,要关闭的时候直接在页面上关闭即可。

############################
#外门若在定义的时间内打开,狗叫。
############################
  - alias: dog barks when outdoor opened
    trigger:
      platform: state
      entity_id: binary_sensor.door_window_sensor_158d00027af45c
      from: 'off'
      to: 'on'
    condition:
      - condition: template
        value_template: "{{(states('sensor.time') > (states.input_datetime.dog_bark_starts_at.state[0:5])) and (states('sensor.time') < (states.input_datetime.dog_bark_ends_at.state[0:5]))}}"
    action:
      service: xiaomi_aqara.play_ringtone
      data:
        gw_mac: 7c49eb1d173c
        ringtone_id: 8
        ringtone_vol: 100

ufw导致天猫精灵无法工作

原来是通过路由器做端口映射,这样就可以从其他地方访问家里的home assistant和nas,昨天想到干脆把那台一直开机的Ubuntu机器直接DMZ到外网,然后设置UFW和fail2ban,没想到原来好好的天猫精灵就此出了问题。

在端口映射的情况下,天猫精灵通过oAuth2验证访问家里的home assistant,就可以实现语音控制家里的电器;在DMZ+主机ufw+fail2ban的情况下,天猫精灵死活没办法通过oAuth2验证。

真是奇怪得很,映射下的端口我通过ufw全部开放,没有任何差别,怎么会有这个问题,会不会是ufw有什么问题?

试了另外一个防火墙csf,也是存在同样的问题,开启csf之后精灵oAuth2就没法工作。再仔细想了想,可能是因为home assistant是通过容器安装(docker),docker完全honor宿主机的防火墙策略,导致oAuth2没法工作。

于是开启home assistant的debug模式,再次测试精灵,日志显示http/https有问题,想到我并没有开启80/443的端口(开了也没法外部访问,电信根本就不开这两个端口),于是就让ufw开启80/443试试看,没想到一打开这两个端口,oAuth2就开始工作了。

不经意的错误导致热水器无法开启

我总是把各种软件升级到最新版,前天把HA升级到0.84.6后,昨天回去发现热水器没有按照预设的时间开启关闭,很是奇怪,除了升级之外,我没有做任何的其他调整。

以为input_boolean有什么变化,就一直想在这个方面找原因,搞来搞去,一点效果都没有。

由于纯属业余爱好,当初是怎么把这个开关接入到HA里的,由于没有记录,一下子也想不起来,翻看了配置里的几个文件,才理清了这个热水器开关自动化的思路,发现了问题所在。

由于是用了米家AQARA空调伴侣当作开关,HA并无原生的组件来控制这个开关,因此,第一步我使用了shell_command来打开关闭这个开关。

shell_command:
heater_on: /usr/local/bin/miiocli device --ip 192.168.2.35 --token 203dca9dfd709524ab7d6fd22f026257 raw_command toggle_plug '["on"]'
heater_off: /usr/local/bin/miiocli device --ip 192.168.2.35 --token 203dca9dfd709524ab7d6fd22f026257 raw_command toggle_plug '["off"]'

再来建立一个input_boolean。

heaternew:
name: heaternew
# initial: on
icon: mdi:ceiling-light

之后建立一个automation,在input_boolean划到on时,执行shell_command的heater_on;划到off时,执行heat_off。

#################
#热水器
#################
- alias: Turn on Heater
initial_state: true
trigger:
- platform: state
entity_id: input_boolean.heaternew
to: 'on'
action:
- service: shell_command.heater_on

- alias: Turn off Heater
initial_state: true
trigger:
- platform: state
entity_id: input_boolean.heaternew
to: 'off'
action:
- service: shell_command.heater_off

以上就实现了将米家空调伴侣作为电源开关使用的意图,最后按照实际需要设定开启关闭就简单了。

既然执行input_boolean无法开关电源,那就从检查shell_command开始,在service里调用这个开关的命令,一点问题也没有。那就检查第二步,好了,问题就在这个步骤里,这个automation的初始化状态居然是关闭的,怪不得我怎么操作input_boolean都没有效果,也不知道为什么之前都好好的,这次所有的automation在重新启动后,初始状态全部变为off。

既然如此,那就在automation里添加initial状态为on。

initial_state: true

重新启动ha,打开关闭热水器电源就没问题了。

图形化控制家居

HA有个很好的WEB界面,叫FLOORPLAN,本来也不想搞,觉得大不了就是多点击几下就可以实现效果,后来手痒还是动手把这块给加进来。

在酷家乐找不到现在住的房子的平面图,只好找来一张很模糊的平面图自己用PHTOSHOP把结构给描出来,用推荐的Inkscape免费软件把各种家电添加进去,设置好对象属性,就基本可以控制开关了。

Continue reading 图形化控制家居

Home Assistant设置自动开关灯光

大约两年前把家里控制灯光的开关换成通过博联RM PRO进行射频控制后,尽管可以手机一键开关所有灯光,不过我还是觉得麻烦,一直想做个进出门灯光开关的自动化,不过因为只有一个博联的S1C门磁装在外门,压根无法判断进出方向,因此也就无法根据人进出方向控制灯光的开关。

这次把一台旧的笔记本装上UBUNTU后把Home Assistant也整了进去,把现有的各类智能硬件都集成到HA进行统一控制,而无需在各个硬件制造商的应用间进行切换。考虑到博联S1C门磁放在外门控制不稳定,又买了个小米的网关和门窗传感器,小米的门窗传感器控制外门状态,而博联S1C控制内门状态(博联传感器隔一道内门就很不稳定)。

内外门都安装了门磁,那HA就可以清楚的知道人进出方向。出门时,内门先开(或者处于开的状态,但是要关上),外门先开后关;进门时,外门先开,再开内门,再关外门。

进门的情况很好处理,直接开启灯光。但是在通过内外门的开关顺序判断为出门的情况下,还需要判断家里是否还有人,那就只能通过新买的米家人体传感器(原来博联S1C也有一个人体传感器,摔了几次也很不稳定,只能抛弃不用)来判断,总共布置了5个米家传感器。同时因为传感器的状态改变间隔为2分钟,因此,出门关灯的操作就简单了,1)判断为出门后先延迟3分钟;2)再判断家里的人体传感器是否处于OFF状态,若是,则关闭全部灯光。

包括的硬件有

– 一台旧的的HP笔记本;
– 控制单火的初冠开关面板;
– 米家人体传感器;
– 一个米家门窗传感器;
– 一个博联S1C门窗传感器;
– 米家网关升级版;
– 博联射频控制RM PRO。

之前没有做DDNS和端口转发,HA只能在家里访问,这次这块也做了,实现外网随时随地访问(当然HP笔记本要处于开机状态),顺便安装LETSENCRYPT证书并设置NGINX的反向代理,实现TLS1.3。

附一下Automation配置文件。

 ###############
#回家打开餐厅灯光
###############
  - alias: back_light_on
    trigger:
      platform: state
      entity_id: binary_sensor.door_window_sensor_158d00027af45c
      from: 'off'
      to: 'on'
    condition:
      - condition: template
        value_template: "{% if states.binary_sensor.motion_sensor_158d0002c64383.state == 'off' and states.binary_sensor.motion_sensor_158d0002b5eff8.state == 'off'%}True{% else %}False{% endif %}"
#      - condition: state
#        entity_id: binary_sensor.door_window_sensor_158d000325fbdf
#        state: 'off'
      - condition: time
        after: '17:55:00'
        before: '22:50:00'
    action:
      service: switch.turn_on
      entity_id: switch.canting
###############
#出门后光灯
###############
  - alias: turn_off_when_leaving
    trigger:
      platform: state
      entity_id: binary_sensor.door_window_sensor_158d00027af45c
      from: 'on'
      to: 'off'
      for:
        minutes: 3
    condition: 
      - condition: template
        value_template: "{% if states.binary_sensor.motion_sensor_158d0002c64383.state == 'off'%}True{% else %}False{% endif %}"
      - condition: template
        value_template: "{% if states.binary_sensor.motion_sensor_158d0002b5eff8.state == 'off'%}True{% else %}False{% endif %}"
      - condition: template
        value_template: "{% if states.binary_sensor.motion_sensor_158d0002b5f0ca.state == 'off'%}True{% else %}False{% endif %}"
      - condition: template
        value_template: "{% if states.binary_sensor.motion_sensor_158d0002b5f069.state == 'off'%}True{% else %}False{% endif %}"
#    - condition: template
#        value_template: "{% if states.binary_sensor.motion_sensor_158d00023d7ea5_2.state == 'off'%}True{% else %}False{% endif %}"
#      - condition: template
#        value_template: "{% if states.binary_sensor.motion_sensor_158d0002468737.state == 'off'%}True{% else %}False{% endif %}"
      - condition: state
        entity_id: binary_sensor.door_window_sensor_158d000325fbdf
        state: 'off'
    action:
      service: switch.turn_off
      entity_id: switch.zongkaiguan