00001
00002
00003
00004
00005
00006
00007
00008 #include "metrics_collector_writer.h"
00009
00010 CLASS *metrics_collector_writer::oclass = NULL;
00011
00012 void new_metrics_collector_writer(MODULE *mod){
00013 new metrics_collector_writer(mod);
00014 }
00015
00016 metrics_collector_writer::metrics_collector_writer(MODULE *mod){
00017 if(oclass == NULL)
00018 {
00019 oclass = gl_register_class(mod,"metrics_collector_writer",sizeof(metrics_collector_writer),PC_POSTTOPDOWN);
00020 if (oclass==NULL)
00021 throw "unable to register class metrics_collector_writer";
00022
00023 if(gl_publish_variable(oclass,
00024 PT_char256,"filename",PADDR(filename),PT_DESCRIPTION,"the JSON formatted output file name",
00025 PT_double, "interval[s]", PADDR(interval_length_dbl), PT_DESCRIPTION, "Interval at which the metrics_collector_writer output is stored in JSON format",
00026 NULL) < 1) GL_THROW("unable to publish properties in %s",__FILE__);
00027 }
00028 }
00029
00030 int metrics_collector_writer::isa(char *classname){
00031 return (strcmp(classname, oclass->name) == 0);
00032 }
00033
00034 int metrics_collector_writer::create(){
00035 return 1;
00036 }
00037
00038 int metrics_collector_writer::init(OBJECT *parent){
00039
00040 OBJECT *obj = OBJECTHDR(this);
00041 FILE *fn = NULL;
00042 int index = 0;
00043 char time_str[64];
00044 DATETIME dt;
00045
00046
00047 if(0 == filename[0]){
00048
00049 sprintf(filename, "%256s-%256i-metrics_collector_output.json", oclass->name, obj->id);
00050 gl_warning("metrics_collector_writer::init(): no filename defined, auto-generating '%s'", filename.get_string());
00051
00052
00053
00054
00055 }
00056
00057
00058 filename_billing_meter = "billing_meter_";
00059 strcat(filename_billing_meter, filename);
00060 filename_inverter = "inverter_";
00061 strcat(filename_inverter, filename);
00062 filename_capacitor = "capacitor_";
00063 strcat(filename_capacitor, filename);
00064 filename_regulator = "regulator_";
00065 strcat(filename_regulator, filename);
00066 filename_house = "house_";
00067 strcat(filename_house, filename);
00068 filename_substation = "substation_";
00069 strcat(filename_substation, filename);
00070
00071
00072 interval_length = (int64)(interval_length_dbl);
00073 if(interval_length <= 0){
00074 gl_error("metrics_collector_writer::init(): invalid interval of %i, must be greater than 0", interval_length);
00075
00076
00077
00078 return 0;
00079 }
00080
00081
00082 metrics_collectors = gl_find_objects(FL_NEW,FT_CLASS,SAME,"metrics_collector",FT_END);
00083 if(metrics_collectors == NULL){
00084 gl_error("No metrics_collector objects were found.");
00085 return 0;
00086
00087
00088
00089 }
00090
00091
00092 obj = NULL;
00093 while(obj = gl_find_next(metrics_collectors,obj)){
00094 if(index >= metrics_collectors->hit_count){
00095 break;
00096 }
00097
00098 metrics_collector *temp_metrics_collector = OBJECTDATA(obj,metrics_collector);
00099 if(temp_metrics_collector == NULL){
00100 gl_error("Unable to map object as metrics_collector object.");
00101 return 0;
00102 }
00103
00104 if (temp_metrics_collector->interval_length_dbl != interval_length_dbl) {
00105 gl_error("Currently the time interval of the metrics_collector should be the same as the metrics_collector_writer");
00106 return 0;
00107 }
00108 }
00109
00110
00111 startTime = gl_globalclock;
00112 last_write = gl_globalclock;
00113 next_write = gl_globalclock + interval_length;
00114 final_write = gl_globalstoptime;
00115
00116
00117 if(0 == gl_localtime(startTime, &dt)){
00118 gl_error("metrics_collector_writer::init(): error when converting the starting time");
00119
00120
00121
00122 return 0;
00123 }
00124 if(0 == gl_strtime(&dt, time_str, sizeof(time_str) ) ){
00125 gl_error("metrics_collector_writer::init(): error when writing the starting time as a string");
00126
00127
00128
00129 return 0;
00130 }
00131
00132
00133 metrics_writer_billing_meters["StartTime"] = time_str;
00134 metrics_writer_houses["StartTime"] = time_str;
00135 metrics_writer_inverters["StartTime"] = time_str;
00136 metrics_writer_capacitors["StartTime"] = time_str;
00137 metrics_writer_regulators["StartTime"] = time_str;
00138 metrics_writer_feeder_information["StartTime"] = time_str;
00139
00140
00141 Json::Value jsn;
00142 Json::Value meta;
00143 int idx = 0;
00144 jsn["index"] = idx++; jsn["units"] = "W"; meta["real_power_min"] = jsn;
00145 jsn["index"] = idx++; jsn["units"] = "W"; meta["real_power_max"] = jsn;
00146 jsn["index"] = idx++; jsn["units"] = "W"; meta["real_power_avg"] = jsn;
00147 jsn["index"] = idx++; jsn["units"] = "VAR"; meta["reactive_power_min"] = jsn;
00148 jsn["index"] = idx++; jsn["units"] = "VAR"; meta["reactive_power_max"] = jsn;
00149 jsn["index"] = idx++; jsn["units"] = "VAR"; meta["reactive_power_avg"] = jsn;
00150 jsn["index"] = idx++; jsn["units"] = "Wh"; meta["real_energy"] = jsn;
00151 jsn["index"] = idx++; jsn["units"] = "VARh"; meta["reactive_energy"] = jsn;
00152 jsn["index"] = idx++; jsn["units"] = "USD"; meta["bill"] = jsn;
00153 jsn["index"] = idx++; jsn["units"] = "V"; meta["voltage12_min"] = jsn;
00154 jsn["index"] = idx++; jsn["units"] = "V"; meta["voltage12_max"] = jsn;
00155 jsn["index"] = idx++; jsn["units"] = "V"; meta["voltage12_avg"] = jsn;
00156 jsn["index"] = idx++; jsn["units"] = "V"; meta["voltage_min"] = jsn;
00157 jsn["index"] = idx++; jsn["units"] = "V"; meta["voltage_max"] = jsn;
00158 jsn["index"] = idx++; jsn["units"] = "V"; meta["voltage_avg"] = jsn;
00159 jsn["index"] = idx++; jsn["units"] = "V"; meta["voltage_unbalance_min"] = jsn;
00160 jsn["index"] = idx++; jsn["units"] = "V"; meta["voltage_unbalance_max"] = jsn;
00161 jsn["index"] = idx++; jsn["units"] = "V"; meta["voltage_unbalance_avg"] = jsn;
00162 jsn["index"] = idx++; jsn["units"] = "s"; meta["above_RangeA_Duration"] = jsn;
00163 jsn["index"] = idx++; jsn["units"] = ""; meta["above_RangeA_Count"] = jsn;
00164 jsn["index"] = idx++; jsn["units"] = "s"; meta["below_RangeA_Duration"] = jsn;
00165 jsn["index"] = idx++; jsn["units"] = ""; meta["below_RangeA_Count"] = jsn;
00166 jsn["index"] = idx++; jsn["units"] = "s"; meta["above_RangeB_Duration"] = jsn;
00167 jsn["index"] = idx++; jsn["units"] = ""; meta["above_RangeB_Count"] = jsn;
00168 jsn["index"] = idx++; jsn["units"] = "s"; meta["below_RangeB_Duration"] = jsn;
00169 jsn["index"] = idx++; jsn["units"] = ""; meta["below_RangeB_Count"] = jsn;
00170 jsn["index"] = idx++; jsn["units"] = "s"; meta["below_10_percent_NormVol_Duration"] = jsn;
00171 jsn["index"] = idx++; jsn["units"] = ""; meta["below_10_percent_NormVol_Count"] = jsn;
00172 metrics_writer_billing_meters["Metadata"] = meta;
00173 ary_billing_meters.resize(idx);
00174
00175 meta.clear();
00176 idx = 0;
00177 jsn["index"] = idx++; jsn["units"] = "kW"; meta["total_load_min"] = jsn;
00178 jsn["index"] = idx++; jsn["units"] = "kW"; meta["total_load_max"] = jsn;
00179 jsn["index"] = idx++; jsn["units"] = "kW"; meta["total_load_avg"] = jsn;
00180 jsn["index"] = idx++; jsn["units"] = "kW"; meta["hvac_load_min"] = jsn;
00181 jsn["index"] = idx++; jsn["units"] = "kW"; meta["hvac_load_max"] = jsn;
00182 jsn["index"] = idx++; jsn["units"] = "kW"; meta["hvac_load_avg"] = jsn;
00183 jsn["index"] = idx++; jsn["units"] = "degF"; meta["air_temperature_min"] = jsn;
00184 jsn["index"] = idx++; jsn["units"] = "degF"; meta["air_temperature_max"] = jsn;
00185 jsn["index"] = idx++; jsn["units"] = "degF"; meta["air_temperature_avg"] = jsn;
00186 jsn["index"] = idx++; jsn["units"] = "degF"; meta["air_temperature_deviation_cooling"] = jsn;
00187 jsn["index"] = idx++; jsn["units"] = "degF"; meta["air_temperature_deviation_heating"] = jsn;
00188 jsn["index"] = idx++; jsn["units"] = "kW"; meta["waterheater_load_min"] = jsn;
00189 jsn["index"] = idx++; jsn["units"] = "kW"; meta["waterheater_load_max"] = jsn;
00190 jsn["index"] = idx++; jsn["units"] = "kW"; meta["waterheater_load_avg"] = jsn;
00191 metrics_writer_houses["Metadata"] = meta;
00192 ary_houses.resize(idx);
00193
00194 meta.clear();
00195 idx = 0;
00196 jsn["index"] = idx++; jsn["units"] = "W"; meta["real_power_min"] = jsn;
00197 jsn["index"] = idx++; jsn["units"] = "W"; meta["real_power_max"] = jsn;
00198 jsn["index"] = idx++; jsn["units"] = "W"; meta["real_power_avg"] = jsn;
00199 jsn["index"] = idx++; jsn["units"] = "VAR"; meta["reactive_power_min"] = jsn;
00200 jsn["index"] = idx++; jsn["units"] = "VAR"; meta["reactive_power_max"] = jsn;
00201 jsn["index"] = idx++; jsn["units"] = "VAR"; meta["reactive_power_avg"] = jsn;
00202 metrics_writer_inverters["Metadata"] = meta;
00203 ary_inverters.resize(idx);
00204
00205 meta.clear();
00206 idx = 0;
00207 jsn["index"] = idx++; jsn["units"] = ""; meta["operation_count"] = jsn;
00208 metrics_writer_capacitors["Metadata"] = meta;
00209 ary_capacitors.resize(idx);
00210
00211 meta.clear();
00212 idx = 0;
00213 jsn["index"] = idx++; jsn["units"] = ""; meta["operation_count"] = jsn;
00214 metrics_writer_regulators["Metadata"] = meta;
00215 ary_regulators.resize(idx);
00216
00217 meta.clear();
00218 idx = 0;
00219 jsn["index"] = idx++; jsn["units"] = "W"; meta["real_power_min"] = jsn;
00220 jsn["index"] = idx++; jsn["units"] = "W"; meta["real_power_max"] = jsn;
00221 jsn["index"] = idx++; jsn["units"] = "W"; meta["real_power_avg"] = jsn;
00222 jsn["index"] = idx++; jsn["units"] = "W"; meta["real_power_median"] = jsn;
00223 jsn["index"] = idx++; jsn["units"] = "VAR"; meta["reactive_power_min"] = jsn;
00224 jsn["index"] = idx++; jsn["units"] = "VAR"; meta["reactive_power_max"] = jsn;
00225 jsn["index"] = idx++; jsn["units"] = "VAR"; meta["reactive_power_avg"] = jsn;
00226 jsn["index"] = idx++; jsn["units"] = "VAR"; meta["reactive_power_median"] = jsn;
00227 jsn["index"] = idx++; jsn["units"] = "Wh"; meta["real_energy"] = jsn;
00228 jsn["index"] = idx++; jsn["units"] = "VARh"; meta["reactive_energy"] = jsn;
00229 jsn["index"] = idx++; jsn["units"] = "W"; meta["real_power_losses_min"] = jsn;
00230 jsn["index"] = idx++; jsn["units"] = "W"; meta["real_power_losses_max"] = jsn;
00231 jsn["index"] = idx++; jsn["units"] = "W"; meta["real_power_losses_avg"] = jsn;
00232 jsn["index"] = idx++; jsn["units"] = "W"; meta["real_power_losses_median"] = jsn;
00233 jsn["index"] = idx++; jsn["units"] = "VAR"; meta["reactive_power_losses_min"] = jsn;
00234 jsn["index"] = idx++; jsn["units"] = "VAR"; meta["reactive_power_losses_max"] = jsn;
00235 jsn["index"] = idx++; jsn["units"] = "VAR"; meta["reactive_power_losses_avg"] = jsn;
00236 jsn["index"] = idx++; jsn["units"] = "VAR"; meta["reactive_power_losses_median"] = jsn;
00237 metrics_writer_feeder_information["Metadata"] = meta;
00238 ary_feeders.resize(idx);
00239
00240 return 1;
00241 }
00242
00243 TIMESTAMP metrics_collector_writer::postsync(TIMESTAMP t0, TIMESTAMP t1){
00244
00245
00246 if(next_write <= t1){
00247 interval_write = true;
00248 last_write = t1;
00249 next_write = min(t1 + interval_length, final_write);
00250 }
00251
00252
00253 return TS_NEVER;
00254 }
00255
00256 int metrics_collector_writer::commit(TIMESTAMP t1){
00257 OBJECT *obj = OBJECTHDR(this);
00258
00259
00260 if(interval_write){
00261 if(0 == write_line(t1)){
00262 gl_error("metrics_collector_writer::commit(): error when writing the values to JSON format");
00263 return 0;
00264 }
00265 interval_write = false;
00266 }
00267
00268 return 1;
00269 }
00270
00274 int metrics_collector_writer::write_line(TIMESTAMP t1){
00275 char time_str[64];
00276 time_t now = time(NULL);
00277 int index = 0;
00278
00279 double *metrics;
00280 Json::Value metrics_writer_Output_time;
00281 Json::Value metrics_writer_Output_data;
00282
00283 Json::Value billing_meter_objects;
00284 Json::Value house_objects;
00285 Json::Value inverter_objects;
00286 Json::Value capacitor_objects;
00287 Json::Value regulator_objects;
00288 Json::Value feeder_information;
00289
00290
00291 metrics_writer_Output_time["Time"] = (Json::Int64)(t1 - startTime);
00292 int writeTime = t1 - startTime;
00293 sprintf(time_str, "%d", writeTime);
00294
00295
00296
00297
00298 OBJECT *obj = NULL;
00299 while(obj = gl_find_next(metrics_collectors,obj)){
00300 if(index >= metrics_collectors->hit_count){
00301 break;
00302 }
00303
00304
00305 metrics_collector *temp_metrics_collector = OBJECTDATA(obj,metrics_collector);
00306 if(temp_metrics_collector == NULL){
00307 gl_error("Unable to map object as metrics_collector object.");
00308 return 0;
00309 }
00310
00311
00312 if ((strcmp(temp_metrics_collector->parent_string, "triplex_meter") == 0) ||
00313 (strcmp(temp_metrics_collector->parent_string, "meter") == 0)) {
00314 metrics = temp_metrics_collector->metrics;
00315 int idx = 0;
00316 ary_billing_meters[idx++] = metrics[MTR_MIN_REAL_POWER];
00317 ary_billing_meters[idx++] = metrics[MTR_MAX_REAL_POWER];
00318 ary_billing_meters[idx++] = metrics[MTR_AVG_REAL_POWER];
00319 ary_billing_meters[idx++] = metrics[MTR_MIN_REAC_POWER];
00320 ary_billing_meters[idx++] = metrics[MTR_MAX_REAC_POWER];
00321 ary_billing_meters[idx++] = metrics[MTR_AVG_REAC_POWER];
00322 ary_billing_meters[idx++] = metrics[MTR_REAL_ENERGY];
00323 ary_billing_meters[idx++] = metrics[MTR_REAC_ENERGY];
00324
00325 ary_billing_meters[idx++] = metrics[MTR_BILL];
00326 ary_billing_meters[idx++] = metrics[MTR_MIN_VLL];
00327 ary_billing_meters[idx++] = metrics[MTR_MAX_VLL];
00328 ary_billing_meters[idx++] = metrics[MTR_AVG_VLL];
00329 ary_billing_meters[idx++] = metrics[MTR_MIN_VLN];
00330 ary_billing_meters[idx++] = metrics[MTR_MAX_VLN];
00331 ary_billing_meters[idx++] = metrics[MTR_AVG_VLN];
00332 ary_billing_meters[idx++] = metrics[MTR_MIN_VUNB];
00333 ary_billing_meters[idx++] = metrics[MTR_MAX_VUNB];
00334 ary_billing_meters[idx++] = metrics[MTR_AVG_VUNB];
00335 ary_billing_meters[idx++] = metrics[MTR_ABOVE_A_DUR];
00336 ary_billing_meters[idx++] = metrics[MTR_ABOVE_A_CNT];
00337 ary_billing_meters[idx++] = metrics[MTR_BELOW_A_DUR];
00338 ary_billing_meters[idx++] = metrics[MTR_BELOW_A_CNT];
00339 ary_billing_meters[idx++] = metrics[MTR_ABOVE_B_DUR];
00340 ary_billing_meters[idx++] = metrics[MTR_ABOVE_B_CNT];
00341 ary_billing_meters[idx++] = metrics[MTR_BELOW_B_DUR];
00342 ary_billing_meters[idx++] = metrics[MTR_BELOW_B_CNT];
00343 ary_billing_meters[idx++] = metrics[MTR_BELOW_10_DUR];
00344 ary_billing_meters[idx++] = metrics[MTR_BELOW_10_CNT];
00345 string key = temp_metrics_collector->parent_name;
00346 billing_meter_objects[key] = ary_billing_meters;
00347 }
00348 else if (strcmp(temp_metrics_collector->parent_string, "house") == 0) {
00349 metrics = temp_metrics_collector->metrics;
00350 string key = temp_metrics_collector->parent_name;
00351
00352 if (house_objects.isMember(key)) {
00353 int idx = 0;
00354 house_objects[key][idx++] = metrics[HSE_MIN_TOTAL_LOAD];
00355 house_objects[key][idx++] = metrics[HSE_MAX_TOTAL_LOAD];
00356 house_objects[key][idx++] = metrics[HSE_AVG_TOTAL_LOAD];
00357 house_objects[key][idx++] = metrics[HSE_MIN_HVAC_LOAD];
00358 house_objects[key][idx++] = metrics[HSE_MAX_HVAC_LOAD];
00359 house_objects[key][idx++] = metrics[HSE_AVG_HVAC_LOAD];
00360 house_objects[key][idx++] = metrics[HSE_MIN_AIR_TEMP];
00361 house_objects[key][idx++] = metrics[HSE_MAX_AIR_TEMP];
00362 house_objects[key][idx++] = metrics[HSE_AVG_AIR_TEMP];
00363 house_objects[key][idx++] = metrics[HSE_AVG_DEV_COOLING];
00364 house_objects[key][idx++] = metrics[HSE_AVG_DEV_HEATING];
00365
00366 } else {
00367 int idx = 0;
00368 ary_houses[idx++] = metrics[HSE_MIN_TOTAL_LOAD];
00369 ary_houses[idx++] = metrics[HSE_MAX_TOTAL_LOAD];
00370 ary_houses[idx++] = metrics[HSE_AVG_TOTAL_LOAD];
00371 ary_houses[idx++] = metrics[HSE_MIN_HVAC_LOAD];
00372 ary_houses[idx++] = metrics[HSE_MAX_HVAC_LOAD];
00373 ary_houses[idx++] = metrics[HSE_AVG_HVAC_LOAD];
00374 ary_houses[idx++] = metrics[HSE_MIN_AIR_TEMP];
00375 ary_houses[idx++] = metrics[HSE_MAX_AIR_TEMP];
00376 ary_houses[idx++] = metrics[HSE_AVG_AIR_TEMP];
00377 ary_houses[idx++] = metrics[HSE_AVG_DEV_COOLING];
00378 ary_houses[idx++] = metrics[HSE_AVG_DEV_HEATING];
00379 for (int j = 0; j < WH_ARRAY_SIZE; j++) {
00380 ary_houses[idx++] = 0.0;
00381 }
00382 house_objects[key] = ary_houses;
00383 }
00384 }
00385 else if (strcmp(temp_metrics_collector->parent_string, "waterheater") == 0) {
00386 metrics = temp_metrics_collector->metrics;
00387 string key = temp_metrics_collector->parent_name;
00388 if (house_objects.isMember(key)) {
00389 int idx = HSE_ARRAY_SIZE;
00390 house_objects[key][idx++] = metrics[WH_MIN_ACTUAL_LOAD];
00391 house_objects[key][idx++] = metrics[WH_MAX_ACTUAL_LOAD];
00392 house_objects[key][idx++] = metrics[WH_AVG_ACTUAL_LOAD];
00393 } else {
00394 int idx = 0;
00395 for (int j = 0; j < HSE_ARRAY_SIZE; j++) {
00396 ary_houses[idx++] = 0.0;
00397 }
00398 ary_houses[idx++] = metrics[WH_MIN_ACTUAL_LOAD];
00399 ary_houses[idx++] = metrics[WH_MAX_ACTUAL_LOAD];
00400 ary_houses[idx++] = metrics[WH_AVG_ACTUAL_LOAD];
00401 house_objects[key] = ary_houses;
00402 }
00403 }
00404 else if (strcmp(temp_metrics_collector->parent_string, "inverter") == 0) {
00405 metrics = temp_metrics_collector->metrics;
00406 int idx = 0;
00407 ary_inverters[idx++] = metrics[INV_MIN_REAL_POWER];
00408 ary_inverters[idx++] = metrics[INV_MAX_REAL_POWER];
00409 ary_inverters[idx++] = metrics[INV_AVG_REAL_POWER];
00410 ary_inverters[idx++] = metrics[INV_MIN_REAC_POWER];
00411 ary_inverters[idx++] = metrics[INV_MAX_REAC_POWER];
00412 ary_inverters[idx++] = metrics[INV_AVG_REAC_POWER];
00413 string key = temp_metrics_collector->parent_name;
00414 inverter_objects[key] = ary_inverters;
00415 }
00416 else if (strcmp(temp_metrics_collector->parent_string, "capacitor") == 0) {
00417 metrics = temp_metrics_collector->metrics;
00418 int idx = 0;
00419 ary_capacitors[idx++] = metrics[CAP_OPERATION_CNT];
00420 string key = temp_metrics_collector->parent_name;
00421 capacitor_objects[key] = ary_capacitors;
00422 }
00423 else if (strcmp(temp_metrics_collector->parent_string, "regulator") == 0) {
00424 metrics = temp_metrics_collector->metrics;
00425 int idx = 0;
00426 ary_regulators[idx++] = metrics[REG_OPERATION_CNT];
00427 string key = temp_metrics_collector->parent_name;
00428 regulator_objects[key] = ary_regulators;
00429 }
00430 else if (strcmp(temp_metrics_collector->parent_string, "swingbus") == 0) {
00431 metrics = temp_metrics_collector->metrics;
00432 int idx = 0;
00433 ary_feeders[idx++] = metrics[FDR_MIN_REAL_POWER];
00434 ary_feeders[idx++] = metrics[FDR_MAX_REAL_POWER];
00435 ary_feeders[idx++] = metrics[FDR_AVG_REAL_POWER];
00436 ary_feeders[idx++] = metrics[FDR_MED_REAL_POWER];
00437 ary_feeders[idx++] = metrics[FDR_MIN_REAC_POWER];
00438 ary_feeders[idx++] = metrics[FDR_MAX_REAC_POWER];
00439 ary_feeders[idx++] = metrics[FDR_AVG_REAC_POWER];
00440 ary_feeders[idx++] = metrics[FDR_MED_REAC_POWER];
00441 ary_feeders[idx++] = metrics[FDR_REAL_ENERGY];
00442 ary_feeders[idx++] = metrics[FDR_REAC_ENERGY];
00443 ary_feeders[idx++] = metrics[FDR_MIN_REAL_LOSS];
00444 ary_feeders[idx++] = metrics[FDR_MAX_REAL_LOSS];
00445 ary_feeders[idx++] = metrics[FDR_AVG_REAL_LOSS];
00446 ary_feeders[idx++] = metrics[FDR_MED_REAL_LOSS];
00447 ary_feeders[idx++] = metrics[FDR_MIN_REAC_LOSS];
00448 ary_feeders[idx++] = metrics[FDR_MAX_REAC_LOSS];
00449 ary_feeders[idx++] = metrics[FDR_AVG_REAC_LOSS];
00450 ary_feeders[idx++] = metrics[FDR_MED_REAC_LOSS];
00451 string key = temp_metrics_collector->parent_name;
00452 feeder_information[key] = ary_feeders;
00453 }
00454 index++;
00455 }
00456
00457
00458
00459 metrics_writer_billing_meters[time_str] = billing_meter_objects;
00460 metrics_writer_houses[time_str] = house_objects;
00461 metrics_writer_inverters[time_str] = inverter_objects;
00462 metrics_writer_capacitors[time_str] = capacitor_objects;
00463 metrics_writer_regulators[time_str] = regulator_objects;
00464 metrics_writer_feeder_information[time_str] = feeder_information;
00465
00466 if (final_write <= t1) {
00467
00468 Json::StyledWriter writer;
00469
00470
00471 ofstream out_file;
00472
00473
00474 out_file.open (filename_billing_meter);
00475 out_file << writer.write(metrics_writer_billing_meters) << endl;
00476 out_file.close();
00477
00478 out_file.open (filename_house);
00479 out_file << writer.write(metrics_writer_houses) << endl;
00480 out_file.close();
00481
00482 out_file.open (filename_inverter);
00483 out_file << writer.write(metrics_writer_inverters) << endl;
00484 out_file.close();
00485
00486 out_file.open (filename_capacitor);
00487 out_file << writer.write(metrics_writer_capacitors) << endl;
00488 out_file.close();
00489
00490 out_file.open (filename_regulator);
00491 out_file << writer.write(metrics_writer_regulators) << endl;
00492 out_file.close();
00493
00494 out_file.open (filename_substation);
00495 out_file << writer.write(metrics_writer_feeder_information) << endl;
00496 out_file.close();
00497 }
00498
00499 return 1;
00500 }
00501
00502
00503 EXPORT int create_metrics_collector_writer(OBJECT **obj, OBJECT *parent){
00504 int rv = 0;
00505 try {
00506 *obj = gl_create_object(metrics_collector_writer::oclass);
00507 if(*obj != NULL){
00508 metrics_collector_writer *my = OBJECTDATA(*obj, metrics_collector_writer);
00509 gl_set_parent(*obj, parent);
00510 rv = my->create();
00511 }
00512 }
00513 catch (char *msg){
00514 gl_error("create_metrics_collector_writer: %s", msg);
00515 }
00516 catch (const char *msg){
00517 gl_error("create_metrics_collector_writer: %s", msg);
00518 }
00519 catch (...){
00520 gl_error("create_metrics_collector_writer: unexpected exception caught");
00521 }
00522 return rv;
00523 }
00524
00525 EXPORT int init_metrics_collector_writer(OBJECT *obj){
00526 metrics_collector_writer *my = OBJECTDATA(obj, metrics_collector_writer);
00527 int rv = 0;
00528 try {
00529 rv = my->init(obj->parent);
00530 }
00531 catch (char *msg){
00532 gl_error("init_metrics_collector_writer: %s", msg);
00533 }
00534 catch (const char *msg){
00535 gl_error("init_metrics_collector_writer: %s", msg);
00536 }
00537 return rv;
00538 }
00539
00540 EXPORT TIMESTAMP sync_metrics_collector_writer(OBJECT *obj, TIMESTAMP t0, PASSCONFIG pass){
00541 metrics_collector_writer *my = OBJECTDATA(obj, metrics_collector_writer);
00542 TIMESTAMP rv = 0;
00543 try {
00544 switch(pass){
00545 case PC_PRETOPDOWN:
00546 rv = TS_NEVER;
00547 break;
00548 case PC_BOTTOMUP:
00549 rv = TS_NEVER;
00550 break;
00551 case PC_POSTTOPDOWN:
00552 rv = my->postsync(obj->clock, t0);
00553 obj->clock = t0;
00554 break;
00555 default:
00556 throw "invalid pass request";
00557 }
00558 }
00559 catch(char *msg){
00560 gl_error("sync_metrics_collector_writer: %s", msg);
00561 }
00562 catch(const char *msg){
00563 gl_error("sync_metrics_collector_writer: %s", msg);
00564 }
00565 return rv;
00566 }
00567
00568 EXPORT int commit_metrics_collector_writer(OBJECT *obj){
00569 int rv = 0;
00570 metrics_collector_writer *my = OBJECTDATA(obj, metrics_collector_writer);
00571 try {
00572 rv = my->commit(obj->clock);
00573 }
00574 catch (char *msg){
00575 gl_error("commit_metrics_collector_writer: %s", msg);
00576 }
00577 catch (const char *msg){
00578 gl_error("commit_metrics_collector_writer: %s", msg);
00579 }
00580 return rv;
00581 }
00582
00583 EXPORT int isa_metrics_collector_writer(OBJECT *obj, char *classname)
00584 {
00585 return OBJECTDATA(obj, metrics_collector_writer)->isa(classname);
00586 }
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596