Skip to content

Estonia ๐Ÿ‡ช๐Ÿ‡ช Transpordiamet Registry โ€‹

Nameee-transpordiamet-registry
CountryEstonia
Registration prefixES-
Data sourcehttps://transpordiamet.ee/ohusoidukite-register
FormatHTML table (single fixed page)
Run frequencyWeekly (Tuesday, 20:10 UTC)
Depends on Mictronics for ICAO hexYes โ€” this runner does not publish ICAO hex addresses; registrations are resolved via RediSearch against Mictronics records (idx:aircraft:mictronics). Must run after the mictronics runner.

How it works โ€‹

The Estonian Transport Administration civil aircraft register page is fetched directly (no index-page discovery needed โ€” the URL is fixed) and its single HTML table is parsed with BeautifulSoup. The first two rows are header rows and are skipped. Each data row's registration mark has internal whitespace stripped (e.g. ES- FCC โ†’ ES-FCC) before it's used as the RediSearch lookup key against Mictronics. Every written record explicitly sets military: false โ€” this register is exclusively civil, and the explicit value ensures a stale military: true flag (from Mictronics or a prior record on a reused hex) is corrected on re-registration.

Columns โ€‹

The table has 9 positional columns (0-based); most are blank spacers.

Source columnImportedNotes
Registration mark (col 1)โœ…ES-prefix; whitespace normalized; used as the Mictronics lookup key
Type of Aircraft (col 4)โœ…โ†’ aircraft.model
Serial number (col 5)โœ…โ†’ aircraft.serial_number
Owner (col 6)โœ…โ†’ registrant.names[0]
Operator (col 7)โŒParsed but not stored
Blank spacer columns (0, 2, 3, 8)โŒNo data present

See specs/data-dictionary.yaml (ee-transpordiamet-registry entry) for full column semantics and cross-source schema notes.

Example Output โ€‹

Read back the merged record for a given ICAO hex (combines this runner's data with Mictronics and any other sources that have written to the same key):

bash
docker run --rm --network host redis:latest redis-cli EVAL "$(cat ./shared/lua/merge_aircraft.lua)" 0 51105A | python3 -m json.tool --sort-keys --no-ensure-ascii
json
{
    "aircraft": {
        "manufacturer": "CESSNA",
        "manufacturer_model": "CESSNA 172 Skyhawk",
        "model": "Cessna 172M",
        "serial_number": "17262412",
        "type_designator": "C172"
    },
    "data_sources": [
        "mictronics",
        "ee-transpordiamet-registry"
    ],
    "icao_hex": "51105A",
    "military": false,
    "registrant": {
        "names": [
            "AS Tackmer Air"
        ]
    },
    "registration": "ES-FCC"
}
bash
docker run --rm --network host redis:latest redis-cli EVAL "$(cat ./shared/lua/merge_aircraft.lua)" 0 511153 | python3 -m json.tool --sort-keys --no-ensure-ascii
json
{
    "aircraft": {
        "manufacturer": "AIRBUS",
        "manufacturer_model": "AIRBUS A-320",
        "model": "Airbus A320",
        "serial_number": "2689",
        "type_designator": "A320"
    },
    "data_sources": [
        "mictronics",
        "ee-transpordiamet-registry"
    ],
    "icao_hex": "511153",
    "military": false,
    "registrant": {
        "names": [
            "Bank of America, N.A."
        ]
    },
    "registration": "ES-SAY"
}

Configuration โ€‹

See Data Runners for the full list of environment variables every runner reads. This runner writes aircraft:registry:{icao_hex} with a fixed 14-day TTL (ENRICHMENT_TTL_SECONDS in shared/timing.py).

MQTT โ€‹

Published once, at the end of a run, to SkyFollower/runner/ee-transpordiamet-registry/statistic/{name} (all retained):

Topic suffixValueFormat
records_importede.g. 271Integer as string
last_run_ate.g. 2026-07-07T14:32:01.123456+00:00ISO 8601 UTC
last_run_statusSuccess or FailureString

Home Assistant autodiscovery configs are also published (retained) to homeassistant/sensor/SkyFollower_runner_ee_transpordiamet_registry_{name}/config for each of the three stats above.