OpenClaw · Skill
Linz Public Transport
Use this skill to interact with Linz Linien EFA endpoints:
Install
Start with the primary install command. Alternate entrypoints are included below for ClawHub and OpenClaw CLI users.
Primary command
clawhub install fjrevoredo/linz-public-transportClawHub installer
npx clawhub@latest install fjrevoredo/linz-public-transportOpenClaw CLI
openclaw skills install fjrevoredo/linz-public-transportDirect OpenClaw install
openclaw install fjrevoredo/linz-public-transportWhat this skill does
Use this skill to interact with Linz Linien EFA endpoints:
Why it matters
Queries the official Linz Linien EFA API directly instead of relying on third-party transit apps or scrapers, giving access to raw departure data programmably.
Typical use cases
- Check next tram departures from a Linz stop before leaving home
- Resolve a stop name to its numeric stop ID for automation
- Fetch departures for a specific stop ID in a script or workflow
- Find stops matching a partial name or street
- Monitor upcoming buses from a stop during a commute
Source instructions
Linz Public Transport
Use this skill to interact with Linz Linien EFA endpoints:
GET /efa/XML_STOPFINDER_REQUESTGET /efa/XML_DM_REQUEST
Read endpoint details in {baseDir}/references/endpoints.md before implementation.
Use {baseDir}/scripts/linz_transport.py as the default execution path.
Workflow
- Resolve the API base URL.
- Run the script subcommand that matches the task.
- Return a compact, user-facing summary.
Primary Tooling
- Script path:
{baseDir}/scripts/linz_transport.py - Runtime: Python 3, standard library only.
- Base URL input:
--base-url <url>argument, orLINZ_TRANSPORT_API_BASE_URLenvironment variable, or- default
http://www.linzag.at/linz2.
Preferred commands:
- Search stops:
python {baseDir}/scripts/linz_transport.py stops "taubenmarkt"
- Fetch departures by stop ID:
python {baseDir}/scripts/linz_transport.py departures --stop-id 60501160 --limit 10
- Resolve stop and fetch departures in one call:
python {baseDir}/scripts/linz_transport.py next "taubenmarkt" --limit 10 --pick-first
Step 1: Resolve Base URL
- Use user-provided base URL first.
- Otherwise use
LINZ_TRANSPORT_API_BASE_URLif available. - If neither exists, use
http://www.linzag.at/linz2.
Step 2: Present Output
- Sort by
countdownInMinutesascending if needed. - Show the next 5-10 departures unless user asks for more.
- Include both relative (
countdownInMinutes) and absolute (time) times. - Keep field names stable when returning JSON.
Error Handling
- If stop search returns empty list, suggest nearby spellings and retry with a shorter query token.
- If multiple stop matches are returned, rerun with explicit
--stop-idor usenext ... --pick-firstonly when ambiguity is acceptable. - If departures response is empty, state that no upcoming departures are currently available.
- If HTTP request fails, report status code, endpoint, and retry guidance.
- If EFA response includes a
messagecode, include that code in diagnostics.
Minimal Examples
python {baseDir}/scripts/linz_transport.py stops "taubenmarkt"
python {baseDir}/scripts/linz_transport.py departures --stop-id 60501160 --limit 10
python {baseDir}/scripts/linz_transport.py next "taubenmarkt" --limit 10 --pick-first
python "{baseDir}/scripts/linz_transport.py" stops "taubenmarkt"
python "{baseDir}/scripts/linz_transport.py" departures --stop-id 60501160 --limit 10
python "{baseDir}/scripts/linz_transport.py" next "taubenmarkt" --limit 10 --pick-first