行业资讯

ESP-RFID门禁系统扩展:通过MQTT集成Tasmota与Shelly控制大功率设备

发布时间:2026/8/19 4:16:41
ESP-RFID门禁系统扩展:通过MQTT集成Tasmota与Shelly控制大功率设备 1. 项目概述当ESP-RFID遇上外部继电器如果你玩过基于ESP8266或ESP32的RFID门禁系统大概率用过ESP-RFID这个经典的开源项目。它把读卡器、Web配置界面和继电器控制都集成在一块开发板上实现“刷卡-开门”的一体化方案。但不知道你有没有遇到过这样的尴尬项目初期用的小功率继电器控制个电磁锁还行后来想升级成控制车库门电机或者三相设备那小继电器板子就力不从心了电流和电压都是问题。或者你的门锁、灯光分散在房子的不同位置一根线根本拉不过去。这时候一个很自然的想法就冒出来了能不能让ESP-RFID这个“大脑”只负责识别和决策而把“动手”的力气活——也就是实际控制大功率设备、或者进行远程控制——交给更专业的“外援”呢这个“外援”就是标题里提到的Tasmota和Shelly。简单来说这个项目的核心思路就是解耦。让ESP-RFID专注于它最擅长的身份验证和用户管理而通过MQTT这个“消息快递员”把“开门”、“关门”这样的指令发送给远处安装了Tasmota固件的任意ESP设备或者本身就是智能家居明星的Shelly开关/继电器模块。这样一来控制端的灵活性和功率问题就迎刃而解了。你可以用一个中央的ESP-RFID读卡器控制家里任何一个角落的、任何功率的电器设备整套系统的可扩展性和可靠性都上了一个台阶。2. 核心架构与通信协议选型2.1 为什么是MQTT要实现ESP-RFID与外部设备Tasmota/Shelly的对话首先得给它们定一个都能听懂的“语言”。在物联网领域这种语言的首选通常是MQTT。你可以把MQTT想象成一个高效的“广播站”或“邮局”。ESP-RFID作为“发布者”它不用关心具体哪个设备在听它只需要对着某个特定的“频道”主题/Topic喊一句“开门”。而所有订阅了这个频道的设备比如书房里的Tasmota插座、车库里的Shelly开关都会同时收到这条消息。至于谁该响应、怎么响应就由它们自己决定了。选择MQTT而不是HTTP轮询或者直接的TCP连接主要基于几个现实考量低带宽与高延迟容忍家庭Wi-Fi网络偶尔会波动MQTT的轻量级协议头和“发布/订阅”模型在网络不佳时比频繁的HTTP请求更稳定。解耦与扩展性ESP-RFID完全不需要知道有多少个Tasmota设备。今天你订阅了一个车库门明天想再加个花园灯只需要在新的Shelly上配置订阅同一个主题即可中央系统无需任何改动。低功耗对于由电池供电的传感设备虽然本项目不涉及MQTT的保持连接机制比轮询更省电。在ESP-RFID配合Tasmota/Shelly的场景里MQTT完美地扮演了“指令总线”的角色。ESP-RFID验证卡号后向一个如home/rfid/door1/action的主题发布一条消息例如ON而早已订阅此主题的Tasmota设备就会执行打开继电器的操作。2.2 Tasmota与Shelly两种风格的外设虽然都能通过MQTT控制但Tasmota和Shelly代表了两种不同的硬件集成路径。Tasmota极客的万能遥控器Tasmota是一个开源固件可以刷写在大量基于ESP8266/ESP32的智能插座、灯泡、开关模块上。它的核心优势是极致可控和本地化。本地控制所有逻辑如定时、规则都在设备本地运行不依赖任何云服务断网也能正常工作响应速度极快毫秒级。强大规则引擎你可以编写复杂的自动化脚本例如如果收到MQTT消息A且时间是晚上则执行动作B并延迟C秒后执行D实现远超简单开关的逻辑。硬件兼容性广从几块钱的Sonoff基础开关到多路继电器板只要芯片是ESP系列几乎都能刷入成本可控。在这个项目里你可以将一个刷了Tasmota的Sonoff Basic模块改装到你的大功率电磁锁或车库门开启器电路中让它成为ESP-RFID的忠实执行者。Shelly开箱即用的工业明星Shelly设备是硬件和软件一体化的产品本身原生支持MQTT和HTTP控制。它的优势在于省心和稳定。免刷机出厂即支持本地MQTT通过其友好的Web界面即可配置降低了技术门槛。设计可靠Shelly在电气安全、散热、继电器负载等方面通常经过更严格的测试适合直接控制重要或高价值设备如中央空调、水泵。生态整合好除了MQTT它还无缝支持Home Assistant、Apple HomeKit等主流智能家居平台。例如你可以直接购买一个Shelly 1将它接入车库门电机的控制回路然后在它的设置里填上MQTT服务器地址和要订阅的主题就完成了硬件端的配置。选择建议如果你享受DIY过程追求极限的成本控制和功能定制并且手头有可刷机的ESP硬件Tasmota是首选。如果你希望快速部署追求商业级的稳定性和简便性且不在意稍高的硬件成本Shelly是更稳妥的选择。3. ESP-RFID端详细配置与实战3.1 固件编译与关键功能启用ESP-RFID项目本身已经预留了MQTT的支持但默认可能未开启。我们需要从源码编译确保相关功能被激活。首先获取源码。通常使用PlatformIO作为开发环境比原始的Arduino IDE更便于管理依赖。# 克隆仓库 git clone https://github.com/esprfid/esp-rfid.git cd esp-rfid用VS Code打开项目后重点关注platformio.ini文件和src/config.h文件。在platformio.ini中确保选择了正确的开发板环境例如esp12e对应常见的NodeMCU或Wemos D1。在config.h或类似的配置文件中你需要找到并启用MQTT的宏定义。它可能看起来像这样// 取消注释或设置为1以启用MQTT #define MQTT_ENABLE 1 // 定义MQTT服务器地址、端口、用户名、密码 #define MQTT_HOST 192.168.1.100 #define MQTT_PORT 1883 #define MQTT_USER your_mqtt_user #define MQTT_PWD your_mqtt_password // 定义客户端ID和主题 #define MQTT_CLIENT_ID ESP-RFID_Door1 #define MQTT_TOPIC home/rfid/door1注意在实际项目中我强烈建议不要像上面这样把敏感信息硬编码在源码里。ESP-RFID更常见的做法是在Web配置界面中提供MQTT的配置项。你需要检查你使用的固件版本确保其Web界面包含MQTT设置页面Server, Port, User, Password, Client ID, Topic等。如果源码中没有可能需要寻找一个集成了此功能的衍生版本或自行添加。编译并刷写固件到你的ESP开发板如NodeMCURC522读卡器组合。上电后连接ESP-RFID创建的Wi-Fi热点通常是ESP-RFID-XXXXXX在浏览器中打开192.168.4.1完成基础的Wi-Fi网络配置。连接到你的家庭Wi-Fi后记下设备获取到的IP地址。3.2 Web界面配置与MQTT指令设定通过浏览器访问ESP-RFID的IP地址进入管理界面。在“设置”或“Configuration”中寻找MQTT相关的配置板块。连接配置MQTT服务器填入你的MQTT Broker地址。如果你在本地树莓派上运行了Mosquitto就填树莓派的IP如192.168.1.100。端口默认是1883。用户名/密码如果你的MQTT Broker设置了认证在此填写。客户端ID填写一个唯一标识如ESP-RFID-Lobby。主题前缀这是最重要的设置之一。它定义了所有消息的根路径。例如设置为home/rfid/main_door。行为与指令配置 ESP-RFID通常允许你为不同的事件定义不同的MQTT载荷。你需要找到类似“事件动作”或“MQTT Messages”的配置区域。成功读取授权卡这是核心事件。你需要设置当验证通过时发布到什么子主题以及发布什么内容。主题可能是一个自动组合的字段如[前缀]/action最终形成home/rfid/main_door/action。载荷这里要和你Tasmota/Shelly设备订阅并识别的指令对齐。对于Tasmota控制继电器最简单的指令是ON和OFF。所以你可以设置载荷为ON。触发模式通常选择“在验证成功后发布”。其他可选事件你还可以配置“门常开”、“系统启动”、“未知卡刷卡”等事件发布到不同的主题用于更复杂的监控或联动。继电器控制模式 由于我们现在使用外部继电器ESP-RFID板载的继电器可能就没用了。在硬件设置里你可以选择“禁用”板载继电器或者将其模式设置为“仅用于反馈”例如刷卡成功时闪一下灯避免与外部设备冲突。配置完成后保存并重启ESP-RFID。此时它应该已经成功连接到了你的MQTT Broker。4. 外部执行端Tasmota/Shelly配置详解4.1 Tasmota设备配置实战假设你已经将一个Sonoff Basic刷入了Tasmota固件并接入了你的Wi-Fi网络。基础MQTT配置 访问Tasmota设备的IP地址进入控制台。Configuration - Configure MQTTHost填入你的MQTT Broker IP地址。Client设置一个唯一的客户端ID如Tasmota_Garage_Switch。Topic这是设备订阅和发布消息的根主题。设为tasmota/garage/relay。这个主题主要用于Tasmota自身状态上报。但注意我们控制它需要用的是另一个主题。保存并重启。设置订阅主题以接收ESP-RFID指令 Tasmota的强大之处在于其“规则”功能。我们不直接用它默认的控制主题而是创建一个规则来监听ESP-RFID发出的主题。在控制台输入以下命令Backlog Rule1 ON; Rule1 1Backlog用于一次发送多条命令。Rule1 ON启用规则1Rule1 1表示规则1在系统启动后即生效。现在创建规则的具体内容。我们希望当收到home/rfid/main_door/action主题的ON消息时触发继电器动作2秒模拟开门动作Rule1 ON MQTT#Datahome/rfid/main_door/action ON DO Power1 ON FOR 2 ENDON这条规则分解如下ON MQTT#Data当MQTT数据到达时触发。home/rfid/main_door/action ON判断到达的数据是否完全等于字符串home/rfid/main_door/action ON。这里Tasmota的MQTT#Data变量包含“主题 载荷”。DO Power1 ON FOR 2如果匹配则执行将继电器1Power1打开ON并持续2秒FOR 2然后自动关闭。输入命令后需要使规则生效Rule1 1测试 此时当你用授权卡在ESP-RFID上刷卡ESP-RFID会向home/rfid/main_door/action发布ON。Tasmota设备收到后其继电器会“咔哒”一声吸合2秒然后断开。你可以用万用表或接一个灯泡来测试。实操心得Tasmota的规则语法功能非常强大但略显晦涩。一定要善用控制台的Rule1命令查看当前规则用Rule1 0临时禁用规则进行调试。另外FOR指令的时间单位是秒如果需要更精确的毫秒控制可以考虑使用Delay命令组合。4.2 Shelly设备配置实战以Shelly 1为例配置过程更加图形化。接入网络与发现 给Shelly 1上电它会创建一个名为Shelly1-XXXXXX的Wi-Fi热点。连接这个热点浏览器通常会自动弹出配置页面或手动访问192.168.33.1。 在页面中选择你的家庭Wi-Fi并输入密码将其接入本地网络。启用MQTT并配置在Shelly的Web界面设备IP地址进入Internet Security - Advanced - Developer Settings。启用MQTT。服务器填入MQTT Broker的IP和端口如192.168.1.100:1883。用户名/密码如果需要则填写。客户端ID可自定义如shelly1_garage。主题前缀这是Shelly发布自身状态的主题根路径如shellies/shelly1-garage/。这个我们主要用来监控设备状态。最重要的一步配置MQTT主题映射。Shelly允许你为“开关”动作自定义输入主题。在“Switch”设置页面或类似的“Actions”设置里找到“MQTT Button Topic”或“Input Event MQTT Topic”。将其设置为ESP-RFID发布指令的完整主题即home/rfid/main_door/action。同时设置“MQTT Payload ON”为ON“MQTT Payload OFF”可以留空或设为OFF因为我们只需要触发开门动作。工作模式设置将Shelly 1的模式设置为“瞬间”或“触发”模式。在这种模式下当它从指定的MQTT主题收到ON载荷时会瞬间闭合继电器默认约0.5秒然后自动断开完美模拟开门按钮的短按效果。保存所有设置设备会重启。配置完成后当ESP-RFID发布ON消息到home/rfid/main_door/action时Shelly 1的继电器就会执行一次瞬间吸合控制门锁或车库门开启器。5. MQTT Broker搭建与网络调试核心要点5.1 轻量级Broker部署方案要让ESP-RFID和Tasmota/Shelly能通信中间必须有一个MQTT Broker。对于家庭项目在树莓派或常开机的旧电脑上部署是最佳选择。使用Mosquitto最流行 在基于Debian的系统如树莓派OS上安装非常简单sudo apt update sudo apt install mosquitto mosquitto-clients安装后Mosquitto服务会自动启动。其默认配置文件在/etc/mosquitto/mosquitto.conf。对于基础使用默认配置匿名访问端口1883即可。但为了安全我强烈建议设置密码。设置用户名密码创建密码文件sudo mosquitto_passwd -c /etc/mosquitto/passwd your_username输入两次密码。-c参数表示创建新文件如果已有文件添加用户则不要用-c。编辑配置文件指定密码文件并禁止匿名访问sudo nano /etc/mosquitto/mosquitto.conf在文件末尾添加allow_anonymous false password_file /etc/mosquitto/passwd重启服务sudo systemctl restart mosquitto现在你的ESP-RFID和Tasmota/Shelly在配置MQTT时就需要填写这里设置的用户名和密码了。5.2 调试利器MQTT客户端工具在集成过程中MQTT客户端工具是排查问题的“眼睛”。它们能让你看到网络中流动的所有消息。MQTT Explorer (桌面端)这是我最推荐的工具界面直观。你只需要填入Broker的地址、端口、认证信息就能连接到Broker。左侧会以树状结构展示所有活跃的主题右侧显示主题的实时消息和历史载荷。你可以手动向任何主题发布消息这对于模拟ESP-RFID发送指令来测试Tasmota/Shelly是否响应至关重要。Mosquitto 命令行客户端安装mosquitto-clients后即可使用。订阅一个主题监听mosquitto_sub -h 192.168.1.100 -u your_username -P your_password -t home/rfid/# -v-t “home/rfid/#”中的#是通配符表示订阅所有以home/rfid/开头的主题。-v打印主题和消息。发布一个消息测试mosquitto_pub -h 192.168.1.100 -u your_username -P your_password -t home/rfid/main_door/action -m ON调试流程打开MQTT Explorer连接Broker。在ESP-RFID上刷卡观察Explorer中是否出现了home/rfid/main_door/action主题以及其载荷是否为ON。如果没有问题出在ESP-RFID配置或网络连接上。如果步骤2正常在Explorer中手动向home/rfid/main_door/action发布ON观察Tasmota/Shelly的继电器是否动作。如果不动作问题出在执行端的订阅配置上。检查Tasmota控制台或Shelly日志看它们是否收到了MQTT消息。6. 高级应用与可靠性设计6.1 状态反馈与系统闭环基础的“发布-执行”是开环控制。一个健壮的系统需要状态反馈形成闭环。门磁状态反馈在门框上安装一个干簧管或霍尔传感器门磁连接到另一个Tasmota设备或Shelly Door/Window传感器。当门打开或关闭时传感器Tasmota向一个主题如home/door/main/status发布OPEN或CLOSED。ESP-RFID或Home Assistant订阅状态ESP-RFID可以通过订阅这个状态主题在Web界面上实时显示门的状态。更常见的做法是由Home Assistant这样的智能家居中心同时订阅RFID指令和门磁状态实现更复杂的自动化例如刷卡开门后如果门在30秒内未关闭则通过TTS语音播报提醒。执行确认反馈Tasmota/Shelly在执行继电器动作后可以主动向一个状态主题如home/garage/relay/state发布ON或OFF供其他设备确认动作已执行。6.2 安全与冗余考量MQTT传输安全使用TLS加密在生产环境或对安全有要求的场景应在Mosquitto上配置SSL/TLS证书并使用8883端口。ESP-RFID和Tasmota都需要配置CA证书以进行安全连接。Shelly部分型号也支持MQTT over TLS。主题权限控制一些高级的MQTT Broker如EMQX支持为不同客户端设置订阅/发布ACL访问控制列表防止设备误操作或恶意发布。网络与电源冗余Wi-Fi稳定性确保ESP设备所在位置信号良好。对于关键的门禁设备可以考虑使用ESP32的以太网板或有线连接的Shelly设备彻底摆脱Wi-Fi波动。UPS备用电源为MQTT Broker树莓派和核心的网络设备路由器、交换机配备小型UPS确保在短暂停电时系统仍能工作。本地冗余逻辑在Tasmota设备中可以编写规则使其在网络断开或MQTT Broker不可达时降级到本地定时开关或物理按钮控制模式保证基本功能不失效。6.3 扩展应用场景解耦后的架构打开了想象力一卡控多门一张授权卡可以让ESP-RFID向不同的主题发布消息从而控制前门、车库门、房间灯等多个Tasmota/Shelly设备。条件触发结合其他传感器如人体传感器、光照传感器在Home Assistant中创建复杂自动化。例如“晚上7点后如果有人刷卡进门且光照传感器显示黑暗则同时打开玄关灯另一个Shelly设备”。日志与通知所有MQTT消息都可以被一个日志服务如Node-RED订阅并存入数据库用于查询刷卡记录。同时可以配置在刷非法卡时通过Telegram或App发送报警通知。7. 常见问题排查与实战心得在实际部署中你几乎一定会遇到下面这些问题。问题1ESP-RFID显示MQTT连接失败。检查思路网络连通性确保ESP-RFID设备能Ping通MQTT Broker的IP地址。Broker服务在Broker服务器上运行sudo systemctl status mosquitto确认服务正在运行。检查防火墙是否放行了1883端口sudo ufw allow 1883。认证信息仔细检查ESP-RFID Web界面中填写的MQTT用户名、密码、客户端ID是否有误。客户端ID如果重复会导致其中一个被踢下线。主题权限如果Broker设置了ACL确认该客户端有发布到相应主题的权限。问题2刷卡后MQTT Explorer能看到消息但Tasmota/Shelly不动作。检查思路主题匹配这是最常见的问题。一字不差地核对主题。注意大小写、斜杠、前后空格。在MQTT Explorer里复制收到的完整主题粘贴到Tasmota规则或Shelly配置中。Tasmota规则中的MQTT#Data变量包含“主题空格载荷”所以你的规则判断条件必须完全匹配home/rfid/door/action ON。Tasmota规则状态在Tasmota控制台输入Rule1查看规则详情确认规则是ON状态且已生效显示规则内容。用Rule1 0禁用再Rule1 1重新启用有时可以解决规则未加载的问题。Shelly模式确认Shelly的工作模式是“瞬间”或“触发”而不是“开关”。在“开关”模式下收到ON消息会翻转状态而不是瞬间触发。继电器硬件用Tasmota控制台的Power1 ON命令或Shelly Web界面上的手动开关按钮测试继电器本身是否正常。排除硬件接线问题。问题3控制有延迟有时反应慢。检查思路Wi-Fi信号检查ESP设备尤其是ESP-RFID读卡器的Wi-Fi信号强度。信号弱会导致MQTT连接重连和消息重发引入延迟。MQTT Broker负载如果Broker运行在性能很低的设备上如老旧的树莓派Zero且订阅者众多可能成为瓶颈。观察Broker的CPU和内存使用情况。QoS等级MQTT消息有QoS 0/1/2三个等级。QoS 0是“最多一次”速度最快但可能丢失QoS 1是“至少一次”保证送达但可能重复。在门禁场景对偶尔丢失不敏感追求速度可以尝试使用QoS 0。在ESP-RFID和Tasmota的MQTT配置中寻找相关设置。问题4系统偶尔会误触发或自己动作。检查思路MQTT载荷混淆确保你的主题是唯一的。如果家里有其他智能设备也向类似主题发布消息可能会造成干扰。建议使用更独特的主题前缀如house/entrance/rfid/action。Tasmota规则误判检查Tasmota规则逻辑是否过于宽泛。确保规则条件精确匹配主题和载荷。电源干扰大功率继电器特别是控制电机类负载动作时可能会对同一电路上的ESP设备产生电源干扰导致其重启或误发信号。为ESP设备使用独立的电源适配器或在线路上增加滤波电容。个人踩坑心得主题命名规范化从一开始就规划好清晰的主题树结构。例如位置/设备类型/设备ID/功能。像home/garage/door/rfid/action和home/garage/door/sensor/status就非常清晰。混乱的主题命名是后期维护的噩梦。先调试再接线在将继电器连接到真正的门锁、电机等大功率负载之前先用一个220V灯泡或万用表测试。确保逻辑控制完全正确动作时间、触发条件再接入真实负载避免损坏设备。固件版本一致性ESP-RFID、Tasmota都有很多衍生版本和不同时期的固件。注意你使用的版本其Web配置界面和功能可能有所不同。遇到奇怪问题去项目的GitHub Issues页面搜索往往能找到答案。对于关键系统刷写一个已知稳定的版本而不是盲目追求最新。日志是你的朋友开启Tasmota的串口日志控制台输入LogLevel 2或更高开启Mosquitto的日志修改配置文件中的log_dest和log_type在出问题时这些日志是定位问题根源的最直接证据。