You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Today the integration is read-only — sensors observe state, but users can't set anything from Home Assistant. APK reverse-engineering of the official Sub-Zero Android app (v4.5.1) confirmed that the BLE protocol exposes a set command with a known list of writable properties. We can add HA control entities (number, switch, select) that send set commands over the existing D5 channel.
Confirmed writable properties
Format: {"cmd":"set","params":{"<field>":<value>}}\n (terminator newline like all other commands). Validated against the APK strings + property names.
Refrigerator
ref_set_temp — number (°F, range from APK's minSetTemp/maxSetTemp validators — TBD per model)
The APK confirms set exists for dishwashers but the writable properties weren't extracted in this pass. Worth a separate empirical capture if we want dishwasher control.
Implementation sketch
Add per-appliance number/switch/select entities in subzero_fridge.yaml / subzero_range.yaml (and optionally subzero_dishwasher.yaml). Each entity's set_value/turn_on/turn_off action writes the appropriate JSON command via esp_ble_gattc_write_char to the D5 handle, similar to the existing Submit PIN & Unlock button. Visibility gated by the existing hide_* substitutions.
Wrap each set write in a check for client->connected() and d5_handle != 0. On fw 8.5, also probably worth re-running subscribe before the set if first_poll_done has been a while (or just rely on the existing recovery ladder to pick up the failure).
Out of scope for this issue
Numeric range bounds per model (need more APK digging or empirical bounds testing)
Summary
Today the integration is read-only — sensors observe state, but users can't set anything from Home Assistant. APK reverse-engineering of the official Sub-Zero Android app (v4.5.1) confirmed that the BLE protocol exposes a
setcommand with a known list of writable properties. We can add HA control entities (number,switch,select) that sendsetcommands over the existing D5 channel.Confirmed writable properties
Format:
{"cmd":"set","params":{"<field>":<value>}}\n(terminator newline like all other commands). Validated against the APK strings + property names.Refrigerator
ref_set_temp— number (°F, range from APK'sminSetTemp/maxSetTempvalidators — TBD per model)frz_set_temp— number (°F)ref2_set_temp— number (°F, fridge drawer)wine_set_temp— number (°F)wine2_set_temp— number (°F, second wine zone)crisp_set_temp— number (°F, crisper drawer)ice_maker_on— switchsabbath_on— switchRange / Wall Oven
cav_set_temp— number (°F, oven setpoint)cav_cook_mode— select (numeric enum; specific values empirical — see Empirically map cav_cook_mode integer enum to named cooking modes #68 for cook_mode capture)cav_unit_on— switchcav_probe_set_temp— number (°F, food probe)cav2_set_temp— number (°F, second oven)cav2_cook_mode— selectcav2_unit_on— switchcav2_probe_set_temp— number (°F)Dishwasher
The APK confirms
setexists for dishwashers but the writable properties weren't extracted in this pass. Worth a separate empirical capture if we want dishwasher control.Implementation sketch
Add per-appliance
number/switch/selectentities insubzero_fridge.yaml/subzero_range.yaml(and optionallysubzero_dishwasher.yaml). Each entity'sset_value/turn_on/turn_offaction writes the appropriate JSON command viaesp_ble_gattc_write_charto the D5 handle, similar to the existingSubmit PIN & Unlockbutton. Visibility gated by the existinghide_*substitutions.Wrap each
setwrite in a check forclient->connected()andd5_handle != 0. On fw 8.5, also probably worth re-running subscribe before the set iffirst_poll_donehas been a while (or just rely on the existing recovery ladder to pick up the failure).Out of scope for this issue
References
docs/ble-protocol.adoc§ "Unlock Session Research (fw 8.5)"models.py🤖 Generated from APK reverse-engineering session, captured for follow-up.