Add files via upload

main 0.7.2
nero150 2026-03-18 11:11:42 +01:00 committed by GitHub
parent 84a7d007bb
commit 1d4c2c0f7b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 34 additions and 9 deletions

View File

@ -100,22 +100,38 @@ async def _test_connection(host: str, port: int, timeout: float = 5.0) -> str |
return "unknown"
async def _scan_network(port: int, timeout: float = 0.5) -> list[str]:
async def _scan_network(port: int, timeout: float = 1.0) -> list[str]:
"""
Scan the local network for open TCP port (default 8899).
Scan the local network for open TCP port.
Returns list of IP addresses that responded.
"""
# Determine local subnet from hostname
# Get real local IP by connecting to a public address (no data sent)
local_ip = "192.168.1.1"
try:
local_ip = socket.gethostbyname(socket.gethostname())
except OSError:
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.settimeout(0)
s.connect(("8.8.8.8", 80))
local_ip = s.getsockname()[0]
except Exception:
try:
local_ip = socket.gethostbyname(socket.gethostname())
except Exception:
pass
_LOGGER.debug("XT211 scan: local IP detected as %s", local_ip)
# Fallback if we still got loopback
if local_ip.startswith("127.") or local_ip == "0.0.0.0":
local_ip = "192.168.1.1"
_LOGGER.warning("XT211 scan: loopback detected, falling back to %s", local_ip)
try:
network = IPv4Network(f"{local_ip}/24", strict=False)
except ValueError:
network = IPv4Network("192.168.1.0/24", strict=False)
_LOGGER.debug("XT211 scan: scanning %s on port %d", network, port)
found: list[str] = []
async def _probe(ip: str) -> None:
@ -125,14 +141,23 @@ async def _scan_network(port: int, timeout: float = 0.5) -> list[str]:
timeout=timeout,
)
writer.close()
await writer.wait_closed()
try:
await writer.wait_closed()
except Exception:
pass
found.append(ip)
_LOGGER.debug("XT211 scan: found device at %s:%d", ip, port)
except Exception:
pass
# Probe all hosts in /24 concurrently (skip network and broadcast)
# Probe all hosts in /24 concurrently
hosts = [str(h) for h in network.hosts()]
await asyncio.gather(*[_probe(ip) for ip in hosts])
# Split into batches to avoid overwhelming the network stack
batch_size = 50
for i in range(0, len(hosts), batch_size):
batch = hosts[i:i + batch_size]
await asyncio.gather(*[_probe(ip) for ip in batch])
return sorted(found)

View File

@ -1,7 +1,7 @@
{
"domain": "xt211_han",
"name": "XT211 HAN (RS485 via Ethernet)",
"version": "0.7.1",
"version": "0.7.2",
"documentation": "https://github.com/nero150/xt211-han-ha",
"issue_tracker": "https://github.com/nero150/xt211-han-ha/issues",
"dependencies": [],