1
0
mirror of https://github.com/esphome/esphome.git synced 2025-03-22 18:48:14 +00:00

Merge branch 'esphome:dev' into mcp4461

This commit is contained in:
Oliver Kleinecke 2025-02-10 19:19:13 +01:00 committed by GitHub
commit 36f8d21cfc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
679 changed files with 5672 additions and 11177 deletions

View File

@ -45,6 +45,6 @@ repos:
hooks:
- id: pylint
name: pylint
entry: python script/run-in-env pylint
entry: python3 script/run-in-env.py pylint
language: system
types: [python]

View File

@ -242,6 +242,7 @@ esphome/components/lightwaverf/* @max246
esphome/components/lilygo_t5_47/touchscreen/* @jesserockz
esphome/components/lock/* @esphome/core
esphome/components/logger/* @esphome/core
esphome/components/logger/select/* @clydebarrow
esphome/components/ltr390/* @latonita @sjtrny
esphome/components/ltr501/* @latonita
esphome/components/ltr_als_ps/* @latonita

View File

@ -1,12 +1,14 @@
# Contributing to ESPHome
# Contributing to ESPHome [![Discord Chat](https://img.shields.io/discord/429907082951524364.svg)](https://discord.gg/KhAMKrd) [![GitHub release](https://img.shields.io/github/release/esphome/esphome.svg)](https://GitHub.com/esphome/esphome/releases/)
For a detailed guide, please see https://esphome.io/guides/contributing.html#contributing-to-esphome
We welcome contributions to the ESPHome suite of code and documentation!
Things to note when contributing:
Please read our [contributing guide](https://esphome.io/guides/contributing.html) if you wish to contribute to the
project and be sure to join us on [Discord](https://discord.gg/KhAMKrd).
- Please test your changes :)
- If a new feature is added or an existing user-facing feature is changed, you should also
update the [docs](https://github.com/esphome/esphome-docs). See [contributing to esphome-docs](https://esphome.io/guides/contributing.html#contributing-to-esphomedocs)
for more information.
- Please also update the tests in the `tests/` folder. You can do so by just adding a line in one of the YAML files
which checks if your new feature compiles correctly.
**See also:**
[Documentation](https://esphome.io) -- [Issues](https://github.com/esphome/issues/issues) -- [Feature requests](https://github.com/esphome/feature-requests/issues)
---
[![ESPHome - A project from the Open Home Foundation](https://www.openhomefoundation.org/badges/esphome.png)](https://www.openhomefoundation.org/)

View File

@ -7,10 +7,10 @@
</picture>
</a>
**Documentation:** https://esphome.io/
---
For issues, please go to [the issue tracker](https://github.com/esphome/issues/issues).
[Documentation](https://esphome.io) -- [Issues](https://github.com/esphome/issues/issues) -- [Feature requests](https://github.com/esphome/feature-requests/issues)
For feature requests, please see [feature requests](https://github.com/esphome/feature-requests/issues).
---
[![ESPHome - A project from the Open Home Foundation](https://www.openhomefoundation.org/badges/esphome.png)](https://www.openhomefoundation.org/)

View File

@ -36,6 +36,14 @@ ATTENUATION_MODES = {
"auto": "auto",
}
sampling_mode = adc_ns.enum("SamplingMode", is_class=True)
SAMPLING_MODES = {
"avg": sampling_mode.AVG,
"min": sampling_mode.MIN,
"max": sampling_mode.MAX,
}
adc1_channel_t = cg.global_ns.enum("adc1_channel_t")
adc2_channel_t = cg.global_ns.enum("adc2_channel_t")

View File

@ -28,6 +28,21 @@ static const adc_atten_t ADC_ATTEN_DB_12_COMPAT = ADC_ATTEN_DB_11;
#endif
#endif // USE_ESP32
enum class SamplingMode : uint8_t { AVG = 0, MIN = 1, MAX = 2 };
const LogString *sampling_mode_to_str(SamplingMode mode);
class Aggregator {
public:
void add_sample(uint32_t value);
uint32_t aggregate();
Aggregator(SamplingMode mode);
protected:
SamplingMode mode_{SamplingMode::AVG};
uint32_t aggr_{0};
uint32_t samples_{0};
};
class ADCSensor : public sensor::Sensor, public PollingComponent, public voltage_sampler::VoltageSampler {
public:
#ifdef USE_ESP32
@ -54,6 +69,7 @@ class ADCSensor : public sensor::Sensor, public PollingComponent, public voltage
void set_pin(InternalGPIOPin *pin) { this->pin_ = pin; }
void set_output_raw(bool output_raw) { this->output_raw_ = output_raw; }
void set_sample_count(uint8_t sample_count);
void set_sampling_mode(SamplingMode sampling_mode);
float sample() override;
#ifdef USE_ESP8266
@ -68,6 +84,7 @@ class ADCSensor : public sensor::Sensor, public PollingComponent, public voltage
InternalGPIOPin *pin_;
bool output_raw_{false};
uint8_t sample_count_{1};
SamplingMode sampling_mode_{SamplingMode::AVG};
#ifdef USE_RP2040
bool is_temperature_{false};

View File

@ -6,6 +6,59 @@ namespace adc {
static const char *const TAG = "adc.common";
const LogString *sampling_mode_to_str(SamplingMode mode) {
switch (mode) {
case SamplingMode::AVG:
return LOG_STR("average");
case SamplingMode::MIN:
return LOG_STR("minimum");
case SamplingMode::MAX:
return LOG_STR("maximum");
}
return LOG_STR("unknown");
}
Aggregator::Aggregator(SamplingMode mode) {
this->mode_ = mode;
// set to max uint if mode is "min"
if (mode == SamplingMode::MIN) {
this->aggr_ = UINT32_MAX;
}
}
void Aggregator::add_sample(uint32_t value) {
this->samples_ += 1;
switch (this->mode_) {
case SamplingMode::AVG:
this->aggr_ += value;
break;
case SamplingMode::MIN:
if (value < this->aggr_) {
this->aggr_ = value;
}
break;
case SamplingMode::MAX:
if (value > this->aggr_) {
this->aggr_ = value;
}
}
}
uint32_t Aggregator::aggregate() {
if (this->mode_ == SamplingMode::AVG) {
if (this->samples_ == 0) {
return this->aggr_;
}
return (this->aggr_ + (this->samples_ >> 1)) / this->samples_; // NOLINT(clang-analyzer-core.DivideZero)
}
return this->aggr_;
}
void ADCSensor::update() {
float value_v = this->sample();
ESP_LOGV(TAG, "'%s': Got voltage=%.4fV", this->get_name().c_str(), value_v);
@ -18,6 +71,8 @@ void ADCSensor::set_sample_count(uint8_t sample_count) {
}
}
void ADCSensor::set_sampling_mode(SamplingMode sampling_mode) { this->sampling_mode_ = sampling_mode; }
float ADCSensor::get_setup_priority() const { return setup_priority::DATA; }
} // namespace adc

View File

@ -78,12 +78,14 @@ void ADCSensor::dump_config() {
}
}
ESP_LOGCONFIG(TAG, " Samples: %i", this->sample_count_);
ESP_LOGCONFIG(TAG, " Sampling mode: %s", LOG_STR_ARG(sampling_mode_to_str(this->sampling_mode_)));
LOG_UPDATE_INTERVAL(this);
}
float ADCSensor::sample() {
if (!this->autorange_) {
uint32_t sum = 0;
auto aggr = Aggregator(this->sampling_mode_);
for (uint8_t sample = 0; sample < this->sample_count_; sample++) {
int raw = -1;
if (this->channel1_ != ADC1_CHANNEL_MAX) {
@ -94,13 +96,14 @@ float ADCSensor::sample() {
if (raw == -1) {
return NAN;
}
sum += raw;
aggr.add_sample(raw);
}
sum = (sum + (this->sample_count_ >> 1)) / this->sample_count_; // NOLINT(clang-analyzer-core.DivideZero)
if (this->output_raw_) {
return sum;
return aggr.aggregate();
}
uint32_t mv = esp_adc_cal_raw_to_voltage(sum, &this->cal_characteristics_[(int32_t) this->attenuation_]);
uint32_t mv =
esp_adc_cal_raw_to_voltage(aggr.aggregate(), &this->cal_characteristics_[(int32_t) this->attenuation_]);
return mv / 1000.0f;
}

View File

@ -31,23 +31,27 @@ void ADCSensor::dump_config() {
LOG_PIN(" Pin: ", this->pin_);
#endif // USE_ADC_SENSOR_VCC
ESP_LOGCONFIG(TAG, " Samples: %i", this->sample_count_);
ESP_LOGCONFIG(TAG, " Sampling mode: %s", LOG_STR_ARG(sampling_mode_to_str(this->sampling_mode_)));
LOG_UPDATE_INTERVAL(this);
}
float ADCSensor::sample() {
uint32_t raw = 0;
auto aggr = Aggregator(this->sampling_mode_);
for (uint8_t sample = 0; sample < this->sample_count_; sample++) {
uint32_t raw = 0;
#ifdef USE_ADC_SENSOR_VCC
raw += ESP.getVcc(); // NOLINT(readability-static-accessed-through-instance)
raw = ESP.getVcc(); // NOLINT(readability-static-accessed-through-instance)
#else
raw += analogRead(this->pin_->get_pin()); // NOLINT
raw = analogRead(this->pin_->get_pin()); // NOLINT
#endif // USE_ADC_SENSOR_VCC
aggr.add_sample(raw);
}
raw = (raw + (this->sample_count_ >> 1)) / this->sample_count_; // NOLINT(clang-analyzer-core.DivideZero)
if (this->output_raw_) {
return raw;
return aggr.aggregate();
}
return raw / 1024.0f;
return aggr.aggregate() / 1024.0f;
}
std::string ADCSensor::unique_id() { return get_mac_address() + "-adc"; }

View File

@ -23,23 +23,28 @@ void ADCSensor::dump_config() {
LOG_PIN(" Pin: ", this->pin_);
#endif // USE_ADC_SENSOR_VCC
ESP_LOGCONFIG(TAG, " Samples: %i", this->sample_count_);
ESP_LOGCONFIG(TAG, " Sampling mode: %s", LOG_STR_ARG(sampling_mode_to_str(this->sampling_mode_)));
LOG_UPDATE_INTERVAL(this);
}
float ADCSensor::sample() {
uint32_t raw = 0;
auto aggr = Aggregator(this->sampling_mode_);
if (this->output_raw_) {
for (uint8_t sample = 0; sample < this->sample_count_; sample++) {
raw += analogRead(this->pin_->get_pin()); // NOLINT
raw = analogRead(this->pin_->get_pin()); // NOLINT
aggr.add_sample(raw);
}
raw = (raw + (this->sample_count_ >> 1)) / this->sample_count_; // NOLINT(clang-analyzer-core.DivideZero)
return raw;
return aggr.aggregate();
}
for (uint8_t sample = 0; sample < this->sample_count_; sample++) {
raw += analogReadVoltage(this->pin_->get_pin()); // NOLINT
raw = analogReadVoltage(this->pin_->get_pin()); // NOLINT
aggr.add_sample(raw);
}
raw = (raw + (this->sample_count_ >> 1)) / this->sample_count_; // NOLINT(clang-analyzer-core.DivideZero)
return raw / 1000.0f;
return aggr.aggregate() / 1000.0f;
}
} // namespace adc

View File

@ -34,24 +34,28 @@ void ADCSensor::dump_config() {
#endif // USE_ADC_SENSOR_VCC
}
ESP_LOGCONFIG(TAG, " Samples: %i", this->sample_count_);
ESP_LOGCONFIG(TAG, " Sampling mode: %s", LOG_STR_ARG(sampling_mode_to_str(this->sampling_mode_)));
LOG_UPDATE_INTERVAL(this);
}
float ADCSensor::sample() {
uint32_t raw = 0;
auto aggr = Aggregator(this->sampling_mode_);
if (this->is_temperature_) {
adc_set_temp_sensor_enabled(true);
delay(1);
adc_select_input(4);
uint32_t raw = 0;
for (uint8_t sample = 0; sample < this->sample_count_; sample++) {
raw += adc_read();
raw = adc_read();
aggr.add_sample(raw);
}
raw = (raw + (this->sample_count_ >> 1)) / this->sample_count_; // NOLINT(clang-analyzer-core.DivideZero)
adc_set_temp_sensor_enabled(false);
if (this->output_raw_) {
return raw;
return aggr.aggregate();
}
return raw * 3.3f / 4096.0f;
return aggr.aggregate() * 3.3f / 4096.0f;
}
uint8_t pin = this->pin_->get_pin();
@ -68,11 +72,10 @@ float ADCSensor::sample() {
adc_gpio_init(pin);
adc_select_input(pin - 26);
uint32_t raw = 0;
for (uint8_t sample = 0; sample < this->sample_count_; sample++) {
raw += adc_read();
raw = adc_read();
aggr.add_sample(raw);
}
raw = (raw + (this->sample_count_ >> 1)) / this->sample_count_; // NOLINT(clang-analyzer-core.DivideZero)
#ifdef CYW43_USES_VSYS_PIN
if (pin == PICO_VSYS_PIN) {
@ -81,10 +84,10 @@ float ADCSensor::sample() {
#endif // CYW43_USES_VSYS_PIN
if (this->output_raw_) {
return raw;
return aggr.aggregate();
}
float coeff = pin == PICO_VSYS_PIN ? 3.0f : 1.0f;
return raw * 3.3f / 4096.0f * coeff;
return aggr.aggregate() * 3.3f / 4096.0f * coeff;
}
} // namespace adc

View File

@ -1,11 +1,9 @@
import logging
import esphome.codegen as cg
import esphome.config_validation as cv
import esphome.final_validate as fv
from esphome.core import CORE
from esphome.components import sensor, voltage_sampler
from esphome.components.esp32 import get_esp32_variant
import esphome.config_validation as cv
from esphome.const import (
CONF_ATTENUATION,
CONF_ID,
@ -17,10 +15,14 @@ from esphome.const import (
STATE_CLASS_MEASUREMENT,
UNIT_VOLT,
)
from esphome.core import CORE
import esphome.final_validate as fv
from . import (
ATTENUATION_MODES,
ESP32_VARIANT_ADC1_PIN_TO_CHANNEL,
ESP32_VARIANT_ADC2_PIN_TO_CHANNEL,
SAMPLING_MODES,
adc_ns,
validate_adc_pin,
)
@ -30,9 +32,11 @@ _LOGGER = logging.getLogger(__name__)
AUTO_LOAD = ["voltage_sampler"]
CONF_SAMPLES = "samples"
CONF_SAMPLING_MODE = "sampling_mode"
_attenuation = cv.enum(ATTENUATION_MODES, lower=True)
_sampling_mode = cv.enum(SAMPLING_MODES, lower=True)
def validate_config(config):
@ -88,6 +92,7 @@ CONFIG_SCHEMA = cv.All(
cv.only_on_esp32, _attenuation
),
cv.Optional(CONF_SAMPLES, default=1): cv.int_range(min=1, max=255),
cv.Optional(CONF_SAMPLING_MODE, default="avg"): _sampling_mode,
}
)
.extend(cv.polling_component_schema("60s")),
@ -112,6 +117,7 @@ async def to_code(config):
cg.add(var.set_output_raw(config[CONF_RAW]))
cg.add(var.set_sample_count(config[CONF_SAMPLES]))
cg.add(var.set_sampling_mode(config[CONF_SAMPLING_MODE]))
if attenuation := config.get(CONF_ATTENUATION):
if attenuation == "auto":

View File

@ -35,7 +35,7 @@ from esphome.const import (
PLATFORM_RP2040,
PLATFORM_RTL87XX,
)
from esphome.core import CORE, EsphomeError, Lambda, coroutine_with_priority
from esphome.core import CORE, Lambda, coroutine_with_priority
CODEOWNERS = ["@esphome/core"]
logger_ns = cg.esphome_ns.namespace("logger")
@ -77,6 +77,9 @@ USB_SERIAL_JTAG = "USB_SERIAL_JTAG"
USB_CDC = "USB_CDC"
DEFAULT = "DEFAULT"
CONF_INITIAL_LEVEL = "initial_level"
CONF_LOGGER_ID = "logger_id"
UART_SELECTION_ESP32 = {
VARIANT_ESP32: [UART0, UART1, UART2],
VARIANT_ESP32S2: [UART0, UART1, USB_CDC],
@ -154,11 +157,11 @@ def uart_selection(value):
def validate_local_no_higher_than_global(value):
global_level = value.get(CONF_LEVEL, "DEBUG")
global_level = LOG_LEVEL_SEVERITY.index(value[CONF_LEVEL])
for tag, level in value.get(CONF_LOGS, {}).items():
if LOG_LEVEL_SEVERITY.index(level) > LOG_LEVEL_SEVERITY.index(global_level):
raise EsphomeError(
f"The local log level {level} for {tag} must be less severe than the global log level {global_level}."
if LOG_LEVEL_SEVERITY.index(level) > global_level:
raise cv.Invalid(
f"The configured log level for {tag} ({level}) must be no more severe than the global log level {value[CONF_LEVEL]}."
)
return value
@ -209,6 +212,7 @@ CONFIG_SCHEMA = cv.All(
cv.string: is_log_level,
}
),
cv.Optional(CONF_INITIAL_LEVEL): is_log_level,
cv.Optional(CONF_ON_MESSAGE): automation.validate_automation(
{
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(LoggerMessageTrigger),
@ -227,7 +231,14 @@ CONFIG_SCHEMA = cv.All(
@coroutine_with_priority(90.0)
async def to_code(config):
baud_rate = config[CONF_BAUD_RATE]
log = cg.new_Pvariable(config[CONF_ID], baud_rate, config[CONF_TX_BUFFER_SIZE])
level = config[CONF_LEVEL]
initial_level = LOG_LEVELS[config.get(CONF_INITIAL_LEVEL, level)]
log = cg.new_Pvariable(
config[CONF_ID],
baud_rate,
config[CONF_TX_BUFFER_SIZE],
)
cg.add(log.set_log_level(initial_level))
if CONF_HARDWARE_UART in config:
cg.add(
log.set_uart_selection(
@ -239,7 +250,6 @@ async def to_code(config):
for tag, level in config[CONF_LOGS].items():
cg.add(log.set_log_level(tag, LOG_LEVELS[level]))
level = config[CONF_LEVEL]
cg.add_define("USE_LOGGER")
this_severity = LOG_LEVEL_SEVERITY.index(level)
cg.add_build_flag(f"-DESPHOME_LOG_LEVEL={LOG_LEVELS[level]}")
@ -367,3 +377,27 @@ async def logger_log_action_to_code(config, action_id, template_arg, args):
lambda_ = await cg.process_lambda(Lambda(text), args, return_type=cg.void)
return cg.new_Pvariable(action_id, template_arg, lambda_)
@automation.register_action(
"logger.set_level",
LambdaAction,
cv.maybe_simple_value(
{
cv.GenerateID(CONF_LOGGER_ID): cv.use_id(Logger),
cv.Required(CONF_LEVEL): is_log_level,
cv.Optional(CONF_TAG): cv.string,
},
key=CONF_LEVEL,
),
)
async def logger_set_level_to_code(config, action_id, template_arg, args):
level = LOG_LEVELS[config[CONF_LEVEL]]
logger = await cg.get_variable(config[CONF_LOGGER_ID])
if tag := config.get(CONF_TAG):
text = str(cg.statement(logger.set_log_level(tag, level)))
else:
text = str(cg.statement(logger.set_log_level(level)))
lambda_ = await cg.process_lambda(Lambda(text), args, return_type=cg.void)
return cg.new_Pvariable(action_id, template_arg, lambda_)

View File

@ -105,12 +105,9 @@ int HOT Logger::level_for(const char *tag) {
// Uses std::vector<> for low memory footprint, though the vector
// could be sorted to minimize lookup times. This feature isn't used that
// much anyway so it doesn't matter too much.
for (auto &it : this->log_levels_) {
if (it.tag == tag) {
return it.level;
}
}
return ESPHOME_LOG_LEVEL;
if (this->log_levels_.count(tag) != 0)
return this->log_levels_[tag];
return this->current_level_;
}
void HOT Logger::log_message_(int level, const char *tag, int offset) {
@ -167,9 +164,7 @@ void Logger::loop() {
#endif
void Logger::set_baud_rate(uint32_t baud_rate) { this->baud_rate_ = baud_rate; }
void Logger::set_log_level(const std::string &tag, int log_level) {
this->log_levels_.push_back(LogLevelOverride{tag, log_level});
}
void Logger::set_log_level(const std::string &tag, int log_level) { this->log_levels_[tag] = log_level; }
#if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2040) || defined(USE_LIBRETINY)
UARTSelection Logger::get_uart() const { return this->uart_; }
@ -183,18 +178,28 @@ const char *const LOG_LEVELS[] = {"NONE", "ERROR", "WARN", "INFO", "CONFIG", "DE
void Logger::dump_config() {
ESP_LOGCONFIG(TAG, "Logger:");
ESP_LOGCONFIG(TAG, " Level: %s", LOG_LEVELS[ESPHOME_LOG_LEVEL]);
ESP_LOGCONFIG(TAG, " Max Level: %s", LOG_LEVELS[ESPHOME_LOG_LEVEL]);
ESP_LOGCONFIG(TAG, " Initial Level: %s", LOG_LEVELS[this->current_level_]);
#ifndef USE_HOST
ESP_LOGCONFIG(TAG, " Log Baud Rate: %" PRIu32, this->baud_rate_);
ESP_LOGCONFIG(TAG, " Hardware UART: %s", get_uart_selection_());
#endif
for (auto &it : this->log_levels_) {
ESP_LOGCONFIG(TAG, " Level for '%s': %s", it.tag.c_str(), LOG_LEVELS[it.level]);
ESP_LOGCONFIG(TAG, " Level for '%s': %s", it.first.c_str(), LOG_LEVELS[it.second]);
}
}
void Logger::write_footer_() { this->write_to_buffer_(ESPHOME_LOG_RESET_COLOR, strlen(ESPHOME_LOG_RESET_COLOR)); }
void Logger::set_log_level(int level) {
if (level > ESPHOME_LOG_LEVEL) {
level = ESPHOME_LOG_LEVEL;
ESP_LOGW(TAG, "Cannot set log level higher than pre-compiled %s", LOG_LEVELS[ESPHOME_LOG_LEVEL]);
}
this->current_level_ = level;
this->level_callback_.call(level);
}
Logger *global_logger = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
} // namespace logger

View File

@ -1,11 +1,12 @@
#pragma once
#include <cstdarg>
#include <vector>
#include <map>
#include "esphome/core/automation.h"
#include "esphome/core/component.h"
#include "esphome/core/defines.h"
#include "esphome/core/helpers.h"
#include "esphome/core/log.h"
#ifdef USE_ARDUINO
#if defined(USE_ESP8266) || defined(USE_ESP32)
@ -74,8 +75,11 @@ class Logger : public Component {
UARTSelection get_uart() const;
#endif
/// Set the default log level for this logger.
void set_log_level(int level);
/// Set the log level of the specified tag.
void set_log_level(const std::string &tag, int log_level);
int get_log_level() { return this->current_level_; }
// ========== INTERNAL METHODS ==========
// (In most use cases you won't need these)
@ -88,6 +92,9 @@ class Logger : public Component {
/// Register a callback that will be called for every log message sent
void add_on_log_callback(std::function<void(int, const char *, const char *)> &&callback);
// add a listener for log level changes
void add_listener(std::function<void(int)> &&callback) { this->level_callback_.add(std::move(callback)); }
float get_setup_priority() const override;
void log_vprintf_(int level, const char *tag, int line, const char *format, va_list args); // NOLINT
@ -159,17 +166,14 @@ class Logger : public Component {
#ifdef USE_ESP_IDF
uart_port_t uart_num_;
#endif
struct LogLevelOverride {
std::string tag;
int level;
};
std::vector<LogLevelOverride> log_levels_;
std::map<std::string, int> log_levels_{};
CallbackManager<void(int, const char *, const char *)> log_callback_{};
int current_level_{ESPHOME_LOG_LEVEL_VERY_VERBOSE};
/// Prevents recursive log calls, if true a log message is already being processed.
bool recursion_guard_ = false;
void *main_task_ = nullptr;
CallbackManager<void(int)> level_callback_{};
};
extern Logger *global_logger; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
class LoggerMessageTrigger : public Trigger<int, const char *, const char *> {

View File

@ -0,0 +1,29 @@
import esphome.codegen as cg
from esphome.components import select
import esphome.config_validation as cv
from esphome.const import CONF_LEVEL, CONF_LOGGER, ENTITY_CATEGORY_CONFIG, ICON_BUG
from esphome.core import CORE
from esphome.cpp_helpers import register_component, register_parented
from .. import CONF_LOGGER_ID, LOG_LEVEL_SEVERITY, Logger, logger_ns
CODEOWNERS = ["@clydebarrow"]
LoggerLevelSelect = logger_ns.class_("LoggerLevelSelect", select.Select, cg.Component)
CONFIG_SCHEMA = select.select_schema(
LoggerLevelSelect, icon=ICON_BUG, entity_category=ENTITY_CATEGORY_CONFIG
).extend(
{
cv.GenerateID(CONF_LOGGER_ID): cv.use_id(Logger),
}
)
async def to_code(config):
levels = LOG_LEVEL_SEVERITY
index = levels.index(CORE.config[CONF_LOGGER][CONF_LEVEL])
levels = levels[: index + 1]
var = await select.new_select(config, options=levels)
await register_parented(var, config[CONF_LOGGER_ID])
await register_component(var, config)

View File

@ -0,0 +1,27 @@
#include "logger_level_select.h"
namespace esphome {
namespace logger {
void LoggerLevelSelect::publish_state(int level) {
auto value = this->at(level);
if (!value) {
return;
}
Select::publish_state(value.value());
}
void LoggerLevelSelect::setup() {
this->parent_->add_listener([this](int level) { this->publish_state(level); });
this->publish_state(this->parent_->get_log_level());
}
void LoggerLevelSelect::control(const std::string &value) {
auto level = this->index_of(value);
if (!level)
return;
this->parent_->set_log_level(level.value());
}
} // namespace logger
} // namespace esphome

View File

@ -0,0 +1,15 @@
#pragma once
#include "esphome/components/select/select.h"
#include "esphome/core/component.h"
#include "esphome/components/logger/logger.h"
namespace esphome {
namespace logger {
class LoggerLevelSelect : public Component, public select::Select, public Parented<Logger> {
public:
void publish_state(int level);
void setup() override;
void control(const std::string &value) override;
};
} // namespace logger
} // namespace esphome

View File

@ -66,7 +66,7 @@ class JPEGFormat(Format):
def actions(self):
cg.add_define("USE_ONLINE_IMAGE_JPEG_SUPPORT")
cg.add_library("JPEGDEC", "1.6.2", "https://github.com/bitbank2/JPEGDEC")
cg.add_library("JPEGDEC", None, "https://github.com/bitbank2/JPEGDEC#ca1e0f2")
class PNGFormat(Format):

View File

@ -100,7 +100,35 @@ void OnlineImage::update() {
}
ESP_LOGI(TAG, "Updating image %s", this->url_.c_str());
this->downloader_ = this->parent_->get(this->url_);
std::list<http_request::Header> headers = {};
http_request::Header accept_header;
accept_header.name = "Accept";
std::string accept_mime_type;
switch (this->format_) {
#ifdef USE_ONLINE_IMAGE_BMP_SUPPORT
case ImageFormat::BMP:
accept_mime_type = "image/bmp";
break;
#endif // ONLINE_IMAGE_BMP_SUPPORT
#ifdef USE_ONLINE_IMAGE_JPEG_SUPPORT
case ImageFormat::JPEG:
accept_mime_type = "image/jpeg";
break;
#endif // USE_ONLINE_IMAGE_JPEG_SUPPORT
#ifdef USE_ONLINE_IMAGE_PNG_SUPPORT
case ImageFormat::PNG:
accept_mime_type = "image/png";
break;
#endif // ONLINE_IMAGE_PNG_SUPPORT
default:
accept_mime_type = "image/*";
}
accept_header.value = (accept_mime_type + ",*/*;q=0.8").c_str();
headers.push_back(accept_header);
this->downloader_ = this->parent_->get(this->url_, headers);
if (this->downloader_ == nullptr) {
ESP_LOGE(TAG, "Download failed.");

View File

@ -120,7 +120,7 @@ MODELS = {
"2.13in-ttgo-b74": ("a", WaveshareEPaperTypeAModel.TTGO_EPAPER_2_13_IN_B74),
"2.90in": ("a", WaveshareEPaperTypeAModel.WAVESHARE_EPAPER_2_9_IN),
"2.90inv2": ("a", WaveshareEPaperTypeAModel.WAVESHARE_EPAPER_2_9_IN_V2),
"gdew029t5": ("c", GDEW029T5),
"gdew029t5": ("b", GDEW029T5),
"2.70in": ("b", WaveshareEPaper2P7In),
"2.70in-b": ("b", WaveshareEPaper2P7InB),
"2.70in-bv2": ("b", WaveshareEPaper2P7InBV2),
@ -143,7 +143,7 @@ MODELS = {
"7.50in-hd-b": ("b", WaveshareEPaper7P5InHDB),
"2.13in-ttgo-dke": ("c", WaveshareEPaper2P13InDKE),
"2.13inv3": ("c", WaveshareEPaper2P13InV3),
"1.54in-m5coreink-m09": ("c", GDEW0154M09),
"1.54in-m5coreink-m09": ("b", GDEW0154M09),
"13.3in-k": ("b", WaveshareEPaper13P3InK),
}

View File

@ -66,7 +66,7 @@ void WiFiComponent::start() {
this->pref_ = global_preferences->make_preference<wifi::SavedWifiSettings>(hash, true);
if (this->fast_connect_) {
this->fast_connect_pref_ = global_preferences->make_preference<wifi::SavedWifiFastConnectSettings>(hash, false);
this->fast_connect_pref_ = global_preferences->make_preference<wifi::SavedWifiFastConnectSettings>(hash + 1, false);
}
SavedWifiSettings save{};

View File

@ -14,6 +14,9 @@
#define ESPHOME_PROJECT_VERSION_30 "v2"
#define ESPHOME_VARIANT "ESP32"
// logger
#define ESPHOME_LOG_LEVEL ESPHOME_LOG_LEVEL_VERY_VERBOSE
// Feature flags
#define USE_ALARM_CONTROL_PANEL
#define USE_AUDIO_FLAC_SUPPORT

View File

@ -249,6 +249,9 @@ def perform_ota(
send_check(sock, result, "auth result")
receive_exactly(sock, 1, "auth result", RESPONSE_AUTH_OK)
# Set higher timeout during upload
sock.settimeout(30.0)
upload_size = len(upload_contents)
upload_size_encoded = [
(upload_size >> 24) & 0xFF,
@ -271,8 +274,6 @@ def perform_ota(
# show the actual progress
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, UPLOAD_BUFFER_SIZE)
# Set higher timeout during upload
sock.settimeout(30.0)
start_time = time.perf_counter()
offset = 0

View File

@ -42,7 +42,7 @@ lib_deps =
pavlodn/HaierProtocol@0.9.31 ; haier
kikuchan98/pngle@1.0.2 ; online_image
; Using the repository directly, otherwise ESP-IDF can't use the library
https://github.com/bitbank2/JPEGDEC.git#1.6.2 ; online_image
https://github.com/bitbank2/JPEGDEC.git#ca1e0f2 ; online_image
; This is using the repository until a new release is published to PlatformIO
https://github.com/Sensirion/arduino-gas-index-algorithm.git#3.2.1 ; Sensirion Gas Index Algorithm Arduino Library
lvgl/lvgl@8.4.0 ; lvgl

View File

@ -7,6 +7,13 @@ import sys
def find_and_activate_virtualenv():
if (
("VIRTUAL_ENV" in os.environ)
or os.environ.get("DEVCONTAINER", False)
or os.environ.get("ESPHOME_NO_VENV", False)
):
return
try:
# Get the top-level directory of the git repository
my_path = subprocess.check_output(
@ -17,7 +24,7 @@ def find_and_activate_virtualenv():
"Error: Not a git repository or unable to determine the top-level directory.",
file=sys.stderr,
)
sys.exit(1)
return
# Check for virtual environments
for venv in ["venv", ".venv", "."]:
@ -29,25 +36,26 @@ def find_and_activate_virtualenv():
)
if activate_path.exists():
# Activate the virtual environment by updating PATH
env = os.environ.copy()
venv_bin_dir = activate_path.parent
env["PATH"] = f"{venv_bin_dir}{os.pathsep}{env['PATH']}"
env["VIRTUAL_ENV"] = str(venv_bin_dir.parent)
os.environ["PATH"] = f"{venv_bin_dir}{os.pathsep}{os.environ['PATH']}"
os.environ["VIRTUAL_ENV"] = str(venv_bin_dir.parent)
print(f"Activated virtual environment: {venv_bin_dir.parent}")
# Execute the remaining arguments in the new environment
if len(sys.argv) > 1:
subprocess.run(sys.argv[1:], env=env, check=False)
else:
print(
"No command provided to run in the virtual environment.",
file=sys.stderr,
)
return
print("No virtual environment found.", file=sys.stderr)
sys.exit(1)
def run_command():
# Execute the remaining arguments in the new environment
if len(sys.argv) > 1:
subprocess.run(sys.argv[1:], check=False)
else:
print(
"No command provided to run in the virtual environment.",
file=sys.stderr,
)
if __name__ == "__main__":
find_and_activate_virtualenv()
run_command()

View File

@ -10,5 +10,6 @@ sensor:
pin: A0
id: s_1
name: test s1
sampling_mode: min
update_interval: 60s
device_class: voltage

View File

@ -1,7 +1,17 @@
esphome:
on_boot:
then:
- logger.log: Hello world
- logger.log:
level: warn
format: "Warning: Logger level is %d"
args: [id(logger_id).get_log_level()]
- logger.set_level: WARN
logger:
id: logger_id
level: DEBUG
initial_level: INFO
select:
- platform: logger
name: Logger Level

View File

@ -0,0 +1,20 @@
i2c:
- id: i2c_scd30
scl: ${scl_pin}
sda: ${sda_pin}
sensor:
- platform: scd30
co2:
name: SCD30 CO2
temperature:
id: scd30_temperature
name: SCD30 Temperature
humidity:
name: SCD30 Humidity
address: 0x61
automatic_self_calibration: true
altitude_compensation: 10m
ambient_pressure_compensation: 961mBar
temperature_offset: 4.2C
update_interval: 15s

View File

@ -1,20 +1,5 @@
i2c:
- id: i2c_scd30
scl: 16
sda: 17
substitutions:
scl_pin: GPIO16
sda_pin: GPIO17
sensor:
- platform: scd30
co2:
name: SCD30 CO2
temperature:
id: scd30_temperature
name: SCD30 Temperature
humidity:
name: SCD30 Humidity
address: 0x61
automatic_self_calibration: true
altitude_compensation: 10m
ambient_pressure_compensation: 961mBar
temperature_offset: 4.2C
update_interval: 15s
<<: !include common.yaml

View File

@ -1,20 +1,5 @@
i2c:
- id: i2c_scd30
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: scd30
co2:
name: SCD30 CO2
temperature:
id: scd30_temperature
name: SCD30 Temperature
humidity:
name: SCD30 Humidity
address: 0x61
automatic_self_calibration: true
altitude_compensation: 10m
ambient_pressure_compensation: 961mBar
temperature_offset: 4.2C
update_interval: 15s
<<: !include common.yaml

View File

@ -1,20 +1,5 @@
i2c:
- id: i2c_scd30
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: scd30
co2:
name: SCD30 CO2
temperature:
id: scd30_temperature
name: SCD30 Temperature
humidity:
name: SCD30 Humidity
address: 0x61
automatic_self_calibration: true
altitude_compensation: 10m
ambient_pressure_compensation: 961mBar
temperature_offset: 4.2C
update_interval: 15s
<<: !include common.yaml

View File

@ -1,20 +1,5 @@
i2c:
- id: i2c_scd30
scl: 16
sda: 17
substitutions:
scl_pin: GPIO16
sda_pin: GPIO17
sensor:
- platform: scd30
co2:
name: SCD30 CO2
temperature:
id: scd30_temperature
name: SCD30 Temperature
humidity:
name: SCD30 Humidity
address: 0x61
automatic_self_calibration: true
altitude_compensation: 10m
ambient_pressure_compensation: 961mBar
temperature_offset: 4.2C
update_interval: 15s
<<: !include common.yaml

View File

@ -1,20 +1,5 @@
i2c:
- id: i2c_scd30
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: scd30
co2:
name: SCD30 CO2
temperature:
id: scd30_temperature
name: SCD30 Temperature
humidity:
name: SCD30 Humidity
address: 0x61
automatic_self_calibration: true
altitude_compensation: 10m
ambient_pressure_compensation: 961mBar
temperature_offset: 4.2C
update_interval: 15s
<<: !include common.yaml

View File

@ -1,20 +1,5 @@
i2c:
- id: i2c_scd30
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: scd30
co2:
name: SCD30 CO2
temperature:
id: scd30_temperature
name: SCD30 Temperature
humidity:
name: SCD30 Humidity
address: 0x61
automatic_self_calibration: true
altitude_compensation: 10m
ambient_pressure_compensation: 961mBar
temperature_offset: 4.2C
update_interval: 15s
<<: !include common.yaml

View File

@ -0,0 +1,20 @@
i2c:
- id: i2c_scd4x
scl: ${scl_pin}
sda: ${sda_pin}
sensor:
- platform: scd4x
id: scd40
co2:
name: SCD4X CO2
temperature:
id: scd4x_temperature
name: SCD4X Temperature
humidity:
name: SCD4X Humidity
automatic_self_calibration: true
altitude_compensation: 10m
ambient_pressure_compensation: 961mBar
temperature_offset: 4.2C
update_interval: 15s

View File

@ -1,20 +1,5 @@
i2c:
- id: i2c_scd4x
scl: 16
sda: 17
substitutions:
scl_pin: GPIO16
sda_pin: GPIO17
sensor:
- platform: scd4x
id: scd40
co2:
name: SCD4X CO2
temperature:
id: scd4x_temperature
name: SCD4X Temperature
humidity:
name: SCD4X Humidity
automatic_self_calibration: true
altitude_compensation: 10m
ambient_pressure_compensation: 961mBar
temperature_offset: 4.2C
update_interval: 15s
<<: !include common.yaml

View File

@ -1,20 +1,5 @@
i2c:
- id: i2c_scd4x
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: scd4x
id: scd40
co2:
name: SCD4X CO2
temperature:
id: scd4x_temperature
name: SCD4X Temperature
humidity:
name: SCD4X Humidity
automatic_self_calibration: true
altitude_compensation: 10m
ambient_pressure_compensation: 961mBar
temperature_offset: 4.2C
update_interval: 15s
<<: !include common.yaml

View File

@ -1,20 +1,5 @@
i2c:
- id: i2c_scd4x
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: scd4x
id: scd40
co2:
name: SCD4X CO2
temperature:
id: scd4x_temperature
name: SCD4X Temperature
humidity:
name: SCD4X Humidity
automatic_self_calibration: true
altitude_compensation: 10m
ambient_pressure_compensation: 961mBar
temperature_offset: 4.2C
update_interval: 15s
<<: !include common.yaml

View File

@ -1,20 +1,5 @@
i2c:
- id: i2c_scd4x
scl: 16
sda: 17
substitutions:
scl_pin: GPIO16
sda_pin: GPIO17
sensor:
- platform: scd4x
id: scd40
co2:
name: SCD4X CO2
temperature:
id: scd4x_temperature
name: SCD4X Temperature
humidity:
name: SCD4X Humidity
automatic_self_calibration: true
altitude_compensation: 10m
ambient_pressure_compensation: 961mBar
temperature_offset: 4.2C
update_interval: 15s
<<: !include common.yaml

View File

@ -1,20 +1,5 @@
i2c:
- id: i2c_scd4x
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: scd4x
id: scd40
co2:
name: SCD4X CO2
temperature:
id: scd4x_temperature
name: SCD4X Temperature
humidity:
name: SCD4X Humidity
automatic_self_calibration: true
altitude_compensation: 10m
ambient_pressure_compensation: 961mBar
temperature_offset: 4.2C
update_interval: 15s
<<: !include common.yaml

View File

@ -1,20 +1,5 @@
i2c:
- id: i2c_scd4x
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: scd4x
id: scd40
co2:
name: SCD4X CO2
temperature:
id: scd4x_temperature
name: SCD4X Temperature
humidity:
name: SCD4X Humidity
automatic_self_calibration: true
altitude_compensation: 10m
ambient_pressure_compensation: 961mBar
temperature_offset: 4.2C
update_interval: 15s
<<: !include common.yaml

View File

@ -0,0 +1,23 @@
uart:
- id: uart_sdm_meter
tx_pin: ${tx_pin}
rx_pin: ${rx_pin}
baud_rate: 9600
sensor:
- platform: sdm_meter
phase_a:
current:
name: Phase A Current
voltage:
name: Phase A Voltage
active_power:
name: Phase A Power
power_factor:
name: Phase A Power Factor
apparent_power:
name: Phase A Apparent Power
reactive_power:
name: Phase A Reactive Power
phase_angle:
name: Phase A Phase Angle

View File

@ -1,23 +1,5 @@
uart:
- id: uart_sdm_meter
tx_pin: 17
rx_pin: 16
baud_rate: 9600
substitutions:
tx_pin: GPIO17
rx_pin: GPIO16
sensor:
- platform: sdm_meter
phase_a:
current:
name: Phase A Current
voltage:
name: Phase A Voltage
active_power:
name: Phase A Power
power_factor:
name: Phase A Power Factor
apparent_power:
name: Phase A Apparent Power
reactive_power:
name: Phase A Reactive Power
phase_angle:
name: Phase A Phase Angle
<<: !include common.yaml

View File

@ -1,23 +1,5 @@
uart:
- id: uart_sdm_meter
tx_pin: 4
rx_pin: 5
baud_rate: 9600
substitutions:
tx_pin: GPIO4
rx_pin: GPIO5
sensor:
- platform: sdm_meter
phase_a:
current:
name: Phase A Current
voltage:
name: Phase A Voltage
active_power:
name: Phase A Power
power_factor:
name: Phase A Power Factor
apparent_power:
name: Phase A Apparent Power
reactive_power:
name: Phase A Reactive Power
phase_angle:
name: Phase A Phase Angle
<<: !include common.yaml

View File

@ -1,23 +1,5 @@
uart:
- id: uart_sdm_meter
tx_pin: 4
rx_pin: 5
baud_rate: 9600
substitutions:
tx_pin: GPIO4
rx_pin: GPIO5
sensor:
- platform: sdm_meter
phase_a:
current:
name: Phase A Current
voltage:
name: Phase A Voltage
active_power:
name: Phase A Power
power_factor:
name: Phase A Power Factor
apparent_power:
name: Phase A Apparent Power
reactive_power:
name: Phase A Reactive Power
phase_angle:
name: Phase A Phase Angle
<<: !include common.yaml

View File

@ -1,23 +1,5 @@
uart:
- id: uart_sdm_meter
tx_pin: 17
rx_pin: 16
baud_rate: 9600
substitutions:
tx_pin: GPIO17
rx_pin: GPIO16
sensor:
- platform: sdm_meter
phase_a:
current:
name: Phase A Current
voltage:
name: Phase A Voltage
active_power:
name: Phase A Power
power_factor:
name: Phase A Power Factor
apparent_power:
name: Phase A Apparent Power
reactive_power:
name: Phase A Reactive Power
phase_angle:
name: Phase A Phase Angle
<<: !include common.yaml

View File

@ -1,23 +1,5 @@
uart:
- id: uart_sdm_meter
tx_pin: 4
rx_pin: 5
baud_rate: 9600
substitutions:
tx_pin: GPIO4
rx_pin: GPIO5
sensor:
- platform: sdm_meter
phase_a:
current:
name: Phase A Current
voltage:
name: Phase A Voltage
active_power:
name: Phase A Power
power_factor:
name: Phase A Power Factor
apparent_power:
name: Phase A Apparent Power
reactive_power:
name: Phase A Reactive Power
phase_angle:
name: Phase A Phase Angle
<<: !include common.yaml

View File

@ -1,23 +1,5 @@
uart:
- id: uart_sdm_meter
tx_pin: 4
rx_pin: 5
baud_rate: 9600
substitutions:
tx_pin: GPIO4
rx_pin: GPIO5
sensor:
- platform: sdm_meter
phase_a:
current:
name: Phase A Current
voltage:
name: Phase A Voltage
active_power:
name: Phase A Power
power_factor:
name: Phase A Power Factor
apparent_power:
name: Phase A Apparent Power
reactive_power:
name: Phase A Reactive Power
phase_angle:
name: Phase A Phase Angle
<<: !include common.yaml

View File

@ -0,0 +1,11 @@
i2c:
- id: i2c_sdp3x
scl: ${scl_pin}
sda: ${sda_pin}
sensor:
- platform: sdp3x
id: filter_pressure
name: HVAC Filter Pressure drop
accuracy_decimals: 3
update_interval: 5s

View File

@ -1,11 +1,5 @@
i2c:
- id: i2c_sdp3x
scl: 16
sda: 17
substitutions:
scl_pin: GPIO16
sda_pin: GPIO17
sensor:
- platform: sdp3x
id: filter_pressure
name: HVAC Filter Pressure drop
accuracy_decimals: 3
update_interval: 5s
<<: !include common.yaml

View File

@ -1,11 +1,5 @@
i2c:
- id: i2c_sdp3x
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: sdp3x
id: filter_pressure
name: HVAC Filter Pressure drop
accuracy_decimals: 3
update_interval: 5s
<<: !include common.yaml

View File

@ -1,11 +1,5 @@
i2c:
- id: i2c_sdp3x
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: sdp3x
id: filter_pressure
name: HVAC Filter Pressure drop
accuracy_decimals: 3
update_interval: 5s
<<: !include common.yaml

View File

@ -1,11 +1,5 @@
i2c:
- id: i2c_sdp3x
scl: 16
sda: 17
substitutions:
scl_pin: GPIO16
sda_pin: GPIO17
sensor:
- platform: sdp3x
id: filter_pressure
name: HVAC Filter Pressure drop
accuracy_decimals: 3
update_interval: 5s
<<: !include common.yaml

View File

@ -1,11 +1,5 @@
i2c:
- id: i2c_sdp3x
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: sdp3x
id: filter_pressure
name: HVAC Filter Pressure drop
accuracy_decimals: 3
update_interval: 5s
<<: !include common.yaml

View File

@ -1,11 +1,5 @@
i2c:
- id: i2c_sdp3x
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: sdp3x
id: filter_pressure
name: HVAC Filter Pressure drop
accuracy_decimals: 3
update_interval: 5s
<<: !include common.yaml

View File

@ -0,0 +1,14 @@
uart:
- id: uart_sdm_sds011
tx_pin: ${tx_pin}
rx_pin: ${rx_pin}
baud_rate: 115200
sensor:
- platform: sds011
pm_2_5:
name: SDS011 PM2.5
pm_10_0:
name: SDS011 PM10.0
rx_only: false
update_interval: 5min

View File

@ -1,14 +1,5 @@
uart:
- id: uart_sdm_sds011
tx_pin: 17
rx_pin: 16
baud_rate: 115200
substitutions:
tx_pin: GPIO17
rx_pin: GPIO16
sensor:
- platform: sds011
pm_2_5:
name: SDS011 PM2.5
pm_10_0:
name: SDS011 PM10.0
rx_only: false
update_interval: 5min
<<: !include common.yaml

View File

@ -1,14 +1,5 @@
uart:
- id: uart_sdm_sds011
tx_pin: 4
rx_pin: 5
baud_rate: 115200
substitutions:
tx_pin: GPIO4
rx_pin: GPIO5
sensor:
- platform: sds011
pm_2_5:
name: SDS011 PM2.5
pm_10_0:
name: SDS011 PM10.0
rx_only: false
update_interval: 5min
<<: !include common.yaml

View File

@ -1,14 +1,5 @@
uart:
- id: uart_sdm_sds011
tx_pin: 4
rx_pin: 5
baud_rate: 115200
substitutions:
tx_pin: GPIO4
rx_pin: GPIO5
sensor:
- platform: sds011
pm_2_5:
name: SDS011 PM2.5
pm_10_0:
name: SDS011 PM10.0
rx_only: false
update_interval: 5min
<<: !include common.yaml

View File

@ -1,14 +1,5 @@
uart:
- id: uart_sdm_sds011
tx_pin: 17
rx_pin: 16
baud_rate: 115200
substitutions:
tx_pin: GPIO17
rx_pin: GPIO16
sensor:
- platform: sds011
pm_2_5:
name: SDS011 PM2.5
pm_10_0:
name: SDS011 PM10.0
rx_only: false
update_interval: 5min
<<: !include common.yaml

View File

@ -1,14 +1,5 @@
uart:
- id: uart_sdm_sds011
tx_pin: 4
rx_pin: 5
baud_rate: 115200
substitutions:
tx_pin: GPIO4
rx_pin: GPIO5
sensor:
- platform: sds011
pm_2_5:
name: SDS011 PM2.5
pm_10_0:
name: SDS011 PM10.0
rx_only: false
update_interval: 5min
<<: !include common.yaml

View File

@ -1,14 +1,5 @@
uart:
- id: uart_sdm_sds011
tx_pin: 4
rx_pin: 5
baud_rate: 115200
substitutions:
tx_pin: GPIO4
rx_pin: GPIO5
sensor:
- platform: sds011
pm_2_5:
name: SDS011 PM2.5
pm_10_0:
name: SDS011 PM10.0
rx_only: false
update_interval: 5min
<<: !include common.yaml

View File

@ -0,0 +1,45 @@
uart:
- id: uart_selec_meter
tx_pin: ${tx_pin}
rx_pin: ${rx_pin}
baud_rate: 9600
sensor:
- platform: selec_meter
total_active_energy:
name: SelecEM2M Total Active Energy
import_active_energy:
name: SelecEM2M Import Active Energy
export_active_energy:
name: SelecEM2M Export Active Energy
total_reactive_energy:
name: SelecEM2M Total Reactive Energy
import_reactive_energy:
name: SelecEM2M Import Reactive Energy
export_reactive_energy:
name: SelecEM2M Export Reactive Energy
apparent_energy:
name: SelecEM2M Apparent Energy
active_power:
name: SelecEM2M Active Power
reactive_power:
name: SelecEM2M Reactive Power
apparent_power:
name: SelecEM2M Apparent Power
voltage:
name: SelecEM2M Voltage
current:
name: SelecEM2M Current
power_factor:
name: SelecEM2M Power Factor
frequency:
name: SelecEM2M Frequency
maximum_demand_active_power:
name: SelecEM2M Maximum Demand Active Power
disabled_by_default: true
maximum_demand_reactive_power:
name: SelecEM2M Maximum Demand Reactive Power
disabled_by_default: true
maximum_demand_apparent_power:
name: SelecEM2M Maximum Demand Apparent Power
disabled_by_default: true

View File

@ -1,45 +1,5 @@
uart:
- id: uart_selec_meter
tx_pin: 17
rx_pin: 16
baud_rate: 9600
substitutions:
tx_pin: GPIO17
rx_pin: GPIO16
sensor:
- platform: selec_meter
total_active_energy:
name: SelecEM2M Total Active Energy
import_active_energy:
name: SelecEM2M Import Active Energy
export_active_energy:
name: SelecEM2M Export Active Energy
total_reactive_energy:
name: SelecEM2M Total Reactive Energy
import_reactive_energy:
name: SelecEM2M Import Reactive Energy
export_reactive_energy:
name: SelecEM2M Export Reactive Energy
apparent_energy:
name: SelecEM2M Apparent Energy
active_power:
name: SelecEM2M Active Power
reactive_power:
name: SelecEM2M Reactive Power
apparent_power:
name: SelecEM2M Apparent Power
voltage:
name: SelecEM2M Voltage
current:
name: SelecEM2M Current
power_factor:
name: SelecEM2M Power Factor
frequency:
name: SelecEM2M Frequency
maximum_demand_active_power:
name: SelecEM2M Maximum Demand Active Power
disabled_by_default: true
maximum_demand_reactive_power:
name: SelecEM2M Maximum Demand Reactive Power
disabled_by_default: true
maximum_demand_apparent_power:
name: SelecEM2M Maximum Demand Apparent Power
disabled_by_default: true
<<: !include common.yaml

View File

@ -1,45 +1,5 @@
uart:
- id: uart_selec_meter
tx_pin: 4
rx_pin: 5
baud_rate: 9600
substitutions:
tx_pin: GPIO4
rx_pin: GPIO5
sensor:
- platform: selec_meter
total_active_energy:
name: SelecEM2M Total Active Energy
import_active_energy:
name: SelecEM2M Import Active Energy
export_active_energy:
name: SelecEM2M Export Active Energy
total_reactive_energy:
name: SelecEM2M Total Reactive Energy
import_reactive_energy:
name: SelecEM2M Import Reactive Energy
export_reactive_energy:
name: SelecEM2M Export Reactive Energy
apparent_energy:
name: SelecEM2M Apparent Energy
active_power:
name: SelecEM2M Active Power
reactive_power:
name: SelecEM2M Reactive Power
apparent_power:
name: SelecEM2M Apparent Power
voltage:
name: SelecEM2M Voltage
current:
name: SelecEM2M Current
power_factor:
name: SelecEM2M Power Factor
frequency:
name: SelecEM2M Frequency
maximum_demand_active_power:
name: SelecEM2M Maximum Demand Active Power
disabled_by_default: true
maximum_demand_reactive_power:
name: SelecEM2M Maximum Demand Reactive Power
disabled_by_default: true
maximum_demand_apparent_power:
name: SelecEM2M Maximum Demand Apparent Power
disabled_by_default: true
<<: !include common.yaml

View File

@ -1,45 +1,5 @@
uart:
- id: uart_selec_meter
tx_pin: 4
rx_pin: 5
baud_rate: 9600
substitutions:
tx_pin: GPIO4
rx_pin: GPIO5
sensor:
- platform: selec_meter
total_active_energy:
name: SelecEM2M Total Active Energy
import_active_energy:
name: SelecEM2M Import Active Energy
export_active_energy:
name: SelecEM2M Export Active Energy
total_reactive_energy:
name: SelecEM2M Total Reactive Energy
import_reactive_energy:
name: SelecEM2M Import Reactive Energy
export_reactive_energy:
name: SelecEM2M Export Reactive Energy
apparent_energy:
name: SelecEM2M Apparent Energy
active_power:
name: SelecEM2M Active Power
reactive_power:
name: SelecEM2M Reactive Power
apparent_power:
name: SelecEM2M Apparent Power
voltage:
name: SelecEM2M Voltage
current:
name: SelecEM2M Current
power_factor:
name: SelecEM2M Power Factor
frequency:
name: SelecEM2M Frequency
maximum_demand_active_power:
name: SelecEM2M Maximum Demand Active Power
disabled_by_default: true
maximum_demand_reactive_power:
name: SelecEM2M Maximum Demand Reactive Power
disabled_by_default: true
maximum_demand_apparent_power:
name: SelecEM2M Maximum Demand Apparent Power
disabled_by_default: true
<<: !include common.yaml

View File

@ -1,45 +1,5 @@
uart:
- id: uart_selec_meter
tx_pin: 17
rx_pin: 16
baud_rate: 9600
substitutions:
tx_pin: GPIO17
rx_pin: GPIO16
sensor:
- platform: selec_meter
total_active_energy:
name: SelecEM2M Total Active Energy
import_active_energy:
name: SelecEM2M Import Active Energy
export_active_energy:
name: SelecEM2M Export Active Energy
total_reactive_energy:
name: SelecEM2M Total Reactive Energy
import_reactive_energy:
name: SelecEM2M Import Reactive Energy
export_reactive_energy:
name: SelecEM2M Export Reactive Energy
apparent_energy:
name: SelecEM2M Apparent Energy
active_power:
name: SelecEM2M Active Power
reactive_power:
name: SelecEM2M Reactive Power
apparent_power:
name: SelecEM2M Apparent Power
voltage:
name: SelecEM2M Voltage
current:
name: SelecEM2M Current
power_factor:
name: SelecEM2M Power Factor
frequency:
name: SelecEM2M Frequency
maximum_demand_active_power:
name: SelecEM2M Maximum Demand Active Power
disabled_by_default: true
maximum_demand_reactive_power:
name: SelecEM2M Maximum Demand Reactive Power
disabled_by_default: true
maximum_demand_apparent_power:
name: SelecEM2M Maximum Demand Apparent Power
disabled_by_default: true
<<: !include common.yaml

View File

@ -1,45 +1,5 @@
uart:
- id: uart_selec_meter
tx_pin: 4
rx_pin: 5
baud_rate: 9600
substitutions:
tx_pin: GPIO4
rx_pin: GPIO5
sensor:
- platform: selec_meter
total_active_energy:
name: SelecEM2M Total Active Energy
import_active_energy:
name: SelecEM2M Import Active Energy
export_active_energy:
name: SelecEM2M Export Active Energy
total_reactive_energy:
name: SelecEM2M Total Reactive Energy
import_reactive_energy:
name: SelecEM2M Import Reactive Energy
export_reactive_energy:
name: SelecEM2M Export Reactive Energy
apparent_energy:
name: SelecEM2M Apparent Energy
active_power:
name: SelecEM2M Active Power
reactive_power:
name: SelecEM2M Reactive Power
apparent_power:
name: SelecEM2M Apparent Power
voltage:
name: SelecEM2M Voltage
current:
name: SelecEM2M Current
power_factor:
name: SelecEM2M Power Factor
frequency:
name: SelecEM2M Frequency
maximum_demand_active_power:
name: SelecEM2M Maximum Demand Active Power
disabled_by_default: true
maximum_demand_reactive_power:
name: SelecEM2M Maximum Demand Reactive Power
disabled_by_default: true
maximum_demand_apparent_power:
name: SelecEM2M Maximum Demand Apparent Power
disabled_by_default: true
<<: !include common.yaml

View File

@ -1,45 +1,5 @@
uart:
- id: uart_selec_meter
tx_pin: 4
rx_pin: 5
baud_rate: 9600
substitutions:
tx_pin: GPIO4
rx_pin: GPIO5
sensor:
- platform: selec_meter
total_active_energy:
name: SelecEM2M Total Active Energy
import_active_energy:
name: SelecEM2M Import Active Energy
export_active_energy:
name: SelecEM2M Export Active Energy
total_reactive_energy:
name: SelecEM2M Total Reactive Energy
import_reactive_energy:
name: SelecEM2M Import Reactive Energy
export_reactive_energy:
name: SelecEM2M Export Reactive Energy
apparent_energy:
name: SelecEM2M Apparent Energy
active_power:
name: SelecEM2M Active Power
reactive_power:
name: SelecEM2M Reactive Power
apparent_power:
name: SelecEM2M Apparent Power
voltage:
name: SelecEM2M Voltage
current:
name: SelecEM2M Current
power_factor:
name: SelecEM2M Power Factor
frequency:
name: SelecEM2M Frequency
maximum_demand_active_power:
name: SelecEM2M Maximum Demand Active Power
disabled_by_default: true
maximum_demand_reactive_power:
name: SelecEM2M Maximum Demand Reactive Power
disabled_by_default: true
maximum_demand_apparent_power:
name: SelecEM2M Maximum Demand Apparent Power
disabled_by_default: true
<<: !include common.yaml

View File

@ -0,0 +1,10 @@
i2c:
- id: i2c_sen0321
scl: ${scl_pin}
sda: ${sda_pin}
sensor:
- platform: sen0321
name: Workshop Ozone Sensor
id: sen0321_ozone
update_interval: 10s

View File

@ -1,10 +1,5 @@
i2c:
- id: i2c_sen0321
scl: 16
sda: 17
substitutions:
scl_pin: GPIO16
sda_pin: GPIO17
sensor:
- platform: sen0321
name: Workshop Ozone Sensor
id: sen0321_ozone
update_interval: 10s
<<: !include common.yaml

View File

@ -1,10 +1,5 @@
i2c:
- id: i2c_sen0321
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: sen0321
name: Workshop Ozone Sensor
id: sen0321_ozone
update_interval: 10s
<<: !include common.yaml

View File

@ -1,10 +1,5 @@
i2c:
- id: i2c_sen0321
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: sen0321
name: Workshop Ozone Sensor
id: sen0321_ozone
update_interval: 10s
<<: !include common.yaml

View File

@ -1,10 +1,5 @@
i2c:
- id: i2c_sen0321
scl: 16
sda: 17
substitutions:
scl_pin: GPIO16
sda_pin: GPIO17
sensor:
- platform: sen0321
name: Workshop Ozone Sensor
id: sen0321_ozone
update_interval: 10s
<<: !include common.yaml

View File

@ -1,10 +1,5 @@
i2c:
- id: i2c_sen0321
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: sen0321
name: Workshop Ozone Sensor
id: sen0321_ozone
update_interval: 10s
<<: !include common.yaml

View File

@ -1,10 +1,5 @@
i2c:
- id: i2c_sen0321
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: sen0321
name: Workshop Ozone Sensor
id: sen0321_ozone
update_interval: 10s
<<: !include common.yaml

View File

@ -0,0 +1,9 @@
i2c:
- id: i2c_sen21231
scl: ${scl_pin}
sda: ${sda_pin}
sensor:
- platform: sen21231
id: sen21231_sensor1
name: Person Sensor

View File

@ -1,9 +1,5 @@
i2c:
- id: i2c_sen21231
scl: 16
sda: 17
substitutions:
scl_pin: GPIO16
sda_pin: GPIO17
sensor:
- platform: sen21231
id: sen21231_sensor1
name: Person Sensor
<<: !include common.yaml

View File

@ -1,9 +1,5 @@
i2c:
- id: i2c_sen21231
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: sen21231
id: sen21231_sensor1
name: Person Sensor
<<: !include common.yaml

View File

@ -1,9 +1,5 @@
i2c:
- id: i2c_sen21231
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: sen21231
id: sen21231_sensor1
name: Person Sensor
<<: !include common.yaml

View File

@ -1,9 +1,5 @@
i2c:
- id: i2c_sen21231
scl: 16
sda: 17
substitutions:
scl_pin: GPIO16
sda_pin: GPIO17
sensor:
- platform: sen21231
id: sen21231_sensor1
name: Person Sensor
<<: !include common.yaml

View File

@ -1,9 +1,5 @@
i2c:
- id: i2c_sen21231
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: sen21231
id: sen21231_sensor1
name: Person Sensor
<<: !include common.yaml

View File

@ -1,9 +1,5 @@
i2c:
- id: i2c_sen21231
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: sen21231
id: sen21231_sensor1
name: Person Sensor
<<: !include common.yaml

View File

@ -0,0 +1,49 @@
i2c:
- id: i2c_sen5x
scl: ${scl_pin}
sda: ${sda_pin}
sensor:
- platform: sen5x
id: sen54
temperature:
name: Temperature
accuracy_decimals: 1
humidity:
name: Humidity
accuracy_decimals: 0
pm_1_0:
name: PM <1µm Weight concentration
id: pm_1_0
accuracy_decimals: 1
pm_2_5:
name: PM <2.5µm Weight concentration
id: pm_2_5
accuracy_decimals: 1
pm_4_0:
name: PM <4µm Weight concentration
id: pm_4_0
accuracy_decimals: 1
pm_10_0:
name: PM <10µm Weight concentration
id: pm_10_0
accuracy_decimals: 1
nox:
name: NOx
voc:
name: VOC
algorithm_tuning:
index_offset: 100
learning_time_offset_hours: 12
learning_time_gain_hours: 12
gating_max_duration_minutes: 180
std_initial: 50
gain_factor: 230
temperature_compensation:
offset: 0
normalized_offset_slope: 0
time_constant: 0
auto_cleaning_interval: 604800s
acceleration_mode: low
store_baseline: true
address: 0x69

View File

@ -1,49 +1,5 @@
i2c:
- id: i2c_sen5x
scl: 16
sda: 17
substitutions:
scl_pin: GPIO16
sda_pin: GPIO17
sensor:
- platform: sen5x
id: sen54
temperature:
name: Temperature
accuracy_decimals: 1
humidity:
name: Humidity
accuracy_decimals: 0
pm_1_0:
name: PM <1µm Weight concentration
id: pm_1_0
accuracy_decimals: 1
pm_2_5:
name: PM <2.5µm Weight concentration
id: pm_2_5
accuracy_decimals: 1
pm_4_0:
name: PM <4µm Weight concentration
id: pm_4_0
accuracy_decimals: 1
pm_10_0:
name: PM <10µm Weight concentration
id: pm_10_0
accuracy_decimals: 1
nox:
name: NOx
voc:
name: VOC
algorithm_tuning:
index_offset: 100
learning_time_offset_hours: 12
learning_time_gain_hours: 12
gating_max_duration_minutes: 180
std_initial: 50
gain_factor: 230
temperature_compensation:
offset: 0
normalized_offset_slope: 0
time_constant: 0
auto_cleaning_interval: 604800s
acceleration_mode: low
store_baseline: true
address: 0x69
<<: !include common.yaml

View File

@ -1,49 +1,5 @@
i2c:
- id: i2c_sen5x
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: sen5x
id: sen54
temperature:
name: Temperature
accuracy_decimals: 1
humidity:
name: Humidity
accuracy_decimals: 0
pm_1_0:
name: PM <1µm Weight concentration
id: pm_1_0
accuracy_decimals: 1
pm_2_5:
name: PM <2.5µm Weight concentration
id: pm_2_5
accuracy_decimals: 1
pm_4_0:
name: PM <4µm Weight concentration
id: pm_4_0
accuracy_decimals: 1
pm_10_0:
name: PM <10µm Weight concentration
id: pm_10_0
accuracy_decimals: 1
nox:
name: NOx
voc:
name: VOC
algorithm_tuning:
index_offset: 100
learning_time_offset_hours: 12
learning_time_gain_hours: 12
gating_max_duration_minutes: 180
std_initial: 50
gain_factor: 230
temperature_compensation:
offset: 0
normalized_offset_slope: 0
time_constant: 0
auto_cleaning_interval: 604800s
acceleration_mode: low
store_baseline: true
address: 0x69
<<: !include common.yaml

View File

@ -1,49 +1,5 @@
i2c:
- id: i2c_sen5x
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: sen5x
id: sen54
temperature:
name: Temperature
accuracy_decimals: 1
humidity:
name: Humidity
accuracy_decimals: 0
pm_1_0:
name: PM <1µm Weight concentration
id: pm_1_0
accuracy_decimals: 1
pm_2_5:
name: PM <2.5µm Weight concentration
id: pm_2_5
accuracy_decimals: 1
pm_4_0:
name: PM <4µm Weight concentration
id: pm_4_0
accuracy_decimals: 1
pm_10_0:
name: PM <10µm Weight concentration
id: pm_10_0
accuracy_decimals: 1
nox:
name: NOx
voc:
name: VOC
algorithm_tuning:
index_offset: 100
learning_time_offset_hours: 12
learning_time_gain_hours: 12
gating_max_duration_minutes: 180
std_initial: 50
gain_factor: 230
temperature_compensation:
offset: 0
normalized_offset_slope: 0
time_constant: 0
auto_cleaning_interval: 604800s
acceleration_mode: low
store_baseline: true
address: 0x69
<<: !include common.yaml

View File

@ -1,49 +1,5 @@
i2c:
- id: i2c_sen5x
scl: 16
sda: 17
substitutions:
scl_pin: GPIO16
sda_pin: GPIO17
sensor:
- platform: sen5x
id: sen54
temperature:
name: Temperature
accuracy_decimals: 1
humidity:
name: Humidity
accuracy_decimals: 0
pm_1_0:
name: PM <1µm Weight concentration
id: pm_1_0
accuracy_decimals: 1
pm_2_5:
name: PM <2.5µm Weight concentration
id: pm_2_5
accuracy_decimals: 1
pm_4_0:
name: PM <4µm Weight concentration
id: pm_4_0
accuracy_decimals: 1
pm_10_0:
name: PM <10µm Weight concentration
id: pm_10_0
accuracy_decimals: 1
nox:
name: NOx
voc:
name: VOC
algorithm_tuning:
index_offset: 100
learning_time_offset_hours: 12
learning_time_gain_hours: 12
gating_max_duration_minutes: 180
std_initial: 50
gain_factor: 230
temperature_compensation:
offset: 0
normalized_offset_slope: 0
time_constant: 0
auto_cleaning_interval: 604800s
acceleration_mode: low
store_baseline: true
address: 0x69
<<: !include common.yaml

View File

@ -1,49 +1,5 @@
i2c:
- id: i2c_sen5x
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: sen5x
id: sen54
temperature:
name: Temperature
accuracy_decimals: 1
humidity:
name: Humidity
accuracy_decimals: 0
pm_1_0:
name: PM <1µm Weight concentration
id: pm_1_0
accuracy_decimals: 1
pm_2_5:
name: PM <2.5µm Weight concentration
id: pm_2_5
accuracy_decimals: 1
pm_4_0:
name: PM <4µm Weight concentration
id: pm_4_0
accuracy_decimals: 1
pm_10_0:
name: PM <10µm Weight concentration
id: pm_10_0
accuracy_decimals: 1
nox:
name: NOx
voc:
name: VOC
algorithm_tuning:
index_offset: 100
learning_time_offset_hours: 12
learning_time_gain_hours: 12
gating_max_duration_minutes: 180
std_initial: 50
gain_factor: 230
temperature_compensation:
offset: 0
normalized_offset_slope: 0
time_constant: 0
auto_cleaning_interval: 604800s
acceleration_mode: low
store_baseline: true
address: 0x69
<<: !include common.yaml

View File

@ -1,49 +1,5 @@
i2c:
- id: i2c_sen5x
scl: 5
sda: 4
substitutions:
scl_pin: GPIO5
sda_pin: GPIO4
sensor:
- platform: sen5x
id: sen54
temperature:
name: Temperature
accuracy_decimals: 1
humidity:
name: Humidity
accuracy_decimals: 0
pm_1_0:
name: PM <1µm Weight concentration
id: pm_1_0
accuracy_decimals: 1
pm_2_5:
name: PM <2.5µm Weight concentration
id: pm_2_5
accuracy_decimals: 1
pm_4_0:
name: PM <4µm Weight concentration
id: pm_4_0
accuracy_decimals: 1
pm_10_0:
name: PM <10µm Weight concentration
id: pm_10_0
accuracy_decimals: 1
nox:
name: NOx
voc:
name: VOC
algorithm_tuning:
index_offset: 100
learning_time_offset_hours: 12
learning_time_gain_hours: 12
gating_max_duration_minutes: 180
std_initial: 50
gain_factor: 230
temperature_compensation:
offset: 0
normalized_offset_slope: 0
time_constant: 0
auto_cleaning_interval: 604800s
acceleration_mode: low
store_baseline: true
address: 0x69
<<: !include common.yaml

View File

@ -0,0 +1,19 @@
uart:
- id: uart_senseair
tx_pin: ${tx_pin}
rx_pin: ${rx_pin}
baud_rate: 9600
sensor:
- platform: senseair
id: senseair0
co2:
name: SenseAir CO2 Value
on_value:
then:
- senseair.background_calibration: senseair0
- senseair.background_calibration_result: senseair0
- senseair.abc_get_period: senseair0
- senseair.abc_enable: senseair0
- senseair.abc_disable: senseair0
update_interval: 15s

View File

@ -1,19 +1,5 @@
uart:
- id: uart_senseair
tx_pin: 17
rx_pin: 16
baud_rate: 9600
substitutions:
tx_pin: GPIO17
rx_pin: GPIO16
sensor:
- platform: senseair
id: senseair0
co2:
name: SenseAir CO2 Value
on_value:
then:
- senseair.background_calibration: senseair0
- senseair.background_calibration_result: senseair0
- senseair.abc_get_period: senseair0
- senseair.abc_enable: senseair0
- senseair.abc_disable: senseair0
update_interval: 15s
<<: !include common.yaml

View File

@ -1,19 +1,5 @@
uart:
- id: uart_senseair
tx_pin: 4
rx_pin: 5
baud_rate: 9600
substitutions:
tx_pin: GPIO4
rx_pin: GPIO5
sensor:
- platform: senseair
id: senseair0
co2:
name: SenseAir CO2 Value
on_value:
then:
- senseair.background_calibration: senseair0
- senseair.background_calibration_result: senseair0
- senseair.abc_get_period: senseair0
- senseair.abc_enable: senseair0
- senseair.abc_disable: senseair0
update_interval: 15s
<<: !include common.yaml

View File

@ -1,19 +1,5 @@
uart:
- id: uart_senseair
tx_pin: 4
rx_pin: 5
baud_rate: 9600
substitutions:
tx_pin: GPIO4
rx_pin: GPIO5
sensor:
- platform: senseair
id: senseair0
co2:
name: SenseAir CO2 Value
on_value:
then:
- senseair.background_calibration: senseair0
- senseair.background_calibration_result: senseair0
- senseair.abc_get_period: senseair0
- senseair.abc_enable: senseair0
- senseair.abc_disable: senseair0
update_interval: 15s
<<: !include common.yaml

View File

@ -1,19 +1,5 @@
uart:
- id: uart_senseair
tx_pin: 17
rx_pin: 16
baud_rate: 9600
substitutions:
tx_pin: GPIO17
rx_pin: GPIO16
sensor:
- platform: senseair
id: senseair0
co2:
name: SenseAir CO2 Value
on_value:
then:
- senseair.background_calibration: senseair0
- senseair.background_calibration_result: senseair0
- senseair.abc_get_period: senseair0
- senseair.abc_enable: senseair0
- senseair.abc_disable: senseair0
update_interval: 15s
<<: !include common.yaml

View File

@ -1,19 +1,5 @@
uart:
- id: uart_senseair
tx_pin: 4
rx_pin: 5
baud_rate: 9600
substitutions:
tx_pin: GPIO4
rx_pin: GPIO5
sensor:
- platform: senseair
id: senseair0
co2:
name: SenseAir CO2 Value
on_value:
then:
- senseair.background_calibration: senseair0
- senseair.background_calibration_result: senseair0
- senseair.abc_get_period: senseair0
- senseair.abc_enable: senseair0
- senseair.abc_disable: senseair0
update_interval: 15s
<<: !include common.yaml

View File

@ -1,19 +1,5 @@
uart:
- id: uart_senseair
tx_pin: 4
rx_pin: 5
baud_rate: 9600
substitutions:
tx_pin: GPIO4
rx_pin: GPIO5
sensor:
- platform: senseair
id: senseair0
co2:
name: SenseAir CO2 Value
on_value:
then:
- senseair.background_calibration: senseair0
- senseair.background_calibration_result: senseair0
- senseair.abc_get_period: senseair0
- senseair.abc_enable: senseair0
- senseair.abc_disable: senseair0
update_interval: 15s
<<: !include common.yaml

View File

@ -0,0 +1,19 @@
esphome:
on_boot:
then:
- servo.write:
id: test_servo
level: -100.0%
- servo.detach: test_servo
output:
- platform: ${output_platform}
id: servo_output_1
pin: ${pin}
servo:
id: test_servo
output: servo_output_1
restore: true
min_level: 4%
max_level: 8%

View File

@ -1,19 +1,5 @@
esphome:
on_boot:
then:
- servo.write:
id: test_servo
level: -100.0%
- servo.detach: test_servo
substitutions:
output_platform: ledc
pin: GPIO14
output:
- platform: ledc
id: servo_output_1
pin: 12
servo:
id: test_servo
output: servo_output_1
restore: true
min_level: 4%
max_level: 8%
<<: !include common.yaml

Some files were not shown because too many files have changed in this diff Show More