mirror of
				https://github.com/esphome/esphome.git
				synced 2025-11-03 00:21:56 +00:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			2022.12.0b
			...
			jesserockz
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					7a80bfae50 | 
							
								
								
									
										2
									
								
								.github/workflows/lock.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/lock.yml
									
									
									
									
										vendored
									
									
								
							@@ -18,7 +18,7 @@ jobs:
 | 
			
		||||
  lock:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: dessant/lock-threads@v4
 | 
			
		||||
      - uses: dessant/lock-threads@v3
 | 
			
		||||
        with:
 | 
			
		||||
          pr-inactive-days: "1"
 | 
			
		||||
          pr-lock-reason: ""
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,7 @@ repos:
 | 
			
		||||
          - --branch=release
 | 
			
		||||
          - --branch=beta
 | 
			
		||||
  - repo: https://github.com/asottile/pyupgrade
 | 
			
		||||
    rev: v3.3.0
 | 
			
		||||
    rev: v3.2.2
 | 
			
		||||
    hooks:
 | 
			
		||||
      - id: pyupgrade
 | 
			
		||||
        args: [--py39-plus]
 | 
			
		||||
 
 | 
			
		||||
@@ -208,7 +208,6 @@ esphome/components/sim800l/* @glmnet
 | 
			
		||||
esphome/components/sm2135/* @BoukeHaarsma23
 | 
			
		||||
esphome/components/sml/* @alengwenus
 | 
			
		||||
esphome/components/smt100/* @piechade
 | 
			
		||||
esphome/components/sn74hc165/* @jesserockz
 | 
			
		||||
esphome/components/socket/* @esphome/core
 | 
			
		||||
esphome/components/sonoff_d1/* @anatoly-savchenkov
 | 
			
		||||
esphome/components/spi/* @esphome/core
 | 
			
		||||
 
 | 
			
		||||
@@ -251,7 +251,7 @@ bool DallasTemperatureSensor::check_scratch_pad() {
 | 
			
		||||
      config_validity = ((this->scratch_pad_[4] & 0x10) == 0x10);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
#ifdef ESPHOME_LOG_LEVEL_VERY_VERBOSE
 | 
			
		||||
#ifdef ESPHOME_LOG_HAS_VERY_VERBOSE
 | 
			
		||||
  ESP_LOGVV(TAG, "Scratch pad: %02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X (%02X)", this->scratch_pad_[0],
 | 
			
		||||
            this->scratch_pad_[1], this->scratch_pad_[2], this->scratch_pad_[3], this->scratch_pad_[4],
 | 
			
		||||
            this->scratch_pad_[5], this->scratch_pad_[6], this->scratch_pad_[7], this->scratch_pad_[8],
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
import requests
 | 
			
		||||
 | 
			
		||||
import esphome.codegen as cg
 | 
			
		||||
import esphome.config_validation as cv
 | 
			
		||||
@@ -7,7 +6,6 @@ from esphome.components.packages import validate_source_shorthand
 | 
			
		||||
from esphome.const import CONF_WIFI
 | 
			
		||||
from esphome.wizard import wizard_file
 | 
			
		||||
from esphome.yaml_util import dump
 | 
			
		||||
from esphome import git
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
dashboard_import_ns = cg.esphome_ns.namespace("dashboard_import")
 | 
			
		||||
@@ -27,12 +25,9 @@ def validate_import_url(value):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CONF_PACKAGE_IMPORT_URL = "package_import_url"
 | 
			
		||||
CONF_IMPORT_FULL_CONFIG = "import_full_config"
 | 
			
		||||
 | 
			
		||||
CONFIG_SCHEMA = cv.Schema(
 | 
			
		||||
    {
 | 
			
		||||
        cv.Required(CONF_PACKAGE_IMPORT_URL): validate_import_url,
 | 
			
		||||
        cv.Optional(CONF_IMPORT_FULL_CONFIG, default=False): cv.boolean,
 | 
			
		||||
    }
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -46,9 +41,6 @@ wifi:
 | 
			
		||||
 | 
			
		||||
async def to_code(config):
 | 
			
		||||
    cg.add_define("USE_DASHBOARD_IMPORT")
 | 
			
		||||
    url = config[CONF_PACKAGE_IMPORT_URL]
 | 
			
		||||
    if config[CONF_IMPORT_FULL_CONFIG]:
 | 
			
		||||
        url += "?full_config"
 | 
			
		||||
    cg.add(dashboard_import_ns.set_package_import_url(config[CONF_PACKAGE_IMPORT_URL]))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -72,30 +64,17 @@ def import_config(
 | 
			
		||||
            encoding="utf8",
 | 
			
		||||
        )
 | 
			
		||||
    else:
 | 
			
		||||
        git_file = git.GitFile.from_shorthand(import_url)
 | 
			
		||||
        config = {
 | 
			
		||||
            "substitutions": {"name": name},
 | 
			
		||||
            "packages": {project_name: import_url},
 | 
			
		||||
            "esphome": {
 | 
			
		||||
                "name": "${name}",
 | 
			
		||||
                "name_add_mac_suffix": False,
 | 
			
		||||
            },
 | 
			
		||||
        }
 | 
			
		||||
        output = dump(config)
 | 
			
		||||
 | 
			
		||||
        if git_file.query and "full_config" in git_file.query:
 | 
			
		||||
            url = git_file.raw_url
 | 
			
		||||
            try:
 | 
			
		||||
                req = requests.get(url, timeout=30)
 | 
			
		||||
                req.raise_for_status()
 | 
			
		||||
            except requests.exceptions.RequestException as e:
 | 
			
		||||
                raise ValueError(f"Error while fetching {url}: {e}") from e
 | 
			
		||||
        if network == CONF_WIFI:
 | 
			
		||||
            output += WIFI_CONFIG
 | 
			
		||||
 | 
			
		||||
            p.write_text(req.text, encoding="utf8")
 | 
			
		||||
 | 
			
		||||
        else:
 | 
			
		||||
            config = {
 | 
			
		||||
                "substitutions": {"name": name},
 | 
			
		||||
                "packages": {project_name: import_url},
 | 
			
		||||
                "esphome": {
 | 
			
		||||
                    "name": "${name}",
 | 
			
		||||
                    "name_add_mac_suffix": False,
 | 
			
		||||
                },
 | 
			
		||||
            }
 | 
			
		||||
            output = dump(config)
 | 
			
		||||
 | 
			
		||||
            if network == CONF_WIFI:
 | 
			
		||||
                output += WIFI_CONFIG
 | 
			
		||||
 | 
			
		||||
            p.write_text(output, encoding="utf8")
 | 
			
		||||
        p.write_text(output, encoding="utf8")
 | 
			
		||||
 
 | 
			
		||||
@@ -147,7 +147,7 @@ void DeepSleepComponent::begin_sleep(bool manual) {
 | 
			
		||||
    if (this->wakeup_pin_mode_ == WAKEUP_PIN_MODE_INVERT_WAKEUP && this->wakeup_pin_->digital_read()) {
 | 
			
		||||
      level = !level;
 | 
			
		||||
    }
 | 
			
		||||
    esp_deep_sleep_enable_gpio_wakeup(1 << this->wakeup_pin_->get_pin(),
 | 
			
		||||
    esp_deep_sleep_enable_gpio_wakeup(gpio_num_t(this->wakeup_pin_->get_pin()),
 | 
			
		||||
                                      static_cast<esp_deepsleep_gpio_wake_up_mode_t>(level));
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -33,7 +33,7 @@ from .const import (  # noqa
 | 
			
		||||
    VARIANT_FRIENDLY,
 | 
			
		||||
    VARIANTS,
 | 
			
		||||
)
 | 
			
		||||
from .boards import BOARDS
 | 
			
		||||
from .boards import BOARD_TO_VARIANT
 | 
			
		||||
 | 
			
		||||
# force import gpio to register pin schema
 | 
			
		||||
from .gpio import esp32_pin_to_code  # noqa
 | 
			
		||||
@@ -230,14 +230,14 @@ def _parse_platform_version(value):
 | 
			
		||||
def _detect_variant(value):
 | 
			
		||||
    if CONF_VARIANT not in value:
 | 
			
		||||
        board = value[CONF_BOARD]
 | 
			
		||||
        if board not in BOARDS:
 | 
			
		||||
        if board not in BOARD_TO_VARIANT:
 | 
			
		||||
            raise cv.Invalid(
 | 
			
		||||
                "This board is unknown, please set the variant manually",
 | 
			
		||||
                path=[CONF_BOARD],
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
        value = value.copy()
 | 
			
		||||
        value[CONF_VARIANT] = BOARDS[board][KEY_VARIANT]
 | 
			
		||||
        value[CONF_VARIANT] = BOARD_TO_VARIANT[board]
 | 
			
		||||
 | 
			
		||||
    return value
 | 
			
		||||
 | 
			
		||||
@@ -327,11 +327,6 @@ async def to_code(config):
 | 
			
		||||
            "platform_packages",
 | 
			
		||||
            [f"platformio/framework-espidf @ {conf[CONF_SOURCE]}"],
 | 
			
		||||
        )
 | 
			
		||||
        # platformio/toolchain-esp32ulp does not support linux_aarch64 yet and has not been updated for over 2 years
 | 
			
		||||
        # This is espressif's own published version which is more up to date.
 | 
			
		||||
        cg.add_platformio_option(
 | 
			
		||||
            "platform_packages", ["espressif/toolchain-esp32ulp @ 2.35.0-20220830"]
 | 
			
		||||
        )
 | 
			
		||||
        add_idf_sdkconfig_option("CONFIG_PARTITION_TABLE_SINGLE_APP", False)
 | 
			
		||||
        add_idf_sdkconfig_option("CONFIG_PARTITION_TABLE_CUSTOM", True)
 | 
			
		||||
        add_idf_sdkconfig_option(
 | 
			
		||||
 
 | 
			
		||||
@@ -1066,738 +1066,197 @@ ESP32_BOARD_PINS = {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
BOARDS generated with:
 | 
			
		||||
BOARD_TO_VARIANT generated with:
 | 
			
		||||
 | 
			
		||||
git clone https://github.com/platformio/platform-espressif32
 | 
			
		||||
for x in platform-espressif32/boards/*.json; do
 | 
			
		||||
  mcu=$(jq -r .build.mcu <"$x");
 | 
			
		||||
  name=$(jq -r .name <"$x");
 | 
			
		||||
  fname=$(basename "$x")
 | 
			
		||||
  board="${fname%.*}"
 | 
			
		||||
  variant=$(echo "$mcu" | tr '[:lower:]' '[:upper:]')
 | 
			
		||||
  echo "    \"$board\": {\"name\": \"$name\", \"variant\": VARIANT_${variant},},"
 | 
			
		||||
  echo "    \"$board\": VARIANT_${variant},"
 | 
			
		||||
done | sort
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
BOARDS = {
 | 
			
		||||
    "adafruit_feather_esp32s2_tft": {
 | 
			
		||||
        "name": "Adafruit Feather ESP32-S2 TFT",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "adafruit_feather_esp32s3": {
 | 
			
		||||
        "name": "Adafruit Feather ESP32-S3 2MB PSRAM",
 | 
			
		||||
        "variant": VARIANT_ESP32S3,
 | 
			
		||||
    },
 | 
			
		||||
    "adafruit_feather_esp32s3_nopsram": {
 | 
			
		||||
        "name": "Adafruit Feather ESP32-S3 No PSRAM",
 | 
			
		||||
        "variant": VARIANT_ESP32S3,
 | 
			
		||||
    },
 | 
			
		||||
    "adafruit_feather_esp32s3_tft": {
 | 
			
		||||
        "name": "Adafruit Feather ESP32-S3 TFT",
 | 
			
		||||
        "variant": VARIANT_ESP32S3,
 | 
			
		||||
    },
 | 
			
		||||
    "adafruit_feather_esp32_v2": {
 | 
			
		||||
        "name": "Adafruit Feather ESP32 V2",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "adafruit_funhouse_esp32s2": {
 | 
			
		||||
        "name": "Adafruit FunHouse",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "adafruit_itsybitsy_esp32": {
 | 
			
		||||
        "name": "Adafruit ItsyBitsy ESP32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "adafruit_magtag29_esp32s2": {
 | 
			
		||||
        "name": "Adafruit MagTag 2.9",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "adafruit_metro_esp32s2": {
 | 
			
		||||
        "name": "Adafruit Metro ESP32-S2",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "adafruit_qtpy_esp32c3": {
 | 
			
		||||
        "name": "Adafruit QT Py ESP32-C3",
 | 
			
		||||
        "variant": VARIANT_ESP32C3,
 | 
			
		||||
    },
 | 
			
		||||
    "adafruit_qtpy_esp32": {
 | 
			
		||||
        "name": "Adafruit QT Py ESP32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "adafruit_qtpy_esp32s2": {
 | 
			
		||||
        "name": "Adafruit QT Py ESP32-S2",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "adafruit_qtpy_esp32s3_nopsram": {
 | 
			
		||||
        "name": "Adafruit QT Py ESP32-S3 No PSRAM",
 | 
			
		||||
        "variant": VARIANT_ESP32S3,
 | 
			
		||||
    },
 | 
			
		||||
    "airm2m_core_esp32c3": {
 | 
			
		||||
        "name": "AirM2M CORE ESP32C3",
 | 
			
		||||
        "variant": VARIANT_ESP32C3,
 | 
			
		||||
    },
 | 
			
		||||
    "alksesp32": {
 | 
			
		||||
        "name": "ALKS ESP32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "atmegazero_esp32s2": {
 | 
			
		||||
        "name": "EspinalLab ATMegaZero ESP32-S2",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "az-delivery-devkit-v4": {
 | 
			
		||||
        "name": "AZ-Delivery ESP-32 Dev Kit C V4",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "bee_motion_mini": {
 | 
			
		||||
        "name": "Smart Bee Motion Mini",
 | 
			
		||||
        "variant": VARIANT_ESP32C3,
 | 
			
		||||
    },
 | 
			
		||||
    "bee_motion": {
 | 
			
		||||
        "name": "Smart Bee Motion",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "bee_motion_s3": {
 | 
			
		||||
        "name": "Smart Bee Motion S3",
 | 
			
		||||
        "variant": VARIANT_ESP32S3,
 | 
			
		||||
    },
 | 
			
		||||
    "bee_s3": {
 | 
			
		||||
        "name": "Smart Bee S3",
 | 
			
		||||
        "variant": VARIANT_ESP32S3,
 | 
			
		||||
    },
 | 
			
		||||
    "bpi-bit": {
 | 
			
		||||
        "name": "BPI-Bit",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "briki_abc_esp32": {
 | 
			
		||||
        "name": "Briki ABC (MBC-WB) - ESP32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "briki_mbc-wb_esp32": {
 | 
			
		||||
        "name": "Briki MBC-WB - ESP32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "cnrs_aw2eth": {
 | 
			
		||||
        "name": "CNRS AW2ETH",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "connaxio_espoir": {
 | 
			
		||||
        "name": "Connaxio's Espoir",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "d-duino-32": {
 | 
			
		||||
        "name": "D-duino-32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "deneyapkart1A": {
 | 
			
		||||
        "name": "Deneyap Kart 1A",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "deneyapkartg": {
 | 
			
		||||
        "name": "Deneyap Kart G",
 | 
			
		||||
        "variant": VARIANT_ESP32C3,
 | 
			
		||||
    },
 | 
			
		||||
    "deneyapkart": {
 | 
			
		||||
        "name": "Deneyap Kart",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "deneyapmini": {
 | 
			
		||||
        "name": "Deneyap Mini",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "denky32": {
 | 
			
		||||
        "name": "Denky32 (WROOM32)",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "denky_d4": {
 | 
			
		||||
        "name": "Denky D4 (PICO-V3-02)",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "dfrobot_beetle_esp32c3": {
 | 
			
		||||
        "name": "DFRobot Beetle ESP32-C3",
 | 
			
		||||
        "variant": VARIANT_ESP32C3,
 | 
			
		||||
    },
 | 
			
		||||
    "dfrobot_firebeetle2_esp32s3": {
 | 
			
		||||
        "name": "DFRobot Firebeetle 2 ESP32-S3",
 | 
			
		||||
        "variant": VARIANT_ESP32S3,
 | 
			
		||||
    },
 | 
			
		||||
    "dpu_esp32": {
 | 
			
		||||
        "name": "TAMC DPU ESP32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "esp320": {
 | 
			
		||||
        "name": "Electronic SweetPeas ESP320",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32-c3-devkitm-1": {
 | 
			
		||||
        "name": "Espressif ESP32-C3-DevKitM-1",
 | 
			
		||||
        "variant": VARIANT_ESP32C3,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32cam": {
 | 
			
		||||
        "name": "AI Thinker ESP32-CAM",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32-devkitlipo": {
 | 
			
		||||
        "name": "OLIMEX ESP32-DevKit-LiPo",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32dev": {
 | 
			
		||||
        "name": "Espressif ESP32 Dev Module",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32doit-devkit-v1": {
 | 
			
		||||
        "name": "DOIT ESP32 DEVKIT V1",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32doit-espduino": {
 | 
			
		||||
        "name": "DOIT ESPduino32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32-evb": {
 | 
			
		||||
        "name": "OLIMEX ESP32-EVB",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32-gateway": {
 | 
			
		||||
        "name": "OLIMEX ESP32-GATEWAY",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32-poe-iso": {
 | 
			
		||||
        "name": "OLIMEX ESP32-PoE-ISO",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32-poe": {
 | 
			
		||||
        "name": "OLIMEX ESP32-PoE",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32-pro": {
 | 
			
		||||
        "name": "OLIMEX ESP32-PRO",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32-s2-franzininho": {
 | 
			
		||||
        "name": "Franzininho WiFi Board",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32-s2-kaluga-1": {
 | 
			
		||||
        "name": "Espressif ESP32-S2-Kaluga-1 Kit",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32-s2-saola-1": {
 | 
			
		||||
        "name": "Espressif ESP32-S2-Saola-1",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32s3box": {
 | 
			
		||||
        "name": "Espressif ESP32-S3-Box",
 | 
			
		||||
        "variant": VARIANT_ESP32S3,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32s3camlcd": {
 | 
			
		||||
        "name": "ESP32S3 CAM LCD",
 | 
			
		||||
        "variant": VARIANT_ESP32S3,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32-s3-devkitc-1": {
 | 
			
		||||
        "name": "Espressif ESP32-S3-DevKitC-1-N8 (8 MB QD, No PSRAM)",
 | 
			
		||||
        "variant": VARIANT_ESP32S3,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32thing": {
 | 
			
		||||
        "name": "SparkFun ESP32 Thing",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32thing_plus": {
 | 
			
		||||
        "name": "SparkFun ESP32 Thing Plus",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "esp32vn-iot-uno": {
 | 
			
		||||
        "name": "ESP32vn IoT Uno",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "espea32": {
 | 
			
		||||
        "name": "April Brother ESPea32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "espectro32": {
 | 
			
		||||
        "name": "ESPectro32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "espino32": {
 | 
			
		||||
        "name": "ESPino32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "esp-wrover-kit": {
 | 
			
		||||
        "name": "Espressif ESP-WROVER-KIT",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "etboard": {
 | 
			
		||||
        "name": "ETBoard",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "featheresp32": {
 | 
			
		||||
        "name": "Adafruit ESP32 Feather",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "featheresp32-s2": {
 | 
			
		||||
        "name": "Adafruit ESP32-S2 Feather Development Board",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "firebeetle32": {
 | 
			
		||||
        "name": "FireBeetle-ESP32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "fm-devkit": {
 | 
			
		||||
        "name": "ESP32 FM DevKit",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "franzininho_wifi_esp32s2": {
 | 
			
		||||
        "name": "Franzininho WiFi",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "franzininho_wifi_msc_esp32s2": {
 | 
			
		||||
        "name": "Franzininho WiFi MSC",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "frogboard": {
 | 
			
		||||
        "name": "Frog Board ESP32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "healthypi4": {
 | 
			
		||||
        "name": "ProtoCentral HealthyPi 4",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "heltec_wifi_kit_32": {
 | 
			
		||||
        "name": "Heltec WiFi Kit 32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "heltec_wifi_kit_32_v2": {
 | 
			
		||||
        "name": "Heltec WiFi Kit 32 (V2)",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "heltec_wifi_lora_32": {
 | 
			
		||||
        "name": "Heltec WiFi LoRa 32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "heltec_wifi_lora_32_V2": {
 | 
			
		||||
        "name": "Heltec WiFi LoRa 32 (V2)",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "heltec_wireless_stick_lite": {
 | 
			
		||||
        "name": "Heltec Wireless Stick Lite",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "heltec_wireless_stick": {
 | 
			
		||||
        "name": "Heltec Wireless Stick",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "honeylemon": {
 | 
			
		||||
        "name": "HONEYLemon",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "hornbill32dev": {
 | 
			
		||||
        "name": "Hornbill ESP32 Dev",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "hornbill32minima": {
 | 
			
		||||
        "name": "Hornbill ESP32 Minima",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "imbrios-logsens-v1p1": {
 | 
			
		||||
        "name": "Imbrios LogSens V1P1",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "inex_openkb": {
 | 
			
		||||
        "name": "INEX OpenKB",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "intorobot": {
 | 
			
		||||
        "name": "IntoRobot Fig",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "iotaap_magnolia": {
 | 
			
		||||
        "name": "IoTaaP Magnolia",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "iotbusio": {
 | 
			
		||||
        "name": "oddWires IoT-Bus Io",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "iotbusproteus": {
 | 
			
		||||
        "name": "oddWires IoT-Bus Proteus",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "kb32-ft": {
 | 
			
		||||
        "name": "MakerAsia KB32-FT",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "kits-edu": {
 | 
			
		||||
        "name": "KITS ESP32 EDU",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "labplus_mpython": {
 | 
			
		||||
        "name": "Labplus mPython",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "lionbit": {
 | 
			
		||||
        "name": "Lion:Bit Dev Board",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "lolin32_lite": {
 | 
			
		||||
        "name": "WEMOS LOLIN32 Lite",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "lolin32": {
 | 
			
		||||
        "name": "WEMOS LOLIN32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "lolin_c3_mini": {
 | 
			
		||||
        "name": "WEMOS LOLIN C3 Mini",
 | 
			
		||||
        "variant": VARIANT_ESP32C3,
 | 
			
		||||
    },
 | 
			
		||||
    "lolin_d32": {
 | 
			
		||||
        "name": "WEMOS LOLIN D32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "lolin_d32_pro": {
 | 
			
		||||
        "name": "WEMOS LOLIN D32 PRO",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "lolin_s2_mini": {
 | 
			
		||||
        "name": "WEMOS LOLIN S2 Mini",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "lolin_s2_pico": {
 | 
			
		||||
        "name": "WEMOS LOLIN S2 PICO",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "lolin_s3": {
 | 
			
		||||
        "name": "WEMOS LOLIN S3",
 | 
			
		||||
        "variant": VARIANT_ESP32S3,
 | 
			
		||||
    },
 | 
			
		||||
    "lopy4": {
 | 
			
		||||
        "name": "Pycom LoPy4",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "lopy": {
 | 
			
		||||
        "name": "Pycom LoPy",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "m5stack-atom": {
 | 
			
		||||
        "name": "M5Stack-ATOM",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "m5stack-core2": {
 | 
			
		||||
        "name": "M5Stack Core2",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "m5stack-core-esp32": {
 | 
			
		||||
        "name": "M5Stack Core ESP32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "m5stack-coreink": {
 | 
			
		||||
        "name": "M5Stack-Core Ink",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "m5stack-fire": {
 | 
			
		||||
        "name": "M5Stack FIRE",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "m5stack-grey": {
 | 
			
		||||
        "name": "M5Stack GREY ESP32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "m5stack-station": {
 | 
			
		||||
        "name": "M5Stack Station",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "m5stack-timer-cam": {
 | 
			
		||||
        "name": "M5Stack Timer CAM",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "m5stick-c": {
 | 
			
		||||
        "name": "M5Stick-C",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "magicbit": {
 | 
			
		||||
        "name": "MagicBit",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "mgbot-iotik32a": {
 | 
			
		||||
        "name": "MGBOT IOTIK 32A",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "mgbot-iotik32b": {
 | 
			
		||||
        "name": "MGBOT IOTIK 32B",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "mhetesp32devkit": {
 | 
			
		||||
        "name": "MH ET LIVE ESP32DevKIT",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "mhetesp32minikit": {
 | 
			
		||||
        "name": "MH ET LIVE ESP32MiniKit",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "microduino-core-esp32": {
 | 
			
		||||
        "name": "Microduino Core ESP32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "micros2": {
 | 
			
		||||
        "name": "microS2",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "minimain_esp32s2": {
 | 
			
		||||
        "name": "Deparment of Alchemy MiniMain ESP32-S2",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "nano32": {
 | 
			
		||||
        "name": "MakerAsia Nano32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "nina_w10": {
 | 
			
		||||
        "name": "u-blox NINA-W10 series",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "node32s": {
 | 
			
		||||
        "name": "Node32s",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "nodemcu-32s2": {
 | 
			
		||||
        "name": "Ai-Thinker NodeMCU-32S2 (ESP-12K)",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "nodemcu-32s": {
 | 
			
		||||
        "name": "NodeMCU-32S",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "nscreen-32": {
 | 
			
		||||
        "name": "YeaCreate NSCREEN-32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "odroid_esp32": {
 | 
			
		||||
        "name": "ODROID-GO",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "onehorse32dev": {
 | 
			
		||||
        "name": "Onehorse ESP32 Dev Module",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "oroca_edubot": {
 | 
			
		||||
        "name": "OROCA EduBot",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "pico32": {
 | 
			
		||||
        "name": "ESP32 Pico Kit",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "piranha_esp32": {
 | 
			
		||||
        "name": "Fishino Piranha ESP-32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "pocket_32": {
 | 
			
		||||
        "name": "Dongsen Tech Pocket 32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "pycom_gpy": {
 | 
			
		||||
        "name": "Pycom GPy",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "qchip": {
 | 
			
		||||
        "name": "Qchip",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "quantum": {
 | 
			
		||||
        "name": "Noduino Quantum",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "seeed_xiao_esp32c3": {
 | 
			
		||||
        "name": "Seeed Studio XIAO ESP32C3",
 | 
			
		||||
        "variant": VARIANT_ESP32C3,
 | 
			
		||||
    },
 | 
			
		||||
    "sensesiot_weizen": {
 | 
			
		||||
        "name": "LOGISENSES Senses Weizen",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "sg-o_airMon": {
 | 
			
		||||
        "name": "SG-O AirMon",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "s_odi_ultra": {
 | 
			
		||||
        "name": "S.ODI Ultra v1",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "sparkfun_esp32_iot_redboard": {
 | 
			
		||||
        "name": "SparkFun ESP32 IoT RedBoard",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "sparkfun_esp32micromod": {
 | 
			
		||||
        "name": "SparkFun ESP32 MicroMod",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "sparkfun_esp32s2_thing_plus_c": {
 | 
			
		||||
        "name": "SparkFun ESP32 Thing Plus C",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "sparkfun_esp32s2_thing_plus": {
 | 
			
		||||
        "name": "SparkFun ESP32-S2 Thing Plus",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "sparkfun_lora_gateway_1-channel": {
 | 
			
		||||
        "name": "SparkFun LoRa Gateway 1-Channel",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "tamc_termod_s3": {
 | 
			
		||||
        "name": "TAMC Termod S3",
 | 
			
		||||
        "variant": VARIANT_ESP32S3,
 | 
			
		||||
    },
 | 
			
		||||
    "tinypico": {
 | 
			
		||||
        "name": "Unexpected Maker TinyPICO",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "trueverit-iot-driver-mk2": {
 | 
			
		||||
        "name": "Trueverit ESP32 Universal IoT Driver MK II",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "trueverit-iot-driver-mk3": {
 | 
			
		||||
        "name": "Trueverit ESP32 Universal IoT Driver MK III",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "trueverit-iot-driver": {
 | 
			
		||||
        "name": "Trueverit ESP32 Universal IoT Driver",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "ttgo-lora32-v1": {
 | 
			
		||||
        "name": "TTGO LoRa32-OLED V1",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "ttgo-lora32-v21": {
 | 
			
		||||
        "name": "TTGO LoRa32-OLED v2.1.6",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "ttgo-lora32-v2": {
 | 
			
		||||
        "name": "TTGO LoRa32-OLED V2",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "ttgo-t1": {
 | 
			
		||||
        "name": "TTGO T1",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "ttgo-t7-v13-mini32": {
 | 
			
		||||
        "name": "TTGO T7 V1.3 Mini32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "ttgo-t7-v14-mini32": {
 | 
			
		||||
        "name": "TTGO T7 V1.4 Mini32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "ttgo-t-beam": {
 | 
			
		||||
        "name": "TTGO T-Beam",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "ttgo-t-oi-plus": {
 | 
			
		||||
        "name": "TTGO T-OI PLUS RISC-V ESP32-C3",
 | 
			
		||||
        "variant": VARIANT_ESP32C3,
 | 
			
		||||
    },
 | 
			
		||||
    "ttgo-t-watch": {
 | 
			
		||||
        "name": "TTGO T-Watch",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "turta_iot_node": {
 | 
			
		||||
        "name": "Turta IoT Node",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "um_feathers2": {
 | 
			
		||||
        "name": "Unexpected Maker FeatherS2",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "um_feathers2_neo": {
 | 
			
		||||
        "name": "Unexpected Maker FeatherS2 Neo",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "um_feathers3": {
 | 
			
		||||
        "name": "Unexpected Maker FeatherS3",
 | 
			
		||||
        "variant": VARIANT_ESP32S3,
 | 
			
		||||
    },
 | 
			
		||||
    "um_pros3": {
 | 
			
		||||
        "name": "Unexpected Maker PROS3",
 | 
			
		||||
        "variant": VARIANT_ESP32S3,
 | 
			
		||||
    },
 | 
			
		||||
    "um_rmp": {
 | 
			
		||||
        "name": "Unexpected Maker RMP",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "um_tinys2": {
 | 
			
		||||
        "name": "Unexpected Maker TinyS2",
 | 
			
		||||
        "variant": VARIANT_ESP32S2,
 | 
			
		||||
    },
 | 
			
		||||
    "um_tinys3": {
 | 
			
		||||
        "name": "Unexpected Maker TinyS3",
 | 
			
		||||
        "variant": VARIANT_ESP32S3,
 | 
			
		||||
    },
 | 
			
		||||
    "unphone7": {
 | 
			
		||||
        "name": "unPhone 7",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "unphone8": {
 | 
			
		||||
        "name": "unPhone 8",
 | 
			
		||||
        "variant": VARIANT_ESP32S3,
 | 
			
		||||
    },
 | 
			
		||||
    "unphone9": {
 | 
			
		||||
        "name": "unPhone 9",
 | 
			
		||||
        "variant": VARIANT_ESP32S3,
 | 
			
		||||
    },
 | 
			
		||||
    "upesy_wroom": {
 | 
			
		||||
        "name": "uPesy ESP32 Wroom DevKit",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "upesy_wrover": {
 | 
			
		||||
        "name": "uPesy ESP32 Wrover DevKit",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "vintlabs-devkit-v1": {
 | 
			
		||||
        "name": "VintLabs ESP32 Devkit",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "watchy": {
 | 
			
		||||
        "name": "SQFMI Watchy v2.0",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "wemosbat": {
 | 
			
		||||
        "name": "WeMos WiFi and Bluetooth Battery",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "wemos_d1_mini32": {
 | 
			
		||||
        "name": "WEMOS D1 MINI ESP32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "wemos_d1_uno32": {
 | 
			
		||||
        "name": "WEMOS D1 R32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "wesp32": {
 | 
			
		||||
        "name": "Silicognition wESP32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "widora-air": {
 | 
			
		||||
        "name": "Widora AIR",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "wifiduino32c3": {
 | 
			
		||||
        "name": "Blinker WiFiduinoV2 (ESP32-C3)",
 | 
			
		||||
        "variant": VARIANT_ESP32C3,
 | 
			
		||||
    },
 | 
			
		||||
    "wifiduino32": {
 | 
			
		||||
        "name": "Blinker WiFiduino32",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "wifiduino32s3": {
 | 
			
		||||
        "name": "Blinker WiFiduino32S3",
 | 
			
		||||
        "variant": VARIANT_ESP32S3,
 | 
			
		||||
    },
 | 
			
		||||
    "wipy3": {
 | 
			
		||||
        "name": "Pycom WiPy3",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "wt32-eth01": {
 | 
			
		||||
        "name": "Wireless-Tag WT32-ETH01 Ethernet Module",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
    "xinabox_cw02": {
 | 
			
		||||
        "name": "XinaBox CW02",
 | 
			
		||||
        "variant": VARIANT_ESP32,
 | 
			
		||||
    },
 | 
			
		||||
BOARD_TO_VARIANT = {
 | 
			
		||||
    "adafruit_feather_esp32s2_tft": VARIANT_ESP32S2,
 | 
			
		||||
    "adafruit_feather_esp32s3_nopsram": VARIANT_ESP32S3,
 | 
			
		||||
    "adafruit_feather_esp32s3_tft": VARIANT_ESP32S3,
 | 
			
		||||
    "adafruit_feather_esp32s3": VARIANT_ESP32S3,
 | 
			
		||||
    "adafruit_feather_esp32_v2": VARIANT_ESP32,
 | 
			
		||||
    "adafruit_funhouse_esp32s2": VARIANT_ESP32S2,
 | 
			
		||||
    "adafruit_itsybitsy_esp32": VARIANT_ESP32,
 | 
			
		||||
    "adafruit_magtag29_esp32s2": VARIANT_ESP32S2,
 | 
			
		||||
    "adafruit_metro_esp32s2": VARIANT_ESP32S2,
 | 
			
		||||
    "adafruit_qtpy_esp32c3": VARIANT_ESP32C3,
 | 
			
		||||
    "adafruit_qtpy_esp32s2": VARIANT_ESP32S2,
 | 
			
		||||
    "adafruit_qtpy_esp32s3_nopsram": VARIANT_ESP32S3,
 | 
			
		||||
    "adafruit_qtpy_esp32": VARIANT_ESP32,
 | 
			
		||||
    "airm2m_core_esp32c3": VARIANT_ESP32C3,
 | 
			
		||||
    "alksesp32": VARIANT_ESP32,
 | 
			
		||||
    "atmegazero_esp32s2": VARIANT_ESP32S2,
 | 
			
		||||
    "az-delivery-devkit-v4": VARIANT_ESP32,
 | 
			
		||||
    "bee_motion_mini": VARIANT_ESP32C3,
 | 
			
		||||
    "bee_motion_s3": VARIANT_ESP32S3,
 | 
			
		||||
    "bee_motion": VARIANT_ESP32S2,
 | 
			
		||||
    "bee_s3": VARIANT_ESP32S3,
 | 
			
		||||
    "bpi-bit": VARIANT_ESP32,
 | 
			
		||||
    "briki_abc_esp32": VARIANT_ESP32,
 | 
			
		||||
    "briki_mbc-wb_esp32": VARIANT_ESP32,
 | 
			
		||||
    "cnrs_aw2eth": VARIANT_ESP32,
 | 
			
		||||
    "connaxio_espoir": VARIANT_ESP32,
 | 
			
		||||
    "d-duino-32": VARIANT_ESP32,
 | 
			
		||||
    "deneyapkart1A": VARIANT_ESP32,
 | 
			
		||||
    "deneyapkartg": VARIANT_ESP32C3,
 | 
			
		||||
    "deneyapkart": VARIANT_ESP32,
 | 
			
		||||
    "deneyapmini": VARIANT_ESP32S2,
 | 
			
		||||
    "denky32": VARIANT_ESP32,
 | 
			
		||||
    "denky_d4": VARIANT_ESP32,
 | 
			
		||||
    "dfrobot_beetle_esp32c3": VARIANT_ESP32C3,
 | 
			
		||||
    "dfrobot_firebeetle2_esp32s3": VARIANT_ESP32S3,
 | 
			
		||||
    "dpu_esp32": VARIANT_ESP32,
 | 
			
		||||
    "esp320": VARIANT_ESP32,
 | 
			
		||||
    "esp32-c3-devkitm-1": VARIANT_ESP32C3,
 | 
			
		||||
    "esp32cam": VARIANT_ESP32,
 | 
			
		||||
    "esp32-devkitlipo": VARIANT_ESP32,
 | 
			
		||||
    "esp32dev": VARIANT_ESP32,
 | 
			
		||||
    "esp32doit-devkit-v1": VARIANT_ESP32,
 | 
			
		||||
    "esp32doit-espduino": VARIANT_ESP32,
 | 
			
		||||
    "esp32-evb": VARIANT_ESP32,
 | 
			
		||||
    "esp32-gateway": VARIANT_ESP32,
 | 
			
		||||
    "esp32-poe-iso": VARIANT_ESP32,
 | 
			
		||||
    "esp32-poe": VARIANT_ESP32,
 | 
			
		||||
    "esp32-pro": VARIANT_ESP32,
 | 
			
		||||
    "esp32-s2-franzininho": VARIANT_ESP32S2,
 | 
			
		||||
    "esp32-s2-kaluga-1": VARIANT_ESP32S2,
 | 
			
		||||
    "esp32-s2-saola-1": VARIANT_ESP32S2,
 | 
			
		||||
    "esp32s3box": VARIANT_ESP32S3,
 | 
			
		||||
    "esp32s3camlcd": VARIANT_ESP32S3,
 | 
			
		||||
    "esp32-s3-devkitc-1": VARIANT_ESP32S3,
 | 
			
		||||
    "esp32thing_plus": VARIANT_ESP32,
 | 
			
		||||
    "esp32thing": VARIANT_ESP32,
 | 
			
		||||
    "esp32vn-iot-uno": VARIANT_ESP32,
 | 
			
		||||
    "espea32": VARIANT_ESP32,
 | 
			
		||||
    "espectro32": VARIANT_ESP32,
 | 
			
		||||
    "espino32": VARIANT_ESP32,
 | 
			
		||||
    "esp-wrover-kit": VARIANT_ESP32,
 | 
			
		||||
    "etboard": VARIANT_ESP32,
 | 
			
		||||
    "featheresp32-s2": VARIANT_ESP32S2,
 | 
			
		||||
    "featheresp32": VARIANT_ESP32,
 | 
			
		||||
    "firebeetle32": VARIANT_ESP32,
 | 
			
		||||
    "fm-devkit": VARIANT_ESP32,
 | 
			
		||||
    "franzininho_wifi_esp32s2": VARIANT_ESP32S2,
 | 
			
		||||
    "franzininho_wifi_msc_esp32s2": VARIANT_ESP32S2,
 | 
			
		||||
    "frogboard": VARIANT_ESP32,
 | 
			
		||||
    "healthypi4": VARIANT_ESP32,
 | 
			
		||||
    "heltec_wifi_kit_32_v2": VARIANT_ESP32,
 | 
			
		||||
    "heltec_wifi_kit_32": VARIANT_ESP32,
 | 
			
		||||
    "heltec_wifi_lora_32_V2": VARIANT_ESP32,
 | 
			
		||||
    "heltec_wifi_lora_32": VARIANT_ESP32,
 | 
			
		||||
    "heltec_wireless_stick_lite": VARIANT_ESP32,
 | 
			
		||||
    "heltec_wireless_stick": VARIANT_ESP32,
 | 
			
		||||
    "honeylemon": VARIANT_ESP32,
 | 
			
		||||
    "hornbill32dev": VARIANT_ESP32,
 | 
			
		||||
    "hornbill32minima": VARIANT_ESP32,
 | 
			
		||||
    "imbrios-logsens-v1p1": VARIANT_ESP32,
 | 
			
		||||
    "inex_openkb": VARIANT_ESP32,
 | 
			
		||||
    "intorobot": VARIANT_ESP32,
 | 
			
		||||
    "iotaap_magnolia": VARIANT_ESP32,
 | 
			
		||||
    "iotbusio": VARIANT_ESP32,
 | 
			
		||||
    "iotbusproteus": VARIANT_ESP32,
 | 
			
		||||
    "kb32-ft": VARIANT_ESP32,
 | 
			
		||||
    "kits-edu": VARIANT_ESP32,
 | 
			
		||||
    "labplus_mpython": VARIANT_ESP32,
 | 
			
		||||
    "lionbit": VARIANT_ESP32,
 | 
			
		||||
    "lolin32_lite": VARIANT_ESP32,
 | 
			
		||||
    "lolin32": VARIANT_ESP32,
 | 
			
		||||
    "lolin_c3_mini": VARIANT_ESP32C3,
 | 
			
		||||
    "lolin_d32_pro": VARIANT_ESP32,
 | 
			
		||||
    "lolin_d32": VARIANT_ESP32,
 | 
			
		||||
    "lolin_s2_mini": VARIANT_ESP32S2,
 | 
			
		||||
    "lolin_s2_pico": VARIANT_ESP32S2,
 | 
			
		||||
    "lolin_s3": VARIANT_ESP32S3,
 | 
			
		||||
    "lopy4": VARIANT_ESP32,
 | 
			
		||||
    "lopy": VARIANT_ESP32,
 | 
			
		||||
    "m5stack-atom": VARIANT_ESP32,
 | 
			
		||||
    "m5stack-core2": VARIANT_ESP32,
 | 
			
		||||
    "m5stack-core-esp32": VARIANT_ESP32,
 | 
			
		||||
    "m5stack-coreink": VARIANT_ESP32,
 | 
			
		||||
    "m5stack-fire": VARIANT_ESP32,
 | 
			
		||||
    "m5stack-grey": VARIANT_ESP32,
 | 
			
		||||
    "m5stack-station": VARIANT_ESP32,
 | 
			
		||||
    "m5stack-timer-cam": VARIANT_ESP32,
 | 
			
		||||
    "m5stick-c": VARIANT_ESP32,
 | 
			
		||||
    "magicbit": VARIANT_ESP32,
 | 
			
		||||
    "mgbot-iotik32a": VARIANT_ESP32,
 | 
			
		||||
    "mgbot-iotik32b": VARIANT_ESP32,
 | 
			
		||||
    "mhetesp32devkit": VARIANT_ESP32,
 | 
			
		||||
    "mhetesp32minikit": VARIANT_ESP32,
 | 
			
		||||
    "microduino-core-esp32": VARIANT_ESP32,
 | 
			
		||||
    "micros2": VARIANT_ESP32S2,
 | 
			
		||||
    "minimain_esp32s2": VARIANT_ESP32S2,
 | 
			
		||||
    "nano32": VARIANT_ESP32,
 | 
			
		||||
    "nina_w10": VARIANT_ESP32,
 | 
			
		||||
    "node32s": VARIANT_ESP32,
 | 
			
		||||
    "nodemcu-32s2": VARIANT_ESP32S2,
 | 
			
		||||
    "nodemcu-32s": VARIANT_ESP32,
 | 
			
		||||
    "nscreen-32": VARIANT_ESP32,
 | 
			
		||||
    "odroid_esp32": VARIANT_ESP32,
 | 
			
		||||
    "onehorse32dev": VARIANT_ESP32,
 | 
			
		||||
    "oroca_edubot": VARIANT_ESP32,
 | 
			
		||||
    "pico32": VARIANT_ESP32,
 | 
			
		||||
    "piranha_esp32": VARIANT_ESP32,
 | 
			
		||||
    "pocket_32": VARIANT_ESP32,
 | 
			
		||||
    "pycom_gpy": VARIANT_ESP32,
 | 
			
		||||
    "qchip": VARIANT_ESP32,
 | 
			
		||||
    "quantum": VARIANT_ESP32,
 | 
			
		||||
    "seeed_xiao_esp32c3": VARIANT_ESP32C3,
 | 
			
		||||
    "sensesiot_weizen": VARIANT_ESP32,
 | 
			
		||||
    "sg-o_airMon": VARIANT_ESP32,
 | 
			
		||||
    "s_odi_ultra": VARIANT_ESP32,
 | 
			
		||||
    "sparkfun_esp32_iot_redboard": VARIANT_ESP32,
 | 
			
		||||
    "sparkfun_esp32micromod": VARIANT_ESP32,
 | 
			
		||||
    "sparkfun_esp32s2_thing_plus_c": VARIANT_ESP32,
 | 
			
		||||
    "sparkfun_esp32s2_thing_plus": VARIANT_ESP32S2,
 | 
			
		||||
    "sparkfun_lora_gateway_1-channel": VARIANT_ESP32,
 | 
			
		||||
    "tamc_termod_s3": VARIANT_ESP32S3,
 | 
			
		||||
    "tinypico": VARIANT_ESP32,
 | 
			
		||||
    "trueverit-iot-driver-mk2": VARIANT_ESP32,
 | 
			
		||||
    "trueverit-iot-driver-mk3": VARIANT_ESP32,
 | 
			
		||||
    "trueverit-iot-driver": VARIANT_ESP32,
 | 
			
		||||
    "ttgo-lora32-v1": VARIANT_ESP32,
 | 
			
		||||
    "ttgo-lora32-v21": VARIANT_ESP32,
 | 
			
		||||
    "ttgo-lora32-v2": VARIANT_ESP32,
 | 
			
		||||
    "ttgo-t1": VARIANT_ESP32,
 | 
			
		||||
    "ttgo-t7-v13-mini32": VARIANT_ESP32,
 | 
			
		||||
    "ttgo-t7-v14-mini32": VARIANT_ESP32,
 | 
			
		||||
    "ttgo-t-beam": VARIANT_ESP32,
 | 
			
		||||
    "ttgo-t-oi-plus": VARIANT_ESP32C3,
 | 
			
		||||
    "ttgo-t-watch": VARIANT_ESP32,
 | 
			
		||||
    "turta_iot_node": VARIANT_ESP32,
 | 
			
		||||
    "um_feathers2_neo": VARIANT_ESP32S2,
 | 
			
		||||
    "um_feathers2": VARIANT_ESP32S2,
 | 
			
		||||
    "um_feathers3": VARIANT_ESP32S3,
 | 
			
		||||
    "um_pros3": VARIANT_ESP32S3,
 | 
			
		||||
    "um_rmp": VARIANT_ESP32S2,
 | 
			
		||||
    "um_tinys2": VARIANT_ESP32S2,
 | 
			
		||||
    "um_tinys3": VARIANT_ESP32S3,
 | 
			
		||||
    "unphone7": VARIANT_ESP32,
 | 
			
		||||
    "unphone8": VARIANT_ESP32S3,
 | 
			
		||||
    "unphone9": VARIANT_ESP32S3,
 | 
			
		||||
    "upesy_wroom": VARIANT_ESP32,
 | 
			
		||||
    "upesy_wrover": VARIANT_ESP32,
 | 
			
		||||
    "vintlabs-devkit-v1": VARIANT_ESP32,
 | 
			
		||||
    "watchy": VARIANT_ESP32,
 | 
			
		||||
    "wemosbat": VARIANT_ESP32,
 | 
			
		||||
    "wemos_d1_mini32": VARIANT_ESP32,
 | 
			
		||||
    "wemos_d1_uno32": VARIANT_ESP32,
 | 
			
		||||
    "wesp32": VARIANT_ESP32,
 | 
			
		||||
    "widora-air": VARIANT_ESP32,
 | 
			
		||||
    "wifiduino32c3": VARIANT_ESP32C3,
 | 
			
		||||
    "wifiduino32s3": VARIANT_ESP32S3,
 | 
			
		||||
    "wifiduino32": VARIANT_ESP32,
 | 
			
		||||
    "wipy3": VARIANT_ESP32,
 | 
			
		||||
    "wt32-eth01": VARIANT_ESP32,
 | 
			
		||||
    "xinabox_cw02": VARIANT_ESP32,
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -705,13 +705,8 @@ void ESPBTDevice::parse_adv_(const esp_ble_gap_cb_param_t::ble_scan_result_evt_p
 | 
			
		||||
 | 
			
		||||
  while (offset + 2 < len) {
 | 
			
		||||
    const uint8_t field_length = payload[offset++];  // First byte is length of adv record
 | 
			
		||||
    if (field_length == 0) {
 | 
			
		||||
      if (offset < param.adv_data_len && param.scan_rsp_len > 0) {  // Zero padded advertisement data
 | 
			
		||||
        offset = param.adv_data_len;
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
    if (field_length == 0)
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // first byte of adv record is adv record type
 | 
			
		||||
    const uint8_t record_type = payload[offset++];
 | 
			
		||||
 
 | 
			
		||||
@@ -22,11 +22,10 @@ from .const import (
 | 
			
		||||
    CONF_EARLY_PIN_INIT,
 | 
			
		||||
    KEY_BOARD,
 | 
			
		||||
    KEY_ESP8266,
 | 
			
		||||
    KEY_FLASH_SIZE,
 | 
			
		||||
    KEY_PIN_INITIAL_STATES,
 | 
			
		||||
    esp8266_ns,
 | 
			
		||||
)
 | 
			
		||||
from .boards import BOARDS, ESP8266_LD_SCRIPTS
 | 
			
		||||
from .boards import ESP8266_FLASH_SIZES, ESP8266_LD_SCRIPTS
 | 
			
		||||
 | 
			
		||||
from .gpio import PinInitialState, add_pin_initial_states_array
 | 
			
		||||
 | 
			
		||||
@@ -219,8 +218,8 @@ async def to_code(config):
 | 
			
		||||
        cg.RawExpression(f"VERSION_CODE({ver.major}, {ver.minor}, {ver.patch})"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    if config[CONF_BOARD] in BOARDS:
 | 
			
		||||
        flash_size = BOARDS[config[CONF_BOARD]][KEY_FLASH_SIZE]
 | 
			
		||||
    if config[CONF_BOARD] in ESP8266_FLASH_SIZES:
 | 
			
		||||
        flash_size = ESP8266_FLASH_SIZES[config[CONF_BOARD]]
 | 
			
		||||
        ld_scripts = ESP8266_LD_SCRIPTS[flash_size]
 | 
			
		||||
 | 
			
		||||
        if ver <= cv.Version(2, 3, 0):
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,50 @@ FLASH_SIZE_2_MB = 2 * FLASH_SIZE_1_MB
 | 
			
		||||
FLASH_SIZE_4_MB = 4 * FLASH_SIZE_1_MB
 | 
			
		||||
FLASH_SIZE_16_MB = 16 * FLASH_SIZE_1_MB
 | 
			
		||||
 | 
			
		||||
ESP8266_FLASH_SIZES = {
 | 
			
		||||
    "d1": FLASH_SIZE_4_MB,
 | 
			
		||||
    "d1_mini": FLASH_SIZE_4_MB,
 | 
			
		||||
    "d1_mini_lite": FLASH_SIZE_1_MB,
 | 
			
		||||
    "d1_mini_pro": FLASH_SIZE_16_MB,
 | 
			
		||||
    "esp01": FLASH_SIZE_512_KB,
 | 
			
		||||
    "esp01_1m": FLASH_SIZE_1_MB,
 | 
			
		||||
    "esp07": FLASH_SIZE_4_MB,
 | 
			
		||||
    "esp12e": FLASH_SIZE_4_MB,
 | 
			
		||||
    "esp210": FLASH_SIZE_4_MB,
 | 
			
		||||
    "esp8285": FLASH_SIZE_1_MB,
 | 
			
		||||
    "esp_wroom_02": FLASH_SIZE_2_MB,
 | 
			
		||||
    "espduino": FLASH_SIZE_4_MB,
 | 
			
		||||
    "espectro": FLASH_SIZE_4_MB,
 | 
			
		||||
    "espino": FLASH_SIZE_4_MB,
 | 
			
		||||
    "espinotee": FLASH_SIZE_4_MB,
 | 
			
		||||
    "espmxdevkit": FLASH_SIZE_1_MB,
 | 
			
		||||
    "espresso_lite_v1": FLASH_SIZE_4_MB,
 | 
			
		||||
    "espresso_lite_v2": FLASH_SIZE_4_MB,
 | 
			
		||||
    "gen4iod": FLASH_SIZE_512_KB,
 | 
			
		||||
    "heltec_wifi_kit_8": FLASH_SIZE_4_MB,
 | 
			
		||||
    "huzzah": FLASH_SIZE_4_MB,
 | 
			
		||||
    "inventone": FLASH_SIZE_4_MB,
 | 
			
		||||
    "modwifi": FLASH_SIZE_2_MB,
 | 
			
		||||
    "nodemcu": FLASH_SIZE_4_MB,
 | 
			
		||||
    "nodemcuv2": FLASH_SIZE_4_MB,
 | 
			
		||||
    "oak": FLASH_SIZE_4_MB,
 | 
			
		||||
    "phoenix_v1": FLASH_SIZE_4_MB,
 | 
			
		||||
    "phoenix_v2": FLASH_SIZE_4_MB,
 | 
			
		||||
    "sonoff_basic": FLASH_SIZE_1_MB,
 | 
			
		||||
    "sonoff_s20": FLASH_SIZE_1_MB,
 | 
			
		||||
    "sonoff_sv": FLASH_SIZE_1_MB,
 | 
			
		||||
    "sonoff_th": FLASH_SIZE_1_MB,
 | 
			
		||||
    "sparkfunBlynk": FLASH_SIZE_4_MB,
 | 
			
		||||
    "thing": FLASH_SIZE_512_KB,
 | 
			
		||||
    "thingdev": FLASH_SIZE_512_KB,
 | 
			
		||||
    "wifi_slot": FLASH_SIZE_1_MB,
 | 
			
		||||
    "wifiduino": FLASH_SIZE_4_MB,
 | 
			
		||||
    "wifinfo": FLASH_SIZE_1_MB,
 | 
			
		||||
    "wio_link": FLASH_SIZE_4_MB,
 | 
			
		||||
    "wio_node": FLASH_SIZE_4_MB,
 | 
			
		||||
    "xinabox_cw01": FLASH_SIZE_4_MB,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ESP8266_LD_SCRIPTS = {
 | 
			
		||||
    FLASH_SIZE_512_KB: ("eagle.flash.512k0.ld", "eagle.flash.512k.ld"),
 | 
			
		||||
    FLASH_SIZE_1_MB: ("eagle.flash.1m0.ld", "eagle.flash.1m.ld"),
 | 
			
		||||
@@ -162,201 +206,3 @@ ESP8266_BOARD_PINS = {
 | 
			
		||||
    "wio_node": {"LED": 2, "GROVE": 15, "D0": 3, "D1": 5, "BUTTON": 0},
 | 
			
		||||
    "xinabox_cw01": {"SDA": 2, "SCL": 14, "LED": 5, "LED_RED": 12, "LED_GREEN": 13},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
BOARDS generate with:
 | 
			
		||||
 | 
			
		||||
git clone https://github.com/platformio/platform-espressif8266
 | 
			
		||||
for x in platform-espressif8266/boards/*.json; do
 | 
			
		||||
  max_size=$(jq -r .upload.maximum_size <"$x")
 | 
			
		||||
  name=$(jq -r .name <"$x")
 | 
			
		||||
  fname=$(basename "$x")
 | 
			
		||||
  board="${fname%.*}"
 | 
			
		||||
  size_mb=$((max_size / (1024 * 1024)))
 | 
			
		||||
  if [[ $size_mb -gt 0 ]]; then
 | 
			
		||||
    size="${size_mb}_MB"
 | 
			
		||||
  else
 | 
			
		||||
    size="${$((max_size / 1024))}_KB"
 | 
			
		||||
  fi
 | 
			
		||||
  echo "    \"$board\": {\"name\": \"$name\", \"flash_size\": FLASH_SIZE_$size,},"
 | 
			
		||||
done | sort
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
BOARDS = {
 | 
			
		||||
    "agruminolemon": {
 | 
			
		||||
        "name": "Lifely Agrumino Lemon v4",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "d1_mini_lite": {
 | 
			
		||||
        "name": "WeMos D1 mini Lite",
 | 
			
		||||
        "flash_size": FLASH_SIZE_1_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "d1_mini": {
 | 
			
		||||
        "name": "WeMos D1 R2 and mini",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "d1_mini_pro": {
 | 
			
		||||
        "name": "WeMos D1 mini Pro",
 | 
			
		||||
        "flash_size": FLASH_SIZE_16_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "d1": {
 | 
			
		||||
        "name": "WEMOS D1 R1",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "eduinowifi": {
 | 
			
		||||
        "name": "Schirmilabs Eduino WiFi",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "esp01_1m": {
 | 
			
		||||
        "name": "Espressif Generic ESP8266 ESP-01 1M",
 | 
			
		||||
        "flash_size": FLASH_SIZE_1_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "esp01": {
 | 
			
		||||
        "name": "Espressif Generic ESP8266 ESP-01 512k",
 | 
			
		||||
        "flash_size": FLASH_SIZE_512_KB,
 | 
			
		||||
    },
 | 
			
		||||
    "esp07": {
 | 
			
		||||
        "name": "Espressif Generic ESP8266 ESP-07 1MB",
 | 
			
		||||
        "flash_size": FLASH_SIZE_1_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "esp07s": {
 | 
			
		||||
        "name": "Espressif Generic ESP8266 ESP-07S",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "esp12e": {
 | 
			
		||||
        "name": "Espressif ESP8266 ESP-12E",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "esp210": {
 | 
			
		||||
        "name": "SweetPea ESP-210",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "esp8285": {
 | 
			
		||||
        "name": "Generic ESP8285 Module",
 | 
			
		||||
        "flash_size": FLASH_SIZE_1_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "espduino": {
 | 
			
		||||
        "name": "ESPDuino (ESP-13 Module)",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "espectro": {
 | 
			
		||||
        "name": "ESPectro Core",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "espino": {
 | 
			
		||||
        "name": "ESPino",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "espinotee": {
 | 
			
		||||
        "name": "ThaiEasyElec ESPino",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "espmxdevkit": {
 | 
			
		||||
        "name": "ESP-Mx DevKit (ESP8285)",
 | 
			
		||||
        "flash_size": FLASH_SIZE_1_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "espresso_lite_v1": {
 | 
			
		||||
        "name": "ESPresso Lite 1.0",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "espresso_lite_v2": {
 | 
			
		||||
        "name": "ESPresso Lite 2.0",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "esp_wroom_02": {
 | 
			
		||||
        "name": "ESP-WROOM-02",
 | 
			
		||||
        "flash_size": FLASH_SIZE_2_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "gen4iod": {
 | 
			
		||||
        "name": "4D Systems gen4 IoD Range",
 | 
			
		||||
        "flash_size": FLASH_SIZE_512_KB,
 | 
			
		||||
    },
 | 
			
		||||
    "heltec_wifi_kit_8": {
 | 
			
		||||
        "name": "Heltec Wifi kit 8",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "huzzah": {
 | 
			
		||||
        "name": "Adafruit HUZZAH ESP8266",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "inventone": {
 | 
			
		||||
        "name": "Invent One",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "modwifi": {
 | 
			
		||||
        "name": "Olimex MOD-WIFI-ESP8266(-DEV)",
 | 
			
		||||
        "flash_size": FLASH_SIZE_2_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "nodemcu": {
 | 
			
		||||
        "name": "NodeMCU 0.9 (ESP-12 Module)",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "nodemcuv2": {
 | 
			
		||||
        "name": "NodeMCU 1.0 (ESP-12E Module)",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "oak": {
 | 
			
		||||
        "name": "DigiStump Oak",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "phoenix_v1": {
 | 
			
		||||
        "name": "Phoenix 1.0",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "phoenix_v2": {
 | 
			
		||||
        "name": "Phoenix 2.0",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "sonoff_basic": {
 | 
			
		||||
        "name": "Sonoff Basic",
 | 
			
		||||
        "flash_size": FLASH_SIZE_1_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "sonoff_s20": {
 | 
			
		||||
        "name": "Sonoff S20",
 | 
			
		||||
        "flash_size": FLASH_SIZE_1_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "sonoff_sv": {
 | 
			
		||||
        "name": "Sonoff SV",
 | 
			
		||||
        "flash_size": FLASH_SIZE_1_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "sonoff_th": {
 | 
			
		||||
        "name": "Sonoff TH",
 | 
			
		||||
        "flash_size": FLASH_SIZE_1_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "sparkfunBlynk": {
 | 
			
		||||
        "name": "SparkFun Blynk Board",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "thingdev": {
 | 
			
		||||
        "name": "SparkFun ESP8266 Thing Dev",
 | 
			
		||||
        "flash_size": FLASH_SIZE_512_KB,
 | 
			
		||||
    },
 | 
			
		||||
    "thing": {
 | 
			
		||||
        "name": "SparkFun ESP8266 Thing",
 | 
			
		||||
        "flash_size": FLASH_SIZE_512_KB,
 | 
			
		||||
    },
 | 
			
		||||
    "wifiduino": {
 | 
			
		||||
        "name": "WiFiduino",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "wifinfo": {
 | 
			
		||||
        "name": "WifInfo",
 | 
			
		||||
        "flash_size": FLASH_SIZE_1_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "wifi_slot": {
 | 
			
		||||
        "name": "WiFi Slot",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "wio_link": {
 | 
			
		||||
        "name": "Wio Link",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "wio_node": {
 | 
			
		||||
        "name": "Wio Node",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
    "xinabox_cw01": {
 | 
			
		||||
        "name": "XinaBox CW01",
 | 
			
		||||
        "flash_size": FLASH_SIZE_4_MB,
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@ KEY_BOARD = "board"
 | 
			
		||||
KEY_PIN_INITIAL_STATES = "pin_initial_states"
 | 
			
		||||
CONF_RESTORE_FROM_FLASH = "restore_from_flash"
 | 
			
		||||
CONF_EARLY_PIN_INIT = "early_pin_init"
 | 
			
		||||
KEY_FLASH_SIZE = "flash_size"
 | 
			
		||||
 | 
			
		||||
# esp8266 namespace is already defined by arduino, manually prefix esphome
 | 
			
		||||
esp8266_ns = cg.global_ns.namespace("esphome").namespace("esp8266")
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ float GPIOSwitch::get_setup_priority() const { return setup_priority::HARDWARE;
 | 
			
		||||
void GPIOSwitch::setup() {
 | 
			
		||||
  ESP_LOGCONFIG(TAG, "Setting up GPIO Switch '%s'...", this->name_.c_str());
 | 
			
		||||
 | 
			
		||||
  bool initial_state = this->get_initial_state_with_restore_mode().value_or(false);
 | 
			
		||||
  bool initial_state = Switch::get_initial_state_with_restore_mode();
 | 
			
		||||
 | 
			
		||||
  // write state before setup
 | 
			
		||||
  if (initial_state) {
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ void OutputSwitch::dump_config() { LOG_SWITCH("", "Output Switch", this); }
 | 
			
		||||
void OutputSwitch::setup() {
 | 
			
		||||
  ESP_LOGCONFIG(TAG, "Setting up Output Switch '%s'...", this->name_.c_str());
 | 
			
		||||
 | 
			
		||||
  bool initial_state = this->get_initial_state_with_restore_mode().value_or(false);
 | 
			
		||||
  bool initial_state = Switch::get_initial_state_with_restore_mode();
 | 
			
		||||
 | 
			
		||||
  if (initial_state) {
 | 
			
		||||
    this->turn_on();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,22 +1,23 @@
 | 
			
		||||
import re
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
 | 
			
		||||
import esphome.config_validation as cv
 | 
			
		||||
from esphome import git, yaml_util
 | 
			
		||||
from esphome.core import EsphomeError
 | 
			
		||||
from esphome.config_helpers import merge_config
 | 
			
		||||
 | 
			
		||||
from esphome import git, yaml_util
 | 
			
		||||
from esphome.const import (
 | 
			
		||||
    CONF_ESPHOME,
 | 
			
		||||
    CONF_FILE,
 | 
			
		||||
    CONF_FILES,
 | 
			
		||||
    CONF_MIN_VERSION,
 | 
			
		||||
    CONF_PACKAGES,
 | 
			
		||||
    CONF_PASSWORD,
 | 
			
		||||
    CONF_REF,
 | 
			
		||||
    CONF_REFRESH,
 | 
			
		||||
    CONF_URL,
 | 
			
		||||
    CONF_USERNAME,
 | 
			
		||||
    CONF_PASSWORD,
 | 
			
		||||
    __version__ as ESPHOME_VERSION,
 | 
			
		||||
)
 | 
			
		||||
from esphome.const import __version__ as ESPHOME_VERSION
 | 
			
		||||
from esphome.core import EsphomeError
 | 
			
		||||
import esphome.config_validation as cv
 | 
			
		||||
 | 
			
		||||
DOMAIN = CONF_PACKAGES
 | 
			
		||||
 | 
			
		||||
@@ -54,15 +55,23 @@ def validate_source_shorthand(value):
 | 
			
		||||
    if not isinstance(value, str):
 | 
			
		||||
        raise cv.Invalid("Shorthand only for strings")
 | 
			
		||||
 | 
			
		||||
    git_file = git.GitFile.from_shorthand(value)
 | 
			
		||||
    m = re.match(
 | 
			
		||||
        r"github://([a-zA-Z0-9\-]+)/([a-zA-Z0-9\-\._]+)/([a-zA-Z0-9\-_.\./]+)(?:@([a-zA-Z0-9\-_.\./]+))?",
 | 
			
		||||
        value,
 | 
			
		||||
    )
 | 
			
		||||
    if m is None:
 | 
			
		||||
        raise cv.Invalid(
 | 
			
		||||
            "Source is not a file system path or in expected github://username/name/[sub-folder/]file-path.yml[@branch-or-tag] format!"
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    conf = {
 | 
			
		||||
        CONF_URL: git_file.git_url,
 | 
			
		||||
        CONF_FILE: git_file.filename,
 | 
			
		||||
        CONF_URL: f"https://github.com/{m.group(1)}/{m.group(2)}.git",
 | 
			
		||||
        CONF_FILE: m.group(3),
 | 
			
		||||
    }
 | 
			
		||||
    if git_file.ref:
 | 
			
		||||
        conf[CONF_REF] = git_file.ref
 | 
			
		||||
    if m.group(4):
 | 
			
		||||
        conf[CONF_REF] = m.group(4)
 | 
			
		||||
 | 
			
		||||
    # print(conf)
 | 
			
		||||
    return BASE_SCHEMA(conf)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,12 +17,3 @@ RP2040_BOARD_PINS = {
 | 
			
		||||
        "SCL1": 27,
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
BOARDS = {
 | 
			
		||||
    "rpipico": {
 | 
			
		||||
        "name": "Raspberry Pi Pico",
 | 
			
		||||
    },
 | 
			
		||||
    "rpipicow": {
 | 
			
		||||
        "name": "Raspberry Pi Pico W",
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,87 +0,0 @@
 | 
			
		||||
import esphome.codegen as cg
 | 
			
		||||
import esphome.config_validation as cv
 | 
			
		||||
from esphome import pins
 | 
			
		||||
from esphome.const import (
 | 
			
		||||
    CONF_ID,
 | 
			
		||||
    CONF_MODE,
 | 
			
		||||
    CONF_NUMBER,
 | 
			
		||||
    CONF_INVERTED,
 | 
			
		||||
    CONF_DATA_PIN,
 | 
			
		||||
    CONF_CLOCK_PIN,
 | 
			
		||||
    CONF_INPUT,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
CODEOWNERS = ["@jesserockz"]
 | 
			
		||||
DEPENDENCIES = []
 | 
			
		||||
MULTI_CONF = True
 | 
			
		||||
 | 
			
		||||
sn74hc165_ns = cg.esphome_ns.namespace("sn74hc165")
 | 
			
		||||
 | 
			
		||||
SN74HC165Component = sn74hc165_ns.class_("SN74HC165Component", cg.Component)
 | 
			
		||||
SN74HC165GPIOPin = sn74hc165_ns.class_(
 | 
			
		||||
    "SN74HC165GPIOPin", cg.GPIOPin, cg.Parented.template(SN74HC165Component)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
CONF_SN74HC165 = "sn74hc165"
 | 
			
		||||
CONF_LOAD_PIN = "load_pin"
 | 
			
		||||
CONF_CLOCK_INHIBIT_PIN = "clock_inhibit_pin"
 | 
			
		||||
CONF_SR_COUNT = "sr_count"
 | 
			
		||||
CONFIG_SCHEMA = cv.Schema(
 | 
			
		||||
    {
 | 
			
		||||
        cv.Required(CONF_ID): cv.declare_id(SN74HC165Component),
 | 
			
		||||
        cv.Required(CONF_DATA_PIN): pins.gpio_input_pin_schema,
 | 
			
		||||
        cv.Required(CONF_CLOCK_PIN): pins.gpio_output_pin_schema,
 | 
			
		||||
        cv.Required(CONF_LOAD_PIN): pins.gpio_output_pin_schema,
 | 
			
		||||
        cv.Optional(CONF_CLOCK_INHIBIT_PIN): pins.gpio_output_pin_schema,
 | 
			
		||||
        cv.Optional(CONF_SR_COUNT, default=1): cv.int_range(min=1, max=256),
 | 
			
		||||
    }
 | 
			
		||||
).extend(cv.COMPONENT_SCHEMA)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def to_code(config):
 | 
			
		||||
    var = cg.new_Pvariable(config[CONF_ID])
 | 
			
		||||
    await cg.register_component(var, config)
 | 
			
		||||
    data_pin = await cg.gpio_pin_expression(config[CONF_DATA_PIN])
 | 
			
		||||
    cg.add(var.set_data_pin(data_pin))
 | 
			
		||||
    clock_pin = await cg.gpio_pin_expression(config[CONF_CLOCK_PIN])
 | 
			
		||||
    cg.add(var.set_clock_pin(clock_pin))
 | 
			
		||||
    load_pin = await cg.gpio_pin_expression(config[CONF_LOAD_PIN])
 | 
			
		||||
    cg.add(var.set_load_pin(load_pin))
 | 
			
		||||
    if CONF_CLOCK_INHIBIT_PIN in config:
 | 
			
		||||
        clock_inhibit_pin = await cg.gpio_pin_expression(config[CONF_CLOCK_INHIBIT_PIN])
 | 
			
		||||
        cg.add(var.set_clock_inhibit_pin(clock_inhibit_pin))
 | 
			
		||||
 | 
			
		||||
    cg.add(var.set_sr_count(config[CONF_SR_COUNT]))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _validate_input_mode(value):
 | 
			
		||||
    if value is not True:
 | 
			
		||||
        raise cv.Invalid("Only input mode is supported")
 | 
			
		||||
    return value
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SN74HC165_PIN_SCHEMA = cv.All(
 | 
			
		||||
    {
 | 
			
		||||
        cv.GenerateID(): cv.declare_id(SN74HC165GPIOPin),
 | 
			
		||||
        cv.Required(CONF_SN74HC165): cv.use_id(SN74HC165Component),
 | 
			
		||||
        cv.Required(CONF_NUMBER): cv.int_range(min=0, max=2048, max_included=False),
 | 
			
		||||
        cv.Optional(CONF_MODE, default={}): cv.All(
 | 
			
		||||
            {
 | 
			
		||||
                cv.Optional(CONF_INPUT, default=True): cv.All(
 | 
			
		||||
                    cv.boolean, _validate_input_mode
 | 
			
		||||
                ),
 | 
			
		||||
            },
 | 
			
		||||
        ),
 | 
			
		||||
        cv.Optional(CONF_INVERTED, default=False): cv.boolean,
 | 
			
		||||
    }
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pins.PIN_SCHEMA_REGISTRY.register(CONF_SN74HC165, SN74HC165_PIN_SCHEMA)
 | 
			
		||||
async def sn74hc165_pin_to_code(config):
 | 
			
		||||
    var = cg.new_Pvariable(config[CONF_ID])
 | 
			
		||||
    await cg.register_parented(var, config[CONF_SN74HC165])
 | 
			
		||||
 | 
			
		||||
    cg.add(var.set_pin(config[CONF_NUMBER]))
 | 
			
		||||
    cg.add(var.set_inverted(config[CONF_INVERTED]))
 | 
			
		||||
    return var
 | 
			
		||||
@@ -1,67 +0,0 @@
 | 
			
		||||
#include "sn74hc165.h"
 | 
			
		||||
#include "esphome/core/log.h"
 | 
			
		||||
 | 
			
		||||
namespace esphome {
 | 
			
		||||
namespace sn74hc165 {
 | 
			
		||||
 | 
			
		||||
static const char *const TAG = "sn74hc165";
 | 
			
		||||
 | 
			
		||||
void SN74HC165Component::setup() {
 | 
			
		||||
  ESP_LOGCONFIG(TAG, "Setting up SN74HC165...");
 | 
			
		||||
 | 
			
		||||
  // initialize pins
 | 
			
		||||
  this->clock_pin_->setup();
 | 
			
		||||
  this->data_pin_->setup();
 | 
			
		||||
  this->load_pin_->setup();
 | 
			
		||||
  this->clock_pin_->digital_write(false);
 | 
			
		||||
  this->load_pin_->digital_write(false);
 | 
			
		||||
 | 
			
		||||
  if (this->clock_inhibit_pin_ != nullptr) {
 | 
			
		||||
    this->clock_inhibit_pin_->setup();
 | 
			
		||||
    this->clock_inhibit_pin_->digital_write(true);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // read state from shift register
 | 
			
		||||
  this->read_gpio_();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SN74HC165Component::loop() { this->read_gpio_(); }
 | 
			
		||||
 | 
			
		||||
void SN74HC165Component::dump_config() { ESP_LOGCONFIG(TAG, "SN74HC165:"); }
 | 
			
		||||
 | 
			
		||||
bool SN74HC165Component::digital_read_(uint16_t pin) {
 | 
			
		||||
  if (pin >= this->sr_count_ * 8) {
 | 
			
		||||
    ESP_LOGE(TAG, "Pin %u is out of range! Maximum pin number with %u chips in series is %u", pin, this->sr_count_,
 | 
			
		||||
             (this->sr_count_ * 8) - 1);
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
  return this->input_bits_[pin];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SN74HC165Component::read_gpio_() {
 | 
			
		||||
  this->load_pin_->digital_write(false);
 | 
			
		||||
  delayMicroseconds(5);
 | 
			
		||||
  this->load_pin_->digital_write(true);
 | 
			
		||||
  delayMicroseconds(5);
 | 
			
		||||
 | 
			
		||||
  if (this->clock_inhibit_pin_ != nullptr)
 | 
			
		||||
    this->clock_inhibit_pin_->digital_write(false);
 | 
			
		||||
 | 
			
		||||
  for (int16_t i = (this->sr_count_ * 8) - 1; i >= 0; i--) {
 | 
			
		||||
    this->input_bits_[i] = this->data_pin_->digital_read();
 | 
			
		||||
    this->clock_pin_->digital_write(true);
 | 
			
		||||
    this->clock_pin_->digital_write(false);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (this->clock_inhibit_pin_ != nullptr)
 | 
			
		||||
    this->clock_inhibit_pin_->digital_write(true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float SN74HC165Component::get_setup_priority() const { return setup_priority::IO; }
 | 
			
		||||
 | 
			
		||||
bool SN74HC165GPIOPin::digital_read() { return this->parent_->digital_read_(this->pin_); }
 | 
			
		||||
 | 
			
		||||
std::string SN74HC165GPIOPin::dump_summary() const { return str_snprintf("%u via SN74HC165", 18, pin_); }
 | 
			
		||||
 | 
			
		||||
}  // namespace sn74hc165
 | 
			
		||||
}  // namespace esphome
 | 
			
		||||
@@ -1,61 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include "esphome/core/component.h"
 | 
			
		||||
#include "esphome/core/hal.h"
 | 
			
		||||
#include "esphome/core/helpers.h"
 | 
			
		||||
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
namespace esphome {
 | 
			
		||||
namespace sn74hc165 {
 | 
			
		||||
 | 
			
		||||
class SN74HC165Component : public Component {
 | 
			
		||||
 public:
 | 
			
		||||
  SN74HC165Component() = default;
 | 
			
		||||
 | 
			
		||||
  void setup() override;
 | 
			
		||||
  void loop() override;
 | 
			
		||||
  float get_setup_priority() const override;
 | 
			
		||||
  void dump_config() override;
 | 
			
		||||
 | 
			
		||||
  void set_data_pin(GPIOPin *pin) { this->data_pin_ = pin; }
 | 
			
		||||
  void set_clock_pin(GPIOPin *pin) { this->clock_pin_ = pin; }
 | 
			
		||||
  void set_load_pin(GPIOPin *pin) { this->load_pin_ = pin; }
 | 
			
		||||
  void set_clock_inhibit_pin(GPIOPin *pin) { this->clock_inhibit_pin_ = pin; }
 | 
			
		||||
  void set_sr_count(uint8_t count) {
 | 
			
		||||
    this->sr_count_ = count;
 | 
			
		||||
    this->input_bits_.resize(count * 8);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  friend class SN74HC165GPIOPin;
 | 
			
		||||
  bool digital_read_(uint16_t pin);
 | 
			
		||||
  void read_gpio_();
 | 
			
		||||
 | 
			
		||||
  GPIOPin *data_pin_;
 | 
			
		||||
  GPIOPin *clock_pin_;
 | 
			
		||||
  GPIOPin *load_pin_;
 | 
			
		||||
  GPIOPin *clock_inhibit_pin_;
 | 
			
		||||
  uint8_t sr_count_;
 | 
			
		||||
  std::vector<bool> input_bits_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// Helper class to expose a SC74HC165 pin as an internal input GPIO pin.
 | 
			
		||||
class SN74HC165GPIOPin : public GPIOPin, public Parented<SN74HC165Component> {
 | 
			
		||||
 public:
 | 
			
		||||
  void setup() override {}
 | 
			
		||||
  void pin_mode(gpio::Flags flags) override {}
 | 
			
		||||
  bool digital_read() override;
 | 
			
		||||
  void digital_write(bool value) override{};
 | 
			
		||||
  std::string dump_summary() const override;
 | 
			
		||||
 | 
			
		||||
  void set_pin(uint16_t pin) { pin_ = pin; }
 | 
			
		||||
  void set_inverted(bool inverted) { inverted_ = inverted; }
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  uint16_t pin_;
 | 
			
		||||
  bool inverted_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}  // namespace sn74hc165
 | 
			
		||||
}  // namespace esphome
 | 
			
		||||
@@ -17,9 +17,7 @@ MULTI_CONF = True
 | 
			
		||||
sn74hc595_ns = cg.esphome_ns.namespace("sn74hc595")
 | 
			
		||||
 | 
			
		||||
SN74HC595Component = sn74hc595_ns.class_("SN74HC595Component", cg.Component)
 | 
			
		||||
SN74HC595GPIOPin = sn74hc595_ns.class_(
 | 
			
		||||
    "SN74HC595GPIOPin", cg.GPIOPin, cg.Parented.template(SN74HC595Component)
 | 
			
		||||
)
 | 
			
		||||
SN74HC595GPIOPin = sn74hc595_ns.class_("SN74HC595GPIOPin", cg.GPIOPin)
 | 
			
		||||
 | 
			
		||||
CONF_SN74HC595 = "sn74hc595"
 | 
			
		||||
CONF_LATCH_PIN = "latch_pin"
 | 
			
		||||
@@ -32,7 +30,7 @@ CONFIG_SCHEMA = cv.Schema(
 | 
			
		||||
        cv.Required(CONF_CLOCK_PIN): pins.gpio_output_pin_schema,
 | 
			
		||||
        cv.Required(CONF_LATCH_PIN): pins.gpio_output_pin_schema,
 | 
			
		||||
        cv.Optional(CONF_OE_PIN): pins.gpio_output_pin_schema,
 | 
			
		||||
        cv.Optional(CONF_SR_COUNT, default=1): cv.int_range(min=1, max=256),
 | 
			
		||||
        cv.Optional(CONF_SR_COUNT, default=1): cv.int_range(1, 4),
 | 
			
		||||
    }
 | 
			
		||||
).extend(cv.COMPONENT_SCHEMA)
 | 
			
		||||
 | 
			
		||||
@@ -62,7 +60,7 @@ SN74HC595_PIN_SCHEMA = cv.All(
 | 
			
		||||
    {
 | 
			
		||||
        cv.GenerateID(): cv.declare_id(SN74HC595GPIOPin),
 | 
			
		||||
        cv.Required(CONF_SN74HC595): cv.use_id(SN74HC595Component),
 | 
			
		||||
        cv.Required(CONF_NUMBER): cv.int_range(min=0, max=2048, max_included=False),
 | 
			
		||||
        cv.Required(CONF_NUMBER): cv.int_range(min=0, max=31),
 | 
			
		||||
        cv.Optional(CONF_MODE, default={}): cv.All(
 | 
			
		||||
            {
 | 
			
		||||
                cv.Optional(CONF_OUTPUT, default=True): cv.All(
 | 
			
		||||
@@ -78,8 +76,10 @@ SN74HC595_PIN_SCHEMA = cv.All(
 | 
			
		||||
@pins.PIN_SCHEMA_REGISTRY.register(CONF_SN74HC595, SN74HC595_PIN_SCHEMA)
 | 
			
		||||
async def sn74hc595_pin_to_code(config):
 | 
			
		||||
    var = cg.new_Pvariable(config[CONF_ID])
 | 
			
		||||
    await cg.register_parented(var, config[CONF_SN74HC595])
 | 
			
		||||
    parent = await cg.get_variable(config[CONF_SN74HC595])
 | 
			
		||||
    cg.add(var.set_parent(parent))
 | 
			
		||||
 | 
			
		||||
    cg.add(var.set_pin(config[CONF_NUMBER]))
 | 
			
		||||
    num = config[CONF_NUMBER]
 | 
			
		||||
    cg.add(var.set_pin(num))
 | 
			
		||||
    cg.add(var.set_inverted(config[CONF_INVERTED]))
 | 
			
		||||
    return var
 | 
			
		||||
 
 | 
			
		||||
@@ -28,21 +28,24 @@ void SN74HC595Component::setup() {
 | 
			
		||||
 | 
			
		||||
void SN74HC595Component::dump_config() { ESP_LOGCONFIG(TAG, "SN74HC595:"); }
 | 
			
		||||
 | 
			
		||||
void SN74HC595Component::digital_write_(uint16_t pin, bool value) {
 | 
			
		||||
  if (pin >= this->sr_count_ * 8) {
 | 
			
		||||
    ESP_LOGE(TAG, "Pin %u is out of range! Maximum pin number with %u chips in series is %u", pin, this->sr_count_,
 | 
			
		||||
             (this->sr_count_ * 8) - 1);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  this->output_bits_[pin] = value;
 | 
			
		||||
bool SN74HC595Component::digital_read_(uint8_t pin) { return this->output_bits_ >> pin; }
 | 
			
		||||
 | 
			
		||||
void SN74HC595Component::digital_write_(uint8_t pin, bool value) {
 | 
			
		||||
  uint32_t mask = 1UL << pin;
 | 
			
		||||
  this->output_bits_ &= ~mask;
 | 
			
		||||
  if (value)
 | 
			
		||||
    this->output_bits_ |= mask;
 | 
			
		||||
  this->write_gpio_();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SN74HC595Component::write_gpio_() {
 | 
			
		||||
  for (auto bit = this->output_bits_.rbegin(); bit != this->output_bits_.rend(); bit++) {
 | 
			
		||||
    this->data_pin_->digital_write(*bit);
 | 
			
		||||
    this->clock_pin_->digital_write(true);
 | 
			
		||||
    this->clock_pin_->digital_write(false);
 | 
			
		||||
bool SN74HC595Component::write_gpio_() {
 | 
			
		||||
  for (int i = this->sr_count_ - 1; i >= 0; i--) {
 | 
			
		||||
    uint8_t data = (uint8_t)(this->output_bits_ >> (8 * i) & 0xff);
 | 
			
		||||
    for (int j = 0; j < 8; j++) {
 | 
			
		||||
      this->data_pin_->digital_write(data & (1 << (7 - j)));
 | 
			
		||||
      this->clock_pin_->digital_write(true);
 | 
			
		||||
      this->clock_pin_->digital_write(false);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // pulse latch to activate new values
 | 
			
		||||
@@ -53,6 +56,8 @@ void SN74HC595Component::write_gpio_() {
 | 
			
		||||
  if (this->have_oe_pin_) {
 | 
			
		||||
    this->oe_pin_->digital_write(false);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float SN74HC595Component::get_setup_priority() const { return setup_priority::IO; }
 | 
			
		||||
 
 | 
			
		||||
@@ -2,9 +2,6 @@
 | 
			
		||||
 | 
			
		||||
#include "esphome/core/component.h"
 | 
			
		||||
#include "esphome/core/hal.h"
 | 
			
		||||
#include "esphome/core/helpers.h"
 | 
			
		||||
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
namespace esphome {
 | 
			
		||||
namespace sn74hc595 {
 | 
			
		||||
@@ -24,15 +21,13 @@ class SN74HC595Component : public Component {
 | 
			
		||||
    oe_pin_ = pin;
 | 
			
		||||
    have_oe_pin_ = true;
 | 
			
		||||
  }
 | 
			
		||||
  void set_sr_count(uint8_t count) {
 | 
			
		||||
    sr_count_ = count;
 | 
			
		||||
    this->output_bits_.resize(count * 8);
 | 
			
		||||
  }
 | 
			
		||||
  void set_sr_count(uint8_t count) { sr_count_ = count; }
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  friend class SN74HC595GPIOPin;
 | 
			
		||||
  void digital_write_(uint16_t pin, bool value);
 | 
			
		||||
  void write_gpio_();
 | 
			
		||||
  bool digital_read_(uint8_t pin);
 | 
			
		||||
  void digital_write_(uint8_t pin, bool value);
 | 
			
		||||
  bool write_gpio_();
 | 
			
		||||
 | 
			
		||||
  GPIOPin *data_pin_;
 | 
			
		||||
  GPIOPin *clock_pin_;
 | 
			
		||||
@@ -40,11 +35,11 @@ class SN74HC595Component : public Component {
 | 
			
		||||
  GPIOPin *oe_pin_;
 | 
			
		||||
  uint8_t sr_count_;
 | 
			
		||||
  bool have_oe_pin_{false};
 | 
			
		||||
  std::vector<bool> output_bits_;
 | 
			
		||||
  uint32_t output_bits_{0x00};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// Helper class to expose a SC74HC595 pin as an internal output GPIO pin.
 | 
			
		||||
class SN74HC595GPIOPin : public GPIOPin, public Parented<SN74HC595Component> {
 | 
			
		||||
class SN74HC595GPIOPin : public GPIOPin {
 | 
			
		||||
 public:
 | 
			
		||||
  void setup() override {}
 | 
			
		||||
  void pin_mode(gpio::Flags flags) override {}
 | 
			
		||||
@@ -52,11 +47,13 @@ class SN74HC595GPIOPin : public GPIOPin, public Parented<SN74HC595Component> {
 | 
			
		||||
  void digital_write(bool value) override;
 | 
			
		||||
  std::string dump_summary() const override;
 | 
			
		||||
 | 
			
		||||
  void set_pin(uint16_t pin) { pin_ = pin; }
 | 
			
		||||
  void set_parent(SN74HC595Component *parent) { parent_ = parent; }
 | 
			
		||||
  void set_pin(uint8_t pin) { pin_ = pin; }
 | 
			
		||||
  void set_inverted(bool inverted) { inverted_ = inverted; }
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  uint16_t pin_;
 | 
			
		||||
  SN74HC595Component *parent_;
 | 
			
		||||
  uint8_t pin_;
 | 
			
		||||
  bool inverted_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,6 @@ from esphome.const import (
 | 
			
		||||
    CONF_NAME,
 | 
			
		||||
    CONF_REPEAT,
 | 
			
		||||
    CONF_RUN_DURATION,
 | 
			
		||||
    ENTITY_CATEGORY_CONFIG,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
AUTO_LOAD = ["switch"]
 | 
			
		||||
@@ -224,9 +223,7 @@ SPRINKLER_ACTION_QUEUE_VALVE_SCHEMA = cv.Schema(
 | 
			
		||||
SPRINKLER_VALVE_SCHEMA = cv.Schema(
 | 
			
		||||
    {
 | 
			
		||||
        cv.Optional(CONF_ENABLE_SWITCH): cv.maybe_simple_value(
 | 
			
		||||
            switch.switch_schema(
 | 
			
		||||
                SprinklerControllerSwitch, entity_category=ENTITY_CATEGORY_CONFIG
 | 
			
		||||
            ),
 | 
			
		||||
            switch.switch_schema(SprinklerControllerSwitch),
 | 
			
		||||
            key=CONF_NAME,
 | 
			
		||||
        ),
 | 
			
		||||
        cv.Optional(CONF_PUMP_OFF_SWITCH_ID): cv.use_id(switch.Switch),
 | 
			
		||||
@@ -247,9 +244,7 @@ SPRINKLER_CONTROLLER_SCHEMA = cv.Schema(
 | 
			
		||||
    {
 | 
			
		||||
        cv.GenerateID(): cv.declare_id(Sprinkler),
 | 
			
		||||
        cv.Optional(CONF_AUTO_ADVANCE_SWITCH): cv.maybe_simple_value(
 | 
			
		||||
            switch.switch_schema(
 | 
			
		||||
                SprinklerControllerSwitch, entity_category=ENTITY_CATEGORY_CONFIG
 | 
			
		||||
            ),
 | 
			
		||||
            switch.switch_schema(SprinklerControllerSwitch),
 | 
			
		||||
            key=CONF_NAME,
 | 
			
		||||
        ),
 | 
			
		||||
        cv.Optional(CONF_MAIN_SWITCH): cv.maybe_simple_value(
 | 
			
		||||
@@ -257,15 +252,11 @@ SPRINKLER_CONTROLLER_SCHEMA = cv.Schema(
 | 
			
		||||
            key=CONF_NAME,
 | 
			
		||||
        ),
 | 
			
		||||
        cv.Optional(CONF_QUEUE_ENABLE_SWITCH): cv.maybe_simple_value(
 | 
			
		||||
            switch.switch_schema(
 | 
			
		||||
                SprinklerControllerSwitch, entity_category=ENTITY_CATEGORY_CONFIG
 | 
			
		||||
            ),
 | 
			
		||||
            switch.switch_schema(SprinklerControllerSwitch),
 | 
			
		||||
            key=CONF_NAME,
 | 
			
		||||
        ),
 | 
			
		||||
        cv.Optional(CONF_REVERSE_SWITCH): cv.maybe_simple_value(
 | 
			
		||||
            switch.switch_schema(
 | 
			
		||||
                SprinklerControllerSwitch, entity_category=ENTITY_CATEGORY_CONFIG
 | 
			
		||||
            ),
 | 
			
		||||
            switch.switch_schema(SprinklerControllerSwitch),
 | 
			
		||||
            key=CONF_NAME,
 | 
			
		||||
        ),
 | 
			
		||||
        cv.Optional(CONF_MANUAL_SELECTION_DELAY): cv.positive_time_period_seconds,
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,6 @@ CONF_CURRENT_TEMPERATURE_MULTIPLIER = "current_temperature_multiplier"
 | 
			
		||||
CONF_TARGET_TEMPERATURE_MULTIPLIER = "target_temperature_multiplier"
 | 
			
		||||
CONF_ECO_DATAPOINT = "eco_datapoint"
 | 
			
		||||
CONF_ECO_TEMPERATURE = "eco_temperature"
 | 
			
		||||
CONF_REPORTS_FAHRENHEIT = "reports_fahrenheit"
 | 
			
		||||
 | 
			
		||||
TuyaClimate = tuya_ns.class_("TuyaClimate", climate.Climate, cg.Component)
 | 
			
		||||
 | 
			
		||||
@@ -111,7 +110,6 @@ CONFIG_SCHEMA = cv.All(
 | 
			
		||||
            cv.Optional(CONF_TARGET_TEMPERATURE_MULTIPLIER): cv.positive_float,
 | 
			
		||||
            cv.Optional(CONF_ECO_DATAPOINT): cv.uint8_t,
 | 
			
		||||
            cv.Optional(CONF_ECO_TEMPERATURE): cv.temperature,
 | 
			
		||||
            cv.Optional(CONF_REPORTS_FAHRENHEIT, default=False): cv.boolean,
 | 
			
		||||
        }
 | 
			
		||||
    ).extend(cv.COMPONENT_SCHEMA),
 | 
			
		||||
    cv.has_at_least_one_key(CONF_TARGET_TEMPERATURE_DATAPOINT, CONF_SWITCH_DATAPOINT),
 | 
			
		||||
@@ -188,6 +186,3 @@ async def to_code(config):
 | 
			
		||||
        cg.add(var.set_eco_id(config[CONF_ECO_DATAPOINT]))
 | 
			
		||||
        if CONF_ECO_TEMPERATURE in config:
 | 
			
		||||
            cg.add(var.set_eco_temperature(config[CONF_ECO_TEMPERATURE]))
 | 
			
		||||
 | 
			
		||||
    if config[CONF_REPORTS_FAHRENHEIT]:
 | 
			
		||||
        cg.add(var.set_reports_fahrenheit())
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
#include "tuya_climate.h"
 | 
			
		||||
#include "esphome/core/log.h"
 | 
			
		||||
#include "tuya_climate.h"
 | 
			
		||||
 | 
			
		||||
namespace esphome {
 | 
			
		||||
namespace tuya {
 | 
			
		||||
@@ -44,10 +44,6 @@ void TuyaClimate::setup() {
 | 
			
		||||
  if (this->target_temperature_id_.has_value()) {
 | 
			
		||||
    this->parent_->register_listener(*this->target_temperature_id_, [this](const TuyaDatapoint &datapoint) {
 | 
			
		||||
      this->manual_temperature_ = datapoint.value_int * this->target_temperature_multiplier_;
 | 
			
		||||
      if (this->reports_fahrenheit_) {
 | 
			
		||||
        this->manual_temperature_ = (this->manual_temperature_ - 32) * 5 / 9;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      ESP_LOGV(TAG, "MCU reported manual target temperature is: %.1f", this->manual_temperature_);
 | 
			
		||||
      this->compute_target_temperature_();
 | 
			
		||||
      this->compute_state_();
 | 
			
		||||
@@ -57,10 +53,6 @@ void TuyaClimate::setup() {
 | 
			
		||||
  if (this->current_temperature_id_.has_value()) {
 | 
			
		||||
    this->parent_->register_listener(*this->current_temperature_id_, [this](const TuyaDatapoint &datapoint) {
 | 
			
		||||
      this->current_temperature = datapoint.value_int * this->current_temperature_multiplier_;
 | 
			
		||||
      if (this->reports_fahrenheit_) {
 | 
			
		||||
        this->current_temperature = (this->current_temperature - 32) * 5 / 9;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      ESP_LOGV(TAG, "MCU reported current temperature is: %.1f", this->current_temperature);
 | 
			
		||||
      this->compute_state_();
 | 
			
		||||
      this->publish_state();
 | 
			
		||||
@@ -113,10 +105,7 @@ void TuyaClimate::control(const climate::ClimateCall &call) {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (call.get_target_temperature().has_value()) {
 | 
			
		||||
    float target_temperature = *call.get_target_temperature();
 | 
			
		||||
    if (this->reports_fahrenheit_)
 | 
			
		||||
      target_temperature = (target_temperature * 9 / 5) + 32;
 | 
			
		||||
 | 
			
		||||
    const float target_temperature = *call.get_target_temperature();
 | 
			
		||||
    ESP_LOGV(TAG, "Setting target temperature: %.1f", target_temperature);
 | 
			
		||||
    this->parent_->set_integer_datapoint_value(*this->target_temperature_id_,
 | 
			
		||||
                                               (int) (target_temperature / this->target_temperature_multiplier_));
 | 
			
		||||
 
 | 
			
		||||
@@ -35,8 +35,6 @@ class TuyaClimate : public climate::Climate, public Component {
 | 
			
		||||
  void set_eco_id(uint8_t eco_id) { this->eco_id_ = eco_id; }
 | 
			
		||||
  void set_eco_temperature(float eco_temperature) { this->eco_temperature_ = eco_temperature; }
 | 
			
		||||
 | 
			
		||||
  void set_reports_fahrenheit() { this->reports_fahrenheit_ = true; }
 | 
			
		||||
 | 
			
		||||
  void set_tuya_parent(Tuya *parent) { this->parent_ = parent; }
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
@@ -79,7 +77,6 @@ class TuyaClimate : public climate::Climate, public Component {
 | 
			
		||||
  bool cooling_state_{false};
 | 
			
		||||
  float manual_temperature_;
 | 
			
		||||
  bool eco_;
 | 
			
		||||
  bool reports_fahrenheit_{false};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}  // namespace tuya
 | 
			
		||||
 
 | 
			
		||||
@@ -88,17 +88,13 @@ MODELS = {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def validate_full_update_every_only_types_ac(value):
 | 
			
		||||
def validate_full_update_every_only_type_a(value):
 | 
			
		||||
    if CONF_FULL_UPDATE_EVERY not in value:
 | 
			
		||||
        return value
 | 
			
		||||
    if MODELS[value[CONF_MODEL]][0] == "b":
 | 
			
		||||
        full_models = []
 | 
			
		||||
        for key, val in sorted(MODELS.items()):
 | 
			
		||||
            if val[0] != "b":
 | 
			
		||||
                full_models.append(key)
 | 
			
		||||
        raise cv.Invalid(
 | 
			
		||||
            "The 'full_update_every' option is only available for models "
 | 
			
		||||
            + ", ".join(full_models)
 | 
			
		||||
            "'1.54in', '1.54inV2', '2.13in', '2.90in', and '2.90inV2'."
 | 
			
		||||
        )
 | 
			
		||||
    return value
 | 
			
		||||
 | 
			
		||||
@@ -120,7 +116,7 @@ CONFIG_SCHEMA = cv.All(
 | 
			
		||||
    )
 | 
			
		||||
    .extend(cv.polling_component_schema("1s"))
 | 
			
		||||
    .extend(spi.spi_device_schema()),
 | 
			
		||||
    validate_full_update_every_only_types_ac,
 | 
			
		||||
    validate_full_update_every_only_type_a,
 | 
			
		||||
    cv.has_at_most_one_key(CONF_PAGES, CONF_LAMBDA),
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
"""Constants used by esphome."""
 | 
			
		||||
 | 
			
		||||
__version__ = "2022.12.0b2"
 | 
			
		||||
__version__ = "2022.12.0-dev"
 | 
			
		||||
 | 
			
		||||
ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
 | 
			
		||||
 | 
			
		||||
@@ -992,7 +992,6 @@ KEY_CORE = "core"
 | 
			
		||||
KEY_TARGET_PLATFORM = "target_platform"
 | 
			
		||||
KEY_TARGET_FRAMEWORK = "target_framework"
 | 
			
		||||
KEY_FRAMEWORK_VERSION = "framework_version"
 | 
			
		||||
KEY_NAME = "name"
 | 
			
		||||
 | 
			
		||||
# Entity categories
 | 
			
		||||
ENTITY_CATEGORY_NONE = ""
 | 
			
		||||
 
 | 
			
		||||
@@ -416,10 +416,6 @@ class ImportRequestHandler(BaseHandler):
 | 
			
		||||
            self.set_status(500)
 | 
			
		||||
            self.write("File already exists")
 | 
			
		||||
            return
 | 
			
		||||
        except ValueError:
 | 
			
		||||
            self.set_status(422)
 | 
			
		||||
            self.write("Invalid package url")
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        self.set_status(200)
 | 
			
		||||
        self.finish()
 | 
			
		||||
@@ -693,24 +689,6 @@ class PrometheusServiceDiscoveryHandler(BaseHandler):
 | 
			
		||||
        self.write(json.dumps(sd))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class BoardsRequestHandler(BaseHandler):
 | 
			
		||||
    @authenticated
 | 
			
		||||
    def get(self):
 | 
			
		||||
        from esphome.components.esp32.boards import BOARDS as ESP32_BOARDS
 | 
			
		||||
        from esphome.components.esp8266.boards import BOARDS as ESP8266_BOARDS
 | 
			
		||||
        from esphome.components.rp2040.boards import BOARDS as RP2040_BOARDS
 | 
			
		||||
 | 
			
		||||
        boards = {
 | 
			
		||||
            "esp32": {key: val[const.KEY_NAME] for key, val in ESP32_BOARDS.items()},
 | 
			
		||||
            "esp8266": {
 | 
			
		||||
                key: val[const.KEY_NAME] for key, val in ESP8266_BOARDS.items()
 | 
			
		||||
            },
 | 
			
		||||
            "rp2040": {key: val[const.KEY_NAME] for key, val in RP2040_BOARDS.items()},
 | 
			
		||||
        }
 | 
			
		||||
        self.set_header("content-type", "application/json")
 | 
			
		||||
        self.write(json.dumps(boards))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class MDNSStatusThread(threading.Thread):
 | 
			
		||||
    def run(self):
 | 
			
		||||
        global IMPORT_RESULT
 | 
			
		||||
@@ -1081,7 +1059,6 @@ def make_app(debug=get_bool_env(ENV_DEV)):
 | 
			
		||||
            (f"{rel}json-config", JsonConfigRequestHandler),
 | 
			
		||||
            (f"{rel}rename", EsphomeRenameHandler),
 | 
			
		||||
            (f"{rel}prometheus-sd", PrometheusServiceDiscoveryHandler),
 | 
			
		||||
            (f"{rel}boards", BoardsRequestHandler),
 | 
			
		||||
        ],
 | 
			
		||||
        **app_settings,
 | 
			
		||||
    )
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,14 @@
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
import subprocess
 | 
			
		||||
import hashlib
 | 
			
		||||
import logging
 | 
			
		||||
import re
 | 
			
		||||
import subprocess
 | 
			
		||||
import urllib.parse
 | 
			
		||||
from dataclasses import dataclass
 | 
			
		||||
from datetime import datetime
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
from typing import Callable, Optional
 | 
			
		||||
import urllib.parse
 | 
			
		||||
 | 
			
		||||
from datetime import datetime
 | 
			
		||||
 | 
			
		||||
import esphome.config_validation as cv
 | 
			
		||||
from esphome.core import CORE, TimePeriodSeconds
 | 
			
		||||
import esphome.config_validation as cv
 | 
			
		||||
 | 
			
		||||
_LOGGER = logging.getLogger(__name__)
 | 
			
		||||
 | 
			
		||||
@@ -104,57 +103,3 @@ def clone_or_update(
 | 
			
		||||
            return repo_dir, revert
 | 
			
		||||
 | 
			
		||||
    return repo_dir, None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GIT_DOMAINS = {
 | 
			
		||||
    "github": "github.com",
 | 
			
		||||
    "gitlab": "gitlab.com",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@dataclass(frozen=True)
 | 
			
		||||
class GitFile:
 | 
			
		||||
    domain: str
 | 
			
		||||
    owner: str
 | 
			
		||||
    repo: str
 | 
			
		||||
    filename: str
 | 
			
		||||
    ref: str = None
 | 
			
		||||
    query: str = None
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def git_url(self) -> str:
 | 
			
		||||
        return f"https://{self.domain}/{self.owner}/{self.repo}.git"
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def raw_url(self) -> str:
 | 
			
		||||
        if self.ref is None:
 | 
			
		||||
            raise ValueError("URL has no ref")
 | 
			
		||||
        if self.domain == "github":
 | 
			
		||||
            return f"https://raw.githubusercontent.com/{self.owner}/{self.repo}/{self.ref}/{self.filename}"
 | 
			
		||||
        if self.domain == "gitlab":
 | 
			
		||||
            return f"https://gitlab.com/{self.owner}/{self.repo}/-/raw/{self.ref}/{self.filename}"
 | 
			
		||||
        raise NotImplementedError(f"Git domain {self.domain} not supported")
 | 
			
		||||
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def from_shorthand(cls, shorthand):
 | 
			
		||||
        """Parse a git shorthand URL into its components."""
 | 
			
		||||
        if not isinstance(shorthand, str):
 | 
			
		||||
            raise ValueError("Git shorthand must be a string")
 | 
			
		||||
        m = re.match(
 | 
			
		||||
            r"(?P<domain>[a-zA-Z0-9\-]+)://(?P<owner>[a-zA-Z0-9\-]+)/(?P<repo>[a-zA-Z0-9\-\._]+)/(?P<filename>[a-zA-Z0-9\-_.\./]+)(?:@(?P<ref>[a-zA-Z0-9\-_.\./]+))?(?:\?(?P<query>[a-zA-Z0-9\-_.\./]+))?",
 | 
			
		||||
            shorthand,
 | 
			
		||||
        )
 | 
			
		||||
        if m is None:
 | 
			
		||||
            raise ValueError(
 | 
			
		||||
                "URL is not in expected github://username/name/[sub-folder/]file-path.yml[@branch-or-tag] format!"
 | 
			
		||||
            )
 | 
			
		||||
        if m.group("domain") not in GIT_DOMAINS:
 | 
			
		||||
            raise ValueError(f"Unknown git domain {m.group('domain')}")
 | 
			
		||||
        return cls(
 | 
			
		||||
            domain=GIT_DOMAINS[m.group("domain")],
 | 
			
		||||
            owner=m.group("owner"),
 | 
			
		||||
            repo=m.group("repo"),
 | 
			
		||||
            filename=m.group("filename"),
 | 
			
		||||
            ref=m.group("ref"),
 | 
			
		||||
            query=m.group("query"),
 | 
			
		||||
        )
 | 
			
		||||
 
 | 
			
		||||
@@ -9,8 +9,8 @@ pyserial==3.5
 | 
			
		||||
platformio==6.1.5  # When updating platformio, also update Dockerfile
 | 
			
		||||
esptool==4.4
 | 
			
		||||
click==8.1.3
 | 
			
		||||
esphome-dashboard==20221207.0
 | 
			
		||||
aioesphomeapi==13.0.1
 | 
			
		||||
esphome-dashboard==20221109.0
 | 
			
		||||
aioesphomeapi==12.2.1
 | 
			
		||||
zeroconf==0.39.4
 | 
			
		||||
 | 
			
		||||
# esp-idf requires this, but doesn't bundle it by default
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,13 @@
 | 
			
		||||
pylint==2.15.8
 | 
			
		||||
flake8==6.0.0  # also change in .pre-commit-config.yaml when updating
 | 
			
		||||
black==22.10.0  # also change in .pre-commit-config.yaml when updating
 | 
			
		||||
pyupgrade==3.3.0  # also change in .pre-commit-config.yaml when updating
 | 
			
		||||
pyupgrade==3.2.2  # also change in .pre-commit-config.yaml when updating
 | 
			
		||||
pre-commit
 | 
			
		||||
 | 
			
		||||
# Unit tests
 | 
			
		||||
pytest==7.2.0
 | 
			
		||||
pytest-cov==4.0.0
 | 
			
		||||
pytest-mock==3.10.0
 | 
			
		||||
pytest-asyncio==0.20.2
 | 
			
		||||
pytest-asyncio==0.20.1
 | 
			
		||||
asyncmock==0.4.2
 | 
			
		||||
hypothesis==5.49.0
 | 
			
		||||
 
 | 
			
		||||
@@ -245,7 +245,7 @@ def do_esp32():
 | 
			
		||||
 | 
			
		||||
    setEnum(
 | 
			
		||||
        output["esp32"]["schemas"]["CONFIG_SCHEMA"]["schema"]["config_vars"]["board"],
 | 
			
		||||
        list(esp32_boards.BOARDS.keys()),
 | 
			
		||||
        list(esp32_boards.BOARD_TO_VARIANT.keys()),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -381,7 +381,6 @@ climate:
 | 
			
		||||
    target_temperature_datapoint: 3
 | 
			
		||||
    current_temperature_multiplier: 0.5
 | 
			
		||||
    target_temperature_multiplier: 0.5
 | 
			
		||||
    reports_fahrenheit: true
 | 
			
		||||
 | 
			
		||||
switch:
 | 
			
		||||
  - platform: tuya
 | 
			
		||||
 
 | 
			
		||||
@@ -162,11 +162,6 @@ binary_sensor:
 | 
			
		||||
      then:
 | 
			
		||||
        - output.turn_off: Led7
 | 
			
		||||
 | 
			
		||||
  - platform: gpio
 | 
			
		||||
    id: sn74hc165_pin_0
 | 
			
		||||
    pin:
 | 
			
		||||
      sn74hc165: sn74hc165_hub
 | 
			
		||||
      number: 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -547,11 +542,3 @@ text_sensor:
 | 
			
		||||
        - ezo_pmp.arbitrary_command:
 | 
			
		||||
            id: hcl_pump
 | 
			
		||||
            command: D,?
 | 
			
		||||
 | 
			
		||||
sn74hc165:
 | 
			
		||||
  id: sn74hc165_hub
 | 
			
		||||
  data_pin: GPIO12
 | 
			
		||||
  clock_pin: GPIO14
 | 
			
		||||
  load_pin: GPIO27
 | 
			
		||||
  clock_inhibit_pin: GPIO26
 | 
			
		||||
  sr_count: 4
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user