基于ESP8266与Home Assistant的Google Assistant语音控制LED灯DIY全流程

发布时间:2026/8/19 3:27:40

基于ESP8266与Home Assistant的Google Assistant语音控制LED灯DIY全流程
1. 项目概述让灯听懂你的话“嘿Google打开客厅的灯。” 这句话从科幻电影走进现实已经有些年头了但亲手把一盏普通的LED灯改造成能听懂指令的智能设备依然是件充满乐趣和成就感的事。这个项目的核心就是利用我们手边常见的硬件和免费的云服务搭建一个由Google Assistant语音控制的LED灯系统。它不仅仅是简单的开关控制更是理解物联网IoT从设备端到云端再到用户交互端完整链路的一个绝佳实践。无论你是嵌入式开发爱好者、智能家居DIY玩家还是对物联网架构好奇的开发者这个项目都能带你走通全流程。你会接触到微控制器编程、Wi-Fi连接、MQTT协议、云平台集成以及语音助手技能开发或利用现有平台等多个环节。最终你将获得一个完全由自己掌控的智能灯无需依赖昂贵的品牌生态并且其原理可以轻松复用到控制风扇、插座甚至窗帘电机等其他设备上。接下来我们就从零开始拆解每一个步骤看看如何让一盏灯变得“耳聪目明”。2. 核心方案选型与架构设计动手之前我们需要确定一个清晰、可行且成本可控的技术方案。市面上实现语音控制LED的方案很多我们需要根据复杂度、成本和学习价值做出选择。2.1 主流方案对比与选型理由最常见的几种方案包括1使用现成的智能插座普通灯2使用ESP8266/ESP32直接对接Google的云IoT Core3通过开源家庭自动化平台如Home Assistant作为中转4使用IFTTT等自动化平台桥接。对于DIY和学习目的方案3通过Home Assistant中转是目前最平衡、最推荐的选择。理由如下首先它避免了直接与Google Cloud IoT Core对接的复杂认证和配置流程后者对新手不够友好且可能有服务变更风险。其次Home Assistant作为一个本地化部署的家庭自动化中枢稳定可靠且与Google Assistant的集成非常成熟通过其官方的Nabu Casa云服务或自建反向代理可以轻松实现安全连接。最后Home Assistant支持数百种设备本次项目用到的LED控制模块如ESP8266只是冰山一角做完这个项目你的Home Assistant就具备了控制更多设备的潜力扩展性极强。因此我们确定的架构是ESP8266微控制器负责控制LED并连接Wi-Fi - MQTT协议负责与Home Assistant通信 - Home Assistant运行在本地服务器或树莓派上作为智能中枢 - Google Assistant通过官方集成或Nabu Casa连接接收用户语音指令。这个架构层次分明每一层各司其职也便于故障排查。2.2 所需硬件与软件清单硬件部分追求极简和低成本主控芯片NodeMCU ESP8266开发板。它内置Wi-Fi性能足够社区支持庞大是物联网项目的“瑞士军刀”。成本约20元。LED组件一个普通LED灯珠或灯带、一个220Ω-1kΩ的限流电阻、杜邦线若干。如果想控制亮度则需要使用PWM脉宽调制引脚ESP8266的D1~D8等引脚大多支持。电源USB数据线用于编程和供电或5V/3.3V电源模块如果长期部署。可选继电器模块如果你想控制交流220V的灯具务必注意安全建议新手先从低压直流LED练手。软件与环境部分开发环境Arduino IDE 或 PlatformIO推荐后者更专业。需要安装ESP8266开发板支持包。家庭自动化平台Home Assistant。可以安装在旧电脑、树莓派甚至Docker容器中。通信协议MQTT Broker消息队列遥测传输代理。Home Assistant通常内置了Mosquitto MQTT代理也可以使用独立的如EMQX。云连接Google Assistant需要与Home Assistant通信。最简单的方式是订阅Home Assistant官方的Nabu Casa云服务年费约65美元它自动处理了复杂的SSL证书和端口转发问题。对于进阶用户也可以使用自建的反向代理如NGINX配合Google Actions SDK完成但流程复杂得多。注意涉及家庭用电安全无小事。如果你计划最终控制市电灯具请务必使用隔离性能良好的继电器模块并在完全断电的情况下进行接线操作或者直接购买带有安全认证的智能开关模块进行改装。本项目前期以低压直流实验为主。3. 硬件连接与固件开发这是项目的“实体”部分我们要让ESP8266能够点亮LED并准备好通过网络接收指令。3.1 电路连接与原理我们将LED的正极长脚通过一个220Ω的限流电阻连接到ESP8266的一个GPIO引脚例如D1对应Arduino引脚编号为5。LED的负极短脚直接连接到ESP8266的GND地引脚。为什么要加限流电阻ESP8266的GPIO引脚输出电压通常是3.3V假设LED的工作电压约为2V工作电流希望在10-20mA。根据欧姆定律电阻 R (电源电压 - LED压降) / 期望电流 (3.3V - 2.0V) / 0.015A ≈ 87Ω。选择220Ω是一个保守且安全的值它能将电流限制在约6mA既能点亮普通LED又能有效保护GPIO引脚不被过流损坏。如果不加电阻直接连接很可能瞬间烧毁LED或损坏单片机引脚。3.2 ESP8266固件编程详解我们将使用Arduino框架为ESP8266编写固件其核心任务是连接Wi-Fi连接MQTT服务器订阅控制主题并根据收到的消息控制LED。首先在Arduino IDE中安装必要的库PubSubClient用于MQTT通信和ESP8266WiFi通常已包含。以下是核心代码逻辑的拆解#include ESP8266WiFi.h #include PubSubClient.h // 1. 网络配置 const char* ssid 你的Wi-Fi名称; const char* password 你的Wi-Fi密码; const char* mqtt_server homeassistant.local; // 你的Home Assistant或MQTT服务器地址 // 2. 引脚与主题定义 const int ledPin 5; // D1 const char* led_state_topic home/bedroom/light/state; // LED状态反馈主题 const char* led_command_topic home/bedroom/light/set; // LED控制命令主题 WiFiClient espClient; PubSubClient client(espClient); void setup() { pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); // 初始状态关闭 Serial.begin(115200); setup_wifi(); // 连接Wi-Fi client.setServer(mqtt_server, 1883); // MQTT默认端口1883 client.setCallback(callback); // 设置收到消息时的回调函数 } void loop() { if (!client.connected()) { reconnect(); // 如果MQTT断开则重连 } client.loop(); // 维持MQTT连接并处理消息 }关键函数解析setup_wifi(): 函数内调用WiFi.begin(ssid, password)并通过循环和WiFi.status()检查直到连接成功。reconnect(): 这是稳定性的关键。函数内循环尝试client.connect(ESP8266LightClient)。连接成功后必须立即执行client.subscribe(led_command_topic)来订阅控制主题。这样当Home Assistant向这个主题发送命令时ESP8266才能收到。callback(char* topic, byte* payload, unsigned int length): 这是消息处理的核心。当订阅的主题收到消息时此函数被自动调用。void callback(char* topic, byte* payload, unsigned int length) { String message; for (int i0; ilength; i) { message (char)payload[i]; } if (String(topic) led_command_topic) { if (message ON) { digitalWrite(ledPin, HIGH); client.publish(led_state_topic, ON); // 反馈状态 } else if (message OFF) { digitalWrite(ledPin, LOW); client.publish(led_state_topic, OFF); // 反馈状态 } } }这里有一个非常重要的细节状态反馈。在控制LED后我们主动向led_state_topic发布了一条状态消息“ON”或“OFF”。这样Home Assistant就能知道设备当前的实际状态并在其界面上正确显示。否则你会发现Home Assistant里开关的图标可能和实际灯的状态不同步。实操心得在reconnect()函数中最好加入一段随机延迟比如delay(random(1000, 5000));避免所有设备在断电重启后同时疯狂重连服务器造成网络冲击。另外MQTT的Client ID最好具有唯一性可以加入芯片IDString(ESP.getChipId())防止多个设备冲突。4. Home Assistant配置与设备集成Home Assistant (HA) 是我们智能家居的“大脑”它负责将ESP8266设备友好地管理起来并暴露给Google Assistant。4.1 安装与基础配置假设你已经通过HassOS、Docker或Python虚拟环境等方式安装好了Home Assistant。首次登录后进入其Web界面通常为http://你的服务器IP:8123。首先需要确保MQTT集成已启用。进入“配置” - “集成”点击右下角“添加集成”搜索“MQTT”。如果HA内置了Mosquitto broker这里通常会有“MQTT”选项。添加时服务器地址填写localhost或127.0.0.1端口1883。如果使用独立部署的MQTT服务器则填写对应的地址和端口。4.2 通过MQTT手动添加灯设备这是最关键的一步我们将告诉HA有一个什么样的设备存在。有两种主流方式自动发现Auto Discovery和手动配置。为了彻底理解原理我们先从手动配置开始。在HA的配置目录通常为安装目录下的.homeassistant或config文件夹中找到configuration.yaml文件。我们需要在其中添加一个“灯”实体。# configuration.yaml 片段 light: - platform: mqtt name: Bedroom LED state_topic: home/bedroom/light/state command_topic: home/bedroom/light/set payload_on: ON payload_off: OFF optimistic: false qos: 0 retain: truestate_topic和command_topic必须与ESP8266代码中定义的完全一致。这就像双方的通信地址和密码必须对得上。optimistic: false这意味着HA将依赖设备反馈的状态即我们代码里client.publish发出的状态而不是乐观地假设命令已执行。设为true则HA在发送命令后立即更新界面状态适合没有状态反馈的设备。retain: true这是一个非常有用的MQTT特性。当设置为true时MQTT服务器会保留该主题最后一条消息。任何新订阅此主题的客户端比如HA重启后会立刻收到最后的状态。这样HA重启后就能立即知道灯是开还是关而不是显示“未知”。qos: 0服务质量等级。0表示“最多一次”传输最快但可能丢失消息1表示“至少一次”确保送达但可能重复2表示“恰好一次”最可靠但开销大。对于开关灯QoS 0通常足够。保存configuration.yaml后重启Home Assistant。重启后你应该能在“概览”页看到一个名为“Bedroom LED”的实体卡片并且可以点击它进行开关操作。如果点击后ESP8266上的LED能随之亮灭并且HA界面状态也能正确同步那么恭喜你最核心的本地控制链路已经打通了。4.3 自动化与场景初步在HA中你还可以基于这个灯创建自动化。例如进入“配置”-“自动化与场景”-“创建自动化”可以设置“当太阳下山时自动打开卧室LED”或者“在晚上11点自动关闭所有灯”。这展示了本地自动化中枢的强大之处即使互联网断开这些自动化规则依然可以执行。5. 连接Google Assistant实现语音控制现在我们有了一个在本地网络内完美控制的智能灯。最后一步就是让它能响应你的语音命令。5.1 通过Nabu Casa云服务最简方案这是Home Assistant官方提供的付费服务也是连接Google Assistant最省心、最安全的方式。它本质上为你建立了一个Home Assistant实例与Google服务器之间的安全隧道。在HA的Web界面进入“配置” - “Home Assistant云”。如果你尚未订阅会引导你注册Nabu Casa账户并支付年费目前约65美元。订阅后回到此页面点击“启用”。启用后界面会显示一个长长的“Google Assistant连接”URL。复制它。打开手机上的Google Home应用点击“添加”-“设置设备”-“与Google配合使用的服务”。在服务列表中找到并点击“Home Assistant”。如果找不到可能需要点击“搜索更多服务”。它会要求你登录你的Google账户并进行授权。在授权过程中粘贴你刚才复制的那个URL。授权完成后Google Home应用会开始同步你的Home Assistant设备。稍等片刻你就能在Google Home应用的设备列表里看到“Bedroom LED”了。现在你可以对你的Google Nest音箱、手机Google Assistant说“Hey Google, turn on the Bedroom LED.” 命令会经由Google云端通过Nabu Casa隧道到达你的Home Assistant再通过MQTT最终控制ESP8266上的LED。5.2 常见连接问题与排查即使使用Nabu Casa有时也会遇到设备同步失败或语音指令无响应的问题。以下是一个排查清单问题现象可能原因排查步骤Google Home中找不到HA设备同步未成功或设备未暴露1. 检查HA“云”配置页面是否显示“已连接”。2. 在HA“配置”-“实体注册表”中找到你的灯实体确保其“已启用”且未勾选“隐藏”。HA默认不会隐藏实体但需确认。3. 在Google Home App中尝试“同步我的设备”。语音指令无效但HA内手动控制有效Google Assistant到HA的链路不通1. 检查互联网连接。2. 在HA“开发者工具”-“服务”中调用google_assistant_sync服务强制同步到Google。3. 查看HA日志“配置”-“日志”中是否有来自Google Assistant的错误。设备状态不同步MQTT retain未设置或状态主题不对1. 确认ESP8266代码中在状态变化后正确发布了消息到state_topic。2. 确认HA配置中retain: true。3. 使用MQTT客户端工具如MQTT Explorer订阅state_topic查看是否有状态消息发出。指令延迟高网络或云端延迟1. 测试本地HA控制延迟如果本地也慢检查ESP8266和HA服务器的Wi-Fi/网络信号。2. 如果仅语音慢可能是Google云端或Nabu Casa隧道延迟通常重启HA服务能缓解。实操心得在Google Home App中你可以为设备分配房间如“卧室”这样你就可以用更自然的语音指令比如“Hey Google, turn off the lights in the bedroom.” 甚至可以直接说“Hey Google, good night.” 如果你在HA中设置了名为“晚安”的场景Google Assistant也能触发它实现关灯、调节空调等一系列操作。6. 项目优化与进阶思路基础功能实现后我们可以从多个维度对这个项目进行优化和扩展让它更实用、更智能。6.1 增加亮度与颜色控制目前我们只实现了开关。要控制亮度需要将ESP8266的GPIO连接支持PWM的引脚如D1并在代码中使用analogWrite(pin, value)函数其中value范围是0-255。同时MQTT消息也需要能传递亮度值。在HA的configuration.yaml中配置需要升级light: - platform: mqtt name: Bedroom LED ... # 保留之前的配置 brightness_command_topic: home/bedroom/light/brightness/set brightness_state_topic: home/bedroom/light/brightness/state brightness_scale: 255ESP8266代码则需要解析类似{brightness: 128}的JSON格式消息并解析其中的数值用于analogWrite。对于RGB LED灯带则需要更多的PWM引脚和对应的色彩主题配置。6.2 提升系统稳定性与安全性OTA升级为ESP8266固件加入OTA空中升级功能。这样以后修改代码无需再插拔USB线直接在HA的Web界面或通过特定URL就能完成固件更新。Arduino IDE可以通过“工具”-“端口”选择网络端口进行OTA上传。MQTT认证为你的MQTT Broker如Mosquitto设置用户名和密码。在ESP8266代码的client.connect函数和HA的MQTT集成配置中添加上认证信息防止未经授权的设备接入。Wi-Fi连接增强在代码中加入智能配网功能如WiFiManager库这样当Wi-Fi密码更改时无需重新烧录固件设备会启动一个配置热点用手机连接后即可输入新的Wi-Fi信息。本地控制优先确保所有自动化规则都设置在HA本地。这样即使外网断开比如Nabu Casa服务临时故障你家中的自动化如人体感应开灯依然可以正常工作。6.3 扩展至其他设备与场景这个项目的框架是通用的。你可以用完全相同的MQTTHA模式去控制一个继电器模块控制台灯、风扇一个温湿度传感器在HA中创建传感器实体甚至一个红外发射模块模拟遥控器控制空调。例如将继电器模块的GPIO替换LEDHA中平台从light改为switch你就得到了一个语音控制的智能插座。整个数据流语音 - Google - Nabu Casa - HA - MQTT - ESP8266 - 继电器是完全一致的。更进一步你可以在HA中创建“场景”Scene将多个设备的动作绑定在一起。比如创建一个“电影模式”场景触发时自动调暗灯光、关闭窗帘、打开电视和音响。然后这个场景同样可以通过Google Assistant语音调用“Hey Google, activate movie mode.” 至此一个真正个性化、可自由扩展的智能家居系统就从这一盏小小的LED灯开始搭建起来了。

相关新闻

基于PuppyPi与串口舵机实现六轴机械臂视觉抓取与运动控制

基于PuppyPi与串口舵机实现六轴机械臂视觉抓取与运动控制

2026/8/19 3:17:39

1. 项目缘起:当“玩具”开发板遇上机械臂最近在折腾PuppyPi这块开发板,它本质上是一块基于全志H618芯片的卡片电脑,性能对于嵌入式项目来说相当够用。之前用它跑过一些图像识别、小车控制的项目,总觉得它还能干点更“酷”的事。看…

从“抗议对象”到“真实问题”:提升团队协作效率的沟通思维

从“抗议对象”到“真实问题”:提升团队协作效率的沟通思维

2026/8/19 3:17:39

1. 从“抗议对象”到“真实问题”:一个被忽视的沟通起点最近在复盘一些项目复盘和团队沟通的案例时,我反复看到一个现象:大家讨论得热火朝天,甚至面红耳赤,但最后发现,所有人争论的焦点,根本就不…

DeepSeek Harness实战:基于开源框架构建企业级AI应用工作流

DeepSeek Harness实战:基于开源框架构建企业级AI应用工作流

2026/8/19 3:17:39

1. 背景与核心概念最近在探索如何将大语言模型(LLM)更高效、更稳定地集成到实际业务系统中时,发现了一个普遍痛点:虽然模型API调用很简单,但要构建一个生产级的AI应用,需要处理复杂的工程问题,比…

基于STM32与Hexabitz的多核三相功率分析仪设计与实现

基于STM32与Hexabitz的多核三相功率分析仪设计与实现

2026/8/19 4:27:43

1. 项目缘起:为什么我们需要一个多核三相功率分析仪?在嵌入式开发,尤其是电力电子、电机驱动或者新能源相关的项目中,精确测量三相交流电的功率参数是一个绕不开的核心需求。无论是评估一台变频器的效率,还是分析一个光…

基于Arduino与SPI Flash的复古街机摇杆DIY:从Arduboy游戏移植到硬件实现

基于Arduino与SPI Flash的复古街机摇杆DIY:从Arduboy游戏移植到硬件实现

2026/8/19 4:27:43

1. 从掌机到街机:ArduStick项目的核心构想如果你和我一样,是个对复古游戏和DIY硬件都充满热情的人,那么“ArduStick”这个项目标题,很可能瞬间就点燃了你的好奇心。它听起来像是一个奇妙的混合体:Arduboy,那…

智能电压单元设计:多路电源管理、监控与保护方案详解

智能电压单元设计:多路电源管理、监控与保护方案详解

2026/8/19 4:27:43

1. 项目概述:什么是“智能电压单元”?最近在捣鼓一个开源硬件项目,需要给核心板、传感器和几个执行器供电,手头一堆不同电压的设备:3.3V的逻辑芯片、5V的传感器、12V的电机。一开始我用了一堆LDO和DC-DC模块&#xff0…

从零实现 Python 端口扫描器:100 线程并发,3 秒扫完 1000 端口

从零实现 Python 端口扫描器:100 线程并发,3 秒扫完 1000 端口

2026/8/19 4:27:43

——**Python 高效端口扫描器**,网络运维和安全学习都用得上,同样是完整代码 逐段讲解。 --- # 🔍 Python 高效端口扫描器:多线程并发、服务识别与结果导出 ## 一、前言 在服务器运维、网络安全检测中,我们经常需要知…

TriCore架构深度解析:三合一MCU在汽车与工业控制中的实战应用

TriCore架构深度解析:三合一MCU在汽车与工业控制中的实战应用

2026/8/19 4:27:43

1. 从“英飞凌杯”到工业核心:为什么TriCore值得你花时间如果你关注过“英飞凌杯”全国大学生智能车竞赛,或者正在车载座舱、电机控制(比如BLDC)这些领域摸爬滚打,那么“英飞凌”和“MCU”这两个词对你来说肯定不陌生。…

STM32F103 SPL集成FreeRTOS v202112.00实战指南与移植详解

STM32F103 SPL集成FreeRTOS v202112.00实战指南与移植详解

2026/8/19 4:17:42

1. 项目缘起:为什么要在SPL上集成FreeRTOS?如果你手头有一块经典的STM32F103C8T6“蓝桥杯”开发板,或者是从某个旧项目中翻出来的STM32F10x系列芯片,想在上面跑一个实时操作系统,那么你大概率会遇到一个选择&#xff1…

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

2026/8/19 3:36:59

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

2026/8/18 1:03:22

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

2026/8/17 8:40:51

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

SQL 调优 [ 2 ]

SQL 调优 [ 2 ]

2026/8/19 0:07:32

type列详解EXPLAIN输出的type列描述了表是如何连接的,性能从最好到最差的排序如下:systemconsteq_refreffulltextref_or_nullindex_mergeunique_subqueryindex_subqueryrangeindexALL接下来我们对 type列 做详细讲解。我们都知道,想要评估一条…

正式评优怎么选投票工具?人人微投票审计级防刷能力实测

正式评优怎么选投票工具?人人微投票审计级防刷能力实测

2026/8/19 0:07:32

在线上投票工具遍地开花的今天,选择一个合适的平台,本质上是在做一道关于场景与需求的匹配题。人人微投票是一个很典型的案例——它的产品逻辑、技术架构和商业模式,都围绕着“正式评选”这个细分场景深度扎根,也因此形成了自己鲜…

15 天 3 连发:DeepSeek 的「机枪」节奏,到底在下什么棋?

15 天 3 连发:DeepSeek 的「机枪」节奏,到底在下什么棋?

2026/8/19 0:07:32

15 天 3 连发:DeepSeek 的「机枪」节奏,到底在下什么棋?回看 2026 年 8 月这半个月,DeepSeek 的动作密度堪称疯狂:月初端出便宜快速的 V4-Flash,8 月 13 日同一天甩出 V4-Pro 正式版 开源 Harness 框架&am…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/17 12:00:53

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/15 10:10:27

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/18 12:20:24

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…