Python 3 API wrapper for FireServiceRota/BrandweerRooster
Project description
Python: FireServiceRota / BrandweerRooster
Python 3 API wrapper for FireServiceRota and BrandweerRooster.
About
This package provides access to emergency incident data from FireServiceRota and BrandweerRooster — services used by firefighters.
Features:
- Real-time incident notifications via WebSocket
- User availability (duty schedule)
- Incident response status (acknowledge / reject)
- Pager management: list pagers, send messages, poll delivery status
A subscription and login account are required. See fireservicerota.co.uk or brandweerrooster.nl for details.
Installation
pip install pyfireservicerota
Authentication
Authentication uses OAuth2 tokens. On first use, exchange your credentials for a token_info dict and store it. After that you only need the tokens — use refresh_tokens() to keep them valid without re-entering your password.
First-time login
from pyfireservicerota import FireServiceRota, InvalidAuthError
api = FireServiceRota(
base_url="www.brandweerrooster.nl",
username="your@email.address",
password="yourpassword",
)
try:
token_info = api.request_tokens()
except InvalidAuthError:
print("Invalid credentials")
token_info = None
Subsequent use (stored tokens)
from pyfireservicerota import FireServiceRota
api = FireServiceRota(
base_url="www.brandweerrooster.nl",
token_info=token_info, # dict loaded from storage
)
Refreshing tokens
Any API call can raise ExpiredTokenError or InvalidTokenError when the access token needs refreshing:
from pyfireservicerota import ExpiredTokenError, InvalidTokenError, InvalidAuthError
try:
result = api.get_availability("Europe/Amsterdam")
except (ExpiredTokenError, InvalidTokenError):
try:
token_info = api.refresh_tokens()
except InvalidAuthError:
print("Refresh token invalid, re-login required")
Usage
Availability
availability = api.get_availability("Europe/Amsterdam")
print(availability)
# {"available": True, "type": "recurring", ...} or {"available": False}
Incidents
incident_id = 123456
# Get your response status for an incident
response = api.get_incident_response(incident_id)
# Acknowledge (True) or reject (False)
api.set_incident_response(incident_id, True)
Real-time incident notifications (WebSocket)
import time
from pyfireservicerota import FireServiceRotaIncidents
def on_incident(data):
print(f"Incident received: {data}")
wsurl = f"wss://www.brandweerrooster.nl/cable?access_token={token_info['access_token']}"
listener = FireServiceRotaIncidents(on_incident=on_incident)
listener.start(url=wsurl)
while True:
time.sleep(1)
Pagers
# List pagers linked to your account
pagers = api.get_pagers()
# [{"id": 7719, "user_id": 12345, "serial_number": "C202351.01045", "type": "Swissphone s.QUAD C35",
# "battery_level": 79, "state": "powered_on", "signal_strength": -91, ...}]
# Send using the pager's own registered address (confirmation=True)
result = api.send_pager_message(6789, "Test alarm message", confirmation=True)
if result:
print(f"Sent: id={result['id']} state={result['acknowledgment_state']} address={result['address']}")
# Send to a specific capcode address
result = api.send_pager_message(6789, "Test alarm message", address="1234567")
# Send to multiple capcodes
result = api.send_pager_message(6789, "Test alarm message", addresses=["1234567", "7654321"])
# With a delivery-status webhook
result = api.send_pager_message(
6789,
"Test alarm message",
confirmation=True,
webhook_url="https://your.server/pager-callback",
)
# Poll delivery status
if result:
status = api.get_pager_message_status(6789, result["id"])
if status:
print(status["acknowledgment_state"]) # e.g. "automatic", "manual", "none"
Example script
example.py connects to www.brandweerrooster.nl and runs through the full API surface:
- Request OAuth2 tokens
- Fetch the most recent incident
- Get user availability
- Get and set incident response status (uses the most recent incident)
- List pagers, send a test message, poll delivery status
- Connect to the WebSocket and listen for live incident notifications
Run with environment variables (non-interactive):
FSR_USERNAME=your@email.nl FSR_PASSWORD=secret python example.py
Or interactively (prompts for credentials):
python example.py
Exceptions
| Exception | When raised |
|---|---|
InvalidAuthError |
Wrong credentials or expired refresh token |
ExpiredTokenError |
Access token expired or revoked — call refresh_tokens() |
InvalidTokenError |
Access token invalid — call refresh_tokens() |
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 pyfireservicerota-0.0.49.tar.gz.
File metadata
- Download URL: pyfireservicerota-0.0.49.tar.gz
- Upload date:
- Size: 9.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
652da7c2ddddac7e98583c3bf7e09aa0860d6d8356485856cfdd81df1866930d
|
|
| MD5 |
95121ea9dc41983b81e32bbeab6a1c43
|
|
| BLAKE2b-256 |
c3ec46273a55513cf65faa31b13f8a991d8de152c184460ba3b9ebbbfdc0b26a
|
File details
Details for the file pyfireservicerota-0.0.49-py3-none-any.whl.
File metadata
- Download URL: pyfireservicerota-0.0.49-py3-none-any.whl
- Upload date:
- Size: 8.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
037968bda5677d145997853ca3f12ae3339c1c65c89b46282db18f2094966bc8
|
|
| MD5 |
4836c5fc687116fdd828fcf9e5d7f9a0
|
|
| BLAKE2b-256 |
ca17e90dff40c7e1a2d68ec74812e78f3c07df9507ac634e5da7c605fdaacd92
|