From d20100ff1833e588be60547ab2960a9dfc57d4a3 Mon Sep 17 00:00:00 2001 From: Frederico Minuzzi Date: Fri, 10 Jan 2025 09:20:23 -0300 Subject: [PATCH 1/4] actility variables --- .../lorawan-actility/v1.0.0/payload.js | 87 +++++++++++++------ .../lorawan-actility/v1.0.0/payload.test.ts | 32 +++++++ 2 files changed, 91 insertions(+), 28 deletions(-) create mode 100644 decoders/network/lorawan-actility/v1.0.0/payload.test.ts diff --git a/decoders/network/lorawan-actility/v1.0.0/payload.js b/decoders/network/lorawan-actility/v1.0.0/payload.js index 96a4fe8c..84ba77ba 100644 --- a/decoders/network/lorawan-actility/v1.0.0/payload.js +++ b/decoders/network/lorawan-actility/v1.0.0/payload.js @@ -1,18 +1,25 @@ /* This is an example code for TTN Parser. -** TTN send several parameters to TagoIO. The job of this parse is to convert all these parameters into a TagoIO format. -** One of these parameters is the payload of your device. We find it too and apply the appropriate sensor parse. -** -** IMPORTANT: In most case, you will only need to edit the parsePayload function. -** -** Testing: -** You can do manual tests to this parse by using the Device Emulator. Copy and Paste the following code: -** [{ "variable": "ttn_payload", "value": "{ \"payload_raw\": \"0109611395\" }" }] -** -** The ignore_vars variable in this code should be used to ignore variables -** from the device that you don't want. -*/ + ** TTN send several parameters to TagoIO. The job of this parse is to convert all these parameters into a TagoIO format. + ** One of these parameters is the payload of your device. We find it too and apply the appropriate sensor parse. + ** + ** IMPORTANT: In most case, you will only need to edit the parsePayload function. + ** + ** Testing: + ** You can do manual tests to this parse by using the Device Emulator. Copy and Paste the following code: + ** [{ "variable": "ttn_payload", "value": "{ \"payload_raw\": \"0109611395\" }" }] + ** + ** The ignore_vars variable in this code should be used to ignore variables + ** from the device that you don't want. + */ // Add ignorable variables in this array. -const ignore_vars = ['rf_chain', 'channel', 'modulation', 'app_id', 'time', 'gtw_trusted']; +const ignore_vars = [ + "rf_chain", + "channel", + "modulation", + "app_id", + "time", + "gtw_trusted", +]; /** * Convert an object to TagoIO object format. @@ -24,12 +31,12 @@ const ignore_vars = ['rf_chain', 'channel', 'modulation', 'app_id', 'time', 'gtw * @param {String} serie Serie for the variables * @param {String} prefix Add a prefix to the variables name */ -function toTagoFormat(object_item, serie, prefix = '') { +function toTagoFormat(object_item, serie, prefix = "") { const result = []; for (const key in object_item) { if (ignore_vars.includes(key) || object_item[key] === null) continue; - if (typeof object_item[key] === 'object') { + if (typeof object_item[key] === "object") { result.push({ variable: object_item[key].variable || `${prefix}${key}`, value: object_item[key].value, @@ -51,7 +58,7 @@ function toTagoFormat(object_item, serie, prefix = '') { } // Just convert lat and lng, or latitude and longitude to TagoIO format. -function transformLatLngToLocation(fields, serie, prefix = '') { +function transformLatLngToLocation(fields, serie, prefix = "") { if ((fields.latitude && fields.longitude) || (fields.lat && fields.lng)) { const lat = fields.lat || fields.latitude; const lng = fields.lng || fields.longitude; @@ -77,20 +84,22 @@ function transformLatLngToLocation(fields, serie, prefix = '') { function inspectFormat(object_item, serie, old_key) { let result = []; for (const key in object_item) { - if (key === 'lng'.toLowerCase() || key.toLowerCase() === 'longitude') continue; - else if (key === 'lat'.toLowerCase() || key.toLowerCase() === 'latitude') { - const lng = object_item.lng || object_item.longitude || object_item.Longitude; + if (key === "lng".toLowerCase() || key.toLowerCase() === "longitude") + continue; + else if (key === "lat".toLowerCase() || key.toLowerCase() === "latitude") { + const lng = + object_item.lng || object_item.longitude || object_item.Longitude; result.push({ - variable: old_key ? `${old_key}_location` : 'location', + variable: old_key ? `${old_key}_location` : "location", value: `${object_item[key]}, ${lng}`, location: { lat: Number(object_item[key]), lng: Number(lng) }, serie, }); - } else if (typeof object_item[key] === 'object') { + } else if (typeof object_item[key] === "object") { result = result.concat(inspectFormat(object_item[key], serie, key)); } else { result.push({ - variable: old_key ? `${old_key}_${key}` :`${key}`, + variable: old_key ? `${old_key}_${key}` : `${key}`, value: object_item[key], serie, }); @@ -103,7 +112,7 @@ function inspectFormat(object_item, serie, old_key) { // Check if what is being stored is the ttn_payload. // Payload is an environment variable. Is where what is being inserted to your device comes in. // Payload always is an array of objects. [ { variable, value...}, {variable, value...} ...] -let ttn_payload = payload.find(x => x.variable === 'actility_payload'); +let ttn_payload = payload.find((x) => x.variable === "actility_payload"); if (ttn_payload) { // Get a unique serie for the incoming data. const serie = String(ttn_payload.serie || new Date().getTime()); @@ -116,11 +125,32 @@ if (ttn_payload) { delete ttn_payload.payload_hex; } + if (ttn_payload.rawPosition.floor_number) { + ttn_payload.floor_number = { + variable: "floor_number", + value: ttn_payload.rawPosition.floor_number, + }; + } + + if (ttn_payload.rawPosition.room_name) { + ttn_payload.room_name = { + variable: "room_name", + value: ttn_payload.rawPosition.room_name, + }; + + delete ttn_payload.resolvedTrackerParameters; + delete ttn_payload.rawPosition; + delete ttn_payload.uplinkPayload; + delete ttn_payload.processedFeed; + delete ttn_payload.coordinates; + delete ttn_payload.resolvedTracker; + } + if (ttn_payload.DevLAT && ttn_payload.DevLON) { - ttn_payload.location = { - variable: "location", + ttn_payload.location = { + variable: "location", value: `${ttn_payload.DevLAT},${ttn_payload.DevLON}`, - location: { lat: ttn_payload.DevLAT, lng: ttn_payload.DevLON } + location: { lat: ttn_payload.DevLAT, lng: ttn_payload.DevLON }, }; delete ttn_payload.DevLAT; delete ttn_payload.DevLON; @@ -134,8 +164,9 @@ if (ttn_payload) { delete ttn_payload.DynamicClass; delete ttn_payload.InstantPER; delete ttn_payload.MeanPER; + payload = toTagoFormat(ttn_payload, serie); if (ttn_payload.Time) { - payload = payload.map(x => ({ ...x, time: ttn_payload.Time })); + payload = payload.map((x) => ({ ...x, time: ttn_payload.Time })); } -} \ No newline at end of file +} diff --git a/decoders/network/lorawan-actility/v1.0.0/payload.test.ts b/decoders/network/lorawan-actility/v1.0.0/payload.test.ts new file mode 100644 index 00000000..5a002dfe --- /dev/null +++ b/decoders/network/lorawan-actility/v1.0.0/payload.test.ts @@ -0,0 +1,32 @@ +import { readFileSync } from "fs"; +import { join } from "path"; +import * as ts from "typescript"; +import { beforeEach, describe, expect, test } from "vitest"; + +import { DataToSend } from "@tago-io/sdk/lib/types"; + +const file = readFileSync(join(__dirname, "./payload.js")); +const transpiledCode = ts.transpile(file.toString()); + +let payload: DataToSend[] = []; + +describe("New Actility Payload Validation", () => { + beforeEach(() => { + payload = [ + { + variable: "actility_payload", + value: + '{"deviceEUI":"1122334455667738","time":"2022-09-07T03:33:27.249Z","customerId":"100009247","modelCfg":"0","dxProfileId":"community-api","coordinates":[103.89371486839646,1.3179848438126165,0],"age":0,"validityState":"NEW","horizontalAccuracy":0,"incomingSubscriberId":"100009247","processedFeed":{"SF":7,"deviceProfileId":"ABEEWAY/MICRO","payloadEncoded":"03485c84aa01abcd04303136c8abcd04303135c5abcd04303132c3","sequenceNumber":33308,"receptionTime":"2022-09-07T03:33:27.249Z","dynamicMotionState":"STATIC","temperatureMeasure":22.77647,"processedPacket":{"SNR":11.75,"RSSI":-36,"baseStationId":"10000708","antennaCoordinates":[103.89371486839646,1.3179848438126165]},"port":18},"rawPosition":{"rawPositionType":"RawPositionByBleSolver","coordinates":[103.89371464580393,1.3179839628913457],"age":8,"horizontalAccuracy":2,"bssidCount":3,"beaconIdData":[{"rssi":-56,"beaconId":"AB-CD-04-30-31-36"},{"rssi":-59,"beaconId":"AB-CD-04-30-31-35"},{"rssi":-61,"beaconId":"AB-CD-04-30-31-32"}],"beaconFormat":"BEACON_ID","floor_number":4,"room_name":"443"},"resolvedTracker":{"firmwareVersion":"2.3.1","bleFirmwareVersion":"3.3.3","messageType":"POSITION_MESSAGE","eventType":"UNKNOWN","shutdownCause":"UNKNOWN","trackingMode":"PERMANENT_TRACKING","gpsScanMode":"STANDARD","sensorMode":"UNKNOWN","periodicPositionInterval":3600,"batteryLevel":92,"batteryStatus":"OPERATING","sosFlag":false,"activityCount":-1,"trackingUlPeriod":16,"loralivePeriod":600,"energyStatusPeriod":0,"geolocSensorProfile":"BGPS_ONLY","oneshotGeolocMethod":"GPS","extAntennaProfile":"PRINTED","motionStartEndNbTx":1,"gpsTimeout":240,"xgpsTimeout":45,"gpsEHPE":1,"gpsConvergence":12,"configFlags":{"framePendingMechanism":true,"buttonPressToTurnDeviceOff":true,"doubleClickIsSosModeOrAlert":true,"downlinkSetParameterConfirmation":true,"wifiPayloadWithNoCypher":true,"bleAdvertisingAtStart":true,"selectWifiScanOrGeolocStartMessage":false,"ledBlinkWithGpsFix":false,"startMotionEventUplink":false,"endMotionEventUplink":false,"otaJoinWhenLeavingModeOff":false,"rejectAsymmetricBlePairing":false,"enableLongWifiPayload":false,"collectionLongReport":false,"autoStart":false},"transmitStrat":"CUSTOM_STRATEGY","bleBeaconCount":4,"bleBeaconTimeout":2,"gpsStandbyTimeout":28800,"confirmedUlBitmap":0,"confirmedUlRetry":3,"motionSensitivity":1,"shockDetection":0,"periodicActivityPeriod":0,"motionDuration":180,"bleRssiFilter":-85,"temperatureHigh":255,"temperatureLow":255,"temperatureAction":"NO_ACTION","bleBond":"UNKNOWN","transmitStratCustom":{"ADREnabled":false,"transmissionType":"SINGLE","firstTransmissionDatarateDistribution":"RANDOM","secondTransmissionDatarateDistribution":"RANDOM","firstTransmissionDatarate":{"dr0":false,"dr1":false,"dr2":true,"dr3":false,"dr4":false,"dr5":false,"dr6":false,"dr7":false},"secondTransmissionDatarate":{"dr0":false,"dr1":false,"dr2":false,"dr3":false,"dr4":false,"dr5":false,"dr6":false,"dr7":false}},"batteryCapacity":4294967295,"reedSwitchConfiguration":"DISABLE_REED_SWITCH","collectionScanType":"NO_COLLECTION_SCAN","collectionBLEFilterType":"NO_FILTER","collectionBLEFilterMain1":0,"collectionBLEFilterMain2":0,"collectionBLEFilterSecValue":0,"collectionBLEFilterSecMask":0,"collectionNbEntry":20,"networkTimeoutCheck":432000,"networkTimeoutReset":172800,"gnssConstellation":"GPS_GLONASS_GALILEO"},"uplinkPayload":{"messageType":"POSITION_MESSAGE","age":8,"trackingMode":"PERMANENT_TRACKING","batteryLevel":92,"batteryStatus":"OPERATING","ackToken":10,"rawPositionType":"BLE_BEACON_SCAN_SHORT_ID","periodicPosition":false,"temperatureMeasure":22.8,"sosFlag":0,"appState":1,"dynamicMotionState":"STATIC","onDemand":false,"payload":"03485c84aa01abcd04303136c8abcd04303135c5abcd04303132c3","deviceConfiguration":{"mode":"PERMANENT_TRACKING"},"bleBeaconIds":[{"beaconId":"ab-cd-04-30-31-36","rssi":-56},{"beaconId":"ab-cd-04-30-31-35","rssi":-59},{"beaconId":"ab-cd-04-30-31-32","rssi":-61}]},"resolvedTrackerParameters":{"mode":"PERMANENT_TRACKING","defaultProfile":"UNKNOWN","dynamicProfile":"Unknown","geolocSensorProfile":"BGPS_ONLY","oneshotGeolocMethod":"GPS","extAntennaProfile":"PRINTED","motionStartEndNbTx":1,"gpsTimeout":240,"configFlags":{"framePendingMechanism":true,"buttonPressToTurnDeviceOff":true,"doubleClickIsSosModeOrAlert":true,"downlinkSetParameterConfirmation":true,"wifiPayloadWithNoCypher":true,"bleAdvertisingAtStart":true,"selectWifiScanOrGeolocStartMessage":false,"ledBlinkWithGpsFix":false,"startMotionEventUplink":false,"endMotionEventUplink":false,"otaJoinWhenLeavingModeOff":false,"rejectAsymmetricBlePairing":false,"enableLongWifiPayload":false,"collectionLongReport":false,"autoStart":false},"firmwareVersion":"2.3.1","bleFirmwareVersion":"3.3.3","loralivePeriod":600,"periodicPositionInterval":3600,"trackingUlPeriod":16,"transmitStrat":"CUSTOM_STRATEGY","transmitStratCustom":{"adrEnabled":0,"transmissionType":"SINGLE","firstTransmissionDatarateDistribution":"RANDOM","secondTransmissionDatarateDistribution":"RANDOM","firstTransmissionDatarate":{"dr0":0,"dr1":0,"dr2":1,"dr3":0,"dr4":0,"dr5":0,"dr6":0,"dr7":0},"secondTransmissionDatarate":{"dr0":0,"dr1":0,"dr2":0,"dr3":0,"dr4":0,"dr5":0,"dr6":0,"dr7":0}},"energyStatusPeriod":0,"gpsScanMode":0,"xgpsTimeout":45,"gpsEhpe":1,"gpsConvergence":12,"bleBeaconCount":4,"bleBeaconTimeout":2,"gpsStandbyTimeout":28800,"confirmedUplink":{"framePending":false,"position":false,"energyStatus":false,"healthStatus":false,"heartbeat":false,"activityStatus":false,"configuration":false,"shockDetection":false,"shutdown":false,"event":false,"scanCollection":false,"extendedPosition":false,"debug":false,"confirmedUlBitmap":0,"confirmedUlRetry":3},"motionSensitivity":1,"shockDetection":0,"periodicActivityPeriod":0,"motionDuration":180,"geofencingScanPeriod":0,"geofencingCollectPeriod":60,"bleRssiFilter":-85,"temperatureHigh":255,"temperatureLow":255,"temperatureAction":"NO_ACTION","networkTimeoutCheck":432000,"networkTimeoutReset":172800,"collectionScanType":"NO_COLLECTION_SCAN","collectionNbEntry":20,"batteryCapacity":4294967295,"reedSwitchConfiguration":"DISABLE_REED_SWITCH","gnssConstellation":"GPS_GLONASS_GALILEO","proximityMinimumScanPower":-90,"proximityDistanceCoefficient":200,"proximityScanFrequency":1800,"proximityBacktraceMaximumAge":256,"proximityDistanceSlidingWindow":30,"proximityExposure50":200,"proximityExposure100":50,"proximityExposure150":22,"proximityExposure200":13,"proximityExposure250":0,"proximityExposure300":0,"proximityExposure400":0,"proximityImmediateAlarmDistance":0.1,"proximityAlarmExposure":12000,"proximityImmediateWarningDistance":1,"proximityWarningExposure":6000,"proximityImmediateRecordDistance":2,"proximityRecordExposure":3700,"proximityAlarmBuzzerDuration":5,"proximityWarningBuzzerDuration":5,"proximityContactPolicy":{"enable":false,"store":false,"uplink":false},"proximityScanDuration":1,"proximityScanWindow":120,"proximityScanInterval":125,"proximityAlarmRemanence":30,"proximityWarningRemanence":30,"proximityBeaconRepeat":100,"proximityBeaconTxPower":-41,"proximityReminderPeriod":20,"proximityReminderDistance":2,"proximityWarningDisableDistance":2.5,"proximityAlarmDisableDistance":2.5,"proximityMaxSpeedFilter":1.5,"proximityMaxUpdate":3600,"bleFilterType":"EDDYSTONE_UID","bleFilterMain1":0,"bleFilterMain2":0,"bleFilterSecValue":0,"bleFilterSecMask":0,"bleFilterReportType":"SHORT_ID","buzzerVolume":10,"angleDetectionMode":"DISABLED","angleReferenceAcquisition":"AUTOMATIC","angleReferenceAccelerationX":0,"angleReferenceAccelerationY":0,"angleReferenceAccelerationZ":0,"angleCritical":30,"angleCriticalHysteresis":5,"angleReportingMode":{"normalToCritical":true,"criticalToNormal":false,"learningToNormal":false,"normalToLearning":false,"criticalToLearning":false},"angleReportingPeriod":300,"angleReportingRepeat":0,"angleRisingTime":5,"angleFallingTime":5,"angleLearningTime":5,"angleAccelerationAccuracy":100,"angleDeviationDelta":0,"angleDeviationMinInterval":10,"angleDeviationMaxInterval":0,"passwordCommandLineInterface":123,"gpsT0Timeout":30,"gpsFixTimeout":0,"geofencingScanDuration":370,"beaconingType":"DISABLED","beaconingTxPower":"0_DBM","beaconingStaticInterval":10000,"beaconingMotionInterval":333,"beaconingMotionDuration":20,"bleConnectivityAdvertisingDuration":600,"beaconId0":0,"beaconId1":0,"beaconId2":0,"beaconId3":0,"beaconId4":0,"sosPeriod":120,"motionDebounce":1,"buttonMapping":{"buttonPress":"NO_ACTION","oneButtonClick":"BATTERY_LEVEL_WITH_LED","twoButtonClick":"WHITELIST_WITH_PROXIMITY","threeButtonClick":"START_STOP_SOS","buttonPressDuration":1},"defaultDatarate":2,"unknown":2,"confirmedUlBitmap":0,"confirmedUlRetry":3,"periodicPositionPeriod":3600,"gpsScanProfile":0,"collectionBLEFilterType":"NO_FILTER","collectionBLEFilterMain1":0,"collectionBLEFilterMain2":0,"collectionBLEFilterSecValue":0,"collectionBLEFilterSecMask":0},"messageSource":"LORA"}', + group: "1736351397906", + }, + ]; + }); + + test("Check all output variables for location tracking", () => { + eval(transpiledCode); // This runs the code and sets the payload variable + + expect(payload).toEqual( + expect.arrayContaining([expect.objectContaining({ variable: "floor_number", value: 4 }), expect.objectContaining({ variable: "room_name", value: "443" })]) + ); + }); +}); From b3be5f6c371841c34d6aa37163cee4393c16107f Mon Sep 17 00:00:00 2001 From: Frederico Minuzzi Date: Fri, 10 Jan 2025 09:41:53 -0300 Subject: [PATCH 2/4] Refactor payload.js to use optional chaining --- decoders/network/lorawan-actility/v1.0.0/payload.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/decoders/network/lorawan-actility/v1.0.0/payload.js b/decoders/network/lorawan-actility/v1.0.0/payload.js index 84ba77ba..9cbeedd6 100644 --- a/decoders/network/lorawan-actility/v1.0.0/payload.js +++ b/decoders/network/lorawan-actility/v1.0.0/payload.js @@ -125,14 +125,14 @@ if (ttn_payload) { delete ttn_payload.payload_hex; } - if (ttn_payload.rawPosition.floor_number) { + if (ttn_payload.rawPosition?.floor_number) { ttn_payload.floor_number = { variable: "floor_number", value: ttn_payload.rawPosition.floor_number, }; } - if (ttn_payload.rawPosition.room_name) { + if (ttn_payload.rawPosition?.room_name) { ttn_payload.room_name = { variable: "room_name", value: ttn_payload.rawPosition.room_name, From 63cf4d2f477e5041e4d5b77820bf20b368291805 Mon Sep 17 00:00:00 2001 From: Frederico Minuzzi Date: Tue, 14 Jan 2025 09:00:04 -0300 Subject: [PATCH 3/4] Adding test for previously working payload too. --- .../lorawan-actility/v1.0.0/payload.test.ts | 64 +++++++++++++++++-- 1 file changed, 60 insertions(+), 4 deletions(-) diff --git a/decoders/network/lorawan-actility/v1.0.0/payload.test.ts b/decoders/network/lorawan-actility/v1.0.0/payload.test.ts index 5a002dfe..c0611ea1 100644 --- a/decoders/network/lorawan-actility/v1.0.0/payload.test.ts +++ b/decoders/network/lorawan-actility/v1.0.0/payload.test.ts @@ -1,3 +1,4 @@ +import exp from "constants"; import { readFileSync } from "fs"; import { join } from "path"; import * as ts from "typescript"; @@ -10,14 +11,14 @@ const transpiledCode = ts.transpile(file.toString()); let payload: DataToSend[] = []; -describe("New Actility Payload Validation", () => { +describe("Uplink 2 Actility Payload Validation", () => { beforeEach(() => { payload = [ { variable: "actility_payload", value: - '{"deviceEUI":"1122334455667738","time":"2022-09-07T03:33:27.249Z","customerId":"100009247","modelCfg":"0","dxProfileId":"community-api","coordinates":[103.89371486839646,1.3179848438126165,0],"age":0,"validityState":"NEW","horizontalAccuracy":0,"incomingSubscriberId":"100009247","processedFeed":{"SF":7,"deviceProfileId":"ABEEWAY/MICRO","payloadEncoded":"03485c84aa01abcd04303136c8abcd04303135c5abcd04303132c3","sequenceNumber":33308,"receptionTime":"2022-09-07T03:33:27.249Z","dynamicMotionState":"STATIC","temperatureMeasure":22.77647,"processedPacket":{"SNR":11.75,"RSSI":-36,"baseStationId":"10000708","antennaCoordinates":[103.89371486839646,1.3179848438126165]},"port":18},"rawPosition":{"rawPositionType":"RawPositionByBleSolver","coordinates":[103.89371464580393,1.3179839628913457],"age":8,"horizontalAccuracy":2,"bssidCount":3,"beaconIdData":[{"rssi":-56,"beaconId":"AB-CD-04-30-31-36"},{"rssi":-59,"beaconId":"AB-CD-04-30-31-35"},{"rssi":-61,"beaconId":"AB-CD-04-30-31-32"}],"beaconFormat":"BEACON_ID","floor_number":4,"room_name":"443"},"resolvedTracker":{"firmwareVersion":"2.3.1","bleFirmwareVersion":"3.3.3","messageType":"POSITION_MESSAGE","eventType":"UNKNOWN","shutdownCause":"UNKNOWN","trackingMode":"PERMANENT_TRACKING","gpsScanMode":"STANDARD","sensorMode":"UNKNOWN","periodicPositionInterval":3600,"batteryLevel":92,"batteryStatus":"OPERATING","sosFlag":false,"activityCount":-1,"trackingUlPeriod":16,"loralivePeriod":600,"energyStatusPeriod":0,"geolocSensorProfile":"BGPS_ONLY","oneshotGeolocMethod":"GPS","extAntennaProfile":"PRINTED","motionStartEndNbTx":1,"gpsTimeout":240,"xgpsTimeout":45,"gpsEHPE":1,"gpsConvergence":12,"configFlags":{"framePendingMechanism":true,"buttonPressToTurnDeviceOff":true,"doubleClickIsSosModeOrAlert":true,"downlinkSetParameterConfirmation":true,"wifiPayloadWithNoCypher":true,"bleAdvertisingAtStart":true,"selectWifiScanOrGeolocStartMessage":false,"ledBlinkWithGpsFix":false,"startMotionEventUplink":false,"endMotionEventUplink":false,"otaJoinWhenLeavingModeOff":false,"rejectAsymmetricBlePairing":false,"enableLongWifiPayload":false,"collectionLongReport":false,"autoStart":false},"transmitStrat":"CUSTOM_STRATEGY","bleBeaconCount":4,"bleBeaconTimeout":2,"gpsStandbyTimeout":28800,"confirmedUlBitmap":0,"confirmedUlRetry":3,"motionSensitivity":1,"shockDetection":0,"periodicActivityPeriod":0,"motionDuration":180,"bleRssiFilter":-85,"temperatureHigh":255,"temperatureLow":255,"temperatureAction":"NO_ACTION","bleBond":"UNKNOWN","transmitStratCustom":{"ADREnabled":false,"transmissionType":"SINGLE","firstTransmissionDatarateDistribution":"RANDOM","secondTransmissionDatarateDistribution":"RANDOM","firstTransmissionDatarate":{"dr0":false,"dr1":false,"dr2":true,"dr3":false,"dr4":false,"dr5":false,"dr6":false,"dr7":false},"secondTransmissionDatarate":{"dr0":false,"dr1":false,"dr2":false,"dr3":false,"dr4":false,"dr5":false,"dr6":false,"dr7":false}},"batteryCapacity":4294967295,"reedSwitchConfiguration":"DISABLE_REED_SWITCH","collectionScanType":"NO_COLLECTION_SCAN","collectionBLEFilterType":"NO_FILTER","collectionBLEFilterMain1":0,"collectionBLEFilterMain2":0,"collectionBLEFilterSecValue":0,"collectionBLEFilterSecMask":0,"collectionNbEntry":20,"networkTimeoutCheck":432000,"networkTimeoutReset":172800,"gnssConstellation":"GPS_GLONASS_GALILEO"},"uplinkPayload":{"messageType":"POSITION_MESSAGE","age":8,"trackingMode":"PERMANENT_TRACKING","batteryLevel":92,"batteryStatus":"OPERATING","ackToken":10,"rawPositionType":"BLE_BEACON_SCAN_SHORT_ID","periodicPosition":false,"temperatureMeasure":22.8,"sosFlag":0,"appState":1,"dynamicMotionState":"STATIC","onDemand":false,"payload":"03485c84aa01abcd04303136c8abcd04303135c5abcd04303132c3","deviceConfiguration":{"mode":"PERMANENT_TRACKING"},"bleBeaconIds":[{"beaconId":"ab-cd-04-30-31-36","rssi":-56},{"beaconId":"ab-cd-04-30-31-35","rssi":-59},{"beaconId":"ab-cd-04-30-31-32","rssi":-61}]},"resolvedTrackerParameters":{"mode":"PERMANENT_TRACKING","defaultProfile":"UNKNOWN","dynamicProfile":"Unknown","geolocSensorProfile":"BGPS_ONLY","oneshotGeolocMethod":"GPS","extAntennaProfile":"PRINTED","motionStartEndNbTx":1,"gpsTimeout":240,"configFlags":{"framePendingMechanism":true,"buttonPressToTurnDeviceOff":true,"doubleClickIsSosModeOrAlert":true,"downlinkSetParameterConfirmation":true,"wifiPayloadWithNoCypher":true,"bleAdvertisingAtStart":true,"selectWifiScanOrGeolocStartMessage":false,"ledBlinkWithGpsFix":false,"startMotionEventUplink":false,"endMotionEventUplink":false,"otaJoinWhenLeavingModeOff":false,"rejectAsymmetricBlePairing":false,"enableLongWifiPayload":false,"collectionLongReport":false,"autoStart":false},"firmwareVersion":"2.3.1","bleFirmwareVersion":"3.3.3","loralivePeriod":600,"periodicPositionInterval":3600,"trackingUlPeriod":16,"transmitStrat":"CUSTOM_STRATEGY","transmitStratCustom":{"adrEnabled":0,"transmissionType":"SINGLE","firstTransmissionDatarateDistribution":"RANDOM","secondTransmissionDatarateDistribution":"RANDOM","firstTransmissionDatarate":{"dr0":0,"dr1":0,"dr2":1,"dr3":0,"dr4":0,"dr5":0,"dr6":0,"dr7":0},"secondTransmissionDatarate":{"dr0":0,"dr1":0,"dr2":0,"dr3":0,"dr4":0,"dr5":0,"dr6":0,"dr7":0}},"energyStatusPeriod":0,"gpsScanMode":0,"xgpsTimeout":45,"gpsEhpe":1,"gpsConvergence":12,"bleBeaconCount":4,"bleBeaconTimeout":2,"gpsStandbyTimeout":28800,"confirmedUplink":{"framePending":false,"position":false,"energyStatus":false,"healthStatus":false,"heartbeat":false,"activityStatus":false,"configuration":false,"shockDetection":false,"shutdown":false,"event":false,"scanCollection":false,"extendedPosition":false,"debug":false,"confirmedUlBitmap":0,"confirmedUlRetry":3},"motionSensitivity":1,"shockDetection":0,"periodicActivityPeriod":0,"motionDuration":180,"geofencingScanPeriod":0,"geofencingCollectPeriod":60,"bleRssiFilter":-85,"temperatureHigh":255,"temperatureLow":255,"temperatureAction":"NO_ACTION","networkTimeoutCheck":432000,"networkTimeoutReset":172800,"collectionScanType":"NO_COLLECTION_SCAN","collectionNbEntry":20,"batteryCapacity":4294967295,"reedSwitchConfiguration":"DISABLE_REED_SWITCH","gnssConstellation":"GPS_GLONASS_GALILEO","proximityMinimumScanPower":-90,"proximityDistanceCoefficient":200,"proximityScanFrequency":1800,"proximityBacktraceMaximumAge":256,"proximityDistanceSlidingWindow":30,"proximityExposure50":200,"proximityExposure100":50,"proximityExposure150":22,"proximityExposure200":13,"proximityExposure250":0,"proximityExposure300":0,"proximityExposure400":0,"proximityImmediateAlarmDistance":0.1,"proximityAlarmExposure":12000,"proximityImmediateWarningDistance":1,"proximityWarningExposure":6000,"proximityImmediateRecordDistance":2,"proximityRecordExposure":3700,"proximityAlarmBuzzerDuration":5,"proximityWarningBuzzerDuration":5,"proximityContactPolicy":{"enable":false,"store":false,"uplink":false},"proximityScanDuration":1,"proximityScanWindow":120,"proximityScanInterval":125,"proximityAlarmRemanence":30,"proximityWarningRemanence":30,"proximityBeaconRepeat":100,"proximityBeaconTxPower":-41,"proximityReminderPeriod":20,"proximityReminderDistance":2,"proximityWarningDisableDistance":2.5,"proximityAlarmDisableDistance":2.5,"proximityMaxSpeedFilter":1.5,"proximityMaxUpdate":3600,"bleFilterType":"EDDYSTONE_UID","bleFilterMain1":0,"bleFilterMain2":0,"bleFilterSecValue":0,"bleFilterSecMask":0,"bleFilterReportType":"SHORT_ID","buzzerVolume":10,"angleDetectionMode":"DISABLED","angleReferenceAcquisition":"AUTOMATIC","angleReferenceAccelerationX":0,"angleReferenceAccelerationY":0,"angleReferenceAccelerationZ":0,"angleCritical":30,"angleCriticalHysteresis":5,"angleReportingMode":{"normalToCritical":true,"criticalToNormal":false,"learningToNormal":false,"normalToLearning":false,"criticalToLearning":false},"angleReportingPeriod":300,"angleReportingRepeat":0,"angleRisingTime":5,"angleFallingTime":5,"angleLearningTime":5,"angleAccelerationAccuracy":100,"angleDeviationDelta":0,"angleDeviationMinInterval":10,"angleDeviationMaxInterval":0,"passwordCommandLineInterface":123,"gpsT0Timeout":30,"gpsFixTimeout":0,"geofencingScanDuration":370,"beaconingType":"DISABLED","beaconingTxPower":"0_DBM","beaconingStaticInterval":10000,"beaconingMotionInterval":333,"beaconingMotionDuration":20,"bleConnectivityAdvertisingDuration":600,"beaconId0":0,"beaconId1":0,"beaconId2":0,"beaconId3":0,"beaconId4":0,"sosPeriod":120,"motionDebounce":1,"buttonMapping":{"buttonPress":"NO_ACTION","oneButtonClick":"BATTERY_LEVEL_WITH_LED","twoButtonClick":"WHITELIST_WITH_PROXIMITY","threeButtonClick":"START_STOP_SOS","buttonPressDuration":1},"defaultDatarate":2,"unknown":2,"confirmedUlBitmap":0,"confirmedUlRetry":3,"periodicPositionPeriod":3600,"gpsScanProfile":0,"collectionBLEFilterType":"NO_FILTER","collectionBLEFilterMain1":0,"collectionBLEFilterMain2":0,"collectionBLEFilterSecValue":0,"collectionBLEFilterSecMask":0},"messageSource":"LORA"}', - group: "1736351397906", + '{"deviceEUI":"20635f039100011e","dxProfileId":"tpe-au1-api","customerId":"1100012666","modelCfg":"1:TPX_226d5d46-f3ae-44c9-8c37-5a8b9b3f21ff","userAccountId":"1100012666","realmId":"tpw-users-actility-tpe-ope","time":"2025-01-13T12:46:30.201000+00:00","coordinates":[103.84844229788555,1.3791139358924838,0],"overwriteCoordinates":true,"age":-1,"validityState":"NEW","horizontalAccuracy":2.618808467085686,"incomingSubscriberId":"1100012666","trackerType":"Micro Tracker V3.1","processedFeed":{"deviceProfileId":"ABEEWAY/MICRO","payloadEncoded":"0e48548daa0011000000004384bf000000004385be000000004388bc0000000051e8bb","sequenceNumber":10448,"receptionTime":"2025-01-13T12:46:30.201000+00:00","SF":7,"dynamicMotionState":"STATIC","temperatureMeasure":27.32941176470588,"processedPacket":{"baseStationId":"10002313","antennaCoordinates":[103.848991,1.378461],"SNR":8,"RSSI":-73.600006},"port":18},"rawPosition":{"rawPositionType":"RawPositionByBleSolver","coordinates":[103.84844149722993,1.379114189651386],"age":17,"horizontalAccuracy":8.333181988320284,"bssidCount":4,"beaconIdData":[{"rssi":-65,"beaconId":"00-00-00-00-43-84"},{"rssi":-66,"beaconId":"00-00-00-00-43-85"},{"rssi":-68,"beaconId":"00-00-00-00-43-88"},{"rssi":-69,"beaconId":"00-00-00-00-51-E8"}],"beaconFormat":"BEACON_ID","floor_number":4,"room_name":"S.439"},"resolvedTracker":{"firmwareVersion":"2.6.0","bleFirmwareVersion":"3.3.5","messageType":"EXTENDED_POSITION_MESSAGE","eventType":"UNKNOWN","shutdownCause":"UNKNOWN","trackingMode":"PERMANENT_TRACKING","dynamicMotionState":"STATIC","temperatureMeasure":27.32941176470588,"gpsScanMode":"UNKNOWN","sensorMode":"UNKNOWN","periodicPositionInterval":-1,"batteryLevel":84,"batteryStatus":"OPERATING","sosFlag":false,"activityCount":-1,"trackingUlPeriod":-1,"loralivePeriod":-1,"energyStatusPeriod":-1,"geolocSensorProfile":"UNKNOWN","oneshotGeolocMethod":"UNKNOWN","extAntennaProfile":"UNKNOWN","motionStartEndNbTx":-1,"gpsTimeout":-1,"xgpsTimeout":-1,"gpsEHPE":-1,"gpsConvergence":-1,"transmitStrat":"UNKNOWN","bleBeaconCount":-1,"bleBeaconTimeout":-1,"gpsStandbyTimeout":-1,"confirmedUlBitmap":-1,"confirmedUlRetry":-1,"motionSensitivity":-1,"shockDetection":-1,"periodicActivityPeriod":-1,"motionDuration":-1,"bleRssiFilter":-1,"temperatureHigh":-1,"temperatureLow":-1,"temperatureAction":"UNKNOWN","bleBond":"UNKNOWN","batteryCapacity":-1,"reedSwitchConfiguration":"UNKNOWN","collectionScanType":"UNKNOWN","collectionBLEFilterType":"UNKNOWN","collectionBLEFilterMain1":-1,"collectionBLEFilterMain2":-1,"collectionBLEFilterSecValue":-1,"collectionBLEFilterSecMask":-1,"collectionNbEntry":-1,"networkTimeoutCheck":-1,"networkTimeoutReset":-1},"uplinkPayload":{"messageType":"EXTENDED_POSITION_MESSAGE","age":17,"trackingMode":"PERMANENT_TRACKING","batteryLevel":84,"batteryStatus":"OPERATING","ackToken":10,"rawPositionType":"BLE_BEACON_SCAN_SHORT_ID","periodicPosition":false,"temperatureMeasure":27.3,"sosFlag":0,"appState":1,"dynamicMotionState":"STATIC","onDemand":false,"payload":"0e48548daa0011000000004384bf000000004385be000000004388bc0000000051e8bb","deviceConfiguration":{"mode":"PERMANENT_TRACKING"},"bleBeaconIds":[{"beaconId":"00-00-00-00-43-84","rssi":-65},{"beaconId":"00-00-00-00-43-85","rssi":-66},{"beaconId":"00-00-00-00-43-88","rssi":-68},{"beaconId":"00-00-00-00-51-e8","rssi":-69}]},"resolvedTrackerParameters":{"mode":"PERMANENT_TRACKING","firmwareVersion":"2.6.0","bleFirmwareVersion":"3.3.5","defaultProfile":"UNKNOWN","dynamicProfile":"Unknown"},"messageSource":"LORA","customerData":{"alr":{"pro":"ABEE/MICR","ver":"1"},"name":"MT 20635F039100011E"},"downlinkUrl":"https://thingparkenterprise.au.actility.com/iot-flow/downlinkMessages/da4466d6-083b-411a-89b8-5b5dde3b0d40"}', + group: "1736772392364", }, ]; }); @@ -26,7 +27,62 @@ describe("New Actility Payload Validation", () => { eval(transpiledCode); // This runs the code and sets the payload variable expect(payload).toEqual( - expect.arrayContaining([expect.objectContaining({ variable: "floor_number", value: 4 }), expect.objectContaining({ variable: "room_name", value: "443" })]) + expect.arrayContaining([expect.objectContaining({ variable: "floor_number", value: 4 }), expect.objectContaining({ variable: "room_name", value: "S.439q" })]) + ); + }); +}); + +describe("Uplink 1 Actility Payload Validation", () => { + beforeEach(() => { + payload = [ + { + variable: "actility_payload", + value: + '{"DevEUI":"20635F039100011E","FCntUp":10448,"FPort":18,"DevAddr":"004880D6","payload_hex":"0e48548daa0011000000004384bf000000004385be000000004388bc0000000051e8bb","FCntDn":209,"Time":"2025-01-13T12:46:30.201+00:00","LostUplinksAS":0,"ADRbit":1,"MType":2,"mic_hex":"294ae1fd","Lrcid":"00000233","LrrRSSI":-73.600006,"LrrSNR":8,"LrrESP":-74.23893,"SpFact":7,"SubBand":"G0","Channel":"LC5","Lrrid":"10002313","Late":0,"LrrLAT":1.378461,"LrrLON":103.848991,"Lrrs":{"Lrr":[{"Lrrid":"10002313","Chain":0,"LrrRSSI":-73.600006,"LrrSNR":8,"LrrESP":-74.23893}]},"DevLrrCnt":1,"CustomerID":"1100012666","CustomerData":{"loc":null,"alr":{"pro":"ABEE/MICR","ver":"1"},"tags":[],"doms":[],"name":"MT 20635F039100011E"},"BaseStationData":{"doms":[],"name":"7076ff-7076FF050E2D"},"ModelCfg":"0:2329,1:TPX_226d5d46-f3ae-44c9-8c37-5a8b9b3f21ff","DriverCfg":{"mod":{"pId":"abeeway","mId":"micro-tracker","ver":"2"},"app":{"pId":"abeeway","mId":"asset-tracker","ver":"2"},"id":"abeeway:asset-tracker:3"},"InstantPER":0,"MeanPER":0,"TxPower":4,"NbTrans":1,"Frequency":922.4,"DynamicClass":"A","payload":{"messageType":"EXTENDED_POSITION_MESSAGE","age":17,"trackingMode":"PERMANENT_TRACKING","batteryLevel":84,"batteryStatus":"OPERATING","ackToken":10,"rawPositionType":"BLE_BEACON_SCAN_SHORT_ID","periodicPosition":false,"temperatureMeasure":27.3,"sosFlag":0,"appState":1,"dynamicMotionState":"STATIC","onDemand":false,"payload":"0e48548daa0011000000004384bf000000004385be000000004388bc0000000051e8bb","deviceConfiguration":{"mode":"PERMANENT_TRACKING"},"bleBeaconIds":[{"beaconId":"00-00-00-00-43-84","rssi":-65},{"beaconId":"00-00-00-00-43-85","rssi":-66},{"beaconId":"00-00-00-00-43-88","rssi":-68},{"beaconId":"00-00-00-00-51-e8","rssi":-69}]},"points":{"batteryLevel":{"unitId":"%","record":84},"temperature":{"unitId":"Cel","record":27.3},"age":{"unitId":"s","record":17}},"downlinkUrl":"https://thingparkenterprise.au.actility.com/iot-flow/downlinkMessages/da4466d6-083b-411a-89b8-5b5dde3b0d40"}', + group: "1736772391524", + time: "2025-01-13T12:46:30.201+00:00", + }, + ]; + }); + + test("Check all output variables for location tracking", () => { + eval(transpiledCode); // This runs the code and sets the payload variable + + expect(payload).toEqual( + expect.arrayContaining([ + expect.objectContaining({ variable: "fcntup", value: 10448 }), + expect.objectContaining({ variable: "fport", value: 18 }), + expect.objectContaining({ variable: "fcntdn", value: 209 }), + expect.objectContaining({ variable: "time", value: "2025-01-13T12:46:30.201+00:00" }), + expect.objectContaining({ variable: "lostuplinksas", value: 0 }), + expect.objectContaining({ variable: "adrbit", value: 1 }), + expect.objectContaining({ variable: "mtype", value: 2 }), + expect.objectContaining({ variable: "mic_hex", value: "294ae1fd" }), + expect.objectContaining({ variable: "lrcid", value: "00000233" }), + expect.objectContaining({ variable: "lrrrssi", value: -73.600006 }), + expect.objectContaining({ variable: "lrrsnr", value: 8 }), + expect.objectContaining({ variable: "lrresp", value: -74.23893 }), + expect.objectContaining({ variable: "spfact", value: 7 }), + expect.objectContaining({ variable: "subband", value: "G0" }), + expect.objectContaining({ variable: "channel", value: "LC5" }), + expect.objectContaining({ variable: "lrrid", value: "10002313" }), + expect.objectContaining({ variable: "late", value: 0 }), + expect.objectContaining({ variable: "lrrlat", value: 1.378461 }), + expect.objectContaining({ variable: "lrrlon", value: 103.848991 }), + expect.objectContaining({ variable: "devlrrcnt", value: 1 }), + expect.objectContaining({ variable: "BaseStationData" }), + expect.objectContaining({ variable: "modelcfg", value: "0:2329,1:TPX_226d5d46-f3ae-44c9-8c37-5a8b9b3f21ff" }), + expect.objectContaining({ variable: "DriverCfg" }), + expect.objectContaining({ variable: "txpower", value: 4 }), + expect.objectContaining({ variable: "nbtrans", value: 1 }), + expect.objectContaining({ variable: "frequency", value: 922.4 }), + expect.objectContaining({ variable: "payload", value: "0e48548daa0011000000004384bf000000004385be000000004388bc0000000051e8bb" }), + expect.objectContaining({ variable: "points" }), + expect.objectContaining({ + variable: "downlinkurl", + value: "https://thingparkenterprise.au.actility.com/iot-flow/downlinkMessages/da4466d6-083b-411a-89b8-5b5dde3b0d40", + }), + ]) ); }); }); From 6a695a48fcd2b3619348fcf6a849df20ea16f69b Mon Sep 17 00:00:00 2001 From: Frederico Minuzzi Date: Tue, 14 Jan 2025 09:06:14 -0300 Subject: [PATCH 4/4] Fix --- .../lorawan-actility/v1.0.0/payload.js | 19 +++++++++++++------ .../lorawan-actility/v1.0.0/payload.test.ts | 3 +-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/decoders/network/lorawan-actility/v1.0.0/payload.js b/decoders/network/lorawan-actility/v1.0.0/payload.js index 9cbeedd6..25ab35ba 100644 --- a/decoders/network/lorawan-actility/v1.0.0/payload.js +++ b/decoders/network/lorawan-actility/v1.0.0/payload.js @@ -19,6 +19,13 @@ const ignore_vars = [ "app_id", "time", "gtw_trusted", + "processedFeed", + "rawPosition", + "coordinates", + "resolvedTracker", + "resolvedTrackerParameters", + "uplinkPayload", + "customerData", ]; /** @@ -138,12 +145,12 @@ if (ttn_payload) { value: ttn_payload.rawPosition.room_name, }; - delete ttn_payload.resolvedTrackerParameters; - delete ttn_payload.rawPosition; - delete ttn_payload.uplinkPayload; - delete ttn_payload.processedFeed; - delete ttn_payload.coordinates; - delete ttn_payload.resolvedTracker; + // delete ttn_payload.resolvedTrackerParameters; + // delete ttn_payload.rawPosition; + // delete ttn_payload.uplinkPayload; + // delete ttn_payload.processedFeed; + // delete ttn_payload.coordinates; + // delete ttn_payload.resolvedTracker; } if (ttn_payload.DevLAT && ttn_payload.DevLON) { diff --git a/decoders/network/lorawan-actility/v1.0.0/payload.test.ts b/decoders/network/lorawan-actility/v1.0.0/payload.test.ts index c0611ea1..6cf95d72 100644 --- a/decoders/network/lorawan-actility/v1.0.0/payload.test.ts +++ b/decoders/network/lorawan-actility/v1.0.0/payload.test.ts @@ -1,4 +1,3 @@ -import exp from "constants"; import { readFileSync } from "fs"; import { join } from "path"; import * as ts from "typescript"; @@ -27,7 +26,7 @@ describe("Uplink 2 Actility Payload Validation", () => { eval(transpiledCode); // This runs the code and sets the payload variable expect(payload).toEqual( - expect.arrayContaining([expect.objectContaining({ variable: "floor_number", value: 4 }), expect.objectContaining({ variable: "room_name", value: "S.439q" })]) + expect.arrayContaining([expect.objectContaining({ variable: "floor_number", value: 4 }), expect.objectContaining({ variable: "room_name", value: "S.439" })]) ); }); });