From 63a7234767b27d7a778290d771dcf9d1cb3d8e61 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 27 Feb 2025 13:37:11 +0000 Subject: [PATCH] Include the bluetooth mac address in the device info when proxy is enabled (#8203) --- esphome/components/api/api.proto | 3 +++ esphome/components/api/api_connection.cpp | 1 + esphome/components/api/api_pb2.cpp | 9 +++++++++ esphome/components/api/api_pb2.h | 1 + esphome/components/bluetooth_proxy/bluetooth_proxy.h | 8 ++++++++ 5 files changed, 22 insertions(+) diff --git a/esphome/components/api/api.proto b/esphome/components/api/api.proto index 534098e5fd..8b7fdf8b11 100644 --- a/esphome/components/api/api.proto +++ b/esphome/components/api/api.proto @@ -227,6 +227,9 @@ message DeviceInfoResponse { uint32 voice_assistant_feature_flags = 17; string suggested_area = 16; + + // The Bluetooth mac address of the device. For example "AC:BC:32:89:0E:AA" + string bluetooth_mac_address = 18; } message ListEntitiesRequest { diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp index af79b0930d..9d7b8c1780 100644 --- a/esphome/components/api/api_connection.cpp +++ b/esphome/components/api/api_connection.cpp @@ -1843,6 +1843,7 @@ DeviceInfoResponse APIConnection::device_info(const DeviceInfoRequest &msg) { #ifdef USE_BLUETOOTH_PROXY resp.legacy_bluetooth_proxy_version = bluetooth_proxy::global_bluetooth_proxy->get_legacy_version(); resp.bluetooth_proxy_feature_flags = bluetooth_proxy::global_bluetooth_proxy->get_feature_flags(); + resp.bluetooth_mac_address = bluetooth_proxy::global_bluetooth_proxy->get_bluetooth_mac_address_pretty(); #endif #ifdef USE_VOICE_ASSISTANT resp.legacy_voice_assistant_version = voice_assistant::global_voice_assistant->get_legacy_version(); diff --git a/esphome/components/api/api_pb2.cpp b/esphome/components/api/api_pb2.cpp index 41016e510f..771f029eae 100644 --- a/esphome/components/api/api_pb2.cpp +++ b/esphome/components/api/api_pb2.cpp @@ -838,6 +838,10 @@ bool DeviceInfoResponse::decode_length(uint32_t field_id, ProtoLengthDelimited v this->suggested_area = value.as_string(); return true; } + case 18: { + this->bluetooth_mac_address = value.as_string(); + return true; + } default: return false; } @@ -860,6 +864,7 @@ void DeviceInfoResponse::encode(ProtoWriteBuffer buffer) const { buffer.encode_uint32(14, this->legacy_voice_assistant_version); buffer.encode_uint32(17, this->voice_assistant_feature_flags); buffer.encode_string(16, this->suggested_area); + buffer.encode_string(18, this->bluetooth_mac_address); } #ifdef HAS_PROTO_MESSAGE_DUMP void DeviceInfoResponse::dump_to(std::string &out) const { @@ -937,6 +942,10 @@ void DeviceInfoResponse::dump_to(std::string &out) const { out.append(" suggested_area: "); out.append("'").append(this->suggested_area).append("'"); out.append("\n"); + + out.append(" bluetooth_mac_address: "); + out.append("'").append(this->bluetooth_mac_address).append("'"); + out.append("\n"); out.append("}"); } #endif diff --git a/esphome/components/api/api_pb2.h b/esphome/components/api/api_pb2.h index a3fccbc641..1f96e2c151 100644 --- a/esphome/components/api/api_pb2.h +++ b/esphome/components/api/api_pb2.h @@ -354,6 +354,7 @@ class DeviceInfoResponse : public ProtoMessage { uint32_t legacy_voice_assistant_version{0}; uint32_t voice_assistant_feature_flags{0}; std::string suggested_area{}; + std::string bluetooth_mac_address{}; void encode(ProtoWriteBuffer buffer) const override; #ifdef HAS_PROTO_MESSAGE_DUMP void dump_to(std::string &out) const override; diff --git a/esphome/components/bluetooth_proxy/bluetooth_proxy.h b/esphome/components/bluetooth_proxy/bluetooth_proxy.h index 35a37f934a..e0345ff248 100644 --- a/esphome/components/bluetooth_proxy/bluetooth_proxy.h +++ b/esphome/components/bluetooth_proxy/bluetooth_proxy.h @@ -15,6 +15,9 @@ #include "bluetooth_connection.h" +#include +#include + namespace esphome { namespace bluetooth_proxy { @@ -114,6 +117,11 @@ class BluetoothProxy : public esp32_ble_tracker::ESPBTDeviceListener, public Com return flags; } + std::string get_bluetooth_mac_address_pretty() { + const uint8_t *mac = esp_bt_dev_get_address(); + return str_snprintf("%02X:%02X:%02X:%02X:%02X:%02X", 17, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + } + protected: void send_api_packet_(const esp32_ble_tracker::ESPBTDevice &device);