流程原理
目前设定一个门,两个传感器,分别叫 A、B 传感器。安装在门的两侧,这个需要装修加持,经我测试,两个传感器之间的间距尽量大于等于10CM,在这距离上会得到比较满意的效果。(这个距离或许后期可以修改固件代码,以固件中的时间为准来判断先后,我只是个新手·····强撸 Arduino····已经灰飞烟灭中·····)
前置需求
- Node-RED 安装 start-up-trigger 作用是 nodered 启动时候可以运行一次
sensor_list
的设置
- 建议修改 Node-RED 的 setting.js 文件中 contextStorage 的选项,将其修改为本地存储,防止重启后丢失人数。
contextStorage: {
default: {
module: "localfilesystem"
}
}
适用范围
本流程支持所有二元传感器,安装于区域边界处,人经过两个传感器产生时间差,利用时间差来判断人行动的方向,从而达到计数的目的。
距离传感器可以通过设定阀值(threshold)来区分二元状态。距离低于阀值是ON,距离高于阀值是OFF。
我尝试过的传感器有
AM312
- 优点:范围广,容易触发
- 缺点:因封锁时间3秒,人进入区域后至少3秒才能亮灯所以放弃使用,不能无视宠物
红外对管
- 优点:准确性很高,速度很快。
- 缺点:安装麻烦,必须门框开洞,对安装高度也有要求。
VL53L0X
- 优点:仅需安装在顶部,传感器体积小,功耗低,最快检测速度极快20ms每次,如果侧装间距可以最少3CM间距。可以无视宠物。
- 缺点:检测范围比较小,只能在传感器正面的地方才能检测)
情况模拟
人从 A 区域走向 B区域,A B 传感器的触发顺序应该是这样的。
# 第一种可能:
Sensor A:---ON---OFF---
Sensor B:------ON---OFF---
# 第二种可能:
Sensor A:---ON---OFF------------
Sensor B:------------ON---OFF---
人从 A 区域走向 B 区域,再折返,最后走回 A 区域离开,A B 传感器的触发顺序应该是这样的。
# 第一种可能:
Sensor A:---ON-----------OFF---
Sensor B:------ON---OFF--------
# 第二种可能:
Sensor A:---ON-------OFF----ON-----OFF----
Sensor B:------------ON---OFF-------------
- A传感器先 ON,触发流程,流程《02-保留传感器时间》,根据发送过来的 mqtt topic 来确定传感器名称,传感器方向(是外面的传感器,还是里面的传感器),同时也将当前发送过来的传感器 payload和触发时间存到全局 Flow 上下文中,方便后方循环流程调用。
- 来到《03-流程控制》,将 Flow 全局上下文中的 sensor.[传感器名字].flow_states.states 设置为
true
声明整个识别流程开始,当流程触发之后,同一组的传感器变化不会再向下触发,除非这组传感器的状态是 false
。
- 来到《04-人数确定流程》,这个流程是一个循环流程,一直循环检查 flow 全局上下文中的传感器状态分为三个状态。
- Wait ON 状态:该状态是指触发者ON之后,等待另外一个传感器也为ON,因为当两个传感器都ON之后,才算人越过区域边界,如果在wait ON 状态下 wait_on_timeout(4秒) 后,还没等来另外一个传感器 ON,那么代表可能传感器误触,或者是人在门口路过。
- Wait OFF 状态:该状态是指两个传感器都曾经ON过,注意是曾经,而不是同时ON,因为有可能两个传感器安装的距离相对远,触发的传感器OFF后,另一个传感器还没来得及ON,我叫这个叫 ALL ON 状态,确保 ALL ON 状态存在,才能判断人的方向。而 Wait OFF状态 就是为了防止人一直站在门口,只有在传感器都OFF的情况下(ALL OFF 状态),才进行方向判断。
- 当满足 ALL ON 状态 和 ALL OFF 状态 之后,再根据最后一次的 OFF 时间来判断,谁最晚OFF,代表人从哪个方向离开。
使用方法
1. Mqtt Topic 格式规范
这里规定所有的mqtt格式必须为:类别/传感器名字最好用地理表示/传感器方向
例如:
类别 |
传感器名称 |
传感器方向 |
VL53L0X |
sufang_vl53l0x |
sensor2 |
VL53L0X |
sufang_vl53l0x |
sensor1 |
2. 全局变量 sensor_list 编写说明
传感器名字必须为mqtt的第二个横杠名字一样,例如 VL53LX/dating_vl53l0x/sensor1
- sensor_name: 传感器名称
- in: 进入区域对象
- direction_sensor: 进入方向传感器(例如:"POWER1")
- ppl_name: 进入区域后增加人数的计数器变量名(例如:"dating_zone_ppl_num")
- out: 离开区域对象
- direction_sensor: 出口方向传感器(例如:"POWER2")
- ppl_name: 进入区域后减少人数的计数器变量名(例如:"fanting_zone_ppl_num")
- threshold:阀值 (参考配置:2000),此选项根据自己的安装高度决定大小,距离低于阀值是ON,距离高于阀值是OFF。
const sensor_list = {
// 传感器名字必须为mqtt的第二个横杠名字一样,例如 VL53LX/dating_duishe/POWER1
"dating_duishe":{
"in":{
"direction_sensor":"POWER1",
"ppl_name":"dating_zone_ppl_num"
},
"out":{
"direction_sensor":"POWER2",
"ppl_name":"fanting_zone_ppl_num"
}
},
"dating_vl53l0x":{
"in":{
"direction_sensor":"sensor2",
"ppl_name":"dating_zone_ppl_num"
},
"out":{
"direction_sensor":"sensor1",
"ppl_name":"fanting_zone_ppl_num"
},
"threshold":2000 // 设置区分 ON 还是 OFF 的阀值,VL53L0X特有
},
"sufang_vl53l0x":{
"in":{
"direction_sensor":"sensor2",
"ppl_name":"book_zone_ppl_num"
},
"out":{
"direction_sensor":"sensor1",
"ppl_name":"fanting_zone_ppl_num"
},
"threshold":2000 // 设置区分 ON 还是 OFF 的阀值,VL53L0X特有
}
}
3. 其他参数设置
日志参数(log_setting)
- level:
- debug:输出所有日志。
- info:输出系统运行信息如当前人数,none:不输出日志。
- log_dir:设置日志在nodered中的输出路径,如果是hassio,请设置 /config 作为路径开头以方便持久化
- log_file_out_pin: 设置 file_out 节点在本节点的哪一个输出口
const log_setting = {
"level":"debug",
"log_dir":"/config/rensu_log/",
"log_file_out_pin":2
}
子流程《人数变更》
说明
每0.2秒检查一次 Global context 的 number 对象,当对象发生变化时向 outpu 发送变化的计数器对象。
参数说明
- topic: 计数器名字
- last_number: 之前的值
- payload: 当前值
VL53L0X 接线图
固件代码内XSHUT端口请按照自己 8266 连接修改GPIO。默认是 GPIO 2 和 GPIO 16
Home-Assistant 配置文件
input_number:
book_zone_ppl_num:
name: 'book_zone_ppl_num'
initial: 0
min: 0
max: 10
step: 1
fanting_zone_ppl_num:
name: 'fanting_zone_ppl_num'
initial: 0
min: 0
max: 10
step: 1
dating_zone_ppl_num:
name: 'dating_zone_ppl_num'
initial: 0
min: 0
max: 10
step: 1
homeassistant:
customize:
input_number.fanting_zone_ppl_num:
friendly_name: '饭厅人数'
homebridge_hidden: false
icon: mdi:run
input_number.book_zone_ppl_num:
friendly_name: '书房人数'
homebridge_hidden: false
icon: mdi:run
input_number.dating_zone_ppl_num:
friendly_name: '大厅人数'
homebridge_hidden: false
icon: mdi:run
group:
zone_ppl_num:
view: yes
name: '人数检测'
entities:
- input_number.book_zone_ppl_num
- input_number.fanting_zone_ppl_num
- input_number.dating_zone_ppl_num
- light.book_room_008ca801
- light.chufang
- light.dt_light_008c3a69_ch1
- light.dt_light_008c3a69_ch2
- light.dt_light_008c3a69_ch3