big file storage

This commit is contained in:
Nathan Rashleigh committed 2026-09-18 23:22:55 +10:00
1 parent 91fe0211d4
commit 9b11a4ded6
1265 files changed
+149378 -60

No files matched your search

@@ -0,0 +1,433 @@
## Concept
SiteCT is an instance of what SwD calls an `Assurance`
`Assurances` are essentially runtime validations of arbitrary behaviours concerning a client device or utility server itself.
Some examples:
- Validating a device is responding to `DERControl` commands by checking for `DERControlResponses` and `MirrorMeterReadings` (SiteCT)
- Checking that an aggregator is respecting its set `Post/Poll Rates`
- Confirming the UTSRV is generating correct `DERControlLists`
## Structure
`Assurances` have 3 phases:
1. Setup
2. Execution
3. Teardown
By way of example, in SiteCT these phases have (at time of writing) steps:
1. Setup
- Reduce `ControlPollRate` `MeteringListPollRate` and `MeteringListPostRate` to 60s
- This ensures the device or aggregator responds more quickly to the test and reduces the time the installer has to wait for the test to complete.
2. Execution
- The execution consists of the criteria specified in the `AssuranceSiteCTExportLimitTelemetry` :
- Assign target device a `DefaultDERControl exportLimit=1500W`
- Confirm the device is exporting ~1500W
- Assign the target device a `DERControl exportLimit=0W`
3. Teardown
- Reset the device's post and polling rates
## Events - Successful SiteCT
Events are `POST`ed to `APIM` as they happen.
The `id` UUID identifies an individual Assurance
The **latest updated time telemetry** should be considered the source of truth.
What follows are the messages delivered to APIM throughout a SiteCT Export limit test being carried out against the device with LFDI `56a642ff591d939b5f1251bded4d591100052956`
### Setup
Initially the `AssuranceSiteCTTelemetry` is empty. All the criteria are pending, all the messages are empty:
```json
{
"id": "77dd28a4-697f-49de-af7f-8e608761f230",
"lFDI": "56a642ff591d939b5f1251bded4d591100052956",
"created": "2025-08-25T01:45:57.339610Z",
"updated": "2025-08-25T01:45:57.339615Z",
"status": "pending",
"message": "",
"name": "sitectexportlimit",
"criteria": {
"a": {
"updated": "2025-08-25T01:45:57.339627Z",
"description": "Wait for a MirrorMeterReading event (POST) for (Site or DER) Real Power within specified range [CRITERIA A]",
"result": null,
"message": "",
"status": "pending"
},
"b": {
"updated": "2025-08-25T01:45:57.339637Z",
"description": "Wait for a DERControlResponse event (POST) to confirm the limit control was received [CRITERIA B]",
"result": null,
"message": "",
"status": "pending"
},
"c": {
"updated": "2025-08-25T01:45:57.339641Z",
"description": "Wait for a DERControlResponse event (POST) to confirm the limit control was started [CRITERIA C]",
"result": null,
"message": "",
"status": "pending"
},
"d": {
"updated": "2025-08-25T01:45:57.339646Z",
"description": "Wait for a MirrorMeterReading event (POST) for (Site or DER) Real Power to be within the limited (0) range [CRITERIA D]",
"result": null,
"message": "",
"status": "pending"
},
"e": {
"updated": "2025-08-25T01:45:57.339650Z",
"description": "Wait for a DERControlResponse event (POST) to confirm the control was completed [CRITERIA E]",
"result": null,
"message": "",
"status": "pending"
}
}
}
```
### Criteria A
The test begins and the server fills out some details, such as the mRID of the control it is expecting the device to respond to: `1e3584919ce1f6e175d72f9900054666`
The device then posts a MMR showing that it is conforming to its `DefaultDERControl`.
This reading actually predates the test initiation as you can see by the `start` time; the aggregator has delivered it in the latest batch of readings from the last few minutes.
It is unimportant as we're simply confirming the device is respecting its default control and able to export.
```json
{
"id": "77dd28a4-697f-49de-af7f-8e608761f230",
"lFDI": "56a642ff591d939b5f1251bded4d591100052956",
"created": "2025-08-25T01:45:57.339610Z",
"updated": "2025-08-25T01:45:57.339615Z",
"status": "pending",
"message": "Test Started",
"name": "sitectexportlimit",
"criteria": {
"a": {
"updated": "2025-08-25T01:46:08.449832Z",
"description": "Wait for a MirrorMeterReading event (POST) for (Site or DER) Real Power within specified range [CRITERIA A]",
"result": {
"value": 1494.58,
"start": "2025-08-25T01:44:55.732Z",
"duration": "P3D",
"unit": "watt",
"type": "siterealpower"
},
"message": "Site is reporting generation of -1494.58W.",
"status": "success"
},
"b": {
"updated": "2025-08-25T01:45:57.339637Z",
"description": "Wait for a DERControlResponse event (POST) to confirm the limit control was received [CRITERIA B]",
"result": null,
"message": "Awaiting RECEIVED response for mRID 1e3584919ce1f6e175d72f9900054666",
"status": "pending"
},
"c": {
"updated": "2025-08-25T01:45:57.339641Z",
"description": "Wait for a DERControlResponse event (POST) to confirm the limit control was started [CRITERIA C]",
"result": null,
"message": "Awaiting STARTED response for mRID 1e3584919ce1f6e175d72f9900054666",
"status": "pending"
},
"d": {
"updated": "2025-08-25T01:45:57.339646Z",
"description": "Wait for a MirrorMeterReading event (POST) for (Site or DER) Real Power to be within the limited (0) range [CRITERIA D]",
"result": null,
"message": "",
"status": "pending"
},
"e": {
"updated": "2025-08-25T01:45:57.339650Z",
"description": "Wait for a DERControlResponse event (POST) to confirm the control was completed [CRITERIA E]",
"result": null,
"message": "Awaiting COMPLETED response for mRID 1e3584919ce1f6e175d72f9900054666",
"status": "pending"
}
}
}
```
### Criteria B
After ~2m the aggregator notifies the UTSRV that the device has received the control to reduce its export to 0W.
This significant delay is one of the reasons why the `ControlListPoll` rate is reduced at the start of the test. The client is instructed to fetch this list every minute, but they do not always comply.
```json
{
"id": "77dd28a4-697f-49de-af7f-8e608761f230",
"lFDI": "56a642ff591d939b5f1251bded4d591100052956",
"created": "2025-08-25T01:45:57.339610Z",
"updated": "2025-08-25T01:45:57.339615Z",
"status": "pending",
"message": "Test Started",
"name": "sitectexportlimit",
"criteria": {
"a": {
"updated": "2025-08-25T01:45:57.339627Z",
"description": "Wait for a MirrorMeterReading event (POST) for (Site or DER) Real Power within specified range [CRITERIA A]",
"result": {
"value": 1494.58,
"start": "2025-08-25T01:44:55.732Z",
"duration": "P3D",
"unit": "watt",
"type": "siterealpower"
},
"message": "Site is reporting generation of -1494.58W.",
"status": "success"
},
"b": {
"updated": "2025-08-25T01:47:44.44667Z",
"description": "Wait for a DERControlResponse event (POST) to confirm the limit control was received [CRITERIA B]",
"result": {
"createdDateTime": "2025-08-25T01:47:44Z",
"endDeviceLFDI": "56a642ff591d939b5f1251bded4d591100052956",
"subject": "1e3584919ce1f6e175d72f9900054666",
"status": 1
},
"message": "Site has received controlId 1e3584919ce1f6e175d72f9900054666",
"status": "success"
},
"c": {
"updated": "2025-08-25T01:45:57.339641Z",
"description": "Wait for a DERControlResponse event (POST) to confirm the limit control was started [CRITERIA C]",
"result": null,
"message": "Awaiting STARTED response for mRID 1e3584919ce1f6e175d72f9900054666",
"status": "pending"
},
"d": {
"updated": "2025-08-25T01:45:57.339646Z",
"description": "Wait for a MirrorMeterReading event (POST) for (Site or DER) Real Power to be within the limited (0) range [CRITERIA D]",
"result": null,
"message": "",
"status": "pending"
},
"e": {
"updated": "2025-08-25T01:45:57.339650Z",
"description": "Wait for a DERControlResponse event (POST) to confirm the control was completed [CRITERIA E]",
"result": null,
"message": "Awaiting COMPLETED response for mRID 1e3584919ce1f6e175d72f9900054666",
"status": "pending"
}
}
}
```
### Criteria C
A few seconds later, the device reports it has started the curtailment control.
```json
{
"id": "77dd28a4-697f-49de-af7f-8e608761f230",
"lFDI": "56a642ff591d939b5f1251bded4d591100052956",
"created": "2025-08-25T01:45:57.339610Z",
"updated": "2025-08-25T01:47:47.322671Z",
"status": "pending",
"message": "Test Started",
"name": "sitectexportlimit",
"criteria": {
"a": {
"updated": "2025-08-25T01:45:57.339627Z",
"description": "Wait for a MirrorMeterReading event (POST) for (Site or DER) Real Power within specified range [CRITERIA A]",
"result": {
"value": 1494.58,
"start": "2025-08-25T01:44:55.732Z",
"duration": "P3D",
"unit": "watt",
"type": "siterealpower"
},
"message": "Site is reporting generation of -1494.58W.",
"status": "success"
},
"b": {
"updated": "2025-08-25T01:47:44.44667Z",
"description": "Wait for a DERControlResponse event (POST) to confirm the limit control was received [CRITERIA B]",
"result": {
"createdDateTime": "2025-08-25T01:47:44Z",
"endDeviceLFDI": "56a642ff591d939b5f1251bded4d591100052956",
"subject": "1e3584919ce1f6e175d72f9900054666",
"status": 1
},
"message": "Site has received controlId 1e3584919ce1f6e175d72f9900054666",
"status": "success"
},
"c": {
"updated": "2025-08-25T01:47:47.322671Z",
"description": "Wait for a DERControlResponse event (POST) to confirm the limit control was started [CRITERIA C]",
"result": {
"createdDateTime": "2025-08-25T01:47:47Z",
"endDeviceLFDI": "56a642ff591d939b5f1251bded4d591100052956",
"subject": "1e3584919ce1f6e175d72f9900054666",
"status": 2
},
"message": "Site has started controlId 1e3584919ce1f6e175d72f9900054666",
"status": "success"
},
"d": {
"updated": "2025-08-25T01:45:57.339646Z",
"description": "Wait for a MirrorMeterReading event (POST) for (Site or DER) Real Power to be within the limited (0) range [CRITERIA D]",
"result": null,
"message": "",
"status": "pending"
},
"e": {
"updated": "2025-08-25T01:45:57.339650Z",
"description": "Wait for a DERControlResponse event (POST) to confirm the control was completed [CRITERIA E]",
"result": null,
"message": "Awaiting COMPLETED response for mRID 1e3584919ce1f6e175d72f9900054666",
"status": "pending"
}
}
}
```
### Criteria D
The site reports reduced generation:
```json
{
"id": "77dd28a4-697f-49de-af7f-8e608761f230",
"lFDI": "56a642ff591d939b5f1251bded4d591100052956",
"created": "2025-08-25T01:45:57.339610Z",
"updated": "2025-08-25T01:47:47.322671Z",
"status": "pending",
"message": "Test Started",
"name": "sitectexportlimit",
"criteria": {
"a": {
"updated": "2025-08-25T01:45:57.339627Z",
"description": "Wait for a MirrorMeterReading event (POST) for (Site or DER) Real Power within specified range [CRITERIA A]",
"result": {
"value": 1494.58,
"start": "2025-08-25T01:44:55.732Z",
"duration": "P3D",
"unit": "watt",
"type": "siterealpower"
},
"message": "Site is reporting generation of -1494.58W.",
"status": "success"
},
"b": {
"updated": "2025-08-25T01:47:44.44667Z",
"description": "Wait for a DERControlResponse event (POST) to confirm the limit control was received [CRITERIA B]",
"result": {
"createdDateTime": "2025-08-25T01:47:44Z",
"endDeviceLFDI": "56a642ff591d939b5f1251bded4d591100052956",
"subject": "1e3584919ce1f6e175d72f9900054666",
"status": 1
},
"message": "Site has received controlId 1e3584919ce1f6e175d72f9900054666",
"status": "success"
},
"c": {
"updated": "2025-08-25T01:47:47.322671Z",
"description": "Wait for a DERControlResponse event (POST) to confirm the limit control was started [CRITERIA C]",
"result": {
"createdDateTime": "2025-08-25T01:47:47Z",
"endDeviceLFDI": "56a642ff591d939b5f1251bded4d591100052956",
"subject": "1e3584919ce1f6e175d72f9900054666",
"status": 2
},
"message": "Site has started controlId 1e3584919ce1f6e175d72f9900054666",
"status": "success"
},
"d": {
"updated": "2025-08-25T01:45:57.339646Z",
"description": "Wait for a MirrorMeterReading event (POST) for (Site or DER) Real Power to be within the limited (0) range [CRITERIA D]",
"result": {
"value": -6.2540000000000004,
"start": "2025-08-25T23:37:43.732Z",
"duration": "P3D",
"unit": "watt",
"type": "siterealpower"
},
"message": "Site has reduced generation to -6.2540000000000004W.",
"status": "success"
},
"e": {
"updated": "2025-08-25T01:45:57.339650Z",
"description": "Wait for a DERControlResponse event (POST) to confirm the control was completed [CRITERIA E]",
"result": null,
"message": "Awaiting COMPLETED response for mRID 1e3584919ce1f6e175d72f9900054666",
"status": "pending"
}
}
}
```
### Criteria E - Completed
The device reports completing the curtailment control and the Assurance is marked as `Success`
```json
{
"id": "77dd28a4-697f-49de-af7f-8e608761f230",
"lFDI": "56a642ff591d939b5f1251bded4d591100052956",
"created": "2025-08-25T01:45:57.339610Z",
"updated": "2025-08-25T01:56:09.339650Z",
"status": "success",
"message": "Assurance Complete",
"name": "sitectexportlimit",
"criteria": {
"a": {
"updated": "2025-08-25T01:45:57.339627Z",
"description": "Wait for a MirrorMeterReading event (POST) for (Site or DER) Real Power within specified range [CRITERIA A]",
"result": {
"value": 1494.58,
"start": "2025-08-25T01:44:55.732Z",
"duration": "P3D",
"unit": "watt",
"type": "siterealpower"
},
"message": "Site is reporting generation of -1494.58W.",
"status": "success"
},
"b": {
"updated": "2025-08-25T01:47:44.44667Z",
"description": "Wait for a DERControlResponse event (POST) to confirm the limit control was received [CRITERIA B]",
"result": {
"createdDateTime": "2025-08-25T01:47:44Z",
"endDeviceLFDI": "56a642ff591d939b5f1251bded4d591100052956",
"subject": "1e3584919ce1f6e175d72f9900054666",
"status": 1
},
"message": "Site has received controlId 1e3584919ce1f6e175d72f9900054666",
"status": "success"
},
"c": {
"updated": "2025-08-25T01:47:47.322671Z",
"description": "Wait for a DERControlResponse event (POST) to confirm the limit control was started [CRITERIA C]",
"result": {
"createdDateTime": "2025-08-25T01:47:47Z",
"endDeviceLFDI": "56a642ff591d939b5f1251bded4d591100052956",
"subject": "1e3584919ce1f6e175d72f9900054666",
"status": 2
},
"message": "Site has started controlId 1e3584919ce1f6e175d72f9900054666",
"status": "success"
},
"d": {
"updated": "2025-08-25T01:47:58.251646Z",
"description": "Wait for a MirrorMeterReading event (POST) for (Site or DER) Real Power to be within the limited (0) range [CRITERIA D]",
"result": {
"value": -6.2540000000000004,
"start": "2025-08-25T01:47:57.555Z",
"duration": "P3D",
"unit": "watt",
"type": "siterealpower"
},
"message": "Site has reduced generation to -6.2540000000000004W.",
"status": "success"
},
"e": {
"updated": "2025-08-25T01:56:09.339650Z",
"description": "Wait for a DERControlResponse event (POST) to confirm the control was completed [CRITERIA E]",
"result": {
"createdDateTime": "2025-08-25T01:56:09Z",
"endDeviceLFDI": "56a642ff591d939b5f1251bded4d591100052956",
"subject": "1e3584919ce1f6e175d72f9900054666",
"status": 3
},
"message": "Site has completed controlId 1e3584919ce1f6e175d72f9900054666",
"status": "success"
}
}
}
```
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large. Load diff