@@ -43,6 +43,7 @@ const SparkplugPublishQueue = new Queue() // queue of values to publish as Spark
43
43
let SparkplugDeviceBirthed = false
44
44
let AutoCreateTags = true
45
45
const MongoStatus = { HintMongoIsConnected : false }
46
+ let LastNodeRebirth = 0
46
47
47
48
; ( async ( ) => {
48
49
const jsConfig = LoadConfig ( ) // load and parse config file
@@ -1144,16 +1145,22 @@ async function sparkplugProcess(
1144
1145
1145
1146
spClient . handle . on ( 'error' , function ( error ) {
1146
1147
Log . log ( logMod + "Event: Can't connect" + error )
1148
+ if ( spClient ?. handle ) spClient . handle . stop ( )
1149
+ spClient . handle = null
1147
1150
} )
1148
1151
1149
1152
spClient . handle . on ( 'close' , function ( ) {
1150
1153
SparkplugDeviceBirthed = false
1151
1154
Log . log ( logMod + 'Event: Connection Closed' )
1155
+ if ( spClient ?. handle ) spClient . handle . stop ( )
1156
+ spClient . handle = null
1152
1157
} )
1153
1158
1154
1159
spClient . handle . on ( 'offline' , function ( ) {
1155
1160
SparkplugDeviceBirthed = false
1156
1161
Log . log ( logMod + 'Event: Connection Offline...' )
1162
+ if ( spClient ?. handle ) spClient . handle . stop ( )
1163
+ spClient . handle = null
1157
1164
} )
1158
1165
1159
1166
// Create 'birth' handler
@@ -1406,17 +1413,16 @@ async function sparkplugProcess(
1406
1413
if ( elem ) {
1407
1414
// test if published topic matches subscribed element
1408
1415
if ( topic == elem ) {
1409
- let JsonValue = TryPayloadAsRJson ( payload )
1416
+ const JsonValue = TryPayloadAsRJson ( payload )
1410
1417
EnqueueJsonValue ( JsonValue , topic )
1411
- // match = true
1412
1418
}
1413
1419
1414
1420
if (
1415
1421
autoTag &&
1416
1422
elem . endsWith ( '#' ) &&
1417
1423
topic . startsWith ( elem . substring ( 0 , elem . length - 1 ) )
1418
1424
) {
1419
- let JsonValue = TryPayloadAsRJson ( payload )
1425
+ const JsonValue = TryPayloadAsRJson ( payload )
1420
1426
EnqueueJsonValue ( JsonValue , topic )
1421
1427
}
1422
1428
@@ -1425,7 +1431,7 @@ async function sparkplugProcess(
1425
1431
1426
1432
// when used '*~' at the end of JSONPathPlus explode property names
1427
1433
if ( elem . endsWith ( '*~' ) ) {
1428
- let jpt = JsonPathTopic ( elem )
1434
+ const jpt = JsonPathTopic ( elem )
1429
1435
if ( jpt . jsonPath !== '' && topicMatchSub ( topic ) ( jpt . topic ) ) {
1430
1436
const jpPropNames = JSONPath ( {
1431
1437
path : jpt . jsonPath ,
@@ -1434,7 +1440,9 @@ async function sparkplugProcess(
1434
1440
} )
1435
1441
jpPropNames . forEach ( ( propName ) => {
1436
1442
let newTopic = elem . replace ( '*~' , propName )
1437
- let jptNew = JsonPathTopic ( newTopic )
1443
+ const jptNew = JsonPathTopic ( newTopic )
1444
+ newTopic = newTopic . replace ( '$.' , '' )
1445
+
1438
1446
// extract value from payload using JSON PATH
1439
1447
const jpRes = JSONPath ( {
1440
1448
path : jptNew . jsonPath ,
@@ -1444,9 +1452,10 @@ async function sparkplugProcess(
1444
1452
EnqueueJsonValue ( jpRes , newTopic )
1445
1453
} )
1446
1454
}
1455
+ return
1447
1456
}
1448
1457
1449
- let jpt = JsonPathTopic ( elem )
1458
+ const jpt = JsonPathTopic ( elem )
1450
1459
if ( jpt . jsonPath !== '' && topicMatchSub ( topic ) ( jpt . topic ) ) {
1451
1460
// extract value from payload using JSON PATH
1452
1461
const jpRes = JSONPath ( {
@@ -1477,7 +1486,20 @@ async function sparkplugProcess(
1477
1486
jscadaConnection . groupId . trim ( ) === ''
1478
1487
)
1479
1488
return
1489
+
1480
1490
if ( metric ?. value === true ) {
1491
+ if (
1492
+ LastNodeRebirth + AppDefs . SECONDS_BETWEEN_REBIRTHS * 1000 >
1493
+ new Date ( ) . getTime ( )
1494
+ ) {
1495
+ Log . log (
1496
+ logModS +
1497
+ `Node Rebirth command received, ignoring until after ${ AppDefs . SECONDS_BETWEEN_REBIRTHS } seconds`
1498
+ )
1499
+ return
1500
+ }
1501
+ LastNodeRebirth = new Date ( ) . getTime ( )
1502
+
1481
1503
Log . log ( logModS + 'Node Rebirth command received' )
1482
1504
// Publish Node BIRTH certificate
1483
1505
let nbc = getNodeBirthPayload ( configObj )
@@ -1622,7 +1644,8 @@ async function sparkplugProcess(
1622
1644
nodeLocator in DevicesList &&
1623
1645
'lastReqDateTime' in DevicesList [ nodeLocator ] &&
1624
1646
new Date ( ) . getTime ( ) <
1625
- DevicesList [ nodeLocator ] . lastReqDateTime + AppDefs . SECONDS_BETWEEN_NODE_REQUESTS * 1000
1647
+ DevicesList [ nodeLocator ] . lastReqDateTime +
1648
+ AppDefs . SECONDS_BETWEEN_NODE_REQUESTS * 1000
1626
1649
) {
1627
1650
Log . log (
1628
1651
logModS +
@@ -1681,7 +1704,8 @@ async function sparkplugProcess(
1681
1704
nodeLocator in DevicesList &&
1682
1705
'lastReqDateTime' in DevicesList [ nodeLocator ] &&
1683
1706
new Date ( ) . getTime ( ) <
1684
- DevicesList [ nodeLocator ] . lastReqDateTime + AppDefs . SECONDS_BETWEEN_NODE_REQUESTS * 1000
1707
+ DevicesList [ nodeLocator ] . lastReqDateTime +
1708
+ AppDefs . SECONDS_BETWEEN_NODE_REQUESTS * 1000
1685
1709
) {
1686
1710
Log . log (
1687
1711
logModS +
0 commit comments