mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	Allow multiple MAC addresses for 'on_ble_advertise' filter (#4773)
This commit is contained in:
		| @@ -167,7 +167,7 @@ CONFIG_SCHEMA = cv.Schema( | |||||||
|         cv.Optional(CONF_ON_BLE_ADVERTISE): automation.validate_automation( |         cv.Optional(CONF_ON_BLE_ADVERTISE): automation.validate_automation( | ||||||
|             { |             { | ||||||
|                 cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(ESPBTAdvertiseTrigger), |                 cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(ESPBTAdvertiseTrigger), | ||||||
|                 cv.Optional(CONF_MAC_ADDRESS): cv.mac_address, |                 cv.Optional(CONF_MAC_ADDRESS): cv.ensure_list(cv.mac_address), | ||||||
|             } |             } | ||||||
|         ), |         ), | ||||||
|         cv.Optional(CONF_ON_BLE_SERVICE_DATA_ADVERTISE): automation.validate_automation( |         cv.Optional(CONF_ON_BLE_SERVICE_DATA_ADVERTISE): automation.validate_automation( | ||||||
| @@ -223,7 +223,10 @@ async def to_code(config): | |||||||
|     for conf in config.get(CONF_ON_BLE_ADVERTISE, []): |     for conf in config.get(CONF_ON_BLE_ADVERTISE, []): | ||||||
|         trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) |         trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) | ||||||
|         if CONF_MAC_ADDRESS in conf: |         if CONF_MAC_ADDRESS in conf: | ||||||
|             cg.add(trigger.set_address(conf[CONF_MAC_ADDRESS].as_hex)) |             addr_list = [] | ||||||
|  |             for it in conf[CONF_MAC_ADDRESS]: | ||||||
|  |                 addr_list.append(it.as_hex) | ||||||
|  |             cg.add(trigger.set_addresses(addr_list)) | ||||||
|         await automation.build_automation(trigger, [(ESPBTDeviceConstRef, "x")], conf) |         await automation.build_automation(trigger, [(ESPBTDeviceConstRef, "x")], conf) | ||||||
|     for conf in config.get(CONF_ON_BLE_SERVICE_DATA_ADVERTISE, []): |     for conf in config.get(CONF_ON_BLE_SERVICE_DATA_ADVERTISE, []): | ||||||
|         trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) |         trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) | ||||||
|   | |||||||
| @@ -10,18 +10,22 @@ namespace esp32_ble_tracker { | |||||||
| class ESPBTAdvertiseTrigger : public Trigger<const ESPBTDevice &>, public ESPBTDeviceListener { | class ESPBTAdvertiseTrigger : public Trigger<const ESPBTDevice &>, public ESPBTDeviceListener { | ||||||
|  public: |  public: | ||||||
|   explicit ESPBTAdvertiseTrigger(ESP32BLETracker *parent) { parent->register_listener(this); } |   explicit ESPBTAdvertiseTrigger(ESP32BLETracker *parent) { parent->register_listener(this); } | ||||||
|   void set_address(uint64_t address) { this->address_ = address; } |   void set_addresses(const std::vector<uint64_t> &addresses) { this->address_vec_ = addresses; } | ||||||
|  |  | ||||||
|   bool parse_device(const ESPBTDevice &device) override { |   bool parse_device(const ESPBTDevice &device) override { | ||||||
|     if (this->address_ && device.address_uint64() != this->address_) { |     uint64_t u64_addr = device.address_uint64(); | ||||||
|  |     if (!address_vec_.empty()) { | ||||||
|  |       if (std::find(address_vec_.begin(), address_vec_.end(), u64_addr) == address_vec_.end()) { | ||||||
|         return false; |         return false; | ||||||
|       } |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     this->trigger(device); |     this->trigger(device); | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
|   uint64_t address_ = 0; |   std::vector<uint64_t> address_vec_; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| class BLEServiceDataAdvertiseTrigger : public Trigger<const adv_data_t &>, public ESPBTDeviceListener { | class BLEServiceDataAdvertiseTrigger : public Trigger<const adv_data_t &>, public ESPBTDeviceListener { | ||||||
|   | |||||||
| @@ -488,6 +488,14 @@ binary_sensor: | |||||||
|  |  | ||||||
| esp32_ble_tracker: | esp32_ble_tracker: | ||||||
|   on_ble_advertise: |   on_ble_advertise: | ||||||
|  |     - mac_address: | ||||||
|  |         - AA:BB:CC:DD:EE:FF | ||||||
|  |         - FF:EE:DD:CC:BB:AA | ||||||
|  |       then: | ||||||
|  |         # yamllint disable rule:line-length | ||||||
|  |         - lambda: !lambda |- | ||||||
|  |             ESP_LOGD("main", "The device address (%s) exists in list", x.address_str().c_str()); | ||||||
|  |         # yamllint enable rule:line-length | ||||||
|     - mac_address: AC:37:43:77:5F:4C |     - mac_address: AC:37:43:77:5F:4C | ||||||
|       then: |       then: | ||||||
|         # yamllint disable rule:line-length |         # yamllint disable rule:line-length | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user