mirror of
https://github.com/esphome/esphome.git
synced 2025-10-07 04:13:47 +01:00
Merge branch 'dev' into logger_runtime_tags
This commit is contained in:
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@@ -466,7 +466,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
python-version: ${{ env.DEFAULT_PYTHON }}
|
python-version: ${{ env.DEFAULT_PYTHON }}
|
||||||
cache-key: ${{ needs.common.outputs.cache-key }}
|
cache-key: ${{ needs.common.outputs.cache-key }}
|
||||||
- uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1
|
- uses: esphome/action@43cd1109c09c544d97196f7730ee5b2e0cc6d81e # v3.0.1 fork with pinned actions/cache
|
||||||
env:
|
env:
|
||||||
SKIP: pylint,clang-tidy-hash
|
SKIP: pylint,clang-tidy-hash
|
||||||
- uses: pre-commit-ci/lite-action@5d6cc0eb514c891a40562a58a8e71576c5c7fb43 # v1.1.0
|
- uses: pre-commit-ci/lite-action@5d6cc0eb514c891a40562a58a8e71576c5c7fb43 # v1.1.0
|
||||||
|
4
.github/workflows/codeql.yml
vendored
4
.github/workflows/codeql.yml
vendored
@@ -58,7 +58,7 @@ jobs:
|
|||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.30.5
|
uses: github/codeql-action/init@64d10c13136e1c5bce3e5fbde8d4906eeaafc885 # v3.30.6
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
build-mode: ${{ matrix.build-mode }}
|
build-mode: ${{ matrix.build-mode }}
|
||||||
@@ -86,6 +86,6 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.30.5
|
uses: github/codeql-action/analyze@64d10c13136e1c5bce3e5fbde8d4906eeaafc885 # v3.30.6
|
||||||
with:
|
with:
|
||||||
category: "/language:${{matrix.language}}"
|
category: "/language:${{matrix.language}}"
|
||||||
|
2
.github/workflows/stale.yml
vendored
2
.github/workflows/stale.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Stale
|
- name: Stale
|
||||||
uses: actions/stale@3a9db7e6a41a89f618792c92c0e97cc736e1b13f # v10.0.0
|
uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10.1.0
|
||||||
with:
|
with:
|
||||||
debug-only: ${{ github.ref != 'refs/heads/dev' }} # Dry-run when not run on dev branch
|
debug-only: ${{ github.ref != 'refs/heads/dev' }} # Dry-run when not run on dev branch
|
||||||
remove-stale-when-updated: true
|
remove-stale-when-updated: true
|
||||||
|
@@ -11,7 +11,7 @@ ci:
|
|||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||||
# Ruff version.
|
# Ruff version.
|
||||||
rev: v0.13.2
|
rev: v0.13.3
|
||||||
hooks:
|
hooks:
|
||||||
# Run the linter.
|
# Run the linter.
|
||||||
- id: ruff
|
- id: ruff
|
||||||
|
@@ -14,9 +14,11 @@ from typing import Protocol
|
|||||||
|
|
||||||
import argcomplete
|
import argcomplete
|
||||||
|
|
||||||
|
# Note: Do not import modules from esphome.components here, as this would
|
||||||
|
# cause them to be loaded before external components are processed, resulting
|
||||||
|
# in the built-in version being used instead of the external component one.
|
||||||
from esphome import const, writer, yaml_util
|
from esphome import const, writer, yaml_util
|
||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
from esphome.components.mqtt import CONF_DISCOVER_IP
|
|
||||||
from esphome.config import iter_component_configs, read_config, strip_default_ids
|
from esphome.config import iter_component_configs, read_config, strip_default_ids
|
||||||
from esphome.const import (
|
from esphome.const import (
|
||||||
ALLOWED_NAME_CHARS,
|
ALLOWED_NAME_CHARS,
|
||||||
@@ -240,6 +242,8 @@ def has_ota() -> bool:
|
|||||||
|
|
||||||
def has_mqtt_ip_lookup() -> bool:
|
def has_mqtt_ip_lookup() -> bool:
|
||||||
"""Check if MQTT is available and IP lookup is supported."""
|
"""Check if MQTT is available and IP lookup is supported."""
|
||||||
|
from esphome.components.mqtt import CONF_DISCOVER_IP
|
||||||
|
|
||||||
if CONF_MQTT not in CORE.config:
|
if CONF_MQTT not in CORE.config:
|
||||||
return False
|
return False
|
||||||
# Default Enabled
|
# Default Enabled
|
||||||
|
@@ -366,9 +366,18 @@ class Logger : public Component {
|
|||||||
buffer[pos++] = '[';
|
buffer[pos++] = '[';
|
||||||
copy_string(buffer, pos, tag);
|
copy_string(buffer, pos, tag);
|
||||||
buffer[pos++] = ':';
|
buffer[pos++] = ':';
|
||||||
buffer[pos++] = '0' + (line / 100) % 10;
|
// Format line number without modulo operations (passed by value, safe to mutate)
|
||||||
buffer[pos++] = '0' + (line / 10) % 10;
|
if (line > 999) [[unlikely]] {
|
||||||
buffer[pos++] = '0' + line % 10;
|
int thousands = line / 1000;
|
||||||
|
buffer[pos++] = '0' + thousands;
|
||||||
|
line -= thousands * 1000;
|
||||||
|
}
|
||||||
|
int hundreds = line / 100;
|
||||||
|
int remainder = line - hundreds * 100;
|
||||||
|
int tens = remainder / 10;
|
||||||
|
buffer[pos++] = '0' + hundreds;
|
||||||
|
buffer[pos++] = '0' + tens;
|
||||||
|
buffer[pos++] = '0' + (remainder - tens * 10);
|
||||||
buffer[pos++] = ']';
|
buffer[pos++] = ']';
|
||||||
|
|
||||||
#if defined(USE_ESP32) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
|
#if defined(USE_ESP32) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR)
|
||||||
|
@@ -3,11 +3,10 @@
|
|||||||
namespace esphome::logger {
|
namespace esphome::logger {
|
||||||
|
|
||||||
void LoggerLevelSelect::publish_state(int level) {
|
void LoggerLevelSelect::publish_state(int level) {
|
||||||
auto value = this->at(level);
|
const auto &option = this->at(level_to_index(level));
|
||||||
if (!value) {
|
if (!option)
|
||||||
return;
|
return;
|
||||||
}
|
Select::publish_state(option.value());
|
||||||
Select::publish_state(value.value());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoggerLevelSelect::setup() {
|
void LoggerLevelSelect::setup() {
|
||||||
@@ -16,10 +15,10 @@ void LoggerLevelSelect::setup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LoggerLevelSelect::control(const std::string &value) {
|
void LoggerLevelSelect::control(const std::string &value) {
|
||||||
auto level = this->index_of(value);
|
const auto index = this->index_of(value);
|
||||||
if (!level)
|
if (!index)
|
||||||
return;
|
return;
|
||||||
this->parent_->set_log_level(level.value());
|
this->parent_->set_log_level(index_to_level(index.value()));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace esphome::logger
|
} // namespace esphome::logger
|
||||||
|
@@ -3,11 +3,18 @@
|
|||||||
#include "esphome/components/select/select.h"
|
#include "esphome/components/select/select.h"
|
||||||
#include "esphome/core/component.h"
|
#include "esphome/core/component.h"
|
||||||
#include "esphome/components/logger/logger.h"
|
#include "esphome/components/logger/logger.h"
|
||||||
|
|
||||||
namespace esphome::logger {
|
namespace esphome::logger {
|
||||||
class LoggerLevelSelect : public Component, public select::Select, public Parented<Logger> {
|
class LoggerLevelSelect : public Component, public select::Select, public Parented<Logger> {
|
||||||
public:
|
public:
|
||||||
void publish_state(int level);
|
void publish_state(int level);
|
||||||
void setup() override;
|
void setup() override;
|
||||||
void control(const std::string &value) override;
|
void control(const std::string &value) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// Convert log level to option index (skip CONFIG at level 4)
|
||||||
|
static uint8_t level_to_index(uint8_t level) { return (level > ESPHOME_LOG_LEVEL_CONFIG) ? level - 1 : level; }
|
||||||
|
// Convert option index to log level (skip CONFIG at level 4)
|
||||||
|
static uint8_t index_to_level(uint8_t index) { return (index >= ESPHOME_LOG_LEVEL_CONFIG) ? index + 1 : index; }
|
||||||
};
|
};
|
||||||
} // namespace esphome::logger
|
} // namespace esphome::logger
|
||||||
|
@@ -13,45 +13,46 @@ static const char *const TAG = "mpr121";
|
|||||||
void MPR121Component::setup() {
|
void MPR121Component::setup() {
|
||||||
// soft reset device
|
// soft reset device
|
||||||
this->write_byte(MPR121_SOFTRESET, 0x63);
|
this->write_byte(MPR121_SOFTRESET, 0x63);
|
||||||
delay(100); // NOLINT
|
this->set_timeout(100, [this]() {
|
||||||
if (!this->write_byte(MPR121_ECR, 0x0)) {
|
if (!this->write_byte(MPR121_ECR, 0x0)) {
|
||||||
this->error_code_ = COMMUNICATION_FAILED;
|
this->error_code_ = COMMUNICATION_FAILED;
|
||||||
this->mark_failed();
|
this->mark_failed();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// set touch sensitivity for all 12 channels
|
||||||
|
for (auto *channel : this->channels_) {
|
||||||
|
channel->setup();
|
||||||
|
}
|
||||||
|
this->write_byte(MPR121_MHDR, 0x01);
|
||||||
|
this->write_byte(MPR121_NHDR, 0x01);
|
||||||
|
this->write_byte(MPR121_NCLR, 0x0E);
|
||||||
|
this->write_byte(MPR121_FDLR, 0x00);
|
||||||
|
|
||||||
// set touch sensitivity for all 12 channels
|
this->write_byte(MPR121_MHDF, 0x01);
|
||||||
for (auto *channel : this->channels_) {
|
this->write_byte(MPR121_NHDF, 0x05);
|
||||||
channel->setup();
|
this->write_byte(MPR121_NCLF, 0x01);
|
||||||
}
|
this->write_byte(MPR121_FDLF, 0x00);
|
||||||
this->write_byte(MPR121_MHDR, 0x01);
|
|
||||||
this->write_byte(MPR121_NHDR, 0x01);
|
|
||||||
this->write_byte(MPR121_NCLR, 0x0E);
|
|
||||||
this->write_byte(MPR121_FDLR, 0x00);
|
|
||||||
|
|
||||||
this->write_byte(MPR121_MHDF, 0x01);
|
this->write_byte(MPR121_NHDT, 0x00);
|
||||||
this->write_byte(MPR121_NHDF, 0x05);
|
this->write_byte(MPR121_NCLT, 0x00);
|
||||||
this->write_byte(MPR121_NCLF, 0x01);
|
this->write_byte(MPR121_FDLT, 0x00);
|
||||||
this->write_byte(MPR121_FDLF, 0x00);
|
|
||||||
|
|
||||||
this->write_byte(MPR121_NHDT, 0x00);
|
this->write_byte(MPR121_DEBOUNCE, 0);
|
||||||
this->write_byte(MPR121_NCLT, 0x00);
|
// default, 16uA charge current
|
||||||
this->write_byte(MPR121_FDLT, 0x00);
|
this->write_byte(MPR121_CONFIG1, 0x10);
|
||||||
|
// 0.5uS encoding, 1ms period
|
||||||
|
this->write_byte(MPR121_CONFIG2, 0x20);
|
||||||
|
|
||||||
this->write_byte(MPR121_DEBOUNCE, 0);
|
// Write the Electrode Configuration Register
|
||||||
// default, 16uA charge current
|
// * Highest 2 bits is "Calibration Lock", which we set to a value corresponding to 5 bits.
|
||||||
this->write_byte(MPR121_CONFIG1, 0x10);
|
// * The 2 bits below is "Proximity Enable" and are left at 0.
|
||||||
// 0.5uS encoding, 1ms period
|
// * The 4 least significant bits control how many electrodes are enabled. Electrodes are enabled
|
||||||
this->write_byte(MPR121_CONFIG2, 0x20);
|
// as a range, starting at 0 up to the highest channel index used.
|
||||||
|
this->write_byte(MPR121_ECR, 0x80 | (this->max_touch_channel_ + 1));
|
||||||
|
|
||||||
// Write the Electrode Configuration Register
|
this->flush_gpio_();
|
||||||
// * Highest 2 bits is "Calibration Lock", which we set to a value corresponding to 5 bits.
|
this->setup_complete_ = true;
|
||||||
// * The 2 bits below is "Proximity Enable" and are left at 0.
|
});
|
||||||
// * The 4 least significant bits control how many electrodes are enabled. Electrodes are enabled
|
|
||||||
// as a range, starting at 0 up to the highest channel index used.
|
|
||||||
this->write_byte(MPR121_ECR, 0x80 | (this->max_touch_channel_ + 1));
|
|
||||||
|
|
||||||
this->flush_gpio_();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MPR121Component::set_touch_debounce(uint8_t debounce) {
|
void MPR121Component::set_touch_debounce(uint8_t debounce) {
|
||||||
@@ -73,15 +74,15 @@ void MPR121Component::dump_config() {
|
|||||||
case COMMUNICATION_FAILED:
|
case COMMUNICATION_FAILED:
|
||||||
ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
|
ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
|
||||||
break;
|
break;
|
||||||
case WRONG_CHIP_STATE:
|
|
||||||
ESP_LOGE(TAG, "MPR121 has wrong default value for CONFIG2?");
|
|
||||||
break;
|
|
||||||
case NONE:
|
case NONE:
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void MPR121Component::loop() {
|
void MPR121Component::loop() {
|
||||||
|
if (!this->setup_complete_)
|
||||||
|
return;
|
||||||
|
|
||||||
uint16_t val = 0;
|
uint16_t val = 0;
|
||||||
this->read_byte_16(MPR121_TOUCHSTATUS_L, &val);
|
this->read_byte_16(MPR121_TOUCHSTATUS_L, &val);
|
||||||
|
|
||||||
|
@@ -80,6 +80,7 @@ class MPR121Component : public Component, public i2c::I2CDevice {
|
|||||||
void pin_mode(uint8_t ionum, gpio::Flags flags);
|
void pin_mode(uint8_t ionum, gpio::Flags flags);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
bool setup_complete_{false};
|
||||||
std::vector<MPR121Channel *> channels_{};
|
std::vector<MPR121Channel *> channels_{};
|
||||||
uint8_t debounce_{0};
|
uint8_t debounce_{0};
|
||||||
uint8_t touch_threshold_{};
|
uint8_t touch_threshold_{};
|
||||||
@@ -88,7 +89,6 @@ class MPR121Component : public Component, public i2c::I2CDevice {
|
|||||||
enum ErrorCode {
|
enum ErrorCode {
|
||||||
NONE = 0,
|
NONE = 0,
|
||||||
COMMUNICATION_FAILED,
|
COMMUNICATION_FAILED,
|
||||||
WRONG_CHIP_STATE,
|
|
||||||
} error_code_{NONE};
|
} error_code_{NONE};
|
||||||
|
|
||||||
bool flush_gpio_();
|
bool flush_gpio_();
|
||||||
|
@@ -45,24 +45,26 @@ void SPS30Component::setup() {
|
|||||||
}
|
}
|
||||||
ESP_LOGV(TAG, " Serial number: %s", this->serial_number_);
|
ESP_LOGV(TAG, " Serial number: %s", this->serial_number_);
|
||||||
|
|
||||||
bool result;
|
|
||||||
if (this->fan_interval_.has_value()) {
|
if (this->fan_interval_.has_value()) {
|
||||||
// override default value
|
// override default value
|
||||||
result = this->write_command(SPS30_CMD_SET_AUTOMATIC_CLEANING_INTERVAL_SECONDS, this->fan_interval_.value());
|
this->result_ =
|
||||||
|
this->write_command(SPS30_CMD_SET_AUTOMATIC_CLEANING_INTERVAL_SECONDS, this->fan_interval_.value());
|
||||||
} else {
|
} else {
|
||||||
result = this->write_command(SPS30_CMD_SET_AUTOMATIC_CLEANING_INTERVAL_SECONDS);
|
this->result_ = this->write_command(SPS30_CMD_SET_AUTOMATIC_CLEANING_INTERVAL_SECONDS);
|
||||||
}
|
|
||||||
if (result) {
|
|
||||||
delay(20);
|
|
||||||
uint16_t secs[2];
|
|
||||||
if (this->read_data(secs, 2)) {
|
|
||||||
this->fan_interval_ = secs[0] << 16 | secs[1];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this->status_clear_warning();
|
this->set_timeout(20, [this]() {
|
||||||
this->skipped_data_read_cycles_ = 0;
|
if (this->result_) {
|
||||||
this->start_continuous_measurement_();
|
uint16_t secs[2];
|
||||||
|
if (this->read_data(secs, 2)) {
|
||||||
|
this->fan_interval_ = secs[0] << 16 | secs[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this->status_clear_warning();
|
||||||
|
this->skipped_data_read_cycles_ = 0;
|
||||||
|
this->start_continuous_measurement_();
|
||||||
|
this->setup_complete_ = true;
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,6 +113,8 @@ void SPS30Component::dump_config() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SPS30Component::update() {
|
void SPS30Component::update() {
|
||||||
|
if (!this->setup_complete_)
|
||||||
|
return;
|
||||||
/// Check if warning flag active (sensor reconnected?)
|
/// Check if warning flag active (sensor reconnected?)
|
||||||
if (this->status_has_warning()) {
|
if (this->status_has_warning()) {
|
||||||
ESP_LOGD(TAG, "Reconnecting");
|
ESP_LOGD(TAG, "Reconnecting");
|
||||||
|
@@ -30,9 +30,12 @@ class SPS30Component : public PollingComponent, public sensirion_common::Sensiri
|
|||||||
bool start_fan_cleaning();
|
bool start_fan_cleaning();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
bool result_{false};
|
||||||
|
bool setup_complete_{false};
|
||||||
uint16_t raw_firmware_version_;
|
uint16_t raw_firmware_version_;
|
||||||
char serial_number_[17] = {0}; /// Terminating NULL character
|
char serial_number_[17] = {0}; /// Terminating NULL character
|
||||||
uint8_t skipped_data_read_cycles_ = 0;
|
uint8_t skipped_data_read_cycles_ = 0;
|
||||||
|
|
||||||
bool start_continuous_measurement_();
|
bool start_continuous_measurement_();
|
||||||
|
|
||||||
enum ErrorCode : uint8_t {
|
enum ErrorCode : uint8_t {
|
||||||
|
@@ -1169,7 +1169,7 @@ UNIT_KILOMETER = "km"
|
|||||||
UNIT_KILOMETER_PER_HOUR = "km/h"
|
UNIT_KILOMETER_PER_HOUR = "km/h"
|
||||||
UNIT_KILOVOLT_AMPS = "kVA"
|
UNIT_KILOVOLT_AMPS = "kVA"
|
||||||
UNIT_KILOVOLT_AMPS_HOURS = "kVAh"
|
UNIT_KILOVOLT_AMPS_HOURS = "kVAh"
|
||||||
UNIT_KILOVOLT_AMPS_REACTIVE = "kVAR"
|
UNIT_KILOVOLT_AMPS_REACTIVE = "kvar"
|
||||||
UNIT_KILOVOLT_AMPS_REACTIVE_HOURS = "kvarh"
|
UNIT_KILOVOLT_AMPS_REACTIVE_HOURS = "kvarh"
|
||||||
UNIT_KILOWATT = "kW"
|
UNIT_KILOWATT = "kW"
|
||||||
UNIT_KILOWATT_HOURS = "kWh"
|
UNIT_KILOWATT_HOURS = "kWh"
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
pylint==3.3.8
|
pylint==3.3.8
|
||||||
flake8==7.3.0 # also change in .pre-commit-config.yaml when updating
|
flake8==7.3.0 # also change in .pre-commit-config.yaml when updating
|
||||||
ruff==0.13.2 # also change in .pre-commit-config.yaml when updating
|
ruff==0.13.3 # also change in .pre-commit-config.yaml when updating
|
||||||
pyupgrade==3.20.0 # also change in .pre-commit-config.yaml when updating
|
pyupgrade==3.20.0 # also change in .pre-commit-config.yaml when updating
|
||||||
pre-commit
|
pre-commit
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user