mirror of
				https://github.com/esphome/esphome.git
				synced 2025-11-04 09:01:49 +00:00 
			
		
		
		
	Compare commits
	
		
			46 Commits
		
	
	
		
			2022.2.0b2
			...
			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 | ||
| 
						 | 
					b528f48417 | ||
| 
						 | 
					ec7a79049a | ||
| 
						 | 
					6ddad6b299 | ||
| 
						 | 
					16dc7762f9 | ||
| 
						 | 
					09ed1aed93 | ||
| 
						 | 
					53d3718028 | ||
| 
						 | 
					2b5dce5232 | ||
| 
						 | 
					9ad84150aa | ||
| 
						 | 
					c0523590b4 | ||
| 
						 | 
					c7f091ab10 | ||
| 
						 | 
					7479e0aada | ||
| 
						 | 
					5bbee1a1fe | ||
| 
						 | 
					bdb9546ca3 | ||
| 
						 | 
					46af4cad6e | ||
| 
						 | 
					76a238912b | ||
| 
						 | 
					909a526967 | ||
| 
						 | 
					cd6f4fb93f | ||
| 
						 | 
					c19458696e | ||
| 
						 | 
					318b930e9f | ||
| 
						 | 
					9296a078a7 | 
							
								
								
									
										2
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							@@ -143,7 +143,7 @@ jobs:
 | 
			
		||||
    needs: [deploy-docker]
 | 
			
		||||
    steps:
 | 
			
		||||
      - env:
 | 
			
		||||
          TOKEN: ${{ secrets.DEPLOY_HASSIO_TOKEN }}
 | 
			
		||||
          TOKEN: ${{ secrets.DEPLOY_HA_ADDON_REPO_TOKEN }}
 | 
			
		||||
        run: |
 | 
			
		||||
          TAG="${GITHUB_REF#refs/tags/}"
 | 
			
		||||
          curl \
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ RUN \
 | 
			
		||||
    # Ubuntu python3-pip is missing wheel
 | 
			
		||||
    pip3 install --no-cache-dir \
 | 
			
		||||
        wheel==0.37.1 \
 | 
			
		||||
        platformio==5.2.4 \
 | 
			
		||||
        platformio==5.2.5 \
 | 
			
		||||
    # Change some platformio settings
 | 
			
		||||
    && platformio settings set enable_telemetry No \
 | 
			
		||||
    && platformio settings set check_libraries_interval 1000000 \
 | 
			
		||||
 
 | 
			
		||||
@@ -7,12 +7,12 @@
 | 
			
		||||
# Check SSL requirements, if enabled
 | 
			
		||||
if bashio::config.true 'ssl'; 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
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    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
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,5 @@
 | 
			
		||||
#include "climate.h"
 | 
			
		||||
#include "esphome/core/macros.h"
 | 
			
		||||
 | 
			
		||||
namespace esphome {
 | 
			
		||||
namespace climate {
 | 
			
		||||
@@ -326,14 +327,17 @@ optional<ClimateDeviceRestoreState> Climate::restore_state_() {
 | 
			
		||||
  return recovered;
 | 
			
		||||
}
 | 
			
		||||
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"
 | 
			
		||||
#define TEMP_IGNORE_MEMACCESS
 | 
			
		||||
#endif
 | 
			
		||||
  ClimateDeviceRestoreState state{};
 | 
			
		||||
  // initialize as zero to prevent random data on stack triggering erase
 | 
			
		||||
  memset(&state, 0, sizeof(ClimateDeviceRestoreState));
 | 
			
		||||
#if USE_ESP_IDF && !defined(CLANG_TIDY)
 | 
			
		||||
#ifdef TEMP_IGNORE_MEMACCESS
 | 
			
		||||
#pragma GCC diagnostic pop
 | 
			
		||||
#undef TEMP_IGNORE_MEMACCESS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  state.mode = this->mode;
 | 
			
		||||
 
 | 
			
		||||
@@ -110,6 +110,9 @@ void DallasComponent::update() {
 | 
			
		||||
  if (!result) {
 | 
			
		||||
    ESP_LOGE(TAG, "Requesting conversion failed");
 | 
			
		||||
    this->status_set_warning();
 | 
			
		||||
    for (auto *sensor : this->sensors_) {
 | 
			
		||||
      sensor->publish_state(NAN);
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -53,9 +53,9 @@ void DebugComponent::dump_config() {
 | 
			
		||||
#ifdef USE_SENSOR
 | 
			
		||||
  LOG_SENSOR("  ", "Free space on heap", this->free_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_);
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
  ESP_LOGD(TAG, "ESPHome version %s", ESPHOME_VERSION);
 | 
			
		||||
@@ -316,7 +316,7 @@ void DebugComponent::update() {
 | 
			
		||||
#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) {
 | 
			
		||||
    // NOLINTNEXTLINE(readability-static-accessed-through-instance)
 | 
			
		||||
    this->fragmentation_sensor_->publish_state(ESP.getHeapFragmentation());
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ class DebugComponent : public PollingComponent {
 | 
			
		||||
#ifdef USE_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; }
 | 
			
		||||
#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; }
 | 
			
		||||
#endif
 | 
			
		||||
  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 *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};
 | 
			
		||||
#endif
 | 
			
		||||
  sensor::Sensor *loop_time_sensor_{nullptr};
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ from esphome.const import (
 | 
			
		||||
    CONF_FRAGMENTATION,
 | 
			
		||||
    CONF_BLOCK,
 | 
			
		||||
    CONF_LOOP_TIME,
 | 
			
		||||
    ENTITY_CATEGORY_DIAGNOSTIC,
 | 
			
		||||
    UNIT_MILLISECOND,
 | 
			
		||||
    UNIT_PERCENT,
 | 
			
		||||
    UNIT_BYTES,
 | 
			
		||||
@@ -18,14 +19,34 @@ DEPENDENCIES = ["debug"]
 | 
			
		||||
 | 
			
		||||
CONFIG_SCHEMA = {
 | 
			
		||||
    cv.GenerateID(CONF_DEBUG_ID): cv.use_id(DebugComponent),
 | 
			
		||||
    cv.Optional(CONF_FREE): sensor.sensor_schema(UNIT_BYTES, ICON_COUNTER, 0),
 | 
			
		||||
    cv.Optional(CONF_BLOCK): sensor.sensor_schema(UNIT_BYTES, ICON_COUNTER, 0),
 | 
			
		||||
    cv.Optional(CONF_FREE): sensor.sensor_schema(
 | 
			
		||||
        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.only_on_esp8266,
 | 
			
		||||
        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
 | 
			
		||||
import esphome.config_validation as cv
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
@@ -11,7 +11,9 @@ DEPENDENCIES = ["debug"]
 | 
			
		||||
CONFIG_SCHEMA = cv.Schema(
 | 
			
		||||
    {
 | 
			
		||||
        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,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
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):
 | 
			
		||||
    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:
 | 
			
		||||
        raise cv.Invalid(
 | 
			
		||||
            f"Only pins {', '.join(str(x) for x in valid_pins)} support wakeup"
 | 
			
		||||
@@ -21,6 +51,14 @@ def validate_pin_number(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")
 | 
			
		||||
DeepSleepComponent = deep_sleep_ns.class_("DeepSleepComponent", cg.Component)
 | 
			
		||||
EnterDeepSleepAction = deep_sleep_ns.class_("EnterDeepSleepAction", automation.Action)
 | 
			
		||||
 
 | 
			
		||||
@@ -104,7 +104,7 @@ void DeepSleepComponent::begin_sleep(bool manual) {
 | 
			
		||||
 | 
			
		||||
  App.run_safe_shutdown_hooks();
 | 
			
		||||
 | 
			
		||||
#ifdef USE_ESP32
 | 
			
		||||
#if defined(USE_ESP32) && !defined(USE_ESP32_VARIANT_ESP32C3)
 | 
			
		||||
  if (this->sleep_duration_.has_value())
 | 
			
		||||
    esp_sleep_enable_timer_wakeup(*this->sleep_duration_);
 | 
			
		||||
  if (this->wakeup_pin_ != nullptr) {
 | 
			
		||||
@@ -126,6 +126,18 @@ void DeepSleepComponent::begin_sleep(bool manual) {
 | 
			
		||||
  esp_deep_sleep_start();
 | 
			
		||||
#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
 | 
			
		||||
  ESP.deepSleep(*this->sleep_duration_);  // NOLINT(readability-static-accessed-through-instance)
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -57,13 +57,16 @@ class DeepSleepComponent : public Component {
 | 
			
		||||
 public:
 | 
			
		||||
  /// Set the duration in ms the component should sleep once it's in deep sleep mode.
 | 
			
		||||
  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.
 | 
			
		||||
   * Use the inverted property to set the wakeup level.
 | 
			
		||||
   */
 | 
			
		||||
  void set_wakeup_pin(InternalGPIOPin *pin) { this->wakeup_pin_ = pin; }
 | 
			
		||||
 | 
			
		||||
  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);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,10 @@
 | 
			
		||||
# Source https://github.com/letscontrolit/ESPEasy/pull/3845#issuecomment-1005864664
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
if os.environ.get("ESPHOME_USE_SUBPROCESS") is None:
 | 
			
		||||
    import esptool
 | 
			
		||||
else:
 | 
			
		||||
    import subprocess
 | 
			
		||||
from SCons.Script import ARGUMENTS
 | 
			
		||||
 | 
			
		||||
# pylint: disable=E0602
 | 
			
		||||
@@ -42,8 +46,11 @@ def esp32_create_combined_bin(source, target, env):
 | 
			
		||||
        print()
 | 
			
		||||
        print(f"Using esptool.py arguments: {' '.join(cmd)}")
 | 
			
		||||
        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
 | 
			
		||||
env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_create_combined_bin)  # noqa
 | 
			
		||||
 
 | 
			
		||||
@@ -4,9 +4,10 @@
 | 
			
		||||
 | 
			
		||||
#include "esphome/core/helpers.h"
 | 
			
		||||
 | 
			
		||||
#undef ARDUINOJSON_ENABLE_STD_STRING
 | 
			
		||||
#define ARDUINOJSON_ENABLE_STD_STRING 1  // NOLINT
 | 
			
		||||
 | 
			
		||||
#define ARDUINOJSON_USE_LONG_LONG 1  // NOLINT
 | 
			
		||||
 | 
			
		||||
#include <ArduinoJson.h>
 | 
			
		||||
 | 
			
		||||
namespace esphome {
 | 
			
		||||
 
 | 
			
		||||
@@ -113,8 +113,27 @@ void LilygoT547Touchscreen::loop() {
 | 
			
		||||
      if (tp.state == 0x06)
 | 
			
		||||
        tp.state = 0x07;
 | 
			
		||||
 | 
			
		||||
      tp.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 y = (uint16_t)((buffer[i * 5 + 1 + offset] << 4) | ((buffer[i * 5 + 3 + offset] >> 4) & 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); });
 | 
			
		||||
    }
 | 
			
		||||
@@ -122,8 +141,28 @@ void LilygoT547Touchscreen::loop() {
 | 
			
		||||
    TouchPoint tp;
 | 
			
		||||
    tp.id = (buffer[0] >> 4) & 0x0F;
 | 
			
		||||
    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); });
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,7 @@ class ArduinoESP8266OTABackend : public OTABackend {
 | 
			
		||||
  OTAResponseTypes write(uint8_t *data, size_t len) override;
 | 
			
		||||
  OTAResponseTypes end() 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; }
 | 
			
		||||
#else
 | 
			
		||||
  bool supports_compression() override { return false; }
 | 
			
		||||
 
 | 
			
		||||
@@ -43,16 +43,34 @@ void TSL2591Component::disable_if_power_saving_() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TSL2591Component::setup() {
 | 
			
		||||
  if (this->component_gain_ == TSL2591_CGAIN_AUTO)
 | 
			
		||||
  switch (this->component_gain_) {
 | 
			
		||||
    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_;
 | 
			
		||||
  ESP_LOGI(TAG, "Setting up TSL2591 sensor at I2C address 0x%02X", address);
 | 
			
		||||
 | 
			
		||||
  uint8_t id;
 | 
			
		||||
  if (!this->read_byte(TSL2591_COMMAND_BIT | TSL2591_REGISTER_DEVICE_ID, &id)) {
 | 
			
		||||
    ESP_LOGE(TAG, "Failed I2C read during setup()");
 | 
			
		||||
    this->mark_failed();
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (id != 0x50) {
 | 
			
		||||
    ESP_LOGE(TAG,
 | 
			
		||||
             "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();
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  this->set_integration_time_and_gain(this->integration_time_, this->gain_);
 | 
			
		||||
  this->disable_if_power_saving_();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -161,8 +161,8 @@ bool WiFiComponent::wifi_sta_connect_(const WiFiAP &ap) {
 | 
			
		||||
  // https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_wifi.html#_CPPv417wifi_sta_config_t
 | 
			
		||||
  wifi_config_t conf;
 | 
			
		||||
  memset(&conf, 0, sizeof(conf));
 | 
			
		||||
  strlcpy(reinterpret_cast<char *>(conf.sta.ssid), ap.get_ssid().c_str(), sizeof(conf.sta.ssid));
 | 
			
		||||
  strlcpy(reinterpret_cast<char *>(conf.sta.password), ap.get_password().c_str(), sizeof(conf.sta.password));
 | 
			
		||||
  strncpy(reinterpret_cast<char *>(conf.sta.ssid), ap.get_ssid().c_str(), sizeof(conf.sta.ssid));
 | 
			
		||||
  strncpy(reinterpret_cast<char *>(conf.sta.password), ap.get_password().c_str(), sizeof(conf.sta.password));
 | 
			
		||||
 | 
			
		||||
  // The weakest authmode to accept in the fast scan mode
 | 
			
		||||
  if (ap.get_password().empty()) {
 | 
			
		||||
@@ -709,7 +709,7 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) {
 | 
			
		||||
 | 
			
		||||
  wifi_config_t conf;
 | 
			
		||||
  memset(&conf, 0, sizeof(conf));
 | 
			
		||||
  strlcpy(reinterpret_cast<char *>(conf.ap.ssid), ap.get_ssid().c_str(), sizeof(conf.ap.ssid));
 | 
			
		||||
  strncpy(reinterpret_cast<char *>(conf.ap.ssid), ap.get_ssid().c_str(), sizeof(conf.ap.ssid));
 | 
			
		||||
  conf.ap.channel = ap.get_channel().value_or(1);
 | 
			
		||||
  conf.ap.ssid_hidden = ap.get_ssid().size();
 | 
			
		||||
  conf.ap.max_connection = 5;
 | 
			
		||||
@@ -720,7 +720,7 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) {
 | 
			
		||||
    *conf.ap.password = 0;
 | 
			
		||||
  } else {
 | 
			
		||||
    conf.ap.authmode = WIFI_AUTH_WPA2_PSK;
 | 
			
		||||
    strlcpy(reinterpret_cast<char *>(conf.ap.password), ap.get_password().c_str(), sizeof(conf.ap.ssid));
 | 
			
		||||
    strncpy(reinterpret_cast<char *>(conf.ap.password), ap.get_password().c_str(), sizeof(conf.ap.ssid));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
#if ESP_IDF_VERSION_MAJOR >= 4
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
"""Constants used by esphome."""
 | 
			
		||||
 | 
			
		||||
__version__ = "2022.2.0b2"
 | 
			
		||||
__version__ = "2022.2.5"
 | 
			
		||||
 | 
			
		||||
ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -116,7 +116,7 @@ optional<uint32_t> HOT Scheduler::next_schedule_in() {
 | 
			
		||||
    return 0;
 | 
			
		||||
  return next_time - now;
 | 
			
		||||
}
 | 
			
		||||
void IRAM_ATTR HOT Scheduler::call() {
 | 
			
		||||
void HOT Scheduler::call() {
 | 
			
		||||
  const uint32_t now = this->millis_();
 | 
			
		||||
  this->process_to_add();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,12 +6,12 @@ tornado==6.1
 | 
			
		||||
tzlocal==4.1    # from time
 | 
			
		||||
tzdata>=2021.1  # from time
 | 
			
		||||
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
 | 
			
		||||
click==8.0.3
 | 
			
		||||
esphome-dashboard==20220209.0
 | 
			
		||||
aioesphomeapi==10.8.2
 | 
			
		||||
zeroconf==0.37.0
 | 
			
		||||
zeroconf==0.38.3
 | 
			
		||||
 | 
			
		||||
# esp-idf requires this, but doesn't bundle it by default
 | 
			
		||||
# https://github.com/espressif/esp-idf/blob/220590d599e134d7a5e7f1e683cc4550349ffbf8/requirements.txt#L24
 | 
			
		||||
 
 | 
			
		||||
@@ -262,7 +262,7 @@ power_supply:
 | 
			
		||||
deep_sleep:
 | 
			
		||||
  run_duration: 20s
 | 
			
		||||
  sleep_duration: 50s
 | 
			
		||||
  wakeup_pin: GPIO39
 | 
			
		||||
  wakeup_pin: GPIO2
 | 
			
		||||
  wakeup_pin_mode: INVERT_WAKEUP
 | 
			
		||||
 | 
			
		||||
ads1115:
 | 
			
		||||
 
 | 
			
		||||
@@ -60,7 +60,7 @@ deep_sleep:
 | 
			
		||||
    gpio_wakeup_reason: 10s
 | 
			
		||||
    touch_wakeup_reason: 15s
 | 
			
		||||
  sleep_duration: 50s
 | 
			
		||||
  wakeup_pin: GPIO39
 | 
			
		||||
  wakeup_pin: GPIO2
 | 
			
		||||
  wakeup_pin_mode: INVERT_WAKEUP
 | 
			
		||||
 | 
			
		||||
as3935_i2c:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user