mirror of
https://github.com/esphome/esphome.git
synced 2024-12-22 13:34:54 +01:00
Update Airthings BLE (#2453)
This commit is contained in:
parent
04ec1c8b56
commit
6a5eb43454
8 changed files with 89 additions and 56 deletions
|
@ -1,6 +1,6 @@
|
||||||
#include "airthings_wave_mini.h"
|
#include "airthings_wave_mini.h"
|
||||||
|
|
||||||
#ifdef USE_ESP32_FRAMEWORK_ARDUINO
|
#ifdef USE_ESP32
|
||||||
|
|
||||||
namespace esphome {
|
namespace esphome {
|
||||||
namespace airthings_wave_mini {
|
namespace airthings_wave_mini {
|
||||||
|
@ -75,8 +75,6 @@ void AirthingsWaveMini::read_sensors_(uint8_t *raw_value, uint16_t value_len) {
|
||||||
|
|
||||||
bool AirthingsWaveMini::is_valid_voc_value_(uint16_t voc) { return 0 <= voc && voc <= 16383; }
|
bool AirthingsWaveMini::is_valid_voc_value_(uint16_t voc) { return 0 <= voc && voc <= 16383; }
|
||||||
|
|
||||||
void AirthingsWaveMini::loop() {}
|
|
||||||
|
|
||||||
void AirthingsWaveMini::update() {
|
void AirthingsWaveMini::update() {
|
||||||
if (this->node_state != esp32_ble_tracker::ClientState::ESTABLISHED) {
|
if (this->node_state != esp32_ble_tracker::ClientState::ESTABLISHED) {
|
||||||
if (!parent()->enabled) {
|
if (!parent()->enabled) {
|
||||||
|
@ -104,17 +102,12 @@ void AirthingsWaveMini::dump_config() {
|
||||||
LOG_SENSOR(" ", "TVOC", this->tvoc_sensor_);
|
LOG_SENSOR(" ", "TVOC", this->tvoc_sensor_);
|
||||||
}
|
}
|
||||||
|
|
||||||
AirthingsWaveMini::AirthingsWaveMini() : PollingComponent(10000) {
|
AirthingsWaveMini::AirthingsWaveMini()
|
||||||
auto service_bt = *BLEUUID::fromString(std::string("b42e3882-ade7-11e4-89d3-123b93f75cba")).getNative();
|
: PollingComponent(10000),
|
||||||
auto characteristic_bt = *BLEUUID::fromString(std::string("b42e3b98-ade7-11e4-89d3-123b93f75cba")).getNative();
|
service_uuid_(esp32_ble_tracker::ESPBTUUID::from_raw(SERVICE_UUID)),
|
||||||
|
sensors_data_characteristic_uuid_(esp32_ble_tracker::ESPBTUUID::from_raw(CHARACTERISTIC_UUID)) {}
|
||||||
service_uuid_ = esp32_ble_tracker::ESPBTUUID::from_uuid(service_bt);
|
|
||||||
sensors_data_characteristic_uuid_ = esp32_ble_tracker::ESPBTUUID::from_uuid(characteristic_bt);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AirthingsWaveMini::setup() {}
|
|
||||||
|
|
||||||
} // namespace airthings_wave_mini
|
} // namespace airthings_wave_mini
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|
||||||
#endif // USE_ESP32_FRAMEWORK_ARDUINO
|
#endif // USE_ESP32
|
||||||
|
|
|
@ -1,28 +1,28 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#ifdef USE_ESP32_FRAMEWORK_ARDUINO
|
#ifdef USE_ESP32
|
||||||
|
|
||||||
|
#include <esp_gattc_api.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <esp_gattc_api.h>
|
|
||||||
#include <BLEDevice.h>
|
|
||||||
#include "esphome/core/component.h"
|
|
||||||
#include "esphome/core/log.h"
|
|
||||||
#include "esphome/components/ble_client/ble_client.h"
|
#include "esphome/components/ble_client/ble_client.h"
|
||||||
#include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h"
|
#include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h"
|
||||||
#include "esphome/components/sensor/sensor.h"
|
#include "esphome/components/sensor/sensor.h"
|
||||||
|
#include "esphome/core/component.h"
|
||||||
|
#include "esphome/core/log.h"
|
||||||
|
|
||||||
namespace esphome {
|
namespace esphome {
|
||||||
namespace airthings_wave_mini {
|
namespace airthings_wave_mini {
|
||||||
|
|
||||||
|
static const char *const SERVICE_UUID = "b42e3882-ade7-11e4-89d3-123b93f75cba";
|
||||||
|
static const char *const CHARACTERISTIC_UUID = "b42e3b98-ade7-11e4-89d3-123b93f75cba";
|
||||||
|
|
||||||
class AirthingsWaveMini : public PollingComponent, public ble_client::BLEClientNode {
|
class AirthingsWaveMini : public PollingComponent, public ble_client::BLEClientNode {
|
||||||
public:
|
public:
|
||||||
AirthingsWaveMini();
|
AirthingsWaveMini();
|
||||||
|
|
||||||
void setup() override;
|
|
||||||
void dump_config() override;
|
void dump_config() override;
|
||||||
void update() override;
|
void update() override;
|
||||||
void loop() override;
|
|
||||||
|
|
||||||
void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
|
void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
|
||||||
esp_ble_gattc_cb_param_t *param) override;
|
esp_ble_gattc_cb_param_t *param) override;
|
||||||
|
@ -62,4 +62,4 @@ class AirthingsWaveMini : public PollingComponent, public ble_client::BLEClientN
|
||||||
} // namespace airthings_wave_mini
|
} // namespace airthings_wave_mini
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|
||||||
#endif // USE_ESP32_FRAMEWORK_ARDUINO
|
#endif // USE_ESP32
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.components import sensor, ble_client
|
from esphome.components import sensor, ble_client
|
||||||
from esphome.core import CORE
|
|
||||||
|
|
||||||
from esphome.const import (
|
from esphome.const import (
|
||||||
DEVICE_CLASS_HUMIDITY,
|
DEVICE_CLASS_HUMIDITY,
|
||||||
|
@ -58,10 +57,8 @@ CONFIG_SCHEMA = cv.All(
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
.extend(cv.polling_component_schema("5mins"))
|
.extend(cv.polling_component_schema("5min"))
|
||||||
.extend(ble_client.BLE_CLIENT_SCHEMA),
|
.extend(ble_client.BLE_CLIENT_SCHEMA),
|
||||||
# Until BLEUUID reference removed
|
|
||||||
cv.only_with_arduino,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -83,6 +80,3 @@ async def to_code(config):
|
||||||
if CONF_TVOC in config:
|
if CONF_TVOC in config:
|
||||||
sens = await sensor.new_sensor(config[CONF_TVOC])
|
sens = await sensor.new_sensor(config[CONF_TVOC])
|
||||||
cg.add(var.set_tvoc(sens))
|
cg.add(var.set_tvoc(sens))
|
||||||
|
|
||||||
if CORE.is_esp32:
|
|
||||||
cg.add_library("ESP32 BLE Arduino", None)
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include "airthings_wave_plus.h"
|
#include "airthings_wave_plus.h"
|
||||||
|
|
||||||
#ifdef USE_ESP32_FRAMEWORK_ARDUINO
|
#ifdef USE_ESP32
|
||||||
|
|
||||||
namespace esphome {
|
namespace esphome {
|
||||||
namespace airthings_wave_plus {
|
namespace airthings_wave_plus {
|
||||||
|
@ -96,8 +96,6 @@ bool AirthingsWavePlus::is_valid_voc_value_(uint16_t voc) { return 0 <= voc && v
|
||||||
|
|
||||||
bool AirthingsWavePlus::is_valid_co2_value_(uint16_t co2) { return 0 <= co2 && co2 <= 16383; }
|
bool AirthingsWavePlus::is_valid_co2_value_(uint16_t co2) { return 0 <= co2 && co2 <= 16383; }
|
||||||
|
|
||||||
void AirthingsWavePlus::loop() {}
|
|
||||||
|
|
||||||
void AirthingsWavePlus::update() {
|
void AirthingsWavePlus::update() {
|
||||||
if (this->node_state != esp32_ble_tracker::ClientState::ESTABLISHED) {
|
if (this->node_state != esp32_ble_tracker::ClientState::ESTABLISHED) {
|
||||||
if (!parent()->enabled) {
|
if (!parent()->enabled) {
|
||||||
|
@ -128,17 +126,12 @@ void AirthingsWavePlus::dump_config() {
|
||||||
LOG_SENSOR(" ", "TVOC", this->tvoc_sensor_);
|
LOG_SENSOR(" ", "TVOC", this->tvoc_sensor_);
|
||||||
}
|
}
|
||||||
|
|
||||||
AirthingsWavePlus::AirthingsWavePlus() : PollingComponent(10000) {
|
AirthingsWavePlus::AirthingsWavePlus()
|
||||||
auto service_bt = *BLEUUID::fromString(std::string("b42e1c08-ade7-11e4-89d3-123b93f75cba")).getNative();
|
: PollingComponent(10000),
|
||||||
auto characteristic_bt = *BLEUUID::fromString(std::string("b42e2a68-ade7-11e4-89d3-123b93f75cba")).getNative();
|
service_uuid_(esp32_ble_tracker::ESPBTUUID::from_raw(SERVICE_UUID)),
|
||||||
|
sensors_data_characteristic_uuid_(esp32_ble_tracker::ESPBTUUID::from_raw(CHARACTERISTIC_UUID)) {}
|
||||||
service_uuid_ = esp32_ble_tracker::ESPBTUUID::from_uuid(service_bt);
|
|
||||||
sensors_data_characteristic_uuid_ = esp32_ble_tracker::ESPBTUUID::from_uuid(characteristic_bt);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AirthingsWavePlus::setup() {}
|
|
||||||
|
|
||||||
} // namespace airthings_wave_plus
|
} // namespace airthings_wave_plus
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|
||||||
#endif // USE_ESP32_FRAMEWORK_ARDUINO
|
#endif // USE_ESP32
|
||||||
|
|
|
@ -1,28 +1,28 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#ifdef USE_ESP32_FRAMEWORK_ARDUINO
|
#ifdef USE_ESP32
|
||||||
|
|
||||||
|
#include <esp_gattc_api.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <esp_gattc_api.h>
|
|
||||||
#include <BLEDevice.h>
|
|
||||||
#include "esphome/core/component.h"
|
|
||||||
#include "esphome/core/log.h"
|
|
||||||
#include "esphome/components/ble_client/ble_client.h"
|
#include "esphome/components/ble_client/ble_client.h"
|
||||||
#include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h"
|
#include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h"
|
||||||
#include "esphome/components/sensor/sensor.h"
|
#include "esphome/components/sensor/sensor.h"
|
||||||
|
#include "esphome/core/component.h"
|
||||||
|
#include "esphome/core/log.h"
|
||||||
|
|
||||||
namespace esphome {
|
namespace esphome {
|
||||||
namespace airthings_wave_plus {
|
namespace airthings_wave_plus {
|
||||||
|
|
||||||
|
static const char *const SERVICE_UUID = "b42e1c08-ade7-11e4-89d3-123b93f75cba";
|
||||||
|
static const char *const CHARACTERISTIC_UUID = "b42e2a68-ade7-11e4-89d3-123b93f75cba";
|
||||||
|
|
||||||
class AirthingsWavePlus : public PollingComponent, public ble_client::BLEClientNode {
|
class AirthingsWavePlus : public PollingComponent, public ble_client::BLEClientNode {
|
||||||
public:
|
public:
|
||||||
AirthingsWavePlus();
|
AirthingsWavePlus();
|
||||||
|
|
||||||
void setup() override;
|
|
||||||
void dump_config() override;
|
void dump_config() override;
|
||||||
void update() override;
|
void update() override;
|
||||||
void loop() override;
|
|
||||||
|
|
||||||
void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
|
void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
|
||||||
esp_ble_gattc_cb_param_t *param) override;
|
esp_ble_gattc_cb_param_t *param) override;
|
||||||
|
@ -72,4 +72,4 @@ class AirthingsWavePlus : public PollingComponent, public ble_client::BLEClientN
|
||||||
} // namespace airthings_wave_plus
|
} // namespace airthings_wave_plus
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|
||||||
#endif // USE_ESP32_FRAMEWORK_ARDUINO
|
#endif // USE_ESP32
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.components import sensor, ble_client
|
from esphome.components import sensor, ble_client
|
||||||
from esphome.core import CORE
|
|
||||||
|
|
||||||
from esphome.const import (
|
from esphome.const import (
|
||||||
DEVICE_CLASS_CARBON_DIOXIDE,
|
DEVICE_CLASS_CARBON_DIOXIDE,
|
||||||
|
@ -83,10 +82,8 @@ CONFIG_SCHEMA = cv.All(
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
.extend(cv.polling_component_schema("5mins"))
|
.extend(cv.polling_component_schema("5min"))
|
||||||
.extend(ble_client.BLE_CLIENT_SCHEMA),
|
.extend(ble_client.BLE_CLIENT_SCHEMA),
|
||||||
# Until BLEUUID reference removed
|
|
||||||
cv.only_with_arduino,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -117,6 +114,3 @@ async def to_code(config):
|
||||||
if CONF_TVOC in config:
|
if CONF_TVOC in config:
|
||||||
sens = await sensor.new_sensor(config[CONF_TVOC])
|
sens = await sensor.new_sensor(config[CONF_TVOC])
|
||||||
cg.add(var.set_tvoc(sens))
|
cg.add(var.set_tvoc(sens))
|
||||||
|
|
||||||
if CORE.is_esp32:
|
|
||||||
cg.add_library("ESP32 BLE Arduino", None)
|
|
||||||
|
|
|
@ -317,6 +317,63 @@ ESPBTUUID ESPBTUUID::from_raw(const uint8_t *data) {
|
||||||
ret.uuid_.uuid.uuid128[i] = data[i];
|
ret.uuid_.uuid.uuid128[i] = data[i];
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
ESPBTUUID ESPBTUUID::from_raw(const std::string &data) {
|
||||||
|
ESPBTUUID ret;
|
||||||
|
if (data.length() == 4) {
|
||||||
|
ret.uuid_.len = ESP_UUID_LEN_16;
|
||||||
|
ret.uuid_.uuid.uuid16 = 0;
|
||||||
|
for (int i = 0; i < data.length();) {
|
||||||
|
uint8_t msb = data.c_str()[i];
|
||||||
|
uint8_t lsb = data.c_str()[i + 1];
|
||||||
|
|
||||||
|
if (msb > '9')
|
||||||
|
msb -= 7;
|
||||||
|
if (lsb > '9')
|
||||||
|
lsb -= 7;
|
||||||
|
ret.uuid_.uuid.uuid16 += (((msb & 0x0F) << 4) | (lsb & 0x0F)) << (2 - i) * 4;
|
||||||
|
i += 2;
|
||||||
|
}
|
||||||
|
} else if (data.length() == 8) {
|
||||||
|
ret.uuid_.len = ESP_UUID_LEN_32;
|
||||||
|
ret.uuid_.uuid.uuid32 = 0;
|
||||||
|
for (int i = 0; i < data.length();) {
|
||||||
|
uint8_t msb = data.c_str()[i];
|
||||||
|
uint8_t lsb = data.c_str()[i + 1];
|
||||||
|
|
||||||
|
if (msb > '9')
|
||||||
|
msb -= 7;
|
||||||
|
if (lsb > '9')
|
||||||
|
lsb -= 7;
|
||||||
|
ret.uuid_.uuid.uuid32 += (((msb & 0x0F) << 4) | (lsb & 0x0F)) << (6 - i) * 4;
|
||||||
|
i += 2;
|
||||||
|
}
|
||||||
|
} else if (data.length() == 16) { // how we can have 16 byte length string reprezenting 128 bit uuid??? needs to be
|
||||||
|
// investigated (lack of time)
|
||||||
|
ret.uuid_.len = ESP_UUID_LEN_128;
|
||||||
|
memcpy(ret.uuid_.uuid.uuid128, (uint8_t *) data.data(), 16);
|
||||||
|
} else if (data.length() == 36) {
|
||||||
|
// If the length of the string is 36 bytes then we will assume it is a long hex string in
|
||||||
|
// UUID format.
|
||||||
|
ret.uuid_.len = ESP_UUID_LEN_128;
|
||||||
|
int n = 0;
|
||||||
|
for (int i = 0; i < data.length();) {
|
||||||
|
if (data.c_str()[i] == '-')
|
||||||
|
i++;
|
||||||
|
uint8_t msb = data.c_str()[i];
|
||||||
|
uint8_t lsb = data.c_str()[i + 1];
|
||||||
|
|
||||||
|
if (msb > '9')
|
||||||
|
msb -= 7;
|
||||||
|
if (lsb > '9')
|
||||||
|
lsb -= 7;
|
||||||
|
ret.uuid_.uuid.uuid128[15 - n++] = ((msb & 0x0F) << 4) | (lsb & 0x0F);
|
||||||
|
i += 2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ESP_LOGE(TAG, "ERROR: UUID value not 2, 4, 16 or 36 bytes - %s", data.c_str());
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
ESPBTUUID ESPBTUUID::from_uuid(esp_bt_uuid_t uuid) {
|
ESPBTUUID ESPBTUUID::from_uuid(esp_bt_uuid_t uuid) {
|
||||||
ESPBTUUID ret;
|
ESPBTUUID ret;
|
||||||
ret.uuid_.len = uuid.len;
|
ret.uuid_.len = uuid.len;
|
||||||
|
|
|
@ -25,6 +25,8 @@ class ESPBTUUID {
|
||||||
|
|
||||||
static ESPBTUUID from_raw(const uint8_t *data);
|
static ESPBTUUID from_raw(const uint8_t *data);
|
||||||
|
|
||||||
|
static ESPBTUUID from_raw(const std::string &data);
|
||||||
|
|
||||||
static ESPBTUUID from_uuid(esp_bt_uuid_t uuid);
|
static ESPBTUUID from_uuid(esp_bt_uuid_t uuid);
|
||||||
|
|
||||||
ESPBTUUID as_128bit() const;
|
ESPBTUUID as_128bit() const;
|
||||||
|
|
Loading…
Reference in a new issue