queclink-parser 1.9.11 → 1.9.12

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/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ #### 1.9.12 (2024-10-14)
2
+
3
+ ##### New Features
4
+
5
+ * **can:** added adBlueLevelUnit ([cfc663c8](https://github.com/jaayesta/queclink-parser/commit/cfc663c8339dadc6e36750019c7d881007942a45))
6
+
7
+ ##### Bug Fixes
8
+
9
+ * **gv58lau:** digital inputs ([bb78b299](https://github.com/jaayesta/queclink-parser/commit/bb78b29970fa016571d93fd9c1959c73804d294a))
10
+ * **canbus:** new can index consider ac100 or digitFuelSensor data ([b0e9d23e](https://github.com/jaayesta/queclink-parser/commit/b0e9d23e69e9ffacddf0b76cc3a4d04523598ebe))
11
+ * **can:**
12
+ * evaluation for parsedData ([3427d98f](https://github.com/jaayesta/queclink-parser/commit/3427d98f85d273a262dc076c4b36cb88e51c3b54))
13
+ * typo ([08408de4](https://github.com/jaayesta/queclink-parser/commit/08408de4d52d38f8cd280736ff7d821303c5e756))
14
+
15
+ ##### Tests
16
+
17
+ * **can:** test for database when can data exists ([424e28c6](https://github.com/jaayesta/queclink-parser/commit/424e28c63c39d6d3e6a4335d9f9b79c83d574b68))
18
+
1
19
  #### 1.9.11 (2024-10-09)
2
20
 
3
21
  ##### New Features
package/example.js CHANGED
@@ -90,7 +90,73 @@ var data = {
90
90
  }
91
91
 
92
92
  // console.log(queclink.parseCommand(data))
93
- const raw = new Buffer(eribad)
94
- console.log(queclink.parse(raw))
95
- queclink.parse(raw)
93
+ const raw = new Buffer(caneri)
94
+ // console.log(queclink.parse(raw))
95
+ // queclink.parse(raw)
96
96
 
97
+ data = queclink.parse(raw)
98
+ // console.log(data)
99
+ if (data.can) {
100
+ const {
101
+ comunicationOk,
102
+ vin,
103
+ ignitionKey,
104
+ totalDistance,
105
+ totalDistanceUnit,
106
+ rpm,
107
+ speed,
108
+ engineCoolantTemp,
109
+ fuelConsumption,
110
+ fuelLevel,
111
+ fuelLevelUnit,
112
+ range,
113
+ acceleratorPressure,
114
+ engineHours,
115
+ drivingTime,
116
+ idleTime,
117
+ idleFuelUsed,
118
+ axleWeight,
119
+ tachograph,
120
+ indicators,
121
+ lights,
122
+ doors,
123
+ overSpeedTime,
124
+ overSpeedEngineTime
125
+ } = data.can
126
+
127
+ const canData = {
128
+ raw: data.raw,
129
+ imei: data.imei,
130
+ datetime: data.datetime,
131
+ point: data.point,
132
+ comunicationOk,
133
+ vin,
134
+ ignitionKey,
135
+ totalDistance,
136
+ totalDistanceUnit,
137
+ rpm,
138
+ speed,
139
+ engineCoolantTemp,
140
+ fuelConsumption,
141
+ fuelLevel,
142
+ fuelLevelUnit,
143
+ range,
144
+ acceleratorPressure,
145
+ engineHours,
146
+ drivingTime,
147
+ idleTime,
148
+ idleFuelUsed,
149
+ axleWeight,
150
+ tachograph,
151
+ indicators,
152
+ lights,
153
+ doors,
154
+ overSpeedTime,
155
+ overSpeedEngineTime,
156
+ ...data.can.canExpanded
157
+ }
158
+
159
+ canData.canReportExpansionMask = canData.canReportExpansionMask.raw
160
+ console.log(canData)
161
+ delete data.can
162
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "queclink-parser",
3
- "version": "1.9.11",
3
+ "version": "1.9.12",
4
4
  "description": "Parse raw data from Queclink devices",
5
5
  "main": "src",
6
6
  "scripts": {
package/src/gv310lau.js CHANGED
@@ -229,6 +229,12 @@ const parse = raw => {
229
229
  let index = 7 + 12 * number // position append mask
230
230
  let satelliteInfo = false
231
231
 
232
+ // If get satellites is configured
233
+ if (utils.includeSatellites(parsedData[19])) {
234
+ index = 7 + 13 * number
235
+ satelliteInfo = true
236
+ }
237
+
232
238
  // External Data
233
239
  const digitFuelSensor =
234
240
  utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[10] === '1'
@@ -242,12 +248,6 @@ const parse = raw => {
242
248
  const bluetoothAccessory =
243
249
  utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[2] === '1'
244
250
 
245
- // If get satellites is configured
246
- if (utils.includeSatellites(parsedData[19])) {
247
- index = 7 + 13 * number
248
- satelliteInfo = true
249
- }
250
-
251
251
  data = Object.assign(data, {
252
252
  alarm: utils.getAlarm(command[1], null),
253
253
  loc: {
@@ -369,27 +369,6 @@ const parse = raw => {
369
369
  AC100 && digitFuelSensor
370
370
  ? parseInt(parsedData[index + 10], 10)
371
371
  : AC100 && !digitFuelSensor ? parseInt(parsedData[index + 9], 10) : 0
372
-
373
- if (canData) {
374
- let canInfo = utils.getCanData(parsedData, index + 9)
375
- data = Object.assign(data, { can: canInfo })
376
- index = index + 49
377
-
378
- if (canInfo?.totalDistance) {
379
- data.gpsOdometer = data.odometer
380
- data.odometer = canInfo.totalDistance
381
- }
382
-
383
- if (canInfo?.engineHours) {
384
- data.gpsHourmeter = data.hourmeter
385
- data.hourmeter = canInfo.engineHours
386
- }
387
-
388
- if (canInfo?.speed) {
389
- data.gpsSpeed = data.speed
390
- data.speed = canInfo.speed
391
- }
392
- }
393
372
 
394
373
  let externalData = {
395
374
  eriMask: {
@@ -442,6 +421,7 @@ const parse = raw => {
442
421
  })
443
422
  count += 3
444
423
  }
424
+
445
425
  externalData = Object.assign(externalData, {
446
426
  fuelSensorData: null,
447
427
  AC100Devices: ac100Devices
@@ -536,6 +516,28 @@ const parse = raw => {
536
516
  }
537
517
  }
538
518
 
519
+ if (canData) {
520
+ let newIndex = digitFuelSensor && !AC100 ? index + 9 + 1 : !digitFuelSensor && AC100 ? index + 9 + 4 : digitFuelSensor && AC100 ? index + 9 + 5 : index + 9
521
+ let canInfo = utils.getCanData(parsedData, newIndex)
522
+ data = Object.assign(data, { can: canInfo })
523
+ index = index + 49
524
+
525
+ if (canInfo?.totalDistance) {
526
+ data.gpsOdometer = data.odometer
527
+ data.odometer = canInfo.totalDistance
528
+ }
529
+
530
+ if (canInfo?.engineHours) {
531
+ data.gpsHourmeter = data.hourmeter
532
+ data.hourmeter = canInfo.engineHours
533
+ }
534
+
535
+ if (canInfo?.speed) {
536
+ data.gpsSpeed = data.speed
537
+ data.speed = canInfo.speed
538
+ }
539
+ }
540
+
539
541
  // Bluetooth Accessories
540
542
  if (bluetoothAccessory) {
541
543
  let btDevices = []
package/src/gv58lau.js CHANGED
@@ -56,12 +56,12 @@ const parse = raw => {
56
56
  utils.nHexDigit(
57
57
  utils.hex2bin(parsedData[index + 6].substring(2, 4)),
58
58
  8
59
- )[7] === '1',
59
+ )[6] === '1',
60
60
  '1':
61
61
  utils.nHexDigit(
62
62
  utils.hex2bin(parsedData[index + 6].substring(2, 4)),
63
63
  8
64
- )[6] === '1'
64
+ )[7] === '1'
65
65
  },
66
66
  output: {
67
67
  '3':
package/src/utils.js CHANGED
@@ -618,6 +618,12 @@ const parseCanData = (data, key) => {
618
618
  }
619
619
  case 'tachographDrivingDirection':
620
620
  return data === '0' ? 'forward' : 'backward'
621
+ case 'adBlueLevel':
622
+ if(['P','L'].includes(data.slice(0,1))) {
623
+ return parseFloat(parseFloat(data.slice(1)).toFixed(2))
624
+ } else {
625
+ return parseFloat(parseFloat(data).toFixed(2))
626
+ }
621
627
  default:
622
628
  return data
623
629
  }
@@ -663,28 +669,28 @@ const getCanData = (parsedData, ix) => {
663
669
 
664
670
  return {
665
671
  comunicationOk: parsedData[ix] ? parsedData[ix] === '1' : null,
666
- vin: parsedData[ix + 2] !== '' ? parsedData[ix + 2] : null,
667
- ignitionKey: parsedData[ix + 3] !== '' ? parseCanData(parsedData[ix + 3], 'ignitionKey') : null,
668
- totalDistance: parsedData[ix + 4] !== '' ? parseCanData(parsedData[ix + 4], 'totalDistance') : null,
669
- totalDistanceUnit: parsedData[ix + 4] ? parsedData[ix + 4].slice(0,1) === 'H' ? 'Km' : 'I' : null,
670
- fuelUsed: parsedData[ix + 5] !== '' ? parseFloat(parsedData[ix + 5]) : null, // float
671
- rpm: parsedData[ix + 6] !== '' ? parseInt(parsedData[ix + 6], 10) : null, // int
672
- speed: parsedData[ix + 7] !== '' ? parseFloat(parsedData[ix + 7]) : null,
672
+ vin: parsedData[ix + 2] ? parsedData[ix + 2] : null,
673
+ ignitionKey: parsedData[ix + 3] ? parseCanData(parsedData[ix + 3], 'ignitionKey') : null,
674
+ totalDistance: parsedData[ix + 4] ? parseCanData(parsedData[ix + 4], 'totalDistance') : null,
675
+ totalDistanceUnit: parsedData[ix + 4] ? parsedData[ix + 4].slice(0,1) === 'H' ? 'km' : 'I' : null,
676
+ fuelUsed: parsedData[ix + 5] ? parseFloat(parsedData[ix + 5]) : null, // float
677
+ rpm: parsedData[ix + 6] ? parseInt(parsedData[ix + 6], 10) : null, // int
678
+ speed: parsedData[ix + 7] ? parseFloat(parsedData[ix + 7]) : null,
673
679
  engineCoolantTemp:
674
- parsedData[ix + 8] !== '' ? parseInt(parsedData[ix + 8], 10) : null,
675
- fuelConsumption: parsedData[ix + 9] !== '' ? parseCanData(parsedData[ix + 9], 'fuelConsumption') : null,
676
- fuelLevel: parsedData[ix + 10] !== '' ? parseFloat(parsedData[ix + 10].slice(1)) : null,
680
+ parsedData[ix + 8] ? parseInt(parsedData[ix + 8], 10) : null,
681
+ fuelConsumption: parsedData[ix + 9] ? parseCanData(parsedData[ix + 9], 'fuelConsumption') : null,
682
+ fuelLevel: parsedData[ix + 10] ? parseFloat(parsedData[ix + 10].slice(1)) : null,
677
683
  fuelLevelUnit: parsedData[ix + 10] ? parsedData[ix + 10].slice(0,1) === 'P' ? '%' : 'L' : null,
678
- range: parsedData[ix + 11] !== '' ? parseCanData(parsedData[ix + 11], 'range') : null,
684
+ range: parsedData[ix + 11] ? parseCanData(parsedData[ix + 11], 'range') : null,
679
685
  acceleratorPressure:
680
- parsedData[ix + 12] !== '' ? parseFloat(parsedData[ix + 12]) : null,
681
- engineHours: parsedData[ix + 13] !== '' ? parseFloat(parsedData[ix + 13]) : null,
682
- drivingTime: parsedData[ix + 14] !== '' ? parseFloat(parsedData[ix + 14]) : null,
683
- idleTime: parsedData[ix + 15] !== '' ? parseFloat(parsedData[ix + 15]) : null,
684
- idleFuelUsed: parsedData[ix + 16] !== '' ? parseFloat(parsedData[ix + 16]) : null,
685
- axleWight: parsedData[ix + 17] !== '' ? parseFloat(parsedData[ix + 17]) : null,
686
- tachograph: {
687
- raw: parsedData[ix + 18] !== '' ? parsedData[ix + 18] : null,
686
+ parsedData[ix + 12] ? parseFloat(parsedData[ix + 12]) : null,
687
+ engineHours: parsedData[ix + 13] ? parseFloat(parsedData[ix + 13]) : null,
688
+ drivingTime: parsedData[ix + 14] ? parseFloat(parsedData[ix + 14]) : null,
689
+ idleTime: parsedData[ix + 15] ? parseFloat(parsedData[ix + 15]) : null,
690
+ idleFuelUsed: parsedData[ix + 16] ? parseFloat(parsedData[ix + 16]) : null,
691
+ axleWeight: parsedData[ix + 17] ? parseFloat(parsedData[ix + 17]) : null,
692
+ tachograph: parsedData[ix + 18] ? {
693
+ raw: parsedData[ix + 18] ? parsedData[ix + 18] : null,
688
694
  validDriverData: tachographBin ? tachographBin[7] === '1' : null,
689
695
  insertedDriverCard: tachographBin ? tachographBin[5] === '1' : null,
690
696
  driverWorkingState: tachographBin
@@ -693,9 +699,9 @@ const getCanData = (parsedData, ix) => {
693
699
  drivingTimeState: tachographBin
694
700
  ? dTimeStates[parseInt(tachographBin.substring(5, 8), 2)]
695
701
  : null
696
- },
702
+ } : null,
697
703
  indicators: inicatorsBin ? {
698
- raw: inicatorsBin !== '' ? parsedData[ix + 19] : null,
704
+ raw: inicatorsBin ? parsedData[ix + 19] : null,
699
705
  lowFuel: inicatorsBin ? inicatorsBin[0] === '1' : null,
700
706
  driverSeatbelt: inicatorsBin ? inicatorsBin[1] === '1' : null,
701
707
  airConditioning: inicatorsBin ? inicatorsBin[2] === '1' : null,
@@ -714,7 +720,7 @@ const getCanData = (parsedData, ix) => {
714
720
  trunk: inicatorsBin ? inicatorsBin[15] === '1' : null
715
721
  } : null,
716
722
  lights: lights ? {
717
- raw: lights !== '' ? parsedData[ix + 20] : null,
723
+ raw: lights ? parsedData[ix + 20] : null,
718
724
  running: lights ? lights[0] === '1' : null,
719
725
  lowBeams: lights ? lights[1] === '1' : null,
720
726
  frontFog: lights ? lights[2] === '1' : null,
@@ -722,7 +728,7 @@ const getCanData = (parsedData, ix) => {
722
728
  hazard: lights ? lights[4] === '1' : null
723
729
  } : null,
724
730
  doors: doors ? {
725
- raw: doors !== '' ? parsedData[ix + 21] : null,
731
+ raw: doors ? parsedData[ix + 21] : null,
726
732
  driver: doors ? doors[0] === '1' : null,
727
733
  passenger: doors ? doors[1] === '1' : null,
728
734
  rearLeft: doors ? doors[2] === '1' : null,
@@ -730,11 +736,11 @@ const getCanData = (parsedData, ix) => {
730
736
  trunk: doors ? doors[4] === '1' : null,
731
737
  hood: doors ? doors[5] === '1' : null
732
738
  } : null,
733
- overSpeedTime: parsedData[ix + 22] !== '' ? parseFloat(parsedData[ix + 22]) : null,
734
- overSpeedEngineTime: parsedData[ix + 23] !== '' ? parseFloat(parsedData[ix + 23]) : null,
739
+ overSpeedTime: parsedData[ix + 22] ? parseFloat(parsedData[ix + 22]) : null,
740
+ overSpeedEngineTime: parsedData[ix + 23] ? parseFloat(parsedData[ix + 23]) : null,
735
741
  canExpanded: {
736
742
  canReportExpansionMask: {
737
- raw: parsedData[ix + 24] !== '' ? parsedData[ix + 24] : null,
743
+ raw: parsedData[ix + 24] ? parsedData[ix + 24] : null,
738
744
  engineTorque: canExpansionMask ? canExpansionMask[23] === '1' : null,
739
745
  rapidAccelerations: canExpansionMask
740
746
  ? canExpansionMask[22] === '1'
@@ -797,40 +803,40 @@ const getCanData = (parsedData, ix) => {
797
803
  adBlueLevel: canExpansionMask ? canExpansionMask[0] === '1' : null
798
804
  },
799
805
  adBlueLevel:
800
- parsedData[ix + 25] !== '' ? parseFloat(parsedData[ix + 25]) : null,
801
- // adBlueLevelUnit: parsedData[ix + 25] ? parsedData[ix + 25].slice(0,1) === 'P' ? '%' : 'L' : null,
802
- axleWeight1: parsedData[ix + 26] !== '' ? parseInt(parsedData[ix + 26]) : null,
803
- axleWeight3: parsedData[ix + 27] !== '' ? parseInt(parsedData[ix + 27]) : null,
804
- axleWeight4: parsedData[ix + 28] !== '' ? parseInt(parsedData[ix + 28]) : null,
806
+ parsedData[ix + 25] ? parseCanData(parsedData[ix + 25], 'adBlueLevel') : null,
807
+ adBlueLevelUnit: parsedData[ix + 25] ? parsedData[ix + 25].slice(0,1) === 'P' ? '%' : 'L' ? 'L': 'L' : null,
808
+ axleWeight1: parsedData[ix + 26] ? parseInt(parsedData[ix + 26]) : null,
809
+ axleWeight3: parsedData[ix + 27] ? parseInt(parsedData[ix + 27]) : null,
810
+ axleWeight4: parsedData[ix + 28] ? parseInt(parsedData[ix + 28]) : null,
805
811
  tachographOverspeedSignal:
806
- parsedData[ix + 29] !== '' ? (parsedData[ix + 29] === '1') : null,
812
+ parsedData[ix + 29] ? (parsedData[ix + 29] === '1') : null,
807
813
  tachographVehicleMotionSignal:
808
- parsedData[ix + 30] !== '' ? (parsedData[ix + 30] === '1') : null,
814
+ parsedData[ix + 30] ? (parsedData[ix + 30] === '1') : null,
809
815
  tachographDrivingDirection:
810
- parsedData[ix + 31] !== '' ? parseCanData(parsedData[ix + 31], 'tachographDrivingDirection') : null,
816
+ parsedData[ix + 31] ? parseCanData(parsedData[ix + 31], 'tachographDrivingDirection') : null,
811
817
  analogInputValue:
812
- parsedData[ix + 32] !== '' ? parseFloat(parsedData[ix + 32]) * 1000 : null,
818
+ parsedData[ix + 32] ? parseFloat(parsedData[ix + 32]) * 1000 : null,
813
819
  engineBrakingFactor:
814
- parsedData[ix + 33] !== '' ? parseInt(parsedData[ix + 33]) : null,
820
+ parsedData[ix + 33] ? parseInt(parsedData[ix + 33]) : null,
815
821
  pedalBrakingFactor:
816
- parsedData[ix + 34] !== '' ? parseInt(parsedData[ix + 34]) : null,
822
+ parsedData[ix + 34] ? parseInt(parsedData[ix + 34]) : null,
817
823
  totalAcceleratorKickDown:
818
- parsedData[ix + 35] !== '' ? parseInt(parsedData[ix + 35]) : null,
824
+ parsedData[ix + 35] ? parseInt(parsedData[ix + 35]) : null,
819
825
  totalEffectiveEngineSpeedTime:
820
- parsedData[ix + 36] !== '' ? parseFloat(parsedData[ix + 36]) : null,
826
+ parsedData[ix + 36] ? parseFloat(parsedData[ix + 36]) : null,
821
827
  totalCruiseControlTime:
822
- parsedData[ix + 37] !== '' ? parseFloat(parsedData[ix + 37]) : null,
828
+ parsedData[ix + 37] ? parseFloat(parsedData[ix + 37]) : null,
823
829
  totalAcceleratorKickDownTime:
824
- parsedData[ix + 38] !== '' ? parseFloat(parsedData[ix + 38]) : null,
830
+ parsedData[ix + 38] ? parseFloat(parsedData[ix + 38]) : null,
825
831
  totalBrakeApplications:
826
- parsedData[ix + 39] !== '' ? parseInt(parsedData[ix + 39]) : null,
827
- tachographDriver1Card: parsedData[ix + 40] !== '' ? parsedData[ix + 40] : null,
828
- tachographDriver2Card: parsedData[ix + 41] !== '' ? parsedData[ix + 41] : null,
829
- tachographDriver1Name: parsedData[ix + 42] !== '' ? parsedData[ix + 42] : null,
830
- tachographDriver2Name: parsedData[ix + 43] !== '' ? parsedData[ix + 43] : null,
831
- registrationNumber: parsedData[ix + 44] !== '' ? parsedData[ix + 44] : null,
832
+ parsedData[ix + 39] ? parseInt(parsedData[ix + 39]) : null,
833
+ tachographDriver1Card: parsedData[ix + 40] ? parsedData[ix + 40] : null,
834
+ tachographDriver2Card: parsedData[ix + 41] ? parsedData[ix + 41] : null,
835
+ tachographDriver1Name: parsedData[ix + 42] ? parsedData[ix + 42] : null,
836
+ tachographDriver2Name: parsedData[ix + 43] ? parsedData[ix + 43] : null,
837
+ registrationNumber: parsedData[ix + 44] ? parsedData[ix + 44] : null,
832
838
  expansionInformation: {
833
- raw: parsedData[ix + 45] !== '' ? parsedData[ix + 45] : null,
839
+ raw: parsedData[ix + 45] ? parsedData[ix + 45] : null,
834
840
  webasto: expansionBin ? expansionBin[0] === '1' : null,
835
841
  brakeFluidLowIndicator: expansionBin
836
842
  ? expansionBin[1] === '1'
@@ -852,9 +858,9 @@ const getCanData = (parsedData, ix) => {
852
858
  : null,
853
859
  oilLevelLowIndicator: expansionBin ? expansionBin[12] === '1' : null
854
860
  },
855
- rapidBrakings: parsedData[ix + 46] !== '' ? parseInt(parsedData[ix + 46]) : null,
856
- rapidAccelerations: parsedData[ix + 47] !== '' ? parseInt(parsedData[ix + 47]) : null,
857
- engineTorque: parsedData[ix + 48] !== '' ? parseFloat(parsedData[ix + 48]) : null,
861
+ rapidBrakings: parsedData[ix + 46] ? parseInt(parsedData[ix + 46]) : null,
862
+ rapidAccelerations: parsedData[ix + 47] ? parseInt(parsedData[ix + 47]) : null,
863
+ engineTorque: parsedData[ix + 48] ? parseFloat(parsedData[ix + 48]) : null,
858
864
  }
859
865
  }
860
866
  }