Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 

47 rindas
1.2 KiB

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