Auswertung: Ruhezustand von Funkloch trennen -- und der Sideboard-Gang

Ein iPhone mit gesperrtem Display beantwortet ICMP nicht. In der Verlustspalte
sieht das exakt aus wie ein Funkloch, und heute haette es fast zu einem falschen
Befund gefuehrt: 58 Sekunden Ping-Luecke auf der Terrasse -- bei -53 dBm, 275 Mbps
PHY-Rate und weiterlaufenden 3 kbit/s Hintergrundverkehr. Das Geraet war
erreichbar, es wollte nur nicht antworten.

Die Auswertung markiert solche Luecken jetzt (gutes Durchschnittssignal plus hohe
PHY-Rate) und sagt dazu, dass sie NICHT als Funkloch zu lesen sind. Bewertet wird
der Durchschnitt des Abschnitts, nicht sein Minimum -- ein einzelner schwacher
Sample beim Durchgehen darf den Befund nicht kippen.

Dazu die Rohdaten des Gangs mit ap1 am Sideboard.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-21 20:49:49 +02:00
parent dc639b0a55
commit 31d1253fbe
4 changed files with 8939 additions and 1 deletions

View File

@@ -91,15 +91,28 @@ def main():
verloren += miss
luecke = max(luecke, miss * 0.2)
gesamt = (p[-1][1] - p[0][1] + 1) if len(p) > 1 else 0
# 🔴 Ruhezustand von Funkloch trennen. Ein iPhone mit gesperrtem Display
# beantwortet ICMP nicht — das sieht in der Verlustspalte aus wie ein Funkloch.
# Unterscheidbar ist es am Funk: bleibt das Signal gut UND die PHY-Rate hoch,
# war das Geraet erreichbar und wollte nur nicht antworten.
# (Am 2026-08-21 auf der Terrasse: 58 s Ping-Luecke bei -53 dBm und 275 Mbps.)
sig = [int(x["sta_signal"]) for x in r]
raten = [int(x["sta_tx_rate"] or 0) for x in r if x.get("sta_tx_rate")]
# Bewertet wird der DURCHSCHNITT des Abschnitts, nicht sein Minimum: ein
# einzelner schwacher Sample beim Durchgehen darf den Befund nicht kippen.
schlaefrig = (luecke >= 3 and sig and (sum(sig) / len(sig)) > -68
and raten and (sum(raten) / len(raten)) > 100e6)
ifaces = sorted({AP.get(x["sta_iface"], x["sta_iface"]) for x in r if x["sta_iface"]})
print("%-16s %5ds %-24s %-18s %s" % (
name, stop - start,
"%d / %.1f / %d dBm" % (min(sig), sum(sig) / len(sig), max(sig)) if sig else "—",
"%d von %d (%.0f %%)" % (verloren, gesamt, 100 * verloren / gesamt) if gesamt else "—",
("%.1f s" % luecke) if luecke else "keine"))
(("%.1f s ⚠️ eher Ruhezustand" % luecke) if schlaefrig
else ("%.1f s" % luecke)) if luecke else "keine"))
if ifaces:
print("%-16s auf %s" % ("", ", ".join(ifaces)))
print("\n⚠️ = Luecke bei gutem Signal und hoher PHY-Rate -> das Geraet war erreichbar und hat")
print(" nur nicht geantwortet (iOS-Ruhezustand). Solche Luecken NICHT als Funkloch lesen.")
print("\nLesehilfe: eine längste Lücke über ~2 s ist für einen Videocall eine hörbare Unterbrechung,")
print("über 10 s ist der Call praktisch tot. Signal unter −70 dBm ist die Zone, in der das passiert.")