ESPHome 2026.10.0-dev
Loading...
Searching...
No Matches
mopeka_ble.cpp
Go to the documentation of this file.
1#include "mopeka_ble.h"
2
3#include "esphome/core/log.h"
4
6
7static const char *const TAG = "mopeka_ble";
8
9// Mopeka Std (CC2540) sensor details
10static const uint16_t SERVICE_UUID_CC2540 = 0xADA0;
11static const uint16_t MANUFACTURER_CC2540_ID = 0x000D; // Texas Instruments (TI)
12static const uint8_t MANUFACTURER_CC2540_DATA_LENGTH = 23;
13
14// Mopeka Pro (NRF52) sensor details
15static const uint16_t SERVICE_UUID_NRF52 = 0xFEE5;
16static const uint16_t MANUFACTURER_NRF52_ID = 0x0059; // Nordic
17static const uint8_t MANUFACTURER_NRF52_DATA_LENGTH = 10;
18
36 char addr_buf[MAC_ADDRESS_PRETTY_BUFFER_SIZE];
37 // Fetch information about BLE device.
38 const auto &service_uuids = device.get_service_uuids();
39 if (service_uuids.size() != 1) {
40 return false;
41 }
42 const auto &service_uuid = service_uuids[0];
43
44 const auto &manu_datas = device.get_manufacturer_datas();
45 if (manu_datas.size() != 1) {
46 return false;
47 }
48 const auto &manu_data = manu_datas[0];
49
50 // Is the device maybe a Mopeka Std (CC2540) sensor.
51 if (service_uuid == ble_device_base::ESPBTUUID::from_uint16(SERVICE_UUID_CC2540)) {
52 if (manu_data.uuid != ble_device_base::ESPBTUUID::from_uint16(MANUFACTURER_CC2540_ID)) {
53 return false;
54 }
55
56 if (manu_data.data.size() != MANUFACTURER_CC2540_DATA_LENGTH) {
57 return false;
58 }
59
60 const bool sync_button_pressed = (manu_data.data[3] & 0x80) != 0;
61
62 if (this->show_sensors_without_sync_ || sync_button_pressed) {
63 ESP_LOGI(TAG, "MOPEKA STD (CC2540) SENSOR FOUND: %s", device.address_str_to(addr_buf));
64 }
65
66 // Is the device maybe a Mopeka Pro (NRF52) sensor.
67 } else if (service_uuid == ble_device_base::ESPBTUUID::from_uint16(SERVICE_UUID_NRF52)) {
68 if (manu_data.uuid != ble_device_base::ESPBTUUID::from_uint16(MANUFACTURER_NRF52_ID)) {
69 return false;
70 }
71
72 if (manu_data.data.size() != MANUFACTURER_NRF52_DATA_LENGTH) {
73 return false;
74 }
75
76 const bool sync_button_pressed = (manu_data.data[2] & 0x80) != 0;
77
78 if (this->show_sensors_without_sync_ || sync_button_pressed) {
79 ESP_LOGI(TAG, "MOPEKA PRO (NRF52) SENSOR FOUND: %s", device.address_str_to(addr_buf));
80 }
81 }
82
83 return false;
84}
85
86} // namespace esphome::mopeka_ble
ESPDEPRECATED("Use address_str_to() instead. Removed in 2027.2.0.", "2026.8.0") std const char * address_str_to(char *buf) const
Return MAC as "XX:XX:XX:XX:XX:XX" string.
const std::vector< ESPBTUUID > & get_service_uuids() const
Definition ble_device.h:223
const std::vector< ServiceData > & get_manufacturer_datas() const
Definition ble_device.h:224
static ESPBTUUID from_uint16(uint16_t uuid)
bool parse_device(const ble_device_base::ESPBTDevice &device) override
Parse all incoming BLE payloads to see if it is a Mopeka BLE advertisement.