项目介绍
在这次寒假练的活动中,我将Seeed XIAO ESP32S3 Sense通过WIFI接入homeassistant平台,使其作为一个监控模块融入家庭互联网系统中。与此同时,在单纯的监控功能以外,它还支持自动对宠物进行识别。我们可以把它部署在一些不希望宠物进入的区域,例如厨房,或是开方式阳台,当宠物进入该区域并被摄像头捕捉到后,homeassistant可以及时发出手机推送提醒,同时也可触发其他行为,如声音播放,玩具启动等来吸引宠物离开该区域。
硬件介绍
Seeed Studio XIAO 拇指开发板集成了摄像头传感器、数字麦克风和SD卡支持。结合嵌入式ML计算能力和摄影能力,可以成为智能语音和视觉AI的绝佳工具。
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的经典外形,适用于可穿戴设备等空间有限的项目
设计思路
这个项目技术实现一共分为三块。第一块是物联网中枢平台,这里我使用的是部署在Raspberry Pi上的Homeassistant。第二块是Seeed Studio XIAO Sense, 代码是基于ESPhome编写的。ESPhome的服务器也同样架设在Raspberry Pi上。
第三块是AI图像识别,这里使用的是Yolov8进行实现的,代码部署在Raspberry Pi上。识别完成的结果通过MQTT与Homeassistant进行通讯,因此我们还需要在树莓派上部署MQTT Broker。
可以看到在项目中我们在Raspberry Pi上部署了多个服务。为了保证未来的拓展性已经多个服务运行环境之间不互相冲突,因此所有的服务均采用Docker方式进行部署。
具体实现及代码讲解
第一部分,在树莓派上配置各项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文件,并写入Homeassistant,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文件,并用chown和chgrp命令将它的用户和组改为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:
接下来,按住Seeed XIAO ESP32S3 Sense上的BOOT按钮,将它插入PC,然后在弹出的页面中点击连接,选择Seeed XIAO ESP32S3 Sense对应的端口号,点连接。然后将首次使用的固件刷入。
完成后,按一下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"
保存后,点击安装,选择无线方式安装即可。
安装完毕后,我们可以点开log查看下摄像头工作是否正常,如果一切正常,log中会打印出摄像头的地址。接着我们进入Homeassistant,输入树莓派的ip加端口号8123就可以进入,跟着步骤一步一步创建用户就可以。完成初始化后,点击配置然后进入设备与服务,添加ESPhome,填入在ESPhome Dashboard log中看到的IP地址(不带端口号),以及上面提到的API Key,就可以完成配置,完成后就可以在Dashboard中看到我们添加的设备。到这里我们已经成功把Seeed XIAO ESP32S3 Sense接入homeassistant平台,可以作为一个普通监控摄像头使用了。
第三部分,在树莓派上配置Yolov8,并接入homeassistant实现手机报警:
在进入python部分之前,还需要配置一下MQTT,python就是通过MQTT来和homeassistant进行通讯的。与之前步骤一样,点击配置然后进入设备与服务,添加MQTT。
配置信息直接填本机localhost就可以。如果上面有配置过验证信息,需要填入对应的账号密码;如果允许匿名登陆,那么直接下一步就可以。
接下来是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_USERNAME 和
MQTT_PASSWORD 需要设置成None。
代码功能比较简单,分两块内容,一块是基于YOLOV8的图像识别,另一块是与Homeassistant通信的MQTT。
通信的话为了方便Homeassistant自动发现并配置,因此没有使用paho-mqtt来直接发送MQTT,而是使用了一个基于它的库ha_mqtt_discoverable,这个库可以完成Homeassistant的自动配置。我们用这个库创建一个二元传感器,当宠物出现时设置为开启,宠物消失超过3秒钟后设置为关闭。
图像识别是先从Seeed XIAO ESP32S3 Sense的stream中获取帧,进行图像识别,如果识别到的物体中有宠物,那么就开启二元传感器。二元传感器在开启三秒钟后会自动关闭。因此当三秒钟内再次识别到宠物,这个时间会被刷新,当宠物消失超过三秒钟后,二元传感器会关闭。
现在运行代码测试一下,代码运行不久后(这里需要耐心一点,多等几分钟,然后刷新页面),我们应该就可以看到Homeassistant Dashboard中出现了一个名为dog的二元传感器。这时我们把摄像头对准宠物,就可以看到传感器亮了起来;宠物消失三秒钟后,传感器熄灭。
最后我们还需要配置一下自动化,当宠物出现后,跳出手机推送,及时提醒主人。
首先我们需要先把手机接入homeassistant系统。可以在应用商城中直接搜索并下载homeassistant,打开后如果手机和树莓派在同一个路由器下,手机应该会自动发现honeassistant,直接登录就可以。
接着进入homeassistant配置中的自动化与场景,点击右下角创建一个新自动化,在里面添加内容,当实体binary_sensor.dog从关闭变成开启时,执行手机推送通知。
设置好后,我们再测试下让摄像头对着宠物,手机上就会立马弹出推送。
功能展示
目前我只添加了一个自动化,即在出现宠物时自动推送提醒主人。当然这里还可以更加智能一些,比如可以增加其他的外设连接进homeassistant平台,当宠物出现时,这些外设可以通过声音播放,开始动作等来吸引宠物离开该区域。这里我没有再进行演示,因为所有的配置步骤都是一样的,相信看完上面的内容,大家都已经可以自己根据想像力来配置触发的事件。
心得体会
虽然我没有宠物,但我一直在研究如何把家庭物联网变得更加智能一些。这次的项目通过python和homeassistant结合的方法,很大程度上帮我拓宽了思路。通过MQTT这个桥梁,我们几乎可以把任何东西都接入homeassistant中,让家中一切事物都在同一个平台下,做到真正互联互通。
Hackster: https://www.hackster.io/StreakingJerry/a-pet-monitoring-and-alarm-device-based-on-yolov8-0ec76a