node-red-contrib-mobius-flow-base 2.5.86-beta.5 → 2.5.86-beta.53

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.
@@ -29,10 +29,35 @@ POSSIBILITY OF SUCH DAMAGE.
29
29
  <label for="node-input-connection"><i class="fa fa-globe"></i> MOBiUS</label>
30
30
  <input type="text" id="node-input-connection">
31
31
  </div>
32
- <div class="form-row">
33
- <label for="node-input-resource"><i class="fa fa-tasks"></i> URI</label>
34
- <input type="text" id="node-input-resource" placeholder="Resource URI (hid/sid/pid/ins/rid)">
32
+
33
+ <hr>
34
+
35
+ <div id="instance-row">
36
+ <div class="form-row">
37
+ <label for="node-input-resource"><i class="fa fa-tasks"></i> URI</label>
38
+ <input type="text" id="node-input-resource" style="width:61%;" placeholder="HID/SID/PID/INS/RID">
39
+ <a id="node-lookup-instance" class="searchbutton" style="vertical-align: middle"><i id="node-lookup-instance-icon" class="fa fa-search"></i></a>
40
+ </div>
41
+ </div>
42
+ <div id="instance-search-row">
43
+ <div class="form-row">
44
+ <label for="instance-search-sid"><i class="fa fa-tasks"></i> URI</label>
45
+ <input type="text" id="instance-search-hid" style="width:13%;" placeholder="HID">
46
+ <input type="text" id="instance-search-sid" style="width:8%;" placeholder="SID">
47
+ <input type="text" id="instance-search-pid" style="width:10%;" placeholder="PID">
48
+ <input type="text" id="instance-search-ins" style="width:10%;" placeholder="INS">
49
+ <input type="text" id="instance-search-rid" style="width:8%;" placeholder="RID">
50
+ <a id="node-search-return" class="searchbutton" style="vertical-align: middle"><i id="node-search-return-icon" class="fa fa-arrow-left"></i></a>
51
+ <a id="node-search-accept" class="searchbutton" style="vertical-align: middle; color: #CCCCCC"><i id="node-search-accept-icon" class="fa fa-check"></i></a>
52
+ </div>
35
53
  </div>
54
+ <div id="wildcard-alert-row" class="form-row hidden" style="color:#555555" align="center">
55
+ <p>Please note: The selection of wildcard '+'
56
+ means a search for a specific instance or resource
57
+ cannot be performed. As such, enter the
58
+ INS and/or RID manually.</p>
59
+ </div>
60
+
36
61
  <div class="form-row">
37
62
  <label for="node-input-priority"><i class="fa fa-exclamation-triangle"></i> Priority</label>
38
63
  <input type="text" id="node-input-priority" placeholder="Priotity to write or clear">
@@ -90,6 +115,266 @@ POSSIBILITY OF SUCH DAMAGE.
90
115
  labelStyle: function() {
91
116
  return this.name ? "node_label_italic":"";
92
117
  },
118
+ oneditprepare: function () {
119
+ var node = this;
120
+ let mobiusSrvc = $("#node-input-connection").val();
121
+
122
+ // *** MOBSEARCH *** //
123
+
124
+ //Inital setup
125
+ $("#instance-search-row").hide();
126
+ $("#wildcard-alert-row").hide();
127
+ $("#node-search-return").addClass('disabled');
128
+ $.getJSON(`mgethid?mobius=${mobiusSrvc}`, function (response) {
129
+ $("#instance-search-hid").val(response);
130
+ })
131
+ let readyToAccept = false;
132
+ let searchObject = {
133
+ hid: $("#instance-search-hid").val(),
134
+ sid: $("#instance-search-sid").val(),
135
+ pid: $("#instance-search-pid").val(),
136
+ ins: $("#instance-search-ins").val(),
137
+ rid: $("#instance-search-rid").val(),
138
+ objects: []
139
+ }
140
+
141
+ //Function to search for RIDs
142
+ function ridSearch (objects, ins) {
143
+ $.getJSON(`mdiscover?mobius=${mobiusSrvc}&uri=${searchObject.hid}/${searchObject.sid}/${searchObject.pid}/${searchObject.ins}`, (response) => {
144
+ resList = response.value[0].resources
145
+ ress = ['#'];
146
+ for (let j = 0; j < resList.length; j++) {
147
+ ress.push(`${resList[j].rid} - ${resList[j].name}`)
148
+ }
149
+ $("#instance-search-rid").autocomplete({
150
+ source: ress,
151
+ minLength: 0,
152
+ close: function (event, ui) {
153
+ acceptCheck();
154
+ $("#instance-search-rid").autocomplete('destroy');
155
+ $("#instance-search-rid").val($("#instance-search-rid").val().substring(0, 2));
156
+ searchObject.rid = $("#instance-search-rid").val();
157
+ }
158
+ }).autocomplete('search', '');
159
+ })
160
+ }
161
+
162
+ //Function to search for INSs
163
+ function insSearch (objects, pid) {
164
+ let inss = ['#', '+'];
165
+ for (let i = 0; i < objects.length; i++) {
166
+ if (objects[i].pid === pid) {
167
+ const name = objects[i].resources[1].pv;
168
+ if (name === '') {
169
+ inss.push(objects[i].ins);
170
+ } else {
171
+ inss.push(`${objects[i].ins} - ${name}`);
172
+ }
173
+ }
174
+ }
175
+ $("#instance-search-ins").autocomplete({
176
+ source: inss,
177
+ minLength: 0,
178
+ close: function (event, ui) {
179
+ acceptCheck();
180
+ $("#instance-search-ins").autocomplete('destroy');
181
+ if ($("#instance-search-ins").val().length > 4) {
182
+ $("#instance-search-ins").val($("#instance-search-ins").val().substring(0, 4))
183
+ }
184
+ searchObject.ins = $("#instance-search-ins").val();
185
+ }
186
+ }).autocomplete('search', '');
187
+ }
188
+
189
+ //Function to search for PIDs
190
+ function pidsSearch(objects) {
191
+ searchObject.objects = objects;
192
+ let pids = ['#', '+'];
193
+ for (let i = 0; i < objects.length; i++) {
194
+ pids.push(`${objects[i].pid} - ${objects[i].profileName}`);
195
+ }
196
+ pids = [...new Set(pids)];
197
+ $("#instance-search-pid").autocomplete({
198
+ source: pids,
199
+ minLength: 0,
200
+ close: function (event, ui) {
201
+ acceptCheck();
202
+ $("#instance-search-pid").autocomplete('destroy');
203
+ if ($("#instance-search-pid").val().length > 4) {
204
+ $("#instance-search-pid").val($("#instance-search-pid").val().substring(0, 4))
205
+ }
206
+ searchObject.pid = $("#instance-search-pid").val();
207
+ }
208
+ }).autocomplete('search', '');
209
+ }
210
+
211
+ //Function to search for SIDs, and then fetch child objects based on selection
212
+ function serviceSearch(response) {
213
+ let services = ['#', '+'];
214
+ for (let i = 0; i < response.length; i++) {
215
+ if (response[i].sid !== '009') {
216
+ services.push(`${response[i].sid} - ${response[i].name}`);
217
+ }
218
+ }
219
+ $("#instance-search-sid").autocomplete({
220
+ source: services,
221
+ minLength: 0,
222
+ close: function (event, ui) {
223
+ acceptCheck();
224
+ $("#instance-search-sid").autocomplete('destroy');
225
+ if ($("#instance-search-sid").val().length > 3) {
226
+ $("#instance-search-sid").val($("#instance-search-sid").val().substring(0, 3))
227
+ }
228
+ searchObject.sid = $("#instance-search-sid").val();
229
+ if (searchObject.sid === '+') {
230
+ for (let i = 2; i < services.length; i++) {
231
+ $.getJSON(`mgetobjects?mobius=${mobiusSrvc}&hid=${searchObject.hid}&sid=${services[i].substring(0, 3)}`, (objects) => {
232
+ searchObject.objects = searchObject.objects.concat(objects);
233
+ })
234
+ }
235
+ } else {
236
+ $.getJSON(`mgetobjects?mobius=${mobiusSrvc}&hid=${searchObject.hid}&sid=${searchObject.sid}`, (objects) => {
237
+ searchObject.objects = objects;
238
+ })
239
+ }
240
+ }
241
+ }).autocomplete('search', '');
242
+ }
243
+
244
+ //Start a new search
245
+ function startSearch() {
246
+ $("#wildcard-alert-row").hide();
247
+ $("#instance-search-sid").val('');
248
+ $("#instance-search-pid").val('');
249
+ $("#instance-search-ins").val('');
250
+ searchObject.hid = $("#instance-search-hid").val()
251
+ searchObject.sid = '';
252
+ searchObject.pid = '';
253
+ searchObject.ins = '';
254
+ if (/((^([0-9A-F]){6}$)|^$)/.test(searchObject.hid)) {
255
+ $.getJSON(`mgetservices?mobius=${mobiusSrvc}&hid=${searchObject.hid}`, serviceSearch)
256
+ .fail((err) => {
257
+ console.log('Some kind of html failure message on service discovery');
258
+ });
259
+ }
260
+ }
261
+
262
+ //Finish a search
263
+ function finishSearch() {
264
+ $("#wildcard-alert-row").hide();
265
+ let uri = `${searchObject.hid}/${searchObject.sid}/${searchObject.pid}/${searchObject.ins}/${searchObject.rid}`
266
+ if (uri.includes('#')) {
267
+ uri = uri.substring(0,uri.indexOf('#') + 1)
268
+ }
269
+ $("#node-input-resource").val(uri);
270
+ $("#node-search-accept").css('color', '#CCCCCC');
271
+ readyToAccept = false;
272
+ $("#node-search-return").addClass('disabled');
273
+ $("#node-search-accept").addClass('disabled');
274
+ $("#node-lookup-instance").removeClass('disabled');
275
+ $("#instance-search-row").hide();
276
+ $("#instance-row").show();
277
+ }
278
+
279
+ //Function to update if accept button is grade out and functions based on conditions of fields
280
+ function acceptCheck() {
281
+ if (($("#instance-search-hid").val() !== '' && $("#instance-search-sid").val() !== '' && $("#instance-search-pid").val() !== '' && $("#instance-search-ins").val() !== '' && $("#instance-search-rid").val() !== '') ||
282
+ $("#instance-search-sid").val() === '#' || $("#instance-search-pid").val() === '#' || $("#instance-search-ins").val() === '#' || $("#instance-search-rid").val() === '#') {
283
+ $("#node-search-accept").css('color', '#555555');
284
+ readyToAccept = true;
285
+ } else {
286
+ $("#node-search-accept").css('color', '#CCCCCC');
287
+ readyToAccept = false;
288
+ }
289
+ if ($("#instance-search-sid").val() !== '+' && $("#instance-search-pid").val() !== '+' && $("#instance-search-ins").val() !== '+') {
290
+ $("#wildcard-alert-row").hide();
291
+ } else {
292
+ $("#wildcard-alert-row").show();
293
+ }
294
+ }
295
+
296
+ // Respond to clicks
297
+ $("#node-lookup-instance").click(function () { //When search button is clicked
298
+ $("#instance-search-sid").val('');
299
+ $("#instance-search-pid").val('');
300
+ $("#instance-search-ins").val('');
301
+ $("#instance-search-rid").val('');
302
+ $("#node-lookup-instance").addClass('disabled');
303
+ $("#node-search-return").removeClass('disabled');
304
+ $("#node-search-accept").removeClass('disabled');
305
+ $("#instance-row").hide();
306
+ $("#instance-search-row").show();
307
+ });
308
+ $("#instance-search-sid").click(function () { //SID field clicked
309
+ $("#instance-search-pid").val('')
310
+ $("#instance-search-ins").val('')
311
+ searchObject.pid = '';
312
+ searchObject.ins = '';
313
+ searchObject.rid = '';
314
+ searchObject.objects = [];
315
+ startSearch();
316
+ })
317
+ $("#instance-search-pid").click(function () { //PID field clicked
318
+ $("#instance-search-ins").val('')
319
+ $("#instance-search-rid").val('')
320
+ searchObject.ins = '';
321
+ searchObject.rid = '';
322
+ if (searchObject.sid !== '') {
323
+ pidsSearch(searchObject.objects);
324
+ }
325
+ })
326
+ $("#instance-search-ins").click(function () { //INS field clicked
327
+ $("#instance-search-rid").val('')
328
+ searchObject.rid = '';
329
+ if (searchObject.pid !== '' && searchObject.pid !== '+' && searchObject.sid !== '+') {
330
+ insSearch(searchObject.objects, searchObject.pid);
331
+ }
332
+ })
333
+ $("#instance-search-rid").click(function () { //RID clicked
334
+ if (searchObject.ins !== '' && searchObject.ins !== '+' && searchObject.pid !== '+' && searchObject.sid !== '+') {
335
+ ridSearch(searchObject.objects, searchObject.ins);
336
+ }
337
+ });
338
+ $("#node-search-return").click(function () { //Return/Back button clicked
339
+ $("#node-search-return").addClass('disabled');
340
+ $("#node-search-accept").addClass('disabled');
341
+ $("#node-lookup-instance").removeClass('disabled');
342
+ $("#instance-search-row").hide();
343
+ $("#instance-row").show();
344
+ });
345
+ $("#node-search-accept").click(function () { //Accept button clicked
346
+ if (readyToAccept) {
347
+ finishSearch();
348
+ }
349
+ });
350
+
351
+ // Respond to search field changes
352
+ $("#instance-search-hid").change(function () {
353
+ acceptCheck();
354
+ $("#instance-search-sid").val('');
355
+ $("#instance-search-pid").val('');
356
+ $("#instance-search-ins").val('');
357
+ $("#instance-search-rid").val('');
358
+ });
359
+ $("#instance-search-sid").change(function () {
360
+ searchObject.sid = $("#instance-search-sid").val()
361
+ acceptCheck();
362
+ });
363
+ $("#instance-search-pid").change(function () {
364
+ searchObject.pid = $("#instance-search-pid").val()
365
+ acceptCheck();
366
+ });
367
+ $("#instance-search-ins").change(function () {
368
+ searchObject.ins = $("#instance-search-ins").val()
369
+ acceptCheck();
370
+ });
371
+ $("#instance-search-rid").change(function () {
372
+ searchObject.rid = $("#instance-search-rid").val()
373
+ acceptCheck();
374
+ });
375
+
376
+ // *** MOBSEARCH *** //
377
+ },
93
378
  oneditsave: function() {
94
379
  if($("#node-input-detailedOutput").prop('checked')) {
95
380
  this.outputs = 4;
@@ -106,12 +106,12 @@ module.exports = {
106
106
  });
107
107
  },
108
108
 
109
- async getServiceList(connection, hid) {
109
+ getServiceList(connection, hid) {
110
110
  // getNodeConfig -> id, spid, uri, name, enabled, runAtStart
111
111
  // For every: getServiceConfig -> mobiusSettings, customSettings
112
112
  // discover -> registered, last connected, status + any remaining if new service
113
113
  // For every: discover object -/0001/0001 -> status, statusText
114
- return new Promise((resolve, reject) => {
114
+ return new Promise(async (resolve, reject) => {
115
115
  try {
116
116
  // Fetch information from node config
117
117
  const nodeConfig = await connection.getNodeConfig(hid);
@@ -119,41 +119,41 @@ module.exports = {
119
119
  let services = [];
120
120
  for (let i = 0; i < servicesFromConfig.length; i++) {
121
121
  services.push({
122
- id: servicesFromConfig.id,
123
- spid: servicesFromConfig.id.split('/')[0],
124
- sid: servicesFromConfig.id.split('/')[1],
125
- uri: `${nodeConfig.uri}/${servicesFromConfig.id.split('/')[1]}`,
126
- name: servicesFromConfig.name,
127
- enabled: servicesFromConfig.enabled,
128
- runAtStart: servicesFromConfig.runAtStart,
122
+ id: servicesFromConfig[i].id,
123
+ spid: servicesFromConfig[i].id.split('/')[0],
124
+ sid: servicesFromConfig[i].id.split('/')[1],
125
+ uri: `${nodeConfig.uri}/${servicesFromConfig[i].id.split('/')[1]}`,
126
+ name: servicesFromConfig[i].name,
127
+ enabled: servicesFromConfig[i].enabled,
128
+ runAtStart: servicesFromConfig[i].runAtStart,
129
129
  registered: null,
130
130
  lastConnected: null,
131
131
  status: null,
132
132
  statusText: null,
133
133
  mobiusSettings: null,
134
134
  customSettings: null,
135
+ pids: [],
135
136
  });
136
137
  }
137
138
 
138
- console.log('Following get node config');
139
- console.log(services);
140
-
141
139
  // Fetch information from each service config
142
- for (i = 0; i < services.length; i++) {
143
- const fullServiceConfig = await connection.getServicesConfig(hid, services[i].sid);
144
- services[i].mobiusSettings = fullServiceConfig.value.serviceConfig.settings;
145
- services[i].customSettings = fullServiceConfig.value.serviceConfig.custom;
140
+ for (let i = 0; i < services.length; i++) {
141
+ const fullServiceConfig = await connection.getServiceConfigProm(hid, services[i].sid);
142
+ if (fullServiceConfig.value.serviceConfig !== undefined) {
143
+ services[i].mobiusSettings = fullServiceConfig.value.serviceConfig.settings;
144
+ services[i].customSettings = fullServiceConfig.value.serviceConfig.custom;
145
+ } else {
146
+ services[i].mobiusSettings = fullServiceConfig.value.settings;
147
+ services[i].customSettings = fullServiceConfig.value.custom;
148
+ }
146
149
  }
147
150
 
148
- console.log('Following service node configs');
149
- console.log(services);
150
-
151
151
  // Fetch information from discovered services
152
152
  const discoveryResponse = await this.discover(connection, hid);
153
153
  const servicesFromDiscovery = discoveryResponse.value;
154
- for (i = 0; i < servicesFromDiscovery.length; i++) {
154
+ for (let i = 0; i < servicesFromDiscovery.length; i++) {
155
155
  let serviceFound = false;
156
- for (j = 0; j < services.length; j++) {
156
+ for (let j = 0; j < services.length; j++) {
157
157
  if (servicesFromDiscovery[i].id === services[j].id) {
158
158
  serviceFound = true;
159
159
  services[j].registered = servicesFromDiscovery[i].registered;
@@ -176,30 +176,57 @@ module.exports = {
176
176
  statusText: null,
177
177
  mobiusSettings: null,
178
178
  customSettings: null,
179
+ pids: [],
179
180
  });
180
181
  }
181
182
  }
182
183
 
183
- console.log('Following discover');
184
- console.log(services);
185
-
186
- // Fetch status object from all services
187
- for (i = 0; i < services.length; i++) {
188
- const statusObjectResponse = await this.discover(
189
- connection,
190
- `${hid}/${services[i].sid}/0001/0001`
191
- );
192
- const statusObject = statusObjectResponse.value;
193
- services[i].status = statusObject.resources[1].pv;
194
- services[i].statusText = `${statusObject.resources[2].pv}`;
184
+ // Fetch pids and status object from all services
185
+ for (let i = 0; i < services.length; i++) {
186
+ if (services[i].sid !== '009') {
187
+ const serviceResponse = await this.discover(connection, `${hid}/${services[i].sid}`);
188
+ services[i].pids = [...new Set(serviceResponse.value)];
189
+ const statusObjectResponse = await this.discover(
190
+ connection,
191
+ `${hid}/${services[i].sid}/0001/0001`
192
+ );
193
+ const statusObject = statusObjectResponse.value[0];
194
+ services[i].status = statusObject.resources[1].pv;
195
+ services[i].statusText = `${statusObject.resources[2].pv}`;
196
+ } else {
197
+ services[i].pids = [];
198
+ services[i].status = 'Unknown';
199
+ services[i].statusText = 'Unknown';
200
+ }
195
201
  }
196
202
 
197
- console.log('Complete');
198
- console.log(services);
199
-
200
203
  resolve(services);
201
204
  } catch (err) {
202
- reject(err);
205
+ reject(JSON.stringify(err));
206
+ }
207
+ });
208
+ },
209
+
210
+ getObjectList(connection, hid, sid) {
211
+ return new Promise(async (resolve, reject) => {
212
+ try {
213
+ let objectList = [];
214
+ const serviceResponse = await this.discover(connection, `${hid}/${sid}`);
215
+ const pids = [...new Set(serviceResponse.value)];
216
+ for (let i = 0; i < pids.length; i++) {
217
+ const inssResponse = await this.discover(connection, `${hid}/${sid}/${pids[i]}`);
218
+ const inss = inssResponse.value;
219
+ for (let j = 0; j < inss.length; j++) {
220
+ const objResponse = await this.discover(
221
+ connection,
222
+ `${hid}/${sid}/${pids[i]}/${inss[j]}`
223
+ );
224
+ objectList.push(objResponse.value[0]);
225
+ }
226
+ }
227
+ resolve(objectList);
228
+ } catch (err) {
229
+ reject(JSON.stringify(err));
203
230
  }
204
231
  });
205
232
  },
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "node-red-contrib-mobius-flow-base",
3
- "version": "2.5.86-beta.5",
3
+ "version": "2.5.86-beta.53",
4
4
  "description": "Node-RED base nodes for Mobius Flow",
5
5
  "main": "index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
8
8
  "test": "echo \"Error: no test specified\" && exit 1",
9
- "build": "mkdir -p dist/nodes && cp src/nodes/*.js dist/nodes/ && cp src/nodes/*.html dist/nodes/ && cp -r src/nodes/icons dist/nodes/"
9
+ "build": "mkdir -p dist/nodes && cp src/nodes/*.js dist/nodes/ && cp src/nodes/*.html dist/nodes/ && cp -r src/nodes/icons dist/nodes/ && mkdir -p dist/nodes/common && cp src/nodes/common/*.js dist/nodes/common/"
10
10
  },
11
11
  "repository": "bitbucket:interiorautomation/node-red-contrib-mobius-flow-base",
12
12
  "node-red": {