mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	Add support for IBS-TH1 External Sensor (#1983)
This commit is contained in:
		| @@ -11,6 +11,7 @@ static const char *const TAG = "inkbird_ibsth1_mini"; | |||||||
| void InkbirdIBSTH1_MINI::dump_config() { | void InkbirdIBSTH1_MINI::dump_config() { | ||||||
|   ESP_LOGCONFIG(TAG, "Inkbird IBS TH1 MINI"); |   ESP_LOGCONFIG(TAG, "Inkbird IBS TH1 MINI"); | ||||||
|   LOG_SENSOR("  ", "Temperature", this->temperature_); |   LOG_SENSOR("  ", "Temperature", this->temperature_); | ||||||
|  |   LOG_SENSOR("  ", "External Temperature", this->external_temperature_); | ||||||
|   LOG_SENSOR("  ", "Humidity", this->humidity_); |   LOG_SENSOR("  ", "Humidity", this->humidity_); | ||||||
|   LOG_SENSOR("  ", "Battery Level", this->battery_level_); |   LOG_SENSOR("  ", "Battery Level", this->battery_level_); | ||||||
| } | } | ||||||
| @@ -54,7 +55,7 @@ bool InkbirdIBSTH1_MINI::parse_device(const esp32_ble_tracker::ESPBTDevice &devi | |||||||
|     ESP_LOGVV(TAG, "parse_device(): manufacturer data element length is expected to be of length 7"); |     ESP_LOGVV(TAG, "parse_device(): manufacturer data element length is expected to be of length 7"); | ||||||
|     return false; |     return false; | ||||||
|   } |   } | ||||||
|   if ((mnfData.data[2] != 0) || (mnfData.data[6] != 8)) { |   if (mnfData.data[6] != 8) { | ||||||
|     ESP_LOGVV(TAG, "parse_device(): unexpected data"); |     ESP_LOGVV(TAG, "parse_device(): unexpected data"); | ||||||
|     return false; |     return false; | ||||||
|   } |   } | ||||||
| @@ -63,13 +64,36 @@ bool InkbirdIBSTH1_MINI::parse_device(const esp32_ble_tracker::ESPBTDevice &devi | |||||||
|   // data[5] is a battery level |   // data[5] is a battery level | ||||||
|   // data[0] and data[1] is humidity * 100 (in pct) |   // data[0] and data[1] is humidity * 100 (in pct) | ||||||
|   // uuid is a temperature * 100 (in Celcius) |   // uuid is a temperature * 100 (in Celcius) | ||||||
|  |   // when data[2] == 0 temperature is from internal sensor (IBS-TH1 or IBS-TH1 Mini) | ||||||
|  |   // when data[2] == 1 temperature is from external sensor (IBS-TH1 only) | ||||||
|  |  | ||||||
|  |   // Create empty variables to pass automatic checks | ||||||
|  |   auto temperature = NAN; | ||||||
|  |   auto external_temperature = NAN; | ||||||
|  |  | ||||||
|  |   // Read bluetooth data into variable | ||||||
|  |   auto measured_temperature = mnfData.uuid.get_uuid().uuid.uuid16 / 100.0f; | ||||||
|  |  | ||||||
|  |   // Set temperature or external_temperature based on which sensor is in use | ||||||
|  |   if (mnfData.data[2] == 0) { | ||||||
|  |     temperature = measured_temperature; | ||||||
|  |   } else if (mnfData.data[2] == 1) { | ||||||
|  |     external_temperature = measured_temperature; | ||||||
|  |   } else { | ||||||
|  |     ESP_LOGVV(TAG, "parse_device(): unknown sensor type"); | ||||||
|  |     return false; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   auto battery_level = mnfData.data[5]; |   auto battery_level = mnfData.data[5]; | ||||||
|   auto temperature = mnfData.uuid.get_uuid().uuid.uuid16 / 100.0f; |  | ||||||
|   auto humidity = ((mnfData.data[1] << 8) + mnfData.data[0]) / 100.0f; |   auto humidity = ((mnfData.data[1] << 8) + mnfData.data[0]) / 100.0f; | ||||||
|  |  | ||||||
|   if (this->temperature_ != nullptr) { |   // Send temperature only if the value is set | ||||||
|  |   if (!isnan(temperature) && this->temperature_ != nullptr) { | ||||||
|     this->temperature_->publish_state(temperature); |     this->temperature_->publish_state(temperature); | ||||||
|   } |   } | ||||||
|  |   if (!isnan(external_temperature) && this->external_temperature_ != nullptr) { | ||||||
|  |     this->external_temperature_->publish_state(external_temperature); | ||||||
|  |   } | ||||||
|   if (this->humidity_ != nullptr) { |   if (this->humidity_ != nullptr) { | ||||||
|     this->humidity_->publish_state(humidity); |     this->humidity_->publish_state(humidity); | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -18,12 +18,14 @@ class InkbirdIBSTH1_MINI : public Component, public esp32_ble_tracker::ESPBTDevi | |||||||
|   void dump_config() override; |   void dump_config() override; | ||||||
|   float get_setup_priority() const override { return setup_priority::DATA; } |   float get_setup_priority() const override { return setup_priority::DATA; } | ||||||
|   void set_temperature(sensor::Sensor *temperature) { temperature_ = temperature; } |   void set_temperature(sensor::Sensor *temperature) { temperature_ = temperature; } | ||||||
|  |   void set_external_temperature(sensor::Sensor *external_temperature) { external_temperature_ = external_temperature; } | ||||||
|   void set_humidity(sensor::Sensor *humidity) { humidity_ = humidity; } |   void set_humidity(sensor::Sensor *humidity) { humidity_ = humidity; } | ||||||
|   void set_battery_level(sensor::Sensor *battery_level) { battery_level_ = battery_level; } |   void set_battery_level(sensor::Sensor *battery_level) { battery_level_ = battery_level; } | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
|   uint64_t address_; |   uint64_t address_; | ||||||
|   sensor::Sensor *temperature_{nullptr}; |   sensor::Sensor *temperature_{nullptr}; | ||||||
|  |   sensor::Sensor *external_temperature_{nullptr}; | ||||||
|   sensor::Sensor *humidity_{nullptr}; |   sensor::Sensor *humidity_{nullptr}; | ||||||
|   sensor::Sensor *battery_level_{nullptr}; |   sensor::Sensor *battery_level_{nullptr}; | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -19,6 +19,8 @@ from esphome.const import ( | |||||||
| CODEOWNERS = ["@fkirill"] | CODEOWNERS = ["@fkirill"] | ||||||
| DEPENDENCIES = ["esp32_ble_tracker"] | DEPENDENCIES = ["esp32_ble_tracker"] | ||||||
|  |  | ||||||
|  | CONF_EXTERNAL_TEMPERATURE = "external_temperature" | ||||||
|  |  | ||||||
| inkbird_ibsth1_mini_ns = cg.esphome_ns.namespace("inkbird_ibsth1_mini") | inkbird_ibsth1_mini_ns = cg.esphome_ns.namespace("inkbird_ibsth1_mini") | ||||||
| InkbirdUBSTH1_MINI = inkbird_ibsth1_mini_ns.class_( | InkbirdUBSTH1_MINI = inkbird_ibsth1_mini_ns.class_( | ||||||
|     "InkbirdIBSTH1_MINI", esp32_ble_tracker.ESPBTDeviceListener, cg.Component |     "InkbirdIBSTH1_MINI", esp32_ble_tracker.ESPBTDeviceListener, cg.Component | ||||||
| @@ -36,6 +38,13 @@ CONFIG_SCHEMA = ( | |||||||
|                 DEVICE_CLASS_TEMPERATURE, |                 DEVICE_CLASS_TEMPERATURE, | ||||||
|                 STATE_CLASS_MEASUREMENT, |                 STATE_CLASS_MEASUREMENT, | ||||||
|             ), |             ), | ||||||
|  |             cv.Optional(CONF_EXTERNAL_TEMPERATURE): sensor.sensor_schema( | ||||||
|  |                 UNIT_CELSIUS, | ||||||
|  |                 ICON_EMPTY, | ||||||
|  |                 1, | ||||||
|  |                 DEVICE_CLASS_TEMPERATURE, | ||||||
|  |                 STATE_CLASS_MEASUREMENT, | ||||||
|  |             ), | ||||||
|             cv.Optional(CONF_HUMIDITY): sensor.sensor_schema( |             cv.Optional(CONF_HUMIDITY): sensor.sensor_schema( | ||||||
|                 UNIT_PERCENT, |                 UNIT_PERCENT, | ||||||
|                 ICON_EMPTY, |                 ICON_EMPTY, | ||||||
| @@ -67,6 +76,9 @@ async def to_code(config): | |||||||
|     if CONF_TEMPERATURE in config: |     if CONF_TEMPERATURE in config: | ||||||
|         sens = await sensor.new_sensor(config[CONF_TEMPERATURE]) |         sens = await sensor.new_sensor(config[CONF_TEMPERATURE]) | ||||||
|         cg.add(var.set_temperature(sens)) |         cg.add(var.set_temperature(sens)) | ||||||
|  |     if CONF_EXTERNAL_TEMPERATURE in config: | ||||||
|  |         sens = await sensor.new_sensor(config[CONF_EXTERNAL_TEMPERATURE]) | ||||||
|  |         cg.add(var.set_external_temperature(sens)) | ||||||
|     if CONF_HUMIDITY in config: |     if CONF_HUMIDITY in config: | ||||||
|         sens = await sensor.new_sensor(config[CONF_HUMIDITY]) |         sens = await sensor.new_sensor(config[CONF_HUMIDITY]) | ||||||
|         cg.add(var.set_humidity(sens)) |         cg.add(var.set_humidity(sens)) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user