mirror of
https://github.com/esphome/esphome.git
synced 2024-12-22 05:24:53 +01:00
commit
2a20a5fc11
3 changed files with 63 additions and 25 deletions
|
@ -386,10 +386,21 @@ FRAMEWORK_SCHEMA = cv.typed_schema(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
FLASH_SIZES = [
|
||||||
|
"4MB",
|
||||||
|
"8MB",
|
||||||
|
"16MB",
|
||||||
|
"32MB",
|
||||||
|
]
|
||||||
|
|
||||||
|
CONF_FLASH_SIZE = "flash_size"
|
||||||
CONFIG_SCHEMA = cv.All(
|
CONFIG_SCHEMA = cv.All(
|
||||||
cv.Schema(
|
cv.Schema(
|
||||||
{
|
{
|
||||||
cv.Required(CONF_BOARD): cv.string_strict,
|
cv.Required(CONF_BOARD): cv.string_strict,
|
||||||
|
cv.Optional(CONF_FLASH_SIZE, default="4MB"): cv.one_of(
|
||||||
|
*FLASH_SIZES, upper=True
|
||||||
|
),
|
||||||
cv.Optional(CONF_VARIANT): cv.one_of(*VARIANTS, upper=True),
|
cv.Optional(CONF_VARIANT): cv.one_of(*VARIANTS, upper=True),
|
||||||
cv.Optional(CONF_FRAMEWORK, default={}): FRAMEWORK_SCHEMA,
|
cv.Optional(CONF_FRAMEWORK, default={}): FRAMEWORK_SCHEMA,
|
||||||
}
|
}
|
||||||
|
@ -401,6 +412,7 @@ CONFIG_SCHEMA = cv.All(
|
||||||
|
|
||||||
async def to_code(config):
|
async def to_code(config):
|
||||||
cg.add_platformio_option("board", config[CONF_BOARD])
|
cg.add_platformio_option("board", config[CONF_BOARD])
|
||||||
|
cg.add_platformio_option("board_upload.flash_size", config[CONF_FLASH_SIZE])
|
||||||
cg.add_build_flag("-DUSE_ESP32")
|
cg.add_build_flag("-DUSE_ESP32")
|
||||||
cg.add_define("ESPHOME_BOARD", config[CONF_BOARD])
|
cg.add_define("ESPHOME_BOARD", config[CONF_BOARD])
|
||||||
cg.add_build_flag(f"-DUSE_ESP32_VARIANT_{config[CONF_VARIANT]}")
|
cg.add_build_flag(f"-DUSE_ESP32_VARIANT_{config[CONF_VARIANT]}")
|
||||||
|
@ -505,24 +517,46 @@ async def to_code(config):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
ARDUINO_PARTITIONS_CSV = """\
|
APP_PARTITION_SIZES = {
|
||||||
nvs, data, nvs, 0x009000, 0x005000,
|
"4MB": 0x1C0000, # 1792 KB
|
||||||
otadata, data, ota, 0x00e000, 0x002000,
|
"8MB": 0x3C0000, # 3840 KB
|
||||||
app0, app, ota_0, 0x010000, 0x1C0000,
|
"16MB": 0x7C0000, # 7936 KB
|
||||||
app1, app, ota_1, 0x1D0000, 0x1C0000,
|
"32MB": 0xFC0000, # 16128 KB
|
||||||
eeprom, data, 0x99, 0x390000, 0x001000,
|
}
|
||||||
spiffs, data, spiffs, 0x391000, 0x00F000
|
|
||||||
|
|
||||||
|
def get_arduino_partition_csv(flash_size):
|
||||||
|
app_partition_size = APP_PARTITION_SIZES[flash_size]
|
||||||
|
eeprom_partition_size = 0x1000 # 4 KB
|
||||||
|
spiffs_partition_size = 0xF000 # 60 KB
|
||||||
|
|
||||||
|
app0_partition_start = 0x010000 # 64 KB
|
||||||
|
app1_partition_start = app0_partition_start + app_partition_size
|
||||||
|
eeprom_partition_start = app1_partition_start + app_partition_size
|
||||||
|
spiffs_partition_start = eeprom_partition_start + eeprom_partition_size
|
||||||
|
|
||||||
|
partition_csv = f"""\
|
||||||
|
nvs, data, nvs, 0x9000, 0x5000,
|
||||||
|
otadata, data, ota, 0xE000, 0x2000,
|
||||||
|
app0, app, ota_0, 0x{app0_partition_start:X}, 0x{app_partition_size:X},
|
||||||
|
app1, app, ota_1, 0x{app1_partition_start:X}, 0x{app_partition_size:X},
|
||||||
|
eeprom, data, 0x99, 0x{eeprom_partition_start:X}, 0x{eeprom_partition_size:X},
|
||||||
|
spiffs, data, spiffs, 0x{spiffs_partition_start:X}, 0x{spiffs_partition_size:X}
|
||||||
"""
|
"""
|
||||||
|
return partition_csv
|
||||||
|
|
||||||
|
|
||||||
IDF_PARTITIONS_CSV = """\
|
def get_idf_partition_csv(flash_size):
|
||||||
# Name, Type, SubType, Offset, Size, Flags
|
app_partition_size = APP_PARTITION_SIZES[flash_size]
|
||||||
|
|
||||||
|
partition_csv = f"""\
|
||||||
otadata, data, ota, , 0x2000,
|
otadata, data, ota, , 0x2000,
|
||||||
phy_init, data, phy, , 0x1000,
|
phy_init, data, phy, , 0x1000,
|
||||||
app0, app, ota_0, , 0x1C0000,
|
app0, app, ota_0, , 0x{app_partition_size:X},
|
||||||
app1, app, ota_1, , 0x1C0000,
|
app1, app, ota_1, , 0x{app_partition_size:X},
|
||||||
nvs, data, nvs, , 0x6d000,
|
nvs, data, nvs, , 0x6D000,
|
||||||
"""
|
"""
|
||||||
|
return partition_csv
|
||||||
|
|
||||||
|
|
||||||
def _format_sdkconfig_val(value: SdkconfigValueType) -> str:
|
def _format_sdkconfig_val(value: SdkconfigValueType) -> str:
|
||||||
|
@ -565,13 +599,17 @@ def copy_files():
|
||||||
if CORE.using_arduino:
|
if CORE.using_arduino:
|
||||||
write_file_if_changed(
|
write_file_if_changed(
|
||||||
CORE.relative_build_path("partitions.csv"),
|
CORE.relative_build_path("partitions.csv"),
|
||||||
ARDUINO_PARTITIONS_CSV,
|
get_arduino_partition_csv(
|
||||||
|
CORE.platformio_options.get("board_upload.flash_size")
|
||||||
|
),
|
||||||
)
|
)
|
||||||
if CORE.using_esp_idf:
|
if CORE.using_esp_idf:
|
||||||
_write_sdkconfig()
|
_write_sdkconfig()
|
||||||
write_file_if_changed(
|
write_file_if_changed(
|
||||||
CORE.relative_build_path("partitions.csv"),
|
CORE.relative_build_path("partitions.csv"),
|
||||||
IDF_PARTITIONS_CSV,
|
get_idf_partition_csv(
|
||||||
|
CORE.platformio_options.get("board_upload.flash_size")
|
||||||
|
),
|
||||||
)
|
)
|
||||||
# IDF build scripts look for version string to put in the build.
|
# IDF build scripts look for version string to put in the build.
|
||||||
# However, if the build path does not have an initialized git repo,
|
# However, if the build path does not have an initialized git repo,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
"""Constants used by esphome."""
|
"""Constants used by esphome."""
|
||||||
|
|
||||||
__version__ = "2023.11.0b5"
|
__version__ = "2023.11.0b6"
|
||||||
|
|
||||||
ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
|
ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
|
||||||
VALID_SUBSTITUTIONS_CHARACTERS = (
|
VALID_SUBSTITUTIONS_CHARACTERS = (
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import asyncio
|
||||||
import base64
|
import base64
|
||||||
import binascii
|
import binascii
|
||||||
import codecs
|
|
||||||
import collections
|
import collections
|
||||||
import datetime
|
import datetime
|
||||||
import functools
|
import functools
|
||||||
|
@ -339,8 +339,8 @@ class EsphomeCommandWebSocket(tornado.websocket.WebSocketHandler):
|
||||||
def handle_stdin(self, json_message):
|
def handle_stdin(self, json_message):
|
||||||
if not self.is_process_active:
|
if not self.is_process_active:
|
||||||
return
|
return
|
||||||
data = json_message["data"]
|
text: str = json_message["data"]
|
||||||
data = codecs.encode(data, "utf8", "replace")
|
data = text.encode("utf-8", "replace")
|
||||||
_LOGGER.debug("< stdin: %s", data)
|
_LOGGER.debug("< stdin: %s", data)
|
||||||
self._proc.stdin.write(data)
|
self._proc.stdin.write(data)
|
||||||
|
|
||||||
|
@ -351,18 +351,18 @@ class EsphomeCommandWebSocket(tornado.websocket.WebSocketHandler):
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
if self._use_popen:
|
if self._use_popen:
|
||||||
data = yield self._queue.get()
|
data: bytes = yield self._queue.get()
|
||||||
if data is None:
|
if data is None:
|
||||||
self._proc_on_exit(self._proc.poll())
|
self._proc_on_exit(self._proc.poll())
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
data = yield self._proc.stdout.read_until_regex(reg)
|
data: bytes = yield self._proc.stdout.read_until_regex(reg)
|
||||||
except tornado.iostream.StreamClosedError:
|
except tornado.iostream.StreamClosedError:
|
||||||
break
|
break
|
||||||
data = codecs.decode(data, "utf8", "replace")
|
|
||||||
|
|
||||||
_LOGGER.debug("> stdout: %s", data)
|
text = data.decode("utf-8", "replace")
|
||||||
self.write_message({"event": "line", "data": data})
|
_LOGGER.debug("> stdout: %s", text)
|
||||||
|
self.write_message({"event": "line", "data": text})
|
||||||
|
|
||||||
def _stdout_thread(self):
|
def _stdout_thread(self):
|
||||||
if not self._use_popen:
|
if not self._use_popen:
|
||||||
|
@ -509,8 +509,8 @@ class EsphomeUpdateAllHandler(EsphomeCommandWebSocket):
|
||||||
|
|
||||||
class SerialPortRequestHandler(BaseHandler):
|
class SerialPortRequestHandler(BaseHandler):
|
||||||
@authenticated
|
@authenticated
|
||||||
def get(self):
|
async def get(self):
|
||||||
ports = get_serial_ports()
|
ports = await asyncio.get_running_loop().run_in_executor(None, get_serial_ports)
|
||||||
data = []
|
data = []
|
||||||
for port in ports:
|
for port in ports:
|
||||||
desc = port.description
|
desc = port.description
|
||||||
|
|
Loading…
Reference in a new issue