node-red-contrib-homebridge-automation 0.1.12-beta.26 → 0.1.12-beta.28

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-red-contrib-homebridge-automation",
3
- "version": "0.1.12-beta.26",
3
+ "version": "0.1.12-beta.28",
4
4
  "description": "NodeRED Automation for HomeBridge",
5
5
  "main": "src/HAP-NodeRed.js",
6
6
  "scripts": {
@@ -1,7 +1,5 @@
1
1
  var debug = require('debug')('hapNodeRed');
2
2
 
3
- // var register = require('./lib/register.js');
4
-
5
3
  const HBConfigNode = require('./hbConfigNode.js');
6
4
  const HbEventNode = require('./hbEventNode'); // Import the class
7
5
  const HbResumeNode = require('./hbResumeNode'); // Import the class
@@ -13,13 +11,6 @@ const HapDeviceRoutes = require('./HapDeviceRoutes');
13
11
  module.exports = function (RED) {
14
12
  var hbDevices;
15
13
 
16
- /**
17
- * hbConf - Configuration
18
- *
19
- * @param {type} n description
20
- * @return {type} description
21
- */
22
-
23
14
  class hbConfigNode extends HBConfigNode {
24
15
  constructor(config) {
25
16
  debug('hbConfigNode', config);
@@ -27,7 +18,6 @@ module.exports = function (RED) {
27
18
  }
28
19
  }
29
20
 
30
- // console.log('Registering node types', "hb-conf", hbConfigNode);
31
21
  RED.nodes.registerType("hb-conf", hbConfigNode, {
32
22
  credentials: {
33
23
  password: {
@@ -36,11 +26,6 @@ module.exports = function (RED) {
36
26
  }
37
27
  });
38
28
 
39
-
40
- /**
41
- * hbEventNode - description
42
- * @param {*} n
43
- */
44
29
  class hbEventNode extends HbEventNode {
45
30
  constructor(config) {
46
31
  debug('hbEventNode', config);
@@ -50,9 +35,6 @@ module.exports = function (RED) {
50
35
 
51
36
  RED.nodes.registerType("hb-event", hbEventNode);
52
37
 
53
- /**
54
- * hbResumeNode - description
55
- */
56
38
  class hbResumeNode extends HbResumeNode {
57
39
  constructor(config) {
58
40
  debug('hbResumeNode', config);
@@ -71,12 +53,6 @@ module.exports = function (RED) {
71
53
 
72
54
  RED.nodes.registerType("hb-control", hbControlNode);
73
55
 
74
- /**
75
- * hbStatus - description
76
- *
77
- * @param {type} n description
78
- * @return {type} description
79
- */
80
56
  class hbStatusNode extends HbStatusNode {
81
57
  constructor(config) {
82
58
  debug('hbStatusNode', config);
@@ -33,7 +33,7 @@ class HapDeviceRoutes {
33
33
  getEvDeviceById(req, res) {
34
34
  debug('req', req.params.id);
35
35
  var evDevices = this.RED.nodes.getNode(req.params.id).evDevices;
36
- debug('hbDevices', evDevices);
36
+ // debug('hbDevices', evDevices);
37
37
  debug("evDevices", evDevices.length);
38
38
  if (evDevices) {
39
39
  res.send(evDevices);
@@ -76,7 +76,7 @@ class HapDeviceRoutes {
76
76
 
77
77
  // GET /hap-device/ctDevices/
78
78
  getCtDevices(req, res) {
79
- debug("ctDevices", this.hbDevices.toList({ perms: 'pw' }).length);
79
+ // debug("ctDevices", this.hbDevices.toList({ perms: 'pw' }).length);
80
80
  if (this.hbDevices) {
81
81
  res.send(this.hbDevices.toList({ perms: 'pw' }));
82
82
  } else {
package/src/hbBaseNode.js CHANGED
@@ -23,6 +23,9 @@ class HbBaseNode {
23
23
  if (this.handleInput) {
24
24
  this.on('input', this.handleInput.bind(this));
25
25
  }
26
+ if (this.handleHbReady) {
27
+ this.on('hbReady', this.handleHbReady.bind(this))
28
+ }
26
29
  this.on('close', this.handleClose.bind(this));
27
30
  this.on('hbEvent', this.handleHBEventMessage.bind(this));
28
31
  }
@@ -55,116 +58,20 @@ class HbBaseNode {
55
58
  done();
56
59
  }
57
60
 
58
- /*
59
- registerNode() {
60
- debug("Registering node:", this.fullName);
61
- this.hbDevice = hbDevices.findDevice(this.device);
62
-
63
- if (!this.hbDevice) {
64
- this.error(`Device not found: ${this.device}`);
65
- } else {
66
- this.deviceType = this.hbDevice.deviceType;
67
- }
68
- }
69
-
70
- handleClose(callback) {
71
- debug('close', this.name);
72
- callback();
73
- }
74
-
75
- _convertHBcharacteristicToNode(hbMessage, node) {
76
- let payload = {};
77
- if (!hbMessage.payload) {
78
- const device = hbDevices.findDevice(node.device);
79
- if (device) {
80
- hbMessage.forEach(characteristic => {
81
- const charKey = `${characteristic.aid}.${characteristic.iid}`;
82
- if (device.characteristics[charKey]) {
83
- payload[device.characteristics[charKey].characteristic] = characteristic.value;
84
- }
85
- });
86
- }
87
- } else {
88
- payload = hbMessage.payload;
89
- }
90
- return payload;
91
- }
92
-
93
- _createControlMessage(payload, node, device) {
94
- const response = [];
95
- for (const key in payload) {
96
- const characteristic = this._getKey(device.characteristics, key);
97
- if (characteristic) {
98
- response.push({
99
- aid: device.aid,
100
- iid: characteristic.iid,
101
- value: payload[key],
102
- });
103
- } else {
104
- this.warn(`Invalid characteristic: '${key}'. Available: ${device.descriptions}`);
105
- node.status({ text: `Invalid characteristic: ${key}`, shape: 'ring', fill: 'yellow' });
106
- }
107
- }
108
- return { characteristics: response };
109
- }
110
-
111
- async _status(nrDevice, node, perms) {
112
- try {
113
- const device = hbDevices.findDevice(node.device, perms);
114
- if (!device) throw new Error(`Device not found: ${nrDevice}`);
115
-
116
- const message = device.type === "00000110" || device.type === "00000111"
117
- ? { "resource-type": "image", "image-width": 1920, "image-height": 1080 }
118
- : `?id=${device.getCharacteristics}`;
119
-
120
- const status = device.type === "00000110" || device.type === "00000111"
121
- ? await this.HAPresourceByDeviceIDAsync(device.id, JSON.stringify(message))
122
- : await this.HAPstatusByDeviceIDAsync(device.id, message);
123
-
124
- node.status({ text: 'Success', shape: 'dot', fill: 'green' });
125
- return device.type === "00000110" || device.type === "00000111"
126
- ? { characteristics: { payload: this.btoa(status) } }
127
- : status;
128
- } catch (err) {
129
- debug("Error in _status:", err);
130
- node.status({ text: 'Error retrieving status', shape: 'ring', fill: 'red' });
131
- throw err;
132
- }
133
- }
134
-
135
- async _register(node) {
136
- try {
137
- const device = hbDevices.findDevice(node.device, { perms: 'ev' });
138
- if (device) {
139
- const message = { characteristics: device.eventRegisters };
140
- await hapEventByDeviceIDAsync(device.id, JSON.stringify(message));
141
- }
142
- } catch (err) {
143
- debug("Error in _register:", err);
144
- node.status({ text: 'Register error', shape: 'ring', fill: 'red' });
145
- }
146
- }
147
-
148
- _getKey(obj, value) {
149
- return Object.values(obj).find(char => char.characteristic.toLowerCase() === value.toLowerCase()) || null;
150
- }
151
-
152
- btoa(str) {
153
- return Buffer.from(str.toString(), 'binary').toString('base64');
154
- }
155
-
156
- async HAPresourceByDeviceIDAsync(deviceId, message) {
157
- return new Promise((resolve, reject) => {
158
- homebridge.HAPresourceByDeviceID(deviceId, message, (err, status) => err ? reject(err) : resolve(status));
159
- });
160
- }
161
-
162
- async HAPstatusByDeviceIDAsync(deviceId, message) {
163
- return new Promise((resolve, reject) => {
164
- homebridge.HAPstatusByDeviceID(deviceId, message, (err, status) => err ? reject(err) : resolve(status));
165
- });
166
- }
167
- */
61
+ /**
62
+ *
63
+ * @param {*} warning - Message to log and display in debug panel
64
+ * @param {*} statusText - Message to display under Node ( If not present, uses warning message text)
65
+ */
66
+ handleError(warning, statusText) {
67
+ this.warn(warning);
68
+ this.status({
69
+ text: (statusText ? statusText : warning),
70
+ shape: 'ring',
71
+ fill: 'red',
72
+ });
73
+ }
74
+
168
75
  }
169
76
 
170
77
  module.exports = HbBaseNode;
@@ -6,11 +6,10 @@ class HbControlNode extends hbBaseNode {
6
6
  super(config, RED);
7
7
  }
8
8
 
9
- async handleInput(message) {
9
+ async handleInput(message, send) {
10
10
  debug('handleInput', message.payload, this.name);
11
11
  if (!this.hbDevice) {
12
- this.error('HB not initialized');
13
- this.status({ text: 'HB not initialized', shape: 'ring', fill: 'red' });
12
+ this.handleError('HB not initialized');
14
13
  return;
15
14
  }
16
15
 
@@ -5,7 +5,6 @@ class HbEventNode extends hbBaseNode {
5
5
  constructor(config, RED) {
6
6
  super(config, RED);
7
7
  this.sendInitialState = config.sendInitialState === true;
8
- this.on('hbReady', this.handleHbReady.bind(this))
9
8
  }
10
9
 
11
10
  handleHbReady(service) {
@@ -5,140 +5,49 @@ class HbResumeNode extends HbBaseNode {
5
5
  constructor(config, RED) {
6
6
  super(config, RED);
7
7
 
8
-
9
- this.state = null;
10
- this.lastMessageTime = null;
11
- this.lastMessageValue = null;
12
- this.lastPayload = { On: false };
13
- this.timeout = null;
14
-
15
- // Set up input and command handlers
16
- // this.on('input', this.handleInput.bind(this));
17
- this.command = this.handleCommand.bind(this);
18
-
19
- // Handle device registration
20
- debug('hbResume - hbConfigNode', this.hbConfigNode);
21
- // debug('hbResume - hbConfigNode', this.configNode.hbConfigNode);
22
-
23
- }
24
-
25
- handleHBEventMessage(service) {
26
- debug('topic for', this.id, service.serviceName, service.values);
27
-
28
- this.status({
29
- text: JSON.stringify(service.values),
30
- shape: 'dot',
31
- fill: 'green',
32
- });
33
- this.send({ payload: service.values });
8
+ this.storedState = null;
34
9
  }
35
10
 
36
- handleInput(msg, send) {
37
- this.msg = msg;
38
- debug("hbResume.input: %s input", this.fullName, JSON.stringify(msg));
11
+ handleInput(message, send) {
12
+ debug('handleInput', message.payload, this.name);
39
13
 
40
- if (typeof msg.payload === "object") {
41
- if (this.hbDevice) {
42
- const message = this._createControlMessage.call(this, msg.payload, this, this.hbDevice);
43
-
44
- if (message.characteristics.length > 0) {
45
- let newMsg;
46
- if (!msg.payload.On) {
47
- if (this.lastPayload.On) {
48
- newMsg = {
49
- name: this.name,
50
- _device: this.device,
51
- _confId: this.confId,
52
- payload: this.state,
53
- Homebridge: this.hbDevice?.homebridge,
54
- Manufacturer: this.hbDevice?.manufacturer,
55
- Type: this.hbDevice?.deviceType,
56
- };
57
- } else {
58
- this.state = JSON.parse(JSON.stringify(msg.payload));
59
- newMsg = msg;
60
- }
61
- } else {
62
- newMsg = msg;
63
- }
14
+ if (!this.hbDevice) {
15
+ this.handleError('HB not initialized');
16
+ return;
17
+ }
64
18
 
65
- send(newMsg.payload.On ? newMsg : { ...newMsg, payload: { On: false } });
66
- debug("hbResume.input: %s output", this.fullName, JSON.stringify(newMsg));
67
- this.updateStatus(newMsg.payload);
68
- this.lastMessageValue = newMsg.payload;
69
- this.lastMessageTime = Date.now();
70
- this.lastPayload = JSON.parse(JSON.stringify(msg.payload));
71
- }
72
- } else {
73
- this.handleError("Homebridge not initialized - 1");
74
- }
75
- } else {
19
+ if (typeof message.payload !== 'object' || typeof message.payload.On !== 'boolean') {
20
+ const validNames = Object.keys(this.hbDevice.values)
21
+ .filter(key => key !== 'ConfiguredName')
22
+ .join(', ');
76
23
  this.handleError(
77
- "Payload should be a JSON object containing device characteristics and values, e.g., {\"On\":false, \"Brightness\":0 }"
24
+ `Invalid payload. Expected: {"On": false, "Brightness": 0}. Valid values: ${validNames}`,
25
+ 'Invalid payload'
78
26
  );
27
+ return;
79
28
  }
80
- }
81
-
82
- handleCommand(event) {
83
- const payload = { ...this.state, ...this._convertHBcharactericToNode([event], this) };
84
- debug("hbResume.event: %s %s -> %s", this.fullName, JSON.stringify(this.state), JSON.stringify(payload));
85
-
86
- if (event.status === true && event.value !== undefined) {
87
- if (Date.now() - this.lastMessageTime > 5000) {
88
- debug("hbResume.update: %s - updating stored event >5", this.fullName, payload);
89
- this.state = JSON.parse(JSON.stringify(payload));
90
- }
91
- } else if (event.status === true) {
92
- this.updateStatus({ text: 'connected', shape: 'dot', fill: 'green' });
93
- } else {
94
- this.updateStatus({ text: `disconnected: ${event.status}`, shape: 'ring', fill: 'red' });
95
- }
96
- }
97
-
98
- handleDeviceRegistration() {
99
- debug("hbResume.register:", this.fullName);
100
- this.hbDevice = hbDevices.findDevice(this.device, { perms: 'pw' });
101
-
102
- if (this.hbDevice) {
103
- this._status(this.device, this, { perms: 'pw' }, (err, message) => {
104
- if (!err) {
105
- this.state = this._convertHBcharactericToNode(message.characteristics, this);
106
- debug("hbResume received: %s = %s", this.fullName, JSON.stringify(message.characteristics).slice(0, 80) + '...');
107
- } else {
108
- this.error(err);
109
- }
110
- });
111
-
112
- this.deviceType = this.hbDevice.deviceType;
113
- this.listener = this.command;
114
- this.eventName = [];
115
29
 
116
- this.hbDevice.eventRegisters.forEach((event) => {
117
- homebridge.on(this.hbDevice.id + event.aid + event.iid, this.command);
118
- this.eventName.push(this.hbDevice.id + event.aid + event.iid);
119
- });
30
+ // if on, store the current values object to storedState before passing
31
+ // if off, if storedState, then send stored state else passthru
120
32
 
121
- this.updateStatus({ text: 'connected', shape: 'dot', fill: 'green' });
122
- this.resetTimeout(30000);
123
- } else {
124
- this.error(`Can't find device ${this.device}`);
33
+ if (message.payload.On) {
34
+ this.storedState = JSON.parse(JSON.stringify(this.hbDevice.values));
35
+ debug('Storing state', this.storedState);
36
+ } else if (this.storedState) {
37
+ debug('Restoring state', this.storedState);
38
+ message.payload = { ...this.storedState, ...message.payload };
39
+ this.storedState = null;
125
40
  }
126
- }
127
41
 
128
- updateStatus(status) {
129
- this.status(status);
130
- this.resetTimeout(10000);
131
- }
42
+ this.status({
43
+ text: JSON.stringify(message.payload),
44
+ shape: 'dot',
45
+ fill: 'green',
46
+ });
132
47
 
133
- resetTimeout(duration) {
134
- clearTimeout(this.timeout);
135
- this.timeout = setTimeout(() => this.status({}), duration);
48
+ send(message);
136
49
  }
137
50
 
138
- handleError(message) {
139
- this.error(message, this.msg);
140
- this.updateStatus({ text: message, shape: 'ring', fill: 'red' });
141
- }
142
51
  }
143
52
 
144
53
  module.exports = HbResumeNode;
@@ -10,8 +10,7 @@ class HbStatusNode extends HbBaseNode {
10
10
  debug('handleInput', message.payload, this.name);
11
11
 
12
12
  if (!this.hbDevice) {
13
- this.error('HB not initialized');
14
- this.status({ text: 'HB not initialized', shape: 'ring', fill: 'red' });
13
+ this.handleError('HB not initialized');
15
14
  return;
16
15
  }
17
16
 
@@ -26,8 +26,8 @@
26
26
  "targetType": "full",
27
27
  "statusVal": "payload",
28
28
  "statusType": "auto",
29
- "x": 800,
30
- "y": 140,
29
+ "x": 820,
30
+ "y": 40,
31
31
  "wires": []
32
32
  },
33
33
  {
@@ -43,8 +43,8 @@
43
43
  "targetType": "full",
44
44
  "statusVal": "payload",
45
45
  "statusType": "auto",
46
- "x": 800,
47
- "y": 260,
46
+ "x": 820,
47
+ "y": 100,
48
48
  "wires": []
49
49
  },
50
50
  {
@@ -68,8 +68,8 @@
68
68
  "topic": "",
69
69
  "payload": "",
70
70
  "payloadType": "date",
71
- "x": 250,
72
- "y": 140,
71
+ "x": 270,
72
+ "y": 40,
73
73
  "wires": [
74
74
  [
75
75
  "3d7babac3a298e60"
@@ -86,8 +86,8 @@
86
86
  "Service": "Lightbulb",
87
87
  "device": "homebridge1C:22:3D:E3:CF:34TasmotaWest Bedroom00000043",
88
88
  "conf": "557aec8e8c47e61e",
89
- "x": 480,
90
- "y": 140,
89
+ "x": 500,
90
+ "y": 40,
91
91
  "wires": [
92
92
  [
93
93
  "902c5887b6877df6"
@@ -104,8 +104,8 @@
104
104
  "Service": "Lightbulb",
105
105
  "device": "homebridge1C:22:3D:E3:CF:34TasmotaWest Bedroom00000043",
106
106
  "conf": "557aec8e8c47e61e",
107
- "x": 480,
108
- "y": 460,
107
+ "x": 500,
108
+ "y": 160,
109
109
  "wires": [
110
110
  [
111
111
  "1093ab38b01fd39f"
@@ -125,8 +125,8 @@
125
125
  "targetType": "msg",
126
126
  "statusVal": "payload",
127
127
  "statusType": "auto",
128
- "x": 800,
129
- "y": 460,
128
+ "x": 820,
129
+ "y": 160,
130
130
  "wires": []
131
131
  },
132
132
  {
@@ -140,39 +140,10 @@
140
140
  "device": "homebridge1C:22:3D:E3:CF:34TasmotaWest Bedroom Fan00000040",
141
141
  "conf": "557aec8e8c47e61e",
142
142
  "outputs": 0,
143
- "x": 810,
144
- "y": 600,
143
+ "x": 510,
144
+ "y": 220,
145
145
  "wires": []
146
146
  },
147
- {
148
- "id": "d9f8181e9e6b3cfd",
149
- "type": "inject",
150
- "z": "caef1e7b5b399e80",
151
- "name": "",
152
- "props": [
153
- {
154
- "p": "payload"
155
- },
156
- {
157
- "p": "topic",
158
- "vt": "str"
159
- }
160
- ],
161
- "repeat": "60",
162
- "crontab": "",
163
- "once": true,
164
- "onceDelay": "60",
165
- "topic": "",
166
- "payload": "",
167
- "payloadType": "date",
168
- "x": 210,
169
- "y": 460,
170
- "wires": [
171
- [
172
- "452e3e6171aa7a25"
173
- ]
174
- ]
175
- },
176
147
  {
177
148
  "id": "6703815a8874b156",
178
149
  "type": "hb-control",
@@ -183,10 +154,14 @@
183
154
  "Service": "Lightbulb",
184
155
  "device": "homebridge1C:22:3D:E3:CF:34TasmotaWest Bedroom00000043",
185
156
  "conf": "557aec8e8c47e61e",
186
- "outputs": 0,
187
- "x": 800,
188
- "y": 680,
189
- "wires": []
157
+ "outputs": 1,
158
+ "x": 500,
159
+ "y": 300,
160
+ "wires": [
161
+ [
162
+ "f194fc4bcb1997a9"
163
+ ]
164
+ ]
190
165
  },
191
166
  {
192
167
  "id": "24660f9d2862cee9",
@@ -209,8 +184,8 @@
209
184
  "topic": "",
210
185
  "payload": "{\"On\": true, \"RotationSpeed\": 33}",
211
186
  "payloadType": "json",
212
- "x": 190,
213
- "y": 580,
187
+ "x": 90,
188
+ "y": 180,
214
189
  "wires": [
215
190
  [
216
191
  "0ed3cd7e0d60beda"
@@ -238,8 +213,8 @@
238
213
  "topic": "",
239
214
  "payload": "{\"On\": false}",
240
215
  "payloadType": "json",
241
- "x": 210,
242
- "y": 640,
216
+ "x": 110,
217
+ "y": 240,
243
218
  "wires": [
244
219
  [
245
220
  "0ed3cd7e0d60beda"
@@ -267,8 +242,8 @@
267
242
  "topic": "",
268
243
  "payload": "{\"On\": true}",
269
244
  "payloadType": "json",
270
- "x": 350,
271
- "y": 800,
245
+ "x": 110,
246
+ "y": 280,
272
247
  "wires": [
273
248
  [
274
249
  "6703815a8874b156"
@@ -296,8 +271,8 @@
296
271
  "topic": "",
297
272
  "payload": "{\"On\": false}",
298
273
  "payloadType": "json",
299
- "x": 350,
300
- "y": 860,
274
+ "x": 110,
275
+ "y": 340,
301
276
  "wires": [
302
277
  [
303
278
  "6703815a8874b156"
@@ -325,8 +300,8 @@
325
300
  "topic": "",
326
301
  "payload": "",
327
302
  "payloadType": "date",
328
- "x": 520,
329
- "y": 540,
303
+ "x": 320,
304
+ "y": 260,
330
305
  "wires": [
331
306
  [
332
307
  "6703815a8874b156",
@@ -355,8 +330,8 @@
355
330
  "topic": "",
356
331
  "payload": "{\"Off\": false}",
357
332
  "payloadType": "json",
358
- "x": 490,
359
- "y": 920,
333
+ "x": 110,
334
+ "y": 380,
360
335
  "wires": [
361
336
  [
362
337
  "6703815a8874b156"
@@ -384,8 +359,8 @@
384
359
  "topic": "",
385
360
  "payload": "{\"On\": true}",
386
361
  "payloadType": "json",
387
- "x": 150,
388
- "y": 340,
362
+ "x": 110,
363
+ "y": 80,
389
364
  "wires": [
390
365
  [
391
366
  "452e3e6171aa7a25"
@@ -413,8 +388,8 @@
413
388
  "topic": "",
414
389
  "payload": "{\"On\": false}",
415
390
  "payloadType": "json",
416
- "x": 150,
417
- "y": 400,
391
+ "x": 110,
392
+ "y": 140,
418
393
  "wires": [
419
394
  [
420
395
  "452e3e6171aa7a25"
@@ -433,7 +408,7 @@
433
408
  "conf": "557aec8e8c47e61e",
434
409
  "sendInitialState": true,
435
410
  "x": 500,
436
- "y": 260,
411
+ "y": 100,
437
412
  "wires": [
438
413
  [
439
414
  "a866ae0bb24ce682"
@@ -441,32 +416,20 @@
441
416
  ]
442
417
  },
443
418
  {
444
- "id": "56633636bd2e624c",
445
- "type": "inject",
419
+ "id": "f194fc4bcb1997a9",
420
+ "type": "debug",
446
421
  "z": "caef1e7b5b399e80",
447
- "name": "",
448
- "props": [
449
- {
450
- "p": "payload"
451
- },
452
- {
453
- "p": "topic",
454
- "vt": "str"
455
- }
456
- ],
457
- "repeat": "60",
458
- "crontab": "",
459
- "once": true,
460
- "onceDelay": "60",
461
- "topic": "",
462
- "payload": "",
463
- "payloadType": "date",
464
- "x": 190,
465
- "y": 280,
466
- "wires": [
467
- [
468
- "452e3e6171aa7a25"
469
- ]
470
- ]
422
+ "name": "debug 4",
423
+ "active": true,
424
+ "tosidebar": true,
425
+ "console": false,
426
+ "tostatus": true,
427
+ "complete": "payload",
428
+ "targetType": "msg",
429
+ "statusVal": "payload",
430
+ "statusType": "auto",
431
+ "x": 800,
432
+ "y": 300,
433
+ "wires": []
471
434
  }
472
435
  ]