智能家居 篇六:《摸着石头过河》之 智能家居自动化
准备这篇值文已经一个多月了,至今仍末完成。每日偷闲,梳理一下思路,完成一部分内容,日日如此,此文已经没有很强的逻辑性,思路也是天马行空,想到哪就写到哪。
一、为什么要设置自动化
智能设备安装到位之后,我们已经实现了远程控制,可以通过手机APP、语音等多种方式实现对智能设备的控制了。
可是我认为智能家居生活不是仅仅满足于手机控制。我理解的智能应该是按照人的思维、依据家人的生活习惯,在需要开灯的时间和地点,自动点亮对应的灯光。如果没有实现这些简单的场景,就不能称为智能家居生活,不过是把开关控制转移到手机上、智能音箱上,而没有实现真正的智能。
二、自动化原则
其实并没有固定不变的原则,最高的原则就是实现无感操作。打个比方,智能家居运行一段时间后,突然有一天,回家之后,灯没有打开,你却要想一想,才能找到灯的开关。这就说明你的自动化很成功。因为日常生活中,灯的开关已经完全自动化,完全不需要你手动操作。
三、自动化实践思路
实践思路均结合我自己实现的自动化功能,逐一讲解。如有文字表述不清之处,采取流程图展示。
自动化的实现需要2步,第一步触发:就是自动化启动的初始条件,比如:判断家中有人、太阳下山、空气中PM2.5指数超过限定值等等。第二步条件:就是触发后,需要满足哪些条件才能执行。比如:判断家中有人,满足太阳下山条件,才能执行开灯操作。第三步执行:就是执行什么样的操作,比如:开灯、开电视、开净化器等等。第二步可以省略,但如果想让自动化更加准确地符合自己日常生活,减少误触发自动化的情况,就需要在第二步加上一些条件。
需要注意:触发和条件有时候可以交叉使用,但也有明显的区别:触发更突出设备状态发生变化,而条件更突出设备当前的状态是否达到我们设定的要求。
大家可以结合我上篇介绍智能设备分布情况来理解我的自动化实现思路。
在介绍自动化之前需要说明的几点,
一是主卧床头灯、儿童房台灯与各自房间人体传感器联动,并未设置过多的条件和功能,所以不论是哪个场景,基本不涉及床头灯、儿童房台灯的开关。
二是玄关灯只与玄关区人员移动有关。
三是阳台灯未做任何自动化。
四是以下代码区间的代码格式与实际有误,不能直接复制使用,需要重新编排格式。
1、空气净化器
理由:现在空气质量日益恶化,家中备几台空气净化器,至少在家时可以享受到洁净的空气(如果家中安装新风系统的话,也可以了解一下)。净化器自动化之后,家中无人时自动关闭,可以省电、省滤网、省损耗,还省。。。。。。。每个人理解不一样,你觉得还能省什么就能省什么。
思路:(净化器根据PM2.5数值自动开关机)第一步触发,PM2.5检测仪指数高于50,或低于20。第二步条件,家中有人,睡眠模式关闭。第三步执行,执行时加个判断,如果数值高于50,执行开机;如果数值低于20,执行关机。
不足:因为触发是根据PM2.5检测仪数值决定的,如果回家时数值已经高于设定值,空气净化器可能不会执行开机操作。
####### 空气净化器开启 20190303修改 ##
- alias: air_cleaner
initial_state: true #重启HA自动化是开启(true)还是关闭(false)
hide_entity: true #隐藏自动化false
trigger:
- platform: numeric_state
entity_id: sensor.pm25 # PM2.5监测仪
above: 50
- platform: numeric_state
entity_id: sensor.pm25 # PM2.5监测仪
below: 20
condition:
condition: and #并列条件
conditions:
- condition: state
entity_id: group.all_devices #跟踪设备组
state: 'home'
- condition: state # 睡眠模式关闭
entity_id: input_boolean.good_night
state: 'off'
action:
- service_template: "fan.turn_{% if states.sensor.pm25.state | int < 20 %}off{% elif states.sensor.pm25.state | int > 50 %}on{% else %}off{% endif %}" #数值小于20关闭,数值大于50开启,其他数值关闭
entity_id: group.all_fans #净化器
2、玄关灯
理由:入户门口,不管是进门、出门、拿外卖还是迎接客人,都是必经之地。实现有人开灯,人走灯灭,就简化了很多操作。
思路:(玄关灯的开关一个自动化中实现)第一步触发,玄关处的人体传感器状态发生变化。第二步条件,扫地机器人处于休息状态(防止误触)。第三步执行,如果人体传感器(绿米人体传感器含光照度检测)状态为有人且光线低于设定值,执行开灯,如果人体传感器状态为无人,执行关灯。
不足:第一点,如果人在家,扫地机器人又在工作,此时的玄关灯是不会打开的。第二点,米家或绿米的人体传感器均有1分钟休眠期,在此期间,状态是不会变化的,所以灯的开关有延迟。
####### 玄关人体感应器联动玄灯 ##
- alias: light_xuanguan
initial_state: true #重启HA自动化是开启(true)还是关闭(false)
hide_entity: false #隐藏自动化false #
trigger:
- platform: state
entity_id: binary_sensor.motion_sensor_158d0002b6 #玄关 人体传感器
condition:
condition: and
conditions:
- condition: state #扫地机器人休息中
entity_id: vacuum.rockrobo
state: docked
action:
service_template: "switch.turn_{% if (trigger.to_state.state == 'on') and (states.sensor.illumination_158d0002b.state | int < 7 ) and (states.input_boolean.cinema.state == 'off') %}on{% elif trigger.to_state.state == 'off' %}off{% endif %}" # 如果触发状态为开,且光照小于7,且观影模式关,则开灯,如果触发状态为关,则关灯。
entity_id: switch.xuanguan_light #玄关灯
3、打开客餐厅灯
理由:我家的户型是南北通透,客餐厅完全相连的,所以客餐厅是家人日常活动最多的场所,客餐厅的灯光自动化也是日常使用最多的功能。读过我上篇家中设备分布的文章,一定知道,玄关很小,玄关外的空间均处于客厅或餐厅人体传感器的探测范围。所以我的客餐厅灯光自动化也非常简单。
思路:第一步触发,不论客厅里人体传感器还是餐厅人体传感器,状态为有人即触发。第二步条件,共有四个条件,分别是扫地机器人休息,客厅光照度小于设定值(阳光明媚的日子是不需要开灯的),睡眠模式关闭状态,观影模式关闭状态。第三步执行,执行开灯操作。
不足:目前没有明显的缺点和不足,因为家人喜欢明亮的感觉,所以只有家中有人,且光照度不强时,客餐厅的灯光基本都是打开状态。午睡或晚间,启动睡眠模式就可以自动关闭灯光。
###### 客厅人体感应器联动餐厅客厅灯 ####
- alias: light_keting_on
initial_state: true #重启HA自动化是开启(true)还是关闭(false)
hide_entity: false #隐藏自动化false
trigger:
- platform: state
entity_id: binary_sensor.motion_sensor_158d0002c6 # 客厅 人体传感器
to: 'on'
- platform: state
entity_id: binary_sensor.motion_sensor_158d0002c # 厨房 人体传感器
to: 'on'
condition:
condition: and
conditions:
- condition: state #扫地机器人休息中
entity_id: vacuum.rockrobo
state: docked
- condition: numeric_state
entity_id: sensor.illumination_158d0002c6 # 客厅 光线传感器
below: 100 #光照度低于100
- condition: state # 睡眠模式关闭
entity_id: input_boolean.good_night
state: 'off'
- condition: state # 影院模式关闭
entity_id: input_boolean.cinema
state: 'off'
action:
- service_template: "switch.turn_on"
entity_id: switch.ketin_light #客厅灯
- service_template: "switch.turn_on"
entity_id: switch.cantin_light #餐厅灯
4、关闭客餐厅灯
理由:这个功能实现的次数很少。因为只有周末或节假日阳光明媚的日子,这个功能才会执行。阴雨天气、早晚光线不足时,这个功能都是不会启动的。
思路:第一步触发,客厅光照度低于设定值(设定的数值参考冬季有阳光的上午9点左右光照度),第二步条件,可以不设任何条件直接关闭,我为了减少自动化执行次数,加了一个条件,就是客厅灯处于打开状态。第三步执行,关闭客厅灯,我在关闭客厅灯的同时,做了一个判断,如果餐厅人体传感器2分钟内无人移动,同时关闭餐厅灯。
不足:没有实现人来灯开,人走灯灭的场景,主要是因为没有使用人体传感器状态做为关灯的触发点,考虑家人有时躺在沙发上看书、玩手机,并不需要关灯。
####### 客厅光线强关闭客厅灯 ####
- alias: light_keting_off
initial_state: true #重启HA自动化是开启(true)还是关闭(false)
hide_entity: false #隐藏自动化false
trigger:
platform: numeric_state #光照度大于150
entity_id: sensor.illumination_158d0002c6 # 客厅 人体传感器
above: 150
condition:
condition: state
entity_id: switch.ketin_light #客厅灯
state: 'on'
action:
- service_template: "switch.turn_off"
entity_id: switch.ketin_light #客厅灯
- service_template: "switch.turn_{% if as_timestamp(now()) - as_timestamp(states.binary_sensor.motion_sensor_158d0002cb.last_changed) | int > 120 %}off{% else %}on{% endif %}" #如果现在时间-餐厅人体传感器触时间大于120秒,关闭餐厅灯,否则打开餐厅灯。
entity_id: switch.cantin_light
5、睡眠模式
理由:原以为可以全部通过自动化实现灯光控制,但是在实现过程中,还是用到了硬件控制,因为觉得人的控制才是最符合日常生活习惯的。所以梳理睡眠模式思路的时候,还是引入了手动控制。
思路:第一步触发,设置了一个虚拟开关,控制睡眠模式的开启与关闭。因为把睡眠模式的状态放入了各个自动化的条件内,所以只仅把睡眠模式打开做为触发,睡眠模式关闭时,不进行任何操作。第二步条件,没有设置任何条件,因为这个自动化是手动控制,所以不再添加条件。第三步执行,关闭所有灯光,关闭无人区的空气净化器,打开网关灯(小夜灯作用,起夜回房关闭),关闭客厅空调。
不足:需要手动控制,一直没有想到更好的自动启动睡眠模式的思路。
####### 睡眠模式 ##
- alias: mode_sleep_on
initial_state: true #重启HA自动化是开启(true)还是关闭(false)
hide_entity: false #隐藏自动化
trigger:
- platform: state # 虚拟开关
entity_id: input_boolean.good_night #binary_sensor.motion_sensor_158d0002c6
to: 'on'
action:
- service_template: "switch.turn_off"
entity_id: group.switchs #关闭 所有开关组
- service_template: "light.turn_off"
entity_id: group.all_lights #关闭 灯光组
- service_template: "light.turn_on"
data_template:
entity_id: light.gateway_light_7c49e #网关灯
brightness: 100 #控制网关灯亮度
rgb_color: [255,255,255] #控制网关灯 颜色
- service_template: "fan.turn_off"
entity_id: fan.airpro # 关闭客厅净化器
- service: climate.set_operation_mode
data_template:
entity_id: climate.midea
operation_mode: "off" #关闭空调
6、起夜开灯
理由:起夜时,既希望有灯光照明,又不希望光线太强,所以只能使用小夜灯或可变光的灯,我把床头灯改造了,光线很弱的,把网关灯做为客厅的小夜灯,仅使用这两个灯做为夜灯使用。
思路:第一步触发,客厅、餐厅、卫生间、主卧、儿童房任一人体传感器触发。第二步条件,共设置3个条件,分别是扫地机器人休息中,客厅光照度极低(具体数值自己可以多次测试,这个条件可以避免午睡时打开夜灯),睡眠模式启动。第三步执行,打开网关灯,指定亮度和色彩参数。
不足:小米网关灯的开关,不仅仅有开关代码,还需要设置好亮度和色彩值,否则可能会出现打开了开关,但没有光线的现象。
####### 起夜,控制灯 ####
- alias: light_qiyie_on
initial_state: true #重启HA自动化是开启(true)还是关闭(false)
hide_entity: false #隐藏自动化
trigger:
- platform: state
entity_id: binary_sensor.motion_sensor_158d0002c # 卧室人体传感器
to: 'on'
- platform: state
entity_id: binary_sensor.motion_sensor_158d0002c6 # 客厅人体传感器
to: 'on'
- platform: state
entity_id: binary_sensor.motion_sensor_158d0002b6 # 宝宝卧室人体传感器
to: 'on'
- platform: state
entity_id: binary_sensor.motion_sensor_158d0002b7 # 卫生间 人体传感器
to: 'on'
- platform: state
entity_id: binary_sensor.motion_sensor_158d0002cb # 厨房 人体传感器
to: 'on'
condition:
condition: and
conditions:
- condition: state #扫地机器人休息中
entity_id: vacuum.rockrobo
state: docked
- condition: numeric_state
entity_id: sensor.illumination_7c49eb88 #客厅网关 光线,此设备的光线单位为lm,其他设备单位为lx,估数值较大。流明(LM)与勒克斯(LX)
below: 300
- condition: state # 睡眠模式虚拟开关 开启状态
entity_id: input_boolean.good_night
state: 'on'
action:
- service_template: "light.turn_on"
data_template:
entity_id: light.gateway_light_7c49eb8 # 网关灯
brightness: 100
rgb_color: [255,255,255]
7、起夜回房关灯
理由:其实有没有这个自动化,并没有多大影响,因为这个自动关闭的并不是房间的灯光,只是网关灯。本人有强迫症,所以一定要把可以用自动化关闭的设备都关了。
思路:第一步触发,主卧或儿童房人体传感器状态为无人时触发。第二步条件,扫地机器人休息中,睡眠模式打开。第三步执行,关闭网关灯。
不足:因为米家人体传感器的延迟,所以无法实现回房即关,必须等到人体传感器休眠期结束,检测为无人才能启动。
####### 起夜回房 ####
- alias: light_qiyie_off
initial_state: true #重启HA自动化是开启(true)还是关闭(false)
hide_entity: false #隐藏自动化
trigger:
- platform: state
entity_id: binary_sensor.motion_sensor_158d0002c #卧室人体传感器
to: 'off'
- platform: state
entity_id: binary_sensor.motion_sensor_158d0002b6 # 宝宝卧室人体传感器
to: 'off'
condition:
condition: and
conditions:
- condition: state #扫地机器人休息中
entity_id: vacuum.rockrobo
state: docked
- condition: state # 睡眠模式虚拟开关 开启状态
entity_id: input_boolean.good_night
state: 'on'
action:
- service_template: "light.turn_off"
entity_id: light.gateway_light_7c49eb88 # 网关灯
8、取消睡眠模式
理由:启动睡眠模式已经是手动控制了,取消睡眠模式好象也必须用手动才行,刚开始,我也确实没有找到好的解决方案。某天突然灵光一现,思路就出来,于是就有了这个自动取消睡眠模式的自动化,非常方便。
思路:第一步触发,主卧或儿童房的人体传感器状态为有人触发。第二步条件,共有2个条件,一是时间条件,早上6点到下午16点之间。二是睡眠模式开启状态。第三步执行,关闭睡眠模式,关闭网关灯(因为此自动化触发的同时会开启网关灯,如果现在不关网关灯,网关灯会一直亮着)。
不足:在设定的时间之外,睡眠模式就无法关闭,比如某天有事6点之前就起床,睡眠模式就无法关闭,客餐厅灯也无法自动打开。
####### 自动取消睡眠模式 ###
- alias: mode_sleep_off
initial_state: true #重启HA自动化是开启(true)还是关闭(false)
hide_entity: false #隐藏自动化
trigger:
- platform: state
entity_id: binary_sensor.motion_sensor_158d0002c #卧室 人体传感器
to: 'on'
condition:
condition: and
conditions:
- condition: time #设定执行时间段
after: '06:20:00'
before: '16:00:00'
- condition: state # 睡眠模式
entity_id: input_boolean.good_night
state: 'on'
action:
- service_template: "input_boolean.turn_off"
entity_id: input_boolean.good_night
- service_template: "light.turn_off"
entity_id: light.gateway_light_7c49eb88 # 网关灯
9、离家模式
理由:如果出门后,总觉得灯没关,心里就不会踏实。还有空调、空气净化器等设备也不需要再启动了。
思路:第一步触发,家人手机均未连接家中WIFI触发,延迟61秒后检测条件(如果小60秒,可能玄关的人体传感器还处于有人的状态而误判)。第二步条件,家中主要位置的传感器均处于无人状态,客厅或餐厅灯处于开启状态。第三步执行,关闭灯光、空调、空气净化器,启动警戒状态(这是我今后将实现的,暂时没有实现)。
不足:离家模式主要检测家人手机是否处于WIFI连接状态,所以如果只是把手机带出家门,或是断开WIFI连接,也会执行离家模式。
####### 离家模式 ####
- alias: mode_leave_home
initial_state: true #重启HA自动化是开启(true)还是关闭(false)
hide_entity: false #隐藏自动化
trigger:
platform: state
entity_id: group.all_devices # 不在家
to: 'not_home'
for:
seconds: 61 #等待60秒,人体传感器关闭后再执行判断。防止离家后,人体传感器未关闭,不执行自动化。
condition:
condition: and
conditions:
- condition: state
entity_id: binary_sensor.motion_sensor_158d0002c6 #卧室人体传感器
state: 'off'
- condition: state
entity_id: binary_sensor.motion_sensor_158d0002c6 # 客厅人体传感器
state: 'off'
- condition: state
entity_id: binary_sensor.motion_sensor_158d0002b # 宝宝卧室人体传感器
state: 'off'
- condition: state
entity_id: binary_sensor.motion_sensor_158d0002b # 卫生间 人体传感器
state: 'off'
- condition: state
entity_id: binary_sensor.motion_sensor_158d0002c # 厨房 人体传感器
state: 'off'
- condition: or #或者关系
conditions:
- condition: state #客厅灯
entity_id: switch.ketin_light
state: 'on'
- condition: state #餐厅灯
entity_id: switch.cantin_light
state: 'on'
action:
- service_template: "switch.turn_off"
entity_id: group.all_switches #关闭 开关
- service_template: "fan.turn_off"
entity_id: group.all_fans #关闭 净化器
- service: climate.set_operation_mode
data_template:
entity_id: climate.midea
operation_mode: "off"
10、回家模式
理由:回家后,自动打开相应的灯光,根据温度开启空调等等。
思路:第一步触发,玄关人体传感器检测有人触发。第二步条件,除玄关外的其他人体传感器均处于无人状态(人是从玄关进入,且家中无其他人),灯光均处于关闭状态,扫地机器人休息中。第三步执行,首先关闭警戒状态,然后根据光照度情况决定是否打开灯光,根据温度情况决定是否打开空调并确定开启空调何种模式,语音播报家中温度、湿度等信息。
不足:设置完善后,基本没有出现误报现象,只是我用蓝牙音箱做为语音,偶尔会出现蓝牙断开连接,语音功能失效的现象。
####### 回家模式 ###
- alias: mode_get_home
initial_state: true #重启HA自动化是开启(true)还是关闭(false)
hide_entity: false #隐藏自动化
trigger:
- platform: state
entity_id: binary_sensor.motion_sensor_158d0002b # 玄关 人体传感器
to: 'on'
condition:
condition: and
conditions:
- condition: state
entity_id: binary_sensor.motion_sensor_158d0002c #卧室人体传感器
state: 'off'
- condition: state
entity_id: binary_sensor.motion_sensor_158d0002c # 客厅人体传感器
state: 'off'
- condition: state
entity_id: binary_sensor.motion_sensor_158d0002b # 宝宝卧室人体传感器
state: 'off'
- condition: state
entity_id: binary_sensor.motion_sensor_158d0002b # 卫生间 人体传感器
state: 'off'
- condition: state
entity_id: binary_sensor.motion_sensor_158d0002 # 厨房 人体传感器
state: 'off'
- condition: state
entity_id: group.all_lights #所有灯光
state: 'off'
- condition: state
entity_id: group.all_switches # 所有开关
state: 'off'
- condition: state #扫地机器人休息中
entity_id: vacuum.rockrobo
state: docked
action:
- service: climate.set_operation_mode # 控制空调
data_template:
entity_id: climate.midea
operation_mode: "{% if states.sensor.temperature_158d0002b5.state | int < 15 %}heat{% elif 15 <= states.sensor.temperature_158d0002b5.state | int < 30 %}off{% elif states.sensor.temperature_158d0002b5.state | int >= 30 %}cool{% endif %}" # 低于15度制热,高于30度制冷,15-30之间不开空调
- service_template: "automation.turn_off"
entity_id: automation.mode_warning
- service_template: "switch.turn_{% if states.sensor.illumination_158d0002c6.state | int < 100 %}on{% else %}off{% endif %}" # 根据客厅人体传感器的光照度小于100,开客厅、餐厅灯
entity_id: switch.ketin_light,switch.cantin_light #客厅灯
- service: tts.clear_cache #清空语音播报历史文件
- service: tts.baidu_say #启动 语音播报
data_template:
entity_id: media_player.mpd
message: >
"主人,欢迎回家,客厅的温度 {{ states('sensor.temperature_158d0002b') }}度。
{% if states.sensor.temperature_158d0002b5.state | int < 15 %}
今天有点冷,空调已打开。
{% elif 15 <= states.sensor.temperature_158d0002b.state | int < 30 %}
劳累了一天,休息一下吧。
{% elif states.sensor.temperature_158d0002b5.state | int >= 30 %}
今天有点热,空调马上制冷,请稍等。
{% endif %}"
cache: false
11、观影模式
理由:这个功能其实并不重要,只是在家中看电视的时候,不想亮起太强的灯光。这是一个完全手动控制的模式,通过配置虚拟开关实现的。
思路:第一步触发,根据虚拟开关状态变化触发。第二步条件,未设置任何条件。第三步执行,分两个情况,一是如果虚拟开关状态变为开启,则关闭光线较强的客餐厅灯,开启网关灯,30秒后再关闭网关灯。二是如果虚拟开关状态变为关闭,则开启客餐厅灯,关闭网关灯。
不足:纯手动,没有自动化方便。
####### 观影关灯 ####
- alias: mode_cinema
initial_state: true #重启HA自动化是开启(true)还是关闭(false)
hide_entity: false #隐藏自动化
trigger:
- platform: state # 虚拟开关
entity_id: input_boolean.cinema #
action:
- service_template: switch.turn_{% if states.input_boolean.cinema.state == 'off' %}on{% elif states.input_boolean.cinema.state == 'on' %}off{% endif %} #观影模式关闭则打开客厅灯,观影模式开启则关闭客厅灯。
entity_id: switch.ketin_light # 客厅灯
- service_template: switch.turn_{% if states.input_boolean.cinema.state == 'off' %}on{% elif states.input_boolean.cinema.state == 'on' %}off{% endif %} #同客厅灯
entity_id: switch.cantin_light # 餐厅灯
- service_template: light.turn_{% if states.input_boolean.cinema.state == 'off' %}off{% elif states.input_boolean.cinema.state == 'on' %}on{% endif %} #观影模式关闭则关闭网关灯,观影模式开启则开启网关灯。
data_template:
entity_id: light.gateway_light_7c49eb8 #网关灯
brightness: 100
rgb_color: [255,255,255]
- delay: 00:00:30 #延迟30秒
- service_template: light.turn_off #关闭网关灯
data:
entity_id: light.gateway_light_7c49eb
transition: 5 # 灯光转换到新状态所需的时间(以秒为单位)的数字
四、自动化之外的控制
除使用自动化程序之外,还可以使用很多手段控制智能设备。比如:天猫精灵、手机APP等等。网上有很多介绍,我就不再一一赘述。
如果你使用的时苹果手机,可能尝试将系统接入“家庭",然后使用SIRI语音控制,也非常方便。
我只是简单地将一些自动化的思路展示出来,大家可以利用这些思路通过其他的路径实现智能家居的自动化控制,并不要局限于树莓派、HA这些系统。
最后祝大家玩的开心!
辰冰星
校验提示文案
[已注销]
校验提示文案
手微凉
校验提示文案
布依班
校验提示文案
夏昸
校验提示文案
天下第吆
校验提示文案
天下第吆
校验提示文案
天下第吆
校验提示文案
天下第吆
校验提示文案
夏昸
校验提示文案
手微凉
校验提示文案
布依班
校验提示文案
辰冰星
校验提示文案
[已注销]
校验提示文案