A Home Assistant custom integration for monitoring VĂ€sttrafik public transport departures with real-time updates and GUI configuration.
Named after the M34 tram, the newest and longest tram model in Gothenburg's fleet! đ
đ„ Bronze Quality Standard - This integration meets Home Assistant's Bronze quality requirements with comprehensive test coverage.
đžđȘ Swedish version below / Svenska beskrivning nedan
- â GUI-based configuration - No YAML required
- â Smart auth-key reuse - Enter auth-key only once for multiple stations
- â Station search - Search and select any stop in VĂ€sttrafik's network
- â Real-time departures - Live updates with delay information
- â
JSON departures data - Structured
departures_jsonattribute for easy parsing - â Multiple departures - Shows up to 15 departures per station
- â Delay tracking - Shows delays in minutes
- â Cancellation detection - Marks cancelled departures
- â Track/platform info - Shows departure track when available
- â Automatic token refresh - OAuth2 tokens managed automatically
- â Bilingual - Full English and Swedish support
- â Bronze Quality Standard - Comprehensive test coverage and CI/CD
- Home Assistant 2023.1.0 or newer
- VĂ€sttrafik API credentials (free at https://developer.vasttrafik.se/)
- Subscribe to "API Planera Resa" v4 in the developer portal
- Open HACS in Home Assistant
- Click on "Integrations"
- Click the menu (âź) in top right corner
- Select "Custom repositories"
- Add URL:
https://github.com/frodr1k/Vasttrafik_M34 - Select category: "Integration"
- Click "Add"
- Find "VĂ€sttrafik M34" and click "Download"
- Restart Home Assistant
- Copy the
custom_components/vasttrafik_m34folder to yourconfig/custom_componentsdirectory - Restart Home Assistant
- Go to https://developer.vasttrafik.se/
- Create an account (free)
- Log in and create a new application
- Subscribe to "API Planera Resa" (Journey Planning API) - Select v4
- Copy your Authentication Key (Autentiseringsnyckel)
- This is a base64-encoded string that looks like:
bXlDbGllbnRJZDpteUNsaWVudFNlY3JldA==- It's the combined
client_id:client_secretin base64 format â ïž IMPORTANT: This is YOUR secret key - never share it publicly!
- Go to Settings â Devices & Services
- Click "+ ADD INTEGRATION"
- Search for "VĂ€sttrafik M34"
- Follow the configuration wizard:
- Enter Authentication Key: Paste your Authentication Key from the portal
- âčïž Note: You only need to enter this once during initial setup
- When adding additional stations, the integration will automatically reuse the existing authentication key
- You'll only be asked for it again if the token has expired or been invalidated
- Search for Station: Type at least 2 characters (e.g., "Central", "Brunns")
- Select Station: Pick your station from the results
- Enter Authentication Key: Paste your Authentication Key from the portal
- Done! The integration will create a sensor entity
The integration creates a sensor showing minutes until next departure with rich attributes.
The sensor state shows time until next departure:
- "Nu" - Departing now
- "1 min" - Departing in 1 minute
- "5 min" - Departing in 5 minutes
- "Inga avgÄngar" - No departures available
sensor.vasttrafik_centralstationen:
state: "2 min"
attributes:
station_name: "Centralstationen"
station_gid: "9021014001760000"
departure_count: 8
departures:
- "16 â Bergsjön - 2 min đŽ"
- "16 â Bergsjön - 12 min"
- "19 â Ă
nĂ€svĂ€gen - 5 min (+2 min) đŽ"
- "19 â Ă
nÀsvÀgen - 15 min"
- "6 â Chalmers - 7 min đŽ"
last_update: "2026-01-13T15:30:00"Indicators:
- đŽ = Real-time data available (estimated time)
- (+X min) = Delayed by X minutes
- (-X min) = Earlier than scheduled
- [INSTĂLLD] = Cancelled departure
automation:
- alias: "Tram leaving soon"
trigger:
- platform: state
entity_id: sensor.vasttrafik_centralstationen
condition:
- condition: template
value_template: >
{% set state = states('sensor.vasttrafik_centralstationen') %}
{{ state not in ['unknown', 'unavailable', 'Inga avgÄngar']
and state.endswith(' min')
and state.split()[0]|int <= 3 }}
action:
- service: notify.mobile_app
data:
title: "SpÄrvagn gÄr snart!"
message: "NÀsta spÄrvagn frÄn Centralstationen gÄr om {{ states('sensor.vasttrafik_centralstationen') }}"type: entities
entities:
- entity: sensor.vasttrafik_centralstationen
title: Centralstationen
state_color: trueOr use a markdown card for detailed view:
type: markdown
content: |
## đ Centralstationen
**NÀsta avgÄng:** {{ states('sensor.vasttrafik_centralstationen') }}
{% for departure in state_attr('sensor.vasttrafik_centralstationen', 'departures')[:5] %}
- {{ departure }}
{% endfor %}
_Uppdaterad: {{ state_attr('sensor.vasttrafik_centralstationen', 'last_update') | as_timestamp | timestamp_custom('%H:%M') }}_- Uses OAuth2 Client Credentials flow
- Tokens valid for 24 hours (86400 seconds)
- Automatic refresh 5 minutes before expiry
- Secure token storage in config entry
- Token:
POST https://ext-api.vasttrafik.se/token - Search:
GET https://ext-api.vasttrafik.se/pr/v4/locations/by-text - Departures:
GET https://ext-api.vasttrafik.se/pr/v4/stop-areas/{gid}/departures
- Departures updated every 60 seconds
- Minimal API calls (token cached, only departures fetched regularly)
- Network-efficient design
- Restart Home Assistant after installing via HACS
- Check Home Assistant logs for errors
- Verify
custom_components/vasttrafik_m34directory exists
- Verify you copied the full Authentication Key from the portal
- Check that it's the base64-encoded key, not client_id or client_secret separately
- Ensure your application has subscribed to "API Planera Resa" v4
- Check your internet connection
- Verify developer.vasttrafik.se is accessible
- Check Home Assistant logs for detailed error messages
- Verify the station you selected has departures in the next hour
- Check if it's late at night (limited service)
- Try reconfiguring with a different station
- Try searching with different terms
- Use Swedish station names (e.g., "Centralstationen" not "Central Station")
- Try partial names (e.g., "Brunns" for "Brunnsparken")
The M34 is Gothenburg's newest and longest tram model - a perfect symbol for modern public transport! đ
- VĂ€sttrafik Developer Portal: https://developer.vasttrafik.se/
- API v4 Documentation: https://github.com/vasttrafik/api-pr-docs
MIT License - See LICENSE file for details
- Report issues: https://github.com/frodr1k/Vasttrafik_M34/issues
- Contributions welcome via pull requests
En Home Assistant-integration för övervakning av VÀsttrafiks avgÄngar i realtid med GUI-konfiguration.
Döpt efter M34-spĂ„rvagnen, den nyaste och lĂ€ngsta spĂ„rvagnsmodellen i Göteborgs flottan! đ
- â GUI-baserad konfiguration - Ingen YAML krĂ€vs
- â HĂ„llplatssökning - Sök och vĂ€lj valfri hĂ„llplats i VĂ€sttrafiks nĂ€t
- â RealtidsavgĂ„ngar - Live-uppdateringar med förseningsinformation
- â FörseningsspĂ„rning - Visar förseningar i minuter
- â InstĂ€llningsdetektering - Markerar instĂ€llda avgĂ„ngar
- â Realtidsindikator - Visuell indikator för realtidsdata
- â Automatisk tokenuppdatering - OAuth2-tokens hanteras automatiskt
- â TvĂ„sprĂ„kig - Fullt stöd för engelska och svenska
- Home Assistant 2023.1.0 eller nyare
- VÀsttrafiks API-uppgifter (gratis pÄ https://developer.vasttrafik.se/)
- Prenumerera pÄ "API Planera Resa" v4 i utvecklarportalen
- Ăppna HACS i Home Assistant
- Klicka pÄ "Integrations"
- Klicka pĂ„ menyn (âź) lĂ€ngst upp till höger
- VĂ€lj "Custom repositories"
- LĂ€gg till URL:
https://github.com/frodr1k/Vasttrafik_M34 - VĂ€lj kategori: "Integration"
- Klicka "Add"
- Hitta "VĂ€sttrafik M34" och klicka "Download"
- Starta om Home Assistant
- Kopiera mappen
custom_components/vasttrafik_m34till dinconfig/custom_components-katalog - Starta om Home Assistant
- GĂ„ till https://developer.vasttrafik.se/
- Skapa ett konto (gratis)
- Logga in och skapa en ny applikation
- Prenumerera pÄ "API Planera Resa" (Journey Planning API) - VÀlj v4
- Kopiera din Autentiseringsnyckel
- Detta Àr en base64-kodad strÀng som ser ut sÄ hÀr:
bXlDbGllbnRJZDpteUNsaWVudFNlY3JldA==- Det Àr den kombinerade
client_id:client_secreti base64-format â ïž VIKTIGT: Detta Ă€r DIN hemliga nyckel - dela aldrig den offentligt!
- GĂ„ till InstĂ€llningar â Enheter & TjĂ€nster
- Klicka "+ LĂGG TILL INTEGRATION"
- Sök efter "VÀsttrafik M34"
- Följ konfigurationsguiden:
- Ange Autentiseringsnyckel: Klistra in din autentiseringsnyckel frÄn portalen
- âčïž OBS: Du behöver bara ange denna en gĂ„ng vid första installationen
- NÀr du lÀgger till fler hÄllplatser ÄteranvÀnder integrationen automatiskt den befintliga autentiseringsnyckeln
- Du kommer bara bli tillfrÄgad igen om token har gÄtt ut eller blivit ogiltig
- Sök HÄllplats: Skriv minst 2 tecken (t.ex. "Central", "Brunns")
- VÀlj HÄllplats: VÀlj din hÄllplats frÄn resultaten
- Ange Autentiseringsnyckel: Klistra in din autentiseringsnyckel frÄn portalen
- Klart! Integrationen skapar en sensor-entitet
Integrationen skapar en sensor som visar minuter till nÀsta avgÄng med detaljerade attribut.
Sensorns tillstÄnd visar tid till nÀsta avgÄng:
- "Nu" - AvgÄr nu
- "1 min" - AvgÄr om 1 minut
- "5 min" - AvgÄr om 5 minuter
- "Inga avgÄngar" - Inga avgÄngar tillgÀngliga
sensor.vasttrafik_centralstationen:
state: "2 min"
attributes:
station_name: "Centralstationen"
station_gid: "9021014001760000"
departure_count: 8
departures:
- "16 â Bergsjön - 2 min đŽ"
- "16 â Bergsjön - 12 min"
- "19 â Ă
nĂ€svĂ€gen - 5 min (+2 min) đŽ"
- "19 â Ă
nÀsvÀgen - 15 min"
- "6 â Chalmers - 7 min đŽ"
last_update: "2026-01-13T15:30:00"Indikatorer:
- đŽ = Realtidsdata tillgĂ€nglig (berĂ€knad tid)
- (+X min) = Försenad X minuter
- (-X min) = Tidigare Àn planerat
- [INSTĂLLD] = InstĂ€lld avgĂ„ng
- AnvÀnder OAuth2 Client Credentials-flöde
- Tokens giltiga i 24 timmar (86400 sekunder)
- Automatisk uppdatering 5 minuter före utgÄng
- SĂ€ker tokenlagring i konfigurationen
- Token:
POST https://ext-api.vasttrafik.se/token - Sökning:
GET https://ext-api.vasttrafik.se/pr/v4/locations/by-text - AvgÄngar:
GET https://ext-api.vasttrafik.se/pr/v4/stop-areas/{gid}/departures
- AvgÄngar uppdateras varje 60 sekund
- Minimala API-anrop (token cachas, endast avgÄngar hÀmtas regelbundet)
- NĂ€tverkseffektiv design
- Starta om Home Assistant efter installation via HACS
- Kontrollera Home Assistant-loggarna för fel
- Verifiera att katalogen
custom_components/vasttrafik_m34finns
- Verifiera att du kopierat hela Autentiseringsnyckeln frÄn portalen
- Kontrollera att det Àr den base64-kodade nyckeln, inte client_id eller client_secret separat
- SÀkerstÀll att din applikation har prenumererat pÄ "API Planera Resa" v4
- Kontrollera din internetanslutning
- Verifiera att developer.vasttrafik.se Àr tillgÀnglig
- Kolla Home Assistant-loggarna för detaljerade felmeddelanden
- Verifiera att hÄllplatsen du valde har avgÄngar inom nÀsta timme
- Kontrollera om det Àr sent pÄ natten (begrÀnsad trafik)
- Prova att konfigurera om med en annan hÄllplats
- Prova att söka med olika termer
- AnvÀnd svenska hÄllplatsnamn (t.ex. "Centralstationen" inte "Central Station")
- Prova delar av namnet (t.ex. "Brunns" för "Brunnsparken")
This integration includes comprehensive automated tests.
pip install -r requirements_test.txtpytest tests/ -vpytest tests/ -v --cov=custom_components --cov-report=term-missing- 23 automated tests covering:
- Config flow (9 tests)
- Integration setup (6 tests)
- Sensor platform (8 tests)
- CI/CD: GitHub Actions runs tests on every push
- Python: Tests run on Python 3.11 and 3.12
- Fork the repository
- Create a feature branch
- Make your changes
- Run tests:
pytest tests/ -v - Submit a pull request
All PRs must pass automated tests before merge!
M34 Ă€r Göteborgs nyaste och lĂ€ngsta spĂ„rvagnsmodell - en perfekt symbol för modern kollektivtrafik! đ
This integration achieves Home Assistant's Bronze Quality Standard with:
- â Comprehensive test coverage
- â Automated CI/CD pipeline
- â Proper dependency management
- â All Bronze requirements met (11/11)
MIT-licens - Se LICENSE-filen för detaljer
- Rapportera problem: https://github.com/frodr1k/Vasttrafik_M34/issues
- Bidrag vÀlkomnas via pull requests