Škodas officielle API i Home Assistant – hvad det kan, og hvad det ikke kan

Škoda har lanceret et officielt, offentligt API til MyŠkoda: Man laver en API-nøgle, vælger sin bil, og så kan man hente bilens data med et helt almindeligt REST-kald. Indtil nu har vores Elroq været koblet på Home Assistant med HACS-integrationen MySkoda, der bruger den samme bagvej som app’en. Jeg har flyttet så meget som muligt over på det officielle API – og undervejs lært, hvor grænserne går.

Det korte svar

BehovOfficielt API
Batteri, rækkevidde, kilometertæller✅ læses
Ladekabel, ladetilstand, ladeeffekt, resttid, ladegrænse✅ læses
Døre låst, vinduer, motorhjelm, klima✅ læses
Parkeringsposition og ladeprofiler✅ læses
Start/stop opladning og klima, ladegrænse✅ kommandoer
Lås døre op/i❌ findes ikke
Sædevarme, “vågn op”, udetemperatur, billeder af bilen❌ findes ikke
Lås stik op efter opladning⚠️ kun ved at overskrive hele ladeprofilen

Den store mangel er oplåsning. Vi har en automation, der låser bilen op hverdagsmorgener, når den har ladet – den kan ikke flyttes. Så MySkoda bliver ved med at køre side om side med API’et, men kun til de ting, API’et ikke kan.

Grænsen: 20 kald i timen

API’et tillader 20 kald i timen pr. bil, og fejlede kald tæller med. Det former hele opsætningen: Bilens data hentes med ét kald hvert 5. minut (12 i timen), og alle sensorer læser fra det samme svar. Det giver luft til et par kommandoer – men også en lille forsinkelse: Sætter man ladekablet i, går der op til 5 minutter, før Home Assistant ved det.

Tip: Hver genindlæsning af REST-integrationen henter også data. Retter man filen mange gange i samme time, kan man løbe ind i fejl 429.

Opsætningen

Alt ligger i én pakkefil med den indbyggede rest-integration – ingen HACS. API-nøglen ligger i secrets.yaml. Her er et uddrag med et par af sensorerne:

rest:
  - resource: "https://public.api.connect.skoda-auto.cz/api/v1/vehicles/DIT_VIN"
    scan_interval: 300          # 12 af de 20 kald i timen
    timeout: 20
    headers:
      X-API-Key: !secret skoda_public_api_key
    sensor:
      - name: "Škoda Elroq API Batteri"
        unique_id: skoda_api_battery_soc
        unit_of_measurement: "%"
        device_class: battery
        state_class: measurement
        availability: >-
          {{ value_json is mapping
             and value_json.get('vehicle', {}).get('charging', {}).get('status', {})
                  .get('battery', {}).get('stateOfChargeInPercent') is number }}
        value_template: "{{ value_json.vehicle.charging.status.battery.stateOfChargeInPercent }}"

      # Ladetilstand på dansk – ukendte værdier vises som API'ets egen tekst
      - name: "Škoda Elroq API Ladetilstand"
        unique_id: skoda_api_charging_state
        value_template: >-
          {%- set raa = value_json.vehicle.charging.status.state | upper -%}
          {{ {'CHARGING': 'Lader', 'CONNECT_CABLE': 'Sæt kablet i',
              'READY_FOR_CHARGING': 'Klar til opladning',
              'CONSERVING': 'Opladet – holder niveau'}.get(raa, raa) }}

      # Position til kortkort: latitude/longitude som attributter
      - name: "Škoda Elroq API Position"
        unique_id: skoda_api_position
        value_template: >-
          {{ value_json.vehicle.chargingProfiles.currentVehiclePositionProfile.name
             if value_json.vehicle.get('chargingProfiles', {}).get('currentVehiclePositionProfile') is mapping
             else 'Ude' }}
        json_attributes_path: "$.vehicle.parkingPosition.gpsCoordinates"
        json_attributes:
          - latitude
          - longitude

    binary_sensor:
      - name: "Škoda Elroq API Ladekabel"
        unique_id: skoda_api_plug_connected
        device_class: plug
        value_template: >-
          {{ value_json.vehicle.charging.status.plugConnectionState | upper == 'CONNECTED' }}

I alt laver det ene kald 20 sensorer: batteri, rækkevidde, kilometertæller, ladetilstand, ladeeffekt, resttid, ladegrænse, klima, sidst opdateret, position, låse- og dørstatus, ladeprofil, ladevindue og nummerplade.

Et smart trick: “hjemme” uden device tracker

API’et har ingen “home/not_home”, men det fortæller, hvilken ladeprofil der gælder på bilens nuværende position. Vores profil hedder “Hjem”, så positionssensoren viser “Hjem”, når bilen holder i indkørslen, og “Ude” ellers. Det er alt, lade-påmindelsen behøver.

Tre ting jeg lærte på den hårde måde

  1. En binær REST-sensor må ikke have attributter. Jeg gav “døre låst” et par attributter, og så afviste Home Assistant hele REST-blokken – ingen af de nye sensorer blev oprettet. Fejlen står i loggen, ikke i brugerfladen. Attributterne endte på en almindelig sensor i stedet.
  2. Læs specifikationen, ikke kun dokumentationen. Dokumentationssiden nævner kun ét endpoint, men den fulde OpenAPI-specifikation ligger offentligt og viser alle felter og alle 12 endpoints. Det var her, det stod klart, at der ingen låsekommando er.
  3. Sammenlign med det gamle, før du skifter. Før dashboards og automationer blev flyttet, tjekkede jeg, at batteri, rækkevidde, kilometertal, ladegrænse og alle dør-/vinduesstatusser var identiske mellem API’et og MySkoda.

Skiftet

Bilen optræder på fem dashboards. Her blev 13 MySkoda-sensorer udskiftet med API-sensorerne – også inde i kortenes skabeloner, f.eks. ikonet for ladestikket. Det, API’et ikke kan, peger stadig på MySkoda: knapperne, udetemperaturen og billederne af bilen. Lade-påmindelsen kl. 19:15 kører nu udelukkende på API’et.

Er det værd at skifte?

Til at læse data: ja. Det er officielt, stabilt og dokumenteret, og det kører med Home Assistants egen REST-integration. Til at styre bilen er det endnu for begrænset – så længe der ikke er en låsekommando, kan man ikke helt undvære den uofficielle integration. Jeg håber, Škoda udvider API’et; indtil da kører de to side om side.