wifi-etl/app/transform/merge_mac.py

64 lines
2.6 KiB
Python
Raw Normal View History

import logging
logger = logging.getLogger(__name__)
def normalize_mac(mac: str) -> str:
if not mac:
return ""
cleaned = mac.replace('.', '').replace('-', '').replace(':', '').upper()
if len(cleaned) == 12 and all(c in '0123456789ABCDEF' for c in cleaned):
return ':'.join(cleaned[i:i+2] for i in range(0, 12, 2))
return mac.upper()
def transform_ruijie(record: dict) -> dict:
"""Session Ruijie → dict (mac normalizado + campos)."""
return {
'mac_address': normalize_mac(record.get('mac', '')),
'access_point_name': record.get('deviceAliasName', ''),
'building_name': record.get('buildingName', ''),
'band': record.get('band', ''),
'channel': record.get('channel', ''),
'rssi': int(record.get('rssiInt', 0) or 0),
'user_ip': record.get('userIp', ''),
'bytes_up': int(record.get('wifiUp', 0) or 0),
'bytes_down': int(record.get('wifiDown', 0) or 0),
'bytes_total': int(record.get('wifiUpDown', 0) or 0),
'serial_number': record.get('sn', ''),
'online_time_ms': record.get('onlineTime'), # epoch ms (int)
'offline_time_ms': record.get('offlineTime'), # epoch ms (int)
'active_time_ms': int(record.get('activeTime', 0) or 0),
}
def transform_wifeed(record: dict) -> dict:
"""
Access WiFeed dict (usuário + MAC do dispositivo).
Dados vêm de /v2/report/access e incluem:
- hostMacAddress: MAC do dispositivo
- clientName, clientEmail, clientPhoneNumber: Info do cliente
- clientGender, clientBirthdate: Dados demográficos
- clientExtraFields: CPF e outros extras
- clientId: ID único do cliente
- hostType: Tipo de dispositivo (Android, iPhone, etc)
- localName: Local/network onde conectou
"""
cpf = ''
extra = record.get('clientExtraFields')
if isinstance(extra, dict):
cpf = extra.get('CPF', '')
return {
'mac_address': normalize_mac(record.get('hostMacAddress', '')),
'name': record.get('clientName', ''),
'email': record.get('clientEmail', ''),
'cpf': cpf,
'gender': record.get('clientGender', ''),
'birthdate': record.get('clientBirthdate'), # string 'YYYY-MM-DD'
'phone': record.get('clientPhoneNumber', ''),
'client_id': int(record.get('clientId', 0) or 0),
'host_type': record.get('hostType', ''),
'local_name': record.get('localName', ''),
}