Skip to content

Slovakia ๐Ÿ‡ธ๐Ÿ‡ฐ NSAT Registry โ€‹

Namesk-nsat-registry
CountrySlovakia
Registration prefixOM-
Data sourcehttps://letectvo.nsat.sk/letova-sposobilost/register-lietadiel-slovenskej-republiky/zoznam-registra/
FormatPDF (date-stamped filename, discovered via index page)
Run frequencyWeekly (Tuesday, 09:10 UTC)
Depends on Mictronics for ICAO hexYes โ€” the NSAT (Nรกrodnรฝ bezpeฤnostnรฝ รบrad pre letectvo) register does not publish ICAO hex (Mode S) addresses; registrations are resolved via RediSearch against Mictronics records (idx:aircraft:mictronics). Must run after the mictronics runner.

How it works โ€‹

The register PDF's URL is date-stamped and not hardcoded, so the NSAT index page is scraped for the first .pdf link found. Tables are extracted with pdfplumber; a row is treated as a data row when its second cell, after stripping all whitespace, starts with OM- (registration marks appear in the PDF in a spaced format, e.g. OM - 0101, and are normalized to OM-0101). Once a header row has been seen, the four Slovak column values are re-assigned positionally onto internal column-name constants rather than trusting the header dict directly, since pdfplumber can introduce newline/Unicode artifacts into the extracted header text that would otherwise mismatch the constants. Model, serial number, and owner are all run through a whitespace-collapsing transform, since pdfplumber can also introduce embedded newlines into a wrapped cell's text. 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 โ€‹

Source columnImportedNotes
Poznรกvacia znaฤka (Registration)โœ…OM-prefix; used as the Mictronics lookup key
Typ lietadla (Aircraft Type)โœ…โ†’ aircraft.model; embedded newlines collapsed to a single space
Vรฝrobnรฉ ฤรญslo (Serial Number)โœ…โ†’ aircraft.serial_number; embedded newlines collapsed to a single space
Vlastnรญk (Owner)โœ…โ†’ registrant.names[0]; embedded newlines collapsed to a single space
Prevรกdzkovateฤพ (Operator)โŒPresent in source; not read by this runner
Zรกloลพnรฉ prรกvo (Lien)โŒPresent in source; not read by this runner

See specs/data-dictionary.yaml (sk-nsat-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 505C72 | python3 -m json.tool --sort-keys --no-ensure-ascii
json
{
    "aircraft": {
        "manufacturer": "PIPER",
        "manufacturer_model": "PIPER PA-28RT-201T Turbo",
        "model": "PA-28RT-201T (Turbo Arrow IV)",
        "serial_number": "28R-8031166",
        "type_designator": "P28U"
    },
    "data_sources": [
        "mictronics",
        "sk-nsat-registry"
    ],
    "icao_hex": "505C72",
    "military": false,
    "registrant": {
        "names": [
            "ลฝilinskรก univerzita v ลฝiline"
        ]
    },
    "registration": "OM-DCR"
}
bash
docker run --rm --network host redis:latest redis-cli EVAL "$(cat ./shared/lua/merge_aircraft.lua)" 0 505A88 | python3 -m json.tool --sort-keys --no-ensure-ascii
json
{
    "aircraft": {
        "manufacturer": "BOEING",
        "manufacturer_model": "BOEING 737-800",
        "model": "Boeing 737-8Q8",
        "serial_number": "35275",
        "type_designator": "B738"
    },
    "data_sources": [
        "mictronics",
        "sk-nsat-registry"
    ],
    "icao_hex": "505A88",
    "military": false,
    "registrant": {
        "names": [
            "AVIATOR IV 30666, DESIGNATED ACTIVITY COMPANY"
        ]
    },
    "registration": "OM-TVH"
}

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/sk-nsat-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_sk_nsat_registry_{name}/config for each of the three stats above.