signalk-first-mate
v0.1.1
Published
Send this boat's battery, tank, engine, depth and position readings to First Mate, the Bluewater Cruising app.
Maintainers
Readme
signalk-first-mate
Sends this boat's battery, tank, engine, depth and position readings from your Signal K server to First Mate, the Bluewater Cruising app.
🚩 In testing. Signal K upload is new and still being tried out with a few boats.
What you need
- A Signal K server on the boat with internet access. On a Victron Cerbo GX that means Venus OS Large firmware with Signal K switched on (Settings, Venus OS Large features). A Raspberry Pi running Signal K works the same way.
- A First Mate account with your boat set up.
Install
- Open your Signal K server in a browser: on a Cerbo that is
http://venus.local:3000. - Appstore, search First Mate, Install. Restart the server when it asks.
- In First Mate open Boat, then Connected apps, and make a key with only Signal K upload ticked. It starts with
fm1_and is shown once. Copy it. - Back in Signal K: Server, Plugin Config, First Mate. Paste the key, tick what you want to send, Submit.
The plugin status line on that page tells you what happened: Sent 6 readings at 14:02, or what to fix.
Engines and tanks
First Mate never guesses which engine or tank a reading belongs to. Before it will store engine or tank readings you match each one once, in First Mate: Boat, Latest telemetry, Record a reading, choose the engine or tank, and save the Signal K instance (propulsion.port, tanks.fuel.main). Until then the plugin keeps sending batteries, depth and position and shows which instances still need matching. It tries the parked ones again every 15 minutes.
Batteries, depth and position need no matching.
How much it sends
Every minute by default (10 seconds to an hour in settings), and only values that changed. A value that has not changed is sent again every 10 minutes so First Mate knows the boat is still talking. First Mate allows 6,000 stored readings per boat per hour; a boat with a few batteries and tanks uses a small fraction of that.
Lost internet is fine. Batches queue on the boat (up to 12 hours at the default rate) and go when the connection is back, each with the timestamp it was observed at.
What is sent, exactly
| Group | Signal K paths |
|---|---|
| Batteries | electrical.batteries.<id>.stateOfCharge, .voltage, .current, .temperature |
| Tanks | tanks.<type>.<id>.currentLevel, .capacity |
| Engines | propulsion.<id>.runTime, .revolutions, .temperature, .oilPressure |
| Depth | environment.depth.belowTransducer, .belowSurface, .belowKeel |
| Position | navigation.position (off by default) |
Nothing else leaves the boat. The key goes in one request header and is never written to a log or a status line.
Publishing (Bluewater Cruising)
This package is published from v2/packages/signalk-first-mate in the First Mate repository. Publishing to npm under the keyword signalk-node-server-plugin is what makes it appear in every Signal K Appstore; there is no separate store submission.
Releasing is a version bump and nothing else. Bump version in package.json, open a pull request, and merge it. .github/workflows/publish-signalk-plugin.yml runs the tests against the merge commit and publishes, and it does nothing at all when the version has not changed. Signal K servers then show an Update button.
⛔ Do not publish by hand, and do not put a token in an .npmrc here if you try. npm silently ignores an .npmrc inside a workspace package directory — it prints npm warn config ignoring workspace config, a warning rather than an error, drops the token, and then fails with EOTP, which reads as a two-factor problem and is not one. That cost an hour on 2026-09-19 and sent the search to the 2FA settings, which is the wrong place entirely. CI authenticates with npm trusted publishing instead: GitHub mints a short-lived OIDC credential and no long-lived token exists to leak or mistype.
⚠️ There is no provenance badge on this package and there will not be. npm attests only packages built from a public source repository, and First Mate's is private.
