Met deze handleiding lees je je Škoda uit in Home Assistant (HA) via de officiële MyŠkoda Public API. Je ziet de locatie, kilometerstand, het slot, de accu en meldingen, en je kunt de airco aan- en uitzetten. De handleiding bevat geen persoonlijke gegevens. Overal waar je iets van jezelf moet invullen staat een invulveld in hoofdletters, zoals JOUW_API_KEY.
Wat je nodig hebt
- Een Škoda met MyŠkoda-account en connected services
- Home Assistant met toegang tot configuration.yaml en secrets.yaml (bijvoorbeeld via de ingebouwde File editor)
- Een API-key uit de MyŠkoda-app: ga naar https://go.skoda.eu/api-keys en kies de auto’s waarvoor de key moet gelden
- Het VIN (chassisnummer) van je auto
Goed om te weten
- Authenticatie: een statische key in de header X-API-Key. Er is geen OAuth of token-refresh.
- Verlooptijd: de key verloopt. Elke response bevat de verlooptijd in de header X-API-Key-Expires-At. Zet een herinnering in je agenda of gebruik stap 6.
- Limieten: volgens Škoda maximaal 5 keys per auto en 20 verzoeken per uur. Dat kan in de toekomst wijzigen. Elke poll van HA en elke druk op een knop telt als een verzoek.
- Wat er niet in zit: onderhoud, inspectie, banden en storingslampjes zitten niet in de publieke API.
- Voorbeeldwaarden: de veldnamen hieronder komen uit de API-specificatie (/docs/myskoda-public-api.yaml). Wat je auto levert, hangt af van het model. Een benzineauto heeft bijvoorbeeld geen charging.
Stap 1: secrets
Zet in secrets.yaml:
skoda_api_key: JOUW_API_KEY
skoda_vehicle_url: https://public.api.connect.skoda-auto.cz/api/v1/vehicles/JOUW_VIN?include=status,odometer,parkingPosition,charging,airConditioning
skoda_airco_start_url: https://public.api.connect.skoda-auto.cz/api/v1/vehicles/JOUW_VIN/air-conditioning/start
skoda_airco_stop_url: https://public.api.connect.skoda-auto.cz/api/v1/vehicles/JOUW_VIN/air-conditioning/stop
Met include= vraag je alleen op wat je nodig hebt. Zo blijft de response klein.
Stap 2: sensoren
Zet dit in configuration.yaml. Heb je al een rest: op kolom 0 (zonder #), voeg het blok dan als extra item toe en maak geen tweede rest:. Gebruik je de oudere notatie sensor: – platform: rest, zet dit dan op een eigen plek op kolom 0.
rest:
- resource: !secret skoda_vehicle_url
scan_interval: 900
headers:
X-API-Key: !secret skoda_api_key
sensor:
- name: "Skoda kilometerstand"
value_template: "{{ value_json.vehicle.odometer.mileageInKm | default(none) }}"
unit_of_measurement: "km"
device_class: distance
state_class: total_increasing
- name: "Skoda vergrendeling"
value_template: >
{{ value_json.vehicle.status.overall.reliableLockStatus
| default(value_json.vehicle.status.overall.locked | default('unknown')) }}
- name: "Skoda positie"
value_template: "{{ value_json.vehicle.parkingPosition.state | default('unknown') }}"
json_attributes_path: "$.vehicle.parkingPosition"
json_attributes:
- formattedAddress
- name: "Skoda gps"
value_template: "{{ value_json.vehicle.parkingPosition.state | default('unknown') }}"
json_attributes_path: "$.vehicle.parkingPosition.gpsCoordinates"
json_attributes:
- latitude
- longitude
- name: "Skoda accu"
value_template: "{{ value_json.vehicle.charging.status.battery.stateOfChargeInPercent | default(none) }}"
unit_of_measurement: "%"
device_class: battery
state_class: measurement
- name: "Skoda laadlimiet"
value_template: "{{ value_json.vehicle.charging.settings.targetStateOfChargeInPercent | default(none) }}"
unit_of_measurement: "%"
- name: "Skoda laadstatus"
value_template: "{{ value_json.vehicle.charging.status.state | default('unknown') }}"
- name: "Skoda kabel"
value_template: "{{ value_json.vehicle.charging.status.plugConnectionState | default('unknown') }}"
- name: "Skoda airco"
value_template: "{{ value_json.vehicle.airConditioning.state | default('unknown') }}"
json_attributes_path: "$.vehicle.airConditioning.targetTemperature"
json_attributes:
- value
- name: "Skoda laadvermogen"
value_template: "{{ value_json.vehicle.charging.status.chargePowerInKw | default(0) }}"
unit_of_measurement: "kW"
device_class: power
state_class: measurement
- name: "Skoda tijd tot vol"
value_template: "{{ value_json.vehicle.charging.status.remainingTimeToFullyChargedInMinutes | default(none) }}"
unit_of_measurement: "min"
device_class: duration
- name: "Skoda fouten"
value_template: "{{ value_json.errors | default([]) | length }}"
json_attributes:
- errors
binary_sensor:
- name: "Skoda deuren open"
value_template: "{{ value_json.vehicle.status.overall.doors == 'OPEN' }}"
device_class: door
- name: "Skoda airco actief"
value_template: "{{ value_json.vehicle.airConditioning.state not in ['OFF', 'unknown'] }}"
device_class: runningLet op bij de plaatsing: unit_of_measurement, state_class en device_class: duration horen onder sensor:. Onder binary_sensor: geven ze een foutmelding. Controleer daarna Ontwikkelaarstools > YAML > Configuratie controleren en doe een volledige herstart
Stap 3: airco aan en uit
Zet dit op kolom 0 in configuration.yaml, maar maar één keer. Staat er al een rest_command:, voeg de twee commando’s dan daaronder toe.
rest_command:
skoda_airco_start:
url: !secret skoda_airco_start_url
method: post
headers:
X-API-Key: !secret skoda_api_key
content_type: "application/json"
payload: '{"targetTemperature":{"value":21,"unit":"CELSIUS"},"airConditioningWithoutExternalPower":true}'
skoda_airco_stop:
url: !secret skoda_airco_stop_url
method: post
headers:
X-API-Key: !secret skoda_api_keyDe doeltemperatuur staat vast op 21 °C. airConditioningWithoutExternalPower: true laat de airco ook zonder stekker werken, wat accu kost. De auto voert het commando met enkele minuten vertraging uit. Controleer het resultaat met sensor.skoda_airco (status OFF of HEATING).
Stap 4: dashboard
Voeg via Dashboard > Bewerken > Kaart toevoegen > Handmatig toe:
type: vertical-stack
cards:
- type: gauge
entity: sensor.skoda_accu
name: Accu
min: 0
max: 100
needle: true
- type: entities
entities:
- entity: sensor.skoda_laadlimiet
name: Laadlimiet
- entity: sensor.skoda_laadstatus
name: Laadstatus
- entity: sensor.skoda_kabel
name: Kabel
- entity: sensor.skoda_laadvermogen
name: Laadvermogen
- entity: sensor.skoda_tijd_tot_vol
name: Tijd tot vol
- entity: sensor.skoda_vergrendeling
name: Slot
- entity: binary_sensor.skoda_deuren_open
name: Deuren
- entity: sensor.skoda_kilometerstand
name: Kilometerstand
- entity: sensor.skoda_positie
name: Status
- type: attribute
entity: sensor.skoda_positie
attribute: formattedAddress
name: Adres
- entity: sensor.skoda_fouten
name: API-meldingenAirco-knoppen. De eerste knop toont de status en kleurt mee bij de volgende poll(max na 15 minuten):
type: horizontal-stack
cards:
- type: button
entity: binary_sensor.skoda_airco_actief
name: Airco aan
icon: mdi:air-conditioner
show_state: true
state_color: true
tap_action:
action: perform-action
perform_action: rest_command.skoda_airco_start
- type: button
name: Airco uit
icon: mdi:power
tap_action:
action: perform-action
perform_action: rest_command.skoda_airco_stopStap 5: auto met een eigen plaatje op de hoofdmap
De hoofdmap toont zonder plaatje alleen de beginletters van de naam. Zet een plaatje (bijvoorbeeld een transparante PNG van ongeveer 200 pixels breed) in /config/www/ en voeg customize toe aan het bestaande homeassistant:-blok. Dat blok mag maar één keer in configuration.yaml staan.
homeassistant:
customize:
sensor.skoda_gps:
entity_picture: /local/JOUW_BESTANDSNAAM.pngControleer eerst of het plaatje bereikbaar is op http://JOUW_HA_ADRES:8123/local/JOUW_BESTANDSNAAM.png. Ververs daarna de kaart met Ctrl+F5.
Stap 6: meldingen
Zet dit in automations.yaml. Vervang notify.JOUW_NOTIFY_SERVICE door je eigen notify-service (zie Ontwikkelaarstools > Acties met filter notify) en geef elke automation een eigen, unieke id.
- id: 'JOUW_UNIEKE_ID_1'
alias: "Skoda accu vol"
description: ''
triggers:
- trigger: template
value_template: >-
{{ states('sensor.skoda_accu') | int(0) >= states('sensor.skoda_laadlimiet') | int(101)
and is_state('sensor.skoda_kabel', 'CONNECTED') }}
conditions: []
actions:
- action: notify.JOUW_NOTIFY_SERVICE
data:
title: "Skoda"
message: "Accu is op {{ states('sensor.skoda_accu') }}% (limiet bereikt)."
mode: single
- id: 'JOUW_UNIEKE_ID_2'
alias: "Skoda API-key verloopt binnenkort"
description: ''
triggers:
- trigger: time
at: "09:00:00"
conditions:
- condition: template
value_template: >-
{{ now().date() >= (strptime('JJJJ-MM-DD', '%Y-%m-%d') - timedelta(days=14)).date() }}
actions:
- action: notify.JOUW_NOTIFY_SERVICE
data:
title: "Skoda API-key"
message: "Je API-key verloopt binnenkort. Maak een nieuwe aan en update secrets.yaml."
mode: singleVervang JJJJ-MM-DD door de verloopdatum van je key. Die staat in de MyŠkoda-app, of in de header X-API-Key-Expires-At van een response:
curl -i -H “X-API-Key: JOUW_API_KEY” “https://public.api.connect.skoda-auto.cz/api/v1/vehicles/JOUW_VIN?include=info”
De automation “accu vol” meldt zodra de accu de ingestelde laadlimiet van de auto bereikt. Pas je de limiet in de auto aan, dan past de melding vanzelf mee. Omdat er maar elke 15 minuten gepolld wordt, kan de accu bij de melding iets boven de limiet zitten.
Werk de automations in automations.yaml bij via Ontwikkelaarstools > YAML > Automatiseringen herladen.
Tips en veelgemaakte fouten
- Herstart in plaats van herladen. Gebruik na wijzigingen aan sensoren een volledige herstart. Met de herlaadknop voor REST-entiteiten ontstaan kopieën zoals sensor.skoda_gps_2, omdat de sensoren geen unique_id hebben. De kopieën verdwijnen bij de volgende herstart.
- Inspringing. Een – resource: op de verkeerde kolom geeft de fout bad indentation of a sequence entry of required key ‘platform’ not provided. Het blok hoort onder een eigen rest: op kolom 0 te staan.
- Dubbele sleutels. rest:, rest_command:, homeassistant: en automation: mogen elk maar één keer op kolom 0 staan.
- Sensor zonder waarde. Staat een sensor op unknown, dan levert je auto dat onderdeel niet. Kijk op Statussen naar sensor.skoda_fouten, want de errors-lijst noemt welke onderdelen ontbreken.
- Foutcodes in het logboek. 401 betekent een ongeldige of verlopen key, 403 een key die niet bij deze auto hoort, en 429 dat het limiet van verzoeken is bereikt.
- Entiteiten zonder unique_id kun je niet in de interface hernoemen of verwijderen. Pas de naam daarom aan in de YAML of in customize.