【Home Assistant】人体检测警报

前言

在智能家居系统中,人体感应器可以与其他设备如智能插座、智能灯泡等配合使用,通过编程实现更加复杂的自动化场景,如人来灯亮、人走灯灭等,提高居住的便捷性和舒适性。同时,人体感应器也可以作为安防系统的一部分,当感应到异常移动时及时发送警报,保护家庭安全。

实验目的

核桃派HA主机添加人体感应传感器,检测家里是否有人闯入并通知出门在外的你!

实验讲解

人体传感器需要用到HA MQTT组件中的sensor。实验关键是搞清楚发现MQTT设备的主题信息以及控制方法

MQTT主题

下面这个主题用于HA主机通过MQT发现该设备:

homeassistant/sensor/picow_generalconfig
  • homeassistant:默认的前缀
  • sensor: 温度传感器使用的MQTT元件为sensor
  • picow_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系统就给你推了一条通知。

1 Like