Skip to content

About

Home Assistant app that shares serial/USB, Modbus TCP/RTU and EnOcean devices with several programs at once: ser2net 4, Modbus and EnOcean proxy, set up in a web interface

Topics

Resources

Security policy

Stars

6 stars

Watchers

0 watching

Forks

Repository files navigation

Device Proxy

Device Proxy

Share serial, USB, Modbus and EnOcean devices with several programs: ser2net, a Modbus proxy and an EnOcean proxy as a Home Assistant app.

Home Assistant App Version Architectures CI License

Buy Me a Coffee Ko-fi PayPal

Deutsche Version

Device Proxy is a Home Assistant app (formerly add-on) that makes a device usable by several programs at once. Serial and USB devices (smart meter reading heads, Z-Wave or Zigbee sticks, RS232 devices) are shared over TCP with ser2net 4. Modbus devices (Modbus TCP, Modbus RTU on RS485, RTU over TCP) are shared with several Modbus TCP clients through the app's own Modbus proxy. EnOcean gateways (FAM-USB, FAM14, FGW14-USB, USB300, MGW-ETH, Symcon LAN …) are shared through its own EnOcean proxy, with replay for Home Assistant restarts.

Everything is set up in a web interface in the sidebar: no YAML, no command line. The app's Configuration tab in the Supervisor stays empty on purpose; everything is in the sidebar entry Device Proxy. Status, live data, traces and events show what is happening on the line.

Screenshots

Connections overview

Modbus device Edit a connection
Modbus device Edit a connection
Trace Import
Trace Import

EnOcean gateway

Why Device Proxy?

Many devices accept only one connection: a USB reading head on the smart meter, a Z-Wave stick, an inverter's Modbus TCP port, an RS485 bus. As soon as a second program wants the data (a second Home Assistant, evcc, an energy manager, a diagnostic tool), they get in each other's way or one of them loses.

Device Proxy sits in between. It holds the device and lets several clients use it, in turn where the protocol needs it, and shows who is connected and whether data flows. Configuration that used to live in a ser2net.yaml or in the options of separate apps is in one place.

Highlights

  • Connections in a web interface: device from a list with stable names, templates (smart meter SML or D0, Z-Wave or Zigbee stick, Modbus), all important ser2net options and a live ser2net.yaml preview. Saving rebuilds only that connection; the others keep their clients.
  • Modbus proxy: one Modbus device or RS485 bus for several Modbus TCP clients. Requests go to the device one after another and each answer back to the client that asked; timeouts, retries and pauses are adjustable, with starting values for common inverters. Writes only from Home Assistant and apps by default, and limited to certain registers per client if you like, a cache for reads, a bus scan, a register reader that turns a register into a Home Assistant entity without YAML, and an access check that tells whether a client may read or write and which rule decides. It can also only listen on an RS485 bus that has a master already and serve what it hears.
  • EnOcean gateways: one FAM-USB, FAM14, FGW14-USB, USB300, MGW-ETH or Symcon LAN for the EnOcean Eltako integration, eo_man and PCT14 at once. Whole frames in turn, answers to the program that asked, telegrams missed during a Home Assistant restart replayed with their reception time, discovery by the integration with the gateway's model. Live frames with sender and kind, a list of senders with names of your own and a CSV export, air time against the 1 % limit, gateway test, changing the base ID (with the changes left), sending a checked frame, captures with a lock for PCT14. A second gateway with the same base ID can stand in when one fails, without the programs reconnecting. Replaces the EnOcean Proxy app.
  • Status at a glance: device present, clients with address and bytes, data rate, last data, line errors from the driver, Modbus requests and answer times; clients that stop reading are spotted.
  • Live data and traces without taking a client place, decoded for Modbus; recording to rotating files without disconnecting anyone.
  • Smart meter tools: SML (with CRC check) and D0 decoded, baud rate detection.
  • Backup and restore of the whole configuration as one file (Settings → Back up and transfer), and import and export: ser2net 4 ser2net.yaml, ser2net 3 ser2net.conf, the options of the ha-modbusproxy app or a modbus-proxy file, with a preview. Or use your own ser2net.yaml as it is.
  • When a device hangs: restart a connection, reset its USB adapter or cut its power through a switch in Home Assistant; by hand, from Home Assistant or automatically when no data comes.
  • Before and after saving: the form and the questions name the running connections a change sets up again or stops and how many clients that disconnects; when a connection that worked stops after a change, one click restores the version before.
  • Events and history (30 days, drops and availability), configuration history with differences and restore.
  • Notifications in Home Assistant, optionally to a phone, and entities over MQTT discovery: one device per connection with its state and a switch.
  • German and English, light and dark (following Home Assistant's theme), phone width.

Quick start

Requirement: Home Assistant OS. Device Proxy is an app and needs the Supervisor, it does not run on Home Assistant Container.

  1. Add this repository to Home Assistant with the button below, or under Settings → Apps → App store → ⋮ → Repositories with https://github.com/bertel2020/HA-Device-Proxy.

    Add the repository to My Home Assistant

  2. Install Device Proxy and start it. Home Assistant downloads a prebuilt image for amd64 or aarch64.

  3. Open Device Proxy in the sidebar and add a connection: pick the device and a template, save. Details → Addresses shows the address to enter in the integration, for example tcp://127.0.0.1:3333 or a Modbus host and port.

  4. Coming from ser2net or ha-modbusproxy? Settings → Back up and transfer → Import takes over the existing configuration with a preview.

Every page, every setting and help when something does not work: documentation (also shown in Home Assistant on the app's Documentation tab); in German: Anleitung.

Safety in short

  • The ports are plain TCP without a login. By default clients are accepted from Home Assistant, its apps and the host's own network ("My network"); the Z-Wave and Zigbee templates limit them to Home Assistant and its apps. Under Settings → Network this can be narrowed to Home Assistant (and apps) only, and further home networks can be listed.
  • Modbus connections let only Home Assistant and the apps write by default; other clients can only read. The connection's page shows who may really write, and Tools → Check access tells it for any address. The allowed clients of every kind follow the network setting unless a connection names its own.
  • ser2net's admin interface is reachable from inside the app only; the web interface is reached through Home Assistant (Ingress).
  • A computer that connects for the first time is reported. Under Settings → Clients it gets a name or is blocked from every connection.
  • Diagnostics leave out IP addresses, host names, the MQTT login and personal names.
  • Found a security problem? Please report it privately, see SECURITY.md.

Changelog

See device_proxy/CHANGELOG.md for release notes in German and English; Home Assistant shows them before an update.

Development

python -m pip install -r requirements_test.txt
ruff check .
mypy
python -m pytest

The web interface is built from panel-src/ (npm ci && node build.mjs there); tools/dev_server.py runs it on a desktop with example connections, and with --replay file.json plays back a test case downloaded from a connection's live data. tools/screenshots.mjs renders the screenshots above, tools/render_images.py draws icon.png and logo.png. tools/soak_test.py (Modbus) and tools/soak_enocean.py (EnOcean with a fallback) run the proxies for minutes under load and faults and check fixed limits; tests/HARDWARE.md lists the checks that need real devices.

Translations

Each language is one file, device_proxy/app/device_proxy/locales/<code>.json, with the web interface, notifications and Home Assistant entity names. To add a language, copy en.json to a file named with its two-letter code (e.g. fr.json), set name and translate the values; keys and {placeholders} stay as they are. Whatever is left out appears in English. Then run node build.mjs in panel-src/, and the language shows up in both language pickers. The section errors translates the app's English error messages by pattern; see de.json.

Thanks

The EnOcean part builds on the work of others:

Disclaimer

Device Proxy is a privately developed, free open-source project and is provided without warranty or guarantee. Use is at your own risk; in particular, no guarantee can be given for error-free operation, for the availability of the shared devices or for the correctness of the data passed through. Device Proxy passes data and commands from clients to your devices, including writes to Modbus devices such as inverters or heat pumps. Check who may connect and write before you share a device on the network.

License

This project is released under the MIT License. Copyright 2026 Roberto / bertel2020. ser2net and gensio (both GPL-2.0, see their repositories) are built from their releases into the image.

About

Home Assistant app that shares serial/USB, Modbus TCP/RTU and EnOcean devices with several programs at once: ser2net 4, Modbus and EnOcean proxy, set up in a web interface

Topics

Resources

Security policy

Stars

6 stars

Watchers

0 watching

Forks

Packages

Contributors

Languages