LMI ASCII
A Python client library for communicating with LMI Technologies Gocator sensors running GoPxL software via the Ethernet ASCII protocol.
Features
- Simple API for connecting to and controlling LMI sensors
- Job Management - Load, verify, and manage sensor jobs
- Measurement Control - Start, stop, and trigger measurements
- Data Retrieval - Read tool data, metrics, and sensor information
- REST API Access - Use the 'readprop' command to access sensor REST API
- Context Manager support for automatic connection management
- Type Hints for better IDE support and code safety
- Comprehensive Logging using Python's standard logging module
Installation
pip install lmi-ascii
Or install from source:
git clone https://github.com/yourusername/lmi-ascii.git
cd lmi-ascii
pip install -e .
Quick Start
from lmi_ascii import ASCIIClient
import logging
# Configure logging (optional)
logging.basicConfig(level=logging.INFO)
# Connect to sensor
with ASCIIClient(host='192.168.1.10') as client:
# Load a job
client.load_job('MyInspectionJob')
# Capture a dataset
dataset = client.capture_dataset(
timeout=10.0,
measurement_number=1
)
# Access measurement results
print(f"Status: {dataset.get('Status')}")
print(f"Failed count: {dataset.get('FailedCount')}")
Usage Examples
Basic Connection
from lmi_ascii import ASCIIClient
# Create client instance
client = ASCIIClient(
host='192.168.1.10',
port=8190, # Default Ethernet ASCII port
timeout=10.0
)
# Connect
if client.connect():
print("Connected successfully!")
# Your code here...
# Disconnect
client.disconnect()
Using Context Manager (Recommended)
from lmi_ascii import ASCIIClient
with ASCIIClient(host='192.168.1.10') as client:
# Connection is automatic
# Disconnection is automatic on exit
job_name = client.read_loaded_job()
print(f"Current job: {job_name}")
Job Management
with ASCIIClient(host='192.168.1.10') as client:
# Load a job
success = client.load_job('ProductionJob_v2')
# Verify the correct job is loaded
loaded_job = client.read_loaded_job()
print(f"Loaded job: {loaded_job}")
Measurement Control
with ASCIIClient(host='192.168.1.10') as client:
client.load_job('MyJob')
# Start continuous measurement
client.start_measurement()
# ... do something ...
# Stop measurement
client.stop_measurement()
# Or trigger a single measurement
client.trigger_measurement()
Reading Sensor Data
with ASCIIClient(host='192.168.1.10') as client:
client.load_job('MyJob')
# Read sensor information
sensor_info = client.read_sensor_info()
print(f"Sensor: {sensor_info}")
# Read all tools in current job
tools = client.read_tools()
print(f"Available tools: {tools}")
# Read metrics from a specific tool
tool_id = tools[0] # First tool
metrics = client.read_tool_metrics(tool_id)
print(f"Tool metrics: {metrics}")
Capturing Complete Datasets
with ASCIIClient(host='192.168.1.10') as client:
client.load_job('InspectionJob')
# Capture a dataset with metadata
dataset = client.capture_dataset(
timeout=10.0,
poll_interval=0.1,
measurement_series=1,
measurement_number=42,
measurement_repeat=1
)
# Check overall status
if dataset['Status'] == 'Passed':
print("Inspection passed!")
else:
print(f"Inspection failed. {dataset['FailedCount']} failures detected.")
# Access tool data
for tool_name, tool_data in dataset.items():
if isinstance(tool_data, dict) and 'Status' in tool_data:
print(f"{tool_name}: {tool_data['Status']}")
Using the REST API
with ASCIIClient(host='192.168.1.10') as client:
# Read any REST API resource
tools_data = client.read_property('/tools')
# Read specific tool metrics
tool_metrics = client.read_property('/tools/Script-100/metrics')
# Read output value
output_value = client.read_property(
'/tools/Script-100/metrics#/outputsByExtId/0/value'
)
Custom Logging
import logging
from lmi_ascii import ASCIIClient
# Create custom logger
custom_logger = logging.getLogger('my_app.lmi')
custom_logger.setLevel(logging.DEBUG)
# Create client with custom logger
client = ASCIIClient(
host='192.168.1.10',
logger=custom_logger
)
API Reference
ASCIIClient Class
Constructor Parameters
timestamp_id(int): External ID for timestamps (default: 0)host(str): IP address of the sensor (default: '127.0.0.1')port(int): Ethernet ASCII port (default: 8190)delimiter(str): Command parameter delimiter (default: ',')termination(str): Line termination characters (default: '\r\n')timeout(float): Socket timeout in seconds (default: 10.0)logger(logging.Logger): Custom logger instance (optional)
Main Methods
connect()- Establish connection to sensordisconnect()- Close connection to sensorload_job(job_name, ensure=True)- Load a job on the sensorstart_measurement()- Start continuous measurementstop_measurement()- Stop measurementtrigger_measurement()- Trigger a single measurementcapture_dataset(...)- Capture a complete measurement datasetread_loaded_job()- Get currently loaded job nameread_property(resource_path)- Read REST API resourceread_tools()- Get all tools in current jobread_tool_metrics(tool_id)- Get metrics from a toolread_sensor_info()- Get sensor informationsend_command(command, parameter=None)- Send raw ASCII command
Properties
connected(bool, read-only) - Connection statusbusy(bool, read-only) - Whether an operation is in progressstatus(str, read-only) - Current client statusresponse(str, read-only) - Last sensor responsesuccess(bool, read-only) - Success status of last command
Protocol Documentation
For detailed information about the Ethernet ASCII protocol, refer to:
Requirements
- Python 3.13 or higher
- No external dependencies (uses only standard library)
License
MIT License - see LICENSE file for details.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Support
For issues and questions:
- GitHub Issues: https://github.com/j4ggr/lmi-ascii/issues
- LMI Support: https://support.lmi3d.com/
Changelog
Version 1.0.0 (2026-06-30)
- Initial release
- Full Ethernet ASCII protocol support
- Context manager support
- Comprehensive logging
- Type hints throughout
- Complete dataset capture functionality
Metadata
Release files for lmi-ascii 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| lmi_ascii-0.1.0.tar.gz | 17.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| lmi_ascii-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 33.4 kB
Release files / lmi_ascii-0.1.0.tar.gz
| Download URL | lmi_ascii-0.1.0.tar.gz |
|---|---|
| Size | 17.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
53f3a73fca789970e495472a9078d058cb8610b3d5691ddc1ddb10d5a7cde0bc
|
|
BLAKE2b-256 checksum How to use checksums |
c820180c37e080df27b5f5858f9715d35a6c9011608eb10e733dcb829010d0a2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
pdm/2.28.0 CPython/3.12.3 Windows/11
|
Release files / lmi_ascii-0.1.0-py3-none-any.whl
| Download URL | lmi_ascii-0.1.0-py3-none-any.whl |
|---|---|
| Size | 15.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
da929624f1865232aa5506ed9170823079e2e78e3dcdb6b6bb8735bf8a2d65ad
|
|
BLAKE2b-256 checksum How to use checksums |
3aeedfd220f1d1d23c40fb3b54267c2b16b621f6ec2c069da02c04ec3309d66b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
pdm/2.28.0 CPython/3.12.3 Windows/11
|