前言
在智能家居系统中,人体感应器可以与其他设备如智能插座、智能灯泡等配合使用,通过编程实现更加复杂的自动化场景,如人来灯亮、人走灯灭等,提高居住的便捷性和舒适性。同时,人体感应器也可以作为安防系统的一部分,当感应到异常移动时及时发送警报,保护家庭安全。
实验目的
核桃派HA主机添加人体感应传感器,检测家里是否有人闯入并通知出门在外的你!
实验讲解
人体传感器需要用到HA MQTT组件中的sensor。实验关键是搞清楚发现MQTT设备的主题信息以及控制方法
MQTT主题
下面这个主题用于HA主机通过MQT发现该设备:
homeassistant/sensor/picow_generalconfig
homeassistant
:默认的前缀sensor
: 温度传感器使用的MQTT元件为sensorpicow_general
: 实体的ID,需要唯一,这里自定义的内容,表示核桃派PicoW的人体感应传感器;config
:默认的后缀
MQTT消息
{
"name": "Picow_general",
"state_topic": "homeassistant/sensor/picow_general/contact",
"unique_id": "picow_general",
"device": {
"identifiers": ["Picow_general"],
"name": "Picow_general",
"model": "picow_general",
"manufacturer": "WalnutPi-PicoW"
}
}
实体
"name":"Picow_general"
: 实体名称,自定义填写;"state_topic":"homeassistant/sensor/picow_general/contact"
: 用于注册实体后发布相关属性主题,这里用来发送人体感应传感器状态变化信息,主题内容自定义,保证不同实体的主题不一样即可;"unique_id":"picow_general"
: 实体ID,自定义,务必保证每个实体唯一;
设备
告知HA实体对应的设备。
"identifiers":"picow_x"
: 识别标识符,每个设备唯一,例:picow_1,pico_2 …"name":"picow_x"
: 设备名称,自定义;
更多MQTT sensor内容可查阅官方文档:MQTT Sensor - Home Assistant
代码编写流程如下:
1:导入相关模块
2;构建人体感应传感器对象
3:连接WIFI
4:连接MQTT服务器
5:注册人体感应传感器实体和设备
6:采集人体感应器数据
7:MQTT发送检测到的信息
8:延时1秒再次采集并发送
基于核桃派PicoW实现
本实验使用核桃派PicoW(ESP32-S3)连接人体感应传感器,使用方法参考:核桃派PicoW教程,保证核桃派PicoW和核桃派1B连接到同一3个路由器下即可:
参考代码
'''
实验名称:Home Assistant human
实验平台:核桃派1B 核桃派picow
说明:编程实现Home Assistant 人体检测警报
'''
import machine
import time
from machine import Pin
import network,time
from simple import MQTTClient #导入MQTT板块
from machine import Pin,Timer
LED=Pin(46, Pin.OUT) #初始化WIFI指示灯
#WIFI连接函数
def WIFI_Connect():
global LED
wlan = network.WLAN(network.STA_IF) #STA模式
wlan.active(True) #激活接口
start_time=time.time() #记录时间做超时判断
if not wlan.isconnected():
print('connecting to network...')
wlan.connect('01Studio', '88888888') #输入WIFI账号密码
while not wlan.isconnected():
#LED闪烁提示
LED.value(1)
time.sleep_ms(300)
LED.value(0)
time.sleep_ms(300)
#超时判断,15秒没连接成功判定为超时
if time.time()-start_time > 15 :
print('WIFI Connected Timeout!')
break
if wlan.isconnected():
#LED点亮
LED.value(1)
#串口打印信息
print('network information:', wlan.ifconfig())
return True
else:
return False
#设置MQTT回调函数,有信息时候执行
def MQTT_callback(topic, msg):
print('topic: {}'.format(topic))
print('msg: {}'.format(msg))
if msg == b'ON' :
LED.value(1)
if msg == b'OFF' :
LED.value(0)
#接收数据任务·
def MQTT_Rev(tim):
client.check_msg()
#执行WIFI连接函数并判断是否已经连接成功
if WIFI_Connect():
CLIENT_ID = 'WalnutPi-PicoW' # 客户端ID
SERVER = '192.168.1.1' # MQTT服务器地址
PORT = 1883
USER='pi'
PASSWORD='pi'
client = MQTTClient(CLIENT_ID, SERVER, PORT, USER, PASSWORD) # 建立客户端对象
client.set_callback(MQTT_callback)
client.connect()
# 注册设备
TOPIC = "homeassistant/sensor/picow_general/config"
message = """{
"name": "Picow_general",
"state_topic": "homeassistant/sensor/picow_general/contact",
"unique_id": "picow_general",
"device": {
"identifiers": ["Picow_general"],
"name": "Picow_general",
"model": "picow_general",
"manufacturer": "WalnutPi-PicoW"
}
}"""
client.publish(TOPIC, message)
# 订阅主题
TOPIC = 'homeassistant/sensor/picow_general/config' # 订阅传感器状态的MQTT主题
client.subscribe(TOPIC)
#开启RTOS定时器,编号为1,周期100ms,执行socket通信接收任务
tim = Timer(1)
tim.init(period=100, mode=Timer.PERIODIC,callback=MQTT_Rev)
Human = Pin(10, Pin.IN, Pin.PULL_UP)
last_motion_state = False # 记录上一次检测到的传感器状态
def check_motion_sensor_status():
global last_motion_state
is_motion = Human.value() # 获取人体红外传感器的状态
if is_motion != last_motion_state: # 如果状态发生了改变
last_motion_state = is_motion # 更新当前状态
if is_motion:
print("有人!")
TOPIC = "homeassistant/sensor/picow_general/contact"
client.publish(TOPIC, "2")
else:
print("没人!")
TOPIC = "homeassistant/sensor/picow_general/contact"
client.publish(TOPIC, "0")
# 在主循环中定期检查人体感应器的状态
while True:
check_motion_sensor_status()
time.sleep(1) # 每秒检查一次
实验结果
使用Thonny IDE连接核桃派PicoW开发板,运行上面代码:
运行成功后可以在MQTT集成找到人体感应传感器设备,MQTT找到设备后还需编辑一下自动化:
点开配置页面 再打开自动与场景页面 打开自动化与场景页面
点创建自动化 选择创建新的自动化。
选择添加触发器 实体类型:123数字类状态
设置好触发器条件
添加触发器被触发后执行的操作
编辑好你的通知消息内容
还可以设置时间环境这些 这里就不举例了。
运行效果
可以看到传感器端检测到了人HA系统就给你推了一条通知。