---
title: Weather
source: https://infrared.city/docs/sdk/1.0/api/typescript/weather/
---

# Weather

<a id="catalog_ttl_ms"></a>

## CATALOG_TTL_MS

Import from `@infrared-city/infrared-sdk-ts`.

> `const` **CATALOG\_TTL\_MS**: `300000` = `300_000`

How long, in milliseconds, the catalog's "latest" pointer is trusted (5 minutes).

***

<a id="clearweathercatalogcache"></a>

## clearWeatherCatalogCache

Import from `@infrared-city/infrared-sdk-ts`, `@infrared-city/infrared-sdk-ts/utilities`.

> **clearWeatherCatalogCache**(): `void`

Forget all cached catalog data in this page, Worker or Node process.

### Returns

`void`

***

<a id="default_static_base_url"></a>

## DEFAULT_STATIC_BASE_URL

Import from `@infrared-city/infrared-sdk-ts`.

> `const` **DEFAULT\_STATIC\_BASE\_URL**: `"https://geo.infrared.city/weather"` = `"https://geo.infrared.city/weather"`

Root URL of the public weather catalog (`https://geo.infrared.city/weather`).

***

<a id="max_static_bytes"></a>

## MAX_STATIC_BYTES

Import from `@infrared-city/infrared-sdk-ts`.

> `const` **MAX\_STATIC\_BYTES**: `number`

Largest single catalog object the reader will download, in bytes (64 MiB).

***

<a id="parseepw"></a>

## parseEpw

Import from `@infrared-city/infrared-sdk-ts`.

> **parseEpw**(`text`, `options?`): [`WeatherDocument`](weather.md#weatherdocument)

Validates the text of an `.epw` weather file and returns its document.

You read the file yourself and pass its text (`await file.text()` in a
browser, `readFileSync(path, "utf8")` in Node), because this package also
runs where there is no file system.

### Parameters

| Parameter | Type | Description |
| ------ | ------ | ------ |
| `text` | `string` | The whole file. |
| `options` | [`ParseEpwOptions`](weather.md#parseepwoptions) | Optional lower limits on file size and row count. |

### Returns

[`WeatherDocument`](weather.md#weatherdocument)

The validated `WeatherDocument`.

### Throws

when `text` is not a string.

### Throws

when the file is not usable: no `LOCATION` header,
a location number out of range, sub-hourly data, a row shorter than 22
columns, an hour outside 1-24, a calendar cell that is not a number, or a
file over the size or row limit. The message names the row or the field.

***

<a id="parseepwoptions"></a>

## ParseEpwOptions

Import from `@infrared-city/infrared-sdk-ts`.

Limits for `parseEpw`. You can lower either limit; asking for a higher one
than the default is refused, not ignored.

### Properties

| Property | Modifier | Type | Description |
| ------ | ------ | ------ | ------ |
| <a id="parseepwoptions-maxbytes"></a> `maxBytes?` | `readonly` | `number` | The largest file accepted, in bytes. |
| <a id="parseepwoptions-maxrows"></a> `maxRows?` | `readonly` | `number` | The most data rows accepted. |

***

<a id="staticweatheroptions"></a>

## StaticWeatherOptions

Import from `@infrared-city/infrared-sdk-ts`, `@infrared-city/infrared-sdk-ts/utilities`.

Options for `StaticWeatherReader`, on top of the shared request options.

### Extends

- [`PublicRequestOptions`](geodata.md#publicrequestoptions)

### Properties

| Property | Modifier | Type | Description | Inherited from |
| ------ | ------ | ------ | ------ | ------ |
| <a id="staticweatheroptions-baseurl"></a> `baseUrl?` | `readonly` | `string` | Catalog root; defaults to [DEFAULT\_STATIC\_BASE\_URL](weather.md#default_static_base_url). | - |
| <a id="staticweatheroptions-catalogttlms"></a> `catalogTtlMs?` | `readonly` | `number` | Pointer refresh interval; defaults to [CATALOG\_TTL\_MS](weather.md#catalog_ttl_ms). | - |
| <a id="staticweatheroptions-fetch"></a> `fetch?` | `readonly` | \{(`input`, `init?`): `Promise`&lt;`Response`&gt;; (`input`, `init?`): `Promise`&lt;`Response`&gt;; \} | Custom `fetch` implementation; defaults to the runtime's global `fetch`. | [`PublicRequestOptions`](geodata.md#publicrequestoptions).[`fetch`](geodata.md#publicrequestoptions-fetch) |
| <a id="staticweatheroptions-logger"></a> `logger?` | `readonly` | [`Logger`](client.md#logger) | Where a transport retry reports itself. Defaults to the console. Pass `silentLogger` to keep a retry out of the output. | [`PublicRequestOptions`](geodata.md#publicrequestoptions).[`logger`](geodata.md#publicrequestoptions-logger) |
| <a id="staticweatheroptions-signal"></a> `signal?` | `readonly` | `AbortSignal` | Abort signal; aborting it ends the read with a `GeodataFetchError`. | [`PublicRequestOptions`](geodata.md#publicrequestoptions).[`signal`](geodata.md#publicrequestoptions-signal) |
| <a id="staticweatheroptions-stalltimeoutms"></a> `stallTimeoutMs?` | `readonly` | `number` | How long one attempt of a retried read may receive no data before it is aborted and asked again. Defaults to `STALL_TIMEOUT_MS`. | [`PublicRequestOptions`](geodata.md#publicrequestoptions).[`stallTimeoutMs`](geodata.md#publicrequestoptions-stalltimeoutms) |
| <a id="staticweatheroptions-timeoutms"></a> `timeoutMs?` | `readonly` | `number` | Total time for the answer and its body. Defaults to [DEFAULT\_PUBLIC\_TIMEOUT\_MS](geodata.md#default_public_timeout_ms). | [`PublicRequestOptions`](geodata.md#publicrequestoptions).[`timeoutMs`](geodata.md#publicrequestoptions-timeoutms) |

***

<a id="staticweatherreader"></a>

## StaticWeatherReader

Import from `@infrared-city/infrared-sdk-ts`, `@infrared-city/infrared-sdk-ts/utilities`.

Reads the public weather catalog, caching what it downloads per page, Worker or
Node process. `WeatherService` uses it for you.

### Constructors

<a id="staticweatherreader-constructor"></a>

#### Constructor

> **new StaticWeatherReader**(`options?`): `StaticWeatherReader`

Create a reader; every option is optional.

##### Parameters

| Parameter | Type |
| ------ | ------ |
| `options` | [`StaticWeatherOptions`](weather.md#staticweatheroptions) |

##### Returns

`StaticWeatherReader`

### Methods

<a id="staticweatherreader-filterhours"></a>

#### filterHours()

> **filterHours**(`identifier`, `timePeriodJson`): `Promise`&lt;`Record`&lt;`string`, `unknown`&gt;&gt;

A station's hourly arrays (under `weatherData`), filtered to a period given as JSON
text built from `TimeFilters`.

##### Parameters

| Parameter | Type |
| ------ | ------ |
| `identifier` | `string` |
| `timePeriodJson` | `string` |

##### Returns

`Promise`&lt;`Record`&lt;`string`, `unknown`&gt;&gt;

##### Throws

when the station is unknown, the catalog is unreadable or the
period is rejected.

***

<a id="staticweatherreader-neareststations"></a>

#### nearestStations()

> **nearestStations**(`lat`, `lon`, `radiusKm?`): `Promise`&lt;`Record`&lt;`string`, `unknown`&gt;\[\]&gt;

The nearest stations to a point (`lat`, `lon` in degrees), nearest first, at most
ten. `radiusKm` defaults to 100.

##### Parameters

| Parameter | Type |
| ------ | ------ |
| `lat` | `number` |
| `lon` | `number` |
| `radiusKm?` | `number` |

##### Returns

`Promise`&lt;`Record`&lt;`string`, `unknown`&gt;\[\]&gt;

##### Throws

when the catalog cannot be read or ranked.

***

<a id="staticweatherreader-stationbyidentifier"></a>

#### stationByIdentifier()

> **stationByIdentifier**(`identifier`): `Promise`&lt;`Record`&lt;`string`, `unknown`&gt;&gt;

One station's full document, found by `uuid` or `fileName`.

##### Parameters

| Parameter | Type |
| ------ | ------ |
| `identifier` | `string` |

##### Returns

`Promise`&lt;`Record`&lt;`string`, `unknown`&gt;&gt;

##### Throws

when the station is unknown (404) or the catalog is unreadable.

***

<a id="timefilters"></a>

## TimeFilters

Import from `@infrared-city/infrared-sdk-ts`, `@infrared-city/infrared-sdk-ts/utilities`.

The period to keep when filtering weather data.

The period is a span of dates with a daily hour range: from `1 March 08:00` to
`30 September 18:00` selects hours 08 to 18 of every day between those dates. The
end must not fall earlier in the year than the start.

### Properties

| Property | Modifier | Type | Description |
| ------ | ------ | ------ | ------ |
| <a id="timefilters-period"></a> `period` | `readonly` | `object` | The first and last point of the period, both inclusive. |
| `period.end` | `readonly` | [`TimePoint`](weather.md#timepoint) | - |
| `period.start` | `readonly` | [`TimePoint`](weather.md#timepoint) | - |

***

<a id="timepoint"></a>

## TimePoint

Import from `@infrared-city/infrared-sdk-ts`, `@infrared-city/infrared-sdk-ts/utilities`.

A month, day and hour of the year, with no year attached.

### Properties

| Property | Modifier | Type | Description |
| ------ | ------ | ------ | ------ |
| <a id="timepoint-day"></a> `day` | `readonly` | `number` | Day of the month, `1` up to the length of that month (`29` for February). |
| <a id="timepoint-hour"></a> `hour` | `readonly` | `number` | Hour of the day, `0` to `23`, in the weather file's local standard time. |
| <a id="timepoint-month"></a> `month` | `readonly` | `number` | Month, `1` to `12`. |

***

<a id="weather_bearing_analyses"></a>

## WEATHER_BEARING_ANALYSES

Import from `@infrared-city/infrared-sdk-ts`.

> `const` **WEATHER\_BEARING\_ANALYSES**: `ReadonlySet`&lt;`string`&gt;

The analyses that read weather data: `thermal-comfort-index`,
`thermal-comfort-statistics`, `solar-radiation` and `energy-balance`.

`energy-balance` also reads the request field `solar-model`: omitted or
`"legacy-flat"` it uses dry-bulb temperature and global horizontal
radiation, and `"irradiance"` adds the direct and diffuse series and needs
a full year. Wind, pedestrian wind comfort, sky view factors, daylight, sun
hours and daylight factor take no weather data.

***

<a id="weatherdatapoint"></a>

## WeatherDataPoint

Import from `@infrared-city/infrared-sdk-ts`, `@infrared-city/infrared-sdk-ts/utilities`.

> **WeatherDataPoint** = `Readonly`&lt;`Record`&lt;`string`, `unknown`&gt;&gt;

One hour of weather data: field name (such as `dryBulbTemperature` or
`windSpeed`) to value. Numeric fields are numbers, or `null` when missing.

***

<a id="weatherdocument"></a>

## WeatherDocument

Import from `@infrared-city/infrared-sdk-ts`.

One validated EPW file, as returned by `parseEpw`.

Build a request from it and keep it for any retry: its `identity` proves
that a resumed run uses the same weather as the run it resumes. The
identity is computed on every read, so editing `document` after submitting
makes a retry be refused instead of passing as unchanged weather.

### Constructors

<a id="weatherdocument-constructor"></a>

#### Constructor

> **new WeatherDocument**(`document`): `WeatherDocument`

##### Parameters

| Parameter | Type | Description |
| ------ | ------ | ------ |
| `document` | `Record`&lt;`string`, `unknown`&gt; | The validated document, as a JSON object. |

##### Returns

`WeatherDocument`

##### Throws

when `document` is not an object.

### Properties

<a id="weatherdocument-document"></a>

#### document

> `readonly` **document**: `Record`&lt;`string`, `unknown`&gt;

The validated document, as a JSON object.

### Accessors

<a id="weatherdocument-identity"></a>

#### identity

##### Get Signature

> **get** **identity**(): `string`

The versioned weather identity, `"sha256:<hex>"`.

It covers the validated values, their order, the location, the calendar
columns and the hour basis, but never the file name, a station id or the
raw text, so two differently formatted files with the same readings
share one identity.

###### Throws

when the document has no computable identity.

###### Returns

`string`

***

<a id="weatherdocument-location"></a>

#### location

##### Get Signature

> **get** **location**(): `Record`&lt;`string`, `unknown`&gt;

The EPW `LOCATION` header, as the document records it. Empty when the document has none.

###### Returns

`Record`&lt;`string`, `unknown`&gt;

***

<a id="weatherdocument-period"></a>

#### period

##### Get Signature

> **get** **period**(): `Record`&lt;`string`, `unknown`&gt;

Row count, records per hour, and whether the data is a leap year or a full year.

###### Returns

`Record`&lt;`string`, `unknown`&gt;

***

<a id="weatherdocument-rows"></a>

#### rows

##### Get Signature

> **get** **rows**(): `number`

Data rows in the file, before any window is applied.

###### Returns

`number`

### Methods

<a id="weatherdocument-filterhours"></a>

#### filterHours()

> **filterHours**(`filters`): `Readonly`&lt;`Record`&lt;`string`, `unknown`&gt;&gt;\[\]

The file's hours inside `filters`, one record per hour: the same shape
`WeatherService.filterWeatherData` returns for a public station, from a
local file and with no network call.

##### Parameters

| Parameter | Type | Description |
| ------ | ------ | ------ |
| `filters` | [`TimeFilters`](weather.md#timefilters) | The time window. |

##### Returns

`Readonly`&lt;`Record`&lt;`string`, `unknown`&gt;&gt;\[\]

One record per selected hour.

##### Throws

when the file cannot be filtered to that window.

***

<a id="weatherdocument-modelinputs"></a>

#### modelInputs()

> **modelInputs**(`request`): `Record`&lt;`string`, `number`\[\]&gt;

The snake_case arrays one analysis reads, for one time window.

The window is applied first, then the required fields are checked on the
selected rows and then the period rule. A gap outside the window is
harmless, a gap inside it is refused, and an analysis that needs a full
year refuses a shorter one. Every refusal happens before a request is
submitted, so nothing is billed.

`solarModel` applies to `analysisType: "energy-balance"` only; on any
other analysis it is refused. `"irradiance"` selects the irradiance input
set, which needs a full year; omitted, or `"legacy-flat"`, selects the
two climate arrays that model reads.

##### Parameters

| Parameter | Type | Description |
| ------ | ------ | ------ |
| `request` | [`WeatherModelRequest`](weather.md#weathermodelrequest) | The analysis, time window and options. |

##### Returns

`Record`&lt;`string`, `number`\[\]&gt;

The arrays, by field name.

##### Throws

when the document cannot serve the request.

***

<a id="weatherlocation"></a>

## WeatherLocation

Import from `@infrared-city/infrared-sdk-ts`, `@infrared-city/infrared-sdk-ts/utilities`.

A weather station in the public catalog.

### Indexable

> \[`key`: `string`\]: `unknown`

### Properties

| Property | Modifier | Type | Description |
| ------ | ------ | ------ | ------ |
| <a id="weatherlocation-filename"></a> `fileName` | `readonly` | `string` | The station's weather file name; also accepted as a station identifier. |
| <a id="weatherlocation-identifier"></a> `identifier` | `readonly` | `string` | The same value as `uuid`; accepted wherever a station identifier is. |
| <a id="weatherlocation-location_data"></a> `location_data` | `readonly` | [`WeatherLocationData`](weather.md#weatherlocationdata) | Where the station is. |
| <a id="weatherlocation-uuid"></a> `uuid` | `readonly` | `string` | The station's unique id. |

***

<a id="weatherlocationdata"></a>

## WeatherLocationData

Import from `@infrared-city/infrared-sdk-ts`, `@infrared-city/infrared-sdk-ts/utilities`.

Where a weather station is and what it is called.

### Indexable

> \[`key`: `string`\]: `unknown`

### Properties

| Property | Modifier | Type | Description |
| ------ | ------ | ------ | ------ |
| <a id="weatherlocationdata-city"></a> `city` | `readonly` | `string` | City the station is in. |
| <a id="weatherlocationdata-country"></a> `country` | `readonly` | `string` | Country. |
| <a id="weatherlocationdata-elevation"></a> `elevation` | `readonly` | `number` | Elevation, as recorded in the weather file. |
| <a id="weatherlocationdata-latitude"></a> `latitude` | `readonly` | `number` | Latitude, in degrees. |
| <a id="weatherlocationdata-longitude"></a> `longitude` | `readonly` | `number` | Longitude, in degrees. |
| <a id="weatherlocationdata-source"></a> `source` | `readonly` | `string` | The dataset the station comes from. |
| <a id="weatherlocationdata-state"></a> `state` | `readonly` | `string` | State or region. |
| <a id="weatherlocationdata-station_id"></a> `station_id` | `readonly` | `string` | The station's id in its source dataset. |
| <a id="weatherlocationdata-time_zone"></a> `time_zone` | `readonly` | `number` | Time zone, as recorded in the weather file. |
| <a id="weatherlocationdata-type"></a> `type` | `readonly` | `string` | The kind of weather file. |

***

<a id="weathermodelrequest"></a>

## WeatherModelRequest

Import from `@infrared-city/infrared-sdk-ts`.

What `WeatherDocument.modelInputs` is asked for.

### Properties

| Property | Modifier | Type | Description |
| ------ | ------ | ------ | ------ |
| <a id="weathermodelrequest-analysistype"></a> `analysisType` | `readonly` | `string` | The analysis the weather is for. |
| <a id="weathermodelrequest-solarmodel"></a> `solarModel?` | `readonly` | `string` | `"energy-balance"` only: `"irradiance"` or `"legacy-flat"` (the default). See `WEATHER_BEARING_ANALYSES`. |
| <a id="weathermodelrequest-subtype"></a> `subtype?` | `readonly` | `string` | The analysis subtype, for analyses that take one (such as `thermal-comfort-statistics`). |
| <a id="weathermodelrequest-timeperiod"></a> `timePeriod` | `readonly` | [`TimeFilters`](weather.md#timefilters) | The time window to select from the file. |

***

<a id="weatherservice"></a>

## WeatherService

Import from `@infrared-city/infrared-sdk-ts`, `@infrared-city/infrared-sdk-ts/utilities`.

Look up public weather stations, read their data and filter it to a period, or
validate your own `.epw` file.

Lookups read a public catalog and send no credentials. The authentication and
`baseUrl` of the options are not used; `fetch`, `timeoutMs` and `staticBaseUrl`
are.

### Constructors

<a id="weatherservice-constructor"></a>

#### Constructor

> **new WeatherService**(`options`): `WeatherService`

##### Parameters

| Parameter | Type | Description |
| ------ | ------ | ------ |
| `options` | [`WeatherServiceOptions`](weather.md#weatherserviceoptions) | Service options; `staticBaseUrl`, `fetch` and `timeoutMs` apply. |

##### Returns

`WeatherService`

### Methods

<a id="weatherservice-filterweatherdata"></a>

#### filterWeatherData()

> **filterWeatherData**(`source`, `filters`): `Promise`&lt;`Readonly`&lt;`Record`&lt;`string`, `unknown`&gt;&gt;\[\]&gt;

Hours inside the given period, one record per hour.

`source` is a public catalog station, given by `uuid` or by `fileName`, or a
`WeatherDocument` from `parseEpw`. A document is accepted everywhere a station id
is, is filtered locally and makes no request; the period means the same for both.

##### Parameters

| Parameter | Type | Description |
| ------ | ------ | ------ |
| `source` | `string` \| [`WeatherDocument`](weather.md#weatherdocument) | A station `uuid` or `fileName`, or a `WeatherDocument`. |
| `filters` | [`TimeFilters`](weather.md#timefilters) | The period to keep. |

##### Returns

`Promise`&lt;`Readonly`&lt;`Record`&lt;`string`, `unknown`&gt;&gt;\[\]&gt;

One record per hour inside the period; empty when nothing matches.

##### Throws

when the period is malformed (a month outside 1-12, an hour
outside 0-23, a day outside its month) or ends earlier in the year than it starts.

##### Throws

when the station is not in the public catalog or the
catalog cannot be read.

***

<a id="weatherservice-getweatherfilefromidentifier"></a>

#### getWeatherFileFromIdentifier()

> **getWeatherFileFromIdentifier**(`identifier`): `Promise`&lt;`Record`&lt;`string`, `unknown`&gt;&gt;

One station's full document, found by `uuid` or by `fileName`.

##### Parameters

| Parameter | Type | Description |
| ------ | ------ | ------ |
| `identifier` | `string` | The station's `uuid` or `fileName`. |

##### Returns

`Promise`&lt;`Record`&lt;`string`, `unknown`&gt;&gt;

The station's document, including its hourly data.

##### Throws

when the station is not in the public catalog (status
404) or the catalog cannot be read.

***

<a id="weatherservice-getweatherfilefromlocation"></a>

#### getWeatherFileFromLocation()

> **getWeatherFileFromLocation**(`lat`, `lon`, `radius?`): `Promise`&lt;[`WeatherLocation`](weather.md#weatherlocation)\[\]&gt;

The nearest catalog stations to a point.

At most ten stations come back, nearest first.

##### Parameters

| Parameter | Type | Description |
| ------ | ------ | ------ |
| `lat` | `number` | Latitude of the point, in degrees. |
| `lon` | `number` | Longitude of the point, in degrees. |
| `radius?` | `number` | Search radius in kilometres. Defaults to 100. |

##### Returns

`Promise`&lt;[`WeatherLocation`](weather.md#weatherlocation)\[\]&gt;

The stations within the radius, nearest first.

##### Throws

when the catalog cannot be read.

***

<a id="weatherservice-parseepw"></a>

#### parseEpw()

> **parseEpw**(`text`, `options?`): [`WeatherDocument`](weather.md#weatherdocument)

Read and validate the text of one local `.epw` file. This is the way to use your
own weather, and the only way for a file that is not in the public catalog.
Nothing is uploaded or registered, and no request leaves this process.

Keep the returned document for the retry: its `identity` is what proves a
resumed run uses the same weather.

##### Parameters

| Parameter | Type | Description |
| ------ | ------ | ------ |
| `text` | `string` | The contents of the `.epw` file. |
| `options?` | [`ParseEpwOptions`](weather.md#parseepwoptions) | Optional tighter limits on file size and row count. |

##### Returns

[`WeatherDocument`](weather.md#weatherdocument)

The validated weather document.

##### Throws

when the file is not a valid EPW file.

***

<a id="weatherserviceoptions"></a>

## WeatherServiceOptions

Import from `@infrared-city/infrared-sdk-ts`, `@infrared-city/infrared-sdk-ts/utilities`.

Options for `WeatherService`.

### Extends

- [`ServiceOptions`](client.md#serviceoptions)

### Properties

| Property | Modifier | Type | Description | Inherited from |
| ------ | ------ | ------ | ------ | ------ |
| <a id="weatherserviceoptions-auth"></a> `auth` | `readonly` | [`AuthResolver`](client.md#authresolver) | Supplies the authentication headers for each request. | [`ServiceOptions`](client.md#serviceoptions).[`auth`](client.md#serviceoptions-auth) |
| <a id="weatherserviceoptions-baseurl"></a> `baseUrl` | `readonly` | `string` \| `URL` | Base URL of the API the service calls. | [`ServiceOptions`](client.md#serviceoptions).[`baseUrl`](client.md#serviceoptions-baseurl) |
| <a id="weatherserviceoptions-fetch"></a> `fetch?` | `readonly` | \{(`input`, `init?`): `Promise`&lt;`Response`&gt;; (`input`, `init?`): `Promise`&lt;`Response`&gt;; \} | A `fetch` implementation to use instead of the global one. | [`ServiceOptions`](client.md#serviceoptions).[`fetch`](client.md#serviceoptions-fetch) |
| <a id="weatherserviceoptions-logger"></a> `logger?` | `readonly` | [`Logger`](client.md#logger) | Where the service's own messages, such as warnings, go. `InfraredClient` passes its `logger` here, so choosing `silentLogger` silences the SDK's warnings, and a Node caller can capture them. A service created on its own defaults to `consoleLogger`. | [`ServiceOptions`](client.md#serviceoptions).[`logger`](client.md#serviceoptions-logger) |
| <a id="weatherserviceoptions-staticbaseurl"></a> `staticBaseUrl?` | `readonly` | `string` | Root URL of the public weather catalog; defaults to `DEFAULT_STATIC_BASE_URL`. | - |
| <a id="weatherserviceoptions-timeoutms"></a> `timeoutMs?` | `readonly` | `number` | Time limit for one request, in milliseconds. | [`ServiceOptions`](client.md#serviceoptions).[`timeoutMs`](client.md#serviceoptions-timeoutms) |

***

<a id="weatherstationrow"></a>

## WeatherStationRow

Import from `@infrared-city/infrared-sdk-ts`, `@infrared-city/infrared-sdk-ts/utilities`.

One station in the weather catalog: its `uuid` and `fileName`, plus any other fields
the catalog row carries, such as its position.

### Extends

- `Readonly`&lt;`Record`&lt;`string`, `unknown`&gt;&gt;

### Indexable

> \[`key`: `string`\]: `unknown`

### Properties

| Property | Modifier | Type |
| ------ | ------ | ------ |
| <a id="weatherstationrow-filename"></a> `fileName` | `readonly` | `string` |
| <a id="weatherstationrow-uuid"></a> `uuid` | `readonly` | `string` |

***
