树莓派+SIOT+掌控板联动Yeelight:物联网与AI入门实战
1. 项目概述当智能灯泡遇上开源硬件“让Yeelight亮起来”这个标题听起来简单直接但背后串联的是一套非常经典的物联网IoT与人工智能AI入门实践。它不是一个孤立的开关灯操作而是一个融合了树莓派Raspberry Pi作为边缘计算大脑、SIOT一个轻量级本地MQTT服务器作为数据中枢、掌控板或类似MicroPython开发板作为交互终端最终实现对Yeelight智能灯泡进行智能化控制的完整项目链路。这个项目之所以吸引人是因为它几乎涵盖了从设备端、网络通信、服务器到应用逻辑的所有物联网核心环节并且用相对低成本、易上手的硬件实现了从想法到实物联动的全过程。对于初学者而言它是一张绝佳的“地图”带你走过物联网开发的典型路径对于有经验的开发者它则是一个快速验证想法、搭建原型的优秀框架。项目的核心价值在于“联动”与“智能化”我们不仅要实现用代码控制灯泡开关、调色更要探索如何通过本地AI分析如图像识别、语音识别或传感器数据来动态地、自动地改变灯光状态从而创造出有实际意义的场景比如根据环境光线自动补光、识别到有人进入房间自动开灯、或者根据电脑屏幕内容同步灯光氛围等。接下来我们就从设计思路开始一步步拆解如何让这套系统真正“亮”起来。2. 项目整体设计与核心思路拆解2.1 技术栈选型与角色分工为什么是“树莓派 SIOT 掌控板 Yeelight”这个组合每一环都有其不可替代的作用和选型理由。树莓派Raspberry Pi在本项目中它扮演着边缘服务器与AI计算单元的角色。选择树莓派而非直接用电脑是因为它功耗低、可24小时运行、带有GPIO引脚可连接更多传感器且是一个完整的Linux系统能运行Python、Node.js等丰富的生态软件。它的核心任务包括1) 运行SIOT MQTT服务器作为所有设备通信的“邮局”2) 运行AI推理程序如使用OpenCV、TensorFlow Lite进行图像识别产生控制指令3) 作为逻辑处理中心编写规则引擎例如当收到来自掌控板的“光线暗”消息时向Yeelight发送“开灯”指令。SIOTSimple IoT这是一个由国内老师开发、专为教育场景优化的本地MQTT服务器软件。选择SIOT而非直接使用公共MQTT Broker如EMQX或云服务如阿里云IoT主要基于三点考虑数据隐私与网络独立性所有数据在本地网络流转无需上传互联网响应速度极快且不怕外网中断。简单易用它提供了清晰的Web管理界面可以直观地看到设备、主题和消息极大降低了MQTT的学习和调试门槛。教育生态契合它与掌控板、Mind等软硬件工具集成良好文档和社区支持针对教学场景。掌控板或ESP32/Arduino它作为物理世界交互与数据采集终端。掌控板集成了麦克风、光线传感器、触摸按键等非常适合快速搭建交互原型。它的任务是采集环境数据如环境光强度或接收用户输入如按键然后通过Wi-Fi将数据以MQTT协议发布到SIOT的指定主题。选择它是因为其内置的MicroPython支持MQTT库开发效率高。当然你也可以用更通用的ESP32开发板实现相同功能。Yeelight智能灯泡这是最终的执行器与呈现终端。Yeelight提供了完善的局域网控制协议LAN Control和丰富的SDK允许我们通过本地网络直接发送指令来控制它无需经过Yeelight官方云服务器这保证了控制的低延迟和稳定性。它是本项目智能化结果的直观体现。整个系统的数据流可以概括为感知/交互掌控板 - 消息中转SIOT/MQTT - 逻辑处理/AI计算树莓派 - 执行反馈Yeelight。这是一个典型的发布/订阅Pub/Sub模型松耦合的设计让每个模块都可以独立开发和替换。2.2 系统架构与通信流程设计基于上述技术栈我们设计如下系统架构[ 物理世界 ] 掌控板光线传感器/按键 --(Wi-Fi / MQTT Publish)-- | V [ 通信层 ] SIOT (运行在树莓派上监听主题如 sensor/light) | V [ 逻辑层 ] 树莓派上的Python服务订阅 sensor/light 进行逻辑判断或AI推理 | V [ 执行层 ] 树莓派上的Python服务 --(Yeelight LAN协议)-- Yeelight灯泡核心通信主题设计示例sensor/light 掌控板发布环境光传感器数值。cmd/yeelight 树莓派或其他设备向Yeelight发送控制命令如{power: on, brightness: 80}。ai/result 树莓派AI程序发布识别结果如{person_detected: true}。关键设计考量本地化优先所有关键通信设备-SIOT 树莓派-Yeelight均在局域网内完成确保响应速度和可靠性避免云服务延迟或不可用带来的影响。MQTT主题规划主题命名遵循设备类型/设备ID/数据项或功能/目标的清晰结构便于管理和订阅。例如多个掌控板可以发布到sensor/light/board1和sensor/light/board2。树莓派的核心作用树莓派上的Python脚本是“大脑”。它需要同时扮演多个角色MQTT客户端订阅和发布、Yeelight控制器、AI推理引擎。建议使用异步库如asyncio或多线程来避免阻塞确保系统能同时响应多个事件。3. 核心组件配置与实操要点3.1 树莓派基础环境与SIOT部署首先确保你的树莓派已经安装好Raspbian或Ubuntu系统并连接到本地Wi-Fi网络。步骤一安装SIOTSIOT的安装极其简单。通常它是一个用Java或Go编写的独立可执行文件。从SIOT的官方Git仓库或发布页面下载最新版本的程序包如siot-linux-arm用于树莓派。通过终端SSH或直接连接进入树莓派将下载的文件上传到某个目录例如/home/pi/siot。赋予执行权限chmod x siot。直接运行./siot。首次运行可能会自动生成配置文件。在相同局域网的电脑浏览器上访问http://树莓派IP:8080即可看到SIOT的Web管理界面。默认用户名和密码通常是siot/siot。注意为了让SIOT在树莓派开机时自动启动可以将其配置为系统服务。创建一个systemd服务文件如/etc/systemd/system/siot.service在其中指定执行路径和工作目录然后使用sudo systemctl enable siot启用即可。步骤二安装Python依赖树莓派需要安装与Yeelight通信和MQTT客户端相关的Python库。pip install yeelight paho-mqtt如果需要做AI图像识别还需安装OpenCV和TensorFlow Lite运行时。sudo apt-get update sudo apt-get install python3-opencv pip install tflite-runtime3.2 Yeelight智能灯泡的局域网配置与控制原理这是项目能否成功的关键一步。Yeelight灯泡必须开启“局域网控制”功能才能接受来自本地网络的指令。在米家App中开启开发者模式打开米家App找到你的Yeelight灯泡。进入灯泡设置找到“关于”或“更多设置”。连续点击“固件版本”或某个特定区域多次通常是5-10下直到出现“开发者模式”或“局域网控制”已开启的提示。发现设备 开启后灯泡会在局域网内广播自己的存在。我们可以在树莓派上使用Python进行发现import yeelight # 发现同一局域网内的Yeelight设备 bulbs yeelight.discover_bulbs() for bulb in bulbs: print(fIP: {bulb[ip]}, ID: {bulb[id]}, 型号: {bulb[capabilities][model]})记下灯泡的IP地址这是后续控制的基础。基础控制代码示例from yeelight import Bulb bulb_ip 192.168.1.100 # 替换为你的灯泡IP bulb Bulb(bulb_ip) # 开/关灯 bulb.turn_on() bulb.turn_off() # 调节亮度 (1-100) bulb.set_brightness(50) # 调节色温 (1700-6500K) bulb.set_color_temp(4000) # 调节RGB颜色 bulb.set_rgb(255, 0, 0) # 红色Yeelight Python库提供了非常直观的API控制逻辑清晰易懂。实操心得有时发现设备会失败。请确保手机和树莓派连接在同一个Wi-Fi网络段例如不能一个连2.4G一个连5G如果路由器设置了网络隔离。如果还是找不到可以尝试在路由器后台查看已连接设备的IP列表Yeelight的设备名通常包含“yeelight”字样。3.3 掌控板的数据采集与MQTT发布以掌控板使用Mind或Mu编辑器编程为例我们需要编写MicroPython代码来读取传感器并发布MQTT消息。连接Wi-Fiimport network import time ssid 你的Wi-Fi名称 password 你的Wi-Fi密码 wlan network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): print(正在连接网络...) wlan.connect(ssid, password) while not wlan.isconnected(): time.sleep(1) print(网络配置:, wlan.ifconfig())配置MQTT并发布数据from umqtt.simple import MQTTClient import mpu6050 # 假设使用MPU6050传感器需导入对应库 import time # SIOT服务器地址和端口 SIOT_SERVER 192.168.1.50 # 树莓派IP SIOT_PORT 1883 CLIENT_ID 掌控板_01 TOPIC sensor/light # 发布主题 # 初始化MQTT客户端 client MQTTClient(CLIENT_ID, SIOT_SERVER, portSIOT_PORT) client.connect() # 初始化传感器 # light_sensor ... 根据实际传感器型号初始化 while True: # 读取光线传感器值示例需根据实际传感器调整 # light_value light_sensor.read() light_value 300 # 模拟值 # 构造消息推荐使用JSON格式 message {{light: {}}}.format(light_value) # 发布到SIOT client.publish(TOPIC.encode(), message.encode()) print(已发布:, message) time.sleep(5) # 每5秒发布一次注意事项掌控板的MicroPython MQTT库可能因固件版本而异。umqtt.simple是常用库。务必处理网络重连逻辑因为Wi-Fi可能不稳定。在循环中增加try-except块来捕获异常并尝试重新连接是良好的实践。4. 核心联动逻辑实现与AI赋能4.1 树莓派上的MQTT订阅与Yeelight控制桥接现在我们需要在树莓派上编写一个“桥梁”服务。这个服务的核心是订阅来自掌控板或其他设备的MQTT主题根据消息内容调用Yeelight API执行控制。# bridge_service.py import paho.mqtt.client as mqtt import json from yeelight import Bulb import logging # 配置日志 logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) # Yeelight设备配置 YEELIGHT_IP 192.168.1.100 bulb Bulb(YEELIGHT_IP) # MQTT回调函数 def on_connect(client, userdata, flags, rc): logger.info(fConnected to SIOT with result code {rc}) # 订阅感兴趣的主题 client.subscribe(sensor/light) # 订阅光线传感器主题 client.subscribe(ai/result) # 订阅AI结果主题 def on_message(client, userdata, msg): topic msg.topic payload msg.payload.decode() logger.info(fReceived message on [{topic}]: {payload}) try: data json.loads(payload) except json.JSONDecodeError: logger.error(fInvalid JSON payload: {payload}) return # 根据主题处理消息 if topic sensor/light: handle_light_sensor(data) elif topic ai/result: handle_ai_result(data) def handle_light_sensor(data): 根据环境光控制灯泡 light_value data.get(light, 0) # 逻辑当环境光低于阈值时开灯并调节亮度 THRESHOLD 100 if light_value THRESHOLD: # 亮度可以映射例如光线越暗亮度越高 brightness int((THRESHOLD - light_value) / THRESHOLD * 100) brightness max(10, min(100, brightness)) # 限制在10-100之间 bulb.turn_on() bulb.set_brightness(brightness) bulb.set_color_temp(4500) # 设置为舒适色温 logger.info(f光线暗({light_value})开灯亮度{brightness}%) else: bulb.turn_off() logger.info(f光线充足({light_value})关灯) def handle_ai_result(data): 根据AI识别结果控制灯泡 # 示例检测到人时开灯无人一段时间后关灯 person_detected data.get(person_detected, False) if person_detected: bulb.turn_on() bulb.set_brightness(70) logger.info(检测到人开灯) # 这里可以添加更复杂的逻辑比如无人状态计时器 # 主程序 if __name__ __main__: client mqtt.Client() client.on_connect on_connect client.on_message on_message client.connect(localhost, 1883, 60) # SIOT运行在本机 # 进入网络循环阻塞式运行 client.loop_forever()这个脚本是项目的核心逻辑所在。它持续运行监听MQTT消息并根据预设规则驱动Yeelight。4.2 集成简单AI基于OpenCV的运动检测触发为了让项目更具“AI”色彩我们可以在树莓派上增加一个简单的计算机视觉功能。这里以实现一个基本的运动检测为例当检测到画面中有移动时发布MQTT消息。# motion_detector.py import cv2 import paho.mqtt.client as mqtt import json import time from datetime import datetime # 初始化MQTT客户端用于发布 mqtt_client mqtt.Client() mqtt_client.connect(localhost, 1883) mqtt_client.loop_start() # 初始化摄像头 cap cv2.VideoCapture(0) # 0代表默认摄像头 if not cap.isOpened(): print(无法打开摄像头) exit() # 读取第一帧作为背景 ret, background_frame cap.read() if not ret: print(无法读取视频帧) cap.release() exit() background_gray cv2.cvtColor(background_frame, cv2.COLOR_BGR2GRAY) background_gray cv2.GaussianBlur(background_gray, (21, 21), 0) motion_detected False last_motion_time time.time() MOTION_TIMEOUT 5 # 无运动5秒后视为停止 while True: ret, frame cap.read() if not ret: break # 预处理当前帧 gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) gray cv2.GaussianBlur(gray, (21, 21), 0) # 计算与背景帧的差异 frame_diff cv2.absdiff(background_gray, gray) thresh cv2.threshold(frame_diff, 25, 255, cv2.THRESH_BINARY)[1] thresh cv2.dilate(thresh, None, iterations2) # 寻找轮廓 contours, _ cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) current_motion False for contour in contours: if cv2.contourArea(contour) 500: # 忽略小面积变化 continue current_motion True (x, y, w, h) cv2.boundingRect(contour) cv2.rectangle(frame, (x, y), (xw, yh), (0, 255, 0), 2) break # 找到一个大的运动区域即可 # 状态判断与MQTT发布 now time.time() if current_motion: last_motion_time now if not motion_detected: motion_detected True # 发布运动开始消息 message json.dumps({motion: start, timestamp: datetime.now().isoformat()}) mqtt_client.publish(sensor/motion, message) print(运动检测开始) else: if motion_detected and (now - last_motion_time MOTION_TIMEOUT): motion_detected False # 发布运动结束消息 message json.dumps({motion: stop, timestamp: datetime.now().isoformat()}) mqtt_client.publish(sensor/motion, message) print(运动检测停止) # 更新背景帧可选动态背景 # background_gray gray # 显示画面可选在无界面的服务器上可注释掉 cv2.imshow(Motion Detection, frame) if cv2.waitKey(1) 0xFF ord(q): break time.sleep(0.1) # 控制循环频率 cap.release() cv2.destroyAllWindows() mqtt_client.loop_stop() mqtt_client.disconnect()然后你需要修改之前的bridge_service.py增加一个handle_motion_sensor函数并订阅sensor/motion主题。当收到运动开始消息时可以控制Yeelight亮起运动停止一段时间后再将其关闭。这就实现了一个基于视觉的自动灯光控制系统。4.3 系统集成与自启动管理现在我们有多个Python脚本在运行SIOT服务器、桥接服务、运动检测服务。我们需要管理它们。使用Systemd管理服务推荐 为每个脚本创建独立的systemd服务文件。例如为桥接服务创建/etc/systemd/system/yeelight-bridge.service[Unit] DescriptionYeelight MQTT Bridge Service Afternetwork.target [Service] Typesimple Userpi WorkingDirectory/home/pi/yeelight_project ExecStart/usr/bin/python3 /home/pi/yeelight_project/bridge_service.py Restarton-failure RestartSec10 [Install] WantedBymulti-user.target之后使用sudo systemctl enable yeelight-bridge和sudo systemctl start yeelight-bridge来启用和启动服务。同样方法管理运动检测服务。使用进程管理工具如PM2 for Python 如果你更喜欢Node.js生态的工具可以用pip install pm2一个Python封装的PM2然后用pm2 start bridge_service.py --name yeelight-bridge来管理pm2 save和pm2 startup可以设置开机自启。使用Screen或Tmux临时/开发用 在终端中可以使用screen或tmux创建多个会话窗口来分别运行这些脚本便于观察日志和调试。screen -S siot ./siot # 按 CtrlA, 再按 D 分离会话 screen -S bridge python3 bridge_service.py # 同样分离 # 重新连接screen -r siot5. 调试技巧、常见问题与优化方案5.1 网络与通信问题排查设备无法相互发现Yeelight发现不了MQTT连不上检查IP地址确保所有设备树莓派、掌控板、手机都在同一子网内。使用路由器管理界面或arp -a、nmap命令检查设备IP。检查防火墙树莓派上确保SIOT使用的端口默认1883 for MQTT 8080 for Web是开放的。sudo ufw allow 1883sudo ufw allow 8080。验证MQTT连接可以使用MQTT客户端工具如MQTTX MQTT.fx连接到树莓派的SIOT地址树莓派IP:1883尝试订阅和发布主题以排除代码问题。掌控板连接Wi-Fi或MQTT失败密码与加密方式确保Wi-Fi密码正确且加密方式如WPA2-PSK是掌控板支持的。信号强度掌控板Wi-Fi模块功率可能较小确保它离路由器不要太远。代码重连机制在掌控板代码的循环中加入对网络连接状态的检查如果断开则尝试重连。umqtt.simple库在网络异常时可能不会自动重连。Yeelight控制无响应确认开发者模式再次在米家App中确认“局域网控制”已成功开启。检查IP是否变化家庭网络DHCP可能会给Yeelight分配新的IP。可以考虑在路由器中为Yeelight设备设置静态IPDHCP保留这样IP地址就固定了。协议与端口Yeelight LAN控制默认使用55443端口。确保树莓派脚本中使用的IP和端口正确。5.2 性能与稳定性优化MQTT消息去抖Debounce 对于传感器数据如光线如果变化频繁可能会导致灯光频繁开关。可以在桥接服务的处理函数中加入简单的去抖逻辑。import time last_action_time 0 ACTION_COOLDOWN 2 # 动作冷却时间2秒 def handle_light_sensor(data): global last_action_time current_time time.time() if current_time - last_action_time ACTION_COOLDOWN: return # 冷却期内不处理 # ... 原有的处理逻辑 ... last_action_time current_time # 执行动作后更新时间状态同步与容错 系统重启后Yeelight的物理状态可能与程序记录的逻辑状态不一致。可以在桥接服务启动时主动查询一次Yeelight的状态bulb.get_properties()并同步到程序内部状态。同时在控制命令发送后增加确认机制虽然Yeelight协议本身不保证但可以尝试捕获异常。资源管理树莓派摄像头如果同时运行运动检测确保摄像头资源被正确释放。在motion_detector.py的异常处理中务必加入cap.release()。内存与CPU长时间运行多个Python服务观察树莓派资源使用情况。如果使用完整的OpenCV (pip install opencv-python)可能会比较耗资源。可以考虑使用opencv-python-headless版本或者针对树莓派优化的安装方式。5.3 功能扩展思路语音控制集成 在树莓派上运行一个离线的语音识别引擎如Vosk或者接入一个在线语音助手需要处理隐私问题。当识别到特定指令如“开灯”、“调成暖黄色”时发布相应的MQTT命令到sensor/voice主题由桥接服务处理。多设备与场景联动多个Yeelight分组控制在代码中维护一个灯泡IP列表可以同时控制多个灯泡实现分组或全屋灯光场景。引入更多传感器用掌控板或ESP32连接温湿度传感器DHT11、人体红外传感器HC-SR501等发布更多主题如sensor/temp_humidity,sensor/pir实现“温度过高调冷光”、“检测到人移动亮灯”等复杂场景。与Home Assistant集成SIOT的MQTT协议是通用的。你可以将SIOT作为MQTT Broker让Home Assistant也接入进来。这样Yeelight既可以被本项目控制也可以被Home Assistant强大的自动化生态控制实现更高级的智能家居联动。开发Web控制面板 使用Python的Flask或FastAPI框架在树莓派上搭建一个简单的Web服务器。这个网页可以通过WebSocket或直接调用后端API向后端发送控制指令后端再通过MQTT或直接调用Yeelight库来控制灯泡。这样你就可以在手机或电脑浏览器上有一个漂亮的控制界面了。这个项目就像搭积木基础框架搭建好后每个部分都可以被替换、增强。你可以把掌控板换成ESP32-CAM做图像识别直接端侧处理可以把SIOT换成更专业的EMQX也可以把AI模块从运动检测升级为更复杂的人脸识别或姿态识别。核心在于你理解了“数据如何流动”、“指令如何产生与执行”这一物联网与智能控制的基本范式。当你看到Yeelight随着你的手势、环境的变化而自动点亮、变色时那种亲手创造“智能”的成就感正是这个项目最大的魅力所在。

相关新闻

最新新闻

日新闻

周新闻

月新闻