diff --git a/logging_setup.py b/logging_setup.py index cc939c0200a515a1cde3fba9d701eb19f4f410f5..232e66635c47ef462893f390313e2db3c5753bf8 100644 --- a/logging_setup.py +++ b/logging_setup.py @@ -36,15 +36,15 @@ def setup_loggers(mqtt=True): # Set message logging format and level log_format = '%(asctime)-15s | %(process)d | %(levelname)s: %(message)s' logging_to_console = EXEC_LOGGING_CONFIG['logging_to_console'] - msg_handler = CompressedSizedTimedRotatingFileHandler(exec_log_filename, max_bytes=EXEC_LOGGING_CONFIG['max_bytes'], + exec_handler = CompressedSizedTimedRotatingFileHandler(exec_log_filename, max_bytes=EXEC_LOGGING_CONFIG['max_bytes'], backup_count=EXEC_LOGGING_CONFIG['backup_count'], when=EXEC_LOGGING_CONFIG['when'], interval=EXEC_LOGGING_CONFIG['interval']) - msg_formatter = logging.Formatter(log_format) - msg_formatter.converter = gmtime - msg_formatter.datefmt = '%Y/%m/%d %H:%M:%S UTC' - msg_handler.setFormatter(msg_formatter) - exec_logger.addHandler(msg_handler) + exec_formatter = logging.Formatter(log_format) + exec_formatter.converter = gmtime + exec_formatter.datefmt = '%Y/%m/%d %H:%M:%S UTC' + exec_handler.setFormatter(exec_formatter) + exec_logger.addHandler(exec_handler) exec_logger.setLevel(logging_level) if logging_to_console: @@ -52,7 +52,7 @@ def setup_loggers(mqtt=True): if mqtt: mqtt_msg_handler = MQTTHandler(MQTT_LOGGING_CONFIG['hostname'], MQTT_LOGGING_CONFIG['exec_topic']) mqtt_msg_handler.setLevel(logging_level) - mqtt_msg_handler.setFormatter(msg_formatter) + mqtt_msg_handler.setFormatter(exec_formatter) exec_logger.addHandler(mqtt_msg_handler) # Set data logging level and handler @@ -69,30 +69,30 @@ def setup_loggers(mqtt=True): return exec_logger, exec_log_filename, data_logger, data_log_filename, logging_level -def init_logging(msg_logger, logging_level, log_path, data_log_filename): +def init_logging(exec_logger, logging_level, log_path, data_log_filename): """ This is the init sequence for the logging system """ init_logging_status = True - msg_logger.info('') - msg_logger.info('****************************') - msg_logger.info('*** NEW SESSION STARTING ***') - msg_logger.info('****************************') - msg_logger.info('') - msg_logger.info('Logging level: %s' % logging_level) + exec_logger.info('') + exec_logger.info('****************************') + exec_logger.info('*** NEW SESSION STARTING ***') + exec_logger.info('****************************') + exec_logger.info('') + exec_logger.info('Logging level: %s' % logging_level) try: st = statvfs('.') available_space = st.f_bavail * st.f_frsize / 1024 / 1024 - msg_logger.info(f'Remaining disk space : {available_space:.1f} MB') + exec_logger.info(f'Remaining disk space : {available_space:.1f} MB') except Exception as e: - msg_logger.debug('Unable to get remaining disk space: {e}') - msg_logger.info('Saving data log to ' + data_log_filename) - msg_logger.info('OhmPi settings:') + exec_logger.debug('Unable to get remaining disk space: {e}') + exec_logger.info('Saving data log to ' + data_log_filename) + exec_logger.info('OhmPi settings:') # TODO Add OhmPi settings config_dict = {'execution logging configuration': json.dumps(EXEC_LOGGING_CONFIG, indent=4), 'data logging configuration': json.dumps(DATA_LOGGING_CONFIG, indent=4), 'mqtt logging configuration': json.dumps(MQTT_LOGGING_CONFIG, indent=4)} for k, v in config_dict.items(): - msg_logger.info(f'{k}:\n{v}') - msg_logger.info('') - msg_logger.info(f'init_logging_status: {init_logging_status}') + exec_logger.info(f'{k}:\n{v}') + exec_logger.info('') + exec_logger.info(f'init_logging_status: {init_logging_status}') return init_logging_status diff --git a/ohmpi.py b/ohmpi.py index bb43a99cb05f33e48442937c02e5b87e42460fe4..649857cbc308d939af526245d07dde8a7c748c9c 100644 --- a/ohmpi.py +++ b/ohmpi.py @@ -55,7 +55,7 @@ class OhmPi(object): Either 'print' for a console output or 'mqtt' for publication onto MQTT broker. """ - def __init__(self, config=None, sequence=None, output='print', data_logger=None, msg_logger=None, soh_logger=None, + def __init__(self, config=None, sequence=None, output='print', data_logger=None, exec_logger=None, soh_logger=None, on_pi=None): # flags and attributes if on_pi is None: @@ -67,7 +67,7 @@ class OhmPi(object): self.thread = None # contains the handle for the thread taking the measurement self.path = 'data/' # where to save the .csv self.data_logger = data_logger - self.msg_logger = msg_logger + self.exec_logger = exec_logger self.soh_logger = soh_logger # read in hardware parameters (settings.py) @@ -86,7 +86,7 @@ class OhmPi(object): if config is not None: self._read_acquisition_parameters(config) - self.log_msg('Initialized with configuration:' + str(self.pardict), level='debug') + self.log_exec('Initialized with configuration:' + str(self.pardict), level='debug') # read quadrupole sequence if sequence is None: @@ -108,7 +108,7 @@ class OhmPi(object): # ADS1115 for voltage measurement (MN) self.ads_voltage = ads.ADS1115(self.i2c, gain=2/3, data_rate=860, address=0x49) - def log_msg(self, msg, level='debug'): + def log_exec(self, msg, level='debug'): """Function for output management. Parameters @@ -120,8 +120,8 @@ class OhmPi(object): """ # TODO all message to be logged using python logging library and rotating log - if self.msg_logger is not None: - self.msg_logger.info(msg) + if self.exec_logger is not None: + self.exec_logger.info(msg) # if self.output == 'print': # if level == 'error': # print(colored(level.upper() + ' : ' + msg, 'red')) @@ -155,7 +155,7 @@ class OhmPi(object): with open(config) as json_file: dic = json.load(json_file) self.pardict.update(dic) - self.log_msg('Acquisition parameters updated: ' + str(self.pardict), level='debug') + self.log_exec('Acquisition parameters updated: ' + str(self.pardict), level='debug') def _read_hardware_parameters(self): """Read hardware parameters from settings.py. @@ -164,7 +164,7 @@ class OhmPi(object): self.id = OHMPI_CONFIG['id'] # ID of the OhmPi self.r_shunt = OHMPI_CONFIG['R_shunt'] # reference resistance value in ohm self.Imax = OHMPI_CONFIG['Imax'] # maximum current - self.log_msg(f'The maximum current cannot be higher than {self.Imax} mA', level='warn') + self.log_exec(f'The maximum current cannot be higher than {self.Imax} mA', level='warn') self.coef_p2 = OHMPI_CONFIG['coef_p2'] # slope for current conversion for ads.P2, measurement in V/V self.coef_p3 = OHMPI_CONFIG['coef_p3'] # slope for current conversion for ads.P3, measurement in V/V self.offset_p2 = OHMPI_CONFIG['offset_p2'] @@ -173,7 +173,7 @@ class OhmPi(object): self.version = OHMPI_CONFIG['version'] # hardware version self.max_elec = OHMPI_CONFIG['max_elec'] # maximum number of electrodes self.board_address = OHMPI_CONFIG['board_address'] - self.log_msg('OHMPI_CONFIG = ' + str(OHMPI_CONFIG), level='debug') + self.log_exec('OHMPI_CONFIG = ' + str(OHMPI_CONFIG), level='debug') @staticmethod def find_identical_in_line(quads): @@ -254,19 +254,19 @@ class OhmPi(object): # if statement with exit cases (TODO rajouter un else if pour le deuxième cas du ticket #2) if test_index_elec.size != 0: for i in range(len(test_index_elec[0, :])): - self.log_msg('Error: An electrode index at line ' + str(test_index_elec[0, i] + 1) + + self.log_exec('Error: An electrode index at line ' + str(test_index_elec[0, i] + 1) + ' exceeds the maximum number of electrodes', level='error') # sys.exit(1) output = None elif len(test_same_elec) != 0: for i in range(len(test_same_elec)): - self.log_msg('Error: An electrode index A == B detected at line ' + str(test_same_elec[i] + 1), - level="error") + self.log_exec('Error: An electrode index A == B detected at line ' + str(test_same_elec[i] + 1), + level="error") # sys.exit(1) output = None if output is not None: - self.log_msg('Sequence of {:d} quadrupoles read.'.format(output.shape[0]), level='debug') + self.log_exec('Sequence of {:d} quadrupoles read.'.format(output.shape[0]), level='debug') self.sequence = output @@ -319,9 +319,9 @@ class OhmPi(object): else: mcp2.get_pin(relay_nr-1).value = False - self.log_msg(f'Switching relay {relay_nr} {state} for electrode {electrode_nr}', level='debug') + self.log_exec(f'Switching relay {relay_nr} {state} for electrode {electrode_nr}', level='debug') else: - self.log_msg(f'Unable to address electrode nr {electrode_nr}', level='warn') + self.log_exec(f'Unable to address electrode nr {electrode_nr}', level='warn') def switch_mux_on(self, quadrupole): """Switch on multiplexer relays for given quadrupole. @@ -337,7 +337,7 @@ class OhmPi(object): for i in range(0, 4): self.switch_mux(quadrupole[i], 'on', roles[i]) else: - self.log_msg('A == B -> short circuit detected!', level='error') + self.log_exec('A == B -> short circuit detected!', level='error') def switch_mux_off(self, quadrupole): """Switch off multiplexer relays for given quadrupole. @@ -357,7 +357,7 @@ class OhmPi(object): for i in range(0, 4): for j in range(1, self.max_elec + 1): self.switch_mux(j, 'off', roles[i]) - self.log_msg('All MUX switched off.', level='debug') + self.log_exec('All MUX switched off.', level='debug') def run_measurement(self, quad, nb_stack=None, injection_duration=None): # NOTE: quad not used?! """ Do a 4 electrode measurement and measure transfer resistance obtained. @@ -460,16 +460,16 @@ class OhmPi(object): } # round number to two decimal for nicer string output - output = [f'{d[k]}\t' for k in d.keys] - output = output[:-1] + '\n' - for k in d.keys: + output = [f'{k}\t' for k in d.keys()] + output = str(output)[:-1] + '\n' + for k in d.keys(): if isinstance(d[k], float): val = np.round(d[k], 2) else: val = d[k] output += f'{val}\t' output = output[:-1] - self.log_msg(output, level='debug') + self.log_exec(output, level='debug') time.sleep(1) # NOTE: why this? return d @@ -495,7 +495,7 @@ class OhmPi(object): self.sequence = quads # run the RS check - self.log_msg('RS check (check contact resistance)', level='debug') + self.log_exec('RS check (check contact resistance)', level='debug') self.measure() # restore @@ -536,19 +536,19 @@ class OhmPi(object): """ self.run = True self.status = 'running' - self.log_msg('status = ' + self.status, level='debug') + self.log_exec('status = ' + self.status, level='debug') def func(): for g in range(0, self.pardict["nbr_meas"]): # for time-lapse monitoring if self.run is False: - self.log_msg('INTERRUPTED', level='debug') + self.log_exec('INTERRUPTED', level='debug') break t0 = time.time() # create filename with timestamp fname = self.pardict["export_path"].replace('.csv', '_' + datetime.now().strftime('%Y%m%dT%H%M%S') + '.csv') - self.log_msg('saving to ' + fname, level='debug') + self.log_exec('saving to ' + fname, level='debug') # make sure all multiplexer are off self.reset_mux() @@ -577,7 +577,7 @@ class OhmPi(object): # save data and print in a text file self.append_and_save(fname, current_measurement) - self.log_msg('{:d}/{:d}'.format(i + 1, self.sequence.shape[0]), level='debug') + self.log_exec('{:d}/{:d}'.format(i + 1, self.sequence.shape[0]), level='debug') # compute time needed to take measurement and subtract it from interval # between two sequence run (= sequence_delay) @@ -587,8 +587,8 @@ class OhmPi(object): if sleep_time < 0: # it means that the measuring time took longer than the sequence delay sleep_time = 0 - self.log_msg('The measuring time is longer than the sequence delay. Increase the sequence delay', - level='warn') + self.log_exec('The measuring time is longer than the sequence delay. Increase the sequence delay', + level='warn') # sleeping time between sequence if self.pardict["nbr_meas"] > 1: @@ -603,7 +603,7 @@ class OhmPi(object): self.run = False if self.thread is not None: self.thread.join() - self.log_msg('status = ' + self.status) + self.log_exec('status = ' + self.status) exec_logger, exec_log_filename, data_logger, data_log_filename, logging_level = setup_loggers() # TODO: add SOH diff --git a/requirements.txt b/requirements.txt index ef9dd3ef00dd254ea4754d5544a2b4f00bc445f6..e203227fb61ff6a6168f43af741e8459e407a2b4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,4 +7,4 @@ adafruit-circuitpython-tca9548a adafruit-circuitpython-mcp230xx gpiozero termcolor -board +pandas