mirror of
				https://github.com/esphome/esphome.git
				synced 2025-11-04 09:01:49 +00:00 
			
		
		
		
	Compare commits
	
		
			42 Commits
		
	
	
		
			2022.2.0b3
			...
			2022.2.5
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					8f7ff25624 | ||
| 
						 | 
					97aca8e54c | ||
| 
						 | 
					95acf19067 | ||
| 
						 | 
					3d0899aa58 | ||
| 
						 | 
					138d6e505b | ||
| 
						 | 
					2748e6ba29 | ||
| 
						 | 
					dbd4e927d8 | ||
| 
						 | 
					e73d47918f | ||
| 
						 | 
					b881bc071e | ||
| 
						 | 
					1d0395d1c7 | ||
| 
						 | 
					616c787e37 | ||
| 
						 | 
					0c4de2bc97 | ||
| 
						 | 
					c2f5ac9eba | ||
| 
						 | 
					5764c988af | ||
| 
						 | 
					ccc2fbfd67 | ||
| 
						 | 
					10b4adb8e6 | ||
| 
						 | 
					83b7181bcb | ||
| 
						 | 
					8886b7e141 | ||
| 
						 | 
					7dcc4d030b | ||
| 
						 | 
					b9398897c1 | ||
| 
						 | 
					657b1c60ae | ||
| 
						 | 
					dc54b17778 | ||
| 
						 | 
					1fb214165b | ||
| 
						 | 
					81b2fd78f5 | ||
| 
						 | 
					69002fb1e6 | ||
| 
						 | 
					75332a752d | ||
| 
						 | 
					09ed1aed93 | ||
| 
						 | 
					53d3718028 | ||
| 
						 | 
					2b5dce5232 | ||
| 
						 | 
					9ad84150aa | ||
| 
						 | 
					c0523590b4 | ||
| 
						 | 
					c7f091ab10 | ||
| 
						 | 
					7479e0aada | ||
| 
						 | 
					5bbee1a1fe | ||
| 
						 | 
					bdb9546ca3 | ||
| 
						 | 
					46af4cad6e | ||
| 
						 | 
					76a238912b | ||
| 
						 | 
					909a526967 | ||
| 
						 | 
					cd6f4fb93f | ||
| 
						 | 
					c19458696e | ||
| 
						 | 
					318b930e9f | ||
| 
						 | 
					9296a078a7 | 
@@ -43,7 +43,7 @@ RUN \
 | 
				
			|||||||
    # Ubuntu python3-pip is missing wheel
 | 
					    # Ubuntu python3-pip is missing wheel
 | 
				
			||||||
    pip3 install --no-cache-dir \
 | 
					    pip3 install --no-cache-dir \
 | 
				
			||||||
        wheel==0.37.1 \
 | 
					        wheel==0.37.1 \
 | 
				
			||||||
        platformio==5.2.4 \
 | 
					        platformio==5.2.5 \
 | 
				
			||||||
    # Change some platformio settings
 | 
					    # Change some platformio settings
 | 
				
			||||||
    && platformio settings set enable_telemetry No \
 | 
					    && platformio settings set enable_telemetry No \
 | 
				
			||||||
    && platformio settings set check_libraries_interval 1000000 \
 | 
					    && platformio settings set check_libraries_interval 1000000 \
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -53,9 +53,9 @@ void DebugComponent::dump_config() {
 | 
				
			|||||||
#ifdef USE_SENSOR
 | 
					#ifdef USE_SENSOR
 | 
				
			||||||
  LOG_SENSOR("  ", "Free space on heap", this->free_sensor_);
 | 
					  LOG_SENSOR("  ", "Free space on heap", this->free_sensor_);
 | 
				
			||||||
  LOG_SENSOR("  ", "Largest free heap block", this->block_sensor_);
 | 
					  LOG_SENSOR("  ", "Largest free heap block", this->block_sensor_);
 | 
				
			||||||
#if defined(USE_ESP8266) && ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2)
 | 
					#if defined(USE_ESP8266) && USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2)
 | 
				
			||||||
  LOG_SENSOR("  ", "Heap fragmentation", this->fragmentation_sensor_);
 | 
					  LOG_SENSOR("  ", "Heap fragmentation", this->fragmentation_sensor_);
 | 
				
			||||||
#endif  // defined(USE_ESP8266) && ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2)
 | 
					#endif  // defined(USE_ESP8266) && USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2)
 | 
				
			||||||
#endif  // USE_SENSOR
 | 
					#endif  // USE_SENSOR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ESP_LOGD(TAG, "ESPHome version %s", ESPHOME_VERSION);
 | 
					  ESP_LOGD(TAG, "ESPHome version %s", ESPHOME_VERSION);
 | 
				
			||||||
@@ -316,7 +316,7 @@ void DebugComponent::update() {
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(USE_ESP8266) && ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2)
 | 
					#if defined(USE_ESP8266) && USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2)
 | 
				
			||||||
  if (this->fragmentation_sensor_ != nullptr) {
 | 
					  if (this->fragmentation_sensor_ != nullptr) {
 | 
				
			||||||
    // NOLINTNEXTLINE(readability-static-accessed-through-instance)
 | 
					    // NOLINTNEXTLINE(readability-static-accessed-through-instance)
 | 
				
			||||||
    this->fragmentation_sensor_->publish_state(ESP.getHeapFragmentation());
 | 
					    this->fragmentation_sensor_->publish_state(ESP.getHeapFragmentation());
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,7 @@ class DebugComponent : public PollingComponent {
 | 
				
			|||||||
#ifdef USE_SENSOR
 | 
					#ifdef USE_SENSOR
 | 
				
			||||||
  void set_free_sensor(sensor::Sensor *free_sensor) { free_sensor_ = free_sensor; }
 | 
					  void set_free_sensor(sensor::Sensor *free_sensor) { free_sensor_ = free_sensor; }
 | 
				
			||||||
  void set_block_sensor(sensor::Sensor *block_sensor) { block_sensor_ = block_sensor; }
 | 
					  void set_block_sensor(sensor::Sensor *block_sensor) { block_sensor_ = block_sensor; }
 | 
				
			||||||
#if defined(USE_ESP8266) && ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2)
 | 
					#if defined(USE_ESP8266) && USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2)
 | 
				
			||||||
  void set_fragmentation_sensor(sensor::Sensor *fragmentation_sensor) { fragmentation_sensor_ = fragmentation_sensor; }
 | 
					  void set_fragmentation_sensor(sensor::Sensor *fragmentation_sensor) { fragmentation_sensor_ = fragmentation_sensor; }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  void set_loop_time_sensor(sensor::Sensor *loop_time_sensor) { loop_time_sensor_ = loop_time_sensor; }
 | 
					  void set_loop_time_sensor(sensor::Sensor *loop_time_sensor) { loop_time_sensor_ = loop_time_sensor; }
 | 
				
			||||||
@@ -42,7 +42,7 @@ class DebugComponent : public PollingComponent {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  sensor::Sensor *free_sensor_{nullptr};
 | 
					  sensor::Sensor *free_sensor_{nullptr};
 | 
				
			||||||
  sensor::Sensor *block_sensor_{nullptr};
 | 
					  sensor::Sensor *block_sensor_{nullptr};
 | 
				
			||||||
#if defined(USE_ESP8266) && ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2)
 | 
					#if defined(USE_ESP8266) && USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2)
 | 
				
			||||||
  sensor::Sensor *fragmentation_sensor_{nullptr};
 | 
					  sensor::Sensor *fragmentation_sensor_{nullptr};
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
  sensor::Sensor *loop_time_sensor_{nullptr};
 | 
					  sensor::Sensor *loop_time_sensor_{nullptr};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,7 @@ from esphome.const import (
 | 
				
			|||||||
    CONF_FRAGMENTATION,
 | 
					    CONF_FRAGMENTATION,
 | 
				
			||||||
    CONF_BLOCK,
 | 
					    CONF_BLOCK,
 | 
				
			||||||
    CONF_LOOP_TIME,
 | 
					    CONF_LOOP_TIME,
 | 
				
			||||||
 | 
					    ENTITY_CATEGORY_DIAGNOSTIC,
 | 
				
			||||||
    UNIT_MILLISECOND,
 | 
					    UNIT_MILLISECOND,
 | 
				
			||||||
    UNIT_PERCENT,
 | 
					    UNIT_PERCENT,
 | 
				
			||||||
    UNIT_BYTES,
 | 
					    UNIT_BYTES,
 | 
				
			||||||
@@ -18,14 +19,34 @@ DEPENDENCIES = ["debug"]
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
CONFIG_SCHEMA = {
 | 
					CONFIG_SCHEMA = {
 | 
				
			||||||
    cv.GenerateID(CONF_DEBUG_ID): cv.use_id(DebugComponent),
 | 
					    cv.GenerateID(CONF_DEBUG_ID): cv.use_id(DebugComponent),
 | 
				
			||||||
    cv.Optional(CONF_FREE): sensor.sensor_schema(UNIT_BYTES, ICON_COUNTER, 0),
 | 
					    cv.Optional(CONF_FREE): sensor.sensor_schema(
 | 
				
			||||||
    cv.Optional(CONF_BLOCK): sensor.sensor_schema(UNIT_BYTES, ICON_COUNTER, 0),
 | 
					        unit_of_measurement=UNIT_BYTES,
 | 
				
			||||||
 | 
					        icon=ICON_COUNTER,
 | 
				
			||||||
 | 
					        accuracy_decimals=0,
 | 
				
			||||||
 | 
					        entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
 | 
					    cv.Optional(CONF_BLOCK): sensor.sensor_schema(
 | 
				
			||||||
 | 
					        unit_of_measurement=UNIT_BYTES,
 | 
				
			||||||
 | 
					        icon=ICON_COUNTER,
 | 
				
			||||||
 | 
					        accuracy_decimals=0,
 | 
				
			||||||
 | 
					        entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
    cv.Optional(CONF_FRAGMENTATION): cv.All(
 | 
					    cv.Optional(CONF_FRAGMENTATION): cv.All(
 | 
				
			||||||
        cv.only_on_esp8266,
 | 
					        cv.only_on_esp8266,
 | 
				
			||||||
        cv.require_framework_version(esp8266_arduino=cv.Version(2, 5, 2)),
 | 
					        cv.require_framework_version(esp8266_arduino=cv.Version(2, 5, 2)),
 | 
				
			||||||
        sensor.sensor_schema(UNIT_PERCENT, ICON_COUNTER, 1),
 | 
					        sensor.sensor_schema(
 | 
				
			||||||
 | 
					            unit_of_measurement=UNIT_PERCENT,
 | 
				
			||||||
 | 
					            icon=ICON_COUNTER,
 | 
				
			||||||
 | 
					            accuracy_decimals=1,
 | 
				
			||||||
 | 
					            entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
 | 
					    cv.Optional(CONF_LOOP_TIME): sensor.sensor_schema(
 | 
				
			||||||
 | 
					        unit_of_measurement=UNIT_MILLISECOND,
 | 
				
			||||||
 | 
					        icon=ICON_TIMER,
 | 
				
			||||||
 | 
					        accuracy_decimals=0,
 | 
				
			||||||
 | 
					        entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
 | 
				
			||||||
    ),
 | 
					    ),
 | 
				
			||||||
    cv.Optional(CONF_LOOP_TIME): sensor.sensor_schema(UNIT_MILLISECOND, ICON_TIMER, 0),
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
from esphome.components import text_sensor
 | 
					from esphome.components import text_sensor
 | 
				
			||||||
import esphome.config_validation as cv
 | 
					import esphome.config_validation as cv
 | 
				
			||||||
import esphome.codegen as cg
 | 
					import esphome.codegen as cg
 | 
				
			||||||
from esphome.const import CONF_DEVICE
 | 
					from esphome.const import CONF_DEVICE, ENTITY_CATEGORY_DIAGNOSTIC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from . import CONF_DEBUG_ID, DebugComponent
 | 
					from . import CONF_DEBUG_ID, DebugComponent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -11,7 +11,9 @@ DEPENDENCIES = ["debug"]
 | 
				
			|||||||
CONFIG_SCHEMA = cv.Schema(
 | 
					CONFIG_SCHEMA = cv.Schema(
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        cv.GenerateID(CONF_DEBUG_ID): cv.use_id(DebugComponent),
 | 
					        cv.GenerateID(CONF_DEBUG_ID): cv.use_id(DebugComponent),
 | 
				
			||||||
        cv.Optional(CONF_DEVICE): text_sensor.text_sensor_schema(),
 | 
					        cv.Optional(CONF_DEVICE): text_sensor.text_sensor_schema(
 | 
				
			||||||
 | 
					            entity_category=ENTITY_CATEGORY_DIAGNOSTIC
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,10 @@
 | 
				
			|||||||
# Source https://github.com/letscontrolit/ESPEasy/pull/3845#issuecomment-1005864664
 | 
					# Source https://github.com/letscontrolit/ESPEasy/pull/3845#issuecomment-1005864664
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import esptool
 | 
					import os
 | 
				
			||||||
 | 
					if os.environ.get("ESPHOME_USE_SUBPROCESS") is None:
 | 
				
			||||||
 | 
					    import esptool
 | 
				
			||||||
 | 
					else:
 | 
				
			||||||
 | 
					    import subprocess
 | 
				
			||||||
from SCons.Script import ARGUMENTS
 | 
					from SCons.Script import ARGUMENTS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# pylint: disable=E0602
 | 
					# pylint: disable=E0602
 | 
				
			||||||
@@ -42,8 +46,11 @@ def esp32_create_combined_bin(source, target, env):
 | 
				
			|||||||
        print()
 | 
					        print()
 | 
				
			||||||
        print(f"Using esptool.py arguments: {' '.join(cmd)}")
 | 
					        print(f"Using esptool.py arguments: {' '.join(cmd)}")
 | 
				
			||||||
        print()
 | 
					        print()
 | 
				
			||||||
    esptool.main(cmd)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if os.environ.get("ESPHOME_USE_SUBPROCESS") is None:
 | 
				
			||||||
 | 
					        esptool.main(cmd)
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        subprocess.run(["esptool.py", *cmd])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# pylint: disable=E0602
 | 
					# pylint: disable=E0602
 | 
				
			||||||
env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_create_combined_bin)  # noqa
 | 
					env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_create_combined_bin)  # noqa
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,9 +4,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "esphome/core/helpers.h"
 | 
					#include "esphome/core/helpers.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#undef ARDUINOJSON_ENABLE_STD_STRING
 | 
					 | 
				
			||||||
#define ARDUINOJSON_ENABLE_STD_STRING 1  // NOLINT
 | 
					#define ARDUINOJSON_ENABLE_STD_STRING 1  // NOLINT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ARDUINOJSON_USE_LONG_LONG 1  // NOLINT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <ArduinoJson.h>
 | 
					#include <ArduinoJson.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace esphome {
 | 
					namespace esphome {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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); });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,7 +17,7 @@ class ArduinoESP8266OTABackend : public OTABackend {
 | 
				
			|||||||
  OTAResponseTypes write(uint8_t *data, size_t len) override;
 | 
					  OTAResponseTypes write(uint8_t *data, size_t len) override;
 | 
				
			||||||
  OTAResponseTypes end() override;
 | 
					  OTAResponseTypes end() override;
 | 
				
			||||||
  void abort() override;
 | 
					  void abort() override;
 | 
				
			||||||
#if ARDUINO_VERSION_CODE >= VERSION_CODE(2, 7, 0)
 | 
					#if USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 7, 0)
 | 
				
			||||||
  bool supports_compression() override { return true; }
 | 
					  bool supports_compression() override { return true; }
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  bool supports_compression() override { return false; }
 | 
					  bool supports_compression() override { return false; }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,16 +43,34 @@ void TSL2591Component::disable_if_power_saving_() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TSL2591Component::setup() {
 | 
					void TSL2591Component::setup() {
 | 
				
			||||||
  if (this->component_gain_ == TSL2591_CGAIN_AUTO)
 | 
					  switch (this->component_gain_) {
 | 
				
			||||||
    this->gain_ = TSL2591_GAIN_MED;
 | 
					    case TSL2591_CGAIN_LOW:
 | 
				
			||||||
 | 
					      this->gain_ = TSL2591_GAIN_LOW;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case TSL2591_CGAIN_MED:
 | 
				
			||||||
 | 
					      this->gain_ = TSL2591_GAIN_MED;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case TSL2591_CGAIN_HIGH:
 | 
				
			||||||
 | 
					      this->gain_ = TSL2591_GAIN_HIGH;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case TSL2591_CGAIN_MAX:
 | 
				
			||||||
 | 
					      this->gain_ = TSL2591_GAIN_MAX;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case TSL2591_CGAIN_AUTO:
 | 
				
			||||||
 | 
					      this->gain_ = TSL2591_GAIN_MED;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  uint8_t address = this->address_;
 | 
					  uint8_t address = this->address_;
 | 
				
			||||||
  ESP_LOGI(TAG, "Setting up TSL2591 sensor at I2C address 0x%02X", address);
 | 
					  ESP_LOGI(TAG, "Setting up TSL2591 sensor at I2C address 0x%02X", address);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  uint8_t id;
 | 
					  uint8_t id;
 | 
				
			||||||
  if (!this->read_byte(TSL2591_COMMAND_BIT | TSL2591_REGISTER_DEVICE_ID, &id)) {
 | 
					  if (!this->read_byte(TSL2591_COMMAND_BIT | TSL2591_REGISTER_DEVICE_ID, &id)) {
 | 
				
			||||||
    ESP_LOGE(TAG, "Failed I2C read during setup()");
 | 
					    ESP_LOGE(TAG, "Failed I2C read during setup()");
 | 
				
			||||||
    this->mark_failed();
 | 
					    this->mark_failed();
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (id != 0x50) {
 | 
					  if (id != 0x50) {
 | 
				
			||||||
    ESP_LOGE(TAG,
 | 
					    ESP_LOGE(TAG,
 | 
				
			||||||
             "Could not find the TSL2591 sensor. The ID register of the device at address 0x%02X reported 0x%02X "
 | 
					             "Could not find the TSL2591 sensor. The ID register of the device at address 0x%02X reported 0x%02X "
 | 
				
			||||||
@@ -61,6 +79,7 @@ void TSL2591Component::setup() {
 | 
				
			|||||||
    this->mark_failed();
 | 
					    this->mark_failed();
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  this->set_integration_time_and_gain(this->integration_time_, this->gain_);
 | 
					  this->set_integration_time_and_gain(this->integration_time_, this->gain_);
 | 
				
			||||||
  this->disable_if_power_saving_();
 | 
					  this->disable_if_power_saving_();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
"""Constants used by esphome."""
 | 
					"""Constants used by esphome."""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__version__ = "2022.2.0b3"
 | 
					__version__ = "2022.2.5"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,12 +6,12 @@ tornado==6.1
 | 
				
			|||||||
tzlocal==4.1    # from time
 | 
					tzlocal==4.1    # from time
 | 
				
			||||||
tzdata>=2021.1  # from time
 | 
					tzdata>=2021.1  # from time
 | 
				
			||||||
pyserial==3.5
 | 
					pyserial==3.5
 | 
				
			||||||
platformio==5.2.4  # When updating platformio, also update Dockerfile
 | 
					platformio==5.2.5  # When updating platformio, also update Dockerfile
 | 
				
			||||||
esptool==3.2
 | 
					esptool==3.2
 | 
				
			||||||
click==8.0.3
 | 
					click==8.0.3
 | 
				
			||||||
esphome-dashboard==20220209.0
 | 
					esphome-dashboard==20220209.0
 | 
				
			||||||
aioesphomeapi==10.8.2
 | 
					aioesphomeapi==10.8.2
 | 
				
			||||||
zeroconf==0.37.0
 | 
					zeroconf==0.38.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# esp-idf requires this, but doesn't bundle it by default
 | 
					# esp-idf requires this, but doesn't bundle it by default
 | 
				
			||||||
# https://github.com/espressif/esp-idf/blob/220590d599e134d7a5e7f1e683cc4550349ffbf8/requirements.txt#L24
 | 
					# https://github.com/espressif/esp-idf/blob/220590d599e134d7a5e7f1e683cc4550349ffbf8/requirements.txt#L24
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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:
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user