diff --git a/features/AssetController.feature b/features/AssetController.feature index a62fda8e..b83f8b86 100644 --- a/features/AssetController.feature +++ b/features/AssetController.feature @@ -80,10 +80,11 @@ Feature: DeviceManager asset controller | size | 3 | Then I should receive a "measures" array of objects matching: # there is 6 measures with the 3 from fixtures - | _source.origin.assetId | _source.origin.id | - | "container-FRIDGE-linked" | "DummyMultiTemp-attached_ayse_linked_1" | - | "container-FRIDGE-linked" | "DummyMultiTemp-attached_ayse_linked_1" | - | "container-FRIDGE-linked" | "DummyMultiTemp-attached_ayse_linked_1" | + | _source.asset._id | _source.origin.id | _source.asset._source.model | + | "container-FRIDGE-linked" | "DummyMultiTemp-attached_ayse_linked_1" | "FRIDGE" | + | "container-FRIDGE-linked" | "DummyMultiTemp-attached_ayse_linked_1" | "FRIDGE" | + | "container-FRIDGE-linked" | "DummyMultiTemp-attached_ayse_linked_1" | "FRIDGE" | + Scenario: Register a measures in the asset, an other with different name and an older one and delete one When I successfully execute the action "device-manager/asset":"pushMeasures" with args: diff --git a/features/DeviceController/LinkAsset.feature b/features/DeviceController/LinkAsset.feature index bfcc9c7f..5efa7850 100644 --- a/features/DeviceController/LinkAsset.feature +++ b/features/DeviceController/LinkAsset.feature @@ -57,12 +57,12 @@ Feature: LinkAsset | payloads[0].lvlBattery | 1 | And I refresh the collection "engine-ayse":"assets" Then The document "engine-ayse":"assets":"container-FRIDGE-unlinked_1" content match: - | measures[0].type | "temperature" | - | measures[0].values.temperature | 1 | - | measures[0].deviceMeasureName | "innerTemp" | - | measures[0].assetMeasureName | "coreInnerTemp" | - | measures[0].origin.assetId | "container-FRIDGE-unlinked_1" | - | measures[0].origin.id | "DummyMultiTemp-attached_ayse_unlinked_1" | + | measures[0].type | "temperature" | + | measures[0].values.temperature | 1 | + | measures[0].deviceMeasureName | "innerTemp" | + | measures[0].assetMeasureName | "coreInnerTemp" | + | measures[0].asset._id | "container-FRIDGE-unlinked_1" | + | measures[0].origin.id | "DummyMultiTemp-attached_ayse_unlinked_1" | Scenario: Link device to an asset and enriching the asset with before event When I successfully execute the action "device-manager/device":"linkAsset" with args: diff --git a/features/PayloadController.feature b/features/PayloadController.feature index 42cdd076..7ec6a822 100644 --- a/features/PayloadController.feature +++ b/features/PayloadController.feature @@ -133,7 +133,7 @@ Feature: Payloads Controller | index | "engine-kuzzle" | | collection | "measures" | And I should receive a "hits" array of objects matching: - | _source.type | _source.origin.id | _source.origin.assetId | _source.origin.type | + | _source.type | _source.origin.id | _source.asset._id | _source.origin.type | | "temperature" | "DummyMultiTemp-detached" | "type1-model1-reference1" | "device" | | "battery" | "DummyMultiTemp-detached" | "type1-model1-reference1" | "device" | @@ -186,13 +186,13 @@ Feature: Payloads Controller | payloads[0].lvlBattery | 0.8 | And I refresh the collection "engine-ayse":"measures" Then When I successfully execute the action "document":"search" with args: - | index | "engine-ayse" | - | collection | "measures" | - | body | { query: { term:{"origin.assetId":"container-FRIDGE-unlinked_1"}}} | + | index | "engine-ayse" | + | collection | "measures" | + | body | { query: { term:{"asset._id":"container-FRIDGE-unlinked_1"}}} | And I should receive a "hits" array of objects matching: - | _source.type | _source.origin.id | - | "temperature" | "DummyMultiTemp-enrich_me_master+container-FRIDGE-unlinked_1" | - | "battery" | "DummyMultiTemp-enrich_me_master+container-FRIDGE-unlinked_1" | + | _source.type | _source.origin.id | _source.asset._source.model | + | "temperature" | "DummyMultiTemp-enrich_me_master+container-FRIDGE-unlinked_1" | "FRIDGE" | + | "battery" | "DummyMultiTemp-enrich_me_master+container-FRIDGE-unlinked_1" | "FRIDGE" | Then The document "device-manager":"devices":"DummyMultiTemp-enrich_me_master" content match: | measures[0].origin.id | "DummyMultiTemp-enrich_me_master+container-FRIDGE-unlinked_1" | | measures[1].origin.id | "DummyMultiTemp-enrich_me_master+container-FRIDGE-unlinked_1" | diff --git a/features/fixtures/application/testPipes.ts b/features/fixtures/application/testPipes.ts index 48b3d4c7..4164ef10 100644 --- a/features/fixtures/application/testPipes.ts +++ b/features/fixtures/application/testPipes.ts @@ -16,18 +16,18 @@ function checkEventWithDocument (app: Backend, event: string) { export function registerTestPipes (app: Backend) { app.pipe.register( - 'device-manager:measures:process:before', - async ({ asset, device, measures }: { asset: BaseAsset, device: Device, measures: MeasureContent[] }) => { - if (device._id !== 'DummyMultiTemp-enrich_me_master') { - return { asset, device, measures }; - } + 'device-manager:measures:process:before', + async ({ asset, device, measures }: { asset: BaseAsset, device: Device, measures: MeasureContent[] }) => { + if (device._id !== 'DummyMultiTemp-enrich_me_master') { + return { asset, device, measures }; + } - for (const measure of measures) { - measure.origin.id += `+${asset?._id}`; - } + for (const measure of measures) { + measure.origin.id += `+${asset?._id}`; + } - return { asset, device, measures }; - }); + return { asset, device, measures }; + }); checkEventWithDocument(app, 'device-manager:device:provisioning:before'); checkEventWithDocument(app, 'device-manager:device:provisioning:after'); diff --git a/lib/DeviceManagerPlugin.ts b/lib/DeviceManagerPlugin.ts index 43262ccb..45b3b469 100644 --- a/lib/DeviceManagerPlugin.ts +++ b/lib/DeviceManagerPlugin.ts @@ -242,7 +242,8 @@ export class DeviceManagerPlugin extends Plugin { this, this.batchController, this.assetService, - this.measuresRegister); + this.measuresRegister, + this.assetCategoryService); this.payloadService = new PayloadService( this, this.batchController, diff --git a/lib/core-classes/MeasureService.ts b/lib/core-classes/MeasureService.ts index 52cf7428..692eff70 100644 --- a/lib/core-classes/MeasureService.ts +++ b/lib/core-classes/MeasureService.ts @@ -22,6 +22,7 @@ import { } from '../types'; import { AssetService } from './AssetService'; import { MeasuresRegister } from './registers/MeasuresRegister'; +import { AssetCategoryService } from './AssetCategoryService'; export class MeasureService { private config: DeviceManagerConfiguration; @@ -29,7 +30,7 @@ export class MeasureService { private batch: BatchController; private assetService: AssetService; private measuresRegister: MeasuresRegister; - + private assetCategoryService: AssetCategoryService; private get sdk () { return this.context.accessors.sdk; } @@ -42,8 +43,10 @@ export class MeasureService { plugin: DeviceManagerPlugin, batchController: BatchController, assetService: AssetService, - measuresRegister: MeasuresRegister + measuresRegister: MeasuresRegister, + assetCategoryService: AssetCategoryService ) { + this.assetCategoryService = assetCategoryService; this.config = plugin.config as any; this.context = plugin.context; @@ -176,6 +179,22 @@ export class MeasureService { } } } + + public getAssetInfos (asset :BaseAsset) { + if (asset === null) { + return undefined; + } + return { + _id: asset._id, + _source: { + category: asset._source.category, + metadata: asset._source.metadata, + model: asset._source.model, + reference: asset._source.reference, + type: asset._source.type + } + }; + } private buildMeasures ( device: Device, @@ -183,6 +202,7 @@ export class MeasureService { measurements: Measurement[], payloadUuids: string[], ): MeasureContent[] { + const measures: MeasureContent[] = []; for (const measurement of measurements) { @@ -193,16 +213,20 @@ export class MeasureService { const deviceMeasureName = measurement.deviceMeasureName || measurement.type; + const assetMeasureName = asset === null ? undefined : this.findAssetMeasureName(device, asset, deviceMeasureName); + + + const assetInfos = this.getAssetInfos(asset); const measureContent: MeasureContent = { + asset: assetInfos, assetMeasureName, deviceMeasureName, measuredAt: measurement.measuredAt, origin: { - assetId: asset?._id, deviceModel: device._source.model, id: device._id, payloadUuids, @@ -327,13 +351,13 @@ export class MeasureService { const measurement = jsonMeasurement as AssetMeasurement; const assetMeasureName = measurement.assetMeasureName ?? measurement.type; - + const assetInfos = this.getAssetInfos(asset); validMeasures.push({ + asset: assetInfos, assetMeasureName, deviceMeasureName: null, measuredAt: measurement.measuredAt || Date.now(), origin: { - assetId, id: kuid, type: 'user', }, diff --git a/lib/mappings/measuresMappings.ts b/lib/mappings/measuresMappings.ts index 8c64fbb0..3771545d 100644 --- a/lib/mappings/measuresMappings.ts +++ b/lib/mappings/measuresMappings.ts @@ -1,5 +1,7 @@ /* eslint-disable sort-keys */ +import { metadataValue } from './metadataMappings'; + export const measuresMappings = { dynamic: 'strict', properties: { @@ -23,7 +25,7 @@ export const measuresMappings = { /** * Micro Timestamp of the measurement time. */ - measuredAt: { type: 'double' }, + measuredAt: { type: 'date' }, /** * Name given by the decoder to the measure. @@ -42,7 +44,20 @@ export const measuresMappings = { dynamic: 'false', properties: {} }, - + asset: { + properties: { + _id: { type: 'keyword' }, + _source: { + properties: { + category: { type: 'keyword' }, + metadata: metadataValue, + model: { type: 'keyword' }, + reference: { type: 'keyword' }, + type: { type: 'keyword' }, + } + } + } + }, /** * Define the origin of the measure. @@ -71,11 +86,9 @@ export const measuresMappings = { */ id: { type: 'keyword' }, - // Asset linked to the device when the measure was made - assetId: { type: 'keyword' }, + } }, - } }; diff --git a/lib/types/measures/MeasureContent.ts b/lib/types/measures/MeasureContent.ts index bafd6e07..eef2a959 100644 --- a/lib/types/measures/MeasureContent.ts +++ b/lib/types/measures/MeasureContent.ts @@ -1,6 +1,7 @@ import { JSONObject, KDocumentContent } from 'kuzzle'; import { MeasureUnit } from './MeasureDefinition'; +import { FormattedMetadata } from '../AssetCategoryContent'; /** * Represents a measurement sent with a payload. @@ -56,6 +57,20 @@ export interface MeasureContent