    def redact_data(self, data, first_run=True):
        """
        Wash any collection of data of any MAC addresses.

        Uses the redaction list of substitutions if already created, then
        washes any remaining mac-like addresses. This routine is recursive,
        so if you're changing it bear that in mind!
        """
        if first_run:
            # On first/outer call, refresh the redaction list to ensure
            # we don't let any new addresses slip through. Might be expensive
            # on first call, but will be much cheaper for subsequent calls.
            self.redaction_list_update()
            first_run = False
        if isinstance(data, str):
            data = data.lower()
            # the end of the recursive wormhole, do the actual work:
            if data not in self.redactions:
                for find, fix in list(self.redactions.items()):
                    if find in data:
                        self.redactions[data] = data.replace(find, fix)
                        data = self.redactions[data]
                        break
            else:
                data = self.redactions[data]
            # redactions done, now replace any remaining MAC addresses
            # We are only looking for xx:xx:xx... format.
            return self._redact_generic_re.sub(self._redact_generic_sub, data)
        elif isinstance(data, dict):
            return {self.redact_data(k, False): self.redact_data(v, False) for k, v in data.items()}
        elif isinstance(data, list):
            return [self.redact_data(v, False) for v in data]
        else:
            return data
Wash any collection of data of any MAC addresses.

Uses the redaction list of substitutions if already created, then
washes any remaining mac-like addresses. This routine is recursive,
so if you're changing it bear that in mind!
custom_components/bermuda/coordinator.py