Skip to content

Trinidad and Tobago ๐Ÿ‡น๐Ÿ‡น CAA Registry โ€‹

Namett-caa-registry
CountryTrinidad and Tobago
Registration prefix9Y-
Data sourcehttp://caa.gov.tt/aircraft-on-ttcaa-register/
FormatPDF (discovered via index page)
Run frequencyWeekly (pick a day/time โ€” see docker-compose.core.yaml)
Depends on Mictronics for ICAO hexYes โ€” this runner does not publish ICAO hex addresses; 9Y- registrations are resolved via RediSearch against Mictronics records (idx:aircraft:mictronics). Must run after the mictronics runner.

How it works โ€‹

The TTCAA index page is scraped for a link matching AIRCRAFT-ON-TTCAA-REGISTER*.pdf, then that PDF is downloaded and every page's table parsed with pdfplumber. The header row repeats on every page (an Excel-generated PDF artifact), so rows matching the header exactly are skipped rather than assuming the header only appears once. Registration marks are validated against ^9Y-[A-Z0-9]{2,6}$ โ€” a naive {2,4} suffix width would silently drop the register's government helicopters, which have a 5-character suffix (9Y-AG311 through 9Y-AG314).

This register has no separate owner column โ€” only NAME OF OPERATOR โ€” so that column fills the registrant-identity role directly, the same approach sg-caas-registry takes for its own operator-only source. MAKE & MODEL is a single combined free-text field with no reliable delimiter to split manufacturer from model (e.g. is "Augusta Westland" in Augusta Westland AW139 the make, or part of the model string?), so it's stored whole as aircraft.model, leaving aircraft.manufacturer unset โ€” matching bs-caa-registry's approach to the same situation. The address column is comma-split into registrant.street parts. Every written record explicitly sets military: false โ€” this register is exclusively civil.

Columns โ€‹

Source columnImportedNotes
REGISTRATIONโœ…9Y--prefix; used as the Mictronics lookup key
MAKE & MODELโœ…โ†’ aircraft.model (combined string, not split)
NAME OF OPERATORโœ…โ†’ registrant.names โ€” no separate owner column exists in this source
ADDRESS OF OPERATORโœ…โ†’ registrant.street, comma-split; may contain embedded newlines, collapsed to single space before splitting

See specs/data-dictionary.yaml (tt-caa-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 C6A1B2 | python3 -m json.tool --sort-keys --no-ensure-ascii
json
{
    "aircraft": {
        "manufacturer": "Leonardo",
        "manufacturer_model": "Leonardo AW139",
        "model": "Augusta Westland AW139",
        "type_designator": "AW139"
    },
    "data_sources": [
        "mictronics",
        "tt-caa-registry"
    ],
    "icao_hex": "C6A1B2",
    "military": false,
    "registrant": {
        "names": [
            "Bristow Caribbean Limited"
        ],
        "street": [
            "Hangar #4",
            "Piarco Intโ€™nal Airport",
            "Trinidad"
        ]
    },
    "registration": "9Y-ENT"
}

(type_designator, manufacturer, and manufacturer_model come from a Mictronics record on the same hex; model and registrant above are this runner's contribution โ€” note aircraft.model keeps the combined "Augusta Westland AW139" string, distinct from Mictronics' own cleaner manufacturer/manufacturer_model fields.)

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/tt-caa-registry/statistic/{name} (all retained):

Topic suffixValueFormat
records_importede.g. 50Integer as string
last_run_ate.g. 2026-08-08T22:08:56.301000+00:00ISO 8601 UTC
last_run_statusSuccess or FailureString

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