Releases: agittins/bermuda
v0.8.5 Perception of Prodigal Proxies
This release should improve detection of proxies that have dropped off and re-joined the network, and also removes the log spam that was happening in those cases.
Also nice is the initial "floors" support (it's nothing fancy, it just creates a sensor that states the floor relevant for the currently-detected "area" - this doesn't (yet) have any improvements for reliably distinguishing between floors).
This release also fixes some errors/warnings that came up in the 2025.8 betas, so well-worth installing before/when you dive into 2025.8.0 later today! 😁
Changes
- refactor: move scanner init into bermuda_device @agittins (#594)
- fix: irk checks on cached addresses @agittins (#596)
- feat: initial floors support @agittins (#598)
- chore: add tests for util.py @agittins (#600)
- chore: linting on test_util.py @agittins (#601)
- fix: allow advert to apply new scanner obj @agittins (#602)
- chore: more tests for advert, device and more @agittins (#603)
- chore: add uv to workflow and aiofiles to reqs @agittins (#604)
- Fix 2025.8 issue with BLEDevice.init() #637 @agittins (#644)
- Lower logging level for unexpected stamps @agittins (#645)
📦 Dependencies
- chore(deps): bump reorder-python-imports from 3.14.0 to 3.15.0 in /.github/workflows @dependabot[bot] (#592)
- chore(deps): bump ruff from 0.11.10 to 0.11.12 @dependabot[bot] (#599)
- chore(deps): bump pip from 25.1.1 to 25.2 in /.github/workflows @dependabot[bot] (#639)
- chore(deps): update pip requirement from <25.2,>=24.1.1 to >=24.1.1,<25.3 @dependabot[bot] (#638)
- chore(deps): bump astral-sh/setup-uv from 5 to 6 @dependabot[bot] (#606)
- chore(deps): bump softprops/action-gh-release from 2.2.2 to 2.3.2 @dependabot[bot] (#613)
- chore(deps): bump flake8 from 7.2.0 to 7.3.0 in /.github/workflows @dependabot[bot] (#618)
- chore(deps): bump sigstore/gh-action-sigstore-python from 3.0.0 to 3.0.1 @dependabot[bot] (#619)
- chore(deps): bump ruff from 0.11.12 to 0.12.7 @dependabot[bot] (#636)
v0.8.5-beta3
Changes
- refactor: move scanner init into bermuda_device @agittins (#594)
- fix: irk checks on cached addresses @agittins (#596)
- feat: initial floors support @agittins (#598)
- chore: add tests for util.py @agittins (#600)
- chore: linting on test_util.py @agittins (#601)
- fix: allow advert to apply new scanner obj @agittins (#602)
- chore: more tests for advert, device and more @agittins (#603)
- chore: add uv to workflow and aiofiles to reqs @agittins (#604)
📦 Dependencies
- chore(deps): bump reorder-python-imports from 3.14.0 to 3.15.0 in /.github/workflows @dependabot[bot] (#592)
- chore(deps): bump ruff from 0.11.10 to 0.11.12 @dependabot[bot] (#599)
v0.8.5-beta2
v0.8.5-beta1
v0.8.4 Bugfixes, Unavailable devices, Bluecharm
This release addresses some smaller (but important) bugs.
Changes
- fix: bluecharm uuid regression and runtime error @agittins (#586)
- fixes runtime error causing 1 second
unavailable
glitches
- fixes runtime error causing 1 second
- fix: mac_explode, move redaction purge to pruning @agittins (#587)
- fix: Devs start
unavailable
instead of `unknown @agittins (#588)- Fixes devices that are away from remaining at
unavailable
on HA reboot
until they return home. Now away devices show asunknown
/away
from
startup.
- Fixes devices that are away from remaining at
v0.8.3 Security Release: fix for Download Diagnostics
🔒 Security Fix
Version 0.8.2beta3, released May 20 2025 at 02:46 GMT, as well as v0.8.2 contain a bug that exposed IRKs and some temporary MAC addresses in the "Download Diagnostics" without being redacted.
Who is affected
If you posted a diagnostics to a public place while running v0.8.2beta3 or v0.8.2 please take steps to remove it from public access if possible.
All github issues in the Bermuda repository that contain a diagnostic from the affected versions have been scrubbed already. Only a single instance of this occurrence has been found.
If you have not uploaded a "Download Diagnostics" in the last three days you are not affected, but should update to v0.8.3 as soon as practicable.
Consequences & Mitigation
- The temporary MAC addresses are only in use for 15 minutes from their first creation, so are extremely unlikely to present any privacy risk.
- The IRKs are more permanent, and with access to these another party would be able to identify your device's bluetooth traffic as belonging to your device. Obviously this risk has a limited physical radius which reduces the exposure risk.
Other Changes
- fix: redactions in irk_manager diagnostics @agittins (#582)
- improved performance of redact_data, to reduce instances of system lockup during download diagnostics
- logic improvements to redact_data which may have caused corner-case lockups of download diagnostics
- removed logging for "no ads for metadevice.."
- reduced logging for "scanner stamps for .. should not go backwards" to debug, as it seems they often have significant jitter (fixes #580 )
Known Unknowns
This is a significant release that fixes a collection of issues introduced in v0.8.0 as well as some significant fixes for recent iOS devices, where devices would appear as Unknown
for various periods or on various user actions on the device (this particular issue will be at least "much improved", if not fully solved).
Huge thanks to all those who assisted in the various "iOS devices going unknown" threads with sharing observations and diagnostic data - an incomplete list being @oneseventhree, @drothenberger, @erkr, @hajar97, @faz17, @kbrohkahn, @rccoleman, @jksmurf, @milandzuris, @iotola, @rickt123, @bill7531 and more, and particularly to @tylerhartwig for some very decisive debug capture!
Thanks also @jackjourneyman for documentation improvements.
🚨 Breaking Change
The keys and some value formats in the bermuda.dump_devices
service call / action have changed.
I'm not aware of any integrations that use this service, so this will probably only affect you if you have used the service yourself to create template sensors etc.
Of particular note is that the scanners
sub-key on each device is now called adverts
, better reflecting the actual content, and the key is now device-address__scanner-address
(a tuple, internally). Advertisement data has also been moved around inside the advert dict, and values are now generally expressed in hex rather than bytes, because python's bytes format causes my retinas to slowly detach with a scraping noise that is decidedly disconcerting.
🐛🦋 Significant Changes
🖼️ Area and Distance sensors now use the icon defined for the current Area (it's not the most significant change, but it's the most easily noticed!)
📡 Bermuda takes a different approach to gathering the advertising data from scanners, and now has visibility of all packets reported by scanners rather than just those collated by the Bluetooth manager. The scanning logic has been cleaned up and refactored.
📻 New scanner handling avoids problems caused by previously storing state / a list of scanners. Scanner discovery is now cleaner and more robust and should respond better to realtime changes in device addition/removal. This also means that the Distance to...
(and Unfiltered Distance to...
) sensors now get created on-demand as new scanners appear / are removed, which should lead to less surprising behaviour.
✂️ Device pruning has been improved and several bugs fixed. This resolves some issues with CPU and memory use increases, as well as IRK or iBeacon devices going unknown
prematurely due to over-zealous pruning.
📍 Area detection tweaks continue, with improvements to more stable transitions from an Area to Unknown, without glitching to another area in the interim.
🔑 Bermuda now includes an IRK implementation in parallel to Private BLE Device that tracks full history for valid MACs (a resolvable MAC can be used for up to 15 minutes) and allows Bermuda to validate prior MACs after a reload and respond to advertisements that might not be forwarded to the entire Bluetooth stack.
🧟 Ignore zombie advertisements reported from BlueZ (local USB or onboard BLE adaptors) for paired but absent devices (rssi -128)
🧹 Significant code restructuring, cleanups etc. Fixed some asyncio usage issues.
🚀 Sub-millisecond startup time by placing startup io tasks in separate thread
Changelog
- fix: #534 pruning index out of range, vscode/devcontainer tweaks by @agittins in #540
- chore(deps): bump actions/setup-python from 5.5.0 to 5.6.0 by @dependabot in #530
- chore(deps): update pip requirement from <25.1,>=24.1.1 to >=24.1.1,<25.2 by @dependabot in #536
- chore(deps): bump pip from 25.0.1 to 25.1 in /.github/workflows by @dependabot in #537
- chore(deps): bump ruff from 0.11.6 to 0.11.7 by @dependabot in #531
- fix: Area switching on timeout to stale adverts by @agittins in #549
- fix: async usage addressing #456 by @agittins in #550
- feat: Area and distance entities use area icon by @agittins in #558
- docs: readme updates incl min ha version by @agittins in #559
- chore(deps): bump ruff from 0.11.7 to 0.11.8 by @dependabot in #552
- chore(deps): bump pip from 25.1 to 25.1.1 in /.github/workflows by @dependabot in #557
- chore: added autoreload to vscode launch.json by @agittins in #566
- feat: significant restructuring by @agittins in #568
- chore(deps): bump ruff from 0.11.8 to 0.11.10 by @dependabot in #567
- chore: ren BermudaDeviceScanner to BermudaAdvert by @agittins in #569
- fix: new irk_manager to cover all traffic types by @agittins in #576
- fix: restore on_advert trigger and add diags log by @agittins in #577
Full Changelog: v0.8.1...v0.8.2
v0.8.2-beta3
Another step... this release includes a full IRK implementation that can work in parallell to Private BLE Device, but is designed mainly to be able to handle advertisements that PBLE might not see.
This provides a way to test some theories about what is causing unknown periods for iOS devices.
iOS folk who've been having Unknown
timespans, please try this out and see if it resolves or at least improves your situation.
Changes
- fix: #534 pruning index out of range, vscode/devcontainer tweaks @agittins (#540)
- fix: Area switching on timeout to stale adverts @agittins (#549)
- fix: async usage addressing #456 @agittins (#550)
- feat: Area and distance entities use area icon @agittins (#558)
- docs: readme updates incl min ha version @agittins (#559)
- chore: added autoreload to vscode launch.json @agittins (#566)
- feat: significant restructuring @agittins (#568)
- chore: ren BermudaDeviceScanner to BermudaAdvert @agittins (#569)
- fix: new irk_manager to cover all traffic types @agittins (#576)
- fix: restore on_advert trigger and add diags log @agittins (#577)
📦 Dependencies
- chore(deps): bump actions/setup-python from 5.5.0 to 5.6.0 @dependabot[bot] (#530)
- chore(deps): update pip requirement from <25.1,>=24.1.1 to >=24.1.1,<25.2 @dependabot[bot] (#536)
- chore(deps): bump pip from 25.0.1 to 25.1 in /.github/workflows @dependabot[bot] (#537)
- chore(deps): bump ruff from 0.11.6 to 0.11.7 @dependabot[bot] (#531)
- chore(deps): bump ruff from 0.11.7 to 0.11.8 @dependabot[bot] (#552)
- chore(deps): bump pip from 25.1 to 25.1.1 in /.github/workflows @dependabot[bot] (#557)
- chore(deps): bump ruff from 0.11.8 to 0.11.10 @dependabot[bot] (#567)
v0.8.2-beta2 Significant changes
This release includes some pretty significant refactoring, including a change to the core approach of processing advertisements from the backend.
Please join the discussion if you have comments / questions related to this beta - #570
Overall performance should be improved, and some bugs that resulted in devices going unknown
are resolved by this update.
Bermuda no longer saves any state relating to scanners (other than the rssi_offsets), and adding/removing scanners should now update the distance to...
sensors correctly in realtime.
Devices switching to unknown
:
- If the device simply isn't advertising, then there is nothing Bermuda can do about this. This still seems to be the case for some iOS 18.3+ devices.
- Cases where devices switched their MAC addresses during different activities and went unknown should now be fixed.
- Bermuda receives IRK MAC updates from Private BLE Device. If Bermuda is reloaded it won't be informed of the historical MAC addresses, and some devices may show as
unknown
if they switch back to previous MACs until those MACs are timed out (typically 15 minutes). - Devices that have long advertising intervals (in excess of 30 seconds) will still show as
unknown
for any intervals beyond that time. A future change will address this by auto-tuning the device timeout based on observed intervals.
Breaking Changes
If you use the bermuda.dump_devices
service/action, the format and layout of multiple fields has changed. The most significant is that the scanners
key is not named adverts
, and the keys for the sub-items are now tuples made up of the device and scanner MACs.
Changes
- fix: #534 pruning index out of range, vscode/devcontainer tweaks @agittins (#540)
- fix: Area switching on timeout to stale adverts @agittins (#549)
- fix: async usage addressing #456 @agittins (#550)
- feat: Area and distance entities use area icon @agittins (#558)
- docs: readme updates incl min ha version @agittins (#559)
- chore: added autoreload to vscode launch.json @agittins (#566)
- feat: significant restructuring @agittins (#568)
- chore: ren BermudaDeviceScanner to BermudaAdvert @agittins (#569)
📦 Dependencies
- chore(deps): bump actions/setup-python from 5.5.0 to 5.6.0 @dependabot[bot] (#530)
- chore(deps): update pip requirement from <25.1,>=24.1.1 to >=24.1.1,<25.2 @dependabot[bot] (#536)
- chore(deps): bump pip from 25.0.1 to 25.1 in /.github/workflows @dependabot[bot] (#537)
- chore(deps): bump ruff from 0.11.6 to 0.11.7 @dependabot[bot] (#531)
- chore(deps): bump ruff from 0.11.7 to 0.11.8 @dependabot[bot] (#552)
- chore(deps): bump pip from 25.1 to 25.1.1 in /.github/workflows @dependabot[bot] (#557)
- chore(deps): bump ruff from 0.11.8 to 0.11.10 @dependabot[bot] (#567)
v0.8.2-beta1
Some bugfixes that might resolve scanning/area issues.
Changes
- fix: #534 pruning index out of range, vscode/devcontainer tweaks @agittins (#540)
- fix: Area switching on timeout to stale adverts @agittins (#549)
- fix: async usage addressing #456 @agittins (#550)
- feat: Area and distance entities use area icon @agittins (#558)
- Ajg dev @agittins (#559)
📦 Dependencies
- chore(deps): bump actions/setup-python from 5.5.0 to 5.6.0 @dependabot[bot] (#530)
- chore(deps): update pip requirement from <25.1,>=24.1.1 to >=24.1.1,<25.2 @dependabot[bot] (#536)
- chore(deps): bump pip from 25.0.1 to 25.1 in /.github/workflows @dependabot[bot] (#537)
- chore(deps): bump ruff from 0.11.6 to 0.11.7 @dependabot[bot] (#531)
- chore(deps): bump ruff from 0.11.7 to 0.11.8 @dependabot[bot] (#552)
- chore(deps): bump pip from 25.1 to 25.1.1 in /.github/workflows @dependabot[bot] (#557)