Skip to content

Commit 0c3fc37

Browse files
authored
fix(simint-alpha): wrong type in routine configuration (#2159)
1 parent 718bf35 commit 0c3fc37

5 files changed

Lines changed: 209 additions & 85 deletions

File tree

cognite/client/_api/simulators/routine_revisions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ def create(
206206
... external_id="routine_rev_1",
207207
... routine_external_id="routine_1",
208208
... configuration=SimulatorRoutineConfiguration(
209-
... data_sampling=SimulatorRoutineDataSampling(sampling_window=15, granularity="1m"),
209+
... data_sampling=SimulatorRoutineDataSampling(sampling_window=15, granularity=1),
210210
... inputs=[
211211
... SimulatorRoutineInputConstant(
212212
... name="Cold Water Temperature",

cognite/client/data_classes/simulators/routine_revisions.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,12 +231,12 @@ class SimulatorRoutineDataSampling(CogniteObject):
231231
232232
Args:
233233
sampling_window (int): Sampling window of the data sampling. Represented in minutes
234-
granularity (str): The granularity of the data sampling.
234+
granularity (int): The granularity of the data sampling in minutes.
235235
validation_window (int | None): Validation window of the data sampling. Represented in minutes. Used when either logical check or steady state detection is enabled.
236236
"""
237237

238238
sampling_window: int
239-
granularity: str
239+
granularity: int
240240
validation_window: int | None = None
241241

242242
@classmethod

tests/tests_integration/test_api/test_simulators/conftest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
simulator_integration,
2323
simulator_model,
2424
simulator_routine,
25-
simulator_routine_revision,
25+
simulator_routine_revision_obj,
2626
)
2727
from tests.tests_integration.test_api.test_simulators.utils import update_logs
2828

@@ -188,7 +188,7 @@ def seed_simulator_routine_revision(
188188
rev_external_id = f"{routine_external_id}_{version}"
189189
routine_rev_exists = routine_revs.get(external_id=rev_external_id)
190190

191-
revision = {**simulator_routine_revision, "externalId": rev_external_id}
191+
revision = {**simulator_routine_revision_obj, "externalId": rev_external_id}
192192

193193
if not routine_rev_exists:
194194
cognite_client.simulators.routines.revisions.create(SimulatorRoutineRevisionWrite.load(revision))

tests/tests_integration/test_api/test_simulators/seed/data.py

Lines changed: 187 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,18 @@
11
# This file contains the data used to seed the test environment for the simulator tests
2+
from cognite.client.data_classes.simulators.routine_revisions import (
3+
SimulationValueUnitInput,
4+
SimulatorRoutineConfiguration,
5+
SimulatorRoutineDataSampling,
6+
SimulatorRoutineInputConstant,
7+
SimulatorRoutineLogicalCheck,
8+
SimulatorRoutineOutput,
9+
SimulatorRoutineRevisionWrite,
10+
SimulatorRoutineSchedule,
11+
SimulatorRoutineStage,
12+
SimulatorRoutineSteadyStateDetection,
13+
SimulatorRoutineStep,
14+
SimulatorRoutineStepArguments,
15+
)
216
from cognite.client.utils._text import random_string
317

418
data_set_external_id = "sdk_tests_dwsim1"
@@ -236,87 +250,190 @@
236250
"description": "Simulator Routine - Description Test",
237251
}
238252

253+
simulator_routine_revision_config_obj = {
254+
"schedule": {"enabled": True, "cronExpression": "*/10 * * * *"},
255+
"dataSampling": {"enabled": True, "samplingWindow": 15, "granularity": 1, "validationWindow": 5},
256+
"logicalCheck": [
257+
{
258+
"enabled": True,
259+
"aggregate": "average",
260+
"operator": "lt",
261+
"value": 75.8,
262+
"timeseriesExternalId": "VAL-45-PT-92608_test",
263+
}
264+
],
265+
"steadyStateDetection": [
266+
{
267+
"enabled": True,
268+
"aggregate": "average",
269+
"minSectionSize": 1,
270+
"varThreshold": 3.5,
271+
"slopeThreshold": -7.5,
272+
"timeseriesExternalId": "VAL-45-PT-92608",
273+
}
274+
],
275+
"inputs": [
276+
{
277+
"name": "Cold Water Temperature",
278+
"referenceId": "CWT",
279+
"value": 10.0,
280+
"valueType": "DOUBLE",
281+
"unit": {"name": "C", "quantity": "temperature"},
282+
"saveTimeseriesExternalId": "TEST-ROUTINE-INPUT-CWT",
283+
},
284+
{
285+
"name": "Cold Water Pressure",
286+
"referenceId": "CWP",
287+
"value": [3.6],
288+
"valueType": "DOUBLE_ARRAY",
289+
"unit": {"name": "bar", "quantity": "pressure"},
290+
},
291+
],
292+
"outputs": [
293+
{
294+
"name": "Shower Temperature",
295+
"referenceId": "ST",
296+
"unit": {"name": "C", "quantity": "temperature"},
297+
"valueType": "DOUBLE",
298+
"saveTimeseriesExternalId": "TEST-ROUTINE-OUTPUT-ST",
299+
},
300+
{
301+
"name": "Shower Pressure",
302+
"referenceId": "SP",
303+
"unit": {"name": "bar", "quantity": "pressure"},
304+
"valueType": "DOUBLE",
305+
},
306+
],
307+
}
239308

240-
simulator_routine_revision = {
241-
"externalId": None,
242-
"routineExternalId": resource_names["simulator_routine_external_id"],
243-
"configuration": {
244-
"schedule": {"enabled": True, "cronExpression": "*/10 * * * *"},
245-
"dataSampling": {"enabled": True, "samplingWindow": 15, "granularity": 1},
246-
"logicalCheck": [],
247-
"steadyStateDetection": [],
248-
"inputs": [
309+
simulator_routine_revision_script_obj = [
310+
{
311+
"order": 1,
312+
"description": "Set Inputs",
313+
"steps": [
249314
{
250-
"name": "Cold Water Temperature",
251-
"referenceId": "CWT",
252-
"value": 10.0,
253-
"valueType": "DOUBLE",
254-
"unit": {"name": "C", "quantity": "temperature"},
255-
"saveTimeseriesExternalId": "TEST-ROUTINE-INPUT-CWT",
315+
"order": 1,
316+
"stepType": "Set",
317+
"description": "Set Cold Water Temperature",
318+
"arguments": {"referenceId": "CWT", "objectName": "Cold water", "objectProperty": "Temperature"},
256319
},
257320
{
258-
"name": "Cold Water Pressure",
259-
"referenceId": "CWP",
260-
"value": [3.6],
261-
"valueType": "DOUBLE_ARRAY",
262-
"unit": {"name": "bar", "quantity": "pressure"},
321+
"order": 2,
322+
"stepType": "Set",
323+
"description": "Set Cold Water Pressure",
324+
"arguments": {"referenceId": "CWP", "objectName": "Cold water", "objectProperty": "Pressure"},
263325
},
264326
],
265-
"outputs": [
327+
},
328+
{
329+
"order": 2,
330+
"description": "Solve the flowsheet",
331+
"steps": [{"order": 1, "stepType": "Command", "arguments": {"command": "Solve"}}],
332+
},
333+
{
334+
"order": 3,
335+
"description": "Set simulation outputs",
336+
"steps": [
266337
{
267-
"name": "Shower Temperature",
268-
"referenceId": "ST",
269-
"unit": {"name": "C", "quantity": "temperature"},
270-
"valueType": "DOUBLE",
271-
"saveTimeseriesExternalId": "TEST-ROUTINE-OUTPUT-ST",
338+
"order": 1,
339+
"stepType": "Get",
340+
"arguments": {"referenceId": "ST", "objectName": "Shower", "objectProperty": "Temperature"},
272341
},
273342
{
274-
"name": "Shower Pressure",
275-
"referenceId": "SP",
276-
"unit": {"name": "bar", "quantity": "pressure"},
277-
"valueType": "DOUBLE",
343+
"order": 2,
344+
"stepType": "Get",
345+
"arguments": {"referenceId": "SP", "objectName": "Shower", "objectProperty": "Pressure"},
278346
},
279347
],
280348
},
281-
"script": [
282-
{
283-
"order": 1,
284-
"description": "Set Inputs",
285-
"steps": [
286-
{
287-
"order": 1,
288-
"stepType": "Set",
289-
"description": "Set Cold Water Temperature",
290-
"arguments": {"referenceId": "CWT", "objectName": "Cold water", "objectProperty": "Temperature"},
291-
},
292-
{
293-
"order": 2,
294-
"stepType": "Set",
295-
"description": "Set Cold Water Pressure",
296-
"arguments": {"referenceId": "CWP", "objectName": "Cold water", "objectProperty": "Pressure"},
297-
},
349+
]
350+
351+
simulator_routine_revision_obj = {
352+
"externalId": None,
353+
"routineExternalId": resource_names["simulator_routine_external_id"],
354+
"configuration": simulator_routine_revision_config_obj,
355+
"script": simulator_routine_revision_script_obj,
356+
}
357+
358+
359+
def create_simulator_routine_revision(
360+
external_id: str,
361+
routine_external_id: str,
362+
) -> SimulatorRoutineRevisionWrite:
363+
"""Create a test simulator routine revision object."""
364+
return SimulatorRoutineRevisionWrite(
365+
external_id=external_id,
366+
routine_external_id=routine_external_id,
367+
configuration=SimulatorRoutineConfiguration(
368+
schedule=SimulatorRoutineSchedule(
369+
cron_expression=simulator_routine_revision_config_obj["schedule"]["cronExpression"],
370+
),
371+
data_sampling=SimulatorRoutineDataSampling(
372+
sampling_window=simulator_routine_revision_config_obj["dataSampling"]["samplingWindow"],
373+
granularity=simulator_routine_revision_config_obj["dataSampling"]["granularity"],
374+
validation_window=simulator_routine_revision_config_obj["dataSampling"]["validationWindow"],
375+
),
376+
logical_check=[
377+
SimulatorRoutineLogicalCheck(
378+
aggregate=logical_check["aggregate"],
379+
operator=logical_check["operator"],
380+
value=logical_check["value"],
381+
timeseries_external_id=logical_check["timeseriesExternalId"],
382+
)
383+
for logical_check in simulator_routine_revision_config_obj["logicalCheck"]
298384
],
299-
},
300-
{
301-
"order": 2,
302-
"description": "Solve the flowsheet",
303-
"steps": [{"order": 1, "stepType": "Command", "arguments": {"command": "Solve"}}],
304-
},
305-
{
306-
"order": 3,
307-
"description": "Set simulation outputs",
308-
"steps": [
309-
{
310-
"order": 1,
311-
"stepType": "Get",
312-
"arguments": {"referenceId": "ST", "objectName": "Shower", "objectProperty": "Temperature"},
313-
},
314-
{
315-
"order": 2,
316-
"stepType": "Get",
317-
"arguments": {"referenceId": "SP", "objectName": "Shower", "objectProperty": "Pressure"},
318-
},
385+
steady_state_detection=[
386+
SimulatorRoutineSteadyStateDetection(
387+
aggregate=steady_state_detection["aggregate"],
388+
min_section_size=steady_state_detection["minSectionSize"],
389+
var_threshold=steady_state_detection["varThreshold"],
390+
slope_threshold=steady_state_detection["slopeThreshold"],
391+
timeseries_external_id=steady_state_detection["timeseriesExternalId"],
392+
)
393+
for steady_state_detection in simulator_routine_revision_config_obj["steadyStateDetection"]
319394
],
320-
},
321-
],
322-
}
395+
inputs=[
396+
SimulatorRoutineInputConstant(
397+
name=input_cfg["name"],
398+
reference_id=input_cfg["referenceId"],
399+
value=input_cfg["value"],
400+
value_type=input_cfg["valueType"],
401+
unit=SimulationValueUnitInput(
402+
name=input_cfg["unit"]["name"],
403+
quantity=input_cfg["unit"]["quantity"],
404+
),
405+
save_timeseries_external_id=input_cfg.get("saveTimeseriesExternalId"),
406+
)
407+
for input_cfg in simulator_routine_revision_config_obj["inputs"]
408+
],
409+
outputs=[
410+
SimulatorRoutineOutput(
411+
name=output_cfg["name"],
412+
reference_id=output_cfg["referenceId"],
413+
unit=SimulationValueUnitInput(
414+
name=output_cfg["unit"]["name"],
415+
quantity=output_cfg["unit"]["quantity"],
416+
),
417+
value_type=output_cfg["valueType"],
418+
save_timeseries_external_id=output_cfg.get("saveTimeseriesExternalId"),
419+
)
420+
for output_cfg in simulator_routine_revision_config_obj["outputs"]
421+
],
422+
),
423+
script=[
424+
SimulatorRoutineStage(
425+
order=stage_cfg["order"],
426+
description=stage_cfg["description"],
427+
steps=[
428+
SimulatorRoutineStep(
429+
order=step_cfg["order"],
430+
step_type=step_cfg["stepType"],
431+
description=step_cfg.get("description"),
432+
arguments=SimulatorRoutineStepArguments(step_cfg["arguments"]),
433+
)
434+
for step_cfg in stage_cfg["steps"]
435+
],
436+
)
437+
for stage_cfg in simulator_routine_revision_script_obj
438+
],
439+
)

tests/tests_integration/test_api/test_simulators/test_routine_revisions.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@
1010
SimulatorRoutineRevisionWrite,
1111
)
1212
from cognite.client.utils._time import timestamp_to_ms
13-
from tests.tests_integration.test_api.test_simulators.conftest import simulator_routine_revision
13+
from tests.tests_integration.test_api.test_simulators.seed.data import (
14+
create_simulator_routine_revision,
15+
simulator_routine_revision_config_obj,
16+
simulator_routine_revision_obj,
17+
simulator_routine_revision_script_obj,
18+
)
1419

1520

1621
class TestSimulatorRoutineRevisions:
@@ -89,20 +94,22 @@ def test_retrieve_routine_revision(
8994
assert rev2_retrieve.external_id == rev2.external_id
9095

9196
def test_create_routine_revision(
92-
self, cognite_client: CogniteClient, seed_simulator_models: dict[str, Any], seed_resource_names: dict[str, str]
97+
self,
98+
cognite_client: CogniteClient,
99+
seed_simulator_routines: dict[str, Any],
100+
seed_resource_names: dict[str, str],
93101
):
94102
routine_external_id = seed_resource_names["simulator_routine_external_id"]
103+
95104
revisions = cognite_client.simulators.routines.revisions.create(
96105
[
97-
SimulatorRoutineRevisionWrite.load(
98-
{
99-
**simulator_routine_revision,
100-
"externalId": f"{routine_external_id}_v3",
101-
}
106+
create_simulator_routine_revision(
107+
external_id=f"{routine_external_id}_v3",
108+
routine_external_id=routine_external_id,
102109
),
103110
SimulatorRoutineRevisionWrite.load(
104111
{
105-
**simulator_routine_revision,
112+
**simulator_routine_revision_obj,
106113
"externalId": f"{routine_external_id}_1_v1",
107114
"routineExternalId": f"{routine_external_id}_1",
108115
}
@@ -114,8 +121,8 @@ def test_create_routine_revision(
114121
revision_1 = revisions[0]
115122
assert revision_1 is not None
116123
assert revision_1.external_id == f"{routine_external_id}_v3"
117-
assert revision_1.configuration.dump() == simulator_routine_revision["configuration"]
118-
assert [item.dump(camel_case=True) for item in revision_1.script] == simulator_routine_revision["script"]
124+
assert revision_1.configuration.dump() == simulator_routine_revision_config_obj
125+
assert [item.dump(camel_case=True) for item in revision_1.script] == simulator_routine_revision_script_obj
119126
assert revision_1.created_time
120127
assert revision_1.created_time > int(time.time() - 60) * 1000
121128

0 commit comments

Comments
 (0)