@@ 415-550 (lines=136) @@ | ||
412 | # Step 8: calculate base period fractions |
|
413 | ################################################################################################################ |
|
414 | base = dict() |
|
415 | if fraction_list is not None and len(fraction_list) > 0: |
|
416 | for fraction in fraction_list: |
|
417 | base[fraction['id']] = dict() |
|
418 | base[fraction['id']]['name'] = fraction['name'] |
|
419 | base[fraction['id']]['unit'] = fraction['numerator_meter_unit'] + '/' + \ |
|
420 | fraction['denominator_meter_unit'] |
|
421 | base[fraction['id']]['numerator_timestamps'] = list() |
|
422 | base[fraction['id']]['numerator_values'] = list() |
|
423 | base[fraction['id']]['numerator_cumulation'] = Decimal(0.0) |
|
424 | base[fraction['id']]['denominator_timestamps'] = list() |
|
425 | base[fraction['id']]['denominator_values'] = list() |
|
426 | base[fraction['id']]['denominator_cumulation'] = Decimal(0.0) |
|
427 | base[fraction['id']]['timestamps'] = list() |
|
428 | base[fraction['id']]['values'] = list() |
|
429 | base[fraction['id']]['cumulation'] = Decimal(0.0) |
|
430 | # query numerator meter output |
|
431 | if fraction['numerator_meter_type'] == 'meter': |
|
432 | query = (" SELECT start_datetime_utc, actual_value " |
|
433 | " FROM tbl_meter_hourly " |
|
434 | " WHERE meter_id = %s " |
|
435 | " AND start_datetime_utc >= %s " |
|
436 | " AND start_datetime_utc < %s " |
|
437 | " ORDER BY start_datetime_utc ") |
|
438 | elif fraction['numerator_meter_type'] == 'offline_meter': |
|
439 | query = (" SELECT start_datetime_utc, actual_value " |
|
440 | " FROM tbl_offline_meter_hourly " |
|
441 | " WHERE offline_meter_id = %s " |
|
442 | " AND start_datetime_utc >= %s " |
|
443 | " AND start_datetime_utc < %s " |
|
444 | " ORDER BY start_datetime_utc ") |
|
445 | elif fraction['numerator_meter_type'] == 'virtual_meter': |
|
446 | query = (" SELECT start_datetime_utc, actual_value " |
|
447 | " FROM tbl_virtual_meter_hourly " |
|
448 | " WHERE virtual_meter_id = %s " |
|
449 | " AND start_datetime_utc >= %s " |
|
450 | " AND start_datetime_utc < %s " |
|
451 | " ORDER BY start_datetime_utc ") |
|
452 | ||
453 | cursor_energy.execute(query, (fraction['numerator_meter_id'], |
|
454 | base_start_datetime_utc, |
|
455 | base_end_datetime_utc)) |
|
456 | rows_numerator_meter_hourly = cursor_energy.fetchall() |
|
457 | ||
458 | rows_numerator_meter_periodically = \ |
|
459 | utilities.aggregate_hourly_data_by_period(rows_numerator_meter_hourly, |
|
460 | base_start_datetime_utc, |
|
461 | base_end_datetime_utc, |
|
462 | period_type) |
|
463 | # query denominator meter input |
|
464 | if fraction['denominator_meter_type'] == 'meter': |
|
465 | query = (" SELECT start_datetime_utc, actual_value " |
|
466 | " FROM tbl_meter_hourly " |
|
467 | " WHERE meter_id = %s " |
|
468 | " AND start_datetime_utc >= %s " |
|
469 | " AND start_datetime_utc < %s " |
|
470 | " ORDER BY start_datetime_utc ") |
|
471 | elif fraction['denominator_meter_type'] == 'offline_meter': |
|
472 | query = (" SELECT start_datetime_utc, actual_value " |
|
473 | " FROM tbl_offline_meter_hourly " |
|
474 | " WHERE offline_meter_id = %s " |
|
475 | " AND start_datetime_utc >= %s " |
|
476 | " AND start_datetime_utc < %s " |
|
477 | " ORDER BY start_datetime_utc ") |
|
478 | elif fraction['denominator_meter_type'] == 'virtual_meter': |
|
479 | query = (" SELECT start_datetime_utc, actual_value " |
|
480 | " FROM tbl_virtual_meter_hourly " |
|
481 | " WHERE virtual_meter_id = %s " |
|
482 | " AND start_datetime_utc >= %s " |
|
483 | " AND start_datetime_utc < %s " |
|
484 | " ORDER BY start_datetime_utc ") |
|
485 | ||
486 | cursor_energy.execute(query, (fraction['denominator_meter_id'], |
|
487 | base_start_datetime_utc, |
|
488 | base_end_datetime_utc)) |
|
489 | rows_denominator_meter_hourly = cursor_energy.fetchall() |
|
490 | ||
491 | rows_denominator_meter_periodically = \ |
|
492 | utilities.aggregate_hourly_data_by_period(rows_denominator_meter_hourly, |
|
493 | base_start_datetime_utc, |
|
494 | base_end_datetime_utc, |
|
495 | period_type) |
|
496 | ||
497 | for row_numerator_meter_periodically in rows_numerator_meter_periodically: |
|
498 | current_datetime_local = row_numerator_meter_periodically[0].replace(tzinfo=timezone.utc) + \ |
|
499 | timedelta(minutes=timezone_offset) |
|
500 | if period_type == 'hourly': |
|
501 | current_datetime = current_datetime_local.isoformat()[0:19] |
|
502 | elif period_type == 'daily': |
|
503 | current_datetime = current_datetime_local.isoformat()[0:10] |
|
504 | elif period_type == 'weekly': |
|
505 | current_datetime = current_datetime_local.isoformat()[0:10] |
|
506 | elif period_type == 'monthly': |
|
507 | current_datetime = current_datetime_local.isoformat()[0:7] |
|
508 | elif period_type == 'yearly': |
|
509 | current_datetime = current_datetime_local.isoformat()[0:4] |
|
510 | ||
511 | actual_value = Decimal(0.0) if row_numerator_meter_periodically[1] is None \ |
|
512 | else row_numerator_meter_periodically[1] |
|
513 | ||
514 | base[fraction['id']]['numerator_timestamps'].append(current_datetime) |
|
515 | base[fraction['id']]['numerator_values'].append(actual_value) |
|
516 | base[fraction['id']]['numerator_cumulation'] += actual_value |
|
517 | ||
518 | for row_denominator_meter_periodically in rows_denominator_meter_periodically: |
|
519 | current_datetime_local = row_denominator_meter_periodically[0].replace(tzinfo=timezone.utc) + \ |
|
520 | timedelta(minutes=timezone_offset) |
|
521 | if period_type == 'hourly': |
|
522 | current_datetime = current_datetime_local.isoformat()[0:19] |
|
523 | elif period_type == 'daily': |
|
524 | current_datetime = current_datetime_local.isoformat()[0:10] |
|
525 | elif period_type == 'weekly': |
|
526 | current_datetime = current_datetime_local.isoformat()[0:10] |
|
527 | elif period_type == 'monthly': |
|
528 | current_datetime = current_datetime_local.isoformat()[0:7] |
|
529 | elif period_type == 'yearly': |
|
530 | current_datetime = current_datetime_local.isoformat()[0:4] |
|
531 | ||
532 | actual_value = Decimal(0.0) if row_denominator_meter_periodically[1] is None \ |
|
533 | else row_denominator_meter_periodically[1] |
|
534 | ||
535 | base[fraction['id']]['denominator_timestamps'].append(current_datetime) |
|
536 | base[fraction['id']]['denominator_values'].append(actual_value) |
|
537 | base[fraction['id']]['denominator_cumulation'] += actual_value |
|
538 | ||
539 | for i in range(len(base[fraction['id']]['denominator_timestamps'])): |
|
540 | timestamp = base[fraction['id']]['denominator_timestamps'][i] |
|
541 | base[fraction['id']]['timestamps'].append(timestamp) |
|
542 | value = (base[fraction['id']]['numerator_values'][i] / |
|
543 | base[fraction['id']]['denominator_values'][i]) \ |
|
544 | if base[fraction['id']]['denominator_values'][i] > Decimal(0.0) else Decimal(0.0) |
|
545 | base[fraction['id']]['values'].append(value) |
|
546 | ||
547 | cumulation = (base[fraction['id']]['numerator_cumulation'] / |
|
548 | base[fraction['id']]['denominator_cumulation']) \ |
|
549 | if base[fraction['id']]['denominator_cumulation'] > Decimal(0.0) else Decimal(0.0) |
|
550 | base[fraction['id']]['cumulation'] = cumulation |
|
551 | ||
552 | ################################################################################################################ |
|
553 | # Step 9: calculate reporting period fractions |
@@ 340-475 (lines=136) @@ | ||
337 | # Step 5: calculate base period fractions |
|
338 | ################################################################################################################ |
|
339 | base = dict() |
|
340 | if fraction_list is not None and len(fraction_list) > 0: |
|
341 | for fraction in fraction_list: |
|
342 | base[fraction['id']] = dict() |
|
343 | base[fraction['id']]['name'] = fraction['name'] |
|
344 | base[fraction['id']]['unit'] = fraction['numerator_meter_unit'] + '/' + \ |
|
345 | fraction['denominator_meter_unit'] |
|
346 | base[fraction['id']]['numerator_timestamps'] = list() |
|
347 | base[fraction['id']]['numerator_values'] = list() |
|
348 | base[fraction['id']]['numerator_cumulation'] = Decimal(0.0) |
|
349 | base[fraction['id']]['denominator_timestamps'] = list() |
|
350 | base[fraction['id']]['denominator_values'] = list() |
|
351 | base[fraction['id']]['denominator_cumulation'] = Decimal(0.0) |
|
352 | base[fraction['id']]['timestamps'] = list() |
|
353 | base[fraction['id']]['values'] = list() |
|
354 | base[fraction['id']]['cumulation'] = Decimal(0.0) |
|
355 | # query numerator meter output |
|
356 | if fraction['numerator_meter_type'] == 'meter': |
|
357 | query = (" SELECT start_datetime_utc, actual_value " |
|
358 | " FROM tbl_meter_hourly " |
|
359 | " WHERE meter_id = %s " |
|
360 | " AND start_datetime_utc >= %s " |
|
361 | " AND start_datetime_utc < %s " |
|
362 | " ORDER BY start_datetime_utc ") |
|
363 | elif fraction['numerator_meter_type'] == 'offline_meter': |
|
364 | query = (" SELECT start_datetime_utc, actual_value " |
|
365 | " FROM tbl_offline_meter_hourly " |
|
366 | " WHERE offline_meter_id = %s " |
|
367 | " AND start_datetime_utc >= %s " |
|
368 | " AND start_datetime_utc < %s " |
|
369 | " ORDER BY start_datetime_utc ") |
|
370 | elif fraction['numerator_meter_type'] == 'virtual_meter': |
|
371 | query = (" SELECT start_datetime_utc, actual_value " |
|
372 | " FROM tbl_virtual_meter_hourly " |
|
373 | " WHERE virtual_meter_id = %s " |
|
374 | " AND start_datetime_utc >= %s " |
|
375 | " AND start_datetime_utc < %s " |
|
376 | " ORDER BY start_datetime_utc ") |
|
377 | ||
378 | cursor_energy.execute(query, (fraction['numerator_meter_id'], |
|
379 | base_start_datetime_utc, |
|
380 | base_end_datetime_utc)) |
|
381 | rows_numerator_meter_hourly = cursor_energy.fetchall() |
|
382 | ||
383 | rows_numerator_meter_periodically = \ |
|
384 | utilities.aggregate_hourly_data_by_period(rows_numerator_meter_hourly, |
|
385 | base_start_datetime_utc, |
|
386 | base_end_datetime_utc, |
|
387 | period_type) |
|
388 | # query denominator meter input |
|
389 | if fraction['denominator_meter_type'] == 'meter': |
|
390 | query = (" SELECT start_datetime_utc, actual_value " |
|
391 | " FROM tbl_meter_hourly " |
|
392 | " WHERE meter_id = %s " |
|
393 | " AND start_datetime_utc >= %s " |
|
394 | " AND start_datetime_utc < %s " |
|
395 | " ORDER BY start_datetime_utc ") |
|
396 | elif fraction['denominator_meter_type'] == 'offline_meter': |
|
397 | query = (" SELECT start_datetime_utc, actual_value " |
|
398 | " FROM tbl_offline_meter_hourly " |
|
399 | " WHERE offline_meter_id = %s " |
|
400 | " AND start_datetime_utc >= %s " |
|
401 | " AND start_datetime_utc < %s " |
|
402 | " ORDER BY start_datetime_utc ") |
|
403 | elif fraction['denominator_meter_type'] == 'virtual_meter': |
|
404 | query = (" SELECT start_datetime_utc, actual_value " |
|
405 | " FROM tbl_virtual_meter_hourly " |
|
406 | " WHERE virtual_meter_id = %s " |
|
407 | " AND start_datetime_utc >= %s " |
|
408 | " AND start_datetime_utc < %s " |
|
409 | " ORDER BY start_datetime_utc ") |
|
410 | ||
411 | cursor_energy.execute(query, (fraction['denominator_meter_id'], |
|
412 | base_start_datetime_utc, |
|
413 | base_end_datetime_utc)) |
|
414 | rows_denominator_meter_hourly = cursor_energy.fetchall() |
|
415 | ||
416 | rows_denominator_meter_periodically = \ |
|
417 | utilities.aggregate_hourly_data_by_period(rows_denominator_meter_hourly, |
|
418 | base_start_datetime_utc, |
|
419 | base_end_datetime_utc, |
|
420 | period_type) |
|
421 | ||
422 | for row_numerator_meter_periodically in rows_numerator_meter_periodically: |
|
423 | current_datetime_local = row_numerator_meter_periodically[0].replace(tzinfo=timezone.utc) + \ |
|
424 | timedelta(minutes=timezone_offset) |
|
425 | if period_type == 'hourly': |
|
426 | current_datetime = current_datetime_local.isoformat()[0:19] |
|
427 | elif period_type == 'daily': |
|
428 | current_datetime = current_datetime_local.isoformat()[0:10] |
|
429 | elif period_type == 'weekly': |
|
430 | current_datetime = current_datetime_local.isoformat()[0:10] |
|
431 | elif period_type == 'monthly': |
|
432 | current_datetime = current_datetime_local.isoformat()[0:7] |
|
433 | elif period_type == 'yearly': |
|
434 | current_datetime = current_datetime_local.isoformat()[0:4] |
|
435 | ||
436 | actual_value = Decimal(0.0) if row_numerator_meter_periodically[1] is None \ |
|
437 | else row_numerator_meter_periodically[1] |
|
438 | ||
439 | base[fraction['id']]['numerator_timestamps'].append(current_datetime) |
|
440 | base[fraction['id']]['numerator_values'].append(actual_value) |
|
441 | base[fraction['id']]['numerator_cumulation'] += actual_value |
|
442 | ||
443 | for row_denominator_meter_periodically in rows_denominator_meter_periodically: |
|
444 | current_datetime_local = row_denominator_meter_periodically[0].replace(tzinfo=timezone.utc) + \ |
|
445 | timedelta(minutes=timezone_offset) |
|
446 | if period_type == 'hourly': |
|
447 | current_datetime = current_datetime_local.isoformat()[0:19] |
|
448 | elif period_type == 'daily': |
|
449 | current_datetime = current_datetime_local.isoformat()[0:10] |
|
450 | elif period_type == 'weekly': |
|
451 | current_datetime = current_datetime_local.isoformat()[0:10] |
|
452 | elif period_type == 'monthly': |
|
453 | current_datetime = current_datetime_local.isoformat()[0:7] |
|
454 | elif period_type == 'yearly': |
|
455 | current_datetime = current_datetime_local.isoformat()[0:4] |
|
456 | ||
457 | actual_value = Decimal(0.0) if row_denominator_meter_periodically[1] is None \ |
|
458 | else row_denominator_meter_periodically[1] |
|
459 | ||
460 | base[fraction['id']]['denominator_timestamps'].append(current_datetime) |
|
461 | base[fraction['id']]['denominator_values'].append(actual_value) |
|
462 | base[fraction['id']]['denominator_cumulation'] += actual_value |
|
463 | ||
464 | for i in range(len(base[fraction['id']]['denominator_timestamps'])): |
|
465 | timestamp = base[fraction['id']]['denominator_timestamps'][i] |
|
466 | base[fraction['id']]['timestamps'].append(timestamp) |
|
467 | value = (base[fraction['id']]['numerator_values'][i] / |
|
468 | base[fraction['id']]['denominator_values'][i]) \ |
|
469 | if base[fraction['id']]['denominator_values'][i] > Decimal(0.0) else Decimal(0.0) |
|
470 | base[fraction['id']]['values'].append(value) |
|
471 | ||
472 | cumulation = (base[fraction['id']]['numerator_cumulation'] / |
|
473 | base[fraction['id']]['denominator_cumulation']) \ |
|
474 | if base[fraction['id']]['denominator_cumulation'] > Decimal(0.0) else Decimal(0.0) |
|
475 | base[fraction['id']]['cumulation'] = cumulation |
|
476 | ||
477 | ################################################################################################################ |
|
478 | # Step 6: calculate reporting period fractions |