signalk-server
Version:
An implementation of a [Signal K](http://signalk.org) server for boats.
189 lines (142 loc) • 5.13 kB
Markdown
# Weather Provider Plugin Example
This example demonstrates how to create a WASM plugin that integrates with Signal K's **Weather Provider API**.
## What is a Weather Provider?
Signal K has a specialized Weather API that provides standardized endpoints for weather data:
```
GET /signalk/v2/api/weather/observations?lat=...&lon=...
GET /signalk/v2/api/weather/forecasts/daily?lat=...&lon=...
GET /signalk/v2/api/weather/forecasts/point?lat=...&lon=...
GET /signalk/v2/api/weather/warnings?lat=...&lon=...
GET /signalk/v2/api/weather/_providers
```
This is different from the **Resource Provider** pattern (used by `weather-plugin`), which provides generic key-value storage at `/signalk/v2/api/resources/{type}`.
## Features
- Registers as a Signal K Weather Provider
- Fetches real weather data from OpenWeatherMap API
- Implements all three Weather Provider methods:
- `getObservations()` - Current weather conditions
- `getForecasts()` - Daily and point-in-time forecasts
- `getWarnings()` - Weather warnings/alerts
- Also emits weather data as Signal K deltas
## Prerequisites
- Node.js 18+
- OpenWeatherMap API key (free tier works)
## Building
```bash
cd examples/wasm-plugins/example-weather-provider
npm install
npm run build
```
## Installation
**Note:** The AssemblyScript Plugin SDK is not yet published to npm. Install it first - see [example-hello-assemblyscript](../example-hello-assemblyscript/README.md#installing-to-signal-k) for instructions.
1. Build the plugin
2. Create installable package and install:
```bash
npm pack
cd ~/.signalk
npm install /path/to/signalk-example-weather-provider-0.1.0.tgz
```
3. Restart Signal K server
4. Configure with your OpenWeatherMap API key
## Configuration
Configure the plugin via the Signal K Admin UI under **Server → Plugin Config**. You will need to provide your OpenWeatherMap API key. Configuration options are documented in the plugin's schema.
## Testing
Once configured and running, test the Weather API:
```bash
# Get providers
curl http://localhost:3000/signalk/v2/api/weather/_providers
# Get observations
curl "http://localhost:3000/signalk/v2/api/weather/observations?lat=60.17&lon=24.94"
# Get daily forecast
curl "http://localhost:3000/signalk/v2/api/weather/forecasts/daily?lat=60.17&lon=24.94"
# Get point forecast
curl "http://localhost:3000/signalk/v2/api/weather/forecasts/point?lat=60.17&lon=24.94"
# Get warnings
curl "http://localhost:3000/signalk/v2/api/weather/warnings?lat=60.17&lon=24.94"
```
## Weather Provider vs Resource Provider
| Feature | Weather Provider | Resource Provider |
| ---------- | ------------------------------------------ | ---------------------------------- |
| API Path | `/signalk/v2/api/weather/*` | `/signalk/v2/api/resources/{type}` |
| Methods | getObservations, getForecasts, getWarnings | list, get, set, delete |
| Use Case | Standardized weather data | Generic data storage |
| Capability | `weatherProvider: true` | `resourceProvider: true` |
| FFI | `sk_register_weather_provider` | `sk_register_resource_provider` |
## Implementation Details
### Capability Declaration
In `package.json`:
```json
{
"wasmCapabilities": {
"weatherProvider": true,
"network": true
}
}
```
### Registration
In plugin `start()`:
```typescript
@external("env", "sk_register_weather_provider")
declare function sk_register_weather_provider(namePtr: usize, nameLen: usize): i32
// Register with provider name
registerWeatherProvider('OpenWeatherMap WASM')
```
### Handler Exports
The plugin must export these functions:
```typescript
// GET /signalk/v2/api/weather/observations
export function weather_get_observations(requestJson: string): string
// GET /signalk/v2/api/weather/forecasts/{type}
export function weather_get_forecasts(requestJson: string): string
// GET /signalk/v2/api/weather/warnings
export function weather_get_warnings(requestJson: string): string
```
### Request Format
```json
{
"position": {
"latitude": 60.17,
"longitude": 24.94
},
"type": "daily",
"options": {
"maxCount": 7
}
}
```
### Response Format (Observations/Forecasts)
```json
[
{
"date": "2025-12-05T10:00:00.000Z",
"type": "observation",
"description": "light rain",
"outside": {
"temperature": 275.15,
"relativeHumidity": 0.85,
"pressure": 101300,
"cloudCover": 0.75
},
"wind": {
"speedTrue": 5.2,
"directionTrue": 3.14
}
}
]
```
### Response Format (Warnings)
```json
[
{
"startTime": "2025-12-05T10:00:00.000Z",
"endTime": "2025-12-05T18:00:00.000Z",
"details": "Strong wind warning",
"source": "OpenWeatherMap",
"type": "Warning"
}
]
```
## See Also
- [example-weather-plugin](../example-weather-plugin/) - Resource Provider example
- [WASM Developer Guide](../../../docs/develop/plugins/wasm/README.md)
- [Signal K Weather API](https://signalk.org/specification/1.7.0/doc/weather.html)