node-red-contrib-symi-modbus 2.6.3 → 2.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -479,7 +479,7 @@ msg.payload = 1; // 或 0
479
479
 
480
480
  ## 项目信息
481
481
 
482
- **版本**: v2.6.3
482
+ **版本**: v2.6.4
483
483
 
484
484
  **核心功能**:
485
485
  - 支持多种Modbus协议(Telnet ASCII、RTU over TCP、Modbus TCP、Modbus RTU串口)
@@ -499,20 +499,24 @@ msg.payload = 1; // 或 0
499
499
  - Node.js: >=14.0.0
500
500
  - Node-RED: >=2.0.0
501
501
 
502
- **最新更新(v2.6.3)**:
502
+ **最新更新(v2.6.4)**:
503
+ - **🔥 日志优化**:大幅减少日志输出,保证长期稳定运行
504
+ - 高频操作日志改为debug级别(按键、轮询、写入等)
505
+ - 默认不输出到日志文件,不占用硬盘空间
506
+ - 保留错误日志的10分钟限流机制
507
+ - 完善的内存清理机制,防止内存泄漏
508
+ - **适合工控机长期运行**:
509
+ - 无debug节点时不产生日志
510
+ - 不会因日志增加硬盘占用
511
+ - 不会因日志增加内存占用
512
+ - 断网/MQTT断开也不会持续报错
513
+
514
+ **v2.6.3更新**:
503
515
  - **🔥 MQTT可选配置**:完全兼容无MQTT环境
504
516
  - 本地模式:纯串口通信,断网也能稳定运行
505
517
  - MQTT模式:可选接入Home Assistant等第三方平台
506
518
  - 智能切换:MQTT断开时自动切换到本地模式
507
519
  - 状态显示:清晰区分当前运行模式
508
- - **改进的错误提示**:
509
- - MQTT未配置时不再报错,提示使用本地模式
510
- - 友好的配置引导信息
511
- - 更清晰的节点状态指示
512
- - **增强的稳定性**:
513
- - 支持纯本地化部署,不受网络影响
514
- - 工控机断网环境下持续稳定运行
515
- - 保持所有原有功能的兼容性
516
520
 
517
521
  **性能优化**:
518
522
  - 轮询间隔优化:修复间隔计算逻辑,确保每个从站使用正确的轮询间隔
@@ -495,7 +495,7 @@ module.exports = function(RED) {
495
495
  tryConnect(brokerCandidates[0]);
496
496
  }, 5000);
497
497
  } else {
498
- node.log(`尝试备用MQTT broker: ${nextBroker}`);
498
+ node.debug(`尝试备用MQTT broker: ${nextBroker}`);
499
499
  setTimeout(() => {
500
500
  tryConnect(nextBroker);
501
501
  }, 500); // 快速尝试下一个地址
@@ -866,9 +866,9 @@ module.exports = function(RED) {
866
866
  }
867
867
 
868
868
  if (isFirstPoll) {
869
- node.log(`从站${slaveId}首次轮询成功,读取${coilCount}个线圈`);
869
+ node.debug(`从站${slaveId}首次轮询成功,读取${coilCount}个线圈`);
870
870
  } else if (publishCount > 0) {
871
- node.log(`从站${slaveId}状态变化: ${publishCount}个线圈`);
871
+ node.debug(`从站${slaveId}状态变化: ${publishCount}个线圈`);
872
872
  }
873
873
 
874
874
  node.deviceStates[slaveId].lastUpdate = Date.now();
@@ -1021,7 +1021,7 @@ module.exports = function(RED) {
1021
1021
  const channel = frame.channel; // 通道号(1-8)
1022
1022
  const state = frame.opInfo[0] === 0x01; // 状态(1=开,0=关)
1023
1023
 
1024
- node.log(`Symi按键事件: 设备${deviceAddr} 通道${channel} 状态=${state ? 'ON' : 'OFF'}`);
1024
+ node.debug(`Symi按键事件: 设备${deviceAddr} 通道${channel} 状态=${state ? 'ON' : 'OFF'}`);
1025
1025
 
1026
1026
  // 查找对应的从站和线圈
1027
1027
  // 假设:设备地址1对应从站10,设备地址2对应从站11,以此类推
@@ -1042,7 +1042,7 @@ module.exports = function(RED) {
1042
1042
  return;
1043
1043
  }
1044
1044
 
1045
- node.log(`Symi按键映射: 设备${deviceAddr}通道${channel} → 从站${slaveId}线圈${coilNumber}`);
1045
+ node.debug(`Symi按键映射: 设备${deviceAddr}通道${channel} → 从站${slaveId}线圈${coilNumber}`);
1046
1046
 
1047
1047
  // 写入线圈(异步,不阻塞)
1048
1048
  node.writeSingleCoil(slaveId, coilNumber, state).catch(err => {
@@ -1102,7 +1102,7 @@ module.exports = function(RED) {
1102
1102
  // 更新本地状态
1103
1103
  node.deviceStates[slaveId].coils[coil] = value;
1104
1104
 
1105
- node.log(`写入成功: 从站${slaveId} 线圈${coil} = ${value}`);
1105
+ node.debug(`写入成功: 从站${slaveId} 线圈${coil} = ${value}`);
1106
1106
 
1107
1107
  // 发布到MQTT和触发事件
1108
1108
  node.publishMqttState(slaveId, coil, value);
@@ -1120,7 +1120,7 @@ module.exports = function(RED) {
1120
1120
  node.pausePolling = false;
1121
1121
  const pauseDuration = Date.now() - pauseStartTime;
1122
1122
  if (node.pollingPausedCount > 0) {
1123
- node.log(`轮询暂停 ${pauseDuration}ms,跳过 ${node.pollingPausedCount} 次轮询`);
1123
+ node.debug(`轮询暂停 ${pauseDuration}ms,跳过 ${node.pollingPausedCount} 次轮询`);
1124
1124
  node.pollingPausedCount = 0;
1125
1125
  }
1126
1126
  }, 100);
@@ -1185,7 +1185,7 @@ module.exports = function(RED) {
1185
1185
  });
1186
1186
  }
1187
1187
 
1188
- node.log(`批量写入成功: 从站${slaveId} 起始线圈${startCoil} 共${values.length}个线圈`);
1188
+ node.debug(`批量写入成功: 从站${slaveId} 起始线圈${startCoil} 共${values.length}个线圈`);
1189
1189
 
1190
1190
  // 释放锁
1191
1191
  node.modbusLock = false;
@@ -1195,7 +1195,7 @@ module.exports = function(RED) {
1195
1195
  node.pausePolling = false;
1196
1196
  const pauseDuration = Date.now() - pauseStartTime;
1197
1197
  if (node.pollingPausedCount > 0) {
1198
- node.log(`轮询暂停 ${pauseDuration}ms,跳过 ${node.pollingPausedCount} 次轮询`);
1198
+ node.debug(`轮询暂停 ${pauseDuration}ms,跳过 ${node.pollingPausedCount} 次轮询`);
1199
1199
  node.pollingPausedCount = 0;
1200
1200
  }
1201
1201
  }, 100);
@@ -292,14 +292,14 @@ module.exports = function(RED) {
292
292
  globalDebounceCache.set(debounceKey, now);
293
293
 
294
294
  if (isSceneMode) {
295
- node.log(`场景触发: 面板${node.config.switchId} 按键${node.config.buttonNumber}`);
295
+ node.debug(`场景触发: 面板${node.config.switchId} 按键${node.config.buttonNumber}`);
296
296
  // 场景模式:切换状态(每次触发时翻转)
297
297
  node.currentState = !node.currentState;
298
298
  node.sendMqttCommand(node.currentState);
299
299
  } else {
300
300
 
301
301
  // 开关模式:根据状态发送ON/OFF
302
- node.log(`开关${buttonEvent.state ? 'ON' : 'OFF'}: 面板${node.config.switchId} 按键${node.config.buttonNumber}`);
302
+ node.debug(`开关${buttonEvent.state ? 'ON' : 'OFF'}: 面板${node.config.switchId} 按键${node.config.buttonNumber}`);
303
303
  node.sendMqttCommand(buttonEvent.state);
304
304
  }
305
305
  }
@@ -340,7 +340,7 @@ module.exports = function(RED) {
340
340
  };
341
341
 
342
342
  node.send(msg);
343
- node.log(`本地模式:发送控制命令到从站${node.config.targetSlaveAddress} 线圈${node.config.targetCoilNumber} = ${state ? 'ON' : 'OFF'}`);
343
+ node.debug(`本地模式:发送控制命令到从站${node.config.targetSlaveAddress} 线圈${node.config.targetCoilNumber} = ${state ? 'ON' : 'OFF'}`);
344
344
  };
345
345
 
346
346
  // 处理命令队列(防止多个按键同时按下造成冲突)
@@ -666,7 +666,7 @@ module.exports = function(RED) {
666
666
  tryConnect(brokerCandidates[0]);
667
667
  }, 5000);
668
668
  } else {
669
- node.log(`尝试备用MQTT broker: ${nextBroker}`);
669
+ node.debug(`尝试备用MQTT broker: ${nextBroker}`);
670
670
  setTimeout(() => {
671
671
  tryConnect(nextBroker);
672
672
  }, 500); // 快速尝试下一个地址
@@ -715,7 +715,7 @@ module.exports = function(RED) {
715
715
 
716
716
  if (!stateChanged && timeSinceLastChange < 100) {
717
717
  // 状态未变化且时间间隔太短,跳过LED反馈(避免死循环)
718
- node.log(`跳过LED反馈(状态未变化,间隔${timeSinceLastChange}ms)`);
718
+ node.debug(`跳过LED反馈(状态未变化,间隔${timeSinceLastChange}ms)`);
719
719
  return;
720
720
  }
721
721
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-red-contrib-symi-modbus",
3
- "version": "2.6.3",
3
+ "version": "2.6.4",
4
4
  "description": "Node-RED Modbus节点,支持TCP/串口通信、串口自动搜索、多设备轮询、可选MQTT集成(支持纯本地模式和MQTT模式)、Home Assistant自动发现和物理开关面板双向同步,工控机长期稳定运行",
5
5
  "main": "nodes/modbus-master.js",
6
6
  "scripts": {