51 lines
1.4 KiB
Python
51 lines
1.4 KiB
Python
"""Runs mDNS zeroconf service for Home Assistant discovery."""
|
|
|
|
import logging
|
|
import socket
|
|
from typing import Optional
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
try:
|
|
from zeroconf.asyncio import AsyncServiceInfo, AsyncZeroconf
|
|
except ImportError:
|
|
_LOGGER.fatal("zeroconf not installed. Please install it with: pip install zeroconf")
|
|
raise
|
|
|
|
MDNS_TARGET_IP = "224.0.0.251"
|
|
|
|
|
|
class HomeAssistantZeroconf:
|
|
def __init__(
|
|
self,
|
|
port: int,
|
|
mac_address: str,
|
|
host_ip_address: str,
|
|
name: Optional[str] = None,
|
|
) -> None:
|
|
self.port = port
|
|
self.mac_address = mac_address
|
|
self.name = name or self.mac_address
|
|
self.host_ip_address = host_ip_address
|
|
|
|
self._aiozc = AsyncZeroconf()
|
|
|
|
async def register_server(self) -> None:
|
|
|
|
service_info = AsyncServiceInfo(
|
|
"_esphomelib._tcp.local.",
|
|
f"{self.name}._esphomelib._tcp.local.",
|
|
addresses=[socket.inet_aton(self.host_ip_address)],
|
|
port=self.port,
|
|
properties={
|
|
"version": "2025.9.0",
|
|
"mac": self.mac_address,
|
|
"board": "host",
|
|
"platform": "HOST",
|
|
"network": "ethernet", # or "wifi"
|
|
},
|
|
server=f"{self.name}.local.",
|
|
)
|
|
await self._aiozc.async_register_service(service_info)
|
|
_LOGGER.debug("Zeroconf discovery enabled: %s", service_info)
|