diff --git a/.dev/config_calib_test.py b/.dev/config_calib_test.py
new file mode 100644
index 0000000000000000000000000000000000000000..9d58602970ee8f6a7c8e380139425df5f768abe4
--- /dev/null
+++ b/.dev/config_calib_test.py
@@ -0,0 +1,138 @@
+import logging
+from ohmpi.utils import *
+from paho.mqtt.client import MQTTv31  # noqa
+
+_, on_pi = get_platform()
+# DEFINE THE ID OF YOUR OhmPi
+ohmpi_id = '0001' if on_pi else 'XXXX'
+# DEFINE YOUR MQTT BROKER (DEFAULT: 'localhost')
+mqtt_broker = 'localhost' if on_pi else 'NAME_YOUR_BROKER_WHEN_IN_SIMULATION_MODE_HERE'
+# DEFINE THE SUFFIX TO ADD TO YOUR LOGS FILES
+logging_suffix = ''
+
+# OhmPi configuration
+OHMPI_CONFIG = {
+    'id': ohmpi_id,  # Unique identifier of the OhmPi board (string)
+    'settings': 'settings/default.json',  # INSERT YOUR FAVORITE SETTINGS FILE HERE
+}
+
+r_shunt = 2
+
+# default properties of system components that will be
+# overwritten by properties defined in each the board dict below.
+# if bounds are defined in board specs, values out of specs will be bounded to remain in specs
+# omitted properties in config will be set to board specs default values if they exist
+
+HARDWARE_CONFIG = {
+    'ctl': {'model': 'raspberry_pi'},
+    'pwr': {'model': 'pwr_dph5005', 'voltage': 3., 'pwr_discharge_latency': 2.}, #, 'current_max':0.05,'current_overload':0.002}, # 'pwr_batt', 'voltage': 12.}, # 
+    'tx':  {'model': 'mb_2024_1_X',
+                 'voltage_max': 50.,  # Maximum voltage supported by the TX board [V]
+                 'current_max': 4.80/(50*r_shunt),  # Maximum voltage read by the current ADC on the TX board [A]
+                 'r_shunt': r_shunt,  # Shunt resistance in Ohms
+                 'interface_name': 'i2c',
+                 'vmn_hardware_offset': 2500.
+                },
+    'rx':  {'model': 'mb_2024_1_X',
+                 'latency': 0.010,  # latency in seconds in continuous mode
+                 'sampling_rate': 800,  # number of samples per second
+                 'interface_name': 'i2c',
+                },
+    'mux': {'boards':
+                 {'mux_01':
+                         {'model': 'mux_2024_0_X',
+                          'roles': ['A', 'B'],
+                          'electrodes': mux_2023_to_mux_2024_takeouts(range(1, 17)),
+                          'addr1': 'up',
+                          'addr2': 'up',
+                          'i2c_ext_tca_address': 0x70,
+                          'i2c_ext_tca_channel': 0,
+                          },
+                 'mux_02':
+                         {'model': 'mux_2024_0_X',
+                          'roles': ['M', 'N'],
+                          'electrodes': mux_2023_to_mux_2024_takeouts(range(1, 17)),
+                          'addr1': 'down',
+                          'addr2': 'down',
+                          'i2c_ext_tca_address': 0x70,
+                          'i2c_ext_tca_channel': 0,
+                         }
+
+                 },
+            'default': {'interface_name': 'i2c_ext',
+                             'voltage_max': 50.,
+                             'current_max': 3.}
+                }
+}
+# SET THE LOGGING LEVELS, MQTT BROKERS AND MQTT OPTIONS ACCORDING TO YOUR NEEDS
+# Execution logging configuration
+EXEC_LOGGING_CONFIG = {
+    'logging_level': logging.DEBUG,
+    'log_file_logging_level': logging.DEBUG,
+    'logging_to_console': True,
+    'file_name': f'exec{logging_suffix}.log',
+    'max_bytes': 3355443,
+    'backup_count': 30,
+    'when': 'd',
+    'interval': 1
+}
+
+# Data logging configuration
+DATA_LOGGING_CONFIG = {
+    'logging_level': logging.INFO,
+    'logging_to_console': True,
+    'file_name': f'data{logging_suffix}.log',
+    'max_bytes': 16777216,
+    'backup_count': 1024,
+    'when': 'd',
+    'interval': 1
+}
+
+# State of Health logging configuration (For a future release)
+SOH_LOGGING_CONFIG = {
+    'logging_level': logging.INFO,
+    'logging_to_console': True,
+    'log_file_logging_level': logging.INFO,
+    'file_name': f'soh{logging_suffix}.log',
+    'max_bytes': 16777216,
+    'backup_count': 1024,
+    'when': 'd',
+    'interval': 1
+}
+
+# MQTT logging configuration parameters
+MQTT_LOGGING_CONFIG = {
+    'hostname': mqtt_broker,
+    'port': 1883,
+    'qos': 2,
+    'retain': False,
+    'keepalive': 60,
+    'will': None,
+    'auth': {'username': 'mqtt_user', 'password': 'mqtt_password'},
+    'tls': None,
+    'protocol': MQTTv31,
+    'transport': 'tcp',
+    'client_id': f'{OHMPI_CONFIG["id"]}',
+    'exec_topic': f'ohmpi_{OHMPI_CONFIG["id"]}/exec',
+    'exec_logging_level': EXEC_LOGGING_CONFIG['logging_level'],
+    'data_topic': f'ohmpi_{OHMPI_CONFIG["id"]}/data',
+    'data_logging_level': DATA_LOGGING_CONFIG['logging_level'],
+    'soh_topic': f'ohmpi_{OHMPI_CONFIG["id"]}/soh',
+    'soh_logging_level': SOH_LOGGING_CONFIG['logging_level']
+}
+
+# MQTT control configuration parameters
+MQTT_CONTROL_CONFIG = {
+    'hostname': mqtt_broker,
+    'port': 1883,
+    'qos': 2,
+    'retain': False,
+    'keepalive': 60,
+    'will': None,
+    'auth': {'username': 'mqtt_user', 'password': 'mqtt_password'},
+    'tls': None,
+    'protocol': MQTTv31,
+    'transport': 'tcp',
+    'client_id': f'{OHMPI_CONFIG["id"]}',
+    'ctrl_topic': f'ohmpi_{OHMPI_CONFIG["id"]}/ctrl'
+}
diff --git a/.dev/test_contact_resistance_board3.py b/.dev/test_contact_resistance_board3.py
new file mode 100644
index 0000000000000000000000000000000000000000..6667c7e35b8e19f440c6cc6ec675ee94f4254f4a
--- /dev/null
+++ b/.dev/test_contact_resistance_board3.py
@@ -0,0 +1,64 @@
+import os
+import numpy as np
+import time
+os.chdir("/home/pi/OhmPi")
+from ohmpi.ohmpi import OhmPi
+#from ohmpi.tests import contact_resistance_test_board
+
+#######################
+
+strategy = 'constant'
+min_agg = True
+r_ground = 5
+vab_min = None
+vab_req = 5.
+vab_max = 12.
+iab_min = 0.0025
+iab_req = 0.005
+iab_max = None
+vmn_min = 0.75
+vmn_req = 2.
+vmn_max = None
+pab_min = 0.0125
+pab_req = 0.0625
+pab_max = None
+
+#######################
+
+# Define object from class OhmPi
+k = OhmPi()
+k.reset_mux()
+# Set or load sequence
+sequence = np.array([np.array([1,2,3,4])+k for k in range(29)]) # [[1,2,3,4],[2,3,4,5]...] but can actually make other combinations of AB to increase number of contact resistance tested
+sequence = np.vstack([sequence,np.array([[30,31,2,1],[31,32,3,2]])])
+#sequence = sequence[:2]
+#k.sequence = contact_resistance_test_board(sequence) # checks if sequence contains potential shortcut quads (AB odd odd or even even)
+k.sequence = sequence
+
+if strategy == 'vmin':
+    k.update_settings({'strategy': strategy, 'vmn_req': vmn_req})
+    k.update_settings({'export_path':f'data/r{r_ground}_{strategy}_{vmn_req:.1f}.csv'})
+
+elif strategy == 'vmax':
+    k.update_settings({'strategy': strategy})
+    k.update_settings({'export_path':f'data/r{r_ground}_{strategy}.csv'})
+elif strategy == 'flex':
+    k.update_settings({'strategy': strategy})
+    k.update_settings({'vab_min': vab_min, 'vab_req': vab_req, 'vab_max': vab_max, 'iab_min': iab_min, 'iab_req': iab_req, 'iab_max': iab_max, 
+                       'vmn_min': vmn_min, 'vmn_req': vmn_req, 'vmn_max': vmn_max, 'pab_min': pab_min, 'pab_req': pab_req, 'pab_max': pab_max, 'min_agg': min_agg}) 
+    k.update_settings({'export_path':f'data/r{r_ground}_{strategy}_vab-{vab_min}-{vab_req}-{vab_max}_iab-{iab_min}-{iab_req}-{iab_max}_vmn-{vmn_min}-{vmn_req}-{vmn_max}_pab-{pab_min}-{pab_req}-{pab_max}_{min_agg}.csv'})
+
+elif strategy == "constant":
+    k.update_settings({'strategy': strategy})
+    k.update_settings({'vab_min': vab_min, 'vab_req': vab_req, 'vab_max': vab_max}) 
+    k.update_settings({'export_path':f'data/r{r_ground}_{strategy}_vab_req-{vab_req}-vab_max-{vab_max}.csv'})
+
+print(f'Settings: {k.settings}')
+# Run contact resistance check
+#k.rs_check()
+#print('TX',k._hw.tx.specs, 'PWR', k._hw.pwr.specs, 'RX', k._hw.rx.specs)
+#print(k._hw.vab_min)
+# Run sequence
+#kwargs = {'vab_square_wave':{'append':False}}
+k.run_sequence(nb_stack=2, injection_duration=.5, duty_cycle=1.,save_strategy_fw=True)
+#k.plot_last_fw()