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))