cactus-test-definitions 1.8.0__py3-none-any.whl
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.
- cactus_test_definitions/__init__.py +39 -0
- cactus_test_definitions/__pycache__/__init__.cpython-312.pyc +0 -0
- cactus_test_definitions/__pycache__/actions.cpython-312.pyc +0 -0
- cactus_test_definitions/__pycache__/checks.cpython-312.pyc +0 -0
- cactus_test_definitions/__pycache__/csipaus.cpython-312.pyc +0 -0
- cactus_test_definitions/__pycache__/errors.cpython-312.pyc +0 -0
- cactus_test_definitions/__pycache__/events.cpython-312.pyc +0 -0
- cactus_test_definitions/__pycache__/parameters.cpython-312.pyc +0 -0
- cactus_test_definitions/__pycache__/schema.cpython-312.pyc +0 -0
- cactus_test_definitions/__pycache__/test_procedures.cpython-312-pytest-8.3.5.pyc +0 -0
- cactus_test_definitions/__pycache__/test_procedures.cpython-312.pyc +0 -0
- cactus_test_definitions/__pycache__/variable_expressions.cpython-312.pyc +0 -0
- cactus_test_definitions/__pycache__/version.cpython-312.pyc +0 -0
- cactus_test_definitions/client/__init__.py +30 -0
- cactus_test_definitions/client/__pycache__/__init__.cpython-312.pyc +0 -0
- cactus_test_definitions/client/__pycache__/actions.cpython-312.pyc +0 -0
- cactus_test_definitions/client/__pycache__/checks.cpython-312.pyc +0 -0
- cactus_test_definitions/client/__pycache__/events.cpython-312.pyc +0 -0
- cactus_test_definitions/client/__pycache__/test_procedures.cpython-312-pytest-8.3.5.pyc +0 -0
- cactus_test_definitions/client/__pycache__/validate.cpython-312.pyc +0 -0
- cactus_test_definitions/client/actions.py +99 -0
- cactus_test_definitions/client/checks.py +128 -0
- cactus_test_definitions/client/events.py +71 -0
- cactus_test_definitions/client/procedures/ALL-01.yaml +94 -0
- cactus_test_definitions/client/procedures/ALL-02.yaml +113 -0
- cactus_test_definitions/client/procedures/ALL-03-REJ.yaml +69 -0
- cactus_test_definitions/client/procedures/ALL-03.yaml +110 -0
- cactus_test_definitions/client/procedures/ALL-04.yaml +69 -0
- cactus_test_definitions/client/procedures/ALL-05.yaml +117 -0
- cactus_test_definitions/client/procedures/ALL-06.yaml +128 -0
- cactus_test_definitions/client/procedures/ALL-07.yaml +76 -0
- cactus_test_definitions/client/procedures/ALL-08.yaml +78 -0
- cactus_test_definitions/client/procedures/ALL-09.yaml +111 -0
- cactus_test_definitions/client/procedures/ALL-10.yaml +128 -0
- cactus_test_definitions/client/procedures/ALL-11.yaml +111 -0
- cactus_test_definitions/client/procedures/ALL-12.yaml +126 -0
- cactus_test_definitions/client/procedures/ALL-13.yaml +112 -0
- cactus_test_definitions/client/procedures/ALL-14.yaml +165 -0
- cactus_test_definitions/client/procedures/ALL-15.yaml +109 -0
- cactus_test_definitions/client/procedures/ALL-16.yaml +102 -0
- cactus_test_definitions/client/procedures/ALL-17.yaml +63 -0
- cactus_test_definitions/client/procedures/ALL-18.yaml +289 -0
- cactus_test_definitions/client/procedures/ALL-19.yaml +78 -0
- cactus_test_definitions/client/procedures/ALL-20.yaml +136 -0
- cactus_test_definitions/client/procedures/ALL-21.yaml +203 -0
- cactus_test_definitions/client/procedures/ALL-22.yaml +82 -0
- cactus_test_definitions/client/procedures/ALL-23.yaml +158 -0
- cactus_test_definitions/client/procedures/ALL-24.yaml +132 -0
- cactus_test_definitions/client/procedures/ALL-25-EXT.yaml +228 -0
- cactus_test_definitions/client/procedures/ALL-25.yaml +136 -0
- cactus_test_definitions/client/procedures/ALL-26.yaml +147 -0
- cactus_test_definitions/client/procedures/ALL-27.yaml +144 -0
- cactus_test_definitions/client/procedures/ALL-28.yaml +273 -0
- cactus_test_definitions/client/procedures/ALL-29.yaml +87 -0
- cactus_test_definitions/client/procedures/ALL-30.yaml +188 -0
- cactus_test_definitions/client/procedures/BES-01.yaml +136 -0
- cactus_test_definitions/client/procedures/BES-02.yaml +137 -0
- cactus_test_definitions/client/procedures/BES-03.yaml +135 -0
- cactus_test_definitions/client/procedures/BES-04.yaml +228 -0
- cactus_test_definitions/client/procedures/DRA-01.yaml +54 -0
- cactus_test_definitions/client/procedures/DRA-02.yaml +64 -0
- cactus_test_definitions/client/procedures/DRD-01.yaml +667 -0
- cactus_test_definitions/client/procedures/DRL-01.yaml +327 -0
- cactus_test_definitions/client/procedures/GEN-01.yaml +73 -0
- cactus_test_definitions/client/procedures/GEN-02.yaml +72 -0
- cactus_test_definitions/client/procedures/GEN-03.yaml +160 -0
- cactus_test_definitions/client/procedures/GEN-04.yaml +161 -0
- cactus_test_definitions/client/procedures/GEN-05.yaml +89 -0
- cactus_test_definitions/client/procedures/GEN-06.yaml +90 -0
- cactus_test_definitions/client/procedures/GEN-07.yaml +145 -0
- cactus_test_definitions/client/procedures/GEN-08.yaml +145 -0
- cactus_test_definitions/client/procedures/GEN-09.yaml +117 -0
- cactus_test_definitions/client/procedures/GEN-10.yaml +793 -0
- cactus_test_definitions/client/procedures/GEN-11.yaml +402 -0
- cactus_test_definitions/client/procedures/GEN-12.yaml +402 -0
- cactus_test_definitions/client/procedures/GEN-13.yaml +70 -0
- cactus_test_definitions/client/procedures/LOA-01.yaml +73 -0
- cactus_test_definitions/client/procedures/LOA-02.yaml +73 -0
- cactus_test_definitions/client/procedures/LOA-03.yaml +160 -0
- cactus_test_definitions/client/procedures/LOA-04.yaml +161 -0
- cactus_test_definitions/client/procedures/LOA-05.yaml +89 -0
- cactus_test_definitions/client/procedures/LOA-06.yaml +89 -0
- cactus_test_definitions/client/procedures/LOA-07.yaml +145 -0
- cactus_test_definitions/client/procedures/LOA-08.yaml +145 -0
- cactus_test_definitions/client/procedures/LOA-09.yaml +117 -0
- cactus_test_definitions/client/procedures/LOA-10.yaml +793 -0
- cactus_test_definitions/client/procedures/LOA-11.yaml +402 -0
- cactus_test_definitions/client/procedures/LOA-12.yaml +402 -0
- cactus_test_definitions/client/procedures/LOA-13.yaml +71 -0
- cactus_test_definitions/client/procedures/MUL-01.yaml +92 -0
- cactus_test_definitions/client/procedures/MUL-02.yaml +80 -0
- cactus_test_definitions/client/procedures/MUL-03.yaml +74 -0
- cactus_test_definitions/client/test_procedures.py +185 -0
- cactus_test_definitions/client/validate.py +98 -0
- cactus_test_definitions/csipaus.py +83 -0
- cactus_test_definitions/errors.py +15 -0
- cactus_test_definitions/parameters.py +153 -0
- cactus_test_definitions/py.typed +0 -0
- cactus_test_definitions/schema.py +22 -0
- cactus_test_definitions/server/README.md +172 -0
- cactus_test_definitions/server/__init__.py +27 -0
- cactus_test_definitions/server/__pycache__/__init__.cpython-312.pyc +0 -0
- cactus_test_definitions/server/__pycache__/actions.cpython-312.pyc +0 -0
- cactus_test_definitions/server/__pycache__/checks.cpython-312.pyc +0 -0
- cactus_test_definitions/server/__pycache__/test_procedures.cpython-312-pytest-8.3.5.pyc +0 -0
- cactus_test_definitions/server/__pycache__/validate.cpython-312.pyc +0 -0
- cactus_test_definitions/server/actions.py +140 -0
- cactus_test_definitions/server/checks.py +152 -0
- cactus_test_definitions/server/procedures/S-ALL-01.yaml +45 -0
- cactus_test_definitions/server/procedures/S-ALL-02.yaml +65 -0
- cactus_test_definitions/server/procedures/S-ALL-03.yaml +65 -0
- cactus_test_definitions/server/procedures/S-ALL-04.yaml +137 -0
- cactus_test_definitions/server/procedures/S-ALL-05.yaml +111 -0
- cactus_test_definitions/server/procedures/S-ALL-06.yaml +111 -0
- cactus_test_definitions/server/procedures/S-ALL-07.yaml +100 -0
- cactus_test_definitions/server/procedures/S-ALL-08.yaml +77 -0
- cactus_test_definitions/server/procedures/S-ALL-09.yaml +43 -0
- cactus_test_definitions/server/procedures/S-ALL-10.yaml +68 -0
- cactus_test_definitions/server/procedures/S-ALL-11.yaml +36 -0
- cactus_test_definitions/server/procedures/S-ALL-12.yaml +36 -0
- cactus_test_definitions/server/procedures/S-ALL-13.yaml +36 -0
- cactus_test_definitions/server/procedures/S-ALL-14.yaml +36 -0
- cactus_test_definitions/server/procedures/S-ALL-15.yaml +79 -0
- cactus_test_definitions/server/procedures/S-ALL-16.yaml +79 -0
- cactus_test_definitions/server/procedures/S-ALL-17.yaml +39 -0
- cactus_test_definitions/server/procedures/S-ALL-18.yaml +35 -0
- cactus_test_definitions/server/procedures/S-ALL-19.yaml +34 -0
- cactus_test_definitions/server/procedures/S-ALL-20.yaml +34 -0
- cactus_test_definitions/server/procedures/S-ALL-21.yaml +34 -0
- cactus_test_definitions/server/procedures/S-ALL-22.yaml +34 -0
- cactus_test_definitions/server/procedures/S-ALL-23.yaml +34 -0
- cactus_test_definitions/server/procedures/S-ALL-24.yaml +37 -0
- cactus_test_definitions/server/procedures/S-ALL-25.yaml +151 -0
- cactus_test_definitions/server/procedures/S-ALL-41.yaml +343 -0
- cactus_test_definitions/server/procedures/S-ALL-42.yaml +81 -0
- cactus_test_definitions/server/procedures/S-ALL-43.yaml +146 -0
- cactus_test_definitions/server/procedures/S-ALL-44.yaml +51 -0
- cactus_test_definitions/server/procedures/S-ALL-45.yaml +34 -0
- cactus_test_definitions/server/procedures/S-ALL-48.yaml +29 -0
- cactus_test_definitions/server/procedures/S-ALL-49.yaml +56 -0
- cactus_test_definitions/server/procedures/S-ALL-51.yaml +35 -0
- cactus_test_definitions/server/procedures/S-ALL-52.yaml +35 -0
- cactus_test_definitions/server/procedures/S-ALL-53.yaml +42 -0
- cactus_test_definitions/server/procedures/S-ALL-55.yaml +45 -0
- cactus_test_definitions/server/procedures/S-ALL-56.yaml +36 -0
- cactus_test_definitions/server/procedures/S-ALL-57.yaml +62 -0
- cactus_test_definitions/server/procedures/S-OPT-01.yaml +42 -0
- cactus_test_definitions/server/procedures/S-OPT-02.yaml +40 -0
- cactus_test_definitions/server/procedures/S-OPT-03.yaml +47 -0
- cactus_test_definitions/server/procedures/S-OPT-04.yaml +32 -0
- cactus_test_definitions/server/procedures/S-OPT-05.yaml +33 -0
- cactus_test_definitions/server/test_procedures.py +156 -0
- cactus_test_definitions/server/validate.py +30 -0
- cactus_test_definitions/variable_expressions.py +419 -0
- cactus_test_definitions-1.8.0.dist-info/METADATA +289 -0
- cactus_test_definitions-1.8.0.dist-info/RECORD +173 -0
- cactus_test_definitions-1.8.0.dist-info/WHEEL +5 -0
- cactus_test_definitions-1.8.0.dist-info/licenses/LICENSE.txt +22 -0
- cactus_test_definitions-1.8.0.dist-info/top_level.txt +2 -0
- tests/__init__.py +0 -0
- tests/unit/__init__.py +0 -0
- tests/unit/client/__init__.py +0 -0
- tests/unit/client/test_actions.py +72 -0
- tests/unit/client/test_checks.py +71 -0
- tests/unit/client/test_events.py +36 -0
- tests/unit/client/test_test_procedures.py +103 -0
- tests/unit/client/test_validate.py +200 -0
- tests/unit/server/__init__.py +0 -0
- tests/unit/server/test_test_procedures.py +60 -0
- tests/unit/server/test_validate.py +75 -0
- tests/unit/test_csipaus.py +49 -0
- tests/unit/test_parameters.py +197 -0
- tests/unit/test_variable_expressions.py +402 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
Description: Subscribe
|
|
2
|
+
Category: Subscription / Notification
|
|
3
|
+
Classes:
|
|
4
|
+
- A
|
|
5
|
+
|
|
6
|
+
TargetVersions:
|
|
7
|
+
- v1.2
|
|
8
|
+
|
|
9
|
+
Preconditions:
|
|
10
|
+
required_clients:
|
|
11
|
+
- id: client
|
|
12
|
+
|
|
13
|
+
Steps:
|
|
14
|
+
- id: PRECONDITION
|
|
15
|
+
repeat_until_pass: true
|
|
16
|
+
instructions:
|
|
17
|
+
- Create an EndDevice registration for client.
|
|
18
|
+
action:
|
|
19
|
+
type: discovery
|
|
20
|
+
parameters:
|
|
21
|
+
resources:
|
|
22
|
+
- EndDevice
|
|
23
|
+
- FunctionSetAssignments
|
|
24
|
+
- DERProgram
|
|
25
|
+
- SubscriptionList
|
|
26
|
+
checks:
|
|
27
|
+
- type: end-device
|
|
28
|
+
parameters:
|
|
29
|
+
matches_client: true
|
|
30
|
+
|
|
31
|
+
- id: EDEV LIST SUBSCRIBE
|
|
32
|
+
action:
|
|
33
|
+
type: create-subscription
|
|
34
|
+
parameters:
|
|
35
|
+
sub_id: edev_list_sub
|
|
36
|
+
resource: EndDeviceList
|
|
37
|
+
|
|
38
|
+
- id: AWAIT EDEV LIST NOTIFICATION
|
|
39
|
+
repeat_until_pass: true
|
|
40
|
+
instructions:
|
|
41
|
+
- Change the EndDeviceList to have a pollRate of 30 seconds. Ensure it sends a Notification.
|
|
42
|
+
action:
|
|
43
|
+
type: notifications
|
|
44
|
+
parameters:
|
|
45
|
+
sub_id: edev_list_sub
|
|
46
|
+
collect: true
|
|
47
|
+
checks:
|
|
48
|
+
- type: end-device-list
|
|
49
|
+
parameters:
|
|
50
|
+
minimum_count: 1
|
|
51
|
+
maximum_count: 1
|
|
52
|
+
poll_rate: 30
|
|
53
|
+
sub_id: edev_list_sub
|
|
54
|
+
|
|
55
|
+
- id: FSA LIST SUBSCRIBE
|
|
56
|
+
action:
|
|
57
|
+
type: create-subscription
|
|
58
|
+
parameters:
|
|
59
|
+
sub_id: fsa_list_sub
|
|
60
|
+
resource: FunctionSetAssignmentsList
|
|
61
|
+
|
|
62
|
+
- id: AWAIT FSA LIST NOTIFICATION
|
|
63
|
+
repeat_until_pass: true
|
|
64
|
+
instructions:
|
|
65
|
+
- Add a new FunctionSetAssignment to client EndDevice. Ensure it sends a Notification.
|
|
66
|
+
action:
|
|
67
|
+
type: notifications
|
|
68
|
+
parameters:
|
|
69
|
+
sub_id: fsa_list_sub
|
|
70
|
+
collect: true
|
|
71
|
+
checks:
|
|
72
|
+
- type: function-set-assignment
|
|
73
|
+
parameters:
|
|
74
|
+
minimum_count: 1
|
|
75
|
+
maximum_count: 1
|
|
76
|
+
matches_client_edev: true
|
|
77
|
+
sub_id: fsa_list_sub
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
# At this point the client will have a FunctionSetAssignment with a LINK to a DERProgramList but NO
|
|
81
|
+
# physical record of that DERProgramList - we can't just subscribe to a ListLink.href as the actual underlying
|
|
82
|
+
# record might NOT be subscribable (we can only discover that by resolving the record)
|
|
83
|
+
#
|
|
84
|
+
# For these reasons - we are forced to actually resolve the DERProgramList via discovery.
|
|
85
|
+
- id: DISCOVER NEW DERP LIST
|
|
86
|
+
action:
|
|
87
|
+
type: discovery
|
|
88
|
+
parameters:
|
|
89
|
+
resources:
|
|
90
|
+
- DERProgramList
|
|
91
|
+
|
|
92
|
+
- id: DERP LIST SUBSCRIBE
|
|
93
|
+
action:
|
|
94
|
+
type: create-subscription
|
|
95
|
+
parameters:
|
|
96
|
+
sub_id: derp_list_sub
|
|
97
|
+
resource: DERProgramList
|
|
98
|
+
|
|
99
|
+
- id: AWAIT DERP LIST NOTIFICATION
|
|
100
|
+
repeat_until_pass: true
|
|
101
|
+
instructions:
|
|
102
|
+
- Add a new DERProgram to the newly created FunctionSetAssignment. Ensure it sends a Notification.
|
|
103
|
+
action:
|
|
104
|
+
type: notifications
|
|
105
|
+
parameters:
|
|
106
|
+
sub_id: derp_list_sub
|
|
107
|
+
collect: true
|
|
108
|
+
checks:
|
|
109
|
+
- type: der-program
|
|
110
|
+
parameters:
|
|
111
|
+
minimum_count: 1
|
|
112
|
+
maximum_count: 1
|
|
113
|
+
fsa_index: -1 # Must belong to the latest FunctionSetAssignment
|
|
114
|
+
sub_id: derp_list_sub
|
|
115
|
+
|
|
116
|
+
# Same as above - we don't have the DefaultDERControl (only a link) - we need to resolve it
|
|
117
|
+
- id: DISCOVER NEW DERC
|
|
118
|
+
repeat_until_pass: true
|
|
119
|
+
instructions:
|
|
120
|
+
- Add a DefaultDERControl to the recently created DERProgram. Ensure it's subscribable.
|
|
121
|
+
action:
|
|
122
|
+
type: discovery
|
|
123
|
+
parameters:
|
|
124
|
+
resources:
|
|
125
|
+
- DefaultDERControl
|
|
126
|
+
checks:
|
|
127
|
+
- type: default-der-control
|
|
128
|
+
parameters:
|
|
129
|
+
minimum_count: 1
|
|
130
|
+
|
|
131
|
+
- id: DEFAULT DERC SUBSCRIBE
|
|
132
|
+
action:
|
|
133
|
+
type: create-subscription
|
|
134
|
+
parameters:
|
|
135
|
+
sub_id: dderc_sub
|
|
136
|
+
resource: DefaultDERControl
|
|
137
|
+
|
|
138
|
+
- id: AWAIT DEFAULT DERC NOTIFICATION
|
|
139
|
+
repeat_until_pass: true
|
|
140
|
+
instructions:
|
|
141
|
+
- Adjust the DefaultDERControl to have opModeExpLimW 2000 W. Ensure it sends a Notification.
|
|
142
|
+
action:
|
|
143
|
+
type: notifications
|
|
144
|
+
parameters:
|
|
145
|
+
sub_id: dderc_sub
|
|
146
|
+
collect: true
|
|
147
|
+
checks:
|
|
148
|
+
- type: default-der-control
|
|
149
|
+
parameters:
|
|
150
|
+
opModExpLimW: 2000
|
|
151
|
+
sub_id: dderc_sub
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
Description: Control Responses
|
|
2
|
+
Category: Control
|
|
3
|
+
Classes:
|
|
4
|
+
- A
|
|
5
|
+
|
|
6
|
+
TargetVersions:
|
|
7
|
+
- v1.2
|
|
8
|
+
|
|
9
|
+
Preconditions:
|
|
10
|
+
required_clients:
|
|
11
|
+
- id: client
|
|
12
|
+
|
|
13
|
+
Steps:
|
|
14
|
+
- id: (A) PRECONDITION
|
|
15
|
+
repeat_until_pass: true
|
|
16
|
+
client: client
|
|
17
|
+
instructions:
|
|
18
|
+
- Create an EndDevice registration.
|
|
19
|
+
- Configure an active control with opModExpLimW and opModImpLimW = 200% of the DERs rated active power, responseRequired = 03, and replyTo set to the response endpoint on the test utility server.
|
|
20
|
+
action:
|
|
21
|
+
type: discovery
|
|
22
|
+
parameters:
|
|
23
|
+
resources:
|
|
24
|
+
- EndDevice
|
|
25
|
+
- DERControl
|
|
26
|
+
checks:
|
|
27
|
+
- type: end-device
|
|
28
|
+
parameters:
|
|
29
|
+
matches_client: true
|
|
30
|
+
- type: der-control
|
|
31
|
+
parameters:
|
|
32
|
+
minimum_count: 1
|
|
33
|
+
maximum_count: 1
|
|
34
|
+
opModExpLimW: $(setMaxW * 2)
|
|
35
|
+
opModImpLimW: $(setMaxW * 2)
|
|
36
|
+
# replyTo should also be set but this check is implicit in later communications
|
|
37
|
+
event_status: 0 # Scheduled
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
################################## TEST SECTION 1 - Receive, Start, Complete ##################################
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
- id: (1b) DERControl 1 - Received
|
|
44
|
+
client: client
|
|
45
|
+
action:
|
|
46
|
+
type: respond-der-controls # send response status = 1 (received) immediately after it is sent
|
|
47
|
+
|
|
48
|
+
- id: (2) DERControl 1 - Active
|
|
49
|
+
repeat_until_pass: True # The first DER Control can start any time and be of any duration.
|
|
50
|
+
client: client
|
|
51
|
+
action:
|
|
52
|
+
type: refresh-resource
|
|
53
|
+
parameters:
|
|
54
|
+
resource: DERControl
|
|
55
|
+
checks:
|
|
56
|
+
- type: der-control # Check event status has been updated
|
|
57
|
+
parameters:
|
|
58
|
+
minimum_count: 1
|
|
59
|
+
maximum_count: 1
|
|
60
|
+
opModExpLimW: $(setMaxW * 2)
|
|
61
|
+
opModImpLimW: $(setMaxW * 2)
|
|
62
|
+
event_status: 1 # Active
|
|
63
|
+
|
|
64
|
+
- id: (2b) DERControl 1 - Started
|
|
65
|
+
client: client
|
|
66
|
+
action:
|
|
67
|
+
type: respond-der-controls # send response status = 2 (started)
|
|
68
|
+
|
|
69
|
+
- id: (3) DERControl 1 - Completed
|
|
70
|
+
repeat_until_pass: true # Wait until event status has been updated
|
|
71
|
+
client: client
|
|
72
|
+
action:
|
|
73
|
+
type: refresh-resource
|
|
74
|
+
parameters:
|
|
75
|
+
resource: DERControl
|
|
76
|
+
checks:
|
|
77
|
+
- type: der-control # Check event status has been updated
|
|
78
|
+
parameters:
|
|
79
|
+
minimum_count: 1
|
|
80
|
+
maximum_count: 1
|
|
81
|
+
opModExpLimW: $(setMaxW * 2)
|
|
82
|
+
opModImpLimW: $(setMaxW * 2)
|
|
83
|
+
event_status: 2 # Completed
|
|
84
|
+
|
|
85
|
+
- id: (3b) DERControl 1 - Completed
|
|
86
|
+
client: client
|
|
87
|
+
action:
|
|
88
|
+
type: respond-der-controls # send response status = 3 (Completed)
|
|
89
|
+
|
|
90
|
+
- id: WAIT for completed DERControl to be removed from server (20 seconds buffer from completion time)
|
|
91
|
+
client: client
|
|
92
|
+
action:
|
|
93
|
+
type: wait
|
|
94
|
+
parameters:
|
|
95
|
+
duration_seconds: 20
|
|
96
|
+
|
|
97
|
+
- id: CLEAR OUT DERControls
|
|
98
|
+
client: client
|
|
99
|
+
instructions: The server should clear out the completed control ready to begin the next controls.
|
|
100
|
+
action:
|
|
101
|
+
type: discovery
|
|
102
|
+
parameters:
|
|
103
|
+
resources:
|
|
104
|
+
- DERControl
|
|
105
|
+
checks:
|
|
106
|
+
- type: der-control
|
|
107
|
+
parameters:
|
|
108
|
+
maximum_count: 0 # Empty list of controls
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
################################## TEST SECTION 2 - CANCELLATION ##################################
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
- id: (4) DERControl 2
|
|
115
|
+
repeat_until_pass: true
|
|
116
|
+
client: client
|
|
117
|
+
instructions:
|
|
118
|
+
- The utility server is configured with an active control with opModExpLimW and opModImpLimW = 200% of the DERs rated active power, responseRequired = 03 and replyTo set to the response endpoint on the test utility server, to begin in 5 minutes.
|
|
119
|
+
action:
|
|
120
|
+
type: discovery
|
|
121
|
+
parameters:
|
|
122
|
+
resources:
|
|
123
|
+
- DERControl
|
|
124
|
+
checks:
|
|
125
|
+
- type: der-control
|
|
126
|
+
parameters:
|
|
127
|
+
minimum_count: 1
|
|
128
|
+
maximum_count: 1
|
|
129
|
+
opModExpLimW: $(setMaxW * 2)
|
|
130
|
+
opModImpLimW: $(setMaxW * 2)
|
|
131
|
+
responseRequired: 3
|
|
132
|
+
# replyTo should also be set but this check is implicit in later communications
|
|
133
|
+
event_status: 0 # Scheduled
|
|
134
|
+
# start time should be set to 5 mins, check is implicit in the next step
|
|
135
|
+
|
|
136
|
+
- id: (4b) DERControl 2 - Received
|
|
137
|
+
client: client
|
|
138
|
+
action:
|
|
139
|
+
type: respond-der-controls # send response status = 1 (Received)
|
|
140
|
+
|
|
141
|
+
- id: WAIT for DERControl start time
|
|
142
|
+
client: client
|
|
143
|
+
action:
|
|
144
|
+
type: wait
|
|
145
|
+
parameters:
|
|
146
|
+
duration_seconds: 320 # 5 minutes and 20 second buffer
|
|
147
|
+
|
|
148
|
+
- id: (4c) DERControl 2 - Started
|
|
149
|
+
client: client
|
|
150
|
+
action:
|
|
151
|
+
type: refresh-resource
|
|
152
|
+
parameters:
|
|
153
|
+
resource: DERControl
|
|
154
|
+
checks:
|
|
155
|
+
- type: der-control # Check event status has been updated
|
|
156
|
+
parameters:
|
|
157
|
+
minimum_count: 1
|
|
158
|
+
maximum_count: 1
|
|
159
|
+
opModExpLimW: $(setMaxW * 2)
|
|
160
|
+
opModImpLimW: $(setMaxW * 2)
|
|
161
|
+
event_status: 1 # Active
|
|
162
|
+
|
|
163
|
+
- id: (4d) DERControl 2 - Started
|
|
164
|
+
client: client
|
|
165
|
+
action:
|
|
166
|
+
type: respond-der-controls # send response status = 2 (Started)
|
|
167
|
+
|
|
168
|
+
- id: (5) DERControl 2 - Cancelled.
|
|
169
|
+
repeat_until_pass: true
|
|
170
|
+
client: client
|
|
171
|
+
instructions:
|
|
172
|
+
- The utility server is configured to cancel the active control while it is still active.
|
|
173
|
+
action:
|
|
174
|
+
type: refresh-resource
|
|
175
|
+
parameters:
|
|
176
|
+
resource: DERControl
|
|
177
|
+
checks:
|
|
178
|
+
- type: der-control
|
|
179
|
+
parameters:
|
|
180
|
+
minimum_count: 1
|
|
181
|
+
maximum_count: 1
|
|
182
|
+
opModExpLimW: $(setMaxW * 2)
|
|
183
|
+
opModImpLimW: $(setMaxW * 2)
|
|
184
|
+
responseRequired: 3
|
|
185
|
+
event_status: 2 # Cancelled
|
|
186
|
+
|
|
187
|
+
- id: CHECK pt. 1 - Cancelled DERControl isnt just removed immediately (client has a chance to see cancellation)
|
|
188
|
+
client: client
|
|
189
|
+
action:
|
|
190
|
+
type: wait
|
|
191
|
+
parameters:
|
|
192
|
+
duration_seconds: 10 # little buffer to check behaviour
|
|
193
|
+
|
|
194
|
+
- id: CHECK pt. 2 - Cancelled DERControl isnt just removed immediately (client has a chance to see cancellation)
|
|
195
|
+
client: client
|
|
196
|
+
action:
|
|
197
|
+
type: refresh-resource
|
|
198
|
+
parameters:
|
|
199
|
+
resource: DERControl
|
|
200
|
+
checks:
|
|
201
|
+
- type: der-control # Check DER Control still exists
|
|
202
|
+
parameters:
|
|
203
|
+
minimum_count: 1
|
|
204
|
+
maximum_count: 1
|
|
205
|
+
opModExpLimW: $(setMaxW * 2)
|
|
206
|
+
opModImpLimW: $(setMaxW * 2)
|
|
207
|
+
event_status: 2 # Cancelled
|
|
208
|
+
|
|
209
|
+
- id: (5b) DERControl 2 - Respond to cancelled DERControl
|
|
210
|
+
client: client
|
|
211
|
+
action:
|
|
212
|
+
type: respond-der-controls # Will post control response status = 6 (cancelled).
|
|
213
|
+
|
|
214
|
+
- id: CLEAR OUT DERControls for next section of the test
|
|
215
|
+
repeat_until_pass: true
|
|
216
|
+
client: client
|
|
217
|
+
instructions: The server should clear out the cancelled control ready to begin the next controls (not written but makes next section easier to test).
|
|
218
|
+
action:
|
|
219
|
+
type: discovery
|
|
220
|
+
parameters:
|
|
221
|
+
resources:
|
|
222
|
+
- DERControl
|
|
223
|
+
checks:
|
|
224
|
+
- type: der-control
|
|
225
|
+
parameters:
|
|
226
|
+
maximum_count: 0 # Empty list of controls
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
################################## TEST SECTION 3 - SUPERSEEDED ##################################
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
- id: (6) DERControl 3
|
|
233
|
+
repeat_until_pass: true
|
|
234
|
+
client: client
|
|
235
|
+
instructions:
|
|
236
|
+
- The utility server is configured with an active control with opModExpLimW and opModImpLimW = 200% of the DERs rated active power, responseRequired = 03 and replyTo set to the response endpoint on the test utility server, to begin in 10 minutes.
|
|
237
|
+
action:
|
|
238
|
+
type: discovery
|
|
239
|
+
parameters:
|
|
240
|
+
resources:
|
|
241
|
+
- DERControl
|
|
242
|
+
checks:
|
|
243
|
+
- type: der-control
|
|
244
|
+
parameters:
|
|
245
|
+
minimum_count: 1
|
|
246
|
+
maximum_count: 1
|
|
247
|
+
opModExpLimW: $(setMaxW * 2)
|
|
248
|
+
opModImpLimW: $(setMaxW * 2)
|
|
249
|
+
responseRequired: 3
|
|
250
|
+
# replyTo should also be set but this check is implicit in later communications
|
|
251
|
+
event_status: 0 # Scheduled
|
|
252
|
+
# start time should be set to 10 mins but we do not check here
|
|
253
|
+
|
|
254
|
+
- id: (6b) Respond to scheduled DERControl 3
|
|
255
|
+
client: client
|
|
256
|
+
action:
|
|
257
|
+
type: respond-der-controls # Respond status = 1 (received).
|
|
258
|
+
|
|
259
|
+
- id: (7) DERControl 3 - Cancel
|
|
260
|
+
repeat_until_pass: true
|
|
261
|
+
client: client
|
|
262
|
+
instructions:
|
|
263
|
+
- The utility server is configured to cancel the scheduled control before it is active.
|
|
264
|
+
action:
|
|
265
|
+
type: refresh-resource
|
|
266
|
+
parameters:
|
|
267
|
+
resource: DERControl
|
|
268
|
+
checks:
|
|
269
|
+
- type: der-control
|
|
270
|
+
parameters:
|
|
271
|
+
minimum_count: 1
|
|
272
|
+
maximum_count: 1
|
|
273
|
+
opModExpLimW: $(setMaxW * 2)
|
|
274
|
+
opModImpLimW: $(setMaxW * 2)
|
|
275
|
+
responseRequired: 3
|
|
276
|
+
event_status: 2 # Cancelled
|
|
277
|
+
|
|
278
|
+
- id: (7b) Respond to cancelled DERControl 3
|
|
279
|
+
client: client
|
|
280
|
+
action:
|
|
281
|
+
type: respond-der-controls # Will post control response status = 6 (cancelled).
|
|
282
|
+
|
|
283
|
+
- id: (8) DERControl 4
|
|
284
|
+
repeat_until_pass: true
|
|
285
|
+
client: client
|
|
286
|
+
instructions:
|
|
287
|
+
- The utility server configures an active control with opModExpLimW and opModImpLimW = 200% of the DERs rated active power to begin in 10 minutes.
|
|
288
|
+
action:
|
|
289
|
+
type: refresh-resource
|
|
290
|
+
parameters:
|
|
291
|
+
resource: DERControl
|
|
292
|
+
checks:
|
|
293
|
+
- type: der-control
|
|
294
|
+
parameters:
|
|
295
|
+
minimum_count: 1
|
|
296
|
+
maximum_count: 1
|
|
297
|
+
opModExpLimW: $(setMaxW * 2)
|
|
298
|
+
opModImpLimW: $(setMaxW * 2)
|
|
299
|
+
event_status: 0 # Scheduled
|
|
300
|
+
|
|
301
|
+
- id: (8b) Respond to scheduled DERControl 4
|
|
302
|
+
client: client
|
|
303
|
+
action:
|
|
304
|
+
type: respond-der-controls # Will post control response status = 1 (received).
|
|
305
|
+
|
|
306
|
+
- id: (9) DERControl 5
|
|
307
|
+
repeat_until_pass: true
|
|
308
|
+
client: client
|
|
309
|
+
instructions:
|
|
310
|
+
- The utility server configures an active control with the same primacy and an overlapping control window.
|
|
311
|
+
action:
|
|
312
|
+
type: refresh-resource
|
|
313
|
+
parameters:
|
|
314
|
+
resource: DERControl
|
|
315
|
+
checks:
|
|
316
|
+
- type: der-control
|
|
317
|
+
parameters:
|
|
318
|
+
minimum_count: 1 # The control above should now be set to superseeded not scheduled, so still only one expected.
|
|
319
|
+
maximum_count: 1
|
|
320
|
+
opModExpLimW: $(setMaxW * 2)
|
|
321
|
+
opModImpLimW: $(setMaxW * 2)
|
|
322
|
+
event_status: 0 # Scheduled
|
|
323
|
+
|
|
324
|
+
- id: (9b) Respond to scheduled DERControls 4 and 5
|
|
325
|
+
client: client
|
|
326
|
+
action:
|
|
327
|
+
type: respond-der-controls # Send both: control 4 (7 superseeded), and control 5 (1 scheduled).
|
|
328
|
+
|
|
329
|
+
- id: (9c) Check DERControl 4 is superseeded
|
|
330
|
+
repeat_until_pass: true
|
|
331
|
+
client: client
|
|
332
|
+
action:
|
|
333
|
+
type: refresh-resource
|
|
334
|
+
parameters:
|
|
335
|
+
resource: DERControl
|
|
336
|
+
checks:
|
|
337
|
+
- type: der-control
|
|
338
|
+
parameters:
|
|
339
|
+
opModExpLimW: $(setMaxW * 2)
|
|
340
|
+
opModImpLimW: $(setMaxW * 2)
|
|
341
|
+
event_status: 4 # Superseeded
|
|
342
|
+
minimum_count: 1
|
|
343
|
+
maximum_count: 1
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
Description: Delayed Response to Cancelled Export Control
|
|
2
|
+
Category: Control
|
|
3
|
+
Classes:
|
|
4
|
+
- A
|
|
5
|
+
|
|
6
|
+
TargetVersions:
|
|
7
|
+
- v1.2
|
|
8
|
+
|
|
9
|
+
Preconditions:
|
|
10
|
+
required_clients:
|
|
11
|
+
- id: client
|
|
12
|
+
|
|
13
|
+
Steps:
|
|
14
|
+
- id: (A) PRECONDITION
|
|
15
|
+
repeat_until_pass: true
|
|
16
|
+
client: client
|
|
17
|
+
instructions:
|
|
18
|
+
- The client has a DER that is exporting at the connection point at least 50% of its rated active power.
|
|
19
|
+
- The utility server has a current active control in operation with opModExpLimW set to 200% of the DER's rated active power, and a default DER control in-place with opModExpLimW set to 30% of the DER's rated active power.
|
|
20
|
+
action:
|
|
21
|
+
type: discovery
|
|
22
|
+
parameters:
|
|
23
|
+
resources:
|
|
24
|
+
- EndDevice
|
|
25
|
+
- DERControl
|
|
26
|
+
- DefaultDERControl
|
|
27
|
+
checks:
|
|
28
|
+
- type: end-device
|
|
29
|
+
parameters:
|
|
30
|
+
matches_client: true
|
|
31
|
+
- type: der-control
|
|
32
|
+
parameters:
|
|
33
|
+
minimum_count: 1
|
|
34
|
+
maximum_count: 1
|
|
35
|
+
opModExpLimW: $(setMaxW * 2)
|
|
36
|
+
event_status: 1 # Active
|
|
37
|
+
- type: default-der-control
|
|
38
|
+
parameters:
|
|
39
|
+
opModExpLimW: $(setMaxW * 0.3)
|
|
40
|
+
|
|
41
|
+
- id: (1) Cancel active controls
|
|
42
|
+
repeat_until_pass: True
|
|
43
|
+
instructions: The server should set all active controls to cancelled.
|
|
44
|
+
client: client
|
|
45
|
+
action:
|
|
46
|
+
type: refresh-resource
|
|
47
|
+
parameters:
|
|
48
|
+
resource: DERControl
|
|
49
|
+
checks:
|
|
50
|
+
- type: der-control # Check event status has been updated
|
|
51
|
+
parameters:
|
|
52
|
+
minimum_count: 1
|
|
53
|
+
maximum_count: 1
|
|
54
|
+
opModExpLimW: $(setMaxW * 2)
|
|
55
|
+
event_status: 2 # Cancelled
|
|
56
|
+
|
|
57
|
+
- id: WAIT to see that cancelled responses are not immediately removed
|
|
58
|
+
client: client
|
|
59
|
+
action:
|
|
60
|
+
type: wait
|
|
61
|
+
parameters:
|
|
62
|
+
duration_seconds: 60
|
|
63
|
+
|
|
64
|
+
- id: (2) CHECK to see that cancelled responses are not immediately removed
|
|
65
|
+
client: client
|
|
66
|
+
action:
|
|
67
|
+
type: refresh-resource
|
|
68
|
+
parameters:
|
|
69
|
+
resource: DERControl
|
|
70
|
+
checks:
|
|
71
|
+
- type: der-control
|
|
72
|
+
parameters:
|
|
73
|
+
minimum_count: 1
|
|
74
|
+
maximum_count: 1
|
|
75
|
+
opModExpLimW: $(setMaxW * 2)
|
|
76
|
+
event_status: 2 # Cancelled
|
|
77
|
+
|
|
78
|
+
- id: (3) Response
|
|
79
|
+
client: client
|
|
80
|
+
action:
|
|
81
|
+
type: respond-der-controls # send response status = 6 (Cancelled)
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
Description: Update Poll Rates
|
|
2
|
+
Category: Control
|
|
3
|
+
Classes:
|
|
4
|
+
- A
|
|
5
|
+
|
|
6
|
+
TargetVersions:
|
|
7
|
+
- v1.2
|
|
8
|
+
|
|
9
|
+
Preconditions:
|
|
10
|
+
required_clients:
|
|
11
|
+
- id: client
|
|
12
|
+
|
|
13
|
+
Steps:
|
|
14
|
+
- id: (A) PRECONDITION
|
|
15
|
+
repeat_until_pass: true
|
|
16
|
+
client: client
|
|
17
|
+
instructions:
|
|
18
|
+
- The client has a device with DeviceCapability, EndDeviceList and FunctionSetAssignmentsList poll-rate set to 300s, DERProgramList, DERList and MirrorUsagePoint to 60s.
|
|
19
|
+
action:
|
|
20
|
+
type: discovery
|
|
21
|
+
parameters:
|
|
22
|
+
resources:
|
|
23
|
+
- EndDevice
|
|
24
|
+
- DeviceCapability
|
|
25
|
+
- EndDeviceList
|
|
26
|
+
- FunctionSetAssignmentsList
|
|
27
|
+
- DERProgramList
|
|
28
|
+
- DERList
|
|
29
|
+
- MirrorUsagePoint
|
|
30
|
+
checks:
|
|
31
|
+
- type: poll-rate
|
|
32
|
+
parameters:
|
|
33
|
+
resource: DeviceCapability
|
|
34
|
+
poll_rate_seconds: 300
|
|
35
|
+
- type: poll-rate
|
|
36
|
+
parameters:
|
|
37
|
+
resource: EndDeviceList
|
|
38
|
+
poll_rate_seconds: 300
|
|
39
|
+
- type: poll-rate
|
|
40
|
+
parameters:
|
|
41
|
+
resource: FunctionSetAssignmentsList
|
|
42
|
+
poll_rate_seconds: 300
|
|
43
|
+
- type: poll-rate
|
|
44
|
+
parameters:
|
|
45
|
+
resource: DERProgramList
|
|
46
|
+
poll_rate_seconds: 60
|
|
47
|
+
- type: poll-rate
|
|
48
|
+
parameters:
|
|
49
|
+
resource: DERList
|
|
50
|
+
poll_rate_seconds: 60
|
|
51
|
+
- type: poll-rate
|
|
52
|
+
parameters:
|
|
53
|
+
resource: MirrorUsagePoint
|
|
54
|
+
poll_rate_seconds: 60
|
|
55
|
+
|
|
56
|
+
- id: (1) UPDATE DeviceCapability poll-rate
|
|
57
|
+
repeat_until_pass: true
|
|
58
|
+
client: client
|
|
59
|
+
instructions:
|
|
60
|
+
- Set DeviceCapabilitypoll poll rate to 60s.
|
|
61
|
+
action:
|
|
62
|
+
type: refresh-resource
|
|
63
|
+
parameters:
|
|
64
|
+
resource: DeviceCapability
|
|
65
|
+
checks:
|
|
66
|
+
- type: poll-rate
|
|
67
|
+
parameters:
|
|
68
|
+
resource: DeviceCapability
|
|
69
|
+
poll_rate_seconds: 60
|
|
70
|
+
|
|
71
|
+
- id: (2) UPDATE EndDeviceList poll-rate
|
|
72
|
+
repeat_until_pass: true
|
|
73
|
+
client: client
|
|
74
|
+
instructions:
|
|
75
|
+
- Set EndDeviceList poll rate to 60s.
|
|
76
|
+
action:
|
|
77
|
+
type: refresh-resource
|
|
78
|
+
parameters:
|
|
79
|
+
resource: EndDeviceList
|
|
80
|
+
checks:
|
|
81
|
+
- type: poll-rate
|
|
82
|
+
parameters:
|
|
83
|
+
resource: EndDeviceList
|
|
84
|
+
poll_rate_seconds: 60
|
|
85
|
+
|
|
86
|
+
- id: (3) UPDATE FunctionSetAssignments poll-rate
|
|
87
|
+
repeat_until_pass: true
|
|
88
|
+
client: client
|
|
89
|
+
instructions:
|
|
90
|
+
- Set FunctionSetAssignments poll rate to 60s.
|
|
91
|
+
action:
|
|
92
|
+
type: refresh-resource
|
|
93
|
+
parameters:
|
|
94
|
+
resource: FunctionSetAssignments
|
|
95
|
+
checks:
|
|
96
|
+
- type: poll-rate
|
|
97
|
+
parameters:
|
|
98
|
+
resource: FunctionSetAssignments
|
|
99
|
+
poll_rate_seconds: 60
|
|
100
|
+
|
|
101
|
+
- id: (4) UPDATE DERProgramList poll-rate
|
|
102
|
+
repeat_until_pass: true
|
|
103
|
+
client: client
|
|
104
|
+
instructions:
|
|
105
|
+
- Set DERProgramList poll rate to 120s.
|
|
106
|
+
action:
|
|
107
|
+
type: refresh-resource
|
|
108
|
+
parameters:
|
|
109
|
+
resource: DERProgramList
|
|
110
|
+
checks:
|
|
111
|
+
- type: poll-rate
|
|
112
|
+
parameters:
|
|
113
|
+
resource: DERProgramList
|
|
114
|
+
poll_rate_seconds: 120
|
|
115
|
+
|
|
116
|
+
- id: (5) UPDATE DERList poll-rate
|
|
117
|
+
repeat_until_pass: true
|
|
118
|
+
client: client
|
|
119
|
+
instructions:
|
|
120
|
+
- Set DERList poll rate to 120s.
|
|
121
|
+
action:
|
|
122
|
+
type: refresh-resource
|
|
123
|
+
parameters:
|
|
124
|
+
resource: DERList
|
|
125
|
+
checks:
|
|
126
|
+
- type: poll-rate
|
|
127
|
+
parameters:
|
|
128
|
+
resource: DERList
|
|
129
|
+
poll_rate_seconds: 120
|
|
130
|
+
|
|
131
|
+
- id: (6) UPDATE MirrorUsagePoint poll-rate
|
|
132
|
+
repeat_until_pass: true
|
|
133
|
+
client: client
|
|
134
|
+
instructions:
|
|
135
|
+
- Set MirrorUsagePoint poll rate to 120s.
|
|
136
|
+
action:
|
|
137
|
+
type: refresh-resource
|
|
138
|
+
parameters:
|
|
139
|
+
resource: MirrorUsagePoint
|
|
140
|
+
checks:
|
|
141
|
+
- type: poll-rate
|
|
142
|
+
parameters:
|
|
143
|
+
resource: MirrorUsagePoint
|
|
144
|
+
poll_rate_seconds: 120
|
|
145
|
+
|
|
146
|
+
|