An unofficial Python module for Dresden's public transport system (VVO/DVB)
Project description
dvbpy
An unofficial Python module for querying Dresden's public transport system (VVO/DVB).
Want something like this for another language? Look here.
pip install dvb
from dvb import Client
client = Client(user_agent="my-app/1.0 (me@example.com)")
All API access goes through a Client instance, which requires a user_agent string identifying your project and providing contact details.
Find stops
client.find("Helmholtzstraße")
[
Stop(id='33000742', name='Helmholtzstraße', city='', coords=Coords(lat=51.03, lng=13.73)),
Stop(id='36030083', name='Helmholtzstr', city='Chemnitz', coords=Coords(lat=50.83, lng=12.93)),
...
]
Monitor a stop
client.monitor("Helmholtzstraße", limit=2)
[
Departure(
id='voe:11003: :H:j26',
line='3',
direction='Wilder Mann',
scheduled=datetime(2025, 2, 22, 14, 41),
real_time=datetime(2025, 2, 22, 14, 43, 50),
state='Delayed',
platform=Platform(name='1', type='Platform'),
mode='Tram',
occupancy='ManySeats',
),
...
]
Stop names are automatically resolved to IDs. You can also pass a numeric stop ID directly.
Plan a route
client.route("Helmholtzstraße", "Postplatz")
[
Route(
duration=11,
interchanges=0,
price='2,30',
fare_zones='TZ 10 (Dresden)',
cancelled=False,
legs=[
PartialRoute(
duration=11,
line='3',
mode='Tram',
direction='Btf Trachenberge',
stops=[...],
)
],
session_id='367417461:efa4',
),
...
]
Use the session_id to paginate with client.earlier_later().
Map pins
Search for stops, POIs, and other points of interest within a bounding box.
client.pins(51.04, 13.70, 51.05, 13.72, pin_types=("Stop", "Platform"))
[
Pin(id='33000028', name='Hauptbahnhof', city='Dresden', coords=Coords(...), type='Stop'),
Pin(id='pf:1234', name='Hauptbahnhof Gleis 3', city='Dresden', coords=Coords(...), type='Platform'),
...
]
Lines at a stop
client.lines("33000742")
[
Line(name='3', mode='Tram', directions=['Dresden Wilder Mann', 'Dresden Coschütz']),
Line(name='66', mode='CityBus', directions=['Dresden Lockwitz']),
...
]
Route changes
client.route_changes()
[
RouteChange(
id='511595',
title='Dresden - Mengsstraße, Vollsperrung',
description='<p>...</p>',
type='Scheduled',
validity_periods=[ValidityPeriod(begin=..., end=...)],
lines=['428296'],
),
...
]
Trip details
Get all stops for a specific departure (using the ID and time from a monitor response).
departure = client.monitor("Helmholtzstraße")[0]
client.trip_details(trip_id=departure.id, time=departure.scheduled, stop_id="33000742")
Reverse geocoding
client.address(51.04373, 13.70320)
Stop(id='33000144', name='Tharandter Straße', city='Dresden', coords=Coords(...))
Raw responses
All methods accept raw=True to get the unprocessed API response as a dict:
client.monitor("Helmholtzstraße", raw=True)
# Returns the raw JSON dict from the WebAPI
Error handling
from dvb import Client, APIError, ConnectionError
client = Client(user_agent="my-app/1.0 (me@example.com)")
try:
client.monitor("Helmholtzstraße")
except ConnectionError:
print("Network error or timeout")
except APIError:
print("API returned an error")
Migrating from 2.x
dvb 3.0 introduces a Client class that requires a user_agent string. This helps the DVB/VVO identify API consumers and provides them with a way to reach out if needed.
- All functions have moved from
dvb.function()toclient.function()on aClientinstance import dvb+dvb.monitor(...)→from dvb import Client+Client(user_agent="...").monitor(...)- All method signatures remain the same
Migrating from 1.x
dvb 2.0 was a complete rewrite with breaking changes:
- All functions return frozen dataclasses instead of dicts/lists
- Functions raise
APIError/ConnectionErrorinstead of printing errors and returningNone - Migrated from legacy widget/EFA endpoints to the VVO WebAPI
- Removed
poi_coords()(usefind()),interchange_prediction(),city/eduroam/deparrparameters route()usesarrival=True/Falseinstead ofdeparr="arr"/"dep",pins()usespin_types=("Stop",)instead ofpintypes="stop"- Dropped
numpy - Requires Python >= 3.10
Development
uv sync --group dev
uv run ruff check .
uv run ruff format --check .
uv run mypy dvb/
uv run pytest
Project details
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 dvb-3.0.0.tar.gz.
File metadata
- Download URL: dvb-3.0.0.tar.gz
- Upload date:
- Size: 62.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
79216300aa92c1a65ffd8c6265abf30a53de02b503e8363a6b8707f4d92b9abb
|
|
| MD5 |
3c42c232e4823aa9cbcd12ec0a98e73f
|
|
| BLAKE2b-256 |
f41308c72ae9e731dfe620cc0131ad5928dfc5ea37f639cd60cb09da06f40250
|
Provenance
The following attestation bundles were made for dvb-3.0.0.tar.gz:
Publisher:
publish.yml on offenesdresden/dvbpy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dvb-3.0.0.tar.gz -
Subject digest:
79216300aa92c1a65ffd8c6265abf30a53de02b503e8363a6b8707f4d92b9abb - Sigstore transparency entry: 1115999377
- Sigstore integration time:
-
Permalink:
offenesdresden/dvbpy@cb5bcb67618ac0d1f220f65ba3476b7c4d6784bc -
Branch / Tag:
refs/tags/3.0.0 - Owner: https://github.com/offenesdresden
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@cb5bcb67618ac0d1f220f65ba3476b7c4d6784bc -
Trigger Event:
push
-
Statement type:
File details
Details for the file dvb-3.0.0-py3-none-any.whl.
File metadata
- Download URL: dvb-3.0.0-py3-none-any.whl
- Upload date:
- Size: 11.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f85070e7be20d920ca65a70679f0b5ab54b95f0c1f30c0720a3f3f54c4d29aca
|
|
| MD5 |
fda7f2626c0b299c2e7cd3527f827efa
|
|
| BLAKE2b-256 |
8e7980070705e8b9aa6fd24420e0aab6503d4cd4ce5a787358c974110f54d75c
|
Provenance
The following attestation bundles were made for dvb-3.0.0-py3-none-any.whl:
Publisher:
publish.yml on offenesdresden/dvbpy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dvb-3.0.0-py3-none-any.whl -
Subject digest:
f85070e7be20d920ca65a70679f0b5ab54b95f0c1f30c0720a3f3f54c4d29aca - Sigstore transparency entry: 1115999621
- Sigstore integration time:
-
Permalink:
offenesdresden/dvbpy@cb5bcb67618ac0d1f220f65ba3476b7c4d6784bc -
Branch / Tag:
refs/tags/3.0.0 - Owner: https://github.com/offenesdresden
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@cb5bcb67618ac0d1f220f65ba3476b7c4d6784bc -
Trigger Event:
push
-
Statement type: