Skip to content

Navigation Menu

Sign in
Sign up

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

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /