mirror of
https://github.com/Laxilef/OTGateway.git
synced 2026-11-06 23:48:45 +05:00
Compare commits
12
Commits
5544f43162
...
e751c3aba0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e751c3aba0 | ||
|
|
30b55f1946 | ||
|
|
9217bb7448 | ||
|
|
d694ae18c0 | ||
|
|
0f4fa2e406 | ||
|
|
df2af928a5 | ||
|
|
3e6a2d93d4 | ||
|
|
062468c6b1 | ||
|
|
530892dc09 | ||
|
|
c73f74ad45 | ||
|
|
a67ff046b0 | ||
|
|
0f496fee42 |
No files matched your search
@@ -15,7 +15,7 @@ jobs:
|
||||
name: run PlatformIO Dependabot
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
- name: run PlatformIO Dependabot
|
||||
uses: peterus/platformio_dependabot@v1.2.0
|
||||
with:
|
||||
|
||||
@@ -7,7 +7,7 @@ jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/stale@v9
|
||||
- uses: actions/stale@v10
|
||||
with:
|
||||
stale-issue-message: >
|
||||
This issue is stale because it has been open 15 days with no activity. Remove stale label or comment or this will be closed in 5 days.
|
||||
|
||||
+39
-3
@@ -14,7 +14,7 @@ extra_configs = secrets.default.ini
|
||||
core_dir = .pio
|
||||
|
||||
[env]
|
||||
version = 1.5.5
|
||||
version = 1.5.6
|
||||
framework = arduino
|
||||
lib_deps =
|
||||
bblanchon/ArduinoJson@^7.3.0
|
||||
@@ -60,10 +60,16 @@ monitor_filters =
|
||||
esp8266_exception_decoder
|
||||
board_build.flash_mode = dio
|
||||
board_build.filesystem = littlefs
|
||||
check_tool = ; pvs-studio
|
||||
check_flags =
|
||||
; pvs-studio:
|
||||
; --analysis-mode=4
|
||||
; --exclude-path=./.pio/libdeps
|
||||
|
||||
; Defaults
|
||||
[esp8266_defaults]
|
||||
platform = espressif8266@^4.2.1
|
||||
platform_packages = ${env.platform_packages}
|
||||
lib_deps =
|
||||
${env.lib_deps}
|
||||
nrwiersma/ESP8266Scheduler@^1.2
|
||||
@@ -77,6 +83,8 @@ build_flags =
|
||||
;-D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH
|
||||
-D PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK305
|
||||
board_build.ldscript = eagle.flash.4m1m.ld
|
||||
check_tool = ${env.check_tool}
|
||||
check_flags = ${env.check_flags}
|
||||
|
||||
[esp32_defaults]
|
||||
;platform = espressif32@^6.7
|
||||
@@ -84,8 +92,8 @@ board_build.ldscript = eagle.flash.4m1m.ld
|
||||
;platform_packages =
|
||||
; framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.5
|
||||
; framework-arduinoespressif32-libs @ https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.1/esp32-arduino-libs-idf-release_v5.1-33fbade6.zip
|
||||
platform = https://github.com/pioarduino/platform-espressif32/releases/download/54.03.20/platform-espressif32.zip
|
||||
platform_packages =
|
||||
platform = https://github.com/pioarduino/platform-espressif32/releases/download/55.03.30-2/platform-espressif32.zip
|
||||
platform_packages = ${env.platform_packages}
|
||||
board_build.partitions = esp32_partitions.csv
|
||||
lib_deps =
|
||||
${env.lib_deps}
|
||||
@@ -100,11 +108,14 @@ build_flags =
|
||||
${env.build_flags}
|
||||
-D CORE_DEBUG_LEVEL=0
|
||||
-Wl,--wrap=esp_panic_handler
|
||||
check_tool = ${env.check_tool}
|
||||
check_flags = ${env.check_flags}
|
||||
|
||||
|
||||
; Boards
|
||||
[env:d1_mini]
|
||||
platform = ${esp8266_defaults.platform}
|
||||
platform_packages = ${esp8266_defaults.platform_packages}
|
||||
board = d1_mini
|
||||
lib_deps = ${esp8266_defaults.lib_deps}
|
||||
lib_ignore = ${esp8266_defaults.lib_ignore}
|
||||
@@ -119,9 +130,12 @@ build_flags =
|
||||
-D DEFAULT_SENSOR_INDOOR_GPIO=14
|
||||
-D DEFAULT_STATUS_LED_GPIO=13
|
||||
-D DEFAULT_OT_RX_LED_GPIO=15
|
||||
check_tool = ${esp8266_defaults.check_tool}
|
||||
check_flags = ${esp8266_defaults.check_flags}
|
||||
|
||||
[env:d1_mini_lite]
|
||||
platform = ${esp8266_defaults.platform}
|
||||
platform_packages = ${esp8266_defaults.platform_packages}
|
||||
board = d1_mini_lite
|
||||
lib_deps = ${esp8266_defaults.lib_deps}
|
||||
lib_ignore = ${esp8266_defaults.lib_ignore}
|
||||
@@ -136,9 +150,12 @@ build_flags =
|
||||
-D DEFAULT_SENSOR_INDOOR_GPIO=14
|
||||
-D DEFAULT_STATUS_LED_GPIO=13
|
||||
-D DEFAULT_OT_RX_LED_GPIO=15
|
||||
check_tool = ${esp8266_defaults.check_tool}
|
||||
check_flags = ${esp8266_defaults.check_flags}
|
||||
|
||||
[env:d1_mini_pro]
|
||||
platform = ${esp8266_defaults.platform}
|
||||
platform_packages = ${esp8266_defaults.platform_packages}
|
||||
board = d1_mini_pro
|
||||
lib_deps = ${esp8266_defaults.lib_deps}
|
||||
lib_ignore = ${esp8266_defaults.lib_ignore}
|
||||
@@ -153,9 +170,12 @@ build_flags =
|
||||
-D DEFAULT_SENSOR_INDOOR_GPIO=14
|
||||
-D DEFAULT_STATUS_LED_GPIO=13
|
||||
-D DEFAULT_OT_RX_LED_GPIO=15
|
||||
check_tool = ${esp8266_defaults.check_tool}
|
||||
check_flags = ${esp8266_defaults.check_flags}
|
||||
|
||||
[env:nodemcu_8266]
|
||||
platform = ${esp8266_defaults.platform}
|
||||
platform_packages = ${esp8266_defaults.platform_packages}
|
||||
board = nodemcuv2
|
||||
lib_deps = ${esp8266_defaults.lib_deps}
|
||||
lib_ignore = ${esp8266_defaults.lib_ignore}
|
||||
@@ -170,6 +190,8 @@ build_flags =
|
||||
-D DEFAULT_SENSOR_INDOOR_GPIO=4
|
||||
-D DEFAULT_STATUS_LED_GPIO=2
|
||||
-D DEFAULT_OT_RX_LED_GPIO=16
|
||||
check_tool = ${esp8266_defaults.check_tool}
|
||||
check_flags = ${esp8266_defaults.check_flags}
|
||||
|
||||
[env:s2_mini]
|
||||
platform = ${esp32_defaults.platform}
|
||||
@@ -192,6 +214,8 @@ build_flags =
|
||||
-D DEFAULT_SENSOR_INDOOR_GPIO=7
|
||||
-D DEFAULT_STATUS_LED_GPIO=11
|
||||
-D DEFAULT_OT_RX_LED_GPIO=12
|
||||
check_tool = ${esp32_defaults.check_tool}
|
||||
check_flags = ${esp32_defaults.check_flags}
|
||||
|
||||
[env:s3_mini]
|
||||
platform = ${esp32_defaults.platform}
|
||||
@@ -218,6 +242,8 @@ build_flags =
|
||||
-D DEFAULT_SENSOR_INDOOR_GPIO=12
|
||||
-D DEFAULT_STATUS_LED_GPIO=11
|
||||
-D DEFAULT_OT_RX_LED_GPIO=10
|
||||
check_tool = ${esp32_defaults.check_tool}
|
||||
check_flags = ${esp32_defaults.check_flags}
|
||||
|
||||
[env:c3_mini]
|
||||
platform = ${esp32_defaults.platform}
|
||||
@@ -242,6 +268,8 @@ build_flags =
|
||||
-D DEFAULT_SENSOR_INDOOR_GPIO=1
|
||||
-D DEFAULT_STATUS_LED_GPIO=4
|
||||
-D DEFAULT_OT_RX_LED_GPIO=5
|
||||
check_tool = ${esp32_defaults.check_tool}
|
||||
check_flags = ${esp32_defaults.check_flags}
|
||||
|
||||
[env:nodemcu_32]
|
||||
platform = ${esp32_defaults.platform}
|
||||
@@ -263,6 +291,8 @@ build_flags =
|
||||
-D DEFAULT_SENSOR_INDOOR_GPIO=26
|
||||
-D DEFAULT_STATUS_LED_GPIO=2
|
||||
-D DEFAULT_OT_RX_LED_GPIO=19
|
||||
check_tool = ${esp32_defaults.check_tool}
|
||||
check_flags = ${esp32_defaults.check_flags}
|
||||
|
||||
[env:d1_mini32]
|
||||
platform = ${esp32_defaults.platform}
|
||||
@@ -284,6 +314,8 @@ build_flags =
|
||||
-D DEFAULT_SENSOR_INDOOR_GPIO=18
|
||||
-D DEFAULT_STATUS_LED_GPIO=2
|
||||
-D DEFAULT_OT_RX_LED_GPIO=19
|
||||
check_tool = ${esp32_defaults.check_tool}
|
||||
check_flags = ${esp32_defaults.check_flags}
|
||||
|
||||
[env:esp32_c6]
|
||||
platform = ${esp32_defaults.platform}
|
||||
@@ -312,6 +344,8 @@ build_flags =
|
||||
-D DEFAULT_SENSOR_INDOOR_GPIO=0
|
||||
-D DEFAULT_STATUS_LED_GPIO=11
|
||||
-D DEFAULT_OT_RX_LED_GPIO=10
|
||||
check_tool = ${esp32_defaults.check_tool}
|
||||
check_flags = ${esp32_defaults.check_flags}
|
||||
|
||||
[env:otthing]
|
||||
platform = ${esp32_defaults.platform}
|
||||
@@ -337,3 +371,5 @@ build_flags =
|
||||
-D DEFAULT_STATUS_LED_GPIO=8
|
||||
-D DEFAULT_OT_RX_LED_GPIO=2
|
||||
-D OT_BYPASS_RELAY_GPIO=20
|
||||
check_tool = ${esp32_defaults.check_tool}
|
||||
check_flags = ${esp32_defaults.check_flags}
|
||||
@@ -0,0 +1,507 @@
|
||||
{
|
||||
"values": {
|
||||
"logo": "OpenTherm Gateway",
|
||||
"nav": {
|
||||
"license": "授权许可",
|
||||
"source": "源代码",
|
||||
"help": "帮助",
|
||||
"issues": "问题与反馈",
|
||||
"releases": "发行版"
|
||||
},
|
||||
"dbm": "dBm",
|
||||
"kw": "kW",
|
||||
"time": {
|
||||
"days": "天",
|
||||
"hours": "小时",
|
||||
"min": "分",
|
||||
"sec": "秒"
|
||||
},
|
||||
|
||||
"button": {
|
||||
"upgrade": "固件升级",
|
||||
"restart": "重启",
|
||||
"save": "保存",
|
||||
"saved": "已保存",
|
||||
"refresh": "刷新",
|
||||
"restore": "恢复",
|
||||
"restored": "已恢复",
|
||||
"backup": "备份",
|
||||
"wait": "请等待...",
|
||||
"uploading": "上传中...",
|
||||
"success": "成功",
|
||||
"error": "错误"
|
||||
},
|
||||
|
||||
"index": {
|
||||
"title": "OpenTherm Gateway",
|
||||
|
||||
"section": {
|
||||
"network": "网络",
|
||||
"system": "系统"
|
||||
},
|
||||
|
||||
"system": {
|
||||
"build": {
|
||||
"title": "Build",
|
||||
"version": "固件版本",
|
||||
"date": "日期",
|
||||
"core": "内核版本",
|
||||
"sdk": "SDK"
|
||||
},
|
||||
"uptime": "运行时间",
|
||||
"memory": {
|
||||
"title": "可用内存",
|
||||
"maxFreeBlock": "max free block",
|
||||
"min": "min"
|
||||
},
|
||||
"board": "开发板",
|
||||
"chip": {
|
||||
"model": "芯片",
|
||||
"cores": "核心数",
|
||||
"freq": "频率"
|
||||
},
|
||||
"flash": {
|
||||
"size": "闪存容量",
|
||||
"realSize": "实际容量"
|
||||
},
|
||||
"lastResetReason": "上次重置原因"
|
||||
}
|
||||
},
|
||||
|
||||
"dashboard": {
|
||||
"name": "仪表盘",
|
||||
"title": "仪表盘 - OpenTherm Gateway",
|
||||
|
||||
"section": {
|
||||
"control": "调节",
|
||||
"states": "状态",
|
||||
"sensors": "传感器",
|
||||
"diag": "OpenTherm 诊断"
|
||||
},
|
||||
|
||||
"thermostat": {
|
||||
"heating": "供暖",
|
||||
"dhw": "生活热水",
|
||||
"temp.current": "当前温度",
|
||||
"enable": "启用",
|
||||
"turbo": "Turbo 模式"
|
||||
},
|
||||
|
||||
"notify": {
|
||||
"fault": {
|
||||
"title": "锅炉报警状态已激活!",
|
||||
"note": "建议检查锅炉并查看说明书对应的报警代码:"
|
||||
},
|
||||
"diag": {
|
||||
"title": "锅炉诊断状态已激活!",
|
||||
"note": "锅炉可能需要检查,建议查看说明书对应的诊断代码:"
|
||||
},
|
||||
"reset": "点击复位"
|
||||
},
|
||||
|
||||
"states": {
|
||||
"mNetworkConnected": "网络连接状态",
|
||||
"mMqttConnected": "MQTT服务器连接状态",
|
||||
"mEmergencyState": "应急模式",
|
||||
"mExtPumpState": "外置循环泵",
|
||||
"mCascadeControlInput": "Cascade 控制 (input)",
|
||||
"mCascadeControlOutput": "Cascade 控制 (output)",
|
||||
|
||||
"sConnected": "OpenTherm 通讯状态",
|
||||
"sFlame": "火焰",
|
||||
"sCooling": "制冷",
|
||||
"sFaultActive": "报警状态",
|
||||
"sFaultCode": "报警代码",
|
||||
"sDiagActive": "诊断状态",
|
||||
"sDiagCode": "诊断代码",
|
||||
|
||||
"mHeatEnabled": "供暖功能已启用",
|
||||
"mHeatBlocking": "供暖",
|
||||
"mHeatOverheat": "供暖超热保护",
|
||||
"sHeatActive": "供暖激活状态",
|
||||
"mHeatSetpointTemp": "供暖供水设定温度",
|
||||
"mHeatTargetTemp": "供暖供水目标温度",
|
||||
"mHeatCurrTemp": "供暖当前供水温度",
|
||||
"mHeatRetTemp": "供暖回水温度",
|
||||
"mHeatIndoorTemp": "供暖,室内温度",
|
||||
"mHeatOutdoorTemp": "供暖,室外温度",
|
||||
|
||||
"mDhwEnabled": "生活热水功能已启用",
|
||||
"mDhwOverheat": "生活热水超热保护",
|
||||
"sDhwActive": "生活热水激活",
|
||||
"mDhwTargetTemp": "生活热水目标温度",
|
||||
"mDhwCurrTemp": "生活热水当前出水温度",
|
||||
"mDhwRetTemp": "生活热水回水温度"
|
||||
},
|
||||
|
||||
"sensors": {
|
||||
"values": {
|
||||
"temp": "温度",
|
||||
"humidity": "湿度",
|
||||
"battery": "电量",
|
||||
"rssi": "RSSI"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"network": {
|
||||
"title": "网络 - OpenTherm Gateway",
|
||||
"name": "网络设置",
|
||||
|
||||
"section": {
|
||||
"static": "静态设置",
|
||||
"availableNetworks": "可用网络",
|
||||
"staSettings": "WiFi 设置",
|
||||
"apSettings": "AP 设置"
|
||||
},
|
||||
|
||||
"scan": {
|
||||
"pos": "#",
|
||||
"info": "Info"
|
||||
},
|
||||
|
||||
"wifi": {
|
||||
"ssid": "SSID",
|
||||
"password": "密码",
|
||||
"channel": "频道",
|
||||
"signal": "信号强度",
|
||||
"connected": "已连接"
|
||||
},
|
||||
|
||||
"params": {
|
||||
"hostname": "Hostname",
|
||||
"dhcp": "自动 (DHCP)",
|
||||
"mac": "物理地址 (MAC)",
|
||||
"ip": "IP",
|
||||
"subnet": "子网掩码",
|
||||
"gateway": "网关",
|
||||
"dns": "DNS 服务器"
|
||||
},
|
||||
|
||||
"sta": {
|
||||
"channel.note": "自动选择设置为0"
|
||||
}
|
||||
},
|
||||
|
||||
"sensors": {
|
||||
"title": "传感器设置 - OpenTherm Gateway",
|
||||
"name": "传感器设置",
|
||||
|
||||
"enabled": "启用",
|
||||
"sensorName": {
|
||||
"title": "传感器名称",
|
||||
"note": "只能包含:a-z、A-Z、0-9、下划线和空格"
|
||||
},
|
||||
"purpose": "用途",
|
||||
"purposes": {
|
||||
"outdoorTemp": "室外温度",
|
||||
"indoorTemp": "室内温度",
|
||||
"heatTemp": "供暖,温度",
|
||||
"heatRetTemp": "供暖回水温度",
|
||||
"dhwTemp": "生活热水温度",
|
||||
"dhwRetTemp": "生活热水回水温度",
|
||||
"dhwFlowRate": "生活热水水流量",
|
||||
"exhaustTemp": "烟气温度",
|
||||
"modLevel": "Modulation level (%)",
|
||||
"number": "Number (raw)",
|
||||
"powerFactor": "功率 (%)",
|
||||
"power": "功率(kW)",
|
||||
"fanSpeed": "风机转速",
|
||||
"co2": "CO2",
|
||||
"pressure": "压力",
|
||||
"humidity": "湿度",
|
||||
"temperature": "温度",
|
||||
"notConfigured": "未配置"
|
||||
},
|
||||
"type": "类型/来源",
|
||||
"types": {
|
||||
"otOutdoorTemp": "OpenTherm, outdoor temp",
|
||||
"otHeatTemp": "OpenTherm, heating, temp",
|
||||
"otHeatRetTemp": "OpenTherm, heating, return temp",
|
||||
"otDhwTemp": "OpenTherm, DHW, temperature",
|
||||
"otDhwTemp2": "OpenTherm, DHW, temperature 2",
|
||||
"otDhwFlowRate": "OpenTherm, DHW, flow rate",
|
||||
"otCh2Temp": "OpenTherm, channel 2, temp",
|
||||
"otExhaustTemp": "OpenTherm, exhaust temp",
|
||||
"otHeatExchangerTemp": "OpenTherm, heat exchanger temp",
|
||||
"otPressure": "OpenTherm, pressure",
|
||||
"otModLevel": "OpenTherm, modulation level",
|
||||
"otCurrentPower": "OpenTherm, current power",
|
||||
"otExhaustCo2": "OpenTherm, exhaust CO2",
|
||||
"otExhaustFanSpeed": "OpenTherm, exhaust fan speed",
|
||||
"otSupplyFanSpeed": "OpenTherm, supply fan speed",
|
||||
"otSolarStorageTemp": "OpenTherm, solar storage temp",
|
||||
"otSolarCollectorTemp": "OpenTherm, solar collector temp",
|
||||
"otFanSpeedSetpoint": "OpenTherm, setpoint fan speed",
|
||||
"otFanSpeedCurrent": "OpenTherm, current fan speed",
|
||||
"otBurnerStarts": "OpenTherm, number of burner starts",
|
||||
"otDhwBurnerStarts": "OpenTherm, number of burner starts (DHW)",
|
||||
"otHeatingPumpStarts": "OpenTherm, number of pump starts (heating)",
|
||||
"otDhwPumpStarts": "OpenTherm, number of pump starts (DHW)",
|
||||
"otBurnerHours": "OpenTherm, number of burner operating hours",
|
||||
"otDhwBurnerHours": "OpenTherm, number of burner operating hours (DHW)",
|
||||
"otHeatingPumpHours": "OpenTherm, number of pump operating hours (heating)",
|
||||
"otDhwPumpHours": "OpenTherm, number of pump operating hours (DHW)",
|
||||
|
||||
"ntcTemp": "NTC 传感器",
|
||||
"dallasTemp": "DALLAS 传感器",
|
||||
"bluetooth": "BLE 传感器",
|
||||
"heatSetpointTemp": "Heating, setpoint temp",
|
||||
"manual": "通过 MQTT/API 手动配置",
|
||||
"notConfigured": "未配置"
|
||||
},
|
||||
"gpio": "GPIO",
|
||||
"address": {
|
||||
"title": "传感器地址",
|
||||
"note": "如需自动检测DALLAS传感器,请保持默认设置;如需连接BLE设备,则需提供MAC地址"
|
||||
},
|
||||
"correction": {
|
||||
"desc": "数值校正",
|
||||
"offset": "补偿值(偏移量)",
|
||||
"factor": "Multiplier"
|
||||
},
|
||||
"filtering": {
|
||||
"desc": "数值滤波",
|
||||
"enabled": {
|
||||
"title": "启用滤波",
|
||||
"note": "如果图表中有大量尖锐的噪声,此功能会很有用。使用的滤波器是 \"滑动平均滤波器\"."
|
||||
},
|
||||
"factor": {
|
||||
"title": "滤波系数",
|
||||
"note": "数值越低,数值变化越平滑且响应越滞后"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"settings": {
|
||||
"title": "设置 - OpenTherm Gateway",
|
||||
"name": "设置",
|
||||
|
||||
"section": {
|
||||
"portal": "Portal 设置",
|
||||
"system": "系统设置",
|
||||
"diag": "诊断",
|
||||
"heating": "供热设置",
|
||||
"dhw": "生活热水设置",
|
||||
"emergency": "应急模式设置",
|
||||
"equitherm": "气候补偿设置",
|
||||
"pid": "PID 参数设置",
|
||||
"ot": "OpenTherm协议设置",
|
||||
"mqtt": "MQTT 服务器设置",
|
||||
"extPump": "外置循环泵设置",
|
||||
"cascadeControl": "Cascade 级联控制设置"
|
||||
},
|
||||
|
||||
"enable": "启用",
|
||||
"note": {
|
||||
"restart": "更改这些设置后,必须重启设备以使变更生效",
|
||||
"blankNotUse": "空白 - 未使用",
|
||||
"bleDevice": "BLE设备仅支持搭载BLE功能的特定ESP32开发板使用!"
|
||||
},
|
||||
|
||||
"temp": {
|
||||
"min": "最低温度",
|
||||
"max": "最高温度"
|
||||
},
|
||||
"maxModulation": "最大调制范围",
|
||||
"ohProtection": {
|
||||
"title": "超温保护",
|
||||
"desc": "<b>注意:</b> 当锅炉内置过热保护失效或工作异常导致系统超温时,此功能可提供额外保护。如需禁用,请将<b>最高温度</b>和<b>最低温度</b>均设为0。",
|
||||
"highTemp": {
|
||||
"title": "高温阈值",
|
||||
"note": "触发燃烧器强制关闭的阈值温度"
|
||||
},
|
||||
"lowTemp": {
|
||||
"title": "低温阈值",
|
||||
"note": "燃烧器重新启动的阈值温度"
|
||||
}
|
||||
},
|
||||
"freezeProtection": {
|
||||
"title": "防冻保护",
|
||||
"desc": "当热媒或室内温度在<b>等待时间</b> 内降至<b>低温阈值</b>以下时,系统将强制启动加热功能。",
|
||||
"lowTemp": "低温阈值",
|
||||
"thresholdTime": "等待时间<small>(秒)</small>"
|
||||
},
|
||||
|
||||
"portal": {
|
||||
"login": "登录",
|
||||
"password": "密码",
|
||||
"auth": "需身份验证",
|
||||
"mdns": "使用 mDNS"
|
||||
},
|
||||
|
||||
"system": {
|
||||
"unit": "单位",
|
||||
"metric": "公制 <small>(摄氏度、升、巴)</small>",
|
||||
"imperial": "英制 <small>(华氏度、加仑、psi)</small>",
|
||||
"statusLedGpio": "状态指示灯GPIO引脚",
|
||||
"logLevel": "日志级别",
|
||||
"serial": {
|
||||
"enable": "启用串口",
|
||||
"baud": "串口波特率"
|
||||
},
|
||||
"telnet": {
|
||||
"enable": "启用 Telnet",
|
||||
"port": {
|
||||
"title": "Telnet 端口",
|
||||
"note": "默认值:23"
|
||||
}
|
||||
},
|
||||
"ntp": {
|
||||
"server": "NTP服务器",
|
||||
"timezone": "时区",
|
||||
"timezonePresets": "选择预设配置..."
|
||||
}
|
||||
},
|
||||
|
||||
"heating": {
|
||||
"hyst": "滞后值<small>(单位:度)</small>",
|
||||
"turboFactor": "Turbo 模式系数"
|
||||
},
|
||||
|
||||
"emergency": {
|
||||
"desc": "紧急模式会在以下情况自动激活(当PID或气候补偿无法计算热媒设定值时):<br />启用气候补偿但室外温度传感器断开连接;<br />启用PID或 OpenTherm 选项中启用<i>原生供暖控制</i>但室内温度传感器断开连接。<br /><b>注意:</b> 网络故障或MQTT 服务器连接故障时,类型为<i>通过MQTT/API手动控制<i>的传感器将显示为断开连接状态。",
|
||||
|
||||
"target": {
|
||||
"title": "目标温度",
|
||||
"note": "<b>重要提示:</b> 若启用OpenTherm选项 <i>«原生供暖控制»</i>,此处设定值为<u>目标室内温度</u>;<br />其他所有情况下,此处设定值为 <u>目标热媒出水温度</u>."
|
||||
},
|
||||
"treshold": "阈值时间 <small>(秒)</small>"
|
||||
},
|
||||
|
||||
"equitherm": {
|
||||
"n": "N 系数",
|
||||
"k": "K 系数",
|
||||
"t": {
|
||||
"title": "T 系数",
|
||||
"note": "启用PID时此参数无效"
|
||||
}
|
||||
},
|
||||
|
||||
"pid": {
|
||||
"p": "P 系数",
|
||||
"i": "I 系数",
|
||||
"d": "D 系数",
|
||||
"dt": "DT <small>以秒为单位</small>",
|
||||
"limits": {
|
||||
"title": "Limits",
|
||||
"note": "<b>重要提示:</b> When using «Equitherm» and «PID» at the same time, the min and max temperatures limit the influence on the «Equitherm» result temperature.<br />Thus, if the min temperature is set to -15 and the max temperature is set to 15, then the final heat carrier setpoint will be from <code>equitherm_result - 15</code> to <code>equitherm_result + 15</code>."
|
||||
},
|
||||
"deadband": {
|
||||
"title": "Deadband",
|
||||
"note": "Deadband is a range around the target temperature where PID regulation becomes less active. Within this range, the algorithm can reduce intensity or pause adjustments to avoid overreacting to small fluctuations.<br /><br />For instance, with a target temperature of 22°, a lower threshold of 1.0, and an upper threshold of 0.5, the deadband operates between 21° and 22.5°. If the I coefficient is 0.0005 and the I multiplier is 0.05, then within the deadband, the I coefficient becomes: <code>0.0005 * 0.05 = 0.000025</code>",
|
||||
"p_multiplier": "Multiplier for P factor",
|
||||
"i_multiplier": "Multiplier for I factor",
|
||||
"d_multiplier": "Multiplier for D factor",
|
||||
"thresholdHigh": "Threshold high",
|
||||
"thresholdLow": "Threshold low"
|
||||
}
|
||||
},
|
||||
|
||||
"ot": {
|
||||
"advanced": "高级设置",
|
||||
"inGpio": "In GPIO",
|
||||
"outGpio": "Out GPIO",
|
||||
"ledGpio": "RX LED GPIO",
|
||||
"memberId": "主设备成员 ID",
|
||||
"flags": "主设备标志",
|
||||
"minPower": {
|
||||
"title": "最小锅炉功率 <small>(kW)</small>",
|
||||
"note": "该值对应锅炉0-1%的调制水平,通常在锅炉参数设置中的\"最小有效热输出\"。"
|
||||
},
|
||||
"maxPower": {
|
||||
"title": "最大锅炉功率 <small>(kW)</small>",
|
||||
"note": "<b>0</b> - 自动检测,通常在锅炉参数设置中的\"最大有效热输出\"。 "
|
||||
},
|
||||
|
||||
"options": {
|
||||
"title": "选项(附加设置)",
|
||||
"desc": "附加设置选项可调整锅炉的运行逻辑。由于协议未完整记录所有选项,同一选项在不同锅炉上可能产生不同效果。<br /><b>注意:</b>若系统运行正常,无需修改设置。",
|
||||
"dhwSupport": "生活热水支持",
|
||||
"coolingSupport": "制冷支持",
|
||||
"summerWinterMode": "夏季/冬季模式",
|
||||
"heatingStateToSummerWinterMode": "以供暖状态作为夏季/冬季模式",
|
||||
"ch2AlwaysEnabled": "CH2 始终启用",
|
||||
"heatingToCh2": "将供暖同步至 CH2",
|
||||
"dhwToCh2": "将生活热水同步至 CH2",
|
||||
"dhwBlocking": "生活热水锁定",
|
||||
"dhwStateAsDhwBlocking": "以生活热水状态作为生活热水锁定依据",
|
||||
"maxTempSyncWithTargetTemp": "将最高供暖温度与目标温度同步",
|
||||
"getMinMaxTemp": "从锅炉获取最小/最大温度参数",
|
||||
"ignoreDiagState": "忽略诊断状态",
|
||||
"autoFaultReset": "自动报警复位 <small>(不推荐!)</small>",
|
||||
"autoDiagReset": "自动诊断复位 <small>(不推荐!)</small>",
|
||||
"setDateAndTime": "同步设置锅炉日期与时间",
|
||||
"immergasFix": "针对Immergas锅炉的兼容性修复"
|
||||
},
|
||||
|
||||
"nativeHeating": {
|
||||
"title": "原生锅炉供暖控制",
|
||||
"note": "<u>注意:</u> 仅适用于锅炉需接收目标室温并自主调节载热介质温度的场景,与固件中的PID及Equithermq气候补偿功能不兼容。"
|
||||
}
|
||||
},
|
||||
|
||||
"mqtt": {
|
||||
"homeAssistantDiscovery": "Home Assistant 自动发现",
|
||||
"server": "服务器地址",
|
||||
"port": "端口",
|
||||
"user": "用户名",
|
||||
"password": "密码",
|
||||
"prefix": "Prefix 前缀",
|
||||
"interval": "发布间隔 <small>(秒)</small>"
|
||||
},
|
||||
|
||||
"extPump": {
|
||||
"use": "使用外置循环泵",
|
||||
"gpio": "继电器 GPIO引脚",
|
||||
"postCirculationTime": "后循环时间 <small>(分钟)</small>",
|
||||
"antiStuckInterval": "防卡死间隔时间<small>(天)</small>",
|
||||
"antiStuckTime": "防卡死运行时长<small>(分钟)</small>"
|
||||
},
|
||||
|
||||
"cascadeControl": {
|
||||
"input": {
|
||||
"desc": "仅当另一台锅炉发生故障时启用本锅炉加热。另一台锅炉的控制器需在故障发生时切换GPIO输入状态以触发本功能。",
|
||||
"enable": "启用 input",
|
||||
"gpio": "GPIO",
|
||||
"invertState": "切换 GPIO 状态",
|
||||
"thresholdTime": "状态变化阈值时间<small>(秒)</small>"
|
||||
},
|
||||
"output": {
|
||||
"desc": "可通过<u>继电器</u>控制另一台锅炉的启停。",
|
||||
"enable": "启用 output",
|
||||
"gpio": "GPIO",
|
||||
"invertState": "切换 GPIO 状态",
|
||||
"thresholdTime": "状态变化阈值时间 <small>(秒)</small>",
|
||||
"events": {
|
||||
"desc": "事件",
|
||||
"onFault": "当故障状态激活时",
|
||||
"onLossConnection": "当OpenTherm连接中断时",
|
||||
"onEnabledHeating": "当供暖功能启用时"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"upgrade": {
|
||||
"title": "固件升级 - OpenTherm Gateway",
|
||||
"name": "固件升级",
|
||||
|
||||
"section": {
|
||||
"backupAndRestore": "备份与恢复",
|
||||
"backupAndRestore.desc": "本功能支持备份和恢复全部设置",
|
||||
"upgrade": "升级",
|
||||
"upgrade.desc": "本模块支持升级设备的固件与系统文件。<br />可从以下地址下载最新版本 <a href=\"https://github.com/Laxilef/OTGateway/releases\" target=\"_blank\">Releases page</a> 。"
|
||||
},
|
||||
|
||||
"note": {
|
||||
"disclaimer1": "升级系统文件成功后,所有设置将恢复为默认值!升级前请务必备份配置。",
|
||||
"disclaimer2": "升级成功后,设备将在15秒后自动重启。"
|
||||
},
|
||||
|
||||
"settingsFile": "设置文件",
|
||||
"fw": "Firmware",
|
||||
"fs": "Filesystem"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -21,6 +21,7 @@
|
||||
<li>
|
||||
<select id="lang" aria-label="Lang">
|
||||
<option value="en" selected>EN</option>
|
||||
<option value="cn">CN</option>
|
||||
<option value="it">IT</option>
|
||||
<option value="ru">RU</option>
|
||||
</select>
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
<li>
|
||||
<select id="lang" aria-label="Lang">
|
||||
<option value="en" selected>EN</option>
|
||||
<option value="cn">CN</option>
|
||||
<option value="it">IT</option>
|
||||
<option value="ru">RU</option>
|
||||
</select>
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
<li>
|
||||
<select id="lang" aria-label="Lang">
|
||||
<option value="en" selected>EN</option>
|
||||
<option value="cn">CN</option>
|
||||
<option value="it">IT</option>
|
||||
<option value="ru">RU</option>
|
||||
</select>
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
<li>
|
||||
<select id="lang" aria-label="Lang">
|
||||
<option value="en" selected>EN</option>
|
||||
<option value="cn">CN</option>
|
||||
<option value="it">IT</option>
|
||||
<option value="ru">RU</option>
|
||||
</select>
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
<li>
|
||||
<select id="lang" aria-label="Lang">
|
||||
<option value="en" selected>EN</option>
|
||||
<option value="cn">CN</option>
|
||||
<option value="it">IT</option>
|
||||
<option value="ru">RU</option>
|
||||
</select>
|
||||
@@ -896,7 +897,8 @@
|
||||
unitSystem: null,
|
||||
targetTemp: null,
|
||||
minTemp: null,
|
||||
maxTemp: null
|
||||
maxTemp: null,
|
||||
decimated: false
|
||||
};
|
||||
|
||||
const hasNeedDecimationChart = () => {
|
||||
@@ -956,12 +958,6 @@
|
||||
},
|
||||
legend: {
|
||||
display: false
|
||||
},
|
||||
decimation: {
|
||||
enabled: hasNeedDecimationChart(),
|
||||
algorithm: 'lttb',
|
||||
samples: 30,
|
||||
threshold: 30
|
||||
}
|
||||
},
|
||||
scales: {
|
||||
@@ -1007,19 +1003,18 @@
|
||||
return;
|
||||
}
|
||||
|
||||
while (etChart.data.datasets[0].data.length) {
|
||||
etChart.data.datasets[0].data.pop();
|
||||
}
|
||||
|
||||
for (let value = 30; value >= -30; value--) {
|
||||
let data = [];
|
||||
etChartConfig.decimated = hasNeedDecimationChart();
|
||||
for (let value = 30; value >= -30; value -= etChartConfig.decimated ? 2 : 1) {
|
||||
const outdoorTemp = etChartConfig.unitSystem == 0 ? value : c2f(value);
|
||||
|
||||
etChart.data.datasets[0].data.push({
|
||||
data.push({
|
||||
x: parseFloat(outdoorTemp.toFixed(1)),
|
||||
y: parseFloat(calculateEquithermTemp(outdoorTemp).toFixed(1))
|
||||
});
|
||||
}
|
||||
|
||||
etChart.data.datasets[0].data = data;
|
||||
etChart.data.datasets[0].label = i18n("settings.equitherm.chart.setpointTemp");
|
||||
etChart.options.scales.x.title.text = i18n("settings.equitherm.chart.outdoorTemp");
|
||||
etChart.options.scales.y.title.text = i18n("settings.equitherm.chart.setpointTemp");
|
||||
@@ -1335,9 +1330,8 @@
|
||||
if (etChart) {
|
||||
etChart.resize();
|
||||
|
||||
if (etChart.options.plugins.decimation.enabled != hasNeedDecimationChart()) {
|
||||
etChart.options.plugins.decimation.enabled = hasNeedDecimationChart();
|
||||
etChart.update();
|
||||
if (etChartConfig.decimated != hasNeedDecimationChart()) {
|
||||
makeEquithermChart();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
<li>
|
||||
<select id="lang" aria-label="Lang">
|
||||
<option value="en" selected>EN</option>
|
||||
<option value="cn">CN</option>
|
||||
<option value="it">IT</option>
|
||||
<option value="ru">RU</option>
|
||||
</select>
|
||||
|
||||
@@ -1,20 +1,14 @@
|
||||
/**
|
||||
* Skipped minification because the original files appears to be already minified.
|
||||
* Original file: /npm/chart.js@4.4.8/dist/chart.umd.js
|
||||
*
|
||||
* Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
|
||||
*/
|
||||
/*!
|
||||
* Chart.js v4.4.8
|
||||
* Chart.js v4.5.0
|
||||
* https://www.chartjs.org
|
||||
* (c) 2025 Chart.js Contributors
|
||||
* Released under the MIT License
|
||||
*/
|
||||
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){"use strict";var t=Object.freeze({__proto__:null,get Colors(){return Go},get Decimation(){return Qo},get Filler(){return ma},get Legend(){return ya},get SubTitle(){return ka},get Title(){return Ma},get Tooltip(){return Ba}});function e(){}const i=(()=>{let t=0;return()=>t++})();function s(t){return null==t}function n(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function o(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function a(t){return("number"==typeof t||t instanceof Number)&&isFinite(+t)}function r(t,e){return a(t)?t:e}function l(t,e){return void 0===t?e:t}const h=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e,c=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function d(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function u(t,e,i,s){let a,r,l;if(n(t))if(r=t.length,s)for(a=r-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;a<r;a++)e.call(i,t[a],a);else if(o(t))for(l=Object.keys(t),r=l.length,a=0;a<r;a++)e.call(i,t[l[a]],l[a])}function f(t,e){let i,s,n,o;if(!t||!e||t.length!==e.length)return!1;for(i=0,s=t.length;i<s;++i)if(n=t[i],o=e[i],n.datasetIndex!==o.datasetIndex||n.index!==o.index)return!1;return!0}function g(t){if(n(t))return t.map(g);if(o(t)){const e=Object.create(null),i=Object.keys(t),s=i.length;let n=0;for(;n<s;++n)e[i[n]]=g(t[i[n]]);return e}return t}function p(t){return-1===["__proto__","prototype","constructor"].indexOf(t)}function m(t,e,i,s){if(!p(t))return;const n=e[t],a=i[t];o(n)&&o(a)?x(n,a,s):e[t]=g(a)}function x(t,e,i){const s=n(e)?e:[e],a=s.length;if(!o(t))return t;const r=(i=i||{}).merger||m;let l;for(let e=0;e<a;++e){if(l=s[e],!o(l))continue;const n=Object.keys(l);for(let e=0,s=n.length;e<s;++e)r(n[e],t,l,i)}return t}function b(t,e){return x(t,e,{merger:_})}function _(t,e,i){if(!p(t))return;const s=e[t],n=i[t];o(s)&&o(n)?b(s,n):Object.prototype.hasOwnProperty.call(e,t)||(e[t]=g(n))}const y={"":t=>t,x:t=>t.x,y:t=>t.y};function v(t){const e=t.split("."),i=[];let s="";for(const t of e)s+=t,s.endsWith("\\")?s=s.slice(0,-1)+".":(i.push(s),s="");return i}function M(t,e){const i=y[e]||(y[e]=function(t){const e=v(t);return t=>{for(const i of e){if(""===i)break;t=t&&t[i]}return t}}(e));return i(t)}function w(t){return t.charAt(0).toUpperCase()+t.slice(1)}const k=t=>void 0!==t,S=t=>"function"==typeof t,P=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function D(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const C=Math.PI,O=2*C,A=O+C,T=Number.POSITIVE_INFINITY,L=C/180,E=C/2,R=C/4,I=2*C/3,z=Math.log10,F=Math.sign;function V(t,e,i){return Math.abs(t-e)<i}function B(t){const e=Math.round(t);t=V(t,e,t/1e3)?e:t;const i=Math.pow(10,Math.floor(z(t))),s=t/i;return(s<=1?1:s<=2?2:s<=5?5:10)*i}function W(t){const e=[],i=Math.sqrt(t);let s;for(s=1;s<i;s++)t%s==0&&(e.push(s),e.push(t/s));return i===(0|i)&&e.push(i),e.sort(((t,e)=>t-e)).pop(),e}function N(t){return!function(t){return"symbol"==typeof t||"object"==typeof t&&null!==t&&!(Symbol.toPrimitive in t||"toString"in t||"valueOf"in t)}(t)&&!isNaN(parseFloat(t))&&isFinite(t)}function H(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}function j(t,e,i){let s,n,o;for(s=0,n=t.length;s<n;s++)o=t[s][i],isNaN(o)||(e.min=Math.min(e.min,o),e.max=Math.max(e.max,o))}function $(t){return t*(C/180)}function Y(t){return t*(180/C)}function U(t){if(!a(t))return;let e=1,i=0;for(;Math.round(t*e)/e!==t;)e*=10,i++;return i}function X(t,e){const i=e.x-t.x,s=e.y-t.y,n=Math.sqrt(i*i+s*s);let o=Math.atan2(s,i);return o<-.5*C&&(o+=O),{angle:o,distance:n}}function q(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function K(t,e){return(t-e+A)%O-C}function G(t){return(t%O+O)%O}function Z(t,e,i,s){const n=G(t),o=G(e),a=G(i),r=G(o-n),l=G(a-n),h=G(n-o),c=G(n-a);return n===o||n===a||s&&o===a||r>l&&h<c}function J(t,e,i){return Math.max(e,Math.min(i,t))}function Q(t){return J(t,-32768,32767)}function tt(t,e,i,s=1e-6){return t>=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function et(t,e,i){i=i||(i=>t[i]<e);let s,n=t.length-1,o=0;for(;n-o>1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const it=(t,e,i,s)=>et(t,i,s?s=>{const n=t[s][e];return n<i||n===i&&t[s+1][e]===i}:s=>t[s][e]<i),st=(t,e,i)=>et(t,i,(s=>t[s][e]>=i));function nt(t,e,i){let s=0,n=t.length;for(;s<n&&t[s]<e;)s++;for(;n>s&&t[n-1]>i;)n--;return s>0||n<t.length?t.slice(s,n):t}const ot=["push","pop","shift","splice","unshift"];function at(t,e){t._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),ot.forEach((e=>{const i="_onData"+w(e),s=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...eLine truncated
|
||||
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){"use strict";var t=Object.freeze({__proto__:null,get Colors(){return Jo},get Decimation(){return ta},get Filler(){return ba},get Legend(){return Ma},get SubTitle(){return Pa},get Title(){return ka},get Tooltip(){return Na}});function e(){}const i=(()=>{let t=0;return()=>t++})();function s(t){return null==t}function n(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function o(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function a(t){return("number"==typeof t||t instanceof Number)&&isFinite(+t)}function r(t,e){return a(t)?t:e}function l(t,e){return void 0===t?e:t}const h=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e,c=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function d(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function u(t,e,i,s){let a,r,l;if(n(t))if(r=t.length,s)for(a=r-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;a<r;a++)e.call(i,t[a],a);else if(o(t))for(l=Object.keys(t),r=l.length,a=0;a<r;a++)e.call(i,t[l[a]],l[a])}function f(t,e){let i,s,n,o;if(!t||!e||t.length!==e.length)return!1;for(i=0,s=t.length;i<s;++i)if(n=t[i],o=e[i],n.datasetIndex!==o.datasetIndex||n.index!==o.index)return!1;return!0}function g(t){if(n(t))return t.map(g);if(o(t)){const e=Object.create(null),i=Object.keys(t),s=i.length;let n=0;for(;n<s;++n)e[i[n]]=g(t[i[n]]);return e}return t}function p(t){return-1===["__proto__","prototype","constructor"].indexOf(t)}function m(t,e,i,s){if(!p(t))return;const n=e[t],a=i[t];o(n)&&o(a)?x(n,a,s):e[t]=g(a)}function x(t,e,i){const s=n(e)?e:[e],a=s.length;if(!o(t))return t;const r=(i=i||{}).merger||m;let l;for(let e=0;e<a;++e){if(l=s[e],!o(l))continue;const n=Object.keys(l);for(let e=0,s=n.length;e<s;++e)r(n[e],t,l,i)}return t}function b(t,e){return x(t,e,{merger:_})}function _(t,e,i){if(!p(t))return;const s=e[t],n=i[t];o(s)&&o(n)?b(s,n):Object.prototype.hasOwnProperty.call(e,t)||(e[t]=g(n))}const y={"":t=>t,x:t=>t.x,y:t=>t.y};function v(t){const e=t.split("."),i=[];let s="";for(const t of e)s+=t,s.endsWith("\\")?s=s.slice(0,-1)+".":(i.push(s),s="");return i}function M(t,e){const i=y[e]||(y[e]=function(t){const e=v(t);return t=>{for(const i of e){if(""===i)break;t=t&&t[i]}return t}}(e));return i(t)}function w(t){return t.charAt(0).toUpperCase()+t.slice(1)}const k=t=>void 0!==t,S=t=>"function"==typeof t,P=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function D(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const C=Math.PI,O=2*C,A=O+C,T=Number.POSITIVE_INFINITY,L=C/180,E=C/2,R=C/4,I=2*C/3,z=Math.log10,F=Math.sign;function V(t,e,i){return Math.abs(t-e)<i}function B(t){const e=Math.round(t);t=V(t,e,t/1e3)?e:t;const i=Math.pow(10,Math.floor(z(t))),s=t/i;return(s<=1?1:s<=2?2:s<=5?5:10)*i}function W(t){const e=[],i=Math.sqrt(t);let s;for(s=1;s<i;s++)t%s==0&&(e.push(s),e.push(t/s));return i===(0|i)&&e.push(i),e.sort(((t,e)=>t-e)).pop(),e}function N(t){return!function(t){return"symbol"==typeof t||"object"==typeof t&&null!==t&&!(Symbol.toPrimitive in t||"toString"in t||"valueOf"in t)}(t)&&!isNaN(parseFloat(t))&&isFinite(t)}function H(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}function j(t,e,i){let s,n,o;for(s=0,n=t.length;s<n;s++)o=t[s][i],isNaN(o)||(e.min=Math.min(e.min,o),e.max=Math.max(e.max,o))}function $(t){return t*(C/180)}function Y(t){return t*(180/C)}function U(t){if(!a(t))return;let e=1,i=0;for(;Math.round(t*e)/e!==t;)e*=10,i++;return i}function X(t,e){const i=e.x-t.x,s=e.y-t.y,n=Math.sqrt(i*i+s*s);let o=Math.atan2(s,i);return o<-.5*C&&(o+=O),{angle:o,distance:n}}function q(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function K(t,e){return(t-e+A)%O-C}function G(t){return(t%O+O)%O}function J(t,e,i,s){const n=G(t),o=G(e),a=G(i),r=G(o-n),l=G(a-n),h=G(n-o),c=G(n-a);return n===o||n===a||s&&o===a||r>l&&h<c}function Z(t,e,i){return Math.max(e,Math.min(i,t))}function Q(t){return Z(t,-32768,32767)}function tt(t,e,i,s=1e-6){return t>=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function et(t,e,i){i=i||(i=>t[i]<e);let s,n=t.length-1,o=0;for(;n-o>1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const it=(t,e,i,s)=>et(t,i,s?s=>{const n=t[s][e];return n<i||n===i&&t[s+1][e]===i}:s=>t[s][e]<i),st=(t,e,i)=>et(t,i,(s=>t[s][e]>=i));function nt(t,e,i){let s=0,n=t.length;for(;s<n&&t[s]<e;)s++;for(;n>s&&t[n-1]>i;)n--;return s>0||n<t.length?t.slice(s,n):t}const ot=["push","pop","shift","splice","unshift"];function at(t,e){t._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),ot.forEach((e=>{const i="_onData"+w(e),s=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...eLine truncated
|
||||
/*!
|
||||
* @kurkle/color v0.3.2
|
||||
* https://github.com/kurkle/color#readme
|
||||
* (c) 2023 Jukka Kurkela
|
||||
* Released under the MIT License
|
||||
*/function _t(t){return t+.5|0}const yt=(t,e,i)=>Math.max(Math.min(t,i),e);function vt(t){return yt(_t(2.55*t),0,255)}function Mt(t){return yt(_t(255*t),0,255)}function wt(t){return yt(_t(t/2.55)/100,0,1)}function kt(t){return yt(_t(100*t),0,100)}const St={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Pt=[..."0123456789ABCDEF"],Dt=t=>Pt[15&t],Ct=t=>Pt[(240&t)>>4]+Pt[15&t],Ot=t=>(240&t)>>4==(15&t);function At(t){var e=(t=>Ot(t.r)&&Ot(t.g)&&Ot(t.b)&&Ot(t.a))(t)?Dt:Ct;return t?"#"+e(t.r)+e(t.g)+e(t.b)+((t,e)=>t<255?e(t):"")(t.a,e):void 0}const Tt=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Lt(t,e,i){const s=e*Math.min(i,1-i),n=(e,n=(e+t/30)%12)=>i-s*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function Et(t,e,i){const s=(s,n=(s+t/60)%6)=>i-i*e*Math.max(Math.min(n,4-n,1),0);return[s(5),s(3),s(1)]}function Rt(t,e,i){const s=Lt(t,1,.5);let n;for(e+i>1&&(n=1/(e+i),e*=n,i*=n),n=0;n<3;n++)s[n]*=1-e-i,s[n]+=e;return s}function It(t){const e=t.r/255,i=t.g/255,s=t.b/255,n=Math.max(e,i,s),o=Math.min(e,i,s),a=(n+o)/2;let r,l,h;return n!==o&&(h=n-o,l=a>.5?h/(2-n-o):h/(n+o),r=function(t,e,i,s,n){return t===n?(e-i)/s+(e<i?6:0):e===n?(i-t)/s+2:(t-e)/s+4}(e,i,s,h,n),r=60*r+.5),[0|r,l||0,a]}function zt(t,e,i,s){return(Array.isArray(e)?t(e[0],e[1],e[2]):t(e,i,s)).map(Mt)}function Ft(t,e,i){return zt(Lt,t,e,i)}function Vt(t){return(t%360+360)%360}function Bt(t){const e=Tt.exec(t);let i,s=255;if(!e)return;e[5]!==i&&(s=e[6]?vt(+e[5]):Mt(+e[5]));const n=Vt(+e[2]),o=+e[3]/100,a=+e[4]/100;return i="hwb"===e[1]?function(t,e,i){return zt(Rt,t,e,i)}(n,o,a):"hsv"===e[1]?function(t,e,i){return zt(Et,t,e,i)}(n,o,a):Ft(n,o,a),{r:i[0],g:i[1],b:i[2],a:s}}const Wt={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},Nt={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};let Ht;function jt(t){Ht||(Ht=function(){const t={},e=Object.keys(Nt),i=Object.keys(Wt);let s,n,o,a,r;for(s=0;s<e.length;s++){for(a=r=e[s],n=0;n<i.length;n++)o=i[n],r=r.replace(o,Wt[o]);o=parseInt(Nt[a],16),t[r]=[o>>16&255,o>>8&255,255&o]}return t}(),Ht.transparent=[0,0,0,0]);const e=Ht[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}const $t=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;const Yt=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,Ut=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function Xt(t,e,i){if(t){let s=It(t);s[e]=Math.max(0,Math.min(s[e]+s[e]*i,0===e?360:1)),Line truncated
|
||||
//# sourceMappingURL=chart.umd.js.map
|
||||
*/function _t(t){return t+.5|0}const yt=(t,e,i)=>Math.max(Math.min(t,i),e);function vt(t){return yt(_t(2.55*t),0,255)}function Mt(t){return yt(_t(255*t),0,255)}function wt(t){return yt(_t(t/2.55)/100,0,1)}function kt(t){return yt(_t(100*t),0,100)}const St={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Pt=[..."0123456789ABCDEF"],Dt=t=>Pt[15&t],Ct=t=>Pt[(240&t)>>4]+Pt[15&t],Ot=t=>(240&t)>>4==(15&t);function At(t){var e=(t=>Ot(t.r)&&Ot(t.g)&&Ot(t.b)&&Ot(t.a))(t)?Dt:Ct;return t?"#"+e(t.r)+e(t.g)+e(t.b)+((t,e)=>t<255?e(t):"")(t.a,e):void 0}const Tt=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Lt(t,e,i){const s=e*Math.min(i,1-i),n=(e,n=(e+t/30)%12)=>i-s*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function Et(t,e,i){const s=(s,n=(s+t/60)%6)=>i-i*e*Math.max(Math.min(n,4-n,1),0);return[s(5),s(3),s(1)]}function Rt(t,e,i){const s=Lt(t,1,.5);let n;for(e+i>1&&(n=1/(e+i),e*=n,i*=n),n=0;n<3;n++)s[n]*=1-e-i,s[n]+=e;return s}function It(t){const e=t.r/255,i=t.g/255,s=t.b/255,n=Math.max(e,i,s),o=Math.min(e,i,s),a=(n+o)/2;let r,l,h;return n!==o&&(h=n-o,l=a>.5?h/(2-n-o):h/(n+o),r=function(t,e,i,s,n){return t===n?(e-i)/s+(e<i?6:0):e===n?(i-t)/s+2:(t-e)/s+4}(e,i,s,h,n),r=60*r+.5),[0|r,l||0,a]}function zt(t,e,i,s){return(Array.isArray(e)?t(e[0],e[1],e[2]):t(e,i,s)).map(Mt)}function Ft(t,e,i){return zt(Lt,t,e,i)}function Vt(t){return(t%360+360)%360}function Bt(t){const e=Tt.exec(t);let i,s=255;if(!e)return;e[5]!==i&&(s=e[6]?vt(+e[5]):Mt(+e[5]));const n=Vt(+e[2]),o=+e[3]/100,a=+e[4]/100;return i="hwb"===e[1]?function(t,e,i){return zt(Rt,t,e,i)}(n,o,a):"hsv"===e[1]?function(t,e,i){return zt(Et,t,e,i)}(n,o,a):Ft(n,o,a),{r:i[0],g:i[1],b:i[2],a:s}}const Wt={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},Nt={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};let Ht;function jt(t){Ht||(Ht=function(){const t={},e=Object.keys(Nt),i=Object.keys(Wt);let s,n,o,a,r;for(s=0;s<e.length;s++){for(a=r=e[s],n=0;n<i.length;n++)o=i[n],r=r.replace(o,Wt[o]);o=parseInt(Nt[a],16),t[r]=[o>>16&255,o>>8&255,255&o]}return t}(),Ht.transparent=[0,0,0,0]);const e=Ht[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}const $t=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;const Yt=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,Ut=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function Xt(t,e,i){if(t){let s=It(t);s[e]=Math.max(0,Math.min(s[e]+s[e]*i,0===e?360:1)),Line truncated
|
||||
//# sourceMappingURL=chart.umd.min.js.map
|
||||
+21
-18
@@ -23,10 +23,15 @@ Import("env")
|
||||
platform = env.PioPlatform()
|
||||
|
||||
import sys
|
||||
import os
|
||||
import subprocess
|
||||
from os.path import join
|
||||
|
||||
sys.path.append(join(platform.get_package_dir("tool-esptoolpy")))
|
||||
import esptool
|
||||
def normalize_paths(cmd):
|
||||
for i, arg in enumerate(cmd):
|
||||
if isinstance(arg, str) and '/' in arg:
|
||||
cmd[i] = os.path.normpath(arg)
|
||||
return cmd
|
||||
|
||||
def esp32_create_combined_bin(source, target, env):
|
||||
print("Generating combined binary for serial flashing")
|
||||
@@ -39,26 +44,21 @@ def esp32_create_combined_bin(source, target, env):
|
||||
sections = env.subst(env.get("FLASH_EXTRA_IMAGES"))
|
||||
firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin")
|
||||
chip = env.get("BOARD_MCU")
|
||||
flash_size = env.BoardConfig().get("upload.flash_size")
|
||||
flash_freq = env.BoardConfig().get("build.f_flash", '40m')
|
||||
flash_freq = flash_freq.replace('000000L', 'm')
|
||||
flash_mode = env.BoardConfig().get("build.flash_mode", "dio")
|
||||
memory_type = env.BoardConfig().get("build.arduino.memory_type", "qio_qspi")
|
||||
if flash_mode == "qio" or flash_mode == "qout":
|
||||
flash_mode = "dio"
|
||||
if memory_type == "opi_opi" or memory_type == "opi_qspi":
|
||||
flash_mode = "dout"
|
||||
flash_size = env.BoardConfig().get("upload.flash_size", "4MB")
|
||||
flash_mode = env["__get_board_flash_mode"](env)
|
||||
flash_freq = env["__get_board_f_flash"](env)
|
||||
|
||||
cmd = [
|
||||
"--chip",
|
||||
chip,
|
||||
"merge_bin",
|
||||
"merge-bin",
|
||||
"-o",
|
||||
new_file_name,
|
||||
"--flash_mode",
|
||||
"--flash-mode",
|
||||
flash_mode,
|
||||
"--flash_freq",
|
||||
"--flash-freq",
|
||||
flash_freq,
|
||||
"--flash_size",
|
||||
"--flash-size",
|
||||
flash_size,
|
||||
]
|
||||
|
||||
@@ -71,9 +71,12 @@ def esp32_create_combined_bin(source, target, env):
|
||||
print(f" - {hex(app_offset)} | {firmware_name}")
|
||||
cmd += [hex(app_offset), firmware_name]
|
||||
|
||||
print('Using esptool.py arguments: %s' % ' '.join(cmd))
|
||||
|
||||
esptool.main(cmd)
|
||||
# print('Using esptool.py arguments: %s' % ' '.join(cmd))
|
||||
cmdline = [env.subst("$OBJCOPY")] + normalize_paths(cmd)
|
||||
print('Command Line: %s' % cmdline)
|
||||
result = subprocess.run(cmdline, text=True, check=False, stdout=subprocess.DEVNULL)
|
||||
if result.returncode != 0:
|
||||
print(f"esptool create firmware failed with exit code: {result.returncode}")
|
||||
|
||||
|
||||
env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_create_combined_bin)
|
||||
Reference in new issue
Block a user