def generate_records()

in meter-data/generate_meter_data.py [0:0]


def generate_records(first_meter_no, last_meter_no, start_time, end_time, data_dir):
    read_interval_minutes = 15

    meter_reading_min = 0
    meter_reading_max = 999999999
    meter_reading_max_increment = 50
    meter_reading_min_increment = 5

    register_read_type = READING_TYPE['INT']  # kW
    consumption_type = READING_TYPE['AGG']  # kWH

    # load db
    meterlist = create_db(first_meter_no, last_meter_no)

    while start_time <= end_time:
        register_read_rows = []
        consumption_rows = []
        combined_list = []
        error_record_rows = []
        logging.debug('Timestamp: ' + start_time.strftime('%Y-%m-%d %H:%M:%S'))

        for meter in meterlist:
            # Assuming there is 1:1 mapping between INT and AGG registers,
            # get the count of INT registers and generate values for both
            # register types
            int_register_list = OBIS_CODES['INT_REGISTERS']
            agg_register_list = OBIS_CODES['AGG_REGISTERS']
            register_count = len(int_register_list)
            for i in range(0, register_count):
                unit_consumed = get_random(meter_reading_min_increment, meter_reading_max_increment)

                # increment register reading value by randomly generated units consumed.
                # reset the value if incrementing the meter reading value makes it go past max value.
                new_reading_value = meter[int_register_list[i]] + unit_consumed
                if new_reading_value > meter_reading_max:
                    new_reading_value = new_reading_value - meter_reading_max

                logging.debug(
                    'Meter id: {}, INT register: {}, AGG register: {}, units consumed: {}, last reading: {}, new reading: {}'.format(
                        meter['meter_id'], int_register_list[i], agg_register_list[i], unit_consumed,
                        meter[int_register_list[i]], new_reading_value))

                # Add fields into an appropriate list
                # meter_id, register, reading_time, reading_value, reading_type
                register_read_row = [meter['meter_id'], int_register_list[i], start_time.strftime('%Y%m%d%H24%M%S'),
                                     new_reading_value, register_read_type]
                register_read_row.extend(CONSTANT_FIELDS)
                consumption_row = [meter['meter_id'], agg_register_list[i], start_time.strftime('%Y%m%d%H24%M%S'),
                                   unit_consumed, consumption_type]
                consumption_row.extend(CONSTANT_FIELDS)

                # set values in the db
                meter[int_register_list[i]] = new_reading_value
                meter[agg_register_list[i]] = unit_consumed

                error_code = get_error_code(meter['meter_id'], start_time)
                # If Valid error code is returned, create a error record.
                # Make a record as error record by replacing the register_read_type value to error code,
                # instead of AGG or INT
                if error_code != -1:
                    register_read_row[3] = error_code
                    register_read_row[4] = "ERR"
                    error_record_rows.append(register_read_row)

                logging.debug(register_read_row)
                register_read_rows.append(register_read_row)
                combined_list.append(register_read_row)
                logging.debug(consumption_row)
                consumption_rows.append(consumption_row)
                combined_list.append(consumption_row)

        logging.debug('---------------')
        start_time = start_time + timedelta(minutes=read_interval_minutes)

        # # shuffle the rows and write to file
        # random.shuffle(register_read_rows)
        # write('data/register_reads.csv', register_read_rows)
        # write('data/error_register_reads.csv', error_record_rows)
        # random.shuffle(consumption_rows)
        # write('data/consumption.csv', consumption_rows)
        # # shuffle combined records in the list and write to file
        # random.shuffle(combined_list)
        # write('data/combined_data.csv', combined_list)

        # create the filename of the format below
        # [directory]/cd-[meter-no]-[register-read-time].csv
        # e.g. data/cd-34-2020-12-28-03-55-43.csv
        data_filename = data_dir + '/cd-' + str(start_time.strftime('%Y-%m-%d-%H-%M-%S')) + '-M' + str(
            first_meter_no) + '-M' + str(last_meter_no) + '.csv'
        # Overwrite filename, to generate less no. of files, but larger in size
        data_filename = data_dir + '/data' + '-M' + str(first_meter_no) + '-M' + str(last_meter_no) + '.csv'
        random.shuffle(combined_list)
        write(data_filename, combined_list)
        # write_in_chunks(data_filename, combined_list)
        logging.info("Finished writing records for meters {} to {} for time {}".format(first_meter_no, last_meter_no,
                                                                                       start_time))

    # write updated readings into meter db
    save_db(meterlist, get_meter_db_filename(first_meter_no, last_meter_no))