@blokcert/node-red-contrib-ocpp 1.0.0 → 1.0.2

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.
@@ -20,32 +20,56 @@ const MessageType = {
20
20
  * @returns {object} Parsed message with metadata
21
21
  */
22
22
  function parseStreamMessage(streamData) {
23
- const { messageId, tenant, deviceId, action, payload, protocol, timestamp } = streamData;
23
+ const { tenant, deviceId, timestamp } = streamData;
24
24
 
25
- // Determine OCPP version from protocol
26
- const version = protocol === 'ocpp2.0.1' ? '2.0.1' : '1.6';
25
+ // Parse metadata (contains action, version, serverID)
26
+ let metadata = {};
27
+ if (streamData.metadata) {
28
+ try {
29
+ metadata = typeof streamData.metadata === 'string'
30
+ ? JSON.parse(streamData.metadata)
31
+ : streamData.metadata;
32
+ } catch (e) {
33
+ // Ignore parse errors
34
+ }
35
+ }
27
36
 
28
- // Parse payload if it's a string
29
- let parsedPayload = payload;
30
- if (typeof payload === 'string') {
37
+ // Parse payload (contains the full OCPP message with uniqueID)
38
+ let parsedPayload = streamData.payload;
39
+ if (typeof parsedPayload === 'string') {
31
40
  try {
32
- parsedPayload = JSON.parse(payload);
41
+ parsedPayload = JSON.parse(parsedPayload);
33
42
  } catch (e) {
34
43
  // Keep as string if not valid JSON
35
44
  }
36
45
  }
37
46
 
47
+ // Extract messageId from payload.uniqueID or streamData.id
48
+ const messageId = parsedPayload?.uniqueID || streamData.id;
49
+
50
+ // Extract action from metadata or payload
51
+ const action = metadata.action || parsedPayload?.action;
52
+
53
+ // Extract actual payload content
54
+ const actualPayload = parsedPayload?.payload || parsedPayload;
55
+
56
+ // Determine OCPP version from metadata
57
+ const version = metadata.version === '2.0.1' ? '2.0.1' : '1.6';
58
+ const protocol = version === '2.0.1' ? 'ocpp2.0.1' : 'ocpp1.6';
59
+
38
60
  return {
39
61
  messageId,
40
62
  tenant,
41
63
  deviceId,
42
64
  action,
43
- payload: parsedPayload,
65
+ payload: actualPayload,
44
66
  version,
45
67
  protocol,
46
68
  timestamp: timestamp || Date.now(),
47
69
  // Identity string for routing
48
70
  identity: `${tenant}:${deviceId}`,
71
+ // Keep original for reference
72
+ _rawPayload: parsedPayload,
49
73
  };
50
74
  }
51
75
 
@@ -71,8 +71,8 @@ module.exports = function (RED) {
71
71
  outboundKey,
72
72
  'MAXLEN', '~', node.streamMaxLen,
73
73
  '*',
74
- 'messageId', messageId,
75
- 'data', callMessage,
74
+ 'id', messageId,
75
+ 'payload', callMessage,
76
76
  'timestamp', Date.now().toString()
77
77
  );
78
78
 
@@ -33,18 +33,18 @@
33
33
  <input type="text" id="node-input-server">
34
34
  </div>
35
35
  <div class="form-row">
36
- <label for="node-input-denormalizePayload"><i class="fa fa-exchange"></i> Denormalize</label>
37
- <input type="checkbox" id="node-input-denormalizePayload" style="width: auto; margin-left: 0;">
38
- <span style="margin-left: 10px;">Convert unified format back to OCPP version</span>
36
+ <label for="node-input-streamMaxLen"><i class="fa fa-list-ol"></i> Stream Max Len</label>
37
+ <input type="number" id="node-input-streamMaxLen" placeholder="1000">
39
38
  </div>
40
39
  <div class="form-row">
41
- <label for="node-input-autoAck"><i class="fa fa-check"></i> Auto ACK</label>
40
+ <label for="node-input-autoAck"><i class="fa fa-check"></i> Auto Acknowledge</label>
42
41
  <input type="checkbox" id="node-input-autoAck" style="width: auto; margin-left: 0;">
43
42
  <span style="margin-left: 10px;">Acknowledge inbound message after response</span>
44
43
  </div>
45
44
  <div class="form-row">
46
- <label for="node-input-streamMaxLen"><i class="fa fa-list-ol"></i> Stream Max Len</label>
47
- <input type="number" id="node-input-streamMaxLen" placeholder="1000">
45
+ <label for="node-input-denormalizePayload"><i class="fa fa-exchange"></i> Denormalize</label>
46
+ <input type="checkbox" id="node-input-denormalizePayload" style="width: auto; margin-left: 0;">
47
+ <span style="margin-left: 10px;">Convert unified format back to OCPP version</span>
48
48
  </div>
49
49
  </script>
50
50
 
package/nodes/ocpp-out.js CHANGED
@@ -122,12 +122,13 @@ module.exports = function (RED) {
122
122
  const outboundKey = Keys.outbound(tenant, deviceId);
123
123
 
124
124
  // XADD with MAXLEN to prevent unbounded growth
125
+ // Use 'payload' field to match WS Server's expected format
125
126
  await redis.xadd(
126
127
  outboundKey,
127
128
  'MAXLEN', '~', node.streamMaxLen,
128
129
  '*',
129
- 'messageId', messageId,
130
- 'data', response,
130
+ 'id', messageId,
131
+ 'payload', response,
131
132
  'timestamp', Date.now().toString()
132
133
  );
133
134
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blokcert/node-red-contrib-ocpp",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Node-RED nodes for OCPP (Open Charge Point Protocol) message handling via Redis Streams",
5
5
  "keywords": [
6
6
  "node-red",