当前位置: 首页 > news >正文

基于MQTT与Node-RED的工业PLC与智能家居系统集成实践

1. 项目概述:当工业PLC遇见智能家居

作为一名在工业自动化和智能家居领域都折腾过不少项目的工程师,我一直对如何打通这两个看似泾渭分明的世界充满兴趣。工业现场有稳定可靠的PLC(可编程逻辑控制器),控制着生产线上的电机、阀门和传感器;而家里则有各种智能灯、温控器和传感器,通过Home Assistant这样的平台管理。它们之间似乎隔着一道无形的墙。直到我开始深入使用MQTT这个协议,才发现它就像一座完美的桥梁,能够轻松地将西门子S7-300这样的工业设备和Home Assistant这样的智能家居平台连接在一起,实现真正的跨界融合。

这个项目的核心目标,就是构建一个统一的监控与控制中枢。想象一下,你可以在家里的平板电脑上,不仅能看到客厅的灯光状态,还能实时查看工厂车间某个PT100温度传感器的读数,甚至远程启停一个工业泵。或者,反过来,通过一个便携的ESP32触摸屏(如M5Stack Core 2),在车间里就能控制家里的智能灯具。这一切的基础,就是基于MQTT协议的发布/订阅模型。它轻量、高效,特别适合在资源受限的物联网设备间传递消息。本项目将详细拆解如何利用树莓派作为家庭服务器,运行Home AssistantNode-RED,通过MQTT协议,将西门子PLC、基于ESP8266/ESP32的智能设备(如刷了Tasmota的Sonoff开关)全部整合到一个可视化的仪表盘中。

整个方案的价值在于其灵活性和可扩展性。它不仅仅是一个简单的“遥控器”,而是构建了一个事件驱动的自动化生态系统。工业设备的状态变化可以触发家庭场景(比如车间温度过高时,自动打开家里的空调进行预警),而家庭的传感器数据也可以作为工业控制的输入条件。无论你是工厂的设备工程师想实现远程运维,还是智能家居爱好者想探索更硬核的自动化可能性,这个实践都能提供一个清晰的路径和可复现的细节。

2. 核心思路与系统架构设计

2.1 为什么选择MQTT作为核心协议?

在工业与家居融合的场景下,通信协议的选择至关重要。我们常见的协议有HTTP、Modbus TCP、OPC UA等,但MQTT有其独特的优势。首先,它是基于发布/订阅模式的,这意味着数据生产者(Publisher)和消费者(Subscriber)完全解耦。PLC只需要向一个特定的“主题”(Topic)发布温度数据,而Home Assistant、Node-RED仪表盘、M5Stack屏幕都可以同时订阅这个主题来获取数据,彼此无需知道对方的存在。这种松耦合特性非常适合分布式、异构的系统集成。

其次,MQTT非常轻量,报文头最小只有2字节,对网络带宽和设备计算资源的要求极低,这使得它能够运行在ESP8266这类微控制器上。最后,MQTT支持三种服务质量(QoS)等级,从“最多一次”到“确保到达”,你可以根据数据的重要性进行选择。对于灯光开关指令,可能用QoS 1确保送达;对于持续更新的温度流数据,用QoS 0减少开销也是可以的。基于这些原因,MQTT成为了连接工业现场“哑设备”与智能家居“大脑”的理想信使。

2.2 整体系统架构与数据流

整个系统的架构可以看作一个以MQTT Broker(消息代理)为中心的星型网络。树莓派在这里扮演了家庭服务器的核心角色,它上面运行着几个关键服务:

  1. Home Assistant:作为主控平台和用户界面。
  2. Mosquitto Broker:作为MQTT消息代理,所有设备都连接到这里进行消息交换。
  3. Node-RED:作为逻辑编排和协议转换的“粘合剂”,特别是处理与西门子PLC的通信。

数据流是双向的:

  • 控制流(下行):用户在Home Assistant仪表盘或M5Stack屏幕上点击一个按钮 -> Home Assistant通过MQTT向cmnd/sonoff1/POWER主题发送“ON”命令 -> Sonoff开关(Tasmota固件)订阅该主题并执行开灯 -> Sonoff开关同时向stat/sonoff1/POWER主题发布状态“ON” -> Home Assistant订阅该主题并更新UI状态。
  • 数据流(上行):西门子S7-300 PLC通过PT100模块读取温度 -> PLC程序将温度值写入数据块DB1.DBD10 -> Node-RED通过node-red-contrib-s7节点周期性地从PLC读取该数据 -> Node-RED将数据封装成JSON格式,发布到PLC/Temperature主题 -> Home Assistant和M5Stack Core 2同时订阅该主题,并更新各自的温度显示。

这种架构的优势在于,任何新设备只要支持MQTT,就能很容易地接入这个系统。你不需要在Home Assistant或PLC上为每个新设备编写复杂的驱动,只需要让它们按照约定好的主题格式发布/订阅消息即可。

2.3 硬件选型与角色分工

硬件清单看起来不少,但每样都有其明确职责:

  • 控制中枢树莓派4 Model B。选择它的原因是其稳定的性能、丰富的社区支持和较低的功耗,非常适合7x24小时运行家庭服务器。它负责承载所有核心软件服务。
  • 工业端
    • 西门子S7-300 PLC (CPU314C-2DP):经典的工业控制器,可靠性高。本项目用它控制4盏24V DC继电器驱动的灯,并读取PT100温度。
    • CP 343-1 Lean通讯处理器:为S7-300提供以太网接口,使其能够接入TCP/IP网络,与Node-RED通信。
    • ET200S分布式I/O站:通过Profibus总线扩展PLC的I/O点,本例中用于接入PT100温度传感器模块。这种模块化设计是工业现场的典型做法。
  • 智能家居端
    • Sonoff Basic(刷入Tasmota固件):低成本Wi-Fi开关模块的代表。原厂固件封闭,刷入开源的Tasmota后,可以完全本地化控制并原生支持MQTT,摆脱云服务依赖。
    • NodeMCU ESP8266 / M5StickC ESP32:作为ESPHome设备。ESPHome是另一个优秀的开源固件框架,它通过YAML文件配置,能轻松将ESP系列芯片接入Home Assistant,实现高度自定义的传感器和执行器。
  • 移动交互端M5Stack Core 2。这是一款集成了屏幕、按钮和ESP32的开发套件。刷入HomePoint固件后,它成为一个专为Home Assistant设计的本地化触摸屏控制器,不依赖云端,响应迅速,且能离线显示关键信息。

注意:硬件选择具有很大的灵活性。PLC可以是其他支持以太网通信的型号(如S7-1200/1500);智能开关也可以用其他兼容Tasmota或ESPHome的模块;树莓派也可以用旧电脑或小型服务器替代。核心在于理解各部分的角色和通信原理。

3. 软件生态搭建与核心配置详解

3.1 Home Assistant及其生态组件安装

在树莓派上安装Home Assistant最推荐的方法是使用Home Assistant Operating System。它会将整个SD卡刷成一个为Home Assistant优化的系统,管理起来最省心。安装完成后,通过浏览器访问http://[树莓派IP]:8123即可进入初始化界面。

接下来的关键是安装Add-ons(附加组件),它们像是Home Assistant的“应用商店”:

  1. Mosquitto broker:这是我们的MQTT消息中枢。安装后务必在配置中设置用户名和密码,增强安全性。它的连接信息(IP: 192.168.1.14,端口: 1883)将是所有设备连接的统一入口。
  2. Node-RED:流程编排的核心。安装后需要在其“配置”选项卡中勾选“信任外部网络”和“启用Home Assistant集成”。这样Node-RED才能与Home Assistant的服务进行深度交互。
  3. ESPHome:用于管理ESP8266/ESP32设备的利器。它提供了一个Web UI,可以编译和推送固件,并自动在Home Assistant中创建设备实体。
  4. File editor & Samba share:这两个工具极大方便了文件管理。File editor可以直接在网页上编辑YAML配置文件,Samba则允许你在电脑上像访问网络文件夹一样操作树莓派上的文件。
  5. HACS:这不是官方Add-on,但几乎是必备的。它是一个社区商店,可以安装大量官方库中没有的集成和前端卡片。例如后文会用到的stack-in-card卡片。

3.2 Node-RED与西门子PLC的通信桥梁搭建

这是项目中技术含量较高的一环。西门子S7系列PLC通常使用其私有的S7协议进行数据交换,而Node-RED通过node-red-contrib-s7这个第三方节点库实现了对该协议的解析。

安装与配置s7节点: 首先在Node-RED的“节点管理”中安装node-red-contrib-s7。配置的关键在于创建一个“s7 endpoint”节点,它定义了与PLC的连接参数:

  • Transport:选择Ethernet (ISO-on-TCP)。这是S7-300/400 over Ethernet的典型协议。
  • Address:填写PLC的IP地址,本例为192.168.1.71
  • Port:保持默认的102,这是S7通信的标准端口。
  • Rack/Slot:根据PLC硬件组态填写。对于CPU314C-2DP,通常Rack=0,Slot=2(CPU在机架0的2号槽位)。这个信息可以在STEP 7的硬件配置中查看。

数据点映射: 在PLC的编程软件STEP 7中,我们在数据块DB1中定义了控制点和数据点。例如,DB1.DBX0.0(即DB1中第0个字节的第0位)控制第一盏灯。在Node-RED的s7 ins7 out节点中,这个地址需要写作DB1,X0.0。这里的“X”代表位(Bit)存储区。对于温度值DB1.DBD10(一个32位浮点数),在Node-RED中则对应DB1,REAL10

实操心得:PLC与Node-RED的第一次连接常常会失败。请按以下顺序排查:1) 确认PLC与树莓派在同一网段且能互相ping通;2) 确认STEP 7中已正确配置了CP343-1 Lean的IP地址并下载了硬件组态;3) 检查Node-RED中Rack和Slot号是否正确;4) 确保PLC处于RUN模式。可以先在Node-RED中用s7 in节点尝试读取一个已知的数据点(如某个始终为1的标志位),来验证通信链路是否通畅。

3.3 MQTT主题规划与命名规范

一个清晰、一致的MQTT主题命名规范是系统长期可维护的基础。建议采用分层结构,例如:

  • home/livingroom/light/state-> 发布客厅灯的状态
  • home/livingroom/light/set-> 订阅以控制客厅灯
  • factory/line1/temperature-> 发布1号线的温度
  • factory/line1/pump/state-> 发布泵的状态

在本项目中,我们实际使用了类似但更简洁的命名:

  • 控制Sonoffcmnd/sonoff1/POWER(命令),stat/sonoff1/POWER(状态)。
  • PLC温度PLC/Temperature
  • PLC灯光状态反馈PLC/Light0,PLC/Light1等。

这种“设备/功能”的二分结构非常清晰。在Home Assistant的configuration.yaml中配置MQTT设备时,state_topiccommand_topic就分别对应“状态”和“命令”主题,实现了双向通信。

4. 工业端:西门子S7-300 PLC的配置与编程

4.1 硬件组态与网络配置

首先需要在STEP 7 V5.6中完成硬件组态。在HW Config界面中,依次从目录中拖入机架(Rail)、电源模块PS 307、CPU 314C-2DP和通讯模块CP 343-1 Lean到相应的插槽。双击CP 343-1 Lean模块,进入属性设置,最关键的是在“参数”选项卡中为其分配IP地址(192.168.1.71)、子网掩码和网关。务必确保这个IP与你的家庭网络在同一网段,且不与其它设备冲突。

组态完成后,需要编译并下载到PLC中。下载时,STEP 7会通过编程电缆(如PC Adapter USB)先将硬件组态信息下载到CPU,此时CP模块的IP地址才真正生效。之后,PLC与Node-RED的通信就基于这个IP地址进行。

4.2 数据块设计与梯形图编程

为了实现与外部系统的数据交换,我们需要在PLC中预留一块内存区域作为“交换区”。通常做法是创建一个共享数据块(如DB1),并取消其“仅存储在装载内存中”的选项,确保它存储在工作内存中,可被实时读写。

在DB1中定义变量:

  • Light_0(Bool,地址 DB1.DBX0.0):灯0控制信号,对应物理输出Q124.0。
  • Light_1(Bool, DB1.DBX0.1):对应Q124.1。
  • Light_2(Bool, DB1.DBX0.2):对应Q124.2。
  • Light_3(Bool, DB1.DBX0.3):对应Q124.3。
  • Temperature(Real, DB1.DBD10):用于存储从PT100读取的温度值。

在OB1(主循环组织块)中编写简单的梯形图逻辑:

  • 控制部分:直接将Light_0等BOOL变量与对应的输出点Q124.0等进行线圈输出。这样,当Node-RED通过S7协议写DB1.DBX0.0为1时,Q124.0就会得电,驱动继电器吸合。
  • 数据采集部分:使用“读模拟量输入”指令,将PT100模块通道的输入字(如PIW276)读取出来。由于PT100模块通常输出的是整数值(如对应于0-27648),需要根据传感器量程和模块型号进行换算,转换成实际的温度值(单位℃),然后移动到DB1.DBD10中。这个换算公式需要参考ET200S模拟量输入模块的手册。

4.3 本地测试与调试

在连接Home Assistant之前,务必在STEP 7的“变量表”或“监控与修改变量”功能中,对DB1的数据进行强制(Force)写入和监控。手动将DB1.DBX0.0改为1,观察对应的输出点Q124.0是否亮起,以及实际的灯是否点亮。同时监控DB1.DBD10的值,看其是否随着温度变化而正常变化。只有确保PLC本地逻辑完全正确,才能进行下一步的集成,否则网络调试会变得异常复杂。

5. 智能设备端:固件刷写与接入

5.1 Tasmota与Sonoff开关的本地化改造

Sonoff Basic等智能开关出厂固件通常依赖云服务器。刷入Tasmota固件后,设备将完全在本地局域网内工作,通过MQTT与Home Assistant通信,响应速度更快,且隐私和安全更有保障。

刷机步骤与避坑指南

  1. 硬件准备:拆开Sonoff外壳,在电路板上找到预留的4针串口调试焊盘(通常标有3V3, RX, TX, GND)。焊接排针或用探针夹住。
  2. 连接USB转TTL:使用FT232RL等模块,切记:Sonoff的TX接转换器的RX,Sonoff的RX接转换器的TX,3V3和GND对应连接。不要接VCC,以免烧毁。
  3. 进入刷机模式:Sonoff通常需要在上电瞬间将GPIO0拉低到GND才能进入固件烧录模式。有的型号有按钮,按住按钮再上电即可;没有按钮的则需要将GPIO0焊盘与GND短接再上电。
  4. 使用Tasmotizer:这是一款图形化工具,非常方便。选择正确的COM口,加载下载好的tasmota.bin固件文件,点击“Tasmotize!”即可。刷写成功后,设备会重启。
  5. 首次配置:用手机或电脑连接设备发出的Wi-Fi热点(名称类似tasmota-xxxx),在浏览器打开192.168.4.1,配置你的家庭Wi-Fi名称和密码。配置成功后,设备会重启并连接到你的网络。

MQTT配置: 在Tasmota的Web界面(通过设备IP访问)中,进入“Configuration” -> “Configure MQTT”:

  • Host:192.168.1.14(你的树莓派IP)
  • Port:1883
  • Client, User, Password: 填写Mosquitto broker中设置的认证信息。
  • Topic: 填写sonoff1(自定义,用于区分设备)。 保存重启后,Tasmota会自动以tele/sonoff1/STATE等主题上报信息,并订阅cmnd/sonoff1/POWER来接收控制命令。

5.2 ESPHome与ESP8266/ESP32设备配置

ESPHome是另一种强大的本地化方案,它通过YAML文件定义设备的功能,然后编译生成固件并OTA(无线)更新,与Home Assistant的集成更是无缝。

以NodeMCU ESP8266为例: 在Home Assistant的ESPHome插件Web UI中,点击“+”添加新设备,输入名称(如nodemcu_dehumidifier),选择设备类型(ESP8266),填写Wi-Fi信息。点击“EDIT”编辑生成的YAML文件。一个简单的控制继电器的配置如下:

esphome: name: nodemcu_dehumidifier esp8266: board: nodemcuv2 wifi: ssid: !secret wifi_ssid password: !secret wifi_password # 启用OTA和API,用于Home Assistant连接 api: ota: # 定义一个GPIO输出,连接继电器 switch: - platform: gpio name: "Dehumidifier Relay" pin: GPIO5 id: relay_1

保存后,点击“INSTALL”可以选择“Plug into the computer this computer”通过USB线刷写,或者如果设备已在同一网络,可以选择“Wirelessly”进行OTA安装。安装成功后,在Home Assistant的“集成”中会自动发现这个新设备,并添加一个名为switch.dehumidifier_relay的实体。

对于M5StickC:由于其引脚定义和屏幕驱动特殊,需要引用社区提供的自定义组件。在YAML文件中通过external_components引用GitHub上的特定配置,并定义屏幕显示元素和按钮。这比Tasmota的配置更灵活,可以实现复杂的UI交互逻辑。

6. 移动交互端:HomePoint与M5Stack Core 2集成

M5Stack Core 2是一款颜值和功能都在线的开发套件,刷入HomePoint固件后,它就变成了一个专为Home Assistant设计的离线触摸屏控制器。

刷写与配置流程

  1. 下载固件:从HomePoint的GitHub仓库下载对应M5Stack Core 2的.bin文件。
  2. 使用esptool刷写:通过USB连接电脑,使用命令esptool.py write_flash 0x0 homepoint_m5stackcore2_full.bin进行刷写。刷写时可能需要指定闪存模式(如-fm dout)和大小(-fs 4MB),具体参考设备文档。
  3. 初始配置:刷写成功后,设备会启动一个名为HomePoint-Config的Wi-Fi热点。连接后,在浏览器打开192.168.99.1,配置你的家庭Wi-Fi名称、密码,以及登录HomePoint网页的账号密码。
  4. 编辑配置文件:设备连接家庭Wi-Fi后,会获得一个新IP(如192.168.1.12)。通过浏览器访问此IP,用设置的账号登录,即可看到一个文件管理器。编辑/config.json文件是关键。

config.json文件解析: 这个JSON文件定义了屏幕上显示的界面元素。主要包含scenes数组,每个场景可以是一个Light类型(控制开关)或Sensor类型(显示数值)。

  • 对于Tasmota开关,需要正确设置setTopic(命令主题)和getTopic(状态主题),以及onValue/offValue(通常Tasmota用true/falseON/OFF)。
  • 对于PLC温度传感器,type设为singleValuejsondata设为truegetTopic设为temperature(即Node-RED发布的数据主题),firstKey设为temperature(对应JSON中的键名)。这意味着HomePoint会订阅temperature主题,并解析如{"temperature": 56.7}这样的JSON消息,将56.7显示在屏幕上。

注意事项:HomePoint的配置主题格式可能与Home Assistant直接使用的略有不同。例如,Tasmota的状态主题在Home Assistant中我们用了stat/sonoff1/POWER,但在HomePoint的配置中,可能需要具体到stat/sonoff1/POWER1(如果开关是单路)。这需要根据Tasmota设备实际发布的主题进行调整,务必通过MQTT客户端工具(如MQTT Explorer)订阅#主题,查看设备实际发布的消息结构。

7. 可视化集成:Home Assistant仪表盘与Node-RED流设计

7.1 Home Assistant Lovelace仪表盘编排

Home Assistant的UI界面称为Lovelace,它采用卡片式布局,高度可定制。

基础实体卡片:对于通过MQTT自动发现或ESPHome集成的设备(如Sonoff开关、NodeMCU继电器),Home Assistant会自动创建实体(switch.gatelight)。在仪表盘编辑模式下,直接添加“实体卡片”并选择这些实体即可,这是最简单的方式。

使用HACS安装自定义卡片:为了实现更复杂的布局,例如将多个按钮和一个仪表盘组合在一起,我们需要通过HACS安装stack-in-cardvertical-stack-in-card这类卡片。安装后,在编辑仪表盘时选择“手动添加卡片”,然后输入YAML配置。如项目中所示,通过type: custom:stack-in-card配合horizontal-stack,可以将四个灯光按钮和一个温度仪表盘垂直堆叠在一个卡片内,界面更紧凑美观。

嵌入Node-RED仪表盘:Node-RED自带一个简单的Dashboard UI组件。你可以创建一个包含开关、图表的新标签页。在Home Assistant中,使用“网页卡片”,将Node-RED Dashboard的URL(如http://192.168.1.14:1880/ui)嵌入进去。这样就在Home Assistant内部提供了一个备用的控制界面,适合展示更复杂的流程图或历史数据。

7.2 Node-RED流逻辑深度解析

Node-RED的流(Flow)是整个系统的逻辑中枢,尤其是处理与PLC的通信。以下是核心流的分解:

  1. PLC灯光控制流

    • 起点:Home Assistant中的switch.plc_light_0等实体。当用户在UI上操作时,会触发state_changed事件。
    • 捕获事件:使用events: state节点,配置entity_id为对应的开关实体,并输出msg.payload为实体的新状态(onoff)。
    • 状态转换:后续接一个function节点或change节点,将on/off字符串转换为PLC能理解的BOOL值true/false1/0
    • 写入PLC:连接s7 out节点,配置好之前创建的s7 endpoint连接,并设置变量地址为DB1,X0.0等。将转换后的BOOL值写入PLC的对应数据位。
  2. PLC温度读取与发布流

    • 定时读取:使用inject节点定时(如每10秒)触发,或者用stoptimer节点实现循环读取。
    • 读取PLC数据:触发s7 in节点,读取DB1,REAL10地址的浮点数温度值。
    • 数据格式化:通过function节点,将读取到的原始值封装成JSON对象,例如{“temperature”: 56.7}。同时,为了兼容HomePoint,可能需要生成另一个特定格式的JSON。
    • MQTT发布:使用两个mqtt out节点,分别向PLC/Temperature主题(供Home Assistant订阅)和temperature主题(供HomePoint订阅)发布格式化后的消息。
  3. 灯光状态反馈流(增强可靠性):

    • 除了控制,我们还可以让PLC将实际输出点的状态(如Q124.0)读回,并写入DB的另一个区域(如DB1.DBX4.0)。
    • 在Node-RED中,用另一个s7 in节点周期性地读取这些反馈位。
    • 然后通过mqtt out节点发布到PLC/Light0等主题。
    • 在Home Assistant中,配置binary_sensor来订阅这些主题。这样,UI上不仅能发送指令,还能显示PLC侧确认的实际状态,实现真正的状态同步,防止因网络延迟或PLC故障导致的状态显示不一致。

8. 安全加固与网络优化实践

8.1 MQTT Broker安全配置

默认安装的Mosquitto broker可能没有启用认证,这是不安全的。务必在Home Assistant的Mosquitto插件配置中(configuration.yaml或插件UI)设置强密码。

# 示例:在Mosquitto broker的add-on配置中(非configuration.yaml) logins: - username: mqtt_user password: your_very_strong_password_here anonymous: false

同时,考虑将默认端口1883改为非标准端口,并在路由器中避免不必要的端口转发。如果确实需要从外网访问,强烈建议使用VPN接入家庭网络,而不是直接将MQTT端口暴露在公网。

8.2 网络分段与隔离

对于包含工业设备的网络,进行逻辑分段是一个好习惯。如果条件允许,可以将PLC、工业交换机等设备部署在一个独立的VLAN中,而家庭IoT设备在另一个VLAN。树莓派(运行Node-RED)作为网关,拥有访问两个VLAN的权限,负责协议转换。这样可以防止家庭网络中可能不安全的设备直接访问工业控制网络,提升安全性。

8.3 系统可靠性提升技巧

  • Node-RED流持久化:确保Node-RED的流已保存,并且设置了“自动部署更改”。可以定期备份流(导出为JSON文件)。
  • Home Assistant自动启动:将树莓派配置为开机自动启动Docker容器(如果使用Docker安装)或Home Assistant OS服务。
  • 看门狗与监控:可以为Node-RED流添加“ping”节点,定期向PLC发送测试请求,如果超时,则通过Home Assistant发送一条通知消息到手机。也可以利用Home Assistant的系统监控传感器,监视树莓派的CPU、内存和磁盘使用情况。
  • 电源保障:为树莓派和核心网络设备(路由器、交换机)配备UPS(不间断电源),防止意外断电导致系统损坏或数据丢失。

9. 故障排查与常见问题实录

在实际搭建过程中,你几乎一定会遇到各种问题。下面是一些典型问题的排查思路:

问题1:Home Assistant中无法发现MQTT设备。

  • 检查:进入Home Assistant的“开发者工具” -> “状态”,查看是否有类似switch.gatelight的实体。如果没有:
    • 检查configuration.yaml中MQTT开关的配置语法(缩进、冒号)。
    • 检查Mosquitto broker日志(在Home Assistant Supervisor中查看),确认设备是否成功连接并发布了LWT(遗嘱)消息。
    • 使用MQTT客户端工具(如MQTT Explorer)订阅#主题,查看Sonoff设备是否在发布stat/sonoff1/POWER等主题的消息。

问题2:Node-RED无法连接PLC,提示“Connection timed out”或“Error on connect”。

  • 检查
    1. 物理连接:确认网线已连接,PLC和树莓派的网口指示灯正常。
    2. IP连通性:在树莓派终端执行ping 192.168.1.71,看是否能通。
    3. 防火墙:确认PLC侧或中间网络设备没有防火墙阻止102端口。
    4. PLC配置:确认STEP 7中CP模块的IP配置已下载,PLC处于RUN模式。
    5. Node-RED配置:确认s7 endpoint中的IP、机架号、槽位号完全正确。槽位号尤其容易出错,对于单机架的S7-300,CPU通常在2号槽(从1开始计数,电源为1,CPU为2)。

问题3:M5Stack Core 2(HomePoint)无法控制Sonoff开关。

  • 检查
    1. 主题匹配:用MQTT工具查看Sonoff实际订阅的命令主题是cmnd/sonoff1/POWER还是cmnd/sonoff1/POWER1。HomePoint配置中的setTopic必须与之完全一致。
    2. Payload格式:检查HomePoint配置中的onValueoffValue。Tasmota默认可能期望ON/OFF,而你的配置里可能是true/false。同样,通过MQTT工具查看当手动发布消息时,Sonoff响应哪种格式。
    3. MQTT连接:在HomePoint的网页界面或串口日志中,查看其是否成功连接到了Broker(192.168.1.14)。

问题4:PLC温度值在Home Assistant中显示不正确或为未知。

  • 检查
    1. 数据源:在Node-RED中调试,在s7 in节点后添加debug节点,查看读取到的原始值是否正确。可能是地址DB1,REAL10不对,或者PLC中温度转换程序有误。
    2. MQTT发布:在mqtt out节点后添加debug节点,查看发布出去的消息内容是否正确,是否为合法的JSON格式,如{"temperature": 25.5}
    3. Home Assistant订阅:检查configuration.yaml中传感器配置的state_topic是否与Node-RED发布的主题一致,value_template是否正确解析了JSON。例如,{{ value_json.temperature | float | round(2) }}可以正确解析上述JSON并保留两位小数。

问题5:系统延迟感觉较大。

  • 优化
    • MQTT QoS:对于控制命令,使用QoS 1或2确保送达,但会略有延迟。对于传感器数据,使用QoS 0。
    • Node-RED读取间隔:调整读取PLC温度的触发间隔,从1秒改为5秒或10秒,可以显著减少网络负载。
    • 硬件性能:检查树莓派的CPU和内存使用率。如果运行的服务太多,考虑升级硬件或优化服务。

这个项目从构思到实现,涉及了工业控制、嵌入式开发、网络通信和软件集成多个领域。最大的体会是,标准化协议(如MQTT)和模块化工具(如Node-RED、Home Assistant)的强大之处在于解耦。你可以分别深入优化每一个环节——用STEP 7写好稳定的PLC逻辑,用ESPHome精细定义传感器行为,用Node-RED编排复杂的联动规则,最后用Home Assistant呈现统一的界面——而它们之间通过MQTT这个轻量级消息总线优雅地通信。这种架构不仅让本次集成成为可能,更为未来接入更多设备、实现更复杂的跨域自动化,打下了极其灵活的基础。当你第一次在手机App上点击按钮,看到车间里的工业灯应声而亮时,那种打破壁垒的成就感,正是驱动我们不断探索的动力。

http://www.zskr.cn/news/1441484.html

相关文章:

  • 基于ESP32与PWM的逆变器风扇智能调速系统设计与实现
  • 坐标杭州,2026意式极简全屋定制避坑白皮书——一篇看懂 - 高定
  • 手机拍证件照全教程2026:拍摄方法+规范要求,手把手教你一次拍合格 - 软件小管家
  • Sora 2信息图表动画合规红线(2024Q2版):GDPR/CCPA/信安标委新规下动态数据可视化的5项强制约束
  • 个人健康助手的高频入口设计:从 App、通知到 Agent 闭环的工程拆解
  • QKeyMapper:无需重启的Windows按键映射革命,让每个按键都成为你的智能助手
  • 拯救你的B站缓存视频:3分钟学会m4s转MP4终极技巧
  • 教务系统哪家好?2026年6月新推荐 - FaiscoJeff
  • 告别命令行!在CentOS 7 GNOME桌面为Chrome和Firefox创建并修复快捷方式的图文教程
  • 二自由度悬架Simulink仿真工具包:含ISO随机路面激励、时域响应曲线与FFT频谱图一键生成
  • 100类中草药实物图库,9983张原图按药材名分文件夹整理
  • 广州防腐木厂家实力排行榜:五家头部品牌对比 - 奔跑123
  • DIY书本机器人:从零打造会行走的创客项目
  • 如何通过规则引擎彻底改变浏览器标签管理体验?
  • 从零构建3D房屋模型与相机动画:Vectary实战全流程解析
  • 5分钟上手raylib即时模式GUI开发:打造轻量级游戏界面的终极指南
  • 基于Micro:bit与WS2812B灯环的应急照明灯制作指南
  • [分享] PTT制作神器 AI PPT一键生成工具V1.0.1
  • MATLAB滤波器耦合矩阵反演工具:支持折叠/交叉结构适配与S参数驱动建模
  • 快速同步数千首离线音乐歌词:LRCGET 终极解决方案
  • AI自动瞄准终极指南:基于YOLOv5的视觉瞄准系统深度解析
  • MyBatis-Plus、JPA、JOOQ 用了一圈后,我为什么还是自己写了个 ORM
  • 医学动画生产力革命:Sora 2上线48小时内,三甲医院放射科动画交付提速7.8倍(临床验证数据实录)
  • 工业设计师必抢的Sora 2三大核心能力,错过本轮OTA升级将永久缺失物理引擎精度补偿模块
  • OpenAI 65亿美元收购Jony Ive硬件公司io + Windsurf收购告吹:AI软硬一体化战略大决战
  • MiniCPM5-1B - 随身AI智能助手 擅长工具使用和复杂推理,长上下文处理能力强 一键整合包下载
  • 茶叶目标检测实战工程包:YOLOv5训练+多格式数据集适配+模型导出与API预留
  • ESP8266通过Whatabot实现WhatsApp消息收发:从环境搭建到智能家居应用
  • 056、多 GPU 分布式训练实战:DDP 配置、通信后端选型与加速比优化
  • DC-DC升压模块改造LED头灯:原理、实践与续航性能实测