-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathtest-agent.ts
162 lines (140 loc) · 7.07 KB
/
test-agent.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
// Copyright (C), Siemens AG 2017
import { DataPointValue, MindConnectAgent, MindsphereStandardEvent, retry, TimeStampedDataPoint } from "..";
(async function () {
const sleep = (ms: any) => new Promise((resolve) => setTimeout(resolve, ms));
const configuration = require("../../agentconfig.json");
const agent = new MindConnectAgent(configuration);
const log = (text: any) => {
console.log(`[${new Date().toISOString()}] ${text.toString()}`);
};
const RETRYTIMES = 5; // retry the operation before giving up and throwing exception
// onboarding the agent
// Check in the local agent state storage if agent is onboarded.
// https://developer.siemens.com/industrial-iot-open-source/mindconnect-nodejs/agent-development/agent-state-storage.html
if (!agent.IsOnBoarded()) {
// wrapping the call in the retry function makes the agent a bit more resillient
// if you don't want to retry the operations you can always just call await agent.OnBoard(); instead.
await retry(RETRYTIMES, () => agent.OnBoard());
log("Agent onboarded");
}
// you can use agent.Sdk().GetAssetManagementClient() to get the asset id and asset type from mindsphere
const targetAssetId = "1234567....";
const targetAssetType = `${agent.GetTenant()}.Engine`;
// create data sourceconfiguration and mappings
// this generates a data source configuration from an asset type
const config = await agent.GenerateDataSourceConfiguration(targetAssetType);
// create/overwrite the data source configuration
await agent.PutDataSourceConfiguration(config);
// create mappings for asset id
const mappings = await agent.GenerateMappings(targetAssetId);
// store mappings in mindsphere
await agent.PutDataMappings(mappings);
// instead of creating the data source configuration and mappings separately
// you can also just use the method below which takes care of everything
// this is only used for 1:1 asset -> agent mappings
// the method above can also map the data source configuration to multiple assets
// just call GenerateMappings with different asset ids
await agent.ConfigureAgentForAssetId(targetAssetId);
// Check in the local agent state storage if agent has data source configuration.
if (!agent.HasDataSourceConfiguration()) {
await retry(RETRYTIMES, () => agent.GetDataSourceConfiguration());
log("Configuration aquired");
}
for (let index = 0; index < 5; index++) {
try {
log(`Iteration : ${index}`);
// if you have configred the data points in the mindsphere UI you will have to use the long integer values instead of descriptive dataPointIds.
const values: DataPointValue[] = [
{
dataPointId: "DP-Temperature",
qualityCode: "0",
value: (Math.sin(index) * (20 + (index % 2)) + 25).toString(),
},
{
dataPointId: "DP-Pressure",
qualityCode: "0",
value: (Math.cos(index) * (20 + (index % 25)) + 25).toString(),
},
{
dataPointId: "DP-Humidity",
qualityCode: "0",
value: ((index + 30) % 100).toString(),
},
{
dataPointId: "DP-Acceleration",
qualityCode: "0",
value: (1000.0 + index).toString(),
},
{
dataPointId: "DP-Frequency",
qualityCode: "0",
value: (60.0 + index * 0.1).toString(),
},
{
dataPointId: "DP-Displacement",
qualityCode: "0",
value: (index % 10).toString(),
},
{
dataPointId: "DP-Velocity",
qualityCode: "0",
value: (50.0 + index).toString(),
},
];
// same like above, you can also just call await agent.PostData(values) if you don't want to retry the operation
// this is how to send the data with specific timestamp
// await agent.PostData(values, new Date(Date.now() - 86400 * 1000));
await retry(RETRYTIMES, () => agent.PostData(values));
log("Data posted");
await sleep(1000);
const event: MindsphereStandardEvent = {
entityId: agent.ClientId(), // use assetid if you want to send event somewhere else :)
sourceType: "Event",
sourceId: "application",
source: "Meowz",
severity: 20, // 0-99 : 20:error, 30:warning, 40: information
timestamp: new Date().toISOString(),
description: "Test",
};
// send event with current timestamp; you can also just call agent.PostEvent(event) if you don't want to retry the operation
await retry(RETRYTIMES, () => agent.PostEvent(event));
log("event posted");
await sleep(1000);
// upload file
// the upload-file can be a multipart operation and therefore can be configured to
// retry the upload of the chunks instead the upload of the whole file.
// if you don't specify the type , the mimetype is automatically determined by the library
await agent.UploadFile(agent.ClientId(), "custom/mindsphere/path/package.json", "package.json", {
retry: RETRYTIMES,
description: "File uploaded with MindConnect-NodeJS Library",
chunk: true, // the chunk parameter activates multipart upload
});
log("file uploaded");
await sleep(1000);
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const bulk: TimeStampedDataPoint[] = [
{
timestamp: yesterday.toISOString(),
values: [
{ dataPointId: "DP-Temperature", qualityCode: "0", value: "10" },
{ dataPointId: "DP-Pressure", qualityCode: "0", value: "10" },
],
},
{
timestamp: new Date().toISOString(),
values: [
{ dataPointId: "DP-Temperature", qualityCode: "0", value: "10" },
{ dataPointId: "DP-Pressure", qualityCode: "0", value: "10" },
],
},
];
await retry(RETRYTIMES, () => agent.BulkPostData(bulk));
log("bulk data uploaded");
await sleep(1000);
} catch (err) {
// add proper error handling (e.g. store data somewhere, retry later etc. )
console.error(err);
}
}
})();