This commit is contained in:
Otto Winter
2019-05-08 09:58:03 +02:00
parent c3d4ef284d
commit 521c080989
41 changed files with 396 additions and 148 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ from esphome.components import i2c
from esphome.const import CONF_ID
DEPENDENCIES = ['i2c']
AUTO_LOAD = ['sensor']
AUTO_LOAD = ['sensor', 'voltage_sampler']
MULTI_CONF = True
ads1115_ns = cg.esphome_ns.namespace('ads1115')
+19 -9
View File
@@ -59,7 +59,9 @@ void ADS1115Component::setup() {
}
for (auto *sensor : this->sensors_) {
this->set_interval(sensor->get_name(), sensor->update_interval(),
[this, sensor] { this->request_measurement_(sensor); });
[this, sensor] {
this->request_measurement_(sensor);
});
}
}
void ADS1115Component::dump_config() {
@@ -76,11 +78,11 @@ void ADS1115Component::dump_config() {
}
}
float ADS1115Component::get_setup_priority() const { return setup_priority::DATA; }
void ADS1115Component::request_measurement_(ADS1115Sensor *sensor) {
float ADS1115Component::request_measurement_(ADS1115Sensor *sensor) {
uint16_t config;
if (!this->read_byte_16(ADS1115_REGISTER_CONFIG, &config)) {
this->status_set_warning();
return;
return NAN;
}
// Multiplexer
// 0bxBBBxxxxxxxxxxxx
@@ -96,7 +98,7 @@ void ADS1115Component::request_measurement_(ADS1115Sensor *sensor) {
if (!this->write_byte_16(ADS1115_REGISTER_CONFIG, config)) {
this->status_set_warning();
return;
return NAN;
}
// about 1.6 ms with 860 samples per second
@@ -107,7 +109,7 @@ void ADS1115Component::request_measurement_(ADS1115Sensor *sensor) {
if (millis() - start > 100) {
ESP_LOGW(TAG, "Reading ADS1115 timed out");
this->status_set_warning();
return;
return NAN;
}
yield();
}
@@ -115,7 +117,7 @@ void ADS1115Component::request_measurement_(ADS1115Sensor *sensor) {
uint16_t raw_conversion;
if (!this->read_byte_16(ADS1115_REGISTER_CONVERSION, &raw_conversion)) {
this->status_set_warning();
return;
return NAN;
}
auto signed_conversion = static_cast<int16_t>(raw_conversion);
@@ -143,16 +145,24 @@ void ADS1115Component::request_measurement_(ADS1115Sensor *sensor) {
millivolts = NAN;
}
float v = millivolts / 1000.0f;
ESP_LOGD(TAG, "'%s': Got Voltage=%fV", sensor->get_name().c_str(), v);
sensor->publish_state(v);
this->status_clear_warning();
return millivolts / 1e4f;
}
uint8_t ADS1115Sensor::get_multiplexer() const { return this->multiplexer_; }
void ADS1115Sensor::set_multiplexer(ADS1115Multiplexer multiplexer) { this->multiplexer_ = multiplexer; }
uint8_t ADS1115Sensor::get_gain() const { return this->gain_; }
void ADS1115Sensor::set_gain(ADS1115Gain gain) { this->gain_ = gain; }
float ADS1115Sensor::sample() {
return this->parent_->request_measurement_(this);
}
void ADS1115Sensor::update() {
float v = this->parent_->request_measurement_(this);
if (!isnan(v)) {
ESP_LOGD(TAG, "'%s': Got Voltage=%fV", this->get_name().c_str(), v);
this->publish_state(v);
}
}
} // namespace ads1115
} // namespace esphome
+9 -6
View File
@@ -3,6 +3,7 @@
#include "esphome/core/component.h"
#include "esphome/components/sensor/sensor.h"
#include "esphome/components/i2c/i2c.h"
#include "esphome/components/voltage_sampler/voltage_sampler.h"
namespace esphome {
namespace ads1115 {
@@ -38,28 +39,30 @@ class ADS1115Component : public Component, public i2c::I2CDevice {
/// HARDWARE_LATE setup priority
float get_setup_priority() const override;
protected:
/// Helper method to request a measurement from a sensor.
void request_measurement_(ADS1115Sensor *sensor);
float request_measurement_(ADS1115Sensor *sensor);
protected:
std::vector<ADS1115Sensor *> sensors_;
};
/// Internal holder class that is in instance of Sensor so that the hub can create individual sensors.
class ADS1115Sensor : public sensor::Sensor {
class ADS1115Sensor : public sensor::Sensor, public PollingComponent,
public voltage_sampler::VoltageSampler {
public:
ADS1115Sensor(ADS1115Component *parent) : parent_(parent) {}
void update() override;
void set_multiplexer(ADS1115Multiplexer multiplexer);
void set_gain(ADS1115Gain gain);
// ========== INTERNAL METHODS ==========
// (In most use cases you won't need these)
float sample() override;
uint8_t get_multiplexer() const;
uint8_t get_gain() const;
protected:
ADS1115Component *parent_;
ADS1115Multiplexer multiplexer_;
ADS1115Gain gain_;
uint32_t update_interval_;
};
} // namespace ads1115
+7 -5
View File
@@ -1,6 +1,6 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.components import sensor
from esphome.components import sensor, voltage_sampler
from esphome.components.ads1115 import ADS1115Component
from esphome.const import CONF_GAIN, CONF_MULTIPLEXER, ICON_FLASH, UNIT_VOLT, CONF_ID
from esphome.py_compat import string_types
@@ -40,7 +40,8 @@ def validate_gain(value):
return cv.enum(GAIN)(value)
ADS1115Sensor = ads1115_ns.class_('ADS1115Sensor', sensor.Sensor)
ADS1115Sensor = ads1115_ns.class_('ADS1115Sensor', sensor.Sensor, cg.PollingComponent,
voltage_sampler.VoltageSampler)
CONF_ADS1115_ID = 'ads1115_id'
CONFIG_SCHEMA = sensor.sensor_schema(UNIT_VOLT, ICON_FLASH, 3).extend({
@@ -52,11 +53,12 @@ CONFIG_SCHEMA = sensor.sensor_schema(UNIT_VOLT, ICON_FLASH, 3).extend({
def to_code(config):
var = cg.new_Pvariable(config[CONF_ID])
paren = yield cg.get_variable(config[CONF_ADS1115_ID])
var = cg.new_Pvariable(config[CONF_ID], paren)
yield sensor.register_sensor(var, config)
yield cg.register_component(var, config)
cg.add(var.set_multiplexer(config[CONF_MULTIPLEXER]))
cg.add(var.set_gain(config[CONF_GAIN]))
hub = yield cg.get_variable(config[CONF_ADS1115_ID])
cg.add(hub.register_sensor(var))
cg.add(paren.register_sensor(var))