diff --git a/docs/source/using_gridappsd/Developing_Apps.rst b/docs/source/using_gridappsd/Developing_Apps.rst index c39373f..75bcdb7 100644 --- a/docs/source/using_gridappsd/Developing_Apps.rst +++ b/docs/source/using_gridappsd/Developing_Apps.rst @@ -15,7 +15,7 @@ For example of an application working with GridAPPS-D, please see: https://githu Following is the recommended structure for applications working with GridAPPS-D using gridappsd-sample-app as an example: :: - + . └── gridappsd-sample_app ├── sample-app @@ -254,11 +254,11 @@ Example config for service: 2. Clone the repository https://github.com/GRIDAPPSD/gridappsd-docker (refered to as gridappsd-docker repository) next to this repository (they should both have the same parent folder) :: - + . ├── gridappsd-docker └── gridappsd-sample-app - + 3. Add service or service to platform @@ -269,7 +269,7 @@ Adding these lines will mount the service/service on the container's filesystem For service: :: - + # volumes: # - ~/git/gridappsd-sample-app/sample_app:/gridappsd/services/sample_app # - ~/git/gridappsd-sample-app/sample_app/sample_app.config:/gridappsd/services/sample_app.config @@ -281,7 +281,7 @@ For service: For service: :: - + # volumes: # - ~/git/gridappsd-sample-app/sample_app:/gridappsd/services/sample_app # - ~/git/gridappsd-sample-app/sample_app/sample_app.config:/gridappsd/services/sample_app.config diff --git a/docs/source/using_gridappsd/EventClassDiagram.png b/docs/source/using_gridappsd/EventClassDiagram.png new file mode 100644 index 0000000..e677ab0 Binary files /dev/null and b/docs/source/using_gridappsd/EventClassDiagram.png differ diff --git a/docs/source/using_gridappsd/TestConfigClassDiagram.png b/docs/source/using_gridappsd/TestConfigClassDiagram.png new file mode 100644 index 0000000..366da10 Binary files /dev/null and b/docs/source/using_gridappsd/TestConfigClassDiagram.png differ diff --git a/docs/source/using_gridappsd/TestResultClassDiagram.png b/docs/source/using_gridappsd/TestResultClassDiagram.png new file mode 100644 index 0000000..03f5dee Binary files /dev/null and b/docs/source/using_gridappsd/TestResultClassDiagram.png differ diff --git a/docs/source/using_gridappsd/expected_vs_timeseries.png b/docs/source/using_gridappsd/expected_vs_timeseries.png new file mode 100644 index 0000000..a5a5b9e Binary files /dev/null and b/docs/source/using_gridappsd/expected_vs_timeseries.png differ diff --git a/docs/source/using_gridappsd/index.rst b/docs/source/using_gridappsd/index.rst index 34b6f4a..3ba6b98 100644 --- a/docs/source/using_gridappsd/index.rst +++ b/docs/source/using_gridappsd/index.rst @@ -23,11 +23,11 @@ Applications and services can use either publish/subscribe mechanism or Python A Publish/Subscribe mechanism can be implemented using any of the language bindings for ActiveMQ messaging framework. -Python API wraps the publish/subscribe messaging and makes the interaction easier for Python apps/services. -For more information on Python API and how to use it, look at https://github.com/GRIDAPPSD/gridappsd-python and -https://github.com/GRIDAPPSD/gridappsd-sample-app. +Python API wraps the publish/subscribe messaging and makes the interaction easier for Python apps/services. +For more information on Python API and how to use it, look at https://github.com/GRIDAPPSD/gridappsd-python and +https://github.com/GRIDAPPSD/gridappsd-sample-app. -Following sections describe the messaging APIs and the corresponding Python API function to interact with platform. +Following sections describe the messaging APIs and the corresponding Python API function to interact with platform. Where no Python API function is mentioned, following generic functions can be used. :: @@ -76,3 +76,13 @@ Hosting Application ------------------- .. include:: Developing_Apps.rst + +Test Manager Events +------------------- + +.. include:: test_manager_events.rst + +Test Manager +------------ + +.. include:: test_manager.rst diff --git a/docs/source/using_gridappsd/rc1_overview.rst b/docs/source/using_gridappsd/rc1_overview.rst index 6e72883..437ac37 100644 --- a/docs/source/using_gridappsd/rc1_overview.rst +++ b/docs/source/using_gridappsd/rc1_overview.rst @@ -17,7 +17,30 @@ Now we are inside the executing container. Start the platform. .. -Open your browser to http://localhost:8080/ and click the menu button. +Visualization Tool +------------------ + +Go to http://localhost:8080/ in your browswer and login. + +Click the settings(three vertical dots) on top right to select the visualization theme, +enable/diasable logging and choose timezone. + +.. figure:: settings_menu.png + :align: left + :alt: menu-image + :figclass: align-left + :figwidth: 100% + + +.. figure:: select_setting.png + :align: left + :alt: menu-select-image + :figclass: align-left + :scale: 50% + :figwidth: 100% + + +Click the menu button on the top left for the Visualization Menu. .. figure:: home.png :align: left diff --git a/docs/source/using_gridappsd/select_setting.png b/docs/source/using_gridappsd/select_setting.png new file mode 100644 index 0000000..cd28ccc Binary files /dev/null and b/docs/source/using_gridappsd/select_setting.png differ diff --git a/docs/source/using_gridappsd/settings_menu.png b/docs/source/using_gridappsd/settings_menu.png new file mode 100644 index 0000000..058429b Binary files /dev/null and b/docs/source/using_gridappsd/settings_menu.png differ diff --git a/docs/source/using_gridappsd/simulation_vs_expected.png b/docs/source/using_gridappsd/simulation_vs_expected.png new file mode 100644 index 0000000..a8b75ea Binary files /dev/null and b/docs/source/using_gridappsd/simulation_vs_expected.png differ diff --git a/docs/source/using_gridappsd/simulation_vs_timeseries.png b/docs/source/using_gridappsd/simulation_vs_timeseries.png new file mode 100644 index 0000000..c63dc4f Binary files /dev/null and b/docs/source/using_gridappsd/simulation_vs_timeseries.png differ diff --git a/docs/source/using_gridappsd/test_manager.rst b/docs/source/using_gridappsd/test_manager.rst new file mode 100644 index 0000000..58fe9bb --- /dev/null +++ b/docs/source/using_gridappsd/test_manager.rst @@ -0,0 +1,245 @@ +The Test Manager is responsible for testing an application or service against different events or scenarios. +The Test Manager Configuration is sent as part of the RequestSimulation. The expected results and events are sent to the Test Manager for processing. + +Test Configuration +^^^^^^^^^^^^^^^^^^ + +The test configuration contains: + +#. The application ID which is the name of the application. +#. The testId with will be generated if one is not provided. +#. The test type with is one of the following "simulation_vs_expected", "simulation_vs_timeseries", "expected_vs_timeseries", or "timeseries_vs_timeseries" +#. The compareWithSimId which is the simulation ID to compare against in the timeseries DB. +#. The compareWithSimIdTwo which is the second simulation ID to compare against in the timeseries DB. +#. The rules settings. +#. The expected results which is a json dictionary of times with expected results for inputs and outputs. +#. The events which contain commands or faults that are scheduled when a simulation runs. + + +.. figure:: TestConfigClassDiagram.png + :align: left + :alt: TestConfigClassDiagram + :figclass: align-left + + +.. code-block:: JSON + :caption: Test Config Example + + { + "appId": "sample_app", + "testId": "382642088", + "compareWithSimId": "431673998", + "start_time": 1248156000, + "duration": 60, + "interval": 10, + "expectedResults": {}, + "testType": "expected_vs_timeseries" + } + + +Expected Results Series +^^^^^^^^^^^^^^^^^^^^^^^ + +The expected results is a dictonary of input and output dictionaries that contains measurements at each time key. + +.. code-block:: JSON + :caption: Expected results example + + "expectedResults": { + "output": { + "1248156002": { + "simulation_id": "559402036", + "message": { + "timestamp": 1535574871, + "measurements": [ + { + "measurement_mrid": "_000b01a1-8238-4372-95c0-82aad26ea311", + "angle": -5.066423674487563, + "magnitude": 2388.676720682955, + "simulation_id": "1961648576", + "time": 1248156002}, + { + "measurement_mrid": "_00347396-b4b0-4218-9aba-b363f2cda841", + "angle": 118.66041090126667, + "magnitude": 2425.0820667756834, + "simulation_id": "1961648576", + "time": 1248156002}, + { + "measurement_mrid": "_0044ae64-1c72-4e81-b412-d7349ce267d3", + "angle": -39.42744945710241, + "magnitude": 374545.4981119089, + "simulation_id": "1961648576", + "time": 1248156002} + ] + } + } + }, + "input": { + "1248156014": { + "simulation_id": "559402036", + "message": { + "timestamp": 1248156014, + "measurements": [ + {"hasMeasurementDifference": "FORWARD", + "difference_mrid": "1fae379c-d0e2-4c80-8f2c-c5d7a70ff4d4", + "simulation_id": "1961648576", + "time": 1248156014, + "attribute": "ShuntCompensator.sections", + "value": 1.0, + "object": "_939CA567-AA3D-4972-AABC-1D0AAF4859FE"}, + {"hasMeasurementDifference": "REVERSE", + "difference_mrid": "1fae379c-d0e2-4c80-8f2c-c5d7a70ff4d4", + "simulation_id": "1961648576", + "time": 1248156014, + "attribute": "ShuntCompensator.sections", + "value": 0.0, + "object": "_939CA567-AA3D-4972-AABC-1D0AAF4859FE"} + ] + } + }, + "1248156029": { + "simulation_id": "559402036", + "message": { + "timestamp": 1248156029, + "measurements": [ + {"hasMeasurementDifference": "FORWARD", + "difference_mrid": "1fae379c-d0e2-4c80-8f2c-c5d7a70ff4d4", + "simulation_id": "1961648576", + "time": 1248156029, + "attribute": "ShuntCompensator.sections", + "value": 0.0, + "object": "_939CA567-AA3D-4972-AABC-1D0AAF4859FE"}, + {"hasMeasurementDifference": "REVERSE", + "difference_mrid": "1fae379c-d0e2-4c80-8f2c-c5d7a70ff4d4", + "simulation_id": "1961648576", + "time": 1248156029, + "attribute": "ShuntCompensator.sections", + "value": 1.0, + "object": "_939CA567-AA3D-4972-AABC-1D0AAF4859FE"} + ] + } + }, + "1248156044": { + "simulation_id": "559402036", + "message": { + "timestamp": 1248156044, + "measurements": [ + {"hasMeasurementDifference": "FORWARD", + "difference_mrid": "1fae379c-d0e2-4c80-8f2c-c5d7a70ff4d4", + "simulation_id": "1961648576", + "time": 1248156044, + "attribute": "ShuntCompensator.sections", + "value": 0.0, + "object": "_939CA567-AA3D-4972-AABC-1D0AAF4859FE"}, + {"hasMeasurementDifference": "REVERSE", + "difference_mrid": "1fae379c-d0e2-4c80-8f2c-c5d7a70ff4d4", + "simulation_id": "1961648576", + "time": 1248156044, + "attribute": "ShuntCompensator.sections", + "value": 1.0, + "object": "_939CA567-AA3D-4972-AABC-1D0AAF4859FE"} + ] + } + } + } + } +.. + +Test Types and Sequnece Diagrams +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The sequenece diagrams are included to aid with understanding how the test manager is handling each test case. + +The simulation versus expected case listens for simulation output data and compares with the expected data at the simulation time. +It also listens for simulation input data and compares with the expected data at the simulation time. + +.. figure:: simulation_vs_expected.png + :align: left + :alt: simulation_vs_expected + :figclass: align-left + +The simulation versus timeseries case listens for simulation output data and compares with the expected data at created from querying the timeseries database at the simulation time. +It also listens for simulation input data and compares with the expected data created from querying the timeseries database at the simulation time. + +.. figure:: simulation_vs_timeseries.png + :align: left + :alt: simulation_vs_timeseries + :figclass: align-left + +The expected versus timeseries case breaks the expected data and timeseries data query into chunks and then compares the expected data with output and input expected data created from querying the timeseries database. + +.. figure:: expected_vs_timeseries.png + :align: left + :alt: expected_vs_timeseries + :figclass: align-left + +The timeseries versus timeseries case breaks both timeseries data queries into chunks and then compares the with output and input expected data of each instance against the other instance. + +.. figure:: timeseries_vs_timeseries.png + :align: left + :alt: .. figure:: timeseries_vs_timeseries.png + :figclass: align-left + +Running a Test +^^^^^^^^^^^^^^ + +To run a test agains a running simulation then create a Simulation Config and add a Test Config with a the TestType as "simulation_vs_expected" or "simulation_vs_timeseries". + +To run a test without test manager with TestType as "expected_vs_timeseries" or "timeseries_vs_timeseries" and send to "goss.gridappsd.simulation.test.input." + +.. code-block:: JSON + :caption: Test Config Example + + { + "appId": "sample_app", + "testId": "382642088", + "compareWithSimId": "431673998", + "compareWithSimIdTwo": "231673900", + "start_time": 1248156000, + "duration": 60, + "interval": 10, + "expectedResults": {}, + "testType": "timeseries_vs_timeseries" + } +.. + +Test Results +^^^^^^^^^^^^ + + The results of a test will be streamed to /topic/goss.gridappsd.simulation.test.output. and will list the values that do not match at each time index. + + The fields om the Test Result are as follows: + + #. object: String - object MRID + #. diffType:String - FORWARD or REVERSE + #. indexOne:Long - Time of expected + #. expected:String - Expected value + #. simulationTimestamp:Long - Simulation timestamp + #. actual:String - Actual value + #. diffMrid:String - Diff MRID + #. indexTwo:Long - Time of actual value + #. attribute:String - CIM attribute or FORWARD or REVERSE + #. match:Boolean - True of the expected and actual match + +.. figure:: TestResultClassDiagram.png + :alt: TestResultClassDiagram +.. + + + +.. code-block:: + :caption: Test Result Example + + [ + {'status': 'start'} + {'object': '_0044ae64-1c72-4e81-b412-d7349ce267d3', 'attribute': 'magnitude', 'indexOne': 1248156002, 'indexTwo': 1248156002, 'simulationTimestamp': 0, 'expected': '374545.4981119089', 'actual': '54911.42414314939', 'diffMrid': 'NA', 'diffType': 'NA', 'match': False} + {'object': '_000b01a1-8238-4372-95c0-82aad26ea311', 'attribute': 'angle', 'indexOne': 1248156002, 'indexTwo': 1248156002, 'simulationTimestamp': 0, 'expected': '-5.066423674487563', 'actual': '21.91525592241816', 'diffMrid': 'NA', 'diffType': 'NA', 'match': False} + {'object': '_000b01a1-8238-4372-95c0-82aad26ea311', 'attribute': 'magnitude', 'indexOne': 1248156002, 'indexTwo': 1248156002, 'simulationTimestamp': 0, 'expected': '2388.676720682955', 'actual': '23182.721945577698', 'diffMrid': 'NA', 'diffType': 'NA', 'match': False} + {'object': '_939CA567-AA3D-4972-AABC-1D0AAF4859FE', 'attribute': 'FORWARD value', 'indexOne': 1248156014, 'indexTwo': 1248156014, 'simulationTimestamp': 0, 'expected': '1.0', 'actual': '0', 'diffMrid': '661ff0c3-43ed-4351-905b-43874c9003a4', 'diffType': 'FORWARD', 'match': False} + {'object': '_939CA567-AA3D-4972-AABC-1D0AAF4859FE', 'attribute': 'REVERSE value', 'indexOne': 1248156014, 'indexTwo': 1248156014, 'simulationTimestamp': 0, 'expected': '0.0', 'actual': '1', 'diffMrid': '661ff0c3-43ed-4351-905b-43874c9003a4', 'diffType': 'REVERSE', 'match': False} + {'object': '_939CA567-AA3D-4972-AABC-1D0AAF4859FE', 'attribute': 'FORWARD value', 'indexOne': 1248156029, 'indexTwo': 1248156029, 'simulationTimestamp': 0, 'expected': '0.0', 'actual': '1', 'diffMrid': '97ad4c0d-8e04-42a0-a244-c38f33724974', 'diffType': 'FORWARD', 'match': False} + {'object': '_939CA567-AA3D-4972-AABC-1D0AAF4859FE', 'attribute': 'REVERSE value', 'indexOne': 1248156029, 'indexTwo': 1248156029, 'simulationTimestamp': 0, 'expected': '1.0', 'actual': '0', 'diffMrid': '97ad4c0d-8e04-42a0-a244-c38f33724974', 'diffType': 'REVERSE', 'match': False} + {'status': 'finish'} + ] +.. + diff --git a/docs/source/using_gridappsd/test_manager_events.rst b/docs/source/using_gridappsd/test_manager_events.rst new file mode 100644 index 0000000..85f63e1 --- /dev/null +++ b/docs/source/using_gridappsd/test_manager_events.rst @@ -0,0 +1,342 @@ +There are 3 types events supported by the TestManager and the platform: + + 1. CIM defined fault events, used when a line is down or for taking a piece of equipment out of service. + 2. Communication outage events which simulates measurements or control message outages. + 3. Scheduled command at specific time which sends commands to a piece of equipment. + +There are 2 commands to the TestManager: + + 1. Update + 2. QueryStatus + + +|event_classes_image0| + +Fault Events +^^^^^^^^^^^^ + +Fault Events are defined in a Test Script and define the CIM Fault events that will be intialized and cleared at scheduled times. + +The phases string is all the combinations of the 3-phases plus neutral and secondary phases. +Some examples are : + +1. "A" +2. "AN" would be line to line. +3. "AB" would be line to line. +4. "S12N" both hot wires to ground +5. "S12" both hot wires together. +  +PhaseConnectedFaultKind is an enumeration with the following values: + +1. lineToGround +2. lineToLine +3. lineToLineToGround +4. lineOpen + +.. code-block:: none + :caption: Fault Events in Test Script JSON schema + + { + "PhaseConnectedFaultKind": string, + "FaultImpedance": { + "rGround": float, + "xGround": float, + "rLineToLine":float, + "xLineToLine":float + }, + "ObjectMRID": [string], + "phases": string, + "event_type": string, + "occuredDateTime": long, + "stopDateTime": long + } +.. + + +.. code-block:: JSON + :caption: Fault Event Example in test script + + { + "command": "new_events", + "events" : [{ + "PhaseConnectedFaultKind": "lineToGround", + "FaultImpedance": { + "rGround": 0.001, + "xGround": 0.001 + }, + "ObjectMRID": ["_9EF94B67-7279-21F4-5CEE-B2724E3C3FE6"], + "phases": "ABC", + "event_type": "Fault", + "occuredDateTime": 1248130809, + "stopDateTime": 1248130816 + } + ] + } +.. + + +Fault Commands sent from the Test Manager to the simulation + +.. code-block:: JSON + :caption: Initialize a Fault Command example + + { + "command": "update", + "input": { + "timestamp": 1553201000414, + "reverse_differences": [], + "difference_mrid": "_ee4e4055-222f-4ccf-bed1-93063bd4392c", + "forward_differences": [ + { + "ObjectMRID": "12344", + "FaultImpedance": { + "xLineToLine": 0.0, + "rGround": 0.001, + "rLineToLine": 0.0, + "xGround": 0.001 + }, + "faultMRID": "1233", + "PhaseCode": "AN", + "PhaseConnectedFaultKind": "lineToGround" + } + ] + } + } +.. + +.. code-block:: JSON + :caption: Clear a Fault Command example + + { + "command": "update", + "input": { + "timestamp": 1553201003561, + "reverse_differences": [ + { + "ObjectMRID": "12344", + "FaultImpedance": { + "xLineToLine": 0.0, + "rGround": 0.001, + "rLineToLine": 0.0, + "xGround": 0.001 + }, + "faultMRID": "1233", + "PhaseCode": "AN", + "PhaseConnectedFaultKind": "lineToGround" + } + ], + "difference_mrid": "_00b4668d-8454-4f1c-aed9-42d1424af149", + "forward_differences": [] + } + } +.. + +Communication Event +^^^^^^^^^^^^^^^^^^^ + +Communication Outage events are separate from the CIM events but have occuredDateTime and stopDateTime. + +1. The inputOutageList is the list of objectMRID and attribute pair. The objectMRID is anything that can be controllable and specific control attribute i.e. "RegulatingControl.mode". +2. The outputOutageList is the list of MRIDs for the measurement device that is associated to the . +3. If allInputOutage is True the inputOutageList is not needed as all inputs to the simulator are blocked. +4. If allOutputOutage is True the outputOutageList is not needed as all outputs from the simulator are blocked. + +.. code-block:: none + :caption: JSON Communication Outage schema command for the TestManager + + { + "allOutputOutage": boolean, + "allInputOutage": boolean, + "inputOutageList": [{"objectMRID":string, "attribute":string}], + "outputOutageList": [string], + "event_type": string, + "occuredDateTime": long, + "stopDateTime": long + } +.. + +.. code-block:: JSON + :caption: JSON Communication Outage command for the TestManager + + {"command": "new_events", + "events": [ + { + "allOutputOutage": false, + "allInputOutage": false, + "inputOutageList": [{"objectMRID":"_EF2FF8C1-A6A6-4771-ADDD-A371AD929D5B", "attribute":"ShuntCompensator.sections"}, {"objectMRID":"_C0F73227-012B-B70B-0142-55C7C991A343", "attribute":"ShuntCompensator.sections"}], + "outputOutageList": ["_5405BE1A-BC86-5452-CBF2-BD1BA8984093"], + "event_type": "CommOutage", + "occuredDateTime": 1248130819, + "stopDateTime": 1248130824 + } + ] + } +.. + +For reference this is the complete JSON schema of the internal Communication Event for the platform and goes between the Test Manager and the fncs_goss_bridge.py. + +.. code-block:: JSON + :caption: Communication Event to the Simulation Bridge + + { + "command": "CommOutage", + "input": { + "timestamp": 1248130819, + "forward_differences": [ + { + "allOutputOutage": false, + "allInputOutage": false, + "inputOutageList": [ + { + "objectMRID": "_EF2FF8C1-A6A6-4771-ADDD-A371AD929D5B", + "attribute": "ShuntCompensator.sections" + }, + { + "objectMRID": "_C0F73227-012B-B70B-0142-55C7C991A343", + "attribute": "ShuntCompensator.sections" + } + ], + "outputOutageList": [ + "_5405BE1A-BC86-5452-CBF2-BD1BA8984093" + ], + "faultMRID": "_ce5ee4c9-9c41-4f5e-8c5c-f19990f9cfba", + "event_type": "CommOutage", + "occuredDateTime": 1248130819, + "stopDateTime": 1248130824 + } + ], + "reverse_differences": [] + } + } +.. + +The object will be the EventID generated by TestManager + +Updating Events +^^^^^^^^^^^^^^^ + +Events can be updated with the "update_events" command and the list of events to be updated. +This is used to update the occuredDateTime and stopDateTime. + + + +.. code-block:: none + :caption: JSON update command to Test Manager + :emphasize-lines: 6 + + { + "command": "update_events", + "events":[{}] + } + } +.. + +Query +^^^^^ +The Test Manager can be queried the for list of faults and statuses. +The return is the fault MRID and status which can be SCHEDULED, INITIATED, CLEARED, or CANCELLED. + +.. code-block:: none + :caption: Query the for list of faults and status + + {"command":"query_events", "simulationID":int} +.. + +.. code-block:: none + :caption: Result JSON Schema + + { + "data": [ + { + , + "status": # SCHEDULED, INITIATED, CLEARED, CANCELLED + } + ] + } +.. + + +.. code-block:: JSON + :caption: Result CIM Fault Events example + + { + "data": [ + { + "allOutputOutage": false, + "allInputOutage": false, + "inputOutageList": [ + { + "objectMRID": "_EF2FF8C1-A6A6-4771-ADDD-A371AD929D5B", + "attribute": "ShuntCompensator.sections" + }, + { + "objectMRID": "_C0F73227-012B-B70B-0142-55C7C991A343", + "attribute": "ShuntCompensator.sections" + } + ], + "outputOutageList": [ + "_5405BE1A-BC86-5452-CBF2-BD1BA8984093" + ], + "faultMRID": "_ce5ee4c9-9c41-4f5e-8c5c-f19990f9cfba", + "event_type": "CommOutage", + "occuredDateTime": 1248130819, + "stopDateTime": 1248130824, + "status": "CLEARED" + } + ] + } +.. + +Scheduled Commands +^^^^^^^^^^^^^^^^^^ + +Commands that can be scheduled for a specific point in time of the simulation. This can be used to trigger a fault like behavior like change the taps of a regular or mimicking behavior of protective devices like a recloser with a with a switch. + +.. code-block:: none + :caption: JSON scheduled command schema + + { + "command": "new_events", + "events":[{ + "message":{ + "forward_differences":[], + "reverse_differences":[] + }, + "occuredDateTime":long, + "stopDateTime":long, + }] + } +.. + + +.. code-block:: JSON + :caption: Scheduled command example + + { + "command": "new_events", + "events":[{ + "message": { + "forward_differences": [ + { + "object": "_8D0EAC3F-AD56-C5A6-ED03-863DBB4A8C5F", + "attribute": "ShuntCompensator.sections", + "value": "0" + } + ], + "reverse_differences": [ + { + "object": "_8D0EAC3F-AD56-C5A6-ED03-863DBB4A8C5F", + "attribute": "ShuntCompensator.sections", + "value": "1" + } + ] + }, + "event_type": "ScheduledCommandEvent", + "occuredDateTime": 1248130812, + "stopDateTime": 1248130842 + }] + } +.. + + +.. |event_classes_image0| image:: EventClassDiagram.png diff --git a/docs/source/using_gridappsd/timeseries_vs_timeseries.png b/docs/source/using_gridappsd/timeseries_vs_timeseries.png new file mode 100644 index 0000000..0ded85d Binary files /dev/null and b/docs/source/using_gridappsd/timeseries_vs_timeseries.png differ