Typenschein-Abfrage selbermachen

Hallo Zäme

Mit dem Ziel, den standartmässig eingetragenen Rad/Reifen-Kombinationen von meinem VW T4 zu erfahren, hatte ich heute mal wieder typenscheine.ch aufgerufen. In der dortigen Abfrage sind leider nicht mehr alle Angaben ersichtlich. Mir liegt es aber fern, für die gelegentlichen Abfragen dort ein Bezahl-Konto zu eröffnen. Schliesslich kommen die Daten ja vom Bund, aufgrund Open-Data sind diese öffentlich zugänglich.

Es ist etwas umständlich, aber man kommt auch selber zu den gewünschten Daten. Anleitung:

  1. Hintergrundwissen: Übersichtsseite Fahrzeugdaten vom Astra:
    Fahrzeugdaten (admin.ch)

  2. Dort findet man den Link zu den Daten. Diese sind in einem Text-File gespeichert, welches ca. 177’175 Zeilen aufweist. Ich konnte es nicht direkt abspeichern. Der Link zum File, dieser wird im Excel weiterverwendet:

https://files.admin.ch/astra_ffr/mofis/Datenlieferungs-Kunden/opendata/2000-Typengenehmigungen_TG_TARGA/2200-Basisdaten_TG_ab_1995/TG-Automobil.txt
  1. Daten ins Excel laden:
  • Excel öffnen
  • Neues Dokument anlegen
  • Reiter “Daten” → Feld “Daten abrufen und transformieren” → “Aus dem Web” anwählen
  • URL einfügen von Schritt 2
  • “OK” und später “Verbinden”, dann “Laden”
  • Etwas warten, bei mir hat die Abfrage rund 15 min gedauert
  • Gewünschte Daten konsultieren
  • File ggf. abspeichern
  1. ggf. selber eine passende Datenverarbeitung für eine bequeme Abfrage ins File integrieren.

Gruss
Patrik

7 „Gefällt mir“

Betreffend dem Punkt Zwo hat es eine Änderung gegeben. Die Daten sind nun unter folgendem Link abrufbar:

https://ivz-opendata.ch/opendata/2000-Typengenehmigungen_TG_TARGA/2200-Basisdaten_TG_ab_1995/TG-Automobil.txt

Ergibt im Excel ein paar Änderungen in der Datenintegration:

  • Excel öffnen
  • Neues Dokument anlegen
  • Reiter “Daten” → Feld “Daten abrufen und transformieren” → “Aus dem Web” anwählen
  • URL einfügen von Schritt 2
  • Öffnen als Text-Dokument
  • Spalten Teilen, Nach Trennzeichen, Tabstopp, OK
  • Erste Zeile als Überschrift verwenden
  • Speichern und Schliessen
  • Dokument speichern

Gruss
Patrik

8 „Gefällt mir“

Früher gabe es dort auch eine aggregierte Liste je Typenschein mit den Angaben wieviele Fahrzeuge eingelöst sind mit diesem Typenschein usw.

Die Daten sind unter folgendem Link immer noch verfügbar:

Aber nicht mehr aggregiert, also je eingelöstem Fahrzeug eine Zeile (BEST.txt für die normalen Fahrzeuge). DIe liste Tab getrennt und 1.9 GB gross. Also die Liste mal runtergeladen und ein mit grep die Zeilen mit den passenden Typenscheinen rausgesucht. Da nicht jeder eine bash Konsole zur Verfügung hat, fragte ich nachher eine KI ob das nicht auch mit javascript lokal im Browser geht. Geht ohne Probleme inzwischen. Ich möchte euch das Miniskript nicht vorenthalten:

<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <title>ASTRA Typenschein-Abfrage</title>
    <style>
        body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; max-width: 900px; margin: 30px auto; padding: 0 20px; color: #333; }
        .box { background: #f5f5f7; padding: 20px; border-radius: 8px; margin-bottom: 20px; border: 1px solid #e5e5ea; }
        input, button { padding: 10px; font-size: 16px; border-radius: 5px; border: 1px solid #ccc; margin-right: 10px; }
        input[type="text"] { text-transform: uppercase; width: 150px; }
        button { background: #0071e3; color: white; border: none; cursor: pointer; font-weight: bold; }
        button:hover { background: #0077ed; }
        button:disabled { background: #aeaeaf; cursor: not-allowed; }
        #status { font-weight: bold; margin-top: 10px; color: #666; }
        .download-link { display: inline-block; margin-top: 12px; color: #0071e3; text-decoration: none; font-size: 14px; }
        .download-link:hover { text-decoration: underline; }
        .card { background: white; border: 1px solid #d2d2d7; border-radius: 8px; padding: 15px; margin-top: 15px; box-shadow: 0 2px 4px rgba(0,0,0,0.05); }
        .card-header { font-weight: bold; border-bottom: 2px solid #0071e3; padding-bottom: 5px; margin-bottom: 10px; color: #0071e3; display: flex; justify-content: space-between; }
        .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 8px; font-size: 14px; }
        .grid div { padding: 4px; border-bottom: 1px solid #f0f0f0; }
        .label { font-weight: bold; color: #555; }
    </style>
</head>
<body>

    <h2>🇨🇭 ASTRA Fahrzeugbestand-Abfrage</h2>

    <div class="box">
        <label style="display: block; margin-bottom: 10px; font-weight: bold;">Schritt 1: BEST.txt auswählen</label>
        <input type="file" id="fileInput" accept=".txt">
        <div id="status">Bitte Datei auswählen...</div>
        <a class="download-link" href="https://opendata.astra.admin.ch/ivzod/1000-Fahrzeuge_IVZ/1300-Fahrzeugbestaende/1320-Datensaetze_monatlich/" target="_blank">🔗 Hier die aktuellste BEST.txt beim ASTRA herunterladen</a>
    </div>

    <div class="box">
        <label style="display: block; margin-bottom: 10px; font-weight: bold;">Schritt 2: Typenschein suchen</label>
        <input type="text" id="tsInput" placeholder="Z.B. 1VA345" disabled>
        <button id="searchBtn" disabled>Suchen</button>
    </div>

    <h3 id="resultTitle">Ergebnisse</h3>
    <div id="results"></div>

<script>
    const fileInput = document.getElementById('fileInput');
    const tsInput = document.getElementById('tsInput');
    const searchBtn = document.getElementById('searchBtn');
    const statusDiv = document.getElementById('status');
    const resultsDiv = document.getElementById('results');
    const resultTitle = document.getElementById('resultTitle');

    let file = null;
    let headers = [];

    // Datei-Auswahl überwachen
    fileInput.addEventListener('change', async (e) => {
        file = e.target.files[0];
        if (!file) return;

        statusDiv.innerText = "Lese Spaltenstruktur ein...";

        // Die erste Zeile (Header) einlesen
        const stream = file.stream();
        const reader = stream.getReader();
        const decoder = new TextDecoder('utf-8');
        let { value, done } = await reader.read();

        const firstChunk = decoder.decode(value);
        const firstLine = firstChunk.split('\n')[0];
        headers = firstLine.split('\t').map(h => h.trim());

        // Reader stoppen, wir brauchen noch nicht mehr
        await reader.cancel();

        statusDiv.innerHTML = `Datei bereit: <strong>${file.name}</strong> (${(file.size / (1024*1024*1024)).toFixed(2)} GB)<br>Spalten erfolgreich geladen.`;
        tsInput.disabled = false;
        searchBtn.disabled = false;
    });

    // Suchfunktion
    searchBtn.addEventListener('click', async () => {
        const searchTS = tsInput.value.replace(/[\s.]/g, '').toUpperCase();
        if (!searchTS) return alert("Bitte Typenschein eingeben!");

        searchBtn.disabled = true;
        tsInput.disabled = true;
        resultsDiv.innerHTML = "";
        resultTitle.innerText = "Suche läuft...";

        const stream = file.stream();
        const reader = stream.getReader();
        const decoder = new TextDecoder('utf-8');

        let partialLine = "";
        let count = 0;
        let lineIndex = 0;

        while (true) {
            const { value, done } = await reader.read();
            if (done) break;

            const chunk = decoder.decode(value, { stream: true });
            const lines = (partialLine + chunk).split('\n');

            // Die letzte Zeile könnte unvollständig sein, für den nächsten Durchlauf merken
            partialLine = lines.pop();

            for (let line of lines) {
                lineIndex++;
                if (lineIndex === 1) continue; // Kopfzeile überspringen

                const columns = line.split('\t');
                // Spalte 11 (Index 10) ist die Typengenehmigungs-Nr
                if (columns[10] && columns[10].trim().toUpperCase() === searchTS) {
                    count++;
                    renderVehicleCard(columns, count);
                }
            }
        }

        // Eventuellen Rest verarbeiten
        if (partialLine) {
            const columns = partialLine.split('\t');
            if (columns[10] && columns[10].trim().toUpperCase() === searchTS) {
                count++;
                renderVehicleCard(columns, count);
            }
        }

        resultTitle.innerText = `Suche beendet. Total gefundene Fahrzeuge: ${count}`;
        searchBtn.disabled = false;
        tsInput.disabled = false;

        if (count === 0) {
            resultsDiv.innerHTML = "<p>Keine Fahrzeuge mit diesem Typenschein gefunden.</p>";
        }
    });

    // Fahrzeug-Karte im HTML zeichnen
    function renderVehicleCard(columns, index) {
        const card = document.createElement('div');
        card.className = 'card';

        // Zähler dreistellig formatieren (z.B. 001)
        const formattedIndex = String(index).padStart(3, '0');

        let html = `<div class="card-header">
                        <span>Fahrzeug #${index}</span>
                        <span>^^^ ${formattedIndex} ^^^</span>
                    </div>
                    <div class="grid">`;

        // Alle Spalten untereinander ausgeben
        headers.forEach((header, i) => {
            const value = columns[i] ? columns[i].trim() : '';
            html += `<div><span class="label">${header}:</span> ${value}</div>`;
        });

        html += `</div>`;
        card.innerHTML = html;
        resultsDiv.appendChild(card);
    }
</script>
</body>
</html>

Speichern als ts_abfrage.html oder so im Browser öffnen und dann auf der Webseite die lokal gespeicherte BEST.txt (oder ANDERE.txt,… nicht getestet) auswählen und nach dem Typenschein suchen. Typenschein eingeben (ohne Zusatz: M, C, X, Y am Schluss falls vorhanden) und jedes Fahrzeug wird ausgegeben. Das eigene via Zulassungskanton, PLZ, Farbe,… suchen.

Gruss
tomix

1 „Gefällt mir“

Vielen dank. Schade, dass es so kompliziert ist an freie Daten zu kommen. Es gibt aber auch noch folgende Seite mit den Typenscheinen, die aktuell noch kostenlos ist:

Bisher habe ich dort alles mehr oder weniger gefunden. Könnte man sicherlich auch einfacher und übersichtlicher machen aber es geht :wink:

Grüße

Franz

Einfach verfügbar sind die Daten, sind nur viel Daten und somit nicht so einfach verarbeitbar.

gibt es auch.

Gibt es irgendeine Möglichkeit via Typenschein die Fahrzeugmasse (Länge, Breite, Höhe) abzufragen? Gewicht und alles mögliche ist in Typenschein hinterlegt, aber so was banales wie die Länge nicht.

Gruss
tomix

Ja aber bei Typenscheine.ch muss man ja bezahlen um alle Infos zu sehen, die hinterlegt sind

Aha wusste ich nicht. War evtl. auch https://typenscheinschweiz.ch/ hatte evtl. auch diese Seite in Erinnerung. Aber ja beim alten Bus kommt bei der erst genannten Seite der ganze Typenschein (Scan), aber nur knapp lesbar, bei der zweiten gar nix. Bei Zeit und Lust könnte man sich also mal durch die Daten vom Bund wühlen und ein schlaues Frontend schreiben. Oder eine KI dazu bringen in den Daten zu wühlen und einem den Typenschein herunterzuladen?

Auf nach hacken, bringt die auch den Link raus wo die liegen:

Bleibt man dann hartnäckig folgt auch die Anleitung, wo im Baum man suchen muss:

  1. 2000-Typengenehmigungen_TG_TARGA/
  2. 2400-pdf-Scans_TG_bis_1985/
  3. 2420-deutsch/ (für die deutschsprachigen Dokumente)
  4. Scrollen Sie im Verzeichnisindex nach unten bis zur Datei TYPENSCHEINNUMMER.pdf

Ich wollte aber nicht die Typenscheine sondern wissen wie viele gleiche Busse es noch gibt. Biem 9 Plätzer 5 und nur einer (unser) wurde nicht verändert (also kein Zusatz beim Typenschein, alle anderen wurden Camper).

Gruss
tomix