Skip to content

WitsKit is a Python toolkit for decoding and working with WITS (Wellsite Information Transfer Standard) data.

License

Notifications You must be signed in to change notification settings

Critlist/witskit

Repository files navigation

WitsKit

Python toolkit for decoding WITS (Wellsite Information Transfer Standard) data.

What It Is

724 symbols across 20+ record types, auto-parsed from the spec. Decode WITS frames into validated Python objects, stream to SQL databases, and query time-series drilling data.

Installation

pip install witskit

With SQL storage:

pip install witskit[sql]

Development:

git clone https://github.com/Critlist/witskit
cd witskit
pip install -e .

Quick Start

from witskit import decode_frame

frame = """&&
01083650.40
01133.5
01142850.7
!!"""

result = decode_frame(frame)
for dp in result.data_points:
    print(f"{dp.symbol_name}: {dp.parsed_value} {dp.unit}")

Output:

DBTM: 3650.4 M
ROPA: 3.5 M/HR
HKLA: 2850.7 KDN

CLI

witskit demo                              # Run demo
witskit symbols --search "depth"          # Search symbols
witskit decode sample.wits                # Decode file
witskit decode sample.wits --fps          # Use FPS units
witskit validate "&&\n01083650.40\n!!"    # Validate frame
witskit convert 3650.4 M F                # Convert units

SQL Storage

SQLite, PostgreSQL, and MySQL support for time-series drilling data:

from witskit.storage.sql_writer import SQLWriter, DatabaseConfig

config = DatabaseConfig.sqlite("drilling_data.db")
writer = SQLWriter(config)

await writer.initialize()
async for frame in stream_source:
    await writer.store_frame(frame)

# Query with time filters
async for data_point in writer.query_data_points(
    symbol_codes=["0108", "0113"],
    start_time=datetime(2024, 1, 1),
    limit=1000
):
    print(f"{data_point.symbol_name}: {data_point.parsed_value}")

See docs/sql_storage.md for details.

WITS Format

&&
01083650.40
01133.5
01142850.7
!!

Start delimiter (&&), data lines (4-digit code + value), end delimiter (!!).

Record Types

Record Category Symbols
1 Drilling (Time-Based) 40
2 Drilling (Depth-Based) 26
8 MWD/LWD Formation Eval 46
15 Cuttings/Lithology 54
19 Equipment Config 89

20+ record types total. Records 5, 22-25 defined but not implemented.

Project Structure

witskit/
├── witskit/
│   ├── models/       # Symbol metadata, schemas
│   ├── decoder/      # Frame parsing
│   ├── transport/    # Serial, TCP, file readers
│   ├── storage/      # SQL backends
│   └── cli.py        # Command-line interface
├── tests/            # Unit tests
├── docs/             # Documentation
└── examples/         # Example scripts

Testing

pytest tests/ -v
pytest tests/test_decoder.py -v

Known Issues

  • TCP connection tests fail with mocks but work with real data
  • MySQL and PostgreSQL need additional testing, SQLite fully operational
  • Serial communication untested

Stack

  • Python 3.11+
  • pydantic for validation
  • typer for CLI
  • rich for formatting
  • pytest for testing
  • SQLAlchemy for SQL storage
  • asyncpg/aiomysql for async database drivers

Roadmap

  • Symbol parser & decoder (done)
  • Transport support (WIP)
  • SQL storage with time-series analysis (done)
  • WebSocket/MQTT real-time pipeline (planned)
  • Web UI for monitoring (planned)
  • Parquet export (planned)

References

License

MIT


Built by someone who got tired of mid-grade WITSML implementations. PRs welcome, especially if you've troubleshot WITS comms on standby waiting for the rig to pick up tools.

About

WitsKit is a Python toolkit for decoding and working with WITS (Wellsite Information Transfer Standard) data.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages