Source code for aioafero.anonomyize_data
"""Provides an interface for anonymizing data."""
__all__ = ["anonymize_device", "anonymize_devices"]
from dataclasses import asdict
from uuid import uuid4
from .device import AferoDevice, AferoState
ANONYMIZE_STATES: set[str] = {"wifi-ssid", "wifi-mac-address", "ble-mac-address"}
FNAME_IND: int = 0
[docs]
def anonymize_devices(
devices: list[AferoDevice], anon_name: bool = False
) -> list[dict]:
"""Remove identifying information from the device.
:param devices: List of devices to anonymize
:param anon_name: If true, give each device a unique name
"""
parents = generate_parent_mapping(devices)
device_links = {}
return [anonymize_device(dev, parents, device_links, anon_name) for dev in devices]
def generate_parent_mapping(devices: list[AferoDevice]) -> dict:
"""Generate anonymize links between parents and children.
:param devices: List of devices to anonymize
"""
mapping = {}
for device in devices:
if device.children:
device.id = str(uuid4())
new_children = []
for child_id in device.children:
new_uuid = str(uuid4())
mapping[child_id] = {"parent": device.id, "new": new_uuid}
new_children.append(new_uuid)
device.children = new_children
return mapping
[docs]
def anonymize_device(
dev: AferoDevice,
parent_mapping: dict,
device_links: dict,
anon_name: bool,
) -> dict:
"""Convert an AferoDevice into an anonymized dictionary."""
fake_dev = asdict(dev)
if anon_name:
global FNAME_IND # noqa: PLW0603
fake_dev["friendly_name"] = f"friendly-device-{FNAME_IND}"
FNAME_IND += 1
if dev.id in parent_mapping:
fake_dev["id"] = parent_mapping[dev.id]["new"]
else:
fake_dev["id"] = str(uuid4())
dev_link = dev.device_id
if dev_link not in device_links:
device_links[dev_link] = str(uuid4())
fake_dev["device_id"] = device_links[dev_link]
fake_dev["states"] = []
for state in dev.states:
fake_dev["states"].append(anonymize_state(state))
return fake_dev
def anonymize_state(state: AferoState, only_geo: bool = False) -> dict:
fake_state = asdict(state)
fake_state["lastUpdateTime"] = 0
if fake_state["functionClass"] == "geo-coordinates":
fake_state["value"] = {"geo-coordinates": {"latitude": "0", "longitude": "0"}}
elif not only_geo:
if fake_state["functionClass"] in ANONYMIZE_STATES:
fake_state["value"] = str(uuid4())
return fake_state