Skip to main content

Async WebSocket client for the Homey Energy Dongle (DSMR smart meter data).

Project description

homey-energy-dongle-ws

PyPI version PyPI downloads Python CI License: MIT

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](https://pypi.org/project/dsmr-parser/) Telegram objects. The library is standalone (not Home Assistant–specific).

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

zeroconf is a core dependency so mDNS discovery works with a normal install.

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 sets ws_path to None (Athom: 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:

  1. Open the Homey app → your Energy Dongle → SettingsAdvanced Settings, then note the IP address which is listed.
  2. Connect with defaults **ws://<host>:80/ws** (or pass port / path if yours differ). For IPv6 literals, build_ws_url() and EnergyDongleClient.ws_url use 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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

homey_energy_dongle_ws-0.1.0.tar.gz (48.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

homey_energy_dongle_ws-0.1.0-py3-none-any.whl (14.6 kB view details)

Uploaded Python 3

File details

Details for the file homey_energy_dongle_ws-0.1.0.tar.gz.

File metadata

  • Download URL: homey_energy_dongle_ws-0.1.0.tar.gz
  • Upload date:
  • Size: 48.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for homey_energy_dongle_ws-0.1.0.tar.gz
Algorithm Hash digest
SHA256 b0a58b757ac45479a50608d231aaa470f153422ceaba4352503edb04d13052f3
MD5 50540e056b58001d68ad8ac8a6b635ea
BLAKE2b-256 337c81ce31969fdedf970962a884d1128838b17315fd7f6a94d6bdd3355c0d71

See more details on using hashes here.

File details

Details for the file homey_energy_dongle_ws-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for homey_energy_dongle_ws-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 54ef3bc9309fe0fdc02d1cfd3717db7cf1964ffa7b44f1fcdaecdadf470fa4b1
MD5 8789b78f7bff290b73ac34f74198660a
BLAKE2b-256 a34c307ae637e0a8b108b45f9e522f8fb038584f9a0ec83b1a92d712775b5446

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page