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 🙏

© 2026 – Pkg Stats / Ryan Hefner

node-red-contrib-clab-interfaces

v0.0.1

Published

Node-RED nodes for CompuLab IoT Gateway interfaces (IOT-GATE-iMX8, SBC-IOT-iMX8, IOT-GATE-RPi)

Readme

node-red-contrib-clab-interfaces

Node-RED nodes for CompuLab IoT Gateway hardware interfaces.

Node-RED License

Note: This is an independent open-source project and is not affiliated with, endorsed by, or sponsored by CompuLab Ltd.

Overview

This package provides Node-RED nodes to interact with the hardware interfaces of CompuLab IoT Gateways, including:

  • IOT-GATE-iMX8 / SBC-IOT-iMX8
  • IOT-GATE-IMX8PLUS / IOT-DIN-IMX8PLUS
  • IOT-LINK
  • IOT-GATE-RPi

Features

| Category | Node | Description | |----------|------|-------------| | GPIO | clab-gpio-in | Digital input (read GPIO pins) | | | clab-gpio-out | Digital output (set GPIO pins) | | Serial | clab-serial-in | Serial/RS485 receive | | | clab-serial-out | Serial/RS485 transmit | | CAN Bus | clab-can-in | CAN bus receive | | | clab-can-out | CAN bus transmit | | Analog | clab-analog-in | Analog input (4-20mA, 0-10V, PT100/PT1000) | | LED | clab-led | User LED control (on/off/blink) | | System | clab-system | System info, RTC, Watchdog, TPM, Power | | Bluetooth | clab-bluetooth | BT adapter control, scan, connect | | GPS | clab-gps | Position, satellites, distance calculation | | Cellular | clab-cellular | LTE modem info, connect, signal strength | | WiFi | clab-wifi | WiFi status, scan, connect, access point | | Ethernet | clab-ethernet | Interface status, DHCP/static IP config | | Network | clab-network | Ping, DNS, traceroute, port check, HTTP check |

Multiple Add-on Modules Support

CompuLab IoT Gateways support multiple stackable I/O add-on modules, allowing massive expansion of your gateway capabilities.

IOT-DIN-IMX8PLUS - Up to 8 Stackable Modules

The IOT-DIN-IMX8PLUS supports stacking up to 8 I/O expansion modules in positions A through H:

| Module Type | Max Stack | Description | Device Index Range | |------------|-----------|-------------|-------------------| | IFM-RS485 | 3 modules | 4x RS485 ports each | Up to 12 RS485 ports (3×4) | | IFM-RS232 | 3 modules | 4x RS232 ports each | Up to 12 RS232 ports (3×4) | | IFM-DI8O8 | 8 modules | 8 DI + 8 DO each | Up to 64 DI + 64 DO (8×8+8) | | IFM-ADC8 | 8 modules | 8x analog inputs each | Up to 64 analog channels (8×8) | | IFM-WB | 1 module | WiFi 6E + BT 5.3 | Single module only | | IFM-MESH | 3 modules | BT Mesh/Thread/Zigbee | Up to 3 mesh modules | | IFM-NVME | 1 module | NVMe SSD storage | Position A only |

Stacking Rules:

  • Maximum 8 modules total (positions A-H)
  • RS485/RS232/MESH: maximum 3 combined
  • IFM-NVME: must be in position A
  • Automatic detection and configuration

Other CompuLab Devices

| Device | Base I/O | Add-on Support | |--------|----------|----------------| | IOT-GATE-iMX8/IMX8PLUS | 4 DI + Backpanel RS485/RS232 | 2 Add-on modules | | IOT-LINK | 2x RS485 (FARS4/FBRS4) | 3 DIO base | | IOT-GATE-RPi | 4x RS485 ports | 8 IN/OUT |

How to Use Multiple Modules

Serial Ports - Up to 12 RS485 or RS232 Interfaces

Each serial port requires its own configuration node. With 3× IFM-RS485 modules:

// Module A (Position A) - 4 ports
Serial Config 1: /dev/ttyLP6  (or device-specific path)
Serial Config 2: /dev/ttyLP7
Serial Config 3: /dev/ttyLP8
Serial Config 4: /dev/ttyLP9

// Module B (Position B) - 4 ports
Serial Config 5: /dev/ttyLP10
Serial Config 6: /dev/ttyLP11
// ... up to 12 RS485 ports total

Analog Inputs - Up to 64 Channels (8 Modules × 8 Channels)

Use msg.deviceIndex and msg.channelIndex to access different modules:

// Module A, Channel 0-7
msg.deviceIndex = 0;
msg.channelIndex = 0; // to 7

// Module B, Channel 0-7
msg.deviceIndex = 1;
msg.channelIndex = 0; // to 7

// Module C, Channel 0-7
msg.deviceIndex = 2;
msg.channelIndex = 0; // to 7

// ... up to deviceIndex 7 (Module H)

Example: Scanning all 64 analog channels

// Flow context to track current position
var deviceIndex = context.get('deviceIndex') || 0;
var channelIndex = context.get('channelIndex') || 0;

// Set current channel
msg.deviceIndex = deviceIndex;
msg.channelIndex = channelIndex;

// Move to next channel
channelIndex++;
if (channelIndex >= 8) {
    channelIndex = 0;
    deviceIndex++;
    if (deviceIndex >= 8) {
        deviceIndex = 0; // Start over
    }
}

context.set('deviceIndex', deviceIndex);
context.set('channelIndex', channelIndex);

return msg;

Digital I/O - Up to 64 Inputs + 64 Outputs

With 8× IFM-DI8O8 modules, you can have massive I/O capacity:

// Module A: DI0-DI7, DO0-DO7
msg.pin = "DI0"; // First module, first input

// Module B: DI8-DI15, DO8-DO15
msg.pin = "DI8"; // Second module, first input

// ... up to DI63, DO63

CAN Bus - Multiple CAN Interfaces

Create separate configuration nodes for each CAN interface:

// CAN Config 1: can0 @ 500 kbit/s
// CAN Config 2: can1 @ 250 kbit/s

Real-World Use Case: Industrial Monitoring System

Example configuration with IOT-DIN-IMX8PLUS + 8× IFM-ADC8 + 3× IFM-RS485:

// ============================================
// Monitor 64 temperature sensors (PT100)
// via 8 ADC modules + Log data via 12 RS485 
// PLCs distributed across factory floor
// ============================================

// Flow 1: Read all 64 temperature sensors
var device = flow.get('currentDevice') || 0;
var channel = flow.get('currentChannel') || 0;

msg.deviceIndex = device;    // Module A-H (0-7)
msg.channelIndex = channel;  // Channel 0-7

// Round-robin through all channels
channel++;
if (channel >= 8) {
    channel = 0;
    device = (device + 1) % 8;
}
flow.set('currentDevice', device);
flow.set('currentChannel', channel);

// Flow 2: Send aggregated data to PLCs
// Each RS485 port connected to different PLC
// Port mapping handled by 12 separate serial-out nodes
msg.topic = `sensor_${device}_${channel}`;
msg.payload = {
    temperature: msg.payload,
    location: `Module-${device}-CH${channel}`
};

return msg;

Dynamic Module Selection via msg Properties

All nodes support dynamic configuration through message properties:

// Example: Switch between different analog channels
var channels = [0, 1, 2, 3, 4, 5, 6, 7];
var currentChannel = context.get('currentChannel') || 0;

msg.deviceIndex = 0;
msg.channelIndex = channels[currentChannel];

currentChannel = (currentChannel + 1) % channels.length;
context.set('currentChannel', currentChannel);

return msg;

Installation

Via Node-RED Palette Manager

  1. Open Node-RED
  2. Go to Menu → Manage Palette → Install
  3. Search for node-red-contrib-clab-interfaces
  4. Click Install

Via npm

cd ~/.node-red
npm install node-red-contrib-clab-interfaces

Via Docker

Use the provided Docker Compose setup:

git clone https://github.com/YOUR_USERNAME/node-red-contrib-clab-interfaces.git
cd node-red-contrib-clab-interfaces
docker-compose up -d

Quick Start

GPIO Example

[
    {
        "id": "gpio-in-example",
        "type": "clab-gpio-in",
        "name": "Button Input",
        "device": "IOT-GATE-iMX8",
        "pin": "DI0",
        "interval": 1000
    }
]

Serial RS485 Example

[
    {
        "id": "serial-out-example",
        "type": "clab-serial-out",
        "name": "Modbus TX",
        "port": "/dev/ttymxc2",
        "baudRate": 9600
    }
]

Node Documentation

clab-gpio-in / clab-gpio-out

Digital I/O for CompuLab devices.

Supported Devices:

  • IOT-GATE-iMX8: DI0-DI3, DO0-DO3
  • IOT-GATE-RPi: GPIO pins via gpiochip0
  • IOT-LINK: DI0-DI7, DO0-DO7

Input Properties:

  • device - Target device type
  • pin - GPIO pin name
  • interval - Polling interval (ms)

clab-serial-in / clab-serial-out

RS232/RS485 serial communication.

Configuration:

  • port - Serial device path
  • baudRate - Baud rate (9600, 19200, 38400, 57600, 115200)
  • dataBits - Data bits (7, 8)
  • stopBits - Stop bits (1, 2)
  • parity - Parity (none, even, odd)

clab-analog-in

Analog input for industrial sensors.

Input Types:

  • current - 4-20mA current loop
  • voltage - 0-10V or 0-5V voltage input
  • temperature - PT100/PT1000 RTD sensors

Output: | Field | Type | Description | |-------|------|-------------| | payload | number | Measured value (scaled if enabled) | | raw | number | Raw ADC value (e.g. 0-4095 for 12-bit) | | percent | number | Value as percentage (0-100%) | | valid | boolean | True if within expected range | | unit | string | Unit of the value | | currentMA | number | Current in mA (current type only) | | voltage | number | Voltage in V (voltage type only) | | celsius | number | Temperature in °C (temperature type only) |

Scaling Example:

A pressure sensor with 4-20mA output representing 0-10 bar:

  • Input Type: 4-20mA Current
  • Enable Scaling: ✓
  • Min: 0, Max: 10, Unit: bar

Output:

{
  "payload": 5.5,
  "raw": 2048,
  "currentMA": 12.8,
  "percent": 55,
  "scaled": 5.5,
  "unit": "bar",
  "valid": true
}

clab-can-in / clab-can-out

CAN bus communication.

Configuration:

  • interface - CAN interface (can0, can1)
  • bitrate - CAN bitrate (125000, 250000, 500000, 1000000)

clab-system

System functions with action selector:

| Action | Description | |--------|-------------| | info | System information (hostname, kernel, CPU, memory) | | uptime | System uptime | | temperature | CPU temperature | | rtc-read | Read hardware clock | | rtc-set | Set hardware clock | | rtc-sync | Sync RTC to system time | | watchdog-status | Watchdog status | | watchdog-enable | Enable watchdog | | watchdog-disable | Disable watchdog | | watchdog-kick | Reset watchdog timer | | tpm-status | TPM availability | | tpm-random | Generate random bytes via TPM | | reboot | System reboot | | shutdown | System shutdown |

clab-bluetooth

Bluetooth control with action selector:

| Action | Description | |--------|-------------| | status | Adapter info | | enable | Enable Bluetooth | | disable | Disable Bluetooth | | scan | Scan for devices | | devices | List known devices | | connect | Connect to device | | disconnect | Disconnect from device | | remove | Remove paired device |

clab-gps

GPS functions:

| Action | Description | |--------|-------------| | position | Current position (lat, lon, alt, speed) | | satellites | Satellite information | | distance | Calculate distance between two points | | start-gpsd | Start gpsd daemon | | stop-gpsd | Stop gpsd daemon |

clab-cellular

LTE/4G modem control:

| Action | Description | |--------|-------------| | status | Connection status | | info | Modem information (manufacturer, model, IMEI) | | sim | SIM card info (IMSI, ICCID) | | signal | Signal strength (RSRP, RSRQ, quality %) | | connect | Connect to network | | disconnect | Disconnect | | enable | Enable modem | | disable | Disable modem | | reset | Reset modem | | at-command | Send AT command |

clab-wifi

WiFi control:

| Action | Description | |--------|-------------| | status | WiFi status | | enable | Enable WiFi | | disable | Disable WiFi | | scan | Scan for networks | | connect | Connect to network | | disconnect | Disconnect | | saved | List saved connections | | delete | Delete saved connection | | ap-start | Start access point | | ap-stop | Stop access point |

clab-ethernet

Ethernet configuration:

| Action | Description | |--------|-------------| | status | Interface status (IP, MAC, speed) | | interfaces | List all interfaces | | statistics | RX/TX statistics | | enable | Enable interface | | disable | Disable interface | | dhcp | Enable DHCP | | static | Set static IP |

clab-network

Network diagnostics:

| Action | Description | |--------|-------------| | ping | Ping host | | dns | DNS lookup | | reverse-dns | Reverse DNS lookup | | traceroute | Trace route to host | | port-check | Check TCP port | | http-check | Check HTTP/HTTPS URL | | routes | Show routing table | | arp | Show ARP table | | speed-test | Simple download speed test |

Device Compatibility

| Feature | IOT-GATE-iMX8 | IOT-GATE-RPi | IOT-LINK | IOT-DIN-IMX8PLUS | |---------|:-------------:|:------------:|:--------:|:----------------:| | GPIO | ✅ | ✅ | ✅ | ✅ | | Serial RS232/485 | ✅ | ✅ | ✅ | ✅ | | CAN Bus | ✅ | ❌ | ✅ | ✅ | | Analog 4-20mA | ✅ | ❌ | ✅ | ✅ | | User LED | ✅ | ✅ | ✅ | ✅ | | RTC | ✅ | ✅ | ✅ | ✅ | | Watchdog | ✅ | ✅ | ✅ | ✅ | | TPM | ✅ | ❌ | ❌ | ✅ | | Bluetooth | ✅ | ✅ | ✅ | ✅ | | GPS | ✅ | ✅ | ✅ | ✅ | | LTE Modem | ✅ | ✅ | ✅ | ✅ | | WiFi | ✅ | ✅ | ✅ | ✅ |

Docker Setup

Uses the official Node-RED container with hardware mounts:

version: '3.8'

services:
  node-red:
    image: nodered/node-red:latest
    container_name: node-red-clab
    ports:
      - "1880:1880"
    volumes:
      - node-red-data:/data
      - ./:/data/node_modules/node-red-contrib-clab-interfaces:ro
      - /dev:/dev
      - /sys:/sys:ro
    privileged: true
    group_add:
      - dialout
      - gpio

Start:

docker-compose up -d

Install package in container:

docker exec -it node-red-clab npm install node-red-contrib-clab-interfaces
docker restart node-red-clab

Access: http://localhost:1880

Example Flows

Mount the demo flow to get started quickly:

volumes:
  - ./examples/compulab-demo-flow.json:/data/flows.json:ro

Or import manually in Node-RED: Menu → Import → Select examples/compulab-demo-flow.json

See examples/README.md for details.

Docker Networking Considerations

For full hardware access (especially network interfaces like Ethernet, WiFi, Bluetooth), consider using host network mode:

network_mode: host

Quick Start for WiFi:

Detailed documentation:

Development

Prerequisites

  • Node.js >= 14.0.0
  • Node-RED >= 2.0.0

Setup

git clone https://github.com/YOUR_USERNAME/node-red-contrib-clab-interfaces.git
cd node-red-contrib-clab-interfaces
npm install

Testing

npm test

Project Structure

node-red-contrib-clab-interfaces/
├── nodes/              # Node-RED node definitions
│   ├── clab-gpio.js
│   ├── clab-gpio.html
│   ├── clab-serial.js
│   ├── ...
│   └── icons/
│       └── clab.svg
├── lib/                # Helper libraries
│   ├── gpio-helper.js
│   ├── serial-helper.js
│   ├── can-helper.js
│   ├── system-helper.js
│   ├── bluetooth-helper.js
│   ├── gps-helper.js
│   ├── cellular-helper.js
│   ├── wifi-helper.js
│   ├── ethernet-helper.js
│   ├── network-helper.js
│   └── analog-helper.js
├── test/               # Unit tests
├── examples/           # Example flows
├── docker-compose.yml
├── Dockerfile
└── package.json

API Reference

See API.md for detailed API documentation.

Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

MIT License - see LICENSE for details.

Resources

Disclaimer

This project is not affiliated with, endorsed by, or sponsored by CompuLab Ltd. CompuLab and related product names are trademarks of CompuLab Ltd.

Support

For issues and feature requests, please use the GitHub Issues page.