From d97a9bf8e89689ec948c0cf5c391826efe14865d Mon Sep 17 00:00:00 2001 From: Tim Savage Date: Tue, 27 Oct 2020 05:00:43 +1100 Subject: [PATCH] Added tmp102 temperature sensor support (#929) * Added tmp102 temperature sensor support * Added sensor to test3.yaml * Moved docstring to component root * Tweak formatting from clang-format script * Removed extra newline at the end of the file to satisfy pylint * Update schema to match that of other single-value sensors In ESPHome, sensors that only expose one value do not put the sensor under another key. * Add missing import * Fix test after structural change to component * removed unused setting * Update esphome/components/tmp102/tmp102.cpp Co-authored-by: Otto Winter Co-authored-by: Guillermo Ruffino Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- esphome/components/tmp102/__init__.py | 9 +++++ esphome/components/tmp102/sensor.py | 30 +++++++++++++++++ esphome/components/tmp102/tmp102.cpp | 47 +++++++++++++++++++++++++++ esphome/components/tmp102/tmp102.h | 22 +++++++++++++ tests/test3.yaml | 2 ++ 5 files changed, 110 insertions(+) create mode 100644 esphome/components/tmp102/__init__.py create mode 100644 esphome/components/tmp102/sensor.py create mode 100644 esphome/components/tmp102/tmp102.cpp create mode 100644 esphome/components/tmp102/tmp102.h diff --git a/esphome/components/tmp102/__init__.py b/esphome/components/tmp102/__init__.py new file mode 100644 index 0000000000..3e32a230f2 --- /dev/null +++ b/esphome/components/tmp102/__init__.py @@ -0,0 +1,9 @@ +""" +The TMP102 is a two-wire, serial output temperature +sensor available in a tiny SOT563 package. Requiring +no external components, the TMP102 is capable of +reading temperatures to a resolution of 0.0625°C. + +https://www.sparkfun.com/datasheets/Sensors/Temperature/tmp102.pdf + +""" diff --git a/esphome/components/tmp102/sensor.py b/esphome/components/tmp102/sensor.py new file mode 100644 index 0000000000..fc59decf63 --- /dev/null +++ b/esphome/components/tmp102/sensor.py @@ -0,0 +1,30 @@ +""" +The TMP102 is a two-wire, serial output temperature +sensor available in a tiny SOT563 package. Requiring +no external components, the TMP102 is capable of +reading temperatures to a resolution of 0.0625°C. + +https://www.sparkfun.com/datasheets/Sensors/Temperature/tmp102.pdf + +""" +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.components import i2c, sensor +from esphome.const import CONF_ID, UNIT_CELSIUS, ICON_THERMOMETER + +DEPENDENCIES = ['i2c'] + +tmp102_ns = cg.esphome_ns.namespace('tmp102') +TMP102Component = tmp102_ns.class_("TMP102Component", cg.PollingComponent, i2c.I2CDevice, + sensor.Sensor) + +CONFIG_SCHEMA = sensor.sensor_schema(UNIT_CELSIUS, ICON_THERMOMETER, 1).extend({ + cv.GenerateID(): cv.declare_id(TMP102Component), +}).extend(cv.polling_component_schema("60s")).extend(i2c.i2c_device_schema(0x48)) + + +def to_code(config): + var = cg.new_Pvariable(config[CONF_ID]) + yield cg.register_component(var, config) + yield i2c.register_i2c_device(var, config) + yield sensor.register_sensor(var, config) diff --git a/esphome/components/tmp102/tmp102.cpp b/esphome/components/tmp102/tmp102.cpp new file mode 100644 index 0000000000..204c4f0805 --- /dev/null +++ b/esphome/components/tmp102/tmp102.cpp @@ -0,0 +1,47 @@ +#include "tmp102.h" +#include "esphome/core/log.h" + +namespace esphome { +namespace tmp102 { + +static const char *TAG = "tmp102"; + +static const uint8_t TMP102_ADDRESS = 0x48; +static const uint8_t TMP102_REGISTER_TEMPERATURE = 0x00; +static const uint8_t TMP102_REGISTER_CONFIGURATION = 0x01; +static const uint8_t TMP102_REGISTER_LOW_LIMIT = 0x02; +static const uint8_t TMP102_REGISTER_HIGH_LIMIT = 0x03; + +static const float TMP102_CONVERSION_FACTOR = 0.0625; + +void TMP102Component::setup() { ESP_LOGCONFIG(TAG, "Setting up TMP102..."); } + +void TMP102Component::dump_config() { + ESP_LOGCONFIG(TAG, "TMP102:"); + LOG_I2C_DEVICE(this); + if (this->is_failed()) { + ESP_LOGE(TAG, "Communication with TMP102 failed!"); + } + LOG_UPDATE_INTERVAL(this); + LOG_SENSOR(" ", "Temperature", this); +} + +void TMP102Component::update() { + uint16_t raw_temperature; + if (!this->read_byte_16(TMP102_REGISTER_TEMPERATURE, &raw_temperature, 50)) { + this->status_set_warning(); + return; + } + + raw_temperature = raw_temperature >> 4; + float temperature = raw_temperature * TMP102_CONVERSION_FACTOR; + ESP_LOGD(TAG, "Got Temperature=%.1f°C", temperature); + + this->publish_state(temperature); + this->status_clear_warning(); +} + +float TMP102Component::get_setup_priority() const { return setup_priority::DATA; } + +} // namespace tmp102 +} // namespace esphome diff --git a/esphome/components/tmp102/tmp102.h b/esphome/components/tmp102/tmp102.h new file mode 100644 index 0000000000..1bbb2d5ae3 --- /dev/null +++ b/esphome/components/tmp102/tmp102.h @@ -0,0 +1,22 @@ +#pragma once + +#include "esphome/core/component.h" +#include "esphome/components/sensor/sensor.h" +#include "esphome/components/i2c/i2c.h" + +namespace esphome { +namespace tmp102 { + +class TMP102Component : public PollingComponent, public i2c::I2CDevice, public sensor::Sensor { + public: + /// Setup (reset) the sensor and check connection. + void setup() override; + void dump_config() override; + /// Update the sensor values (temperature) + void update() override; + + float get_setup_priority() const override; +}; + +} // namespace tmp102 +} // namespace esphome diff --git a/tests/test3.yaml b/tests/test3.yaml index 550f7baf6f..53484bec6a 100644 --- a/tests/test3.yaml +++ b/tests/test3.yaml @@ -375,6 +375,8 @@ sensor: name: "PZEMDC Current" power: name: "PZEMDC Power" + - platform: tmp102 + name: "TMP102 Temperature" - platform: hm3301 pm_1_0: name: "PM1.0"