mirror of
https://github.com/esphome/esphome.git
synced 2025-11-01 15:41:52 +00:00
Compare commits
20 Commits
jesserockz
...
2022.12.0b
Author | SHA1 | Date | |
---|---|---|---|
|
07197d12f6 | ||
|
7b0a298497 | ||
|
21679cf2ba | ||
|
4be7cd12a1 | ||
|
dee4d0ccb7 | ||
|
c6885c1bf4 | ||
|
8b8efb57af | ||
|
499e120aa4 | ||
|
6f198a4736 | ||
|
f500f448b1 | ||
|
6ad9baa870 | ||
|
f843925301 | ||
|
4a3b628946 | ||
|
4ffdc38cf5 | ||
|
f83f1bff19 | ||
|
9370ff3dfa | ||
|
2053b02c61 | ||
|
f34e797a0d | ||
|
30a2fc1273 | ||
|
48da5ef1c4 |
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@v3
|
||||
- uses: dessant/lock-threads@v4
|
||||
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.2.2
|
||||
rev: v3.3.0
|
||||
hooks:
|
||||
- id: pyupgrade
|
||||
args: [--py39-plus]
|
||||
|
@@ -208,6 +208,7 @@ 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
|
||||
|
@@ -1,4 +1,5 @@
|
||||
from pathlib import Path
|
||||
import requests
|
||||
|
||||
import esphome.codegen as cg
|
||||
import esphome.config_validation as cv
|
||||
@@ -6,6 +7,7 @@ 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")
|
||||
@@ -25,9 +27,12 @@ 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,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -41,6 +46,9 @@ 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]))
|
||||
|
||||
|
||||
@@ -64,17 +72,30 @@ def import_config(
|
||||
encoding="utf8",
|
||||
)
|
||||
else:
|
||||
config = {
|
||||
"substitutions": {"name": name},
|
||||
"packages": {project_name: import_url},
|
||||
"esphome": {
|
||||
"name": "${name}",
|
||||
"name_add_mac_suffix": False,
|
||||
},
|
||||
}
|
||||
output = dump(config)
|
||||
git_file = git.GitFile.from_shorthand(import_url)
|
||||
|
||||
if network == CONF_WIFI:
|
||||
output += WIFI_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
|
||||
|
||||
p.write_text(output, encoding="utf8")
|
||||
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")
|
||||
|
@@ -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(gpio_num_t(this->wakeup_pin_->get_pin()),
|
||||
esp_deep_sleep_enable_gpio_wakeup(1 << 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 BOARD_TO_VARIANT
|
||||
from .boards import BOARDS
|
||||
|
||||
# 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 BOARD_TO_VARIANT:
|
||||
if board not in BOARDS:
|
||||
raise cv.Invalid(
|
||||
"This board is unknown, please set the variant manually",
|
||||
path=[CONF_BOARD],
|
||||
)
|
||||
|
||||
value = value.copy()
|
||||
value[CONF_VARIANT] = BOARD_TO_VARIANT[board]
|
||||
value[CONF_VARIANT] = BOARDS[board][KEY_VARIANT]
|
||||
|
||||
return value
|
||||
|
||||
@@ -327,6 +327,11 @@ 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,197 +1066,738 @@ ESP32_BOARD_PINS = {
|
||||
}
|
||||
|
||||
"""
|
||||
BOARD_TO_VARIANT generated with:
|
||||
BOARDS 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\": VARIANT_${variant},"
|
||||
echo " \"$board\": {\"name\": \"$name\", \"variant\": VARIANT_${variant},},"
|
||||
done | sort
|
||||
"""
|
||||
|
||||
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,
|
||||
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,
|
||||
},
|
||||
}
|
||||
|
@@ -705,8 +705,13 @@ 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 (field_length == 0) {
|
||||
if (offset < param.adv_data_len && param.scan_rsp_len > 0) { // Zero padded advertisement data
|
||||
offset = param.adv_data_len;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// first byte of adv record is adv record type
|
||||
const uint8_t record_type = payload[offset++];
|
||||
|
@@ -22,10 +22,11 @@ from .const import (
|
||||
CONF_EARLY_PIN_INIT,
|
||||
KEY_BOARD,
|
||||
KEY_ESP8266,
|
||||
KEY_FLASH_SIZE,
|
||||
KEY_PIN_INITIAL_STATES,
|
||||
esp8266_ns,
|
||||
)
|
||||
from .boards import ESP8266_FLASH_SIZES, ESP8266_LD_SCRIPTS
|
||||
from .boards import BOARDS, ESP8266_LD_SCRIPTS
|
||||
|
||||
from .gpio import PinInitialState, add_pin_initial_states_array
|
||||
|
||||
@@ -218,8 +219,8 @@ async def to_code(config):
|
||||
cg.RawExpression(f"VERSION_CODE({ver.major}, {ver.minor}, {ver.patch})"),
|
||||
)
|
||||
|
||||
if config[CONF_BOARD] in ESP8266_FLASH_SIZES:
|
||||
flash_size = ESP8266_FLASH_SIZES[config[CONF_BOARD]]
|
||||
if config[CONF_BOARD] in BOARDS:
|
||||
flash_size = BOARDS[config[CONF_BOARD]][KEY_FLASH_SIZE]
|
||||
ld_scripts = ESP8266_LD_SCRIPTS[flash_size]
|
||||
|
||||
if ver <= cv.Version(2, 3, 0):
|
||||
|
@@ -4,50 +4,6 @@ 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"),
|
||||
@@ -206,3 +162,201 @@ 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,6 +5,7 @@ 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 = Switch::get_initial_state_with_restore_mode();
|
||||
bool initial_state = this->get_initial_state_with_restore_mode().value_or(false);
|
||||
|
||||
// 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 = Switch::get_initial_state_with_restore_mode();
|
||||
bool initial_state = this->get_initial_state_with_restore_mode().value_or(false);
|
||||
|
||||
if (initial_state) {
|
||||
this->turn_on();
|
||||
|
@@ -1,23 +1,22 @@
|
||||
import re
|
||||
from pathlib import Path
|
||||
from esphome.core import EsphomeError
|
||||
from esphome.config_helpers import merge_config
|
||||
|
||||
import esphome.config_validation as cv
|
||||
from esphome import git, yaml_util
|
||||
from esphome.config_helpers import merge_config
|
||||
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,
|
||||
)
|
||||
import esphome.config_validation as cv
|
||||
from esphome.const import __version__ as ESPHOME_VERSION
|
||||
from esphome.core import EsphomeError
|
||||
|
||||
DOMAIN = CONF_PACKAGES
|
||||
|
||||
@@ -55,23 +54,15 @@ def validate_source_shorthand(value):
|
||||
if not isinstance(value, str):
|
||||
raise cv.Invalid("Shorthand only for strings")
|
||||
|
||||
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!"
|
||||
)
|
||||
git_file = git.GitFile.from_shorthand(value)
|
||||
|
||||
conf = {
|
||||
CONF_URL: f"https://github.com/{m.group(1)}/{m.group(2)}.git",
|
||||
CONF_FILE: m.group(3),
|
||||
CONF_URL: git_file.git_url,
|
||||
CONF_FILE: git_file.filename,
|
||||
}
|
||||
if m.group(4):
|
||||
conf[CONF_REF] = m.group(4)
|
||||
if git_file.ref:
|
||||
conf[CONF_REF] = git_file.ref
|
||||
|
||||
# print(conf)
|
||||
return BASE_SCHEMA(conf)
|
||||
|
||||
|
||||
|
@@ -17,3 +17,12 @@ RP2040_BOARD_PINS = {
|
||||
"SCL1": 27,
|
||||
},
|
||||
}
|
||||
|
||||
BOARDS = {
|
||||
"rpipico": {
|
||||
"name": "Raspberry Pi Pico",
|
||||
},
|
||||
"rpipicow": {
|
||||
"name": "Raspberry Pi Pico W",
|
||||
},
|
||||
}
|
||||
|
87
esphome/components/sn74hc165/__init__.py
Normal file
87
esphome/components/sn74hc165/__init__.py
Normal file
@@ -0,0 +1,87 @@
|
||||
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
|
67
esphome/components/sn74hc165/sn74hc165.cpp
Normal file
67
esphome/components/sn74hc165/sn74hc165.cpp
Normal file
@@ -0,0 +1,67 @@
|
||||
#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
|
61
esphome/components/sn74hc165/sn74hc165.h
Normal file
61
esphome/components/sn74hc165/sn74hc165.h
Normal file
@@ -0,0 +1,61 @@
|
||||
#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,7 +17,9 @@ MULTI_CONF = True
|
||||
sn74hc595_ns = cg.esphome_ns.namespace("sn74hc595")
|
||||
|
||||
SN74HC595Component = sn74hc595_ns.class_("SN74HC595Component", cg.Component)
|
||||
SN74HC595GPIOPin = sn74hc595_ns.class_("SN74HC595GPIOPin", cg.GPIOPin)
|
||||
SN74HC595GPIOPin = sn74hc595_ns.class_(
|
||||
"SN74HC595GPIOPin", cg.GPIOPin, cg.Parented.template(SN74HC595Component)
|
||||
)
|
||||
|
||||
CONF_SN74HC595 = "sn74hc595"
|
||||
CONF_LATCH_PIN = "latch_pin"
|
||||
@@ -30,7 +32,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(1, 4),
|
||||
cv.Optional(CONF_SR_COUNT, default=1): cv.int_range(min=1, max=256),
|
||||
}
|
||||
).extend(cv.COMPONENT_SCHEMA)
|
||||
|
||||
@@ -60,7 +62,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=31),
|
||||
cv.Required(CONF_NUMBER): cv.int_range(min=0, max=2048, max_included=False),
|
||||
cv.Optional(CONF_MODE, default={}): cv.All(
|
||||
{
|
||||
cv.Optional(CONF_OUTPUT, default=True): cv.All(
|
||||
@@ -76,10 +78,8 @@ 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])
|
||||
parent = await cg.get_variable(config[CONF_SN74HC595])
|
||||
cg.add(var.set_parent(parent))
|
||||
await cg.register_parented(var, config[CONF_SN74HC595])
|
||||
|
||||
num = config[CONF_NUMBER]
|
||||
cg.add(var.set_pin(num))
|
||||
cg.add(var.set_pin(config[CONF_NUMBER]))
|
||||
cg.add(var.set_inverted(config[CONF_INVERTED]))
|
||||
return var
|
||||
|
@@ -28,24 +28,21 @@ void SN74HC595Component::setup() {
|
||||
|
||||
void SN74HC595Component::dump_config() { ESP_LOGCONFIG(TAG, "SN74HC595:"); }
|
||||
|
||||
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;
|
||||
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;
|
||||
this->write_gpio_();
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
// pulse latch to activate new values
|
||||
@@ -56,8 +53,6 @@ bool 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,6 +2,9 @@
|
||||
|
||||
#include "esphome/core/component.h"
|
||||
#include "esphome/core/hal.h"
|
||||
#include "esphome/core/helpers.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace esphome {
|
||||
namespace sn74hc595 {
|
||||
@@ -21,13 +24,15 @@ class SN74HC595Component : public Component {
|
||||
oe_pin_ = pin;
|
||||
have_oe_pin_ = true;
|
||||
}
|
||||
void set_sr_count(uint8_t count) { sr_count_ = count; }
|
||||
void set_sr_count(uint8_t count) {
|
||||
sr_count_ = count;
|
||||
this->output_bits_.resize(count * 8);
|
||||
}
|
||||
|
||||
protected:
|
||||
friend class SN74HC595GPIOPin;
|
||||
bool digital_read_(uint8_t pin);
|
||||
void digital_write_(uint8_t pin, bool value);
|
||||
bool write_gpio_();
|
||||
void digital_write_(uint16_t pin, bool value);
|
||||
void write_gpio_();
|
||||
|
||||
GPIOPin *data_pin_;
|
||||
GPIOPin *clock_pin_;
|
||||
@@ -35,11 +40,11 @@ class SN74HC595Component : public Component {
|
||||
GPIOPin *oe_pin_;
|
||||
uint8_t sr_count_;
|
||||
bool have_oe_pin_{false};
|
||||
uint32_t output_bits_{0x00};
|
||||
std::vector<bool> output_bits_;
|
||||
};
|
||||
|
||||
/// Helper class to expose a SC74HC595 pin as an internal output GPIO pin.
|
||||
class SN74HC595GPIOPin : public GPIOPin {
|
||||
class SN74HC595GPIOPin : public GPIOPin, public Parented<SN74HC595Component> {
|
||||
public:
|
||||
void setup() override {}
|
||||
void pin_mode(gpio::Flags flags) override {}
|
||||
@@ -47,13 +52,11 @@ class SN74HC595GPIOPin : public GPIOPin {
|
||||
void digital_write(bool value) override;
|
||||
std::string dump_summary() const override;
|
||||
|
||||
void set_parent(SN74HC595Component *parent) { parent_ = parent; }
|
||||
void set_pin(uint8_t pin) { pin_ = pin; }
|
||||
void set_pin(uint16_t pin) { pin_ = pin; }
|
||||
void set_inverted(bool inverted) { inverted_ = inverted; }
|
||||
|
||||
protected:
|
||||
SN74HC595Component *parent_;
|
||||
uint8_t pin_;
|
||||
uint16_t pin_;
|
||||
bool inverted_;
|
||||
};
|
||||
|
||||
|
@@ -8,6 +8,7 @@ from esphome.const import (
|
||||
CONF_NAME,
|
||||
CONF_REPEAT,
|
||||
CONF_RUN_DURATION,
|
||||
ENTITY_CATEGORY_CONFIG,
|
||||
)
|
||||
|
||||
AUTO_LOAD = ["switch"]
|
||||
@@ -223,7 +224,9 @@ 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),
|
||||
switch.switch_schema(
|
||||
SprinklerControllerSwitch, entity_category=ENTITY_CATEGORY_CONFIG
|
||||
),
|
||||
key=CONF_NAME,
|
||||
),
|
||||
cv.Optional(CONF_PUMP_OFF_SWITCH_ID): cv.use_id(switch.Switch),
|
||||
@@ -244,7 +247,9 @@ 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),
|
||||
switch.switch_schema(
|
||||
SprinklerControllerSwitch, entity_category=ENTITY_CATEGORY_CONFIG
|
||||
),
|
||||
key=CONF_NAME,
|
||||
),
|
||||
cv.Optional(CONF_MAIN_SWITCH): cv.maybe_simple_value(
|
||||
@@ -252,11 +257,15 @@ SPRINKLER_CONTROLLER_SCHEMA = cv.Schema(
|
||||
key=CONF_NAME,
|
||||
),
|
||||
cv.Optional(CONF_QUEUE_ENABLE_SWITCH): cv.maybe_simple_value(
|
||||
switch.switch_schema(SprinklerControllerSwitch),
|
||||
switch.switch_schema(
|
||||
SprinklerControllerSwitch, entity_category=ENTITY_CATEGORY_CONFIG
|
||||
),
|
||||
key=CONF_NAME,
|
||||
),
|
||||
cv.Optional(CONF_REVERSE_SWITCH): cv.maybe_simple_value(
|
||||
switch.switch_schema(SprinklerControllerSwitch),
|
||||
switch.switch_schema(
|
||||
SprinklerControllerSwitch, entity_category=ENTITY_CATEGORY_CONFIG
|
||||
),
|
||||
key=CONF_NAME,
|
||||
),
|
||||
cv.Optional(CONF_MANUAL_SELECTION_DELAY): cv.positive_time_period_seconds,
|
||||
|
@@ -25,6 +25,7 @@ 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)
|
||||
|
||||
@@ -110,6 +111,7 @@ 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),
|
||||
@@ -186,3 +188,6 @@ 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 "esphome/core/log.h"
|
||||
#include "tuya_climate.h"
|
||||
#include "esphome/core/log.h"
|
||||
|
||||
namespace esphome {
|
||||
namespace tuya {
|
||||
@@ -44,6 +44,10 @@ 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_();
|
||||
@@ -53,6 +57,10 @@ 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();
|
||||
@@ -105,7 +113,10 @@ void TuyaClimate::control(const climate::ClimateCall &call) {
|
||||
}
|
||||
|
||||
if (call.get_target_temperature().has_value()) {
|
||||
const float target_temperature = *call.get_target_temperature();
|
||||
float target_temperature = *call.get_target_temperature();
|
||||
if (this->reports_fahrenheit_)
|
||||
target_temperature = (target_temperature * 9 / 5) + 32;
|
||||
|
||||
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,6 +35,8 @@ 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:
|
||||
@@ -77,6 +79,7 @@ class TuyaClimate : public climate::Climate, public Component {
|
||||
bool cooling_state_{false};
|
||||
float manual_temperature_;
|
||||
bool eco_;
|
||||
bool reports_fahrenheit_{false};
|
||||
};
|
||||
|
||||
} // namespace tuya
|
||||
|
@@ -88,13 +88,17 @@ MODELS = {
|
||||
}
|
||||
|
||||
|
||||
def validate_full_update_every_only_type_a(value):
|
||||
def validate_full_update_every_only_types_ac(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 "
|
||||
"'1.54in', '1.54inV2', '2.13in', '2.90in', and '2.90inV2'."
|
||||
+ ", ".join(full_models)
|
||||
)
|
||||
return value
|
||||
|
||||
@@ -116,7 +120,7 @@ CONFIG_SCHEMA = cv.All(
|
||||
)
|
||||
.extend(cv.polling_component_schema("1s"))
|
||||
.extend(spi.spi_device_schema()),
|
||||
validate_full_update_every_only_type_a,
|
||||
validate_full_update_every_only_types_ac,
|
||||
cv.has_at_most_one_key(CONF_PAGES, CONF_LAMBDA),
|
||||
)
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
"""Constants used by esphome."""
|
||||
|
||||
__version__ = "2022.12.0-dev"
|
||||
__version__ = "2022.12.0b2"
|
||||
|
||||
ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
|
||||
|
||||
@@ -992,6 +992,7 @@ 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,6 +416,10 @@ 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()
|
||||
@@ -689,6 +693,24 @@ 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
|
||||
@@ -1059,6 +1081,7 @@ 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,14 +1,15 @@
|
||||
from pathlib import Path
|
||||
import subprocess
|
||||
import hashlib
|
||||
import logging
|
||||
from typing import Callable, Optional
|
||||
import re
|
||||
import subprocess
|
||||
import urllib.parse
|
||||
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
from typing import Callable, Optional
|
||||
|
||||
from esphome.core import CORE, TimePeriodSeconds
|
||||
import esphome.config_validation as cv
|
||||
from esphome.core import CORE, TimePeriodSeconds
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
@@ -103,3 +104,57 @@ 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==20221109.0
|
||||
aioesphomeapi==12.2.1
|
||||
esphome-dashboard==20221207.0
|
||||
aioesphomeapi==13.0.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.2.2 # also change in .pre-commit-config.yaml when updating
|
||||
pyupgrade==3.3.0 # 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.1
|
||||
pytest-asyncio==0.20.2
|
||||
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.BOARD_TO_VARIANT.keys()),
|
||||
list(esp32_boards.BOARDS.keys()),
|
||||
)
|
||||
|
||||
|
||||
|
@@ -381,6 +381,7 @@ climate:
|
||||
target_temperature_datapoint: 3
|
||||
current_temperature_multiplier: 0.5
|
||||
target_temperature_multiplier: 0.5
|
||||
reports_fahrenheit: true
|
||||
|
||||
switch:
|
||||
- platform: tuya
|
||||
|
@@ -162,6 +162,11 @@ binary_sensor:
|
||||
then:
|
||||
- output.turn_off: Led7
|
||||
|
||||
- platform: gpio
|
||||
id: sn74hc165_pin_0
|
||||
pin:
|
||||
sn74hc165: sn74hc165_hub
|
||||
number: 0
|
||||
|
||||
|
||||
|
||||
@@ -542,3 +547,11 @@ 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