Data Logger (DAQ)¶
Data acquisition / switch unit control (Keysight 34970A/DAQ970A style)
Main DataLogger class for controlling SCPI Data Acquisition systems.
Supports generic SCPI-99 compliant DAQ systems and Keysight 34970A/DAQ970A series.
Installation
pip install "SCPI-Instrument-Control"
Features
- Multiple connection types: Ethernet/LAN, USB, GPIB
- Multi-channel scanning with configurable sample rates
- Support for voltage, current, resistance, temperature measurements
- Alarm/limit checking and scaling (mx+b)
- Data logging with timestamps
- Context manager support for automatic connection management
Feedback
Please report issues and suggestions at: https://github.com/little-did-I-know/SCPI-Instrument-Control/issues
Reading
dataclass
¶
Reading(value: float, channel: Optional[int] = None, timestamp: Optional[float] = None, unit: Optional[str] = None, alarm_state: Optional[str] = None)
A single measurement reading from the DAQ.
DataLogger
¶
DataLogger(host: str, port: int = 5025, timeout: float = 10.0, connection: Optional[BaseConnection] = None)
Main class for controlling SCPI Data Acquisition systems.
This class provides a high-level interface for controlling DAQ functions including channel configuration, scanning, and data retrieval.
Supports both generic SCPI-99 DAQs and Keysight 34970A/DAQ970A series with automatic model detection and capability-based feature availability.
Example
daq = DataLogger('192.168.1.100') daq.connect() print(daq.identify())
Configure channels for voltage measurement¶
daq.configure_voltage_dc([101, 102, 103])
Set up scan list¶
daq.set_scan_list([101, 102, 103])
Take readings¶
readings = daq.read() for r in readings: ... print(f"Channel {r.channel}: {r.value} V") daq.disconnect()
Or using context manager:
with DataLogger('192.168.1.100') as daq: ... daq.configure_voltage_dc([101, 102]) ... readings = daq.measure_voltage_dc([101, 102])
Initialize Data Logger connection.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
host
|
str
|
IP address or hostname of the DAQ |
required |
port
|
int
|
TCP port for SCPI communication (default: 5025) |
5025
|
timeout
|
float
|
Command timeout in seconds (default: 10.0) |
10.0
|
connection
|
Optional[BaseConnection]
|
Optional custom connection object |
None
|
Note
Call connect() to establish connection and initialize capabilities.
Source code in scpi_control/data_logger.py
connect
¶
Establish connection to the Data Logger.
Raises:
| Type | Description |
|---|---|
SiglentConnectionError
|
If connection fails |
SiglentTimeoutError
|
If connection times out |
Source code in scpi_control/data_logger.py
disconnect
¶
Close connection to the Data Logger.
Source code in scpi_control/data_logger.py
write
¶
query
¶
Send a SCPI query and get the response.
identify
¶
reset
¶
clear_status
¶
get_error
¶
abort
¶
configure_voltage_dc
¶
configure_voltage_dc(channels: Union[int, List[int]], range: str = 'AUTO', resolution: str = 'AUTO') -> None
Configure channels for DC voltage measurement.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
channels
|
Union[int, List[int]]
|
Channel number(s) to configure |
required |
range
|
str
|
Measurement range (AUTO, 0.1, 1, 10, 100, 300) |
'AUTO'
|
resolution
|
str
|
Resolution (AUTO, MIN, MAX, or specific value) |
'AUTO'
|
Source code in scpi_control/data_logger.py
configure_voltage_ac
¶
configure_voltage_ac(channels: Union[int, List[int]], range: str = 'AUTO', resolution: str = 'AUTO') -> None
Configure channels for AC voltage measurement.
Source code in scpi_control/data_logger.py
configure_current_dc
¶
configure_current_dc(channels: Union[int, List[int]], range: str = 'AUTO', resolution: str = 'AUTO') -> None
Configure channels for DC current measurement.
Source code in scpi_control/data_logger.py
configure_current_ac
¶
configure_current_ac(channels: Union[int, List[int]], range: str = 'AUTO', resolution: str = 'AUTO') -> None
Configure channels for AC current measurement.
Source code in scpi_control/data_logger.py
configure_resistance
¶
configure_resistance(channels: Union[int, List[int]], range: str = 'AUTO', resolution: str = 'AUTO', four_wire: bool = False) -> None
Configure channels for resistance measurement.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
channels
|
Union[int, List[int]]
|
Channel number(s) to configure |
required |
range
|
str
|
Measurement range (AUTO, 100, 1000, 10000, etc.) |
'AUTO'
|
resolution
|
str
|
Resolution (AUTO, MIN, MAX) |
'AUTO'
|
four_wire
|
bool
|
Use 4-wire (Kelvin) measurement for accuracy |
False
|
Source code in scpi_control/data_logger.py
configure_temperature
¶
configure_temperature(channels: Union[int, List[int]], sensor_type: str = 'TC', sensor_subtype: str = 'K') -> None
Configure channels for temperature measurement.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
channels
|
Union[int, List[int]]
|
Channel number(s) to configure |
required |
sensor_type
|
str
|
Sensor type (TC=thermocouple, RTD, THER=thermistor) |
'TC'
|
sensor_subtype
|
str
|
Sensor subtype (e.g., K, J, T for TC; PT100 for RTD) |
'K'
|
Source code in scpi_control/data_logger.py
set_scan_list
¶
Set the scan list for automatic scanning.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
channels
|
Union[int, List[int]]
|
Channel number(s) to include in scan |
required |
Source code in scpi_control/data_logger.py
get_scan_list
¶
clear_scan_list
¶
set_trigger_source
¶
Set the trigger source.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
source
|
str
|
Trigger source (IMM, TIM, BUS, EXT) |
'IMM'
|
Source code in scpi_control/data_logger.py
set_trigger_count
¶
Set number of triggers to accept.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
count
|
Union[int, str]
|
Number of triggers (int or "INF" for infinite) |
1
|
Source code in scpi_control/data_logger.py
set_trigger_timer
¶
Set the trigger timer interval for timed scanning.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
interval
|
float
|
Time between scans in seconds |
required |
Source code in scpi_control/data_logger.py
set_sample_count
¶
Set the number of samples per trigger.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
count
|
Union[int, str]
|
Number of samples (int or "INF") |
1
|
Source code in scpi_control/data_logger.py
initiate
¶
trigger
¶
read
¶
Initiate scan and read results (blocking).
Returns:
| Type | Description |
|---|---|
List[Reading]
|
List of Reading objects with measurement data |
Source code in scpi_control/data_logger.py
fetch
¶
Fetch readings from memory (does not initiate new scan).
Returns:
| Type | Description |
|---|---|
List[Reading]
|
List of Reading objects |
Source code in scpi_control/data_logger.py
read_and_remove
¶
Read and remove readings from memory.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
max_readings
|
int
|
Maximum number of readings to retrieve |
100
|
Returns:
| Type | Description |
|---|---|
List[Reading]
|
List of Reading objects |
Source code in scpi_control/data_logger.py
get_data_points
¶
clear_data
¶
measure_voltage_dc
¶
measure_voltage_dc(channels: Union[int, List[int]], range: str = 'AUTO', resolution: str = 'AUTO') -> List[Reading]
Measure DC voltage immediately.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
channels
|
Union[int, List[int]]
|
Channel(s) to measure |
required |
range
|
str
|
Measurement range |
'AUTO'
|
resolution
|
str
|
Resolution |
'AUTO'
|
Returns:
| Type | Description |
|---|---|
List[Reading]
|
List of Reading objects |
Source code in scpi_control/data_logger.py
measure_voltage_ac
¶
measure_voltage_ac(channels: Union[int, List[int]], range: str = 'AUTO', resolution: str = 'AUTO') -> List[Reading]
Measure AC voltage immediately.
Source code in scpi_control/data_logger.py
measure_current_dc
¶
measure_current_dc(channels: Union[int, List[int]], range: str = 'AUTO', resolution: str = 'AUTO') -> List[Reading]
Measure DC current immediately.
Source code in scpi_control/data_logger.py
measure_resistance
¶
measure_resistance(channels: Union[int, List[int]], range: str = 'AUTO', resolution: str = 'AUTO', four_wire: bool = False) -> List[Reading]
Measure resistance immediately.
Source code in scpi_control/data_logger.py
measure_temperature
¶
Measure temperature immediately.
Source code in scpi_control/data_logger.py
set_alarm_limits
¶
set_alarm_limits(channels: Union[int, List[int]], high: Optional[float] = None, low: Optional[float] = None) -> None
Set alarm limits for channels.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
channels
|
Union[int, List[int]]
|
Channel(s) to configure |
required |
high
|
Optional[float]
|
Upper limit (None to disable) |
None
|
low
|
Optional[float]
|
Lower limit (None to disable) |
None
|
Source code in scpi_control/data_logger.py
enable_alarm
¶
Enable or disable alarm checking on channels.
Source code in scpi_control/data_logger.py
set_scaling
¶
set_scaling(channels: Union[int, List[int]], gain: float = 1.0, offset: float = 0.0, enable: bool = True) -> None
Set mx+b scaling on channels.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
channels
|
Union[int, List[int]]
|
Channel(s) to configure |
required |
gain
|
float
|
Gain multiplier (m) |
1.0
|
offset
|
float
|
Offset value (b) |
0.0
|
enable
|
bool
|
Enable scaling |
True
|
Source code in scpi_control/data_logger.py
start_logging
¶
start_logging(channels: Union[int, List[int]], interval: float = 1.0, duration: Optional[float] = None, callback: Optional[callable] = None) -> List[List[Reading]]
Start continuous data logging.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
channels
|
Union[int, List[int]]
|
Channels to log |
required |
interval
|
float
|
Time between scans in seconds |
1.0
|
duration
|
Optional[float]
|
Total logging duration (None for manual stop) |
None
|
callback
|
Optional[callable]
|
Optional callback function(readings) called after each scan |
None
|
Returns:
| Type | Description |
|---|---|
List[List[Reading]]
|
List of reading lists (one per scan) |