Merge pull request #3245 from esphome/bump-2022.2.4

2022.2.4
This commit is contained in:
Jesse Hills 2022-02-21 10:54:54 +13:00 committed by GitHub
commit 138d6e505b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 114 additions and 15 deletions

View file

@ -7,12 +7,12 @@
# Check SSL requirements, if enabled # Check SSL requirements, if enabled
if bashio::config.true 'ssl'; then if bashio::config.true 'ssl'; then
if ! bashio::config.has_value 'certfile'; then if ! bashio::config.has_value 'certfile'; then
bashio::fatal 'SSL is enabled, but no certfile was specified.' bashio::log.fatal 'SSL is enabled, but no certfile was specified.'
bashio::exit.nok bashio::exit.nok
fi fi
if ! bashio::config.has_value 'keyfile'; then if ! bashio::config.has_value 'keyfile'; then
bashio::fatal 'SSL is enabled, but no keyfile was specified' bashio::log.fatal 'SSL is enabled, but no keyfile was specified'
bashio::exit.nok bashio::exit.nok
fi fi

View file

@ -1,4 +1,5 @@
#include "climate.h" #include "climate.h"
#include "esphome/core/macros.h"
namespace esphome { namespace esphome {
namespace climate { namespace climate {
@ -326,14 +327,17 @@ optional<ClimateDeviceRestoreState> Climate::restore_state_() {
return recovered; return recovered;
} }
void Climate::save_state_() { void Climate::save_state_() {
#if defined(USE_ESP_IDF) && !defined(CLANG_TIDY) #if (defined(USE_ESP_IDF) || (defined(USE_ESP8266) && USE_ARDUINO_VERSION_CODE >= VERSION_CODE(3, 0, 0))) && \
!defined(CLANG_TIDY)
#pragma GCC diagnostic ignored "-Wclass-memaccess" #pragma GCC diagnostic ignored "-Wclass-memaccess"
#define TEMP_IGNORE_MEMACCESS
#endif #endif
ClimateDeviceRestoreState state{}; ClimateDeviceRestoreState state{};
// initialize as zero to prevent random data on stack triggering erase // initialize as zero to prevent random data on stack triggering erase
memset(&state, 0, sizeof(ClimateDeviceRestoreState)); memset(&state, 0, sizeof(ClimateDeviceRestoreState));
#if USE_ESP_IDF && !defined(CLANG_TIDY) #ifdef TEMP_IGNORE_MEMACCESS
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
#undef TEMP_IGNORE_MEMACCESS
#endif #endif
state.mode = this->mode; state.mode = this->mode;

View file

@ -110,6 +110,9 @@ void DallasComponent::update() {
if (!result) { if (!result) {
ESP_LOGE(TAG, "Requesting conversion failed"); ESP_LOGE(TAG, "Requesting conversion failed");
this->status_set_warning(); this->status_set_warning();
for (auto *sensor : this->sensors_) {
sensor->publish_state(NAN);
}
return; return;
} }

View file

@ -11,9 +11,39 @@ from esphome.const import (
CONF_WAKEUP_PIN, CONF_WAKEUP_PIN,
) )
from esphome.components.esp32 import get_esp32_variant
from esphome.components.esp32.const import (
VARIANT_ESP32,
VARIANT_ESP32C3,
)
WAKEUP_PINS = {
VARIANT_ESP32: [
0,
2,
4,
12,
13,
14,
15,
25,
26,
27,
32,
33,
34,
35,
36,
37,
38,
39,
],
VARIANT_ESP32C3: [0, 1, 2, 3, 4, 5],
}
def validate_pin_number(value): def validate_pin_number(value):
valid_pins = [0, 2, 4, 12, 13, 14, 15, 25, 26, 27, 32, 33, 34, 35, 36, 37, 38, 39] valid_pins = WAKEUP_PINS.get(get_esp32_variant(), WAKEUP_PINS[VARIANT_ESP32])
if value[CONF_NUMBER] not in valid_pins: if value[CONF_NUMBER] not in valid_pins:
raise cv.Invalid( raise cv.Invalid(
f"Only pins {', '.join(str(x) for x in valid_pins)} support wakeup" f"Only pins {', '.join(str(x) for x in valid_pins)} support wakeup"
@ -21,6 +51,14 @@ def validate_pin_number(value):
return value return value
def validate_config(config):
if get_esp32_variant() == VARIANT_ESP32C3 and CONF_ESP32_EXT1_WAKEUP in config:
raise cv.Invalid("ESP32-C3 does not support wakeup from touch.")
if get_esp32_variant() == VARIANT_ESP32C3 and CONF_TOUCH_WAKEUP in config:
raise cv.Invalid("ESP32-C3 does not support wakeup from ext1")
return config
deep_sleep_ns = cg.esphome_ns.namespace("deep_sleep") deep_sleep_ns = cg.esphome_ns.namespace("deep_sleep")
DeepSleepComponent = deep_sleep_ns.class_("DeepSleepComponent", cg.Component) DeepSleepComponent = deep_sleep_ns.class_("DeepSleepComponent", cg.Component)
EnterDeepSleepAction = deep_sleep_ns.class_("EnterDeepSleepAction", automation.Action) EnterDeepSleepAction = deep_sleep_ns.class_("EnterDeepSleepAction", automation.Action)

View file

@ -104,7 +104,7 @@ void DeepSleepComponent::begin_sleep(bool manual) {
App.run_safe_shutdown_hooks(); App.run_safe_shutdown_hooks();
#ifdef USE_ESP32 #if defined(USE_ESP32) && !defined(USE_ESP32_VARIANT_ESP32C3)
if (this->sleep_duration_.has_value()) if (this->sleep_duration_.has_value())
esp_sleep_enable_timer_wakeup(*this->sleep_duration_); esp_sleep_enable_timer_wakeup(*this->sleep_duration_);
if (this->wakeup_pin_ != nullptr) { if (this->wakeup_pin_ != nullptr) {
@ -126,6 +126,18 @@ void DeepSleepComponent::begin_sleep(bool manual) {
esp_deep_sleep_start(); esp_deep_sleep_start();
#endif #endif
#ifdef USE_ESP32_VARIANT_ESP32C3
if (this->sleep_duration_.has_value())
esp_sleep_enable_timer_wakeup(*this->sleep_duration_);
if (this->wakeup_pin_ != nullptr) {
bool level = !this->wakeup_pin_->is_inverted();
if (this->wakeup_pin_mode_ == WAKEUP_PIN_MODE_INVERT_WAKEUP && this->wakeup_pin_->digital_read()) {
level = !level;
}
esp_deep_sleep_enable_gpio_wakeup(gpio_num_t(this->wakeup_pin_->get_pin()), level);
}
#endif
#ifdef USE_ESP8266 #ifdef USE_ESP8266
ESP.deepSleep(*this->sleep_duration_); // NOLINT(readability-static-accessed-through-instance) ESP.deepSleep(*this->sleep_duration_); // NOLINT(readability-static-accessed-through-instance)
#endif #endif

View file

@ -57,13 +57,16 @@ class DeepSleepComponent : public Component {
public: public:
/// Set the duration in ms the component should sleep once it's in deep sleep mode. /// Set the duration in ms the component should sleep once it's in deep sleep mode.
void set_sleep_duration(uint32_t time_ms); void set_sleep_duration(uint32_t time_ms);
#ifdef USE_ESP32 #if defined(USE_ESP32)
/** Set the pin to wake up to on the ESP32 once it's in deep sleep mode. /** Set the pin to wake up to on the ESP32 once it's in deep sleep mode.
* Use the inverted property to set the wakeup level. * Use the inverted property to set the wakeup level.
*/ */
void set_wakeup_pin(InternalGPIOPin *pin) { this->wakeup_pin_ = pin; } void set_wakeup_pin(InternalGPIOPin *pin) { this->wakeup_pin_ = pin; }
void set_wakeup_pin_mode(WakeupPinMode wakeup_pin_mode); void set_wakeup_pin_mode(WakeupPinMode wakeup_pin_mode);
#endif
#if defined(USE_ESP32) && !defined(USE_ESP32_VARIANT_ESP32C3)
void set_ext1_wakeup(Ext1Wakeup ext1_wakeup); void set_ext1_wakeup(Ext1Wakeup ext1_wakeup);

View file

@ -113,8 +113,27 @@ void LilygoT547Touchscreen::loop() {
if (tp.state == 0x06) if (tp.state == 0x06)
tp.state = 0x07; tp.state = 0x07;
tp.y = (uint16_t)((buffer[i * 5 + 1 + offset] << 4) | ((buffer[i * 5 + 3 + offset] >> 4) & 0x0F)); uint16_t y = (uint16_t)((buffer[i * 5 + 1 + offset] << 4) | ((buffer[i * 5 + 3 + offset] >> 4) & 0x0F));
tp.x = (uint16_t)((buffer[i * 5 + 2 + offset] << 4) | (buffer[i * 5 + 3 + offset] & 0x0F)); uint16_t x = (uint16_t)((buffer[i * 5 + 2 + offset] << 4) | (buffer[i * 5 + 3 + offset] & 0x0F));
switch (this->rotation_) {
case ROTATE_0_DEGREES:
tp.y = this->display_height_ - y;
tp.x = x;
break;
case ROTATE_90_DEGREES:
tp.x = this->display_height_ - y;
tp.y = this->display_width_ - x;
break;
case ROTATE_180_DEGREES:
tp.y = y;
tp.x = this->display_width_ - x;
break;
case ROTATE_270_DEGREES:
tp.x = y;
tp.y = x;
break;
}
this->defer([this, tp]() { this->send_touch_(tp); }); this->defer([this, tp]() { this->send_touch_(tp); });
} }
@ -122,8 +141,28 @@ void LilygoT547Touchscreen::loop() {
TouchPoint tp; TouchPoint tp;
tp.id = (buffer[0] >> 4) & 0x0F; tp.id = (buffer[0] >> 4) & 0x0F;
tp.state = 0x06; tp.state = 0x06;
tp.y = (uint16_t)((buffer[0 * 5 + 1] << 4) | ((buffer[0 * 5 + 3] >> 4) & 0x0F));
tp.x = (uint16_t)((buffer[0 * 5 + 2] << 4) | (buffer[0 * 5 + 3] & 0x0F)); uint16_t y = (uint16_t)((buffer[0 * 5 + 1] << 4) | ((buffer[0 * 5 + 3] >> 4) & 0x0F));
uint16_t x = (uint16_t)((buffer[0 * 5 + 2] << 4) | (buffer[0 * 5 + 3] & 0x0F));
switch (this->rotation_) {
case ROTATE_0_DEGREES:
tp.y = this->display_height_ - y;
tp.x = x;
break;
case ROTATE_90_DEGREES:
tp.x = this->display_height_ - y;
tp.y = this->display_width_ - x;
break;
case ROTATE_180_DEGREES:
tp.y = y;
tp.x = this->display_width_ - x;
break;
case ROTATE_270_DEGREES:
tp.x = y;
tp.y = x;
break;
}
this->defer([this, tp]() { this->send_touch_(tp); }); this->defer([this, tp]() { this->send_touch_(tp); });
} }

View file

@ -1,6 +1,6 @@
"""Constants used by esphome.""" """Constants used by esphome."""
__version__ = "2022.2.3" __version__ = "2022.2.4"
ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"

View file

@ -116,7 +116,7 @@ optional<uint32_t> HOT Scheduler::next_schedule_in() {
return 0; return 0;
return next_time - now; return next_time - now;
} }
void IRAM_ATTR HOT Scheduler::call() { void HOT Scheduler::call() {
const uint32_t now = this->millis_(); const uint32_t now = this->millis_();
this->process_to_add(); this->process_to_add();

View file

@ -262,7 +262,7 @@ power_supply:
deep_sleep: deep_sleep:
run_duration: 20s run_duration: 20s
sleep_duration: 50s sleep_duration: 50s
wakeup_pin: GPIO39 wakeup_pin: GPIO2
wakeup_pin_mode: INVERT_WAKEUP wakeup_pin_mode: INVERT_WAKEUP
ads1115: ads1115:

View file

@ -60,7 +60,7 @@ deep_sleep:
gpio_wakeup_reason: 10s gpio_wakeup_reason: 10s
touch_wakeup_reason: 15s touch_wakeup_reason: 15s
sleep_duration: 50s sleep_duration: 50s
wakeup_pin: GPIO39 wakeup_pin: GPIO2
wakeup_pin_mode: INVERT_WAKEUP wakeup_pin_mode: INVERT_WAKEUP
as3935_i2c: as3935_i2c: