Belt conveyor calculation library
Project description
Eytelwein
Open-source belt conveyor calculation library for Python
Eytelwein provides production-grade engineering calculations for belt conveyor
systems — from steady-state resistance and drive layout to idler roll loading and
horizontal curve forces. All public functions use Pint
Quantity objects for full dimensional safety: units in, units out, no silent
conversion errors.
Highlights
- Dimensionally safe — every input and output carries explicit physical units
- Dual-layer architecture — bare-math
_module.py(fast, unit-free) + publicmodule.py(Quantity-wrapped, validated) - Comprehensive test suite — 1 455 tests covering core and extended calculations
- Typed —
py.typedmarker, compatible with mypy strict mode
Module Overview
| Module | Description |
|---|---|
eytelwein.belt_conveyor_design.core |
Volume/mass flow, belt tensions, drive layout, belt design, tension distribution, minimum pulley diameters, resistance & power |
eytelwein.belt_conveyor_design.extended |
Extended methods — mass inertia, design of conveyor belt, additional drive layout functions |
eytelwein.idler_design |
Idler roll load factor calculations |
eytelwein.horizontal_curves |
Lateral force analysis for horizontally curved belt conveyors |
eytelwein.main |
Shared utilities — unit registry singleton, physical constants |
Installation
# Clone the repository
git clone https://github.com/mdVoith/eytelwein.git
cd eytelwein
# Create the project environment
uv sync
PyPI packages and wheels are not published yet. Use a local clone (or download the repository as a ZIP) and run commands from the project root.
Documentation
Hosted documentation (GitHub Pages):
Build docs locally from repository root:
uv run sphinx-apidoc -o docs/source src/eytelwein --force --separate
uv run sphinx-build -b html docs/source docs/_build/html
Generated HTML entry page:
docs/_build/html/index.html
Quick Start
from eytelwein.main.units import get_unit_registry
u = get_unit_registry()
from eytelwein.belt_conveyor_design import usable_belt_width
# Calculate usable belt width for a 1200 mm belt
b = usable_belt_width(belt_width=1200 * u.mm)
print(b) # 1050.0 millimeter
Real-World Example Script
For a more practical, end-to-end workflow, run the example script in
examples/real_world_cross_section_flow.py.
It demonstrates a compact sizing pipeline with hard-coded values:
- usable belt width from belt geometry
- cross-section of fill from trough geometry
- volume flow from cross-section and belt speed
- mass flow from volume flow and bulk density
- inverse cross-check for required usable width
python examples/real_world_cross_section_flow.py
Feature Examples
Dedicated, runnable scripts are available under examples/features/.
a_output_unit_minimum_tension.pyDemonstrates changing output units for the same calculation (minimum belt tension in N and kN).b_imperial_input_dual_output.pyUses imperial inputs and calls the same function twice to produce imperial output and SI output.c_unit_errors_are_caught.pyShows dimensional unit mismatch handling (expectedValueError).d_physically_invalid_inputs_are_caught.pyShows physically invalid input handling (expectedValueError).e_output_precision_control.pyShows how to control rounding withprecision(default, custom, and unrounded output).f_round_trip_consistency.pyShows forward/inverse round-trip checks and validates numerical consistency within explicit tolerances.g_constants_and_enums.pyShows using public enums (IdlerSets) and shared constants in practical calculations.
Run each from repository root:
python examples/features/a_output_unit_minimum_tension.py
python examples/features/b_imperial_input_dual_output.py
python examples/features/c_unit_errors_are_caught.py
python examples/features/d_physically_invalid_inputs_are_caught.py
python examples/features/e_output_precision_control.py
python examples/features/f_round_trip_consistency.py
python examples/features/g_constants_and_enums.py
Advanced Example (Private API, Not Recommended)
Advanced example scripts live under examples/advanced/ and are intentionally
separate from the standard feature examples.
Use this path only if you explicitly accept the tradeoffs:
- advanced
- unstable API surface
- no unit safety
- no backwards-compatibility promise
h_private_functions_not_recommended.py compares public and private calls
with the same intended inputs, shows that private angle inputs must be radians,
and demonstrates that private helpers can skip public-layer validation.
Run from repository root:
python examples/advanced/h_private_functions_not_recommended.py
Architecture
src/eytelwein/
├── belt_conveyor_design/
│ ├── core/ # Fundamental steady-state calculations
│ │ ├── _module.py # Pure math (float in / float out)
│ │ └── module.py # Quantity-wrapped public API
│ ├── extended/ # Additional / derived calculations
│ ├── data/ # Lookup tables (CSV)
│ └── constants.py # Enums & domain constants
├── idler_design/
│ └── core/ # Idler roll load factors
├── horizontal_curves/
│ └── core/ # Lateral force components
└── main/
├── units.py # UnitRegistry singleton
└── constants.py # Physical constants (via scipy)
Mathematical Background
The calculations implement established belt conveyor engineering methodologies covering:
- Resistance and power — main, secondary, and gradient resistances for steady-state operation
- Belt tensions — minimum tensions from sag constraints, tension distribution across belt width
- Drive system layout — torque, power, and speed relationships for single and multi-drive configurations
- Volume and mass flow — cross-sectional fill geometry, reduction factors for inclined conveyors
- Minimum pulley diameters — based on belt tension member type and load classification
- Idler roll loading — load distribution factors for various trough configurations
- Horizontal curves — centripetal, gravity, and tilted-idler restraining forces (conventional and improved methods)
Development
# Clone and install
git clone https://github.com/mdVoith/eytelwein.git
cd eytelwein
uv sync
# Run checks
uv run pytest # 1455 tests
uv run ruff check src/ tests/
uv run mypy src/
uv run sphinx-apidoc -o docs/source src/eytelwein --force --separate
uv run sphinx-build -b html docs/source docs/_build/html
Contributing
See CONTRIBUTING.md for development guidelines.
License
Apache-2.0 — see LICENSE and NOTICE.
Copyright (c) Voith Group.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file eytelwein-0.1.0.tar.gz.
File metadata
- Download URL: eytelwein-0.1.0.tar.gz
- Upload date:
- Size: 188.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fbf516cd0971cb5d94d1068054305571e5753384da2ddf67dea4f79223102a16
|
|
| MD5 |
516c1a6add719069018dc177d682e926
|
|
| BLAKE2b-256 |
91b2823c8124e382e6001e01c97042d9e6b0b22476048b893ffb346bcd5cde76
|
Provenance
The following attestation bundles were made for eytelwein-0.1.0.tar.gz:
Publisher:
publish.yml on mdVoith/eytelwein
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eytelwein-0.1.0.tar.gz -
Subject digest:
fbf516cd0971cb5d94d1068054305571e5753384da2ddf67dea4f79223102a16 - Sigstore transparency entry: 1705571410
- Sigstore integration time:
-
Permalink:
mdVoith/eytelwein@8f1f1094c18d85912992c19babf593c575855ebb -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/mdVoith
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8f1f1094c18d85912992c19babf593c575855ebb -
Trigger Event:
push
-
Statement type:
File details
Details for the file eytelwein-0.1.0-py3-none-any.whl.
File metadata
- Download URL: eytelwein-0.1.0-py3-none-any.whl
- Upload date:
- Size: 91.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f7ef2c501467cc72ca3f4c55a94b079254cd00a7595d8e78651674b93ffc7564
|
|
| MD5 |
ca6e2de76f9633a6516789eea9808406
|
|
| BLAKE2b-256 |
1a55413fe6afab6ba3885a30136f8263c082dba65771a92bebd1a7eb91d4ff83
|
Provenance
The following attestation bundles were made for eytelwein-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on mdVoith/eytelwein
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eytelwein-0.1.0-py3-none-any.whl -
Subject digest:
f7ef2c501467cc72ca3f4c55a94b079254cd00a7595d8e78651674b93ffc7564 - Sigstore transparency entry: 1705571667
- Sigstore integration time:
-
Permalink:
mdVoith/eytelwein@8f1f1094c18d85912992c19babf593c575855ebb -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/mdVoith
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8f1f1094c18d85912992c19babf593c575855ebb -
Trigger Event:
push
-
Statement type: