mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	[hdc2010] New component (#6674)
Co-authored-by: Keith Burzinski <kbx81x@gmail.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Co-authored-by: J. Nick Koston <nick@koston.org> Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com>
This commit is contained in:
		
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							7e5b82c5f3
						
					
				
				
					commit
					9b78098eec
				
			| @@ -201,6 +201,7 @@ esphome/components/havells_solar/* @sourabhjaiswal | |||||||
| esphome/components/hbridge/fan/* @WeekendWarrior | esphome/components/hbridge/fan/* @WeekendWarrior | ||||||
| esphome/components/hbridge/light/* @DotNetDann | esphome/components/hbridge/light/* @DotNetDann | ||||||
| esphome/components/hbridge/switch/* @dwmw2 | esphome/components/hbridge/switch/* @dwmw2 | ||||||
|  | esphome/components/hdc2010/* @optimusprimespace @ssieb | ||||||
| esphome/components/he60r/* @clydebarrow | esphome/components/he60r/* @clydebarrow | ||||||
| esphome/components/heatpumpir/* @rob-deutsch | esphome/components/heatpumpir/* @rob-deutsch | ||||||
| esphome/components/hitachi_ac424/* @sourabhjaiswal | esphome/components/hitachi_ac424/* @sourabhjaiswal | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								esphome/components/hdc2010/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								esphome/components/hdc2010/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | CODEOWNERS = ["@optimusprimespace", "@ssieb"] | ||||||
							
								
								
									
										111
									
								
								esphome/components/hdc2010/hdc2010.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								esphome/components/hdc2010/hdc2010.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,111 @@ | |||||||
|  | #include "esphome/core/hal.h" | ||||||
|  | #include "hdc2010.h" | ||||||
|  | // https://github.com/vigsterkr/homebridge-hdc2010/blob/main/src/hdc2010.js | ||||||
|  | // https://github.com/lime-labs/HDC2080-Arduino/blob/master/src/HDC2080.cpp | ||||||
|  | namespace esphome { | ||||||
|  | namespace hdc2010 { | ||||||
|  |  | ||||||
|  | static const char *const TAG = "hdc2010"; | ||||||
|  |  | ||||||
|  | static const uint8_t HDC2010_ADDRESS = 0x40;  // 0b1000000 or 0b1000001 from datasheet | ||||||
|  | static const uint8_t HDC2010_CMD_CONFIGURATION_MEASUREMENT = 0x8F; | ||||||
|  | static const uint8_t HDC2010_CMD_START_MEASUREMENT = 0xF9; | ||||||
|  | static const uint8_t HDC2010_CMD_TEMPERATURE_LOW = 0x00; | ||||||
|  | static const uint8_t HDC2010_CMD_TEMPERATURE_HIGH = 0x01; | ||||||
|  | static const uint8_t HDC2010_CMD_HUMIDITY_LOW = 0x02; | ||||||
|  | static const uint8_t HDC2010_CMD_HUMIDITY_HIGH = 0x03; | ||||||
|  | static const uint8_t CONFIG = 0x0E; | ||||||
|  | static const uint8_t MEASUREMENT_CONFIG = 0x0F; | ||||||
|  |  | ||||||
|  | void HDC2010Component::setup() { | ||||||
|  |   ESP_LOGCONFIG(TAG, "Running setup"); | ||||||
|  |  | ||||||
|  |   const uint8_t data[2] = { | ||||||
|  |       0b00000000,  // resolution 14bit for both humidity and temperature | ||||||
|  |       0b00000000   // reserved | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   if (!this->write_bytes(HDC2010_CMD_CONFIGURATION_MEASUREMENT, data, 2)) { | ||||||
|  |     ESP_LOGW(TAG, "Initial config instruction error"); | ||||||
|  |     this->status_set_warning(); | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // Set measurement mode to temperature and humidity | ||||||
|  |   uint8_t config_contents; | ||||||
|  |   this->read_register(MEASUREMENT_CONFIG, &config_contents, 1); | ||||||
|  |   config_contents = (config_contents & 0xF9);  // Always set to TEMP_AND_HUMID mode | ||||||
|  |   this->write_bytes(MEASUREMENT_CONFIG, &config_contents, 1); | ||||||
|  |  | ||||||
|  |   // Set rate to manual | ||||||
|  |   this->read_register(CONFIG, &config_contents, 1); | ||||||
|  |   config_contents &= 0x8F; | ||||||
|  |   this->write_bytes(CONFIG, &config_contents, 1); | ||||||
|  |  | ||||||
|  |   // Set temperature resolution to 14bit | ||||||
|  |   this->read_register(CONFIG, &config_contents, 1); | ||||||
|  |   config_contents &= 0x3F; | ||||||
|  |   this->write_bytes(CONFIG, &config_contents, 1); | ||||||
|  |  | ||||||
|  |   // Set humidity resolution to 14bit | ||||||
|  |   this->read_register(CONFIG, &config_contents, 1); | ||||||
|  |   config_contents &= 0xCF; | ||||||
|  |   this->write_bytes(CONFIG, &config_contents, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void HDC2010Component::dump_config() { | ||||||
|  |   ESP_LOGCONFIG(TAG, "HDC2010:"); | ||||||
|  |   LOG_I2C_DEVICE(this); | ||||||
|  |   if (this->is_failed()) { | ||||||
|  |     ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL); | ||||||
|  |   } | ||||||
|  |   LOG_UPDATE_INTERVAL(this); | ||||||
|  |   LOG_SENSOR("  ", "Temperature", this->temperature_sensor_); | ||||||
|  |   LOG_SENSOR("  ", "Humidity", this->humidity_sensor_); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void HDC2010Component::update() { | ||||||
|  |   // Trigger measurement | ||||||
|  |   uint8_t config_contents; | ||||||
|  |   this->read_register(CONFIG, &config_contents, 1); | ||||||
|  |   config_contents |= 0x01; | ||||||
|  |   this->write_bytes(MEASUREMENT_CONFIG, &config_contents, 1); | ||||||
|  |  | ||||||
|  |   // 1ms delay after triggering the sample | ||||||
|  |   set_timeout(1, [this]() { | ||||||
|  |     if (this->temperature_sensor_ != nullptr) { | ||||||
|  |       float temp = this->read_temp(); | ||||||
|  |       this->temperature_sensor_->publish_state(temp); | ||||||
|  |       ESP_LOGD(TAG, "Temp=%.1f°C", temp); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (this->humidity_sensor_ != nullptr) { | ||||||
|  |       float humidity = this->read_humidity(); | ||||||
|  |       this->humidity_sensor_->publish_state(humidity); | ||||||
|  |       ESP_LOGD(TAG, "Humidity=%.1f%%", humidity); | ||||||
|  |     } | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | float HDC2010Component::read_temp() { | ||||||
|  |   uint8_t byte[2]; | ||||||
|  |  | ||||||
|  |   this->read_register(HDC2010_CMD_TEMPERATURE_LOW, &byte[0], 1); | ||||||
|  |   this->read_register(HDC2010_CMD_TEMPERATURE_HIGH, &byte[1], 1); | ||||||
|  |  | ||||||
|  |   uint16_t temp = encode_uint16(byte[1], byte[0]); | ||||||
|  |   return (float) temp * 0.0025177f - 40.0f; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | float HDC2010Component::read_humidity() { | ||||||
|  |   uint8_t byte[2]; | ||||||
|  |  | ||||||
|  |   this->read_register(HDC2010_CMD_HUMIDITY_LOW, &byte[0], 1); | ||||||
|  |   this->read_register(HDC2010_CMD_HUMIDITY_HIGH, &byte[1], 1); | ||||||
|  |  | ||||||
|  |   uint16_t humidity = encode_uint16(byte[1], byte[0]); | ||||||
|  |   return (float) humidity * 0.001525879f; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | }  // namespace hdc2010 | ||||||
|  | }  // namespace esphome | ||||||
							
								
								
									
										32
									
								
								esphome/components/hdc2010/hdc2010.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								esphome/components/hdc2010/hdc2010.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "esphome/core/component.h" | ||||||
|  | #include "esphome/components/sensor/sensor.h" | ||||||
|  | #include "esphome/components/i2c/i2c.h" | ||||||
|  |  | ||||||
|  | namespace esphome { | ||||||
|  | namespace hdc2010 { | ||||||
|  |  | ||||||
|  | class HDC2010Component : public PollingComponent, public i2c::I2CDevice { | ||||||
|  |  public: | ||||||
|  |   void set_temperature_sensor(sensor::Sensor *temperature) { this->temperature_sensor_ = temperature; } | ||||||
|  |  | ||||||
|  |   void set_humidity_sensor(sensor::Sensor *humidity) { this->humidity_sensor_ = humidity; } | ||||||
|  |  | ||||||
|  |   /// Setup the sensor and check for connection. | ||||||
|  |   void setup() override; | ||||||
|  |   void dump_config() override; | ||||||
|  |   /// Retrieve the latest sensor values. This operation takes approximately 16ms. | ||||||
|  |   void update() override; | ||||||
|  |  | ||||||
|  |   float read_temp(); | ||||||
|  |  | ||||||
|  |   float read_humidity(); | ||||||
|  |  | ||||||
|  |  protected: | ||||||
|  |   sensor::Sensor *temperature_sensor_{nullptr}; | ||||||
|  |   sensor::Sensor *humidity_sensor_{nullptr}; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | }  // namespace hdc2010 | ||||||
|  | }  // namespace esphome | ||||||
							
								
								
									
										56
									
								
								esphome/components/hdc2010/sensor.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								esphome/components/hdc2010/sensor.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | |||||||
|  | import esphome.codegen as cg | ||||||
|  | from esphome.components import i2c, sensor | ||||||
|  | import esphome.config_validation as cv | ||||||
|  | from esphome.const import ( | ||||||
|  |     CONF_HUMIDITY, | ||||||
|  |     CONF_ID, | ||||||
|  |     CONF_TEMPERATURE, | ||||||
|  |     DEVICE_CLASS_HUMIDITY, | ||||||
|  |     DEVICE_CLASS_TEMPERATURE, | ||||||
|  |     STATE_CLASS_MEASUREMENT, | ||||||
|  |     UNIT_CELSIUS, | ||||||
|  |     UNIT_PERCENT, | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | DEPENDENCIES = ["i2c"] | ||||||
|  |  | ||||||
|  | hdc2010_ns = cg.esphome_ns.namespace("hdc2010") | ||||||
|  | HDC2010Component = hdc2010_ns.class_( | ||||||
|  |     "HDC2010Component", cg.PollingComponent, i2c.I2CDevice | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | CONFIG_SCHEMA = ( | ||||||
|  |     cv.Schema( | ||||||
|  |         { | ||||||
|  |             cv.GenerateID(): cv.declare_id(HDC2010Component), | ||||||
|  |             cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema( | ||||||
|  |                 unit_of_measurement=UNIT_CELSIUS, | ||||||
|  |                 accuracy_decimals=1, | ||||||
|  |                 device_class=DEVICE_CLASS_TEMPERATURE, | ||||||
|  |                 state_class=STATE_CLASS_MEASUREMENT, | ||||||
|  |             ), | ||||||
|  |             cv.Optional(CONF_HUMIDITY): sensor.sensor_schema( | ||||||
|  |                 unit_of_measurement=UNIT_PERCENT, | ||||||
|  |                 accuracy_decimals=0, | ||||||
|  |                 device_class=DEVICE_CLASS_HUMIDITY, | ||||||
|  |                 state_class=STATE_CLASS_MEASUREMENT, | ||||||
|  |             ), | ||||||
|  |         } | ||||||
|  |     ) | ||||||
|  |     .extend(cv.polling_component_schema("60s")) | ||||||
|  |     .extend(i2c.i2c_device_schema(0x40)) | ||||||
|  | ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | async def to_code(config): | ||||||
|  |     var = cg.new_Pvariable(config[CONF_ID]) | ||||||
|  |     await cg.register_component(var, config) | ||||||
|  |     await i2c.register_i2c_device(var, config) | ||||||
|  |  | ||||||
|  |     if temperature_config := config.get(CONF_TEMPERATURE): | ||||||
|  |         sens = await sensor.new_sensor(temperature_config) | ||||||
|  |         cg.add(var.set_temperature_sensor(sens)) | ||||||
|  |  | ||||||
|  |     if humidity_config := config.get(CONF_HUMIDITY): | ||||||
|  |         sens = await sensor.new_sensor(humidity_config) | ||||||
|  |         cg.add(var.set_humidity_sensor(sens)) | ||||||
							
								
								
									
										7
									
								
								tests/components/hdc2010/common.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								tests/components/hdc2010/common.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | |||||||
|  | sensor: | ||||||
|  |   - platform: hdc2010 | ||||||
|  |     i2c_id: i2c_bus | ||||||
|  |     temperature: | ||||||
|  |       name: Temperature | ||||||
|  |     humidity: | ||||||
|  |       name: Humidity | ||||||
							
								
								
									
										4
									
								
								tests/components/hdc2010/test.esp32-c3-idf.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								tests/components/hdc2010/test.esp32-c3-idf.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | packages: | ||||||
|  |   i2c: !include ../../test_build_components/common/i2c/esp32-c3-idf.yaml | ||||||
|  |  | ||||||
|  | <<: !include common.yaml | ||||||
							
								
								
									
										4
									
								
								tests/components/hdc2010/test.esp32-idf.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								tests/components/hdc2010/test.esp32-idf.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | packages: | ||||||
|  |   i2c: !include ../../test_build_components/common/i2c/esp32-idf.yaml | ||||||
|  |  | ||||||
|  | <<: !include common.yaml | ||||||
							
								
								
									
										4
									
								
								tests/components/hdc2010/test.esp8266-ard.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								tests/components/hdc2010/test.esp8266-ard.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | packages: | ||||||
|  |   i2c: !include ../../test_build_components/common/i2c/esp8266-ard.yaml | ||||||
|  |  | ||||||
|  | <<: !include common.yaml | ||||||
							
								
								
									
										4
									
								
								tests/components/hdc2010/test.rp2040-ard.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								tests/components/hdc2010/test.rp2040-ard.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | packages: | ||||||
|  |   i2c: !include ../../test_build_components/common/i2c/rp2040-ard.yaml | ||||||
|  |  | ||||||
|  | <<: !include common.yaml | ||||||
		Reference in New Issue
	
	Block a user