mirror of
https://github.com/esphome/esphome.git
synced 2024-11-30 10:44:13 +01:00
commit
138d6e505b
11 changed files with 114 additions and 15 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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); });
|
||||||
}
|
}
|
||||||
|
|
|
@ -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-_"
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue