"""normalize.py Helper per normalizzare i MAC address in due formati: - compact: 12 hex uppercase senza separatori (es: AC233FC1DD3C) - colon: 6 byte separati da ":" (es: AC:23:3F:C1:DD:3C) Nota: nel progetto usiamo **compact** come chiave interna per fare matching tra: - gateway.csv (spesso con i ":") - topic MQTT (publish_out/ in genere senza ":") - payload JSON (mac beacon/gateway spesso senza ":") Il formato colon rimane utile solo per *rendering* (es: header CSV). """ from __future__ import annotations import re _HEX_ONLY = re.compile(r"[^0-9A-Fa-f]") def mac_to_compact(mac: object) -> str: """Ritorna 12 hex uppercase senza separatori.""" if mac is None: return "" s = _HEX_ONLY.sub("", str(mac)).upper() if len(s) == 12: return s if len(s) > 12: # se arriva qualcosa di più lungo (es. UUID), prendiamo gli ultimi 12 return s[-12:] return s def compact_to_colon(mac12: object) -> str: """Converte 'AC233FC1DD3C' -> 'AC:23:3F:C1:DD:3C'.""" s = mac_to_compact(mac12) if len(s) != 12: return s return ":".join(s[i : i + 2] for i in range(0, 12, 2)) def norm_mac(mac: object) -> str: """Alias storico: ritorna il formato con ':'.""" return compact_to_colon(mac)