Skip to content

Commit b05ea25

Browse files
authored
Merge pull request #45 from OHF-Voice/synesthesiam-20251010-zeroconf
Fix ZeroConf
2 parents 132828f + 6cc870c commit b05ea25

File tree

3 files changed

+45
-17
lines changed

3 files changed

+45
-17
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## 1.8.0
4+
5+
- Fix ZeroConf
6+
37
## 1.7.2
48

59
- Fix event data being `None`

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "wyoming"
3-
version = "1.7.2"
3+
version = "1.8.0"
44
description = "Peer-to-peer protocol for voice assistants"
55
readme = "README.md"
66
requires-python = ">=3.8"

wyoming/zeroconf.py

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
#!/usr/bin/env python3
21
"""Runs mDNS zeroconf service for Home Assistant discovery."""
2+
33
import logging
44
import socket
5+
import uuid
56
from typing import Optional
67

78
_LOGGER = logging.getLogger(__name__)
@@ -15,21 +16,44 @@
1516
MDNS_TARGET_IP = "224.0.0.251"
1617

1718

18-
async def register_server(name: str, port: int, host: Optional[str] = None) -> None:
19-
if not host:
20-
test_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
21-
test_sock.setblocking(False)
22-
test_sock.connect((MDNS_TARGET_IP, 1))
23-
host = test_sock.getsockname()[0]
24-
_LOGGER.debug("Detected IP: %s", host)
19+
class HomeAssistantZeroconf:
20+
"""ZeroConf (mDNS) discovery for Home Assistant."""
21+
22+
def __init__(
23+
self, port: int, name: Optional[str] = None, host: Optional[str] = None
24+
) -> None:
25+
self.port = port
26+
self.name = name or _get_mac_address()
27+
28+
if not host:
29+
test_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
30+
test_sock.setblocking(False)
31+
test_sock.connect((MDNS_TARGET_IP, 1))
32+
host = test_sock.getsockname()[0]
33+
_LOGGER.debug("Detected IP: %s", host)
34+
35+
assert host
36+
self.host = host
37+
self._aiozc = AsyncZeroconf()
38+
39+
async def register_server(self) -> None:
40+
"""Register ZeroConf server."""
41+
42+
service_info = AsyncServiceInfo(
43+
"_wyoming._tcp.local.",
44+
f"{self.name}._wyoming._tcp.local.",
45+
addresses=[socket.inet_aton(self.host)],
46+
port=self.port,
47+
)
48+
await self._aiozc.async_register_service(service_info)
49+
_LOGGER.debug("Zeroconf discovery enabled: %s", service_info)
2550

26-
assert host
2751

28-
service_info = AsyncServiceInfo(
29-
"_wyoming._tcp.local.",
30-
f"{name}._wyoming._tcp.local.",
31-
addresses=[socket.inet_aton(host)],
32-
port=port,
52+
def _get_mac_address() -> str:
53+
"""Return MAC address formatted as hex with no colons."""
54+
return "".join(
55+
# pylint: disable=consider-using-f-string
56+
["{:02x}".format((uuid.getnode() >> ele) & 0xFF) for ele in range(0, 8 * 6, 8)][
57+
::-1
58+
]
3359
)
34-
aiozc = AsyncZeroconf()
35-
await aiozc.async_register_service(service_info)

0 commit comments

Comments
 (0)