signalk-sealink-cloud
v0.10.6
Published
Signal K to SeaLink.cloud — auto-discovery, offline queue, wind gusts, moon phases, and NMEA 2000 network health monitoring
Maintainers
Readme
signalk-sealink-cloud
Signal K server plugin that streams NMEA vessel data to SeaLink.cloud for remote monitoring.
Features
- Auto-discovery — common NMEA paths (wind, depth, temperature, batteries, solar) are mapped automatically with friendly names
- Unit conversion — converts Signal K SI units (m/s, Kelvin, radians) to nautical units (kts, degrees C, degrees)
- Wind gust tracking — calculates rolling max wind speed over 1-min, 5-min, 1-hr, 12-hr, and 24-hr windows (replaces signalk-gusts plugin)
- Moon data — computes moon phase, illumination, age, distance, and next full/new moon dates (replaces signalk-moon-plugin)
- Batched transmission — collects data points and sends them in configurable intervals (default: 30 seconds)
- Offline queue — failed batches are persisted to disk and retried when the connection returns; survives plugin restarts, bounded by count and age
- Position reporting — sends GPS position to the SeaLink.cloud Location endpoint
- Dynamic battery/solar — automatically discovers all battery banks and solar panels via wildcard patterns
- Custom mappings — map any Signal K data path to a SeaLink.cloud data key
- Per-path control — disable any individual path from being sent
Installation
In the Signal K server admin UI, go to Appstore and search for sealink-cloud, or install via npm:
npm install signalk-sealink-cloudConfiguration
- In Signal K admin UI, go to Server -> Plugin Config -> SeaLink.cloud
- Enter your Boat ID and Device Key (found in your SeaLink.cloud dashboard under Setup -> Device & API)
- Optionally configure:
- Send Interval — how often to send data (5-300 seconds, default 30)
- Send Position — enable/disable GPS position reporting
- Queue Data When Offline — persist failed batches to disk and retry when the connection returns (default: on)
- Max Queued Batches — maximum number of batches to hold on disk; oldest dropped first (default: 500 ≈ 4 hours at 30s interval)
- Max Queue Age (hours) — drop queued batches older than this (default: 48)
- Calculate Wind Gusts — enable/disable built-in gust calculation (default: on)
- Gust Wind Source Path — which wind path to use for gust calculation (default:
environment.wind.speedApparent) - Calculate Moon Data — enable/disable built-in moon calculations (default: on)
- Moon Calculation Interval — how often to recalculate moon data (5-1440 minutes, default 60)
- Use Default Mappings — auto-map common NMEA paths with unit conversion
- Custom Mappings — add your own Signal K path to SeaLink key mappings
- Disabled Paths — exclude specific Signal K paths from being sent
Default Mappings
| Signal K Path | SeaLink Key | Unit | |--------------|-------------|------| | environment.wind.speedApparent | wind.speed | kts | | environment.wind.speedTrue | wind.speedTrue | kts | | environment.wind.angleApparent | wind.angle | degrees | | environment.wind.directionTrue | wind.direction | degrees | | environment.water.temperature | water.temp | degrees C | | environment.depth.belowTransducer | depth | m | | environment.depth.belowSurface | depth.surface | m | | environment.depth.belowKeel | depth.keel | m | | environment.outside.temperature | environment.temp | degrees C | | environment.outside.pressure | environment.pressure | hPa | | environment.outside.humidity | environment.humidity | % | | navigation.speedOverGround | navigation.sog | kts | | navigation.headingTrue | navigation.hdg | degrees | | navigation.headingMagnetic | navigation.hdgMag | degrees | | navigation.courseOverGroundTrue | navigation.cog | degrees | | electrical.batteries..voltage | battery.{name}.voltage | V | | electrical.batteries..current | battery.{name}.current | A | | electrical.batteries..capacity.stateOfCharge | battery.{name}.soc | % | | electrical.batteries..capacity.timeRemaining | battery.{name}.timeLeft | h | | electrical.solar..panelPower | solar.{name}.power | W | | electrical.solar..panelCurrent | solar.{name}.current | A | | electrical.solar..panelVoltage | solar.{name}.voltage | V | | electrical.solar..yieldToday | solar.{name}.yield | Wh |
Wind Gust Data
When gust calculation is enabled, the plugin tracks the maximum apparent wind speed over rolling time windows and sends these additional data points:
| SeaLink Key | Description | |-------------|-------------| | wind.gust.1min | Max wind speed in the last 1 minute (kts) | | wind.gust.5min | Max wind speed in the last 5 minutes (kts) | | wind.gust.1hr | Max wind speed in the last 1 hour (kts) | | wind.gust.12hr | Max wind speed in the last 12 hours (kts) | | wind.gust.24hr | Max wind speed in the last 24 hours (kts) |
The wind source path is configurable — use environment.wind.speedApparent (default) or environment.wind.speedTrue.
Moon Data
When moon calculation is enabled, the plugin computes astronomical moon data and sends these additional data points:
| SeaLink Key | Description | |-------------|-------------| | moon.phase | Current moon phase (e.g. FullMoon, WaxingCrescent) | | moon.illumination | Moon illumination (%) | | moon.age | Moon age in days (0 to ~29.5) | | moon.distance | Distance from Earth to Moon (km) | | moon.nextFullMoon | Next full moon date (ISO 8601 UTC) | | moon.nextNewMoon | Next new moon date (ISO 8601 UTC) |
Moon data changes slowly, so the default calculation interval is 60 minutes.
Offline Queue
When the plugin can't reach SeaLink.cloud (connectivity loss, server downtime, timeout, etc.), failed batches are written to disk in the plugin's Signal K data directory under queue/ as one JSON file per batch. Writes are atomic — an interrupted write will never corrupt the queue.
On every send cycle, the plugin drains up to 10 queued batches (oldest first) before sending the current batch. If a drain send fails, the plugin assumes it's still offline and stops trying until the next cycle. When the connection returns, batches are replayed to the server in their original chronological order.
The queue is bounded by both count and age — whichever limit is hit first causes the oldest batches to be dropped. With the defaults (500 batches, 48 hours), a 30-second send interval gives you roughly 4 hours of uninterrupted offline capacity before the count limit takes effect.
The queue survives plugin restarts and Signal K server reboots. The current queue depth is shown in the plugin status line in the Signal K admin UI.
To disable the queue entirely (restoring the old drop-on-failure behavior), set Queue Data When Offline to off.
Custom Mappings
Add custom mappings in the plugin configuration to map any Signal K path:
{
"signalkPath": "tanks.freshWater.0.currentLevel",
"sealinkKey": "tank.freshwater.level",
"unit": "%"
}Note: custom mappings receive raw SI values (no unit conversion is applied by the plugin).
API Endpoints Used
POST /DataPoint/Ingest— batch data point ingestionPOST /Location/AddLocation— GPS position reporting
License
MIT
