homey-energy-dongle-ws
Async Python client for the Homey Energy Dongle WebSocket API. It streams DSMR smart-meter data in three layers: raw WebSocket payloads, complete telegram strings, or parsed (dsmr-parser) telegram objects.
Prerequisites
- Python 3.11+
- A Homey Energy Dongle
- Enabling the local API on the Homey Energy Dongle in the Homey app. Please reference this knowledge base article
See Athom’s Homey Energy Dongle WebSocket example for more context.
Install
pip install homey-energy-dongle-ws
Or install from Git:
pip install git+https://github.com/Doekse/homey-energy-dongle-ws.git
Quick start (discovery first)
On the same LAN as the Energy Dongle, call **discover_energy_dongles()**, pick a result that has **ws_path** set when possible, then open **EnergyDongleClient** (or use **build_ws_url** with the chosen host, port, and path).
import asyncio
from homey_energy_dongle_ws import (
DiscoveredEnergyDongle,
EnergyDongleClient,
discover_energy_dongles,
)
async def main() -> None:
found: list[DiscoveredEnergyDongle] = await discover_energy_dongles(timeout_s=5.0)
if not found:
print("No Energy Dongles discovered; use manual connection (below).")
return
d = next((x for x in found if x.ws_path is not None), None)
if d is None:
print("No advertised WebSocket path (TXT p); enable Local API or use manual connection.")
return
async with EnergyDongleClient(d.host, port=d.port, path=d.ws_path) as client:
async for telegram in client.stream_parsed():
print(telegram)
break
asyncio.run(main())
TXT records (mDNS):
**p** — WebSocket path (e.g./ws). If missing, the library setsws_pathtoNone(WebSocket not advertised / Local API off).**v** — Version string (DiscoveredEnergyDongle.version). Full decoded TXT is in**DiscoveredEnergyDongle.txt**.
Firewall / network: the client host must allow mDNS (UDP 5353 inbound/outbound) and LAN traffic to the Energy Dongle. Routers, VLANs, VPNs, or “guest” Wi‑Fi often block multicast, use manual connection instead.
Manual connection (fallback)
Use this when discovery returns nothing, times out, **p** is missing and you know Local API should work, or you are not on the same L2 segment:
- Open the Homey app → your Energy Dongle → Settings → Advanced Settings, then note the IP address which is listed.
- Connect with defaults
**ws://<host>:80/ws** (or passport/pathif yours differ). For IPv6 literals,build_ws_url()andEnergyDongleClient.ws_urluse bracketed hosts (e.g.ws://[2001:db8::1]:80/ws) as required by the WebSocket URL syntax.
import asyncio
from homey_energy_dongle_ws import EnergyDongleClient
async def main() -> None:
async with EnergyDongleClient("192.168.x.x") as client:
async for telegram in client.stream_parsed():
print(telegram)
break
asyncio.run(main())
DSMR version
Parsing uses telegram_specification from [dsmr_parser.telegram_specifications](https://dsmr-parser.readthedocs.io/) (default: V5). If your meter uses another DSMR version, pass the matching spec to EnergyDongleClient(..., telegram_specification=...). A wrong spec typically causes parse errors, not silent wrong data.
For long-running processes, stream_parsed(skip_parse_errors=True) logs and skips a bad telegram instead of stopping the stream (default remains fail-fast).
Limits
The Energy Dongle allows at most two concurrent WebSocket clients. A third connection is rejected with close code 1008; this library raises **ConnectionLimitError**.
Troubleshooting
- Local API disabled in the app → the server closes with 1008 and this library raises
**LocalApiDisabledError** (check**close_code** /**close_reason** on**HomeyWebSocketError** subclasses for logging). - Connection limit →
**ConnectionLimitError** (1008).
For maintainers
Development setup, local checks, and pull requests: see CONTRIBUTING.md. Release history: CHANGELOG.md.
Metadata
Release files for homey-energy-dongle-ws 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| homey_energy_dongle_ws-0.2.0.tar.gz | 52.3 kB | With provenance | Details for homey_energy_dongle_ws-0.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| homey_energy_dongle_ws-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for homey_energy_dongle_ws-0.2.0-py3-none-any.whl |
Total release size: 67.4 kB
Release files / homey_energy_dongle_ws-0.2.0.tar.gz
| Download URL | homey_energy_dongle_ws-0.2.0.tar.gz |
|---|---|
| Size | 52.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
eabfe8ffdd2786308bb5e2fdc841ba0be8ab121608e403de88f46363f7de8c31
|
|
BLAKE2b-256 checksum How to use checksums |
d2eb9b2278aba15c5d3f831461aabd44bc38cc04205740f392d3b1b448f9276a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 11, 2026.
Transparency logRelease files / homey_energy_dongle_ws-0.2.0-py3-none-any.whl
| Download URL | homey_energy_dongle_ws-0.2.0-py3-none-any.whl |
|---|---|
| Size | 15.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
485238812e08279cd4cfec82e4245383d46878badbb945088f663fe4b051df42
|
|
BLAKE2b-256 checksum How to use checksums |
d68b089f16e40ab524904abb2e8ead3f8b7704a178b5da7f8aded2129c19d1bb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 11, 2026.
Transparency logSecurity for homey-energy-dongle-ws 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for homey_energy_dongle_ws-0.2.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 11, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.