Skip to content

Netherlands ๐Ÿ‡ณ๐Ÿ‡ฑ ILT Registry โ€‹

Namenl-ilt-registry
CountryNetherlands
Registration prefixPH-
Data sourcehttps://www.ilent.nl/documenten/lijsten/luchtvaart/databestanden/luchtvaartregister-data
FormatODS spreadsheet (date-stamped filename, changes monthly, discovered via index page)
Run frequencyWeekly (Thursday, 05:10 UTC)
Depends on Mictronics for ICAO hexNo โ€” the ILT register publishes the ICAO hex directly in its X-Ponder column, so records can be written to aircraft:registry:{icao_hex} without a RediSearch reverse lookup, and without mictronics having run first.

How it works โ€‹

The ILT index page is scraped with a regex for a URL (absolute or relative) containing the known filename stem luchtvaartuigregister-ilt-datas2...*.ods; the file is downloaded to a temp path and parsed with odfpy. Row 0 holds annotated headers (bracket suffixes like [details=n][kolom=j] are stripped off), row 1 is an informational text row that is skipped, and row 2 onward is data. Cells that carry OpenDocument's numbercolumnsrepeated attribute are expanded so that merged/repeated blank cells don't shift later columns out of alignment (with a guard against implausibly large repeat counts on trailing empty cells, which are collapsed back to one). A row is only written if X-Ponder is a valid 6-hex ICAO code and Registration is non-empty. 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.

Whenever a record has an aircraft.type_designator, aircraft:type:{type_designator} is looked up in Redis (populated by the mictronics runner) and, if found, its manufacturer_model and description_code (ICAO Doc 8643 description code, e.g. L2J) are set directly on this record โ€” unconditionally, regardless of whether Mictronics also has values for the same hex. This runner's own type_designator is sourced directly from the ILT register and is authoritative; merge_aircraft.lua's "registry wins over mictronics" precedence rule guarantees these values take priority at read time either way. The lookup is not a hard dependency โ€” a missing reference table entry, or the table not existing yet, leaves the record exactly as it would have been without this step.

Columns โ€‹

Source columnImportedNotes
FlagโŒPresent in source; not read by this runner
Registrationโœ…โ†’ top-level registration
RegisteredโŒPresent in source; not read by this runner
LatestOwnerChangeโŒPresent in source; not read by this runner
PrevCountryโŒPresent in source; not read by this runner
PrevMarkโŒPresent in source; not read by this runner
Manufacturerโœ…โ†’ aircraft.manufacturer
ManufacturedInโŒPresent in source; not read by this runner
Modelโœ…โ†’ aircraft.model
Serialโœ…โ†’ aircraft.serial_number
X-Ponderโœ…Validated as a 6-hex ICAO code; used directly as icao_hex (no Mictronics lookup needed)
Builtโœ…โ†’ aircraft.manufactured_date (YYYY-01-01T00:00:00Z), only if a 4-digit year
Groupโœ…โ†’ aircraft.type, mapped through a fixed table (e.g. Small aeroplane โ†’ Airplane, Rotorcraft โ†’ Helicopter); unmapped values pass through unchanged
ConfigurationโŒPresent in source; not read by this runner
MTOMโŒPresent in source; not read by this runner
MLMโŒPresent in source; not read by this runner
ICAO-codeโœ…โ†’ aircraft.type_designator; also used to look up aircraft:type:{type_designator} in Redis, setting aircraft.manufacturer_model and aircraft.description_code when found
AOCโŒPresent in source; not read by this runner
83BisโŒPresent in source; not read by this runner
RepresentativeโŒPresent in source; not read by this runner
MortgageโŒPresent in source; not read by this runner
VolumeโŒPresent in source; not read by this runner
LegalBaseโŒPresent in source; not read by this runner
Enginesโœ…โ†’ aircraft.powerplant.count, only if numeric
EngKindโœ…โ†’ aircraft.powerplant.type, mapped through a fixed table; "Engine - not defined" is dropped rather than stored
EngManufacturerโœ…โ†’ aircraft.powerplant.manufacturer; the literal value "Unknown" is filtered out
EngModelโœ…โ†’ aircraft.powerplant.model; values containing "not further defined" are filtered out
PropsโŒPresent in source; not read by this runner
PropKindโŒPresent in source; not read by this runner
PropManufacturerโŒPresent in source; not read by this runner
PropModelโŒPresent in source; not read by this runner
NoiseRequirementsโŒPresent in source; not read by this runner
NoiseCatโŒPresent in source; not read by this runner
NoiseRcrdโŒPresent in source; not read by this runner
LevelAppโŒPresent in source; not read by this runner
LevelFoโŒPresent in source; not read by this runner
LevelOfโŒPresent in source; not read by this runner
LevelSlโŒPresent in source; not read by this runner
LevelToโŒPresent in source; not read by this runner
RegistrIssuedโŒPresent in source; not read by this runner
RegistrExpiryโŒPresent in source; not read by this runner
CofA (Form24/25)_Iss.โŒPresent in source; not read by this runner
AirwIssuedโŒPresent in source; not read by this runner
AirwExpiryโŒPresent in source; not read by this runner
AirwKindโŒPresent in source; not read by this runner
AirwValโŒPresent in source; not read by this runner
NoiseIssuedโŒPresent in source; not read by this runner
NoiseExpiryโŒPresent in source; not read by this runner
RegBlockโŒPresent in source; not read by this runner
Site2TitleโŒPresent in source; not read by this runner
Site2Descr1โŒPresent in source; not read by this runner
Site2Descr2โŒPresent in source; not read by this runner
Site2Tech1โŒPresent in source; not read by this runner
Site2Tech2โŒPresent in source; not read by this runner
Site2Tech3โŒPresent in source; not read by this runner
Site2Tech4โŒPresent in source; not read by this runner
Site2Tech5โŒPresent in source; not read by this runner
Site2Noise1โŒPresent in source; not read by this runner
Site2Noise2โŒPresent in source; not read by this runner
Site2Doc1โŒPresent in source; not read by this runner
Site2Doc2โŒPresent in source; not read by this runner
Site2Doc3โŒPresent in source; not read by this runner

See specs/data-dictionary.yaml (nl-ilt-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 484674 | python3 -m json.tool --sort-keys --no-ensure-ascii
json
{
    "aircraft": {
        "description_code": "L1P",
        "manufactured_date": "2007-01-01T00:00:00Z",
        "manufacturer": "Piper Aircraft, Inc.",
        "manufacturer_model": "PIPER PA-28-140/150/160/180",
        "model": "PA-28-181",
        "powerplant": {
            "count": 1,
            "manufacturer": "AVCO Corporation, Lycoming Division",
            "model": "O-360-A4M",
            "type": "Piston"
        },
        "serial_number": "2843664",
        "type": "Airplane",
        "type_designator": "P28A"
    },
    "data_sources": [
        "mictronics",
        "nl-ilt-registry"
    ],
    "icao_hex": "484674",
    "military": false,
    "registration": "PH-WKB"
}
bash
docker run --rm --network host redis:latest redis-cli EVAL "$(cat ./shared/lua/merge_aircraft.lua)" 0 484F73 | python3 -m json.tool --sort-keys --no-ensure-ascii
json
{
    "aircraft": {
        "description_code": "L2J",
        "manufactured_date": "2012-01-01T00:00:00Z",
        "manufacturer": "Airbus S.A.S. (Sociรฉtรฉ par Actions Simplifiรฉe)",
        "manufacturer_model": "AIRBUS A-330-300",
        "model": "A330-303",
        "powerplant": {
            "count": 2,
            "manufacturer": "General Electric Company, Aircraft Engine Group",
            "model": "CF6-80E1A3",
            "type": "Turbo-fan"
        },
        "serial_number": "1300",
        "type": "Airplane",
        "type_designator": "A333"
    },
    "data_sources": [
        "mictronics",
        "nl-ilt-registry"
    ],
    "icao_hex": "484F73",
    "military": false,
    "registration": "PH-AKD"
}

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/nl-ilt-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_nl_ilt_registry_{name}/config for each of the three stats above.