round12: FritzBox-Merge-Bug vor Doppel-Ausloesung fixen, Scan-Meldungen entschaerfen, Dienstname-Fallback aus Hostname statt IP

This commit is contained in:
2026-07-22 23:01:01 +02:00
parent 54f224b650
commit 1f8218dff1
7 changed files with 129 additions and 20 deletions

View File

@@ -37,6 +37,27 @@ function isLikelyJunkTitle(title: string | undefined): boolean {
return false;
}
/** Prüft, ob ein String eine reine IPv4-Adresse ist (nicht als "Name" brauchbar). */
function isIpAddress(value: string): boolean {
return /^\d{1,3}(\.\d{1,3}){3}$/.test(value);
}
/**
* Macht aus einem technischen Hostnamen ("plug-shelly-heiz-links",
* "nas_synology-01") einen lesbaren Anzeigenamen ("Plug Shelly Heiz Links").
* Liefert null, wenn der Hostname selbst keine brauchbare Information trägt
* (leer oder reine IP) - dann bleibt nur der IP:Port-Fallback übrig.
*/
function humanizeHostname(hostname: string): string | null {
if (!hostname || isIpAddress(hostname)) return null;
const words = hostname
.replace(/\.(home|local|fritz\.box)$/i, "")
.split(/[-_.\s]+/)
.filter(Boolean);
if (words.length === 0) return null;
return words.map((w) => (w.length > 0 ? w[0].toUpperCase() + w.slice(1) : w)).join(" ");
}
export interface DeviceScanResult {
services: DiscoveredService[];
/**
@@ -87,7 +108,14 @@ export async function scanDeviceServices(
});
const titleIsJunk = isLikelyJunkTitle(probe.title);
const fallbackName = `${address}:${port}`;
// Kein brauchbarer Titel gefunden (z. B. weil eine SPA ihren echten Titel
// erst per JavaScript setzt, das der Scanner nicht ausführt) - dann lieber
// den bereits bekannten Gerätenamen ("plug-shelly-heiz-links" ->
// "Plug Shelly Heiz Links") als Name verwenden statt einer nichtssagenden
// IP:Port-Kombination. Nur wenn auch der Gerätename keine Information
// trägt (leer/reine IP, z. B. bei unbenannten Geräten), bleibt IP:Port
// als letzter Ausweg übrig.
const fallbackName = humanizeHostname(device.hostname) ?? `${address}:${port}`;
// Nur sichtbar, wenn Software erkannt wurde oder eine erfolgreiche Antwort
// (Status < 400) mit einem brauchbaren Titel vorliegt. Fehlerseiten und