找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

759

积分

0

好友

99

主题
发表于 15 小时前 | 查看: 0| 回复: 0

本项目将Seeed XIAO ESP32S3 Sense通过WIFI接入Home Assistant平台,使其作为一个监控模块融入家庭物联网系统中。与此同时,在单纯的监控功能以外,它还支持自动对宠物进行识别。我们可以把它部署在一些不希望宠物进入的区域,例如厨房,或是开放式阳台,当宠物进入该区域并被摄像头捕捉到后,Home Assistant可以及时发出手机推送提醒,同时也可触发其他行为,如声音播放,玩具启动等来吸引宠物离开该区域。

1 硬件介绍

Seeed Studio XIAO 拇指开发板集成了摄像头传感器、数字麦克风和SD卡支持。结合嵌入式ML计算能力和摄影能力,可以成为智能语音和视觉AI的绝佳工具。

Seeed Studio XIAO-ESP32-S3 Sense开发板引脚布局图

Seeed Studio XIAO 拇指开发板的特点如下:

  • 强大的MCU板: 采用ESP32S3 32位双核Xtensa处理器芯片,运行频率高达240 MHz,安装多个开发端口,支持Arduino/MicroPython;
  • 高级功能 (用于Sense): 可拆卸的OV2640相机传感器,分辨率为1600*1200,与OV5640相机传感器兼容,内置额外的数字麦克风;
  • 精心设计的电源:锂电池充电管理功能,提供4种功耗模式,可实现低至14μA的深度睡眠模式;
  • 拥有更多可能性的美好记忆: 提供8MB PSRAM和8MB FLASH,支持用于外部32GB FAT内存的SD卡插槽;
  • 出色的射频性能: 支持2.4GHz Wi-Fi和BLE双无线通信,连接U.FL天线时支持100m+远程通信;
  • 拇指大小的紧凑型设计:21x17.5mm,采用XIAO的经典外形,适用于可穿戴设备等空间有限的项目。

2 设计思路

这个项目技术实现一共分为三块。第一块是物联网中枢平台,这里我使用的是部署在Raspberry Pi上的Home Assistant。第二块是Seeed Studio XIAO Sense,代码是基于ESPHome编写的。ESPHome的服务器也同样架设在Raspberry Pi上。

第三块是AI图像识别,这里使用的是YOLOv8进行实现的,代码部署在Raspberry Pi上。识别完成的结果通过MQTT与Home Assistant进行通讯,因此我们还需要在树莓派上部署MQTT Broker。

可以看到在项目中我们在Raspberry Pi上部署了多个服务。为了保证未来的拓展性已经多个服务运行环境之间不互相冲突,因此所有的服务均采用Docker方式进行部署。

系统硬件与软件架构流程图

3 具体实现及代码讲解

第一部分:在树莓派上配置各项Docker服务

先在树莓派安装最新的64位系统,然后安装Docker:

# Add Docker‘s official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装好后,我们新建一个docker-compose.yml文件,并写入Home Assistant,ESPHome,Mosquitto的部署信息:

version: '3'

services:
  homeassistant:
    image: ghcr.io/home-assistant/home-assistant:stable
    container_name: homeassistant
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /run/dbus:/run/dbus:ro
      - /home/hao/docker/homeassistant/config:/config
    privileged: true
    network_mode: host
    restart: unless-stopped

  esphome:
    image: ghcr.io/esphome/esphome
    container_name: esphome
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /home/hao/docker/esphome/config:/config
    environment:
      - USERNAME=admin
      - PASSWORD=admin
    privileged: true
    network_mode: host
    restart: unless-stopped

  mosquitto:
    image: eclipse-mosquitto
    container_name: mosquitto
    ports:
      - 1883:1883
      - 9001:9001
    volumes:
      - /home/hao/docker/mosquitto/mosquitto/config:/mosquitto/config
      - /home/hao/docker/mosquitto/mosquitto/data:/mosquitto/data
      - /home/hao/docker/mosquitto/mosquitto/log:/mosquitto/log
    restart: unless-stopped

上面文件中保存volumes的位置可以按照各自的需要来自行修改。完成后运行 sudo docker compose up -d 后,等待运行完成,三个服务就已经在运行中了。

但这里需要多做一步,我们进入mosquitto的volume目录中的config文件夹,如果里面是空的话,需要手动在里面创建一个mosquitto.conf文件,并用chownchgrp命令将它的用户和组改为1883。然后我们在这个文件中写入以下内容:

allow_anonymous true
listener 1883
# password_file /mosquitto/config/auth.pwd

完成后重启mosquitto container,就可以正常使用。如果希望有密码保护,那么先使用以下命令进入该容器:

sudo docker exec -it mosquitto /bin/sh

进去后使用以下命令创建一个名为admin的用户,根据提示输入密码即可。

mosquitto_passwd -c "/mosquitto/config/auth.pwd" admin

完成后,把刚才的mosquitto.conf中的allow_anonymous 改成false,然后把最后一句注释取消就可以了。

第二部分:在Seeed XIAO ESP32S3 Sense上配置ESPHome

在找一台和树莓派在同一路由器下的PC,打开浏览器,输入树莓派的ip地址及端口号6052,就可以进入ESPHome的配置界面。

在这个界面中,我们选择左下角的添加新设备,然后选使用ESPHome WEB:

ESPHome仪表板界面,提示新设备需USB连接

接下来,按住Seeed XIAO ESP32S3 Sense上的BOOT按钮,将它插入PC,然后在弹出的页面中点击连接,选择Seeed XIAO ESP32S3 Sense对应的端口号,点连接。然后将首次使用的固件刷入。

ESPHome Web界面,提示连接ESP32/ESP8266设备

ESPHome设备首次使用配置弹窗

完成后,按一下Seeed XIAO ESP32S3 Sense上的Reset按钮,回到ESPHome Dashboard界面,按右下角的添加新设备,这次选继续,然后跟随引导一步一步完成。完成后就可以看到ESPHome Dashboard上出现了一个设备,点击编辑,添加以下代码:

esphome:
  name: xiaos3-cam
  friendly_name: xiaos3_cam

  # PlatformIO build options
  platformio_options:
    build_flags: -DBOARD_HAS_PSRAM
    board_build.arduino.memory_type: qio_opi
    board_build.f_flash: 80000000L
    board_build.flash_mode: qio

esp32:
  board: seeed_xiao_esp32s3
  variant: esp32s3
  framework:
    type: arduino
    version: latest
    platform_version: 6.5.0

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "xxxxxxxxxxxxxxxxxxx"

ota:
  password: !secret password

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Xiaos3-Cam Fallback Hotspot"
    password: !secret password

captive_portal:

# Configuration for the status LED light
light:
  - platform: status_led
    id: light0
    name: "Xiao S3 State"
    pin:
      number: GPIO21
      inverted: true

# Configuration for the binary sensor (Boot Switch)
binary_sensor:
  - platform: gpio
    pin:
      number: GPIO2
      mode:
        input: true
        pullup: true
    name: Boot Switch
    internal: true
    on_press:
      # - voice_assistant.start:
      - light.turn_off: light0
    on_release:
      # - voice_assistant.stop:
      - light.turn_on: light0

# Configuration for the ESP32 Camera
esp32_camera:
  id: espcam
  name: My Camera
  external_clock:
    pin: GPIO10
    frequency: 20MHz
  i2c_pins:
    sda: GPIO40
    scl: GPIO39
  data_pins: [GPIO15, GPIO17, GPIO18, GPIO16, GPIO14, GPIO12, GPIO11, GPIO48]
  vsync_pin: GPIO38
  href_pin: GPIO47
  pixel_clock_pin: GPIO13
  resolution: 1280x1024

# Configuration for the ESP32 Camera Web Server
esp32_camera_web_server:
  - port: 8080
    mode: stream
  - port: 8081
    mode: snapshot

代码中的api key部分应该在打开文件时就有自动生成的,这里需要替换为原本就自动生成好的key。

保存后点击右上角的Secrets,写入下面的密码信息,并按实际情况修改:

# Wi-Fi SSID and password
wifi_ssid: "ssid"
wifi_password: "password"
# Authentication
user: "admin"
password: "admin"

保存后,点击安装,选择无线方式安装即可。

ESPHome设备安装方式选择界面

安装完毕后,我们可以点开log查看下摄像头工作是否正常,如果一切正常,log中会打印出摄像头的地址。接着我们进入Home Assistant,输入树莓派的ip加端口号8123就可以进入,跟着步骤一步一步创建用户就可以。完成初始化后,点击配置然后进入设备与服务,添加ESPHome,填入在ESPHome Dashboard log中看到的IP地址(不带端口号),以及上面提到的API Key,就可以完成配置,完成后就可以在Dashboard中看到我们添加的设备。到这里我们已经成功把Seeed XIAO ESP32S3 Sense接入Home Assistant平台,可以作为一个普通监控摄像头使用了。

Home Assistant配置界面

Home Assistant添加集成界面,选择ESPHome

Home Assistant仪表板,显示摄像头设备状态

第三部分:在树莓派上配置YOLOv8,并接入Home Assistant实现手机报警

在进入Python部分之前,还需要配置一下MQTT,Python就是通过MQTT来和Home Assistant进行通讯的。与之前步骤一样,点击配置然后进入设备与服务,添加MQTT。

Home Assistant添加集成界面,选择MQTT

配置信息直接填本机localhost就可以。如果上面有配置过验证信息,需要填入对应的账号密码;如果允许匿名登陆,那么直接下一步就可以。

MQTT服务器连接配置界面

接下来是Python部分。最新版本的Raspbian已经不允许直接在系统Python环境下安装pip包,因此需要先用Python venv来创建一个虚拟环境,然后安装需要的库:

pip install ultralytics
pip install ha-mqtt-discoverable

然后创建一个Python文件,写下以下代码:

from ultralytics import YOLO
from ha_mqtt_discoverable import Settings
from ha_mqtt_discoverable.sensors import BinarySensor, BinarySensorInfo

CAM_URL = "http://xiaos3_ip:8080"
MQTT_USERNAME = "admin"
MQTT_PASSWORD = "admin"

mqtt_settings = Settings.MQTT(
    host="localhost", username=MQTT_USERNAME, password=MQTT_PASSWORD
)
sensor_info = BinarySensorInfo(name="dog", off_delay=3)
mysensor = BinarySensor(Settings(mqtt=mqtt_settings, entity=sensor_info))

model = YOLO("yolov8n.pt")
results = model.predict(CAM_URL, stream=True, show=False, conf=0.5)
# loop
for result in results:
    for box in result.boxes:
        class_id = result.names[box.cls[0].item()]
        cords = box.xyxy[0].tolist()
        cords = [round(x) for x in cords]
        confi = round(box.conf[0].item(), 2)
        print("Object type:", class_id)
        print("Coordinates:", cords)
        print("Probability:", confi)
        print("---")
        if class_id == "dog":
            mysensor.on()

最上面的三行参数需要按照自己实际的情况来配置。如果MQTT broker设置成允许匿名访问的话,MQTT_USERNAMEMQTT_PASSWORD 需要设置成None

代码功能比较简单,分两块内容,一块是基于YOLOv8的图像识别,另一块是与Home Assistant通信的MQTT。

通信的话为了方便Home Assistant自动发现并配置,因此没有使用paho-mqtt来直接发送MQTT,而是使用了一个基于它的库ha_mqtt_discoverable,这个库可以完成Home Assistant的自动配置。我们用这个库创建一个二元传感器,当宠物出现时设置为开启,宠物消失超过3秒钟后设置为关闭。

图像识别是先从Seeed XIAO ESP32S3 Sense的stream中获取帧,进行图像识别,如果识别到的物体中有宠物,那么就开启二元传感器。二元传感器在开启三秒钟后会自动关闭。因此当三秒钟内再次识别到宠物,这个时间会被刷新,当宠物消失超过三秒钟后,二元传感器会关闭。

现在运行代码测试一下,代码运行不久后(这里需要耐心一点,多等几分钟,然后刷新页面),我们应该就可以看到Home Assistant Dashboard中出现了一个名为dog的二元传感器。这时我们把摄像头对准宠物,就可以看到传感器亮了起来;宠物消失三秒钟后,传感器熄灭。

系统运行效果图:摄像头画面与手机App报警界面

最后我们还需要配置一下自动化,当宠物出现后,跳出手机推送,及时提醒主人。

首先我们需要先把手机接入Home Assistant系统。可以在应用商城中直接搜索并下载Home Assistant,打开后如果手机和树莓派在同一个路由器下,手机应该会自动发现Home Assistant,直接登录就可以。

手机端Home Assistant应用界面

接着进入Home Assistant配置中的自动化与场景,点击右下角创建一个新自动化,在里面添加内容,当实体binary_sensor.dog从关闭变成开启时,执行手机推送通知。

Home Assistant自动化配置主界面

Home Assistant自动化配置触发器设置界面

Home Assistant自动化配置动作设置界面

设置好后,我们再测试下让摄像头对着宠物,手机上就会立马弹出推送。

手机锁屏界面显示的预警通知

4 功能展示

目前我只添加了一个自动化,即在出现宠物时自动推送提醒主人。当然这里还可以更加智能一些,比如可以增加其他的外设连接进Home Assistant平台,当宠物出现时,这些外设可以通过声音播放,开始动作等来吸引宠物离开该区域。这里我没有再进行演示,因为所有的配置步骤都是一样的,相信看完上面的内容,大家都已经可以自己根据想像力来配置触发的事件。

系统整体运行场景展示图

5 心得体会

虽然我没有宠物,但我一直在研究如何把家庭物联网变得更加智能一些。这次的项目通过Python和Home Assistant结合的方法,很大程度上帮我拓宽了思路。通过MQTT这个桥梁,我们几乎可以把任何东西都接入Home Assistant中,让家中一切事物都在同一个平台下,做到真正互联互通。

将设备接入、人工智能识别与运维部署结合,是当前实现智能应用的一种高效路径。如果你对这类软硬件结合的物联网项目感兴趣,欢迎来云栈社区交流分享更多想法和实践。

Hackster: https://www.hackster.io/StreakingJerry/a-pet-monitoring-and-alarm-device-based-on-yolov8-0ec76a




上一篇:AVS3 RDOQ算法并行化与全流水线架构设计,实现8K@89fps高吞吐量
下一篇:从MyBatis到dbVisitor:重塑DAL层,一套API统一多数据库操作
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-25 21:40 , Processed in 0.407214 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表