queclink-parser 1.3.20

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/src/gv50p.js ADDED
@@ -0,0 +1,513 @@
1
+ 'use strict'
2
+ const utils = require('./utils.js')
3
+
4
+ /*
5
+ Parses messages data from GV55 devices
6
+ */
7
+ const parse = raw => {
8
+ raw = raw.substr(0, raw.length - 1)
9
+
10
+ const parsedData = raw.split(',')
11
+ const command = parsedData[0].split(':')
12
+
13
+ let history = false
14
+ if (utils.patterns.buffer.test(command[0])) {
15
+ history = true
16
+ }
17
+
18
+ let data = {
19
+ raw: `${raw.toString()}$`,
20
+ manufacturer: 'queclink',
21
+ device: 'Queclink-GV50Plus',
22
+ type: 'data',
23
+ imei: parsedData[2],
24
+ protocolVersion: utils.getProtocolVersion(parsedData[1]),
25
+ temperature: null,
26
+ history: history,
27
+ sentTime: utils.parseDate(parsedData[parsedData.length - 2]),
28
+ serialId: parseInt(parsedData[parsedData.length - 1], 16)
29
+ }
30
+
31
+ // GPS
32
+ if (command[1] === 'GTFRI') {
33
+ if (typeof parsedData[24] !== 'undefined' && parsedData[24] !== null) {
34
+ data = Object.assign(data, {
35
+ alarm: utils.getAlarm(command[1], null),
36
+ loc: {
37
+ type: 'Point',
38
+ coordinates: [parseFloat(parsedData[11]), parseFloat(parsedData[12])]
39
+ },
40
+ speed: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
41
+ gpsStatus: utils.checkGps(
42
+ parseFloat(parsedData[11]),
43
+ parseFloat(parsedData[12])
44
+ ),
45
+ hdop: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
46
+ status: {
47
+ raw: parsedData[24],
48
+ sos:
49
+ utils.nHexDigit(
50
+ utils.hex2bin(parsedData[24].substring(2, 4)),
51
+ 2
52
+ )[0] === '1',
53
+ state: utils.states[parsedData[24].substring(0, 2)],
54
+ input: {
55
+ '1':
56
+ utils.nHexDigit(
57
+ utils.hex2bin(parsedData[24].substring(2, 4)),
58
+ 2
59
+ )[1] === '1',
60
+ '2':
61
+ utils.nHexDigit(
62
+ utils.hex2bin(parsedData[24].substring(2, 4)),
63
+ 2
64
+ )[0] === '1'
65
+ },
66
+ output: {
67
+ '1':
68
+ utils.nHexDigit(
69
+ utils.hex2bin(parsedData[24].substring(4, 6)),
70
+ 2
71
+ )[1] === '1',
72
+ '2':
73
+ utils.nHexDigit(
74
+ utils.hex2bin(parsedData[24].substring(4, 6)),
75
+ 2
76
+ )[0] === '1'
77
+ },
78
+ charge: parseFloat(parsedData[4]) > 5
79
+ },
80
+ azimuth: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
81
+ altitude: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
82
+ datetime:
83
+ parsedData[13] !== '' ? utils.parseDate(parsedData[13]) : null,
84
+ voltage: {
85
+ battery: parsedData[23] !== '' ? parseFloat(parsedData[23]) : null, // percentage
86
+ inputCharge:
87
+ parsedData[4] !== '' ? parseFloat(parsedData[4]) / 1000 : null
88
+ },
89
+ mcc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
90
+ mnc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
91
+ lac: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
92
+ cid: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
93
+ odometer: parsedData[19] !== '' ? parseFloat(parsedData[19]) : null,
94
+ hourmeter:
95
+ parsedData[20] !== ''
96
+ ? utils.getHoursForHourmeter(parsedData[20])
97
+ : null
98
+ })
99
+ }
100
+ } else if (command[1] === 'GTHBD') {
101
+ // Heartbeat. It must response an ACK command
102
+ data = Object.assign(data, {
103
+ alarm: utils.getAlarm(command[1], null)
104
+ })
105
+ } else if (command[1] === 'GTINF') {
106
+ // General Info Report
107
+ data = Object.assign(data, {
108
+ alarm: utils.getAlarm(command[1], null),
109
+ state: utils.states[parsedData[4]],
110
+ gsmInfo: {
111
+ SIM_ICC: parsedData[5],
112
+ RSSI_dBm: parsedData[6],
113
+ RSSI_quality:
114
+ parsedData[7] !== ''
115
+ ? 100 * parseInt(parseFloat(parsedData[7]) / 7, 10)
116
+ : null // Percentage
117
+ },
118
+ backupBattery: {
119
+ using: parsedData[10] === '1',
120
+ voltage: parsedData[11] !== '' ? parseFloat(parsedData[11]) : null,
121
+ charging: parsedData[12] === '1'
122
+ },
123
+ externalGPSAntenna: parsedData[15] === '0',
124
+ status: {
125
+ // parsedData[24]
126
+ raw: parsedData[18] + parsedData[19],
127
+ sos: false,
128
+ input: {
129
+ '1': utils.nHexDigit(utils.hex2bin(parsedData[20]), 2)[1] === '1',
130
+ '2': utils.nHexDigit(utils.hex2bin(parsedData[20]), 2)[0] === '1'
131
+ },
132
+ output: {
133
+ '1': utils.nHexDigit(utils.hex2bin(parsedData[21]), 2)[1] === '1',
134
+ '2': utils.nHexDigit(utils.hex2bin(parsedData[21]), 2)[0] === '1'
135
+ },
136
+ charge: parsedData[8] === '1'
137
+ },
138
+ voltage: {
139
+ battery:
140
+ parsedData[11] !== ''
141
+ ? parseInt(100 * (parseFloat(parsedData[11]) / 5), 10)
142
+ : null, // percentage
143
+ inputCharge:
144
+ parsedData[9] !== '' ? parseFloat(parsedData[9]) / 1000 : null
145
+ },
146
+ lastFixUTCTime:
147
+ parsedData[16] !== '' ? utils.parseDate(parsedData[16]) : null,
148
+ timezoneOffset: parsedData[22]
149
+ })
150
+ } else if (
151
+ command[1] === 'GTTOW' ||
152
+ command[1] === 'GTDIS' ||
153
+ command[1] === 'GTIOB' ||
154
+ command[1] === 'GTSPD' ||
155
+ command[1] === 'GTSOS' ||
156
+ command[1] === 'GTRTL' ||
157
+ command[1] === 'GTDOG' ||
158
+ command[1] === 'GTIGL' ||
159
+ command[1] === 'GTVGL' ||
160
+ command[1] === 'GTHBM'
161
+ ) {
162
+ // Common Alarms
163
+ data = Object.assign(data, {
164
+ alarm: utils.getAlarm(command[1], parsedData[5], true),
165
+ loc: {
166
+ type: 'Point',
167
+ coordinates: [parseFloat(parsedData[11]), parseFloat(parsedData[12])]
168
+ },
169
+ speed: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
170
+ gpsStatus: utils.checkGps(
171
+ parseFloat(parsedData[11]),
172
+ parseFloat(parsedData[12])
173
+ ),
174
+ hdop: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
175
+ status: null,
176
+ azimuth: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
177
+ altitude: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
178
+ datetime: parsedData[13] !== '' ? utils.parseDate(parsedData[13]) : null,
179
+ voltage: {
180
+ battery: null,
181
+ inputCharge: null
182
+ },
183
+ mcc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
184
+ mnc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
185
+ lac: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
186
+ cid: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
187
+ odometer: parsedData[19] !== '' ? parseFloat(parsedData[19]) : null,
188
+ hourmeter: null
189
+ })
190
+ } else if (command[1] === 'GTEPS' || command[1] === 'GTAIS') {
191
+ // External low battery and Low voltage for analog input
192
+ data = Object.assign(data, {
193
+ alarm: utils.getAlarm(command[1], parsedData[5]),
194
+ loc: {
195
+ type: 'Point',
196
+ coordinates: [parseFloat(parsedData[11]), parseFloat(parsedData[12])]
197
+ },
198
+ speed: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
199
+ gpsStatus: utils.checkGps(
200
+ parseFloat(parsedData[11]),
201
+ parseFloat(parsedData[12])
202
+ ),
203
+ hdop: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
204
+ status: null,
205
+ azimuth: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
206
+ altitude: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
207
+ datetime: parsedData[13] !== '' ? utils.parseDate(parsedData[13]) : null,
208
+ voltage: {
209
+ battery: parsedData[23] !== '' ? parseFloat(parsedData[23]) : null, // percentage
210
+ inputCharge:
211
+ parsedData[4] !== '' ? parseFloat(parsedData[4]) / 1000 : null
212
+ },
213
+ mcc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
214
+ mnc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
215
+ lac: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
216
+ cid: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
217
+ odometer: parsedData[19] !== '' ? parseFloat(parsedData[19]) : null,
218
+ hourmeter:
219
+ parsedData[20] !== ''
220
+ ? utils.getHoursForHourmeter(parsedData[20])
221
+ : null
222
+ })
223
+ } else if (
224
+ command[1] === 'GTPNA' ||
225
+ command[1] === 'GTPFA' ||
226
+ command[1] === 'GTPDP'
227
+ ) {
228
+ // Event report (It uses the last GPS data and MCC info)
229
+ data = Object.assign(data, {
230
+ alarm: utils.getAlarm(command[1], null),
231
+ loc: null,
232
+ speed: null,
233
+ gpsStatus: null,
234
+ hdop: null,
235
+ status: null,
236
+ azimuth: null,
237
+ altitude: null,
238
+ datetime: parsedData[4] !== '' ? utils.parseDate(parsedData[4]) : null,
239
+ voltage: {
240
+ battery: null,
241
+ inputCharge: null
242
+ },
243
+ mcc: null,
244
+ mnc: null,
245
+ lac: null,
246
+ cid: null,
247
+ odometer: null,
248
+ hourmeter: null
249
+ })
250
+ } else if (
251
+ command[1] === 'GTMPN' ||
252
+ command[1] === 'GTMPF' ||
253
+ command[1] === 'GTCRA' ||
254
+ command[1] === 'GTJDR'
255
+ ) {
256
+ data = Object.assign(data, {
257
+ alarm: utils.getAlarm(command[1], null),
258
+ loc: {
259
+ type: 'Point',
260
+ coordinates: [parseFloat(parsedData[8]), parseFloat(parsedData[9])]
261
+ },
262
+ speed: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
263
+ gpsStatus: utils.checkGps(
264
+ parseFloat(parsedData[8]),
265
+ parseFloat(parsedData[9])
266
+ ),
267
+ hdop: parsedData[4] !== '' ? parseFloat(parsedData[4]) : null,
268
+ status: null,
269
+ azimuth: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
270
+ altitude: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
271
+ datetime: parsedData[10] !== '' ? utils.parseDate(parsedData[10]) : null,
272
+ voltage: {
273
+ battery: null,
274
+ inputCharge: null
275
+ },
276
+ mcc: parsedData[11] !== '' ? parseInt(parsedData[11], 10) : null,
277
+ mnc: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
278
+ lac: parsedData[13] !== '' ? parseInt(parsedData[13], 16) : null,
279
+ cid: parsedData[14] !== '' ? parseInt(parsedData[14], 16) : null,
280
+ odometer: null,
281
+ hourmeter: null
282
+ })
283
+ } else if (
284
+ command[1] === 'GTJDS' ||
285
+ command[1] === 'GTANT' ||
286
+ command[1] === 'GTRMD'
287
+ ) {
288
+ data = Object.assign(data, {
289
+ alarm: utils.getAlarm(command[1], parsedData[4]),
290
+ loc: {
291
+ type: 'Point',
292
+ coordinates: [parseFloat(parsedData[9]), parseFloat(parsedData[10])]
293
+ },
294
+ speed: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
295
+ gpsStatus: utils.checkGps(
296
+ parseFloat(parsedData[9]),
297
+ parseFloat(parsedData[10])
298
+ ),
299
+ hdop: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
300
+ status: null,
301
+ azimuth: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
302
+ altitude: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
303
+ datetime: parsedData[11] !== '' ? utils.parseDate(parsedData[11]) : null,
304
+ voltage: {
305
+ battery: null,
306
+ inputCharge: null
307
+ },
308
+ mcc: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
309
+ mnc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
310
+ lac: parsedData[14] !== '' ? parseInt(parsedData[14], 16) : null,
311
+ cid: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
312
+ odometer: null,
313
+ hourmeter: null
314
+ })
315
+ } else if (command[1] === 'GTBPL') {
316
+ data = Object.assign(data, {
317
+ alarm: utils.getAlarm(command[1], null),
318
+ loc: {
319
+ type: 'Point',
320
+ coordinates: [parseFloat(parsedData[9]), parseFloat(parsedData[10])]
321
+ },
322
+ speed: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
323
+ gpsStatus: utils.checkGps(
324
+ parseFloat(parsedData[9]),
325
+ parseFloat(parsedData[10])
326
+ ),
327
+ hdop: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
328
+ status: null,
329
+ azimuth: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
330
+ altitude: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
331
+ datetime: parsedData[11] !== '' ? utils.parseDate(parsedData[11]) : null,
332
+ voltage: {
333
+ battery: parsedData[4] !== '' ? parseFloat(parsedData[4]) : null,
334
+ inputCharge: null
335
+ },
336
+ mcc: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
337
+ mnc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
338
+ lac: parsedData[14] !== '' ? parseInt(parsedData[14], 16) : null,
339
+ cid: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
340
+ odometer: null,
341
+ hourmeter: null
342
+ })
343
+ } else if (command[1] === 'GTIGN' || command[1] === 'GTIGF') {
344
+ data = Object.assign(data, {
345
+ alarm: utils.getAlarm(command[1], parsedData[4]),
346
+ loc: {
347
+ type: 'Point',
348
+ coordinates: [parseFloat(parsedData[9]), parseFloat(parsedData[10])]
349
+ },
350
+ speed: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
351
+ gpsStatus: utils.checkGps(
352
+ parseFloat(parsedData[9]),
353
+ parseFloat(parsedData[10])
354
+ ),
355
+ hdop: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
356
+ status: null,
357
+ azimuth: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
358
+ altitude: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
359
+ datetime: parsedData[11] !== '' ? utils.parseDate(parsedData[11]) : null,
360
+ voltage: {
361
+ battery: null,
362
+ inputCharge: null
363
+ },
364
+ mcc: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
365
+ mnc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
366
+ lac: parsedData[14] !== '' ? parseInt(parsedData[14], 16) : null,
367
+ cid: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
368
+ odometer: parsedData[18] !== '' ? parseFloat(parsedData[18]) : null,
369
+ hourmeter:
370
+ parsedData[17] !== ''
371
+ ? utils.getHoursForHourmeter(parsedData[17])
372
+ : null
373
+ })
374
+ } else if (command[1] === 'GTIDN' || command[1] === 'GTIDF') {
375
+ data = Object.assign(data, {
376
+ alarm: utils.getAlarm(command[1], parsedData[5]),
377
+ loc: {
378
+ type: 'Point',
379
+ coordinates: [parseFloat(parsedData[10]), parseFloat(parsedData[11])]
380
+ },
381
+ speed: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
382
+ gpsStatus: utils.checkGps(
383
+ parseFloat(parsedData[10]),
384
+ parseFloat(parsedData[11])
385
+ ),
386
+ hdop: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
387
+ status: null,
388
+ azimuth: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
389
+ altitude: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
390
+ datetime: parsedData[12] !== '' ? utils.parseDate(parsedData[12]) : null,
391
+ voltage: {
392
+ battery: null,
393
+ inputCharge: null
394
+ },
395
+ mcc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
396
+ mnc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
397
+ lac: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
398
+ cid: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
399
+ odometer: parsedData[18] !== '' ? parseFloat(parsedData[18]) : null,
400
+ hourmeter: null
401
+ })
402
+ } else if (
403
+ command[1] === 'GTSTR' ||
404
+ command[1] === 'GTSTP' ||
405
+ command[1] === 'GTLSP'
406
+ ) {
407
+ data = Object.assign(data, {
408
+ alarm: utils.getAlarm(command[1], null),
409
+ loc: {
410
+ type: 'Point',
411
+ coordinates: [parseFloat(parsedData[10]), parseFloat(parsedData[11])]
412
+ },
413
+ speed: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
414
+ gpsStatus: utils.checkGps(
415
+ parseFloat(parsedData[10]),
416
+ parseFloat(parsedData[11])
417
+ ),
418
+ hdop: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
419
+ status: null,
420
+ azimuth: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
421
+ altitude: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
422
+ datetime: parsedData[12] !== '' ? utils.parseDate(parsedData[12]) : null,
423
+ voltage: {
424
+ battery: null,
425
+ inputCharge: null
426
+ },
427
+ mcc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
428
+ mnc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
429
+ lac: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
430
+ cid: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
431
+ odometer: parsedData[18] !== '' ? parseFloat(parsedData[18]) : null,
432
+ hourmeter: null
433
+ })
434
+ } else if (command[1] === 'GTSTT') {
435
+ // Motion State Changed
436
+ data = Object.assign(data, {
437
+ alarm: utils.getAlarm(command[1], null),
438
+ loc: {
439
+ type: 'Point',
440
+ coordinates: [parseFloat(parsedData[9]), parseFloat(parsedData[10])]
441
+ },
442
+ speed: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
443
+ gpsStatus: utils.checkGps(
444
+ parseFloat(parsedData[9]),
445
+ parseFloat(parsedData[10])
446
+ ),
447
+ hdop: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
448
+ status: null,
449
+ azimuth: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
450
+ altitude: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
451
+ datetime: parsedData[11] !== '' ? utils.parseDate(parsedData[11]) : null,
452
+ voltage: {
453
+ battery: null,
454
+ inputCharge: null
455
+ },
456
+ mcc: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
457
+ mnc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
458
+ lac: parsedData[14] !== '' ? parseInt(parsedData[14], 16) : null,
459
+ cid: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
460
+ odometer: null,
461
+ hourmeter: null
462
+ })
463
+ } else if (command[1] === 'GTGSS') {
464
+ // GPS Status
465
+ data = Object.assign(data, {
466
+ alarm: utils.getAlarm(command[1], parsedData[4]),
467
+ loc: {
468
+ type: 'Point',
469
+ coordinates: [parseFloat(parsedData[12]), parseFloat(parsedData[13])]
470
+ },
471
+ speed: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
472
+ gpsStatus: utils.checkGps(
473
+ parseFloat(parsedData[12]),
474
+ parseFloat(parsedData[13])
475
+ ),
476
+ hdop: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
477
+ status: null,
478
+ azimuth: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
479
+ altitude: parsedData[11] !== '' ? parseFloat(parsedData[11]) : null,
480
+ datetime: parsedData[14] !== '' ? utils.parseDate(parsedData[14]) : null,
481
+ voltage: {
482
+ battery: null,
483
+ inputCharge: null
484
+ },
485
+ mcc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
486
+ mnc: parsedData[16] !== '' ? parseInt(parsedData[16], 10) : null,
487
+ lac: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
488
+ cid: parsedData[18] !== '' ? parseInt(parsedData[18], 16) : null,
489
+ odometer: null,
490
+ hourmeter: null
491
+ })
492
+ } else {
493
+ data = Object.assign(data, {
494
+ alarm: utils.getAlarm(command[1], null)
495
+ })
496
+ }
497
+ // Check gps data
498
+ if (data.loc !== null && typeof data.loc !== 'undefined') {
499
+ if (
500
+ data.loc.coordinates[0] === 0 ||
501
+ isNaN(data.loc.coordinates[0]) ||
502
+ data.loc.coordinates[1] === 0 ||
503
+ isNaN(data.loc.coordinates[1])
504
+ ) {
505
+ data.loc = null
506
+ }
507
+ }
508
+ return data
509
+ }
510
+
511
+ module.exports = {
512
+ parse: parse
513
+ }