ESPHome 2026.2.4
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
5#ifdef USE_ESP32
6
7namespace esphome {
8namespace mopeka_ble {
9
10static const char *const TAG = "mopeka_ble";
11
12// Mopeka Std (CC2540) sensor details
13static const uint16_t SERVICE_UUID_CC2540 = 0xADA0;
14static const uint16_t MANUFACTURER_CC2540_ID = 0x000D; // Texas Instruments (TI)
15static const uint8_t MANUFACTURER_CC2540_DATA_LENGTH = 23;
16
17// Mopeka Pro (NRF52) sensor details
18static const uint16_t SERVICE_UUID_NRF52 = 0xFEE5;
19static const uint16_t MANUFACTURER_NRF52_ID = 0x0059; // Nordic
20static const uint8_t MANUFACTURER_NRF52_DATA_LENGTH = 10;
21
39 char addr_buf[MAC_ADDRESS_PRETTY_BUFFER_SIZE];
40 // Fetch information about BLE device.
41 const auto &service_uuids = device.get_service_uuids();
42 if (service_uuids.size() != 1) {
43 return false;
44 }
45 const auto &service_uuid = service_uuids[0];
46
47 const auto &manu_datas = device.get_manufacturer_datas();
48 if (manu_datas.size() != 1) {
49 return false;
50 }
51 const auto &manu_data = manu_datas[0];
52
53 // Is the device maybe a Mopeka Std (CC2540) sensor.
54 if (service_uuid == esp32_ble_tracker::ESPBTUUID::from_uint16(SERVICE_UUID_CC2540)) {
55 if (manu_data.uuid != esp32_ble_tracker::ESPBTUUID::from_uint16(MANUFACTURER_CC2540_ID)) {
56 return false;
57 }
58
59 if (manu_data.data.size() != MANUFACTURER_CC2540_DATA_LENGTH) {
60 return false;
61 }
62
63 const bool sync_button_pressed = (manu_data.data[3] & 0x80) != 0;
64
65 if (this->show_sensors_without_sync_ || sync_button_pressed) {
66 ESP_LOGI(TAG, "MOPEKA STD (CC2540) SENSOR FOUND: %s", device.address_str_to(addr_buf));
67 }
68
69 // Is the device maybe a Mopeka Pro (NRF52) sensor.
70 } else if (service_uuid == esp32_ble_tracker::ESPBTUUID::from_uint16(SERVICE_UUID_NRF52)) {
71 if (manu_data.uuid != esp32_ble_tracker::ESPBTUUID::from_uint16(MANUFACTURER_NRF52_ID)) {
72 return false;
73 }
74
75 if (manu_data.data.size() != MANUFACTURER_NRF52_DATA_LENGTH) {
76 return false;
77 }
78
79 const bool sync_button_pressed = (manu_data.data[2] & 0x80) != 0;
80
81 if (this->show_sensors_without_sync_ || sync_button_pressed) {
82 ESP_LOGI(TAG, "MOPEKA PRO (NRF52) SENSOR FOUND: %s", device.address_str_to(addr_buf));
83 }
84 }
85
86 return false;
87}
88
89} // namespace mopeka_ble
90} // namespace esphome
91
92#endif
const char * address_str_to(std::span< char, MAC_ADDRESS_PRETTY_BUFFER_SIZE > buf) const
Format MAC address into provided buffer, returns pointer to buffer for convenience.
const std::vector< ServiceData > & get_manufacturer_datas() const
const std::vector< ESPBTUUID > & get_service_uuids() const
bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override
Parse all incoming BLE payloads to see if it is a Mopeka BLE advertisement.
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7