Share serial, USB, Modbus and EnOcean devices with several programs: ser2net, a Modbus proxy and an EnOcean proxy as a Home Assistant app.
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.
| Modbus device | Edit a connection |
|---|---|
![]() |
![]() |
| Trace | Import |
|---|---|
![]() |
![]() |
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.
- 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.yamlpreview. 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 3ser2net.conf, the options of the ha-modbusproxy app or a modbus-proxy file, with a preview. Or use your ownser2net.yamlas 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.
Requirement: Home Assistant OS. Device Proxy is an app and needs the Supervisor, it does not run on Home Assistant Container.
-
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. -
Install Device Proxy and start it. Home Assistant downloads a prebuilt image for amd64 or aarch64.
-
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:3333or a Modbus host and port. -
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.
- 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.
See device_proxy/CHANGELOG.md for release notes in German and English; Home Assistant shows them before an update.
python -m pip install -r requirements_test.txt
ruff check .
mypy
python -m pytestThe 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.
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.
The EnOcean part builds on the work of others:
- grimmpp (Philipp Grimm) for home-assistant-eltako, eltako14bus and esp2_gateway_adapter, the origin of the Eltako support.
eltako14busgoes back to Christian Amsüss and Energy Harvesting Solutions (2016–2020). - chrysn, Johannes Bosecker, Cedric Van Labeke and LHBL2003, who contributed to
home-assistant-eltako. - Kimmo Huoman (kipe/enocean, via the fork mak-gitdev/enocean) for the EnOcean protocol library.
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.
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.





