npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@canboat/ts-pgns

v1.11.7

Published

TypeScript Canboat PGN Definitions

Readme

@canboat/ts-pgns

npm version Node.js CI & Test

A comprehensive TypeScript library providing strongly-typed NMEA 2000 Parameter Group Number (PGN) definitions and utilities for marine electronics communication.

Table of Contents

Overview

This library provides TypeScript definitions and utilities for working with NMEA 2000 Parameter Group Numbers (PGNs), which are standardized data messages used in marine electronics networks. Built on top of the Canboat project's PGN definitions, it offers type-safe access to hundreds of marine data message formats.

What are PGNs? Parameter Group Numbers are standardized message formats in the NMEA 2000 protocol that define how different types of marine data (GPS position, engine data, weather information, etc.) are structured and transmitted over the network.

Features

  • 🔒 Type Safety: Fully typed PGN classes with TypeScript interfaces
  • 📊 Comprehensive Coverage: Supports hundreds of standard NMEA 2000 PGNs
  • 🛠️ Utility Functions: Helper functions for PGN manipulation and conversion
  • 🔍 Enumeration Support: Built-in support for NMEA 2000 enumerations and bit fields
  • 🎯 Field Validation: Type-safe field access with proper validation
  • 📖 Well Documented: Comprehensive JSDoc documentation and examples
  • 🔄 Conversion Utilities: Convert between different PGN representations
  • ⚡ Performance Optimized: Efficient lookup and creation of PGN objects

Installation

npm install @canboat/ts-pgns

Quick Start

import { PGN_129029, PGN_127488 } from '@canboat/ts-pgns'
import { pgnToActisenseSerialFormat } from '@canboat/canboatjs'

// Create a GPS Position PGN (129029)
const gpsPosition = new PGN_129029({
  latitude: 47.6062, // Seattle latitude
  longitude: -122.3321, // Seattle longitude
  altitude: 56.0,
  gnssType: 3, // GPS
  method: 1, // GNSS fix
  integrity: 0, // No integrity checking
  numberOfSvs: 8, // 8 satellites
  hdop: 1.2, // Horizontal dilution of precision
  geoidalSeparation: -34.0
})

// Create an Engine Parameters PGN (127488)
const engineData = new PGN_127488({
  engineInstance: 0,
  oilPressure: 275000, // 275 kPa
  oilTemperature: 363.15, // 90°C in Kelvin
  temperature: 353.15, // 80°C coolant temp
  alternatorPotential: 14.2,
  fuelRate: 15.5, // L/h
  totalEngineHours: 1250.5,
  coolantPressure: 95000,
  fuelPressure: 280000
})

console.log(
  `GPS Position: ${gpsPosition.fields.latitude}, ${gpsPosition.fields.longitude}`
)
console.log(`Engine Oil Pressure: ${engineData.fields.oilPressure} Pa`)

//Generate actisense serial formated position
const n2k = pgnToActisenseSerialFormat(gpsPosition)
console.log(`actisense posistion ${n2k}`)

API Documentation

Complete API Documentation

Usage Examples

Working with PGN Definitions

import {
  getPGNWithNumber,
  getPGNWithId,
  findMatchingDefinition
} from '@canboat/ts-pgns'

// Get PGN definition by number
const windDefs = getPGNWithNumber(130306) // Wind Data
if (windDefs) {
  console.log(`Found ${windDefs.length} wind data variants`)
}

// Get specific PGN definition by ID
const gpsPosition = getPGNWithId('gnssPositionData')
if (gpsPosition) {
  console.log(`PGN Description: ${gpsPosition.Description}`)
  console.log(`Field count: ${gpsPosition.Fields.length}`)
}

Working with Enumerations

import {
  getEnumerationValue,
  getEnumerationName,
  getBitEnumerationValue
} from '@canboat/ts-pgns'

// Get numeric value for enumeration
const gnssType = getEnumerationValue('GNSS_TYPE', 'GPS')
console.log(`GPS type value: ${gnssType}`) // 3

// Get name from numeric value
const methodName = getEnumerationName('GNSS_METHOD', 1)
console.log(`Method: ${methodName}`) // "GNSS fix"

// Work with bit enumerations
const alertBit = getBitEnumerationValue('ENGINE_ALERT', 'Warning')

PGN Field Manipulation

import { mapCamelCaseKeys, mapNameKeysToCamelCase } from '@canboat/ts-pgns'

// Convert PGN field IDs to camelCase names
const pgn = new PGN_129029({
  /* ... */
})
const camelCasePgn = mapCamelCaseKeys(pgn)

// Now you can access fields by name instead of ID
console.log(camelCasePgn.fields.latitude) // instead of fields.latitude
console.log(camelCasePgn.fields.longitude) // instead of fields.longitude

Creating Group Function Messages

import {
  createNmeaGroupFunction,
  GroupFunction,
  SeatalkPilotMode16,
  PGN_65379_SeatalkPilotMode
} from '@canboat/ts-pgns'

const pgn = new PGN_65379_SeatalkPilotMode({
  pilotMode: SeatalkPilotMode16.TrackMode,
  subMode: 0xffff
})

// Create a command group function to change this data
const requestMsg = createNmeaGroupFunction(
  GroupFunction.Command,
  pgn,
  42 // destination address
)

PGN Classes

The library includes type-safe classes for hundreds of NMEA 2000 PGNs. Some commonly used ones include:

Navigation & Positioning

  • PGN_129029 - GNSS Position Data
  • PGN_129025 - Position, Rapid Update
  • PGN_129026 - COG & SOG, Rapid Update
  • PGN_127250 - Vessel Heading
  • PGN_130306 - Wind Data

Engine & Propulsion

  • PGN_127488 - Engine Parameters, Rapid Update
  • PGN_127489 - Engine Parameters, Dynamic
  • PGN_127505 - Fluid Level
  • PGN_130312 - Temperature

Electrical Systems

  • PGN_127508 - Battery Status
  • PGN_127506 - DC Detailed Status
  • PGN_127513 - Battery Configuration Status

Environmental

  • PGN_130310 - Environmental Parameters
  • PGN_130311 - Environmental Parameters
  • PGN_130316 - Temperature, Extended Range

Each PGN class provides:

  • Type-safe field access
  • Proper TypeScript interfaces
  • Built-in validation
  • Access to the underlying PGN definition

Utilities

Core Utilities

  • createPGN(id, fields, dst?) - Create PGN instances by ID
  • findMatchingDefinition(pgn) - Find the matching definition for a PGN
  • getPGNWithNumber(num) - Get PGN definitions by number
  • getPGNWithId(id) - Get PGN definition by ID

Field Conversion

  • mapCamelCaseKeys(pgn) - Convert field IDs to camelCase names
  • mapNameKeysToCamelCase(pgn) - Convert field names to camelCase IDs
  • isMatch(pgn, matchFields) - Check if PGN matches specific field values

Enumeration Helpers

  • getEnumeration(name) / getEnumerations() - Access enumerations
  • getEnumerationValue(enumName, value) - Get numeric value from name
  • getEnumerationName(enumName, value) - Get name from numeric value
  • getBitEnumeration(name) - Access bit enumerations
  • getBitEnumerationValue(enumName, value) - Get bit value from name

SignalK Server Integration

  • convertCamelCase(pluginApp, pgn) - Convert keys based on server capability
  • convertNamesToCamel(pluginApp, pgn) - Convert names based on server capability

Type Safety

This library provides comprehensive TypeScript support:

// Strongly typed fields
const gps = new PGN_129029({
  latitude: 47.6062, // number
  longitude: -122.3321, // number
  gnssType: 3, // number (enumeration)
  method: 1 // number (enumeration)
})

// TypeScript will catch field type errors
const badGps = new PGN_129029({
  latitude: 'invalid', // ❌ TypeScript error: string not assignable to number
  gnssType: 'GPS' // ❌ TypeScript error: string not assignable to number
})

// Proper enumeration usage
import { GnssType } from '@canboat/ts-pgns'
const correctGps = new PGN_129029({
  latitude: 47.6062,
  longitude: -122.3321,
  gnssType: GnssType.Gps, // ✅ Type-safe enumeration
  method: 1
})

Building from Source

# Clone the repository
git clone https://github.com/canboat/ts-pgns.git
cd ts-pgns

# Install dependencies
npm install

# Build the project
npm run build

# Generate the typescript files if you have changed canboat.json
npm run generate
npm run build

# Run tests
npm test

# Format code
npm run format

Contributing

We welcome contributions! Please see our Contributing Guidelines for details.

Development Workflow

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-feature
  3. Make your changes
  4. Run tests: npm test
  5. Run prettier and lint: npm run format
  6. Commit your changes: git commit -m 'Add amazing feature'
  7. Push to the branch: git push origin feature/amazing-feature
  8. Open a Pull Request

Version Policy

Important Note: This library is currently in active development. Minor releases may include breaking changes. Please pin to specific minor versions (e.g., 1.10.x) in your dependencies.

Once the API stabilizes, breaking changes will only be introduced in major releases.

{
  "dependencies": {
    "@canboat/ts-pgns": "~1.10.0" // Pin to minor version
  }
}

License

Licensed under the Apache License, Version 2.0. See LICENSE for details.

Related Projects


Made with ⚓ by the Canboat project contributors