Group Recorder

The group recorder can collect a recording of ONLY ONE property from a class or a group of similar objects. For instance, it can be used to record the voltages of every meter in the system as a time series. The values of the measured_energy variable of every meter object in a GLM are recorded into a file, named as "meter.csv", at 3600-second intervals.

module tape;
object group_recorder {
name "recorder-name";
parent "target-object-name";
group "target-object-name";
property "target-property-name";
file "output-file-name";
interval sampling-interval;
limit sampling-limit;
flush_interval -1; //  New in 3.1! 
strict boolean;
print_units boolean;
complex_part enumeration;
}

The group_recorder places a timestamp in the first column of every row it emits. By default the timestamp is formatted using the ISO format (i.e., yyyy-mm-dd HH:MM:SS TZ). However, if the value of the dateformat global variable is not ISO, then the alternative date/time formatting rules will apply as follows:

  • #set dateformat=US: The timestamp will be formatted as mm-dd-yyyy HH:MM:SS[.SSSSSS].

  • #set dateformat=EURO: The timestamp will be formatted as dd-mm-yyyy HH:MM:SS[.SSSSSS].

Properties

Table 1: Group Recorder Properties
Property Type Description
parent object Built-in property that specifies the object that the group_recorder childs to. Does not need to be specified.
property string Single property from the class to be recorded. Properties with units may be converted to other relevant units. Complex properties may be modified via the complex_parts enumeration.
file string By default, the name of the file to write the recorder output to. If left empty, the recorder will generate a file name based on the target object class and internal ID number. The exact mode is dependent on the format of this string. A simple file name will write text output to the specified file. Other output modes are available with "mode:path", where mode may be "file", "odbc", "memory", or "plot". The path for file and plot refer to a file name, to a global variable name for memory, and to a server login string for odbc. See the Tape Database Output, Tape Memory Output, and Plotting Output sections for more details.
flush number By default the output buffer is flushed to disk when it is full (the size of the buffer is system specific). This default corresponds to the flush value -1. If flush is set to 0, the buffer is flushed every time a record is written. If flush is set to a value greater than 0, the buffer is flushed whenever the condition clock mod flush == 0 is satisfied.
interval integer The frequency at which the recorder samples the specified properties, in seconds. A frequency of 0 indicates that they should be read & written every iteration (note, that each timestep often requires multiple iterations, so a frequency of zero may lead to multiple measurements in a timestep). A frequency of -1 indicates that they should be read every timestep, but only written if one or more values change. By default, this is TS_NEVER.
limit integer The number of rows to write to the output stream. A non-positive value puts no limit on the file size (use at your own risk). By default, this is 0. The limit is only checked when output non-subsecond value.
group string Group definition string. Defines which class of device (required) and other information to create a group. See Finding_objects for more details.
flush_interval integer How often to "flush" the recorded material to the flat file - file flush interval (0 never, negative on samples)
strict boolean Causes the group_recorder to stop the simulation should there be a problem opening or writing with the group_recorder
print_units boolean flag to append units to each written value, if applicable
complex_parts enumeration Which part of the complex to record if a complex property is specified. Available settings: "NONE", "REAL", "IMAG", "MAG", "ANG_DEG", "ANG_RAD"

Examples

Example 1: Record Phases

Three group_recorder objects are used to record the Phase A, B, and C voltages of all loads into three files. A MATLAB script that parses and plots the voltages of all loads is available in this GitHub repository.

object group_recorder {
    name loads_voltages_A_recorder;
    group "class=load";
    property voltage_A;
    file loads_volts_A.csv;
    interval 1;
    limit 10000000;
}
object group_recorder {
    name loads_voltages_B_recorder;
    group "class=load";
    property voltage_B;
    file loads_volts_B.csv;
    interval 1;
    limit 10000000;
}
object group_recorder {
    name loads_voltages_C_recorder;
    group "class=load";
    property voltage_C;
    file loads_volts_C.csv;
    interval 1;
    limit 10000000;
}

Caution

It is possible to have the voltages recorded as magnitude and angle (e.g., +7003.99-2.25958d) in the csv file. In this case, the MATLAB script in that GitHub repository needs to be modified to process the string "+7003.99-2.25958d".

1) Note that this is not controllable by users through property settings. Users may have a single csv file, in which the recorded voltages have a mix of two formats (i.e., the magnitude and angle format: "+7003.99-2.25958d", and the real and imaginary format: "+2465.49-1430.37j"). This bug will be fixed in future.

2) The property "complex_part" can be used to record the magnitude of a phase voltage. See Example 02, of which the output file can be parsed by the provided MATLAB script properly.

Example 2: Voltage

A group_recorder that will watch the 'A' voltage of all meters and record the magnitude every 60 seconds.

object group_recorder {
parent ThatNode;
group "class=meter";
property voltage_A;
interval 60;
limit 1000;
file ThatNode_kV.csv;
complex_part MAG;
}

Example 3: Real Power

A group_recoder that measures real power through every transformer in a specific section of the circuit (through groupid) every 5 mins.

object group_recorder {
parent ThatTransformer;
group "class=transformer";
property power_out;
interval 300;
limit 1000;
file AllTransformers.csv;
complex_part REAL;
}

Caveats

The group_recorder attempts to read the value from the last iteration of a timestep, rather than the first iteration of a timestep. Normally the final value is more important than the initial or the intermediate values, for iterative solvers, but an interval of -1 can be used if necessary to record the value of a property with greater resolution.

The group_recorder cannot currently record the final value into a file, even though that value will be present in the output or dump XML file. This is a known quirk that cannot be resolved with the current structure of GridLAB-D™, but is being worked on. All values written by various recorders at the same timestamp will be consistent between each other, however.

  • collector
  • Tape (module)
  • recorder