Skip to content

Commit ffa67f7

Browse files
committed
Correct the claim that a Bluetooth proxy is mandatory
The documentation said the host adapter cannot hold this appliance and that the link would keep dropping no matter what. Measured after bonding with bluetoothctl, it held for over two hours continuously through the host adapter, across many address-rotation windows, with every parameter still arriving. The drops that produced the original claim were this integration raising an exception inside its own connection callback, which tore the link down every two minutes. The measurement that condemned the adapter was measuring a bug. The narrower claim survives and is what the repair issue now says: a reconnect after a drop can fail, because the appliance may by then advertise under an address the host cannot map to the bond. A proxy avoids that and reaches further, so it stays recommended -- but not on evidence that was never there.
1 parent c30a43a commit ffa67f7

7 files changed

Lines changed: 63 additions & 28 deletions

File tree

README.md

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,29 @@ happen, including changes made at the panel or from the app.
6060

6161
Then **Download**, and restart Home Assistant.
6262

63-
## An ESP32 Bluetooth proxy is required
64-
65-
Not a preference. The appliance advertises under a **fast-rotating Resolvable
66-
Private Address** and only accepts an encrypted reconnect from a client that
67-
can resolve that address back to the stored bond. A phone's controller does
68-
this. **BlueZ does not** — it can pair the appliance, but every later reconnect
69-
arrives on an address it cannot map to the key, and the link is dropped.
70-
71-
This was established independently and exhaustively by
72-
[rpodgorny/hass-truma-inetx](https://github.com/rpodgorny/hass-truma-inetx)
73-
against the same protocol — IRK stored, LL-Privacy enabled, three different
74-
adapters — and it fails at the controller level regardless.
63+
## An ESP32 Bluetooth proxy is recommended
64+
65+
The appliance advertises under a **rotating Resolvable Private Address**, and
66+
an encrypted reconnect is only accepted from a client that can resolve that
67+
address back to the stored bond. A phone's controller does this in hardware;
68+
a host adapter running BlueZ may not.
69+
70+
Measured on this system, though: once the appliance was bonded with
71+
`bluetoothctl`, a connection held through the host adapter ran for **hours at a
72+
time without a single drop**, across many rotation windows. A held connection
73+
never has to re-resolve anything, and this integration holds one open.
74+
75+
So the risk is narrower than "it will not work": it is the reconnect after a
76+
drop, when the appliance may be advertising under an address the host cannot
77+
map to the bond. [rpodgorny/hass-truma-inetx](https://github.com/rpodgorny/hass-truma-inetx)
78+
hit exactly that against the same protocol, exhaustively — IRK stored,
79+
LL-Privacy enabled, three adapters — and concluded a proxy was needed.
80+
81+
An earlier version of this page called the proxy mandatory and blamed BlueZ for
82+
constant drops. Those drops were this integration crashing in its own
83+
connection callback. The proxy is still worth having — it reconnects reliably
84+
and can sit metres from the appliance instead of wherever the server is — but
85+
the host adapter was not the fault.
7586

7687
ESP-IDF resolves private addresses in the controller the way a phone does, so
7788
an [ESPHome Bluetooth proxy](https://esphome.io/components/bluetooth_proxy.html)

custom_components/truma_aventa/connectivity.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,9 @@ def async_check_proxy(hass: HomeAssistant, entry_id: str, address: str) -> None:
6262

6363
_LOGGER.warning(
6464
"%s is only reachable through this host's own Bluetooth adapter. "
65-
"The appliance rotates its address and the link will keep dropping; "
66-
"an ESPHome Bluetooth proxy on an esp-idf build is required",
65+
"The appliance rotates its Bluetooth address, which a host adapter "
66+
"may not resolve after a drop; an ESPHome Bluetooth proxy on an "
67+
"esp-idf build reconnects reliably and reaches further",
6768
address,
6869
)
6970
ir.async_create_issue(

custom_components/truma_aventa/strings.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@
3939
},
4040
"issues": {
4141
"no_bluetooth_proxy": {
42-
"title": "Truma Aventa needs a Bluetooth proxy",
43-
"description": "{address} can only be reached through this host's own Bluetooth adapter.\n\nThe appliance changes its Bluetooth address between connections and only accepts a reconnect from a client that can resolve that address back to the pairing. Home Assistant's host adapter cannot do this, so the connection will keep dropping no matter how good the signal is.\n\nAn ESPHome Bluetooth proxy built on the esp-idf framework resolves the address the way a phone does. Place one within a few metres of the appliance. The documentation has a ready-made configuration."
42+
"title": "Truma Aventa is running without a Bluetooth proxy",
43+
"description": "{address} can only be reached through this host's own Bluetooth adapter.\n\nThe appliance changes its Bluetooth address between connections. A held connection is unaffected -- this integration keeps one open, and it has run for hours at a time on a host adapter once the appliance was bonded. What is at risk is reconnecting after a drop: the appliance may by then be advertising under an address the host adapter cannot resolve back to the pairing.\n\nAn ESPHome Bluetooth proxy built on the esp-idf framework resolves that address the way a phone does, and can sit closer to the appliance than the host does. The documentation has a ready-made configuration."
4444
}
4545
}
4646
}

custom_components/truma_aventa/translations/de.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@
3939
},
4040
"issues": {
4141
"no_bluetooth_proxy": {
42-
"title": "Truma Aventa braucht einen Bluetooth-Proxy",
43-
"description": "{address} ist nur über den Bluetooth-Adapter dieses Hosts erreichbar.\n\nDas Gerät wechselt seine Bluetooth-Adresse zwischen den Verbindungen und akzeptiert einen Reconnect nur von einem Client, der diese Adresse auf die Kopplung zurückführen kann. Der Host-Adapter von Home Assistant kann das nicht — die Verbindung bricht deshalb immer wieder ab, egal wie gut der Empfang ist.\n\nEin ESPHome-Bluetooth-Proxy auf Basis des esp-idf-Frameworks löst die Adresse so auf wie ein Handy. Platziere einen davon wenige Meter von der Anlage entfernt. Die Dokumentation enthält eine fertige Konfiguration."
42+
"title": "Truma Aventa läuft ohne Bluetooth-Proxy",
43+
"description": "{address} ist nur über den Bluetooth-Adapter dieses Hosts erreichbar.\n\nDas Gerät wechselt seine Bluetooth-Adresse zwischen den Verbindungen. Eine gehaltene Verbindung stört das nicht — diese Integration hält eine offen, und sie lief nach dem Pairing stundenlang am Stück über den Host-Adapter. Kritisch ist der Reconnect nach einem Abbruch: Das Gerät wirbt dann womöglich unter einer Adresse, die der Host-Adapter nicht auf die Kopplung zurückführen kann.\n\nEin ESPHome-Bluetooth-Proxy auf Basis des esp-idf-Frameworks löst diese Adresse so auf wie ein Handy und kann näher an der Anlage sitzen als der Host. Die Dokumentation enthält eine fertige Konfiguration."
4444
}
4545
}
4646
}

custom_components/truma_aventa/translations/en.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@
3939
},
4040
"issues": {
4141
"no_bluetooth_proxy": {
42-
"title": "Truma Aventa needs a Bluetooth proxy",
43-
"description": "{address} can only be reached through this host's own Bluetooth adapter.\n\nThe appliance changes its Bluetooth address between connections and only accepts a reconnect from a client that can resolve that address back to the pairing. Home Assistant's host adapter cannot do this, so the connection will keep dropping no matter how good the signal is.\n\nAn ESPHome Bluetooth proxy built on the esp-idf framework resolves the address the way a phone does. Place one within a few metres of the appliance. The documentation has a ready-made configuration."
42+
"title": "Truma Aventa is running without a Bluetooth proxy",
43+
"description": "{address} can only be reached through this host's own Bluetooth adapter.\n\nThe appliance changes its Bluetooth address between connections. A held connection is unaffected -- this integration keeps one open, and it has run for hours at a time on a host adapter once the appliance was bonded. What is at risk is reconnecting after a drop: the appliance may by then be advertising under an address the host adapter cannot resolve back to the pairing.\n\nAn ESPHome Bluetooth proxy built on the esp-idf framework resolves that address the way a phone does, and can sit closer to the appliance than the host does. The documentation has a ready-made configuration."
4444
}
4545
}
4646
}

docs/bluetooth-proxy.md

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
11
# The Bluetooth proxy
22

3-
## Why it is mandatory here
3+
## Why it is recommended here
44

55
The appliance advertises under a **rotating Resolvable Private Address** and
66
accepts an encrypted reconnect only from a client that can resolve that address
7-
back to the stored bond. A phone's Bluetooth controller does this. **BlueZ does
8-
not** — it can complete the pairing, but every later reconnect arrives on an
9-
address it cannot map to the key, and the link is dropped.
7+
back to the stored bond. A phone's Bluetooth controller does this in hardware;
8+
a host adapter running BlueZ may not.
9+
10+
What was actually measured here: after bonding with `bluetoothctl`, a
11+
connection held through the host adapter ran for hours without dropping,
12+
through many rotation windows. A held connection never re-resolves anything.
13+
The exposure is the reconnect after a drop, not the steady state.
14+
15+
This section previously called the proxy mandatory and attributed frequent
16+
drops to BlueZ. Those drops came from a fault in this integration, which
17+
crashed inside its own connection callback and tore the link down every two
18+
minutes. That is worth stating plainly: the measurement that condemned the
19+
adapter was measuring a bug.
1020

1121
Our own captures show the rotation directly. Across four traces the appliance
1222
connected under three different addresses:

docs/findings.md

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -365,13 +365,26 @@ truncated message then costs itself and nothing after it.
365365
- Whether `AirCirculation.FanLevel` is the right control while ventilating, or
366366
whether the app uses `AirCooling.Mode` there too. Only one write was seen.
367367

368-
## A host Bluetooth adapter is not enough
368+
## A host Bluetooth adapter: what was actually measured
369369

370370
The appliance advertises under a fast-rotating Resolvable Private Address and
371371
accepts an encrypted reconnect only from a client that can resolve that address
372-
back to the stored bond. A phone's controller does this; **BlueZ does not**.
373-
It can complete the pairing, but every later reconnect arrives on an address it
374-
cannot map to the key and the link is dropped.
372+
back to the stored bond. A phone's controller does this in hardware; a host
373+
adapter running BlueZ may not.
374+
375+
**Corrected.** This section used to say the link is dropped on every reconnect
376+
and that a proxy is mandatory. On this system, after bonding with
377+
`bluetoothctl`, the link held through the host adapter for over two hours
378+
continuously — many rotation windows — with every parameter still updating.
379+
380+
The drops that produced the original claim were this integration raising an
381+
exception inside its connection callback, which tore the link down roughly
382+
every two minutes. Attributing them to the adapter was a mistake: the
383+
measurement was of a bug, not of BlueZ.
384+
385+
The narrower claim stands: a *reconnect* after a drop can fail, because the
386+
appliance may by then advertise under an address the host cannot map to the
387+
bond, and that is what rpodgorny hit.
375388

376389
This was established independently and exhaustively by
377390
[rpodgorny/hass-truma-inetx](https://github.com/rpodgorny/hass-truma-inetx)

0 commit comments

Comments
 (0)