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

@wz2b/node-red-modbus-dynamic-server

v0.1.3

Published

A Modbus TCP server for Node-RED that lets you write your own functions to handle requests.

Downloads

526

Readme

@wz2b/node-red-modbus-dynamic-server

Advanced Modbus server nodes for Node-RED

License

MIT © Christopher Piggott

Description

This package provides a set of Node-RED nodes for building flexible, general-purpose Modbus servers.

Unlike the server functionality in node-red-contrib-modbus, these nodes allow incoming Modbus requests to be intercepted before a response is sent. This makes it possible to examine, modify, filter, forward, or fulfill requests dynamically in a flow.

That enables use cases such as Modbus proxies, gateways, protocol conversion, request filtering, and other advanced server-side behaviors that are difficult or impossible with a conventional static register map.


Included Nodes

This package contains the following nodes:

Runtime nodes

Core request/response

  • modbus-dynamic-server
    Receives incoming Modbus requests from the server and emits them into a flow for dynamic handling.

  • modbus-dynamic-server-response
    Sends a dynamic response back to the waiting Modbus client request. See FUNCTIONS.md for function examples and data encoding patterns.

Routing and control

  • modbus-source-router
    Routes incoming Modbus requests to different flow outputs based on the client's source IP address.
    Rules are expressed as IPv4 CIDR blocks and evaluated top-to-bottom; the first matching rule wins.
    If no rule matches, a configurable Modbus exception response is sent and the message is not emitted.

  • modbus-fc-filter
    Allows or blocks requests by Modbus function code (payload.fc).
    Allowed requests continue unchanged; blocked requests are terminated with a configurable Modbus exception.

  • modbus-server-exception
    Convenience terminator node for custom reject paths.
    Sends a Modbus exception response for the current pending request and emits no output.

Data handling

  • modbus-registers-read
    Reads and decodes values from the shared register map and emits them as a normal flow message.

  • modbus-registers-write
    Writes values into a local register store.

  • modbus-registers-respond
    Responds to Modbus requests using values from the local register store.

Integration / proxy

  • modbus-dynamic-proxy
    Forwards requests dynamically to another Modbus target and returns the result.

Configuration nodes

  • modbus-dynamic-server-config
    Configures and owns the Modbus TCP server instance.

  • modbus-registers-config
    Defines local register storage used by register-based nodes.

  • modbus-proxy-target
    Defines a downstream Modbus target used for proxying or forwarding requests.


How the pieces fit together

A typical dynamic flow looks like this:

  1. A Modbus client sends a request to the configured server.
  2. modbus-dynamic-server emits a friendly request object into the flow.
  3. (Optional) modbus-source-router filters or routes the request based on the client's IP address.
  4. The flow decides what to do with the request:
    • answer from local registers
    • generate a value dynamically
    • forward to another Modbus device
    • reject or filter the request
  5. modbus-dynamic-server-response sends the final response back to the client.

This separation makes it possible to implement dynamic server-side logic entirely in Node-RED flows.


Message Contract

Messages emitted by modbus-dynamic-server include internal request context in msg._modbus.

This context is required by downstream nodes such as:

  • modbus-dynamic-server-response
  • modbus-source-router
  • modbus-fc-filter
  • modbus-server-exception
  • modbus-dynamic-proxy
  • modbus-registers-respond

These nodes use msg._modbus to send a response back to the original Modbus client request.

Flows must preserve this property. This is especially important when you use other nodes, including function nodes or custom nodes, to inspect requests, apply custom logic, transform payloads, or generate custom responses.

Preferred:

msg.payload = newValue;
return msg;

Also valid (safe alternative):

msg = { ...msg, payload: newValue }
return msg

Not allowed:

msg = { payload: newValue };
return msg;

If msg._modbus is missing, downstream response/termination nodes will be unable to complete the original Modbus request and will raise an error.

In general, modify the existing msg object rather than replacing it entirely.


Use Cases

Protocol Conversion

Requests can be intercepted, decoded, and translated into requests for another protocol. This is useful for protocol mediation and conversion involving systems such as OPC UA, BACnet, MQTT, Sparkplug, or custom APIs.

Modbus Gateway

These nodes can be used to build a Modbus server that answers some requests from a local register cache while forwarding other requests to external devices, including Modbus TCP or Modbus serial targets.

This makes it possible to build gateways, aggregators, and hybrid local/remote data services.

Security, Data Diode, and Request Filtering

These nodes can also be used to build a Modbus TCP gateway that inspects requests and applies filtering rules before allowing them to proceed.

For example, requests can be filtered based on client IP address, function code, unit ID, register address, or other request attributes. This makes it possible to implement read-only gateways, request whitelisting, and "data diode"-style patterns that prevent write operations or other side effects.


Getting Started

A minimal dynamic server setup usually includes:

  • one modbus-dynamic-server-config node
  • one modbus-dynamic-server node
  • one or more flow nodes such as function, switch, or change
  • one modbus-dynamic-server-response node

More advanced flows may also use:

  • modbus-source-router to split traffic by client IP before any processing logic
  • modbus-fc-filter to allow only selected function codes (for example, read-only gateways)
  • modbus-server-exception to terminate requests from custom switch/function logic
  • modbus-registers-read to expose cached register values to other flows or dashboards
  • modbus-registers-config with modbus-registers-write and modbus-registers-respond
  • modbus-proxy-target with modbus-dynamic-proxy

Examples

This package includes example flows in the examples/ directory. After installation, they should be available from the Node-RED import dialog under the examples list for this module.