mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2026-05-09 23:45:51 +00:00
Compare commits
67 Commits
c0bea66d27
...
v3.8.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
28135c225b | ||
|
|
eaa277fef0 | ||
|
|
e418b7d8e7 | ||
|
|
a4e3be6a69 | ||
|
|
a1bc5bb055 | ||
|
|
f444ca31e0 | ||
|
|
1b70b55989 | ||
|
|
1487f30c43 | ||
|
|
e00eb8e64f | ||
|
|
f41bb3671c | ||
|
|
22c75e6df3 | ||
|
|
5ab10b7aa6 | ||
|
|
ee5fd4d0eb | ||
|
|
46f35bc67c | ||
|
|
ec85a7ec24 | ||
|
|
02f2389587 | ||
|
|
7f140021aa | ||
|
|
6796962c1e | ||
|
|
df6de21cf4 | ||
|
|
df9f75a5c9 | ||
|
|
7bd8710eb6 | ||
|
|
32f2c6d341 | ||
|
|
86919c1684 | ||
|
|
86e29515e7 | ||
|
|
46eb4185d7 | ||
|
|
8da6761a48 | ||
|
|
9233f0dfcc | ||
|
|
292f743b14 | ||
|
|
dd6dfffd57 | ||
|
|
ec705a5307 | ||
|
|
f45f071710 | ||
|
|
f3858546de | ||
|
|
d0ac0b7804 | ||
|
|
d8284ec09f | ||
|
|
6e982acde8 | ||
|
|
8c94ce99b2 | ||
|
|
fc057d18c9 | ||
|
|
18e9b99413 | ||
|
|
a47e0e8266 | ||
|
|
f412ddc716 | ||
|
|
29110e96e5 | ||
|
|
b65866217a | ||
|
|
611e3b1243 | ||
|
|
2ca0a0c634 | ||
|
|
7eb1f061b7 | ||
|
|
50459a23fe | ||
|
|
5bf53c3389 | ||
|
|
4b7aa95be3 | ||
|
|
70943f5758 | ||
|
|
3bc280b817 | ||
|
|
62b15a5319 | ||
|
|
8dd18802d6 | ||
|
|
57a516a83a | ||
|
|
a57fdaa4b3 | ||
|
|
4841e42286 | ||
|
|
8c2d2b06ed | ||
|
|
38c8b1b7f0 | ||
|
|
6fb5933a02 | ||
|
|
c0944433be | ||
|
|
478e6362c9 | ||
|
|
4d6354db78 | ||
|
|
beab0f0c77 | ||
|
|
c17749bd22 | ||
|
|
2bad769c5c | ||
|
|
8ad89ca64b | ||
|
|
9244d8daec | ||
|
|
02d01334b2 |
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -22,7 +22,7 @@ _Make sure your have performed every step and checked the applicable boxes befor
|
|||||||
- [ ] Searched the issue in [issues](https://github.com/emsesp/EMS-ESP32/issues)
|
- [ ] Searched the issue in [issues](https://github.com/emsesp/EMS-ESP32/issues)
|
||||||
- [ ] Searched the issue in [discussions](https://github.com/emsesp/EMS-ESP32/discussions)
|
- [ ] Searched the issue in [discussions](https://github.com/emsesp/EMS-ESP32/discussions)
|
||||||
- [ ] Searched the issue in the [docs](https://emsesp.org/Troubleshooting/)
|
- [ ] Searched the issue in the [docs](https://emsesp.org/Troubleshooting/)
|
||||||
- [ ] Searched the issue in the [chat](https://discord.gg/GP9DPSgeJq)
|
- [ ] Searched the issue in the [chat](https://discord.gg/3J3GgnzpyT)
|
||||||
- [ ] Provide the System information in the area below, taken from `http://<IP>/api/system`
|
- [ ] Provide the System information in the area below, taken from `http://<IP>/api/system`
|
||||||
|
|
||||||
```json
|
```json
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE/config.yml
vendored
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -7,5 +7,5 @@ contact_links:
|
|||||||
url: https://github.com/emsesp/EMS-ESP32/discussions
|
url: https://github.com/emsesp/EMS-ESP32/discussions
|
||||||
about: EMS-ESP usage Questions, Feature Requests and Projects.
|
about: EMS-ESP usage Questions, Feature Requests and Projects.
|
||||||
- name: EMS-ESP Users Chat
|
- name: EMS-ESP Users Chat
|
||||||
url: https://discord.gg/GP9DPSgeJq
|
url: https://discord.gg/3J3GgnzpyT
|
||||||
about: Chat for feedback, questions and troubleshooting.
|
about: Chat for feedback, questions and troubleshooting.
|
||||||
|
|||||||
36
CHANGELOG.md
36
CHANGELOG.md
@@ -5,36 +5,7 @@ All notable changes to this project will be documented in this file.
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
## [3.8.1] 11 January 2026
|
## [3.8.0]
|
||||||
|
|
||||||
## Added
|
|
||||||
|
|
||||||
- update time saved in nvs
|
|
||||||
- heatpump entities [#2883](https://github.com/emsesp/EMS-ESP32/issues/2883)
|
|
||||||
- HA input number format (mode) selectable box/slider (slider for max range 100) [#2900](https://github.com/emsesp/EMS-ESP32/discussions/2900)
|
|
||||||
|
|
||||||
## Fixed
|
|
||||||
|
|
||||||
- fix EMS bus disconnected errors on some systems [#2881](https://github.com/emsesp/EMS-ESP32/issues/2881)
|
|
||||||
- selflowtemp fix [#2876](https://github.com/emsesp/EMS-ESP32/issues/2876)
|
|
||||||
- updated valid GPIOs for ESP32S2, ESP32S3 and ESP32 that caused custom systems to block gpios [#2887](https://github.com/emsesp/EMS-ESP32/issues/2887)
|
|
||||||
- Junkers wwcharge offset [#2860](https://github.com/emsesp/EMS-ESP32/issues/2860)
|
|
||||||
- fixed minflowtemp [#2890](https://github.com/emsesp/EMS-ESP32/issues/2890)
|
|
||||||
- don't add HA uom/classes for bool values [#2885](https://github.com/emsesp/EMS-ESP32/issues/2885)
|
|
||||||
- fixed missing progress bar on web firmware uploads
|
|
||||||
|
|
||||||
## Changed
|
|
||||||
|
|
||||||
- snapshot gpios stored in temporary ram
|
|
||||||
- GPIOs stored along with the name and reported in log if conflicting
|
|
||||||
- free GPIOs depend on board profile [#2901](https://github.com/emsesp/EMS-ESP32/issues/2901)
|
|
||||||
- prefer PSram for mqtt queue [#2889](https://github.com/emsesp/EMS-ESP32/issues/2889)
|
|
||||||
- day schedule defult to all days, no day selected is not allowed
|
|
||||||
- board profile `CUSTOM` can only be selected in developer mode
|
|
||||||
- mqtt sends round values without decimals (`28` instead of `28.0`)
|
|
||||||
|
|
||||||
|
|
||||||
## [3.8.0] 31 December 2025
|
|
||||||
|
|
||||||
## Added
|
## Added
|
||||||
|
|
||||||
@@ -55,8 +26,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
- FW200 display options [#2610](https://github.com/emsesp/EMS-ESP32/discussions/2610)
|
- FW200 display options [#2610](https://github.com/emsesp/EMS-ESP32/discussions/2610)
|
||||||
- CR11 mode settings OFF/MANUAL depends on selTemp [#2437](https://github.com/emsesp/EMS-ESP32/issues/2437)
|
- CR11 mode settings OFF/MANUAL depends on selTemp [#2437](https://github.com/emsesp/EMS-ESP32/issues/2437)
|
||||||
- implemented eFuse settings for BBQKees boards to store model type and ESP chipset
|
- implemented eFuse settings for BBQKees boards to store model type and ESP chipset
|
||||||
- analogsensors for pulse output [#2624](https://github.com/emsesp/EMS-ESP32/discussions/2624)
|
- Analogsensors for pulse output [#2624](https://github.com/emsesp/EMS-ESP32/discussions/2624)
|
||||||
- analogsensors frequency input [#2631](https://github.com/emsesp/EMS-ESP32/discussions/2631)
|
- Analogsensors frequency input [#2631](https://github.com/emsesp/EMS-ESP32/discussions/2631)
|
||||||
- SRC plus thermostats [#2636](https://github.com/emsesp/EMS-ESP32/issues/2636)
|
- SRC plus thermostats [#2636](https://github.com/emsesp/EMS-ESP32/issues/2636)
|
||||||
- Greenstar 2000 [#2645](https://github.com/emsesp/EMS-ESP32/issues/2645)
|
- Greenstar 2000 [#2645](https://github.com/emsesp/EMS-ESP32/issues/2645)
|
||||||
- RC3xx `dhw modetype` [#2659](https://github.com/emsesp/EMS-ESP32/discussions/2659)
|
- RC3xx `dhw modetype` [#2659](https://github.com/emsesp/EMS-ESP32/discussions/2659)
|
||||||
@@ -119,6 +90,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
- added Home Assistant device details to MQTT Discovery for all devices
|
- added Home Assistant device details to MQTT Discovery for all devices
|
||||||
- device_class and state_class changes for HA MQTT Discovery [#2825](https://github.com/emsesp/EMS-ESP32/issues/2825)
|
- device_class and state_class changes for HA MQTT Discovery [#2825](https://github.com/emsesp/EMS-ESP32/issues/2825)
|
||||||
|
|
||||||
|
|
||||||
## [3.7.2] 22 March 2025
|
## [3.7.2] 22 March 2025
|
||||||
|
|
||||||
## Added
|
## Added
|
||||||
|
|||||||
@@ -1,33 +1,3 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
For more details go to [emsesp.org](https://emsesp.org/).
|
For more details go to [emsesp.org](https://emsesp.org/).
|
||||||
|
|
||||||
## [3.8.2]
|
|
||||||
|
|
||||||
## Added
|
|
||||||
|
|
||||||
- comfortpoint for BC400 [#2935](https://github.com/emsesp/EMS-ESP32/issues/2935)
|
|
||||||
- customize device brand [#2784](https://github.com/emsesp/EMS-ESP32/issues/2784)
|
|
||||||
- set model for ems-esp devices temperature, analog, etc. [#2958](https://github.com/emsesp/EMS-ESP32/discussions/2958)
|
|
||||||
- prometheus metrics for temperature/analog/scheduler/custom [#2962](https://github.com/emsesp/EMS-ESP32/issues/2962)
|
|
||||||
- boiler pumpkick [#2965](https://github.com/emsesp/EMS-ESP32/discussions/2965)
|
|
||||||
- heatpump reset [#2933](https://github.com/emsesp/EMS-ESP32/issues/2933)
|
|
||||||
- e-mail notification using ReadyMail Client
|
|
||||||
- 2.nd freshwater module (dhw4) [#2991](https://github.com/emsesp/EMS-ESP32/issues/2991)
|
|
||||||
|
|
||||||
## Fixed
|
|
||||||
|
|
||||||
- SRC climate creation [#2936](https://github.com/emsesp/EMS-ESP32/issues/2936) and [#2960](https://github.com/emsesp/EMS-ESP32/issues/2960)
|
|
||||||
|
|
||||||
## Changed
|
|
||||||
|
|
||||||
- weblogbuffer up to 1000 messages with PSRAM, mentioned in [#2933](https://github.com/emsesp/EMS-ESP32/issues/2933)
|
|
||||||
- validate custom entity writes, [#2931](https://github.com/emsesp/EMS-ESP32/issues/2931)
|
|
||||||
- remove wrong burnMinPower [#2918](https://github.com/emsesp/EMS-ESP32/issues/2918)
|
|
||||||
- store scheduler active state to nvs [#2946](https://github.com/emsesp/EMS-ESP32/discussions/2946)
|
|
||||||
- translated modes `heat` and `eco` for HA-climate mode-str-tpl
|
|
||||||
- support `minflowtemp` and `baseflowtemp` [#2969](https://github.com/emsesp/EMS-ESP32/discussions/2969)
|
|
||||||
- update version if it is 00.00 in first read [#2981](https://github.com/emsesp/EMS-ESP32/issues/2981)
|
|
||||||
- device class for % values [#2980](https://github.com/emsesp/EMS-ESP32/issues/2980)
|
|
||||||
- use tasmota core 2026.03.30
|
|
||||||
- secure mqtt uses ESP_SSLClient
|
|
||||||
|
|||||||
7
Makefile
7
Makefile
@@ -65,10 +65,9 @@ CXX_STANDARD := -std=gnu++17
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
DEFINES += -DARDUINOJSON_ENABLE -DARDUINOJSON_ENABLE_ARDUINO_STRING -DARDUINOJSON_USE_DOUBLE=0
|
DEFINES += -DARDUINOJSON_ENABLE -DARDUINOJSON_ENABLE_ARDUINO_STRING -DARDUINOJSON_USE_DOUBLE=0
|
||||||
DEFINES += -DEMSESP_STANDALONE -DEMSESP_TEST -DEMSESP_DEBUG -DEMC_RX_BUFFER_SIZE=1500
|
DEFINES += -DEMSESP_STANDALONE -DEMSESP_TEST -DEMSESP_DEBUG -DEMC_RX_BUFFER_SIZE=1500
|
||||||
DEFINES += -DNO_TLS_SUPPORT
|
|
||||||
DEFINES += $(ARGS)
|
DEFINES += $(ARGS)
|
||||||
|
|
||||||
DEFAULTS = -DEMSESP_DEFAULT_LOCALE=\"en\" -DEMSESP_DEFAULT_BOARD_PROFILE=\"S32S3\"
|
DEFAULTS = -DEMSESP_DEFAULT_LOCALE=\"en\" -DEMSESP_DEFAULT_TX_MODE=8 -DEMSESP_DEFAULT_VERSION=\"3.8.0-dev.0\" -DEMSESP_DEFAULT_BOARD_PROFILE=\"S32S3\"
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
# Sources & Files
|
# Sources & Files
|
||||||
@@ -80,10 +79,6 @@ SYMBOLS := $(CURDIR)/$(BUILD)/$(TARGET).out
|
|||||||
CSOURCES := $(shell find $(SOURCES) -name "*.c" 2>/dev/null)
|
CSOURCES := $(shell find $(SOURCES) -name "*.c" 2>/dev/null)
|
||||||
CXXSOURCES := $(shell find $(SOURCES) -name "*.cpp" 2>/dev/null)
|
CXXSOURCES := $(shell find $(SOURCES) -name "*.cpp" 2>/dev/null)
|
||||||
|
|
||||||
# Exclude files not needed for standalone build, if they exist
|
|
||||||
CSOURCES := $(filter-out src/core/ModuleLibrary.c,$(CSOURCES))
|
|
||||||
CXXSOURCES := $(filter-out src/core/ModuleLibrary.cpp,$(CXXSOURCES))
|
|
||||||
|
|
||||||
OBJS := $(patsubst %,$(BUILD)/%.o,$(basename $(CSOURCES)) $(basename $(CXXSOURCES)))
|
OBJS := $(patsubst %,$(BUILD)/%.o,$(basename $(CSOURCES)) $(basename $(CXXSOURCES)))
|
||||||
DEPS := $(patsubst %,$(BUILD)/%.d,$(basename $(CSOURCES)) $(basename $(CXXSOURCES)))
|
DEPS := $(patsubst %,$(BUILD)/%.d,$(basename $(CSOURCES)) $(basename $(CXXSOURCES)))
|
||||||
|
|
||||||
|
|||||||
22
README.md
22
README.md
@@ -18,7 +18,7 @@
|
|||||||
<a href="https://emsesp.org">
|
<a href="https://emsesp.org">
|
||||||
<img src="https://img.shields.io/badge/Documentation-0077b5?style=for-the-badge&logo=googledocs&logoColor=white" alt="Guides" />
|
<img src="https://img.shields.io/badge/Documentation-0077b5?style=for-the-badge&logo=googledocs&logoColor=white" alt="Guides" />
|
||||||
</a>
|
</a>
|
||||||
<a href="https://discord.gg/GP9DPSgeJq">
|
<a href="https://discord.gg/3J3GgnzpyT">
|
||||||
<img src="https://img.shields.io/badge/Discord-7289da?style=for-the-badge&logo=discord&logoColor=white" alt="Discord" />
|
<img src="https://img.shields.io/badge/Discord-7289da?style=for-the-badge&logo=discord&logoColor=white" alt="Discord" />
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/emsesp/EMS-ESP32/blob/main/CHANGELOG.md">
|
<a href="https://github.com/emsesp/EMS-ESP32/blob/main/CHANGELOG.md">
|
||||||
@@ -32,8 +32,7 @@
|
|||||||
[](https://sonarcloud.io/summary/new_code?id=emsesp_EMS-ESP32)
|
[](https://sonarcloud.io/summary/new_code?id=emsesp_EMS-ESP32)
|
||||||
[](https://app.codacy.com/gh/emsesp/EMS-ESP32/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
|
[](https://app.codacy.com/gh/emsesp/EMS-ESP32/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
|
||||||
[](https://github.com/emsesp/EMS-ESP32/releases)
|
[](https://github.com/emsesp/EMS-ESP32/releases)
|
||||||
[](https://discord.gg/GP9DPSgeJq)
|
[](https://discord.gg/3J3GgnzpyT)
|
||||||
[](https://deepwiki.com/emsesp/EMS-ESP32)
|
|
||||||
|
|
||||||
[](https://github.com/emsesp/EMS-ESP32/stargazers)
|
[](https://github.com/emsesp/EMS-ESP32/stargazers)
|
||||||
[](https://github.com/emsesp/EMS-ESP32/network)
|
[](https://github.com/emsesp/EMS-ESP32/network)
|
||||||
@@ -41,8 +40,7 @@
|
|||||||
|
|
||||||
**EMS-ESP** is an open-source firmware for the Espressif ESP32 microcontroller to communicate with **EMS** (Energy Management System) compatible equipment from manufacturers such as Bosch, Buderus, Nefit, Junkers, Worcester, Sieger, elm.leblanc and iVT.
|
**EMS-ESP** is an open-source firmware for the Espressif ESP32 microcontroller to communicate with **EMS** (Energy Management System) compatible equipment from manufacturers such as Bosch, Buderus, Nefit, Junkers, Worcester, Sieger, elm.leblanc and iVT.
|
||||||
|
|
||||||
It requires a small circuit to interface with the EMS bus which can be purchased from <https://bbqkees-electronics.nl>. These gateways are tested thoroughly and certified to work with EMS-ESP.
|
It requires a small circuit to interface with the EMS bus which can be purchased from <https://bbqkees-electronics.nl> or custom built.
|
||||||
|
|
||||||
|
|
||||||
## 📦 **Key Features**
|
## 📦 **Key Features**
|
||||||
|
|
||||||
@@ -66,27 +64,29 @@ Head over to the [Installation Guide](https://emsesp.org/Installing) section of
|
|||||||
|
|
||||||
## 📋 **Documentation**
|
## 📋 **Documentation**
|
||||||
|
|
||||||
Visit [emsesp.org](https://emsesp.org) for more details on how to setup and configure EMS-ESP. You'll also find more a collection of example configuarations, Frequently Asked Questions and Troubleshooting tips.
|
Visit [emsesp.org](https://emsesp.org) for more details on how to install and configure EMS-ESP. There is also a collection of Frequently Asked Questions and Troubleshooting tips with example customizations from the community.
|
||||||
|
|
||||||
## 💬 **Getting Support**
|
## 💬 **Getting Support**
|
||||||
|
|
||||||
To chat with the community reach out on our [Discord Server](https://discord.gg/GP9DPSgeJq).
|
To chat with the community reach out on our [Discord Server](https://discord.gg/3J3GgnzpyT).
|
||||||
|
|
||||||
If you find an issue or have a request, see the [Getting Support](https://emsesp.org/Support/) section of the documentation. Note if you are using a non-BBQKees EMS gateway, you may need to contact the manufacturer for support.
|
If you find an issue or have a request, see [how to request support](https://emsesp.org/Support/) on how to submit a bug report or feature request.
|
||||||
|
|
||||||
## 🎥 **Live Demo**
|
## 🎥 **Live Demo**
|
||||||
|
|
||||||
To see a live demo go to [demo.emsesp.org](https://demo.emsesp.org). Pick a language and use any username and password to log in. Note whast you're seeing is static example data so not all features are operational.
|
For a live demo go to [demo.emsesp.org](https://demo.emsesp.org). Pick a language from the sign on page and log in with any username or password. Note not all features are operational as it's based on static data.
|
||||||
|
|
||||||
## 💖 **Contributors**
|
## 💖 **Contributors**
|
||||||
|
|
||||||
EMS-ESP is a project originally created by [proddy](https://github.com/proddy) and maintained by the ems-esp community.
|
EMS-ESP is a project created by [proddy](https://github.com/proddy) and owned and maintained by both [proddy](https://github.com/proddy) and [MichaelDvP](https://github.com/MichaelDvP) with support from [BBQKees Electronics](https://bbqkees-electronics.nl).
|
||||||
|
|
||||||
If you like **EMS-ESP**, please give it a ✨ on GitHub, or even better fork it and contribute. You can also offer a small donation. This is an open-source project maintained by volunteers, and your support is greatly appreciated.
|
If you like **EMS-ESP**, please give it a ✨ on GitHub, or even better fork it and contribute. You can also offer a small donation. This is an open-source project maintained by volunteers, and your support is greatly appreciated.
|
||||||
|
|
||||||
## 📦 **Building**
|
## 📦 **Building**
|
||||||
|
|
||||||
See the [Building the firmware](https://emsesp.org/Building) guide in the documentation for instructions on how to build EMS-ESP from this source code.
|
To build the web interface only, run `platformio run -e build_webUI`. This will install the necessary dependencies and build the web interface and also create the embedded code used need to build the firmware. You can run the web interface locally by going to the `interface` directory and running `pnpm standalone`.
|
||||||
|
|
||||||
|
To build the firmware, run `platformio run`. This will build the firmware for all ESP32 modules and place the binaries in the `build/firmware` folder. If you want to configure the build for a single platform create a local `pio_local.ni` file in the root directory (see example in `pio_local.ini_example`).
|
||||||
|
|
||||||
## 📢 **Libraries used**
|
## 📢 **Libraries used**
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
# Security Policy
|
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
|
||||||
|
|
||||||
Please report any security vulnerabilities using the [Contact Form](https://emsesp.org/About/#-contact).
|
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
},
|
},
|
||||||
"core": "esp32",
|
"core": "esp32",
|
||||||
"extra_flags": [
|
"extra_flags": [
|
||||||
"-DNO_TLS_SUPPORT",
|
"-DTASMOTA_SDK",
|
||||||
"-DARDUINO_LOLIN_C3_MINI",
|
"-DARDUINO_LOLIN_C3_MINI",
|
||||||
"-DARDUINO_USB_MODE=1",
|
"-DARDUINO_USB_MODE=1",
|
||||||
"-DARDUINO_USB_CDC_ON_BOOT=1"
|
"-DARDUINO_USB_CDC_ON_BOOT=1"
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"core": "esp32",
|
"core": "esp32",
|
||||||
"extra_flags": [
|
"extra_flags": [
|
||||||
"-DBOARD_HAS_PSRAM",
|
"-DBOARD_HAS_PSRAM",
|
||||||
"-DNO_TLS_SUPPORT",
|
"-DTASMOTA_SDK",
|
||||||
"-DARDUINO_USB_CDC_ON_BOOT=1",
|
"-DARDUINO_USB_CDC_ON_BOOT=1",
|
||||||
"-DARDUINO_USB_MODE=0"
|
"-DARDUINO_USB_MODE=0"
|
||||||
],
|
],
|
||||||
@@ -37,8 +37,8 @@
|
|||||||
"flash_size": "4MB",
|
"flash_size": "4MB",
|
||||||
"maximum_ram_size": 327680,
|
"maximum_ram_size": 327680,
|
||||||
"maximum_size": 4194304,
|
"maximum_size": 4194304,
|
||||||
"use_1200bps_touch": false,
|
"use_1200bps_touch": true,
|
||||||
"wait_for_upload_port": false,
|
"wait_for_upload_port": true,
|
||||||
"require_upload_port": true,
|
"require_upload_port": true,
|
||||||
"speed": 921600
|
"speed": 921600
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
"arduino",
|
"arduino",
|
||||||
"espidf"
|
"espidf"
|
||||||
],
|
],
|
||||||
"name": "Tasmota ESP32-S3 32M Flash OPI PSRAM, 4608KB Code/OTA, 2MB FS",
|
"name": "Espressif ESP32-S3 32M Flash OPI PSRAM, 4608KB Code/OTA, 2MB FS",
|
||||||
"upload": {
|
"upload": {
|
||||||
"flash_size": "32MB",
|
"flash_size": "32MB",
|
||||||
"maximum_ram_size": 327680,
|
"maximum_ram_size": 327680,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"build": {
|
"build": {
|
||||||
"core": "esp32",
|
"core": "esp32",
|
||||||
"extra_flags": "-DNO_TLS_SUPPORT",
|
"extra_flags": "-DTASMOTA_SDK",
|
||||||
"f_cpu": "240000000L",
|
"f_cpu": "240000000L",
|
||||||
"f_flash": "40000000L",
|
"f_flash": "40000000L",
|
||||||
"flash_mode": "dio",
|
"flash_mode": "dio",
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
"arduino",
|
"arduino",
|
||||||
"espidf"
|
"espidf"
|
||||||
],
|
],
|
||||||
"name": "Tasmota ESP32 16M Flash, 4608KB Code/OTA, 2MB FS",
|
"name": "Espressif ESP32 16M Flash, 4608KB Code/OTA, 2MB FS",
|
||||||
"upload": {
|
"upload": {
|
||||||
"flash_size": "16MB",
|
"flash_size": "16MB",
|
||||||
"maximum_ram_size": 327680,
|
"maximum_ram_size": 327680,
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
"arduino",
|
"arduino",
|
||||||
"espidf"
|
"espidf"
|
||||||
],
|
],
|
||||||
"name": "Tasmota ESP32 16M Flash DIO PSRAM, 4608KB Code/OTA, 2MB FS",
|
"name": "Espressif ESP32 16M Flash DIO PSRAM, 4608KB Code/OTA, 2MB FS",
|
||||||
"upload": {
|
"upload": {
|
||||||
"flash_size": "16MB",
|
"flash_size": "16MB",
|
||||||
"maximum_ram_size": 327680,
|
"maximum_ram_size": 327680,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"build": {
|
"build": {
|
||||||
"core": "esp32",
|
"core": "esp32",
|
||||||
"extra_flags": "-DNO_TLS_SUPPORT",
|
"extra_flags": "-DTASMOTA_SDK",
|
||||||
"f_cpu": "240000000L",
|
"f_cpu": "240000000L",
|
||||||
"f_flash": "40000000L",
|
"f_flash": "40000000L",
|
||||||
"flash_mode": "dio",
|
"flash_mode": "dio",
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
"build": {
|
"build": {
|
||||||
"core": "esp32",
|
"core": "esp32",
|
||||||
"extra_flags": [
|
"extra_flags": [
|
||||||
"-DNO_TLS_SUPPORT",
|
|
||||||
"-DARDUINO_XIAO_ESP32C6",
|
"-DARDUINO_XIAO_ESP32C6",
|
||||||
"-DARDUINO_USB_MODE=1",
|
"-DARDUINO_USB_MODE=1",
|
||||||
"-DARDUINO_USB_CDC_ON_BOOT=1"
|
"-DARDUINO_USB_CDC_ON_BOOT=1"
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"dictionaries": ["project-words"],
|
"dictionaries": ["project-words"],
|
||||||
"caseSensitive": false,
|
|
||||||
"ignorePaths": [
|
"ignorePaths": [
|
||||||
"node_modules",
|
"node_modules",
|
||||||
"compile_commands.json",
|
"compile_commands.json",
|
||||||
@@ -36,9 +35,6 @@
|
|||||||
"managed_components/**",
|
"managed_components/**",
|
||||||
"pnpm-*.yaml",
|
"pnpm-*.yaml",
|
||||||
"vite.config.ts",
|
"vite.config.ts",
|
||||||
"lib/esp32-psram/**",
|
"lib/esp32-psram/**"
|
||||||
"test/test_api/test_api.h",
|
|
||||||
"lib_standalone/**",
|
|
||||||
"lib/mbedtls_ssl/**"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -13,7 +13,7 @@ telegram_type_id,name,is_fetched
|
|||||||
0x19,UBAMonitorSlow,
|
0x19,UBAMonitorSlow,
|
||||||
0x1A,UBASetPoints,
|
0x1A,UBASetPoints,
|
||||||
0x1C,UBAMaintenanceStatus,
|
0x1C,UBAMaintenanceStatus,
|
||||||
0x1E,HydrTemp,
|
0x1E,WM10TempMessage,
|
||||||
0x23,JunkersSetMixer,fetched
|
0x23,JunkersSetMixer,fetched
|
||||||
0x27,UBASettingsWW,fetched
|
0x27,UBASettingsWW,fetched
|
||||||
0x28,WeatherComp,fetched
|
0x28,WeatherComp,fetched
|
||||||
@@ -72,12 +72,11 @@ telegram_type_id,name,is_fetched
|
|||||||
0xE6,UBAParametersPlus,fetched
|
0xE6,UBAParametersPlus,fetched
|
||||||
0xE9,UBAMonitorWWPlus,
|
0xE9,UBAMonitorWWPlus,
|
||||||
0xEA,UBAParameterWWPlus,fetched
|
0xEA,UBAParameterWWPlus,fetched
|
||||||
0xEB,PumpKick,fetched
|
|
||||||
0x0101,ISM1Set,fetched
|
0x0101,ISM1Set,fetched
|
||||||
0x0103,ISM1StatusMessage,fetched
|
0x0103,ISM1StatusMessage,fetched
|
||||||
0x0104,ISM2StatusMessage,
|
0x0104,ISM2StatusMessage,
|
||||||
0x010C,IPMStatusMessage,
|
0x010C,IPMStatusMessage,
|
||||||
0x011E,IPMTempMessage,
|
0x011E,JunkersDisp,fetched
|
||||||
0x012E,HPEnergy1,
|
0x012E,HPEnergy1,
|
||||||
0x013B,HPEnergy2,
|
0x013B,HPEnergy2,
|
||||||
0x0165,JunkersSet,
|
0x0165,JunkersSet,
|
||||||
@@ -113,9 +112,9 @@ telegram_type_id,name,is_fetched
|
|||||||
0x02A1,RC300Curves,
|
0x02A1,RC300Curves,
|
||||||
0x02A2,RC300Curves,
|
0x02A2,RC300Curves,
|
||||||
0x02A5,RC300Monitor,fetched
|
0x02A5,RC300Monitor,fetched
|
||||||
0x02A6,CRFMonitor,
|
0x02A6,RC300Monitor,
|
||||||
0x02A7,RC300Monitor,
|
0x02A7,RC300Monitor,
|
||||||
0x02A8,CRFMonitor,
|
0x02A8,RC300Monitor,
|
||||||
0x02A9,RC300Monitor,
|
0x02A9,RC300Monitor,
|
||||||
0x02AA,RC300Monitor,
|
0x02AA,RC300Monitor,
|
||||||
0x02AB,RC300Monitor,
|
0x02AB,RC300Monitor,
|
||||||
@@ -198,7 +197,7 @@ telegram_type_id,name,is_fetched
|
|||||||
0x04A2,HpInput,fetched
|
0x04A2,HpInput,fetched
|
||||||
0x04A5,HPFan,fetched
|
0x04A5,HPFan,fetched
|
||||||
0x04A7,HPPowerLimit,fetched
|
0x04A7,HPPowerLimit,fetched
|
||||||
0x04AA,HPPower,
|
0x04AA,HPPower2,fetched
|
||||||
0x04AE,HPEnergy,fetched
|
0x04AE,HPEnergy,fetched
|
||||||
0x04AF,HPMeters,fetched
|
0x04AF,HPMeters,fetched
|
||||||
0x055C,VentilationSet,fetched
|
0x055C,VentilationSet,fetched
|
||||||
|
|||||||
|
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"adapter": "react",
|
"adapter": "react",
|
||||||
"baseLocale": "pl",
|
"baseLocale": "pl",
|
||||||
"$schema": "https://unpkg.com/typesafe-i18n@5.27.1/schema/typesafe-i18n.json"
|
"$schema": "https://unpkg.com/typesafe-i18n@5.26.2/schema/typesafe-i18n.json"
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,9 @@
|
|||||||
// @ts-check
|
// @ts-check
|
||||||
import eslint from '@eslint/js';
|
import eslint from '@eslint/js';
|
||||||
import prettierConfig from 'eslint-config-prettier';
|
import prettierConfig from 'eslint-config-prettier';
|
||||||
import { defineConfig } from 'eslint/config';
|
|
||||||
import tseslint from 'typescript-eslint';
|
import tseslint from 'typescript-eslint';
|
||||||
|
|
||||||
export default defineConfig(
|
export default tseslint.config(
|
||||||
eslint.configs.recommended,
|
eslint.configs.recommended,
|
||||||
...tseslint.configs.recommendedTypeChecked,
|
...tseslint.configs.recommendedTypeChecked,
|
||||||
prettierConfig,
|
prettierConfig,
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
"dev": "vite dev",
|
"dev": "vite dev",
|
||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
"build-hosted": "typesafe-i18n --no-watch && vite build --mode hosted",
|
"build-hosted": "typesafe-i18n && vite build --mode hosted",
|
||||||
"mock-rest": "bun --watch ../mock-api/restServer.ts",
|
"mock-rest": "bun --watch ../mock-api/restServer.ts",
|
||||||
"preview-standalone": "typesafe-i18n --no-watch && vite build && concurrently -c \"auto\" \"pnpm:mock-rest\" \"vite preview\"",
|
"preview-standalone": "typesafe-i18n --no-watch && vite build && concurrently -c \"auto\" \"pnpm:mock-rest\" \"vite preview\"",
|
||||||
"standalone": "concurrently -c \"auto\" \"typesafe-i18n\" \"pnpm:mock-rest\" \"vite dev\"",
|
"standalone": "concurrently -c \"auto\" \"typesafe-i18n\" \"pnpm:mock-rest\" \"vite dev\"",
|
||||||
@@ -26,45 +26,46 @@
|
|||||||
"@alova/adapter-xhr": "2.3.1",
|
"@alova/adapter-xhr": "2.3.1",
|
||||||
"@emotion/react": "^11.14.0",
|
"@emotion/react": "^11.14.0",
|
||||||
"@emotion/styled": "^11.14.1",
|
"@emotion/styled": "^11.14.1",
|
||||||
"@mui/icons-material": "^7.3.9",
|
"@mui/icons-material": "^7.3.6",
|
||||||
"@mui/material": "^7.3.9",
|
"@mui/material": "^7.3.6",
|
||||||
"@preact/compat": "^18.3.2",
|
"@preact/compat": "^18.3.1",
|
||||||
"@table-library/react-table-library": "4.1.15",
|
"@table-library/react-table-library": "4.1.15",
|
||||||
"alova": "^3.5.1",
|
"alova": "3.4.1",
|
||||||
"async-validator": "^4.2.5",
|
"async-validator": "^4.2.5",
|
||||||
"etag": "^1.8.1",
|
"etag": "^1.8.1",
|
||||||
"formidable": "^3.5.4",
|
"formidable": "^3.5.4",
|
||||||
"jwt-decode": "^4.0.0",
|
"jwt-decode": "^4.0.0",
|
||||||
"magic-string": "^0.30.21",
|
"magic-string": "^0.30.21",
|
||||||
"mime-types": "^3.0.2",
|
"mime-types": "^3.0.2",
|
||||||
"preact": "^10.29.0",
|
"preact": "^10.28.1",
|
||||||
"react": "^19.2.4",
|
"react": "^19.2.3",
|
||||||
"react-dom": "^19.2.4",
|
"react-dom": "^19.2.3",
|
||||||
"react-icons": "^5.6.0",
|
"react-icons": "^5.5.0",
|
||||||
"react-router": "^7.13.1",
|
"react-router": "^7.11.0",
|
||||||
"react-toastify": "^11.0.5",
|
"react-toastify": "^11.0.5",
|
||||||
"typesafe-i18n": "^5.27.1",
|
"typesafe-i18n": "^5.26.2",
|
||||||
"typescript": "^5.9.3"
|
"typescript": "^5.9.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.29.0",
|
"@babel/core": "^7.28.5",
|
||||||
"@eslint/js": "^10.0.1",
|
"@eslint/js": "^9.39.2",
|
||||||
"@preact/compat": "^18.3.2",
|
"@preact/compat": "^18.3.1",
|
||||||
"@preact/preset-vite": "^2.10.5",
|
"@preact/preset-vite": "^2.10.2",
|
||||||
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
"@trivago/prettier-plugin-sort-imports": "^6.0.0",
|
||||||
"@types/node": "^25.5.0",
|
"@types/node": "^25.0.3",
|
||||||
"@types/react": "^19.2.14",
|
"@types/react": "^19.2.7",
|
||||||
"@types/react-dom": "^19.2.3",
|
"@types/react-dom": "^19.2.3",
|
||||||
"axe-core": "^4.11.1",
|
"axe-core": "^4.11.0",
|
||||||
"concurrently": "^9.2.1",
|
"concurrently": "^9.2.1",
|
||||||
"eslint": "^10.1.0",
|
"eslint": "^9.39.2",
|
||||||
"eslint-config-prettier": "^10.1.8",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"prettier": "^3.8.1",
|
"prettier": "^3.7.4",
|
||||||
"rollup-plugin-visualizer": "^7.0.1",
|
"rollup-plugin-visualizer": "^6.0.5",
|
||||||
"terser": "^5.46.1",
|
"terser": "^5.44.1",
|
||||||
"typescript-eslint": "^8.57.1",
|
"typescript-eslint": "^8.51.0",
|
||||||
"vite": "^8.0.1",
|
"vite": "^7.3.0",
|
||||||
"vite-plugin-imagemin": "^0.6.1"
|
"vite-plugin-imagemin": "^0.6.1",
|
||||||
|
"vite-tsconfig-paths": "^6.0.3"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@10.32.1+sha512.a706938f0e89ac1456b6563eab4edf1d1faf3368d1191fc5c59790e96dc918e4456ab2e67d613de1043d2e8c81f87303e6b40d4ffeca9df15ef1ad567348f2be"
|
"packageManager": "pnpm@10.27.0+sha512.72d699da16b1179c14ba9e64dc71c9a40988cbdc65c264cb0e489db7de917f20dcf4d64d8723625f2969ba52d4b7e2a1170682d9ac2a5dcaeaab732b7e16f04a"
|
||||||
}
|
}
|
||||||
|
|||||||
6569
interface/pnpm-lock.yaml
generated
6569
interface/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -310,15 +310,13 @@ const CustomEntities = () => {
|
|||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</Cell>
|
</Cell>
|
||||||
<Cell>{ei.ram > 0 ? '' : showHex(ei.device_id as number, 2)}</Cell>
|
|
||||||
<Cell>{ei.ram > 0 ? '' : showHex(ei.type_id as number, 3)}</Cell>
|
|
||||||
<Cell>{ei.ram > 0 ? '' : ei.offset}</Cell>
|
|
||||||
<Cell>
|
<Cell>
|
||||||
{ei.ram === 1
|
{ei.ram === 1 ? '' : showHex(ei.device_id as number, 2)}
|
||||||
? 'RAM'
|
</Cell>
|
||||||
: ei.ram === 2
|
<Cell>{ei.ram === 1 ? '' : showHex(ei.type_id as number, 3)}</Cell>
|
||||||
? 'NVS'
|
<Cell>{ei.ram === 1 ? '' : ei.offset}</Cell>
|
||||||
: DeviceValueTypeNames[ei.value_type]}
|
<Cell>
|
||||||
|
{ei.ram === 1 ? 'RAM' : DeviceValueTypeNames[ei.value_type]}
|
||||||
</Cell>
|
</Cell>
|
||||||
<Cell>{formatValue(ei.value, ei.uom)}</Cell>
|
<Cell>{formatValue(ei.value, ei.uom)}</Cell>
|
||||||
</Row>
|
</Row>
|
||||||
|
|||||||
@@ -205,10 +205,9 @@ const CustomEntitiesDialog = ({
|
|||||||
>
|
>
|
||||||
<MenuItem value={0}>EMS-{LL.VALUE(1)}</MenuItem>
|
<MenuItem value={0}>EMS-{LL.VALUE(1)}</MenuItem>
|
||||||
<MenuItem value={1}>RAM-{LL.VALUE(1)}</MenuItem>
|
<MenuItem value={1}>RAM-{LL.VALUE(1)}</MenuItem>
|
||||||
<MenuItem value={2}>NVS-{LL.VALUE(1)}</MenuItem>
|
|
||||||
</TextField>
|
</TextField>
|
||||||
</Grid>
|
</Grid>
|
||||||
{editItem.ram > 0 && (
|
{editItem.ram === 1 && (
|
||||||
<>
|
<>
|
||||||
<Grid>
|
<Grid>
|
||||||
<TextField
|
<TextField
|
||||||
|
|||||||
@@ -111,14 +111,13 @@ const Customizations = () => {
|
|||||||
const [selectedDeviceTypeNameURL, setSelectedDeviceTypeNameURL] =
|
const [selectedDeviceTypeNameURL, setSelectedDeviceTypeNameURL] =
|
||||||
useState<string>(''); // needed for API URL
|
useState<string>(''); // needed for API URL
|
||||||
const [selectedDeviceName, setSelectedDeviceName] = useState<string>('');
|
const [selectedDeviceName, setSelectedDeviceName] = useState<string>('');
|
||||||
const [selectedDeviceBrand, setSelectedDeviceBrand] = useState<string>('');
|
|
||||||
|
|
||||||
const { send: sendResetCustomizations } = useRequest(resetCustomizations(), {
|
const { send: sendResetCustomizations } = useRequest(resetCustomizations(), {
|
||||||
immediate: false
|
immediate: false
|
||||||
});
|
});
|
||||||
|
|
||||||
const { send: sendDeviceName } = useRequest(
|
const { send: sendDeviceName } = useRequest(
|
||||||
(data: { id: number; name: string; brand: string }) => writeDeviceName(data),
|
(data: { id: number; name: string }) => writeDeviceName(data),
|
||||||
{
|
{
|
||||||
immediate: false
|
immediate: false
|
||||||
}
|
}
|
||||||
@@ -268,7 +267,6 @@ const Customizations = () => {
|
|||||||
if (device) {
|
if (device) {
|
||||||
setSelectedDeviceTypeNameURL(device.url || '');
|
setSelectedDeviceTypeNameURL(device.url || '');
|
||||||
setSelectedDeviceName(device.n);
|
setSelectedDeviceName(device.n);
|
||||||
setSelectedDeviceBrand(device.b);
|
|
||||||
}
|
}
|
||||||
setNumChanges(0);
|
setNumChanges(0);
|
||||||
setRestartNeeded(false);
|
setRestartNeeded(false);
|
||||||
@@ -444,11 +442,7 @@ const Customizations = () => {
|
|||||||
}, [devices, deviceEntities, selectedDevice, sendCustomizationEntities, LL]);
|
}, [devices, deviceEntities, selectedDevice, sendCustomizationEntities, LL]);
|
||||||
|
|
||||||
const renameDevice = useCallback(async () => {
|
const renameDevice = useCallback(async () => {
|
||||||
await sendDeviceName({
|
await sendDeviceName({ id: selectedDevice, name: selectedDeviceName })
|
||||||
id: selectedDevice,
|
|
||||||
name: selectedDeviceName,
|
|
||||||
brand: selectedDeviceBrand
|
|
||||||
})
|
|
||||||
.then(() => {
|
.then(() => {
|
||||||
toast.success(LL.UPDATED_OF(LL.NAME(1)));
|
toast.success(LL.UPDATED_OF(LL.NAME(1)));
|
||||||
})
|
})
|
||||||
@@ -459,14 +453,7 @@ const Customizations = () => {
|
|||||||
setRename(false);
|
setRename(false);
|
||||||
await fetchCoreData();
|
await fetchCoreData();
|
||||||
});
|
});
|
||||||
}, [
|
}, [selectedDevice, selectedDeviceName, sendDeviceName, LL, fetchCoreData]);
|
||||||
selectedDevice,
|
|
||||||
selectedDeviceName,
|
|
||||||
selectedDeviceBrand,
|
|
||||||
sendDeviceName,
|
|
||||||
LL,
|
|
||||||
fetchCoreData
|
|
||||||
]);
|
|
||||||
|
|
||||||
const renderDeviceList = () => (
|
const renderDeviceList = () => (
|
||||||
<>
|
<>
|
||||||
@@ -475,26 +462,15 @@ const Customizations = () => {
|
|||||||
</Box>
|
</Box>
|
||||||
<Box display="flex" flexWrap="wrap" alignItems="center" gap={2}>
|
<Box display="flex" flexWrap="wrap" alignItems="center" gap={2}>
|
||||||
{rename ? (
|
{rename ? (
|
||||||
<>
|
|
||||||
<TextField
|
<TextField
|
||||||
name="device"
|
name="device"
|
||||||
label={LL.EMS_DEVICE()}
|
label={LL.EMS_DEVICE()}
|
||||||
style={{ minWidth: '48%' }}
|
fullWidth
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
value={selectedDeviceName}
|
value={selectedDeviceName}
|
||||||
onChange={(e) => setSelectedDeviceName(e.target.value)}
|
onChange={(e) => setSelectedDeviceName(e.target.value)}
|
||||||
margin="normal"
|
margin="normal"
|
||||||
/>
|
/>
|
||||||
<TextField
|
|
||||||
name="brand"
|
|
||||||
label={LL.BRAND()}
|
|
||||||
style={{ minWidth: '48%' }}
|
|
||||||
variant="outlined"
|
|
||||||
value={selectedDeviceBrand}
|
|
||||||
onChange={(e) => setSelectedDeviceBrand(e.target.value)}
|
|
||||||
margin="normal"
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
) : (
|
) : (
|
||||||
<TextField
|
<TextField
|
||||||
name="device"
|
name="device"
|
||||||
@@ -812,12 +788,10 @@ const Customizations = () => {
|
|||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
||||||
return restarting ? (
|
return (
|
||||||
<SystemMonitor />
|
|
||||||
) : (
|
|
||||||
<SectionContent>
|
<SectionContent>
|
||||||
{blocker ? <BlockNavigation blocker={blocker} /> : null}
|
{blocker ? <BlockNavigation blocker={blocker} /> : null}
|
||||||
{renderContent()}
|
{restarting ? <SystemMonitor /> : renderContent()}
|
||||||
{selectedDeviceEntity && (
|
{selectedDeviceEntity && (
|
||||||
<SettingsCustomizationsDialog
|
<SettingsCustomizationsDialog
|
||||||
open={dialogOpen}
|
open={dialogOpen}
|
||||||
|
|||||||
@@ -263,17 +263,7 @@ const Dashboard = memo(() => {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{!data.connected && (
|
{!data.connected && (
|
||||||
<MessageBox level="error" message={LL.EMS_BUS_WARNING() + '.'}>
|
<MessageBox level="error" message={LL.EMS_BUS_WARNING()} />
|
||||||
(
|
|
||||||
<Link
|
|
||||||
target="_blank"
|
|
||||||
to="https://docs.emsesp.org/Troubleshooting#ems-bus-is-not-connecting"
|
|
||||||
style={{ color: 'white' }}
|
|
||||||
>
|
|
||||||
{LL.ONLINE_HELP()}
|
|
||||||
</Link>
|
|
||||||
)
|
|
||||||
</MessageBox>
|
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{data.connected && data.nodes.length > 0 && !hasFavEntities && (
|
{data.connected && data.nodes.length > 0 && !hasFavEntities && (
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import {
|
|||||||
useState
|
useState
|
||||||
} from 'react';
|
} from 'react';
|
||||||
import { IconContext } from 'react-icons';
|
import { IconContext } from 'react-icons';
|
||||||
import { Link, useNavigate } from 'react-router';
|
import { useNavigate } from 'react-router';
|
||||||
import { toast } from 'react-toastify';
|
import { toast } from 'react-toastify';
|
||||||
|
|
||||||
import CommentsDisabledOutlinedIcon from '@mui/icons-material/CommentsDisabledOutlined';
|
import CommentsDisabledOutlinedIcon from '@mui/icons-material/CommentsDisabledOutlined';
|
||||||
@@ -534,17 +534,7 @@ const Devices = memo(() => {
|
|||||||
const renderCoreData = () => (
|
const renderCoreData = () => (
|
||||||
<>
|
<>
|
||||||
{!coreData.connected ? (
|
{!coreData.connected ? (
|
||||||
<MessageBox level="error" message={LL.EMS_BUS_WARNING() + '.'}>
|
<MessageBox level="error" message={LL.EMS_BUS_WARNING()} />
|
||||||
(
|
|
||||||
<Link
|
|
||||||
target="_blank"
|
|
||||||
to="https://docs.emsesp.org/Troubleshooting#ems-bus-is-not-connecting"
|
|
||||||
style={{ color: 'white' }}
|
|
||||||
>
|
|
||||||
{LL.ONLINE_HELP()}
|
|
||||||
</Link>
|
|
||||||
)
|
|
||||||
</MessageBox>
|
|
||||||
) : (
|
) : (
|
||||||
<Box justifyContent="center" flexDirection="column">
|
<Box justifyContent="center" flexDirection="column">
|
||||||
<IconContext.Provider
|
<IconContext.Provider
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ const HelpComponent = () => {
|
|||||||
label: () => LL.HELP_INFORMATION_1()
|
label: () => LL.HELP_INFORMATION_1()
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
href: 'https://discord.gg/GP9DPSgeJq',
|
href: 'https://discord.gg/3J3GgnzpyT',
|
||||||
icon: <CommentIcon />,
|
icon: <CommentIcon />,
|
||||||
label: () => LL.HELP_INFORMATION_2()
|
label: () => LL.HELP_INFORMATION_2()
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ const MIN_ID = -100;
|
|||||||
const MAX_ID = 100;
|
const MAX_ID = 100;
|
||||||
const ICON_SIZE = 16;
|
const ICON_SIZE = 16;
|
||||||
const SCHEDULE_FLAG_THRESHOLD = 127;
|
const SCHEDULE_FLAG_THRESHOLD = 127;
|
||||||
const FLAG_ALL_DAYS = 127;
|
|
||||||
const REFERENCE_YEAR = 2017;
|
const REFERENCE_YEAR = 2017;
|
||||||
const REFERENCE_MONTH = '01';
|
const REFERENCE_MONTH = '01';
|
||||||
const LOG_2 = Math.log(2);
|
const LOG_2 = Math.log(2);
|
||||||
@@ -52,7 +51,7 @@ const WEEK_DAYS = [1, 2, 3, 4, 5, 6, 7] as const;
|
|||||||
const DEFAULT_SCHEDULE_ITEM: Omit<ScheduleItem, 'id' | 'o_id'> = {
|
const DEFAULT_SCHEDULE_ITEM: Omit<ScheduleItem, 'id' | 'o_id'> = {
|
||||||
active: false,
|
active: false,
|
||||||
deleted: false,
|
deleted: false,
|
||||||
flags: FLAG_ALL_DAYS,
|
flags: ScheduleFlag.SCHEDULE_DAY,
|
||||||
time: '',
|
time: '',
|
||||||
cmd: '',
|
cmd: '',
|
||||||
value: '',
|
value: '',
|
||||||
|
|||||||
@@ -33,8 +33,7 @@ import type { ScheduleItem } from './types';
|
|||||||
|
|
||||||
// Constants
|
// Constants
|
||||||
const FLAG_MASK_127 = 127;
|
const FLAG_MASK_127 = 127;
|
||||||
const SCHEDULE_TYPE_THRESHOLD = 127;
|
const SCHEDULE_TYPE_THRESHOLD = 128;
|
||||||
const FLAG_ALL_DAYS = 127;
|
|
||||||
const DEFAULT_TIME = '00:00';
|
const DEFAULT_TIME = '00:00';
|
||||||
const TYPOGRAPHY_FONT_SIZE = 10;
|
const TYPOGRAPHY_FONT_SIZE = 10;
|
||||||
|
|
||||||
@@ -105,7 +104,7 @@ const SchedulerDialog = ({
|
|||||||
// 130 is on condition
|
// 130 is on condition
|
||||||
// 132 is immediate
|
// 132 is immediate
|
||||||
setScheduleType(
|
setScheduleType(
|
||||||
selectedItem.flags <= SCHEDULE_TYPE_THRESHOLD
|
selectedItem.flags < SCHEDULE_TYPE_THRESHOLD
|
||||||
? ScheduleFlag.SCHEDULE_DAY
|
? ScheduleFlag.SCHEDULE_DAY
|
||||||
: selectedItem.flags
|
: selectedItem.flags
|
||||||
);
|
);
|
||||||
@@ -182,7 +181,7 @@ const SchedulerDialog = ({
|
|||||||
setScheduleType(flag);
|
setScheduleType(flag);
|
||||||
// wipe the time field when changing the schedule type
|
// wipe the time field when changing the schedule type
|
||||||
// set the flags based on type
|
// set the flags based on type
|
||||||
const newFlags = flag === ScheduleFlag.SCHEDULE_DAY ? FLAG_ALL_DAYS : flag;
|
const newFlags = flag === ScheduleFlag.SCHEDULE_DAY ? 0 : flag;
|
||||||
setEditItem((prev) => ({ ...prev, time: '', flags: newFlags }));
|
setEditItem((prev) => ({ ...prev, time: '', flags: newFlags }));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -191,8 +190,7 @@ const SchedulerDialog = ({
|
|||||||
|
|
||||||
const handleDOWChange = useCallback(
|
const handleDOWChange = useCallback(
|
||||||
(_event: React.SyntheticEvent<HTMLElement>, flags: string[]) => {
|
(_event: React.SyntheticEvent<HTMLElement>, flags: string[]) => {
|
||||||
const newFlags =
|
const newFlags = getFlagDOWnumber(flags);
|
||||||
getFlagDOWnumber(flags) === 0 ? FLAG_ALL_DAYS : getFlagDOWnumber(flags);
|
|
||||||
setEditItem((prev) => ({ ...prev, flags: newFlags }));
|
setEditItem((prev) => ({ ...prev, flags: newFlags }));
|
||||||
},
|
},
|
||||||
[getFlagDOWnumber]
|
[getFlagDOWnumber]
|
||||||
|
|||||||
@@ -43,16 +43,6 @@ export interface Settings {
|
|||||||
modbus_port: number;
|
modbus_port: number;
|
||||||
modbus_max_clients: number;
|
modbus_max_clients: number;
|
||||||
modbus_timeout: number;
|
modbus_timeout: number;
|
||||||
email_enabled: boolean;
|
|
||||||
email_ssl?: boolean;
|
|
||||||
email_starttls?: boolean;
|
|
||||||
email_server: string;
|
|
||||||
email_port: number;
|
|
||||||
email_login: string;
|
|
||||||
email_pass: string;
|
|
||||||
email_sender: string;
|
|
||||||
email_recp: string;
|
|
||||||
email_subject: string;
|
|
||||||
developer_mode: boolean;
|
developer_mode: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -206,7 +196,7 @@ export enum DeviceValueUOM {
|
|||||||
MBAR,
|
MBAR,
|
||||||
LH,
|
LH,
|
||||||
CTKWH,
|
CTKWH,
|
||||||
HERTZ
|
HZ
|
||||||
}
|
}
|
||||||
|
|
||||||
export const DeviceValueUOM_s = [
|
export const DeviceValueUOM_s = [
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ import {
|
|||||||
FormLoader,
|
FormLoader,
|
||||||
MessageBox,
|
MessageBox,
|
||||||
SectionContent,
|
SectionContent,
|
||||||
ValidatedPasswordField,
|
|
||||||
ValidatedTextField,
|
ValidatedTextField,
|
||||||
useLayoutTitle
|
useLayoutTitle
|
||||||
} from 'components';
|
} from 'components';
|
||||||
@@ -352,156 +351,6 @@ const ApplicationSettings = () => {
|
|||||||
</Grid>
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
)}
|
)}
|
||||||
<Typography color="secondary">eMail</Typography>
|
|
||||||
<BlockFormControlLabel
|
|
||||||
control={
|
|
||||||
<Checkbox
|
|
||||||
checked={data.email_enabled}
|
|
||||||
onChange={updateFormValue}
|
|
||||||
name="email_enabled"
|
|
||||||
disabled={!hardwareData.psram}
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
label={
|
|
||||||
<Typography color={!hardwareData.psram ? 'grey' : 'default'}>
|
|
||||||
Enable eMail notification
|
|
||||||
{!hardwareData.psram && (
|
|
||||||
<Typography variant="caption">
|
|
||||||
({LL.IS_REQUIRED('PSRAM')})
|
|
||||||
</Typography>
|
|
||||||
)}
|
|
||||||
</Typography>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
{data.email_enabled && (
|
|
||||||
<>
|
|
||||||
<Grid
|
|
||||||
container
|
|
||||||
spacing={2}
|
|
||||||
direction="row"
|
|
||||||
justifyContent="flex-start"
|
|
||||||
alignItems="flex-start"
|
|
||||||
>
|
|
||||||
<Grid>
|
|
||||||
<ValidatedTextField
|
|
||||||
fieldErrors={fieldErrors || {}}
|
|
||||||
name="email_server"
|
|
||||||
label="SMTP Server"
|
|
||||||
variant="outlined"
|
|
||||||
value={data.email_server}
|
|
||||||
onChange={updateFormValue}
|
|
||||||
margin="normal"
|
|
||||||
/>
|
|
||||||
</Grid>
|
|
||||||
<Grid>
|
|
||||||
<ValidatedTextField
|
|
||||||
fieldErrors={fieldErrors || {}}
|
|
||||||
sx={{ width: '12ch' }}
|
|
||||||
name="email_port"
|
|
||||||
variant="outlined"
|
|
||||||
label="Port"
|
|
||||||
value={numberValue(data.email_port)}
|
|
||||||
type="number"
|
|
||||||
onChange={updateFormValue}
|
|
||||||
margin="normal"
|
|
||||||
/>
|
|
||||||
</Grid>
|
|
||||||
<Grid size={4} mt={!data.email_ssl && !data.email_starttls ? 0 : 3}>
|
|
||||||
{!data.email_starttls && (
|
|
||||||
<BlockFormControlLabel
|
|
||||||
sx={{ width: '12ch' }}
|
|
||||||
control={
|
|
||||||
<Checkbox
|
|
||||||
checked={data.email_ssl}
|
|
||||||
onChange={updateFormValue}
|
|
||||||
name="email_ssl"
|
|
||||||
disabled={
|
|
||||||
data.email_starttls || data.email_ssl === undefined
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
label="SSL/TLS"
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{!data.email_ssl && (
|
|
||||||
<BlockFormControlLabel
|
|
||||||
sx={{ width: '12ch' }}
|
|
||||||
control={
|
|
||||||
<Checkbox
|
|
||||||
checked={data.email_starttls}
|
|
||||||
onChange={updateFormValue}
|
|
||||||
name="email_starttls"
|
|
||||||
disabled={
|
|
||||||
data.email_ssl || data.email_starttls === undefined
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
label="STARTTLS"
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</Grid>
|
|
||||||
</Grid>
|
|
||||||
<Grid container spacing={2} rowSpacing={0}>
|
|
||||||
<Grid>
|
|
||||||
<ValidatedTextField
|
|
||||||
fieldErrors={fieldErrors || {}}
|
|
||||||
name="email_login"
|
|
||||||
label="Login"
|
|
||||||
variant="outlined"
|
|
||||||
value={data.email_login}
|
|
||||||
onChange={updateFormValue}
|
|
||||||
margin="normal"
|
|
||||||
/>
|
|
||||||
</Grid>
|
|
||||||
<Grid>
|
|
||||||
<ValidatedPasswordField
|
|
||||||
fieldErrors={fieldErrors || {}}
|
|
||||||
name="email_pass"
|
|
||||||
label="Password"
|
|
||||||
variant="outlined"
|
|
||||||
value={data.email_pass}
|
|
||||||
onChange={updateFormValue}
|
|
||||||
margin="normal"
|
|
||||||
/>
|
|
||||||
</Grid>
|
|
||||||
</Grid>
|
|
||||||
<Grid container spacing={2} rowSpacing={0}>
|
|
||||||
<Grid>
|
|
||||||
<ValidatedTextField
|
|
||||||
fieldErrors={fieldErrors || {}}
|
|
||||||
name="email_sender"
|
|
||||||
label="From"
|
|
||||||
variant="outlined"
|
|
||||||
value={data.email_sender}
|
|
||||||
onChange={updateFormValue}
|
|
||||||
margin="normal"
|
|
||||||
/>
|
|
||||||
</Grid>
|
|
||||||
<Grid>
|
|
||||||
<ValidatedTextField
|
|
||||||
fieldErrors={fieldErrors || {}}
|
|
||||||
name="email_recp"
|
|
||||||
label="To"
|
|
||||||
variant="outlined"
|
|
||||||
value={data.email_recp}
|
|
||||||
onChange={updateFormValue}
|
|
||||||
margin="normal"
|
|
||||||
/>
|
|
||||||
</Grid>
|
|
||||||
<Grid>
|
|
||||||
<ValidatedTextField
|
|
||||||
fieldErrors={fieldErrors || {}}
|
|
||||||
name="email_subject"
|
|
||||||
label="Subject"
|
|
||||||
variant="outlined"
|
|
||||||
value={data.email_subject}
|
|
||||||
onChange={updateFormValue}
|
|
||||||
margin="normal"
|
|
||||||
/>
|
|
||||||
</Grid>
|
|
||||||
</Grid>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
<Typography sx={{ pb: 1, pt: 2 }} variant="h6" color="primary">
|
<Typography sx={{ pb: 1, pt: 2 }} variant="h6" color="primary">
|
||||||
{LL.SENSORS()}
|
{LL.SENSORS()}
|
||||||
</Typography>
|
</Typography>
|
||||||
@@ -640,25 +489,17 @@ const ApplicationSettings = () => {
|
|||||||
name="board_profile"
|
name="board_profile"
|
||||||
label={LL.BOARD_PROFILE()}
|
label={LL.BOARD_PROFILE()}
|
||||||
value={data.board_profile}
|
value={data.board_profile}
|
||||||
disabled={processingBoard}
|
disabled={processingBoard || hardwareData.model.startsWith('BBQKees')}
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
onChange={changeBoardProfile}
|
onChange={changeBoardProfile}
|
||||||
margin="normal"
|
margin="normal"
|
||||||
select
|
select
|
||||||
>
|
>
|
||||||
{hardwareData.model.startsWith('BBQKees') ? (
|
{boardProfileItems}
|
||||||
<MenuItem key={hardwareData.board} value={hardwareData.board}>
|
<Divider />
|
||||||
{BOARD_PROFILES[hardwareData.board as BoardProfileKey]}
|
|
||||||
</MenuItem>
|
|
||||||
) : (
|
|
||||||
boardProfileItems
|
|
||||||
)}
|
|
||||||
{(data.board_profile === 'CUSTOM' || data.developer_mode) && <Divider />}
|
|
||||||
{(data.board_profile === 'CUSTOM' || data.developer_mode) && (
|
|
||||||
<MenuItem key={'CUSTOM'} value={'CUSTOM'}>
|
<MenuItem key={'CUSTOM'} value={'CUSTOM'}>
|
||||||
{LL.CUSTOM()}…
|
{LL.CUSTOM()}…
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
)}
|
|
||||||
</TextField>
|
</TextField>
|
||||||
{data.board_profile === 'CUSTOM' && (
|
{data.board_profile === 'CUSTOM' && (
|
||||||
<>
|
<>
|
||||||
@@ -1055,12 +896,10 @@ const ApplicationSettings = () => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
return restarting ? (
|
return (
|
||||||
<SystemMonitor />
|
|
||||||
) : (
|
|
||||||
<SectionContent>
|
<SectionContent>
|
||||||
{blocker ? <BlockNavigation blocker={blocker} /> : null}
|
{blocker ? <BlockNavigation blocker={blocker} /> : null}
|
||||||
{content()}
|
{restarting ? <SystemMonitor /> : content()}
|
||||||
</SectionContent>
|
</SectionContent>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import { useI18nContext } from 'i18n/i18n-react';
|
|||||||
import { saveFile } from 'utils';
|
import { saveFile } from 'utils';
|
||||||
|
|
||||||
interface DownloadButton {
|
interface DownloadButton {
|
||||||
|
key: string;
|
||||||
type: string;
|
type: string;
|
||||||
label: string | number;
|
label: string | number;
|
||||||
isGridButton: boolean;
|
isGridButton: boolean;
|
||||||
@@ -65,31 +66,31 @@ const DownloadUpload = () => {
|
|||||||
const downloadButtons: DownloadButton[] = useMemo(
|
const downloadButtons: DownloadButton[] = useMemo(
|
||||||
() => [
|
() => [
|
||||||
{
|
{
|
||||||
|
key: 'settings',
|
||||||
type: 'settings',
|
type: 'settings',
|
||||||
label: LL.SETTINGS_OF(LL.APPLICATION()),
|
label: LL.SETTINGS_OF(LL.APPLICATION()),
|
||||||
isGridButton: true
|
isGridButton: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
key: 'customizations',
|
||||||
type: 'customizations',
|
type: 'customizations',
|
||||||
label: LL.CUSTOMIZATIONS(),
|
label: LL.CUSTOMIZATIONS(),
|
||||||
isGridButton: true
|
isGridButton: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
key: 'entities',
|
||||||
type: 'entities',
|
type: 'entities',
|
||||||
label: LL.CUSTOM_ENTITIES(0),
|
label: LL.CUSTOM_ENTITIES(0),
|
||||||
isGridButton: true
|
isGridButton: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
key: 'schedule',
|
||||||
type: 'schedule',
|
type: 'schedule',
|
||||||
label: LL.SCHEDULE(0),
|
label: LL.SCHEDULE(0),
|
||||||
isGridButton: true
|
isGridButton: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'systembackup',
|
key: 'allvalues',
|
||||||
label: LL.DOWNLOAD_SYSTEM_BACKUP(),
|
|
||||||
isGridButton: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'allvalues',
|
type: 'allvalues',
|
||||||
label: LL.ALLVALUES(),
|
label: LL.ALLVALUES(),
|
||||||
isGridButton: false
|
isGridButton: false
|
||||||
@@ -132,7 +133,7 @@ const DownloadUpload = () => {
|
|||||||
|
|
||||||
<Grid container spacing={2}>
|
<Grid container spacing={2}>
|
||||||
{gridButtons.map((button) => (
|
{gridButtons.map((button) => (
|
||||||
<Grid key={button.type}>
|
<Grid key={button.key}>
|
||||||
<Button
|
<Button
|
||||||
startIcon={<DownloadIcon />}
|
startIcon={<DownloadIcon />}
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
|
|||||||
@@ -345,7 +345,7 @@ const MqttSettings = () => {
|
|||||||
</Grid>
|
</Grid>
|
||||||
)}
|
)}
|
||||||
</Grid>
|
</Grid>
|
||||||
{/* <Grid container spacing={2} rowSpacing={0}> */}
|
<Grid container spacing={2} rowSpacing={0}>
|
||||||
<Grid>
|
<Grid>
|
||||||
<BlockFormControlLabel
|
<BlockFormControlLabel
|
||||||
control={
|
control={
|
||||||
@@ -411,25 +411,9 @@ const MqttSettings = () => {
|
|||||||
</MenuItem>
|
</MenuItem>
|
||||||
</TextField>
|
</TextField>
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid>
|
|
||||||
{data.discovery_type === 0 && (
|
|
||||||
<TextField
|
|
||||||
name="ha_number_mode"
|
|
||||||
label={LL.MQTT_INPUT_NUMBER_FORMAT()}
|
|
||||||
value={data.ha_number_mode}
|
|
||||||
variant="outlined"
|
|
||||||
onChange={updateFormValue}
|
|
||||||
sx={{ width: '20ch' }}
|
|
||||||
margin="normal"
|
|
||||||
select
|
|
||||||
>
|
|
||||||
<MenuItem value={0}>Box</MenuItem>
|
|
||||||
<MenuItem value={1}>Slider</MenuItem>
|
|
||||||
</TextField>
|
|
||||||
)}
|
|
||||||
</Grid>
|
|
||||||
</Grid>
|
</Grid>
|
||||||
)}
|
)}
|
||||||
|
</Grid>
|
||||||
<Typography sx={{ pt: 2 }} variant="h6" color="primary">
|
<Typography sx={{ pt: 2 }} variant="h6" color="primary">
|
||||||
{LL.MQTT_PUBLISH_INTERVALS()} (0=auto)
|
{LL.MQTT_PUBLISH_INTERVALS()} (0=auto)
|
||||||
</Typography>
|
</Typography>
|
||||||
|
|||||||
@@ -182,7 +182,7 @@ const Settings = () => {
|
|||||||
restarting
|
restarting
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return restarting ? <SystemMonitor /> : <SectionContent>{content}</SectionContent>;
|
return <SectionContent>{restarting ? <SystemMonitor /> : content}</SectionContent>;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default Settings;
|
export default Settings;
|
||||||
|
|||||||
@@ -397,12 +397,10 @@ const NetworkSettings = () => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
return restarting ? (
|
return (
|
||||||
<SystemMonitor />
|
|
||||||
) : (
|
|
||||||
<SectionContent>
|
<SectionContent>
|
||||||
{blocker ? <BlockNavigation blocker={blocker} /> : null}
|
{blocker ? <BlockNavigation blocker={blocker} /> : null}
|
||||||
{content()}
|
{restarting ? <SystemMonitor /> : content()}
|
||||||
</SectionContent>
|
</SectionContent>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -443,7 +443,7 @@ const SystemStatus = () => {
|
|||||||
renderRestartDialog
|
renderRestartDialog
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return restarting ? <SystemMonitor /> : <SectionContent>{content}</SectionContent>;
|
return <SectionContent>{restarting ? <SystemMonitor /> : content}</SectionContent>;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default SystemStatus;
|
export default SystemStatus;
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ import type { LogEntry, LogSettings } from 'types';
|
|||||||
import { LogLevel } from 'types';
|
import { LogLevel } from 'types';
|
||||||
import { updateValueDirty, useRest } from 'utils';
|
import { updateValueDirty, useRest } from 'utils';
|
||||||
|
|
||||||
|
const MAX_LOG_ENTRIES = 1000; // Limit log entries to prevent memory issues
|
||||||
|
|
||||||
const TextColors: Record<LogLevel, string> = {
|
const TextColors: Record<LogLevel, string> = {
|
||||||
[LogLevel.ERROR]: '#ff0000', // red
|
[LogLevel.ERROR]: '#ff0000', // red
|
||||||
[LogLevel.WARNING]: '#ff0000', // red
|
[LogLevel.WARNING]: '#ff0000', // red
|
||||||
@@ -198,6 +200,10 @@ const SystemLog = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
const newLog = [...log, logentry];
|
const newLog = [...log, logentry];
|
||||||
|
// Limit log entries to prevent memory issues - only slice when necessary
|
||||||
|
if (newLog.length > MAX_LOG_ENTRIES) {
|
||||||
|
return newLog.slice(-MAX_LOG_ENTRIES);
|
||||||
|
}
|
||||||
return newLog;
|
return newLog;
|
||||||
});
|
});
|
||||||
}, []);
|
}, []);
|
||||||
@@ -302,8 +308,6 @@ const SystemLog = () => {
|
|||||||
<MenuItem value={50}>50</MenuItem>
|
<MenuItem value={50}>50</MenuItem>
|
||||||
<MenuItem value={75}>75</MenuItem>
|
<MenuItem value={75}>75</MenuItem>
|
||||||
<MenuItem value={100}>100</MenuItem>
|
<MenuItem value={100}>100</MenuItem>
|
||||||
<MenuItem value={500}>500</MenuItem>
|
|
||||||
<MenuItem value={1000}>1000</MenuItem>
|
|
||||||
</TextField>
|
</TextField>
|
||||||
</Grid>
|
</Grid>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -60,16 +60,18 @@ const SystemMonitor = () => {
|
|||||||
const { statusMessage, isUploading, progressValue } = useMemo(() => {
|
const { statusMessage, isUploading, progressValue } = useMemo(() => {
|
||||||
const status = data?.status;
|
const status = data?.status;
|
||||||
|
|
||||||
const message =
|
let message = '';
|
||||||
status && status >= SystemStatusCodes.SYSTEM_STATUS_UPLOADING
|
if (status && status >= SystemStatusCodes.SYSTEM_STATUS_UPLOADING) {
|
||||||
? LL.WAIT_FIRMWARE()
|
message = LL.WAIT_FIRMWARE();
|
||||||
: status === SystemStatusCodes.SYSTEM_STATUS_PENDING_RESTART
|
} else if (status === SystemStatusCodes.SYSTEM_STATUS_PENDING_RESTART) {
|
||||||
? LL.APPLICATION_RESTARTING()
|
message = LL.APPLICATION_RESTARTING();
|
||||||
: status === SystemStatusCodes.SYSTEM_STATUS_NORMAL
|
} else if (status === SystemStatusCodes.SYSTEM_STATUS_NORMAL) {
|
||||||
? LL.RESTARTING_PRE()
|
message = LL.RESTARTING_PRE();
|
||||||
: status === SystemStatusCodes.SYSTEM_STATUS_ERROR_UPLOAD
|
} else if (status === SystemStatusCodes.SYSTEM_STATUS_ERROR_UPLOAD) {
|
||||||
? 'Upload Failed'
|
message = 'Upload Failed';
|
||||||
: LL.RESTARTING_POST();
|
} else {
|
||||||
|
message = LL.RESTARTING_POST();
|
||||||
|
}
|
||||||
|
|
||||||
const uploading =
|
const uploading =
|
||||||
status !== undefined && status >= SystemStatusCodes.SYSTEM_STATUS_UPLOADING;
|
status !== undefined && status >= SystemStatusCodes.SYSTEM_STATUS_UPLOADING;
|
||||||
@@ -101,8 +103,8 @@ const SystemMonitor = () => {
|
|||||||
height: '100vh',
|
height: '100vh',
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
justifyContent: 'center'
|
justifyContent: 'center',
|
||||||
// backdropFilter: 'blur(8px)'
|
backdropFilter: 'blur(8px)'
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Box
|
<Box
|
||||||
|
|||||||
@@ -274,6 +274,7 @@ const InstallDialog = memo(
|
|||||||
fetchDevVersion,
|
fetchDevVersion,
|
||||||
latestVersion,
|
latestVersion,
|
||||||
latestDevVersion,
|
latestDevVersion,
|
||||||
|
downloadOnly,
|
||||||
platform,
|
platform,
|
||||||
LL,
|
LL,
|
||||||
onClose,
|
onClose,
|
||||||
@@ -283,6 +284,7 @@ const InstallDialog = memo(
|
|||||||
fetchDevVersion: boolean;
|
fetchDevVersion: boolean;
|
||||||
latestVersion?: VersionInfo;
|
latestVersion?: VersionInfo;
|
||||||
latestDevVersion?: VersionInfo;
|
latestDevVersion?: VersionInfo;
|
||||||
|
downloadOnly: boolean;
|
||||||
platform: string;
|
platform: string;
|
||||||
LL: TranslationFunctions;
|
LL: TranslationFunctions;
|
||||||
onClose: () => void;
|
onClose: () => void;
|
||||||
@@ -307,7 +309,7 @@ const InstallDialog = memo(
|
|||||||
<DialogContent dividers>
|
<DialogContent dividers>
|
||||||
<Typography mb={2}>
|
<Typography mb={2}>
|
||||||
{LL.INSTALL_VERSION(
|
{LL.INSTALL_VERSION(
|
||||||
LL.INSTALL(),
|
downloadOnly ? LL.DOWNLOAD(1) : LL.INSTALL(),
|
||||||
fetchDevVersion ? latestDevVersion?.name : latestVersion?.name
|
fetchDevVersion ? latestDevVersion?.name : latestVersion?.name
|
||||||
)}
|
)}
|
||||||
</Typography>
|
</Typography>
|
||||||
@@ -331,6 +333,7 @@ const InstallDialog = memo(
|
|||||||
{LL.DOWNLOAD(0)}
|
{LL.DOWNLOAD(0)}
|
||||||
</Link>
|
</Link>
|
||||||
</Button>
|
</Button>
|
||||||
|
{!downloadOnly && (
|
||||||
<Button
|
<Button
|
||||||
startIcon={<WarningIcon color="warning" />}
|
startIcon={<WarningIcon color="warning" />}
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
@@ -339,6 +342,7 @@ const InstallDialog = memo(
|
|||||||
>
|
>
|
||||||
{LL.INSTALL()}
|
{LL.INSTALL()}
|
||||||
</Button>
|
</Button>
|
||||||
|
)}
|
||||||
</DialogActions>
|
</DialogActions>
|
||||||
</Dialog>
|
</Dialog>
|
||||||
);
|
);
|
||||||
@@ -419,6 +423,7 @@ const Version = () => {
|
|||||||
const [stableUpgradeAvailable, setStableUpgradeAvailable] =
|
const [stableUpgradeAvailable, setStableUpgradeAvailable] =
|
||||||
useState<boolean>(false);
|
useState<boolean>(false);
|
||||||
const [internetLive, setInternetLive] = useState<boolean>(false);
|
const [internetLive, setInternetLive] = useState<boolean>(false);
|
||||||
|
const [downloadOnly, setDownloadOnly] = useState<boolean>(false);
|
||||||
const [showVersionInfo, setShowVersionInfo] = useState<number>(0); // 1 = stable, 2 = dev, 3 = partition
|
const [showVersionInfo, setShowVersionInfo] = useState<number>(0); // 1 = stable, 2 = dev, 3 = partition
|
||||||
const [firmwareSize, setFirmwareSize] = useState<number>(0);
|
const [firmwareSize, setFirmwareSize] = useState<number>(0);
|
||||||
|
|
||||||
@@ -444,6 +449,9 @@ const Version = () => {
|
|||||||
error
|
error
|
||||||
} = useRequest(SystemApi.readSystemStatus).onSuccess((event) => {
|
} = useRequest(SystemApi.readSystemStatus).onSuccess((event) => {
|
||||||
const systemData = event.data as VersionData;
|
const systemData = event.data as VersionData;
|
||||||
|
if (systemData.arduino_version.startsWith('Tasmota')) {
|
||||||
|
setDownloadOnly(true);
|
||||||
|
}
|
||||||
setUsingDevVersion(systemData.emsesp_version.includes('dev'));
|
setUsingDevVersion(systemData.emsesp_version.includes('dev'));
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -807,6 +815,7 @@ const Version = () => {
|
|||||||
fetchDevVersion={fetchDevVersion}
|
fetchDevVersion={fetchDevVersion}
|
||||||
latestVersion={latestVersion}
|
latestVersion={latestVersion}
|
||||||
latestDevVersion={latestDevVersion}
|
latestDevVersion={latestDevVersion}
|
||||||
|
downloadOnly={downloadOnly}
|
||||||
platform={platform}
|
platform={platform}
|
||||||
LL={LL}
|
LL={LL}
|
||||||
onClose={closeInstallDialog}
|
onClose={closeInstallDialog}
|
||||||
@@ -842,6 +851,7 @@ const Version = () => {
|
|||||||
locale,
|
locale,
|
||||||
openInstallDialog,
|
openInstallDialog,
|
||||||
fetchDevVersion,
|
fetchDevVersion,
|
||||||
|
downloadOnly,
|
||||||
me.admin,
|
me.admin,
|
||||||
showButtons,
|
showButtons,
|
||||||
handleVersionInfoClose,
|
handleVersionInfoClose,
|
||||||
@@ -858,7 +868,7 @@ const Version = () => {
|
|||||||
installPartitionFirmware
|
installPartitionFirmware
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return restarting ? <SystemMonitor /> : <SectionContent>{content}</SectionContent>;
|
return <SectionContent>{restarting ? <SystemMonitor /> : content}</SectionContent>;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default memo(Version);
|
export default memo(Version);
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { type FC, type PropsWithChildren, memo } from 'react';
|
import { memo } from 'react';
|
||||||
|
|
||||||
import { Box } from '@mui/material';
|
import { Box } from '@mui/material';
|
||||||
import type { BoxProps } from '@mui/material';
|
import type { BoxProps } from '@mui/material';
|
||||||
|
|
||||||
const ButtonRow: FC<PropsWithChildren<BoxProps>> = memo(({ children, ...rest }) => (
|
const ButtonRow = memo<BoxProps>(({ children, ...rest }) => (
|
||||||
<Box
|
<Box
|
||||||
sx={{
|
sx={{
|
||||||
'& button, & a, & .MuiCard-root': {
|
'& button, & a, & .MuiCard-root': {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { type FC, type PropsWithChildren, memo, useMemo } from 'react';
|
import { type FC, memo, useMemo } from 'react';
|
||||||
|
|
||||||
import CheckCircleOutlineOutlinedIcon from '@mui/icons-material/CheckCircleOutlineOutlined';
|
import CheckCircleOutlineOutlinedIcon from '@mui/icons-material/CheckCircleOutlineOutlined';
|
||||||
import ErrorIcon from '@mui/icons-material/Error';
|
import ErrorIcon from '@mui/icons-material/Error';
|
||||||
@@ -12,7 +12,6 @@ type MessageBoxLevel = 'warning' | 'success' | 'info' | 'error';
|
|||||||
export interface MessageBoxProps extends BoxProps {
|
export interface MessageBoxProps extends BoxProps {
|
||||||
level: MessageBoxLevel;
|
level: MessageBoxLevel;
|
||||||
message?: string;
|
message?: string;
|
||||||
children?: React.ReactNode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const LEVEL_ICONS: Record<MessageBoxLevel, React.ComponentType<SvgIconProps>> = {
|
const LEVEL_ICONS: Record<MessageBoxLevel, React.ComponentType<SvgIconProps>> = {
|
||||||
@@ -29,7 +28,7 @@ const LEVEL_PALETTE_PATHS: Record<MessageBoxLevel, string> = {
|
|||||||
error: 'error.dark'
|
error: 'error.dark'
|
||||||
};
|
};
|
||||||
|
|
||||||
const MessageBox: FC<PropsWithChildren<MessageBoxProps>> = ({
|
const MessageBox: FC<MessageBoxProps> = ({
|
||||||
level,
|
level,
|
||||||
message,
|
message,
|
||||||
sx,
|
sx,
|
||||||
|
|||||||
@@ -39,8 +39,9 @@ const LayoutMenuItemComponent = ({
|
|||||||
left: 0,
|
left: 0,
|
||||||
top: 0,
|
top: 0,
|
||||||
bottom: 0,
|
bottom: 0,
|
||||||
width: selected ? '3px' : '0px',
|
width: selected ? '4px' : '0px',
|
||||||
backgroundColor: '#90caf9',
|
backgroundColor: '#90caf9',
|
||||||
|
borderRadius: '0 2px 2px 0',
|
||||||
transition: 'width 0.05s cubic-bezier(0.55, 0.085, 0.68, 0.53)'
|
transition: 'width 0.05s cubic-bezier(0.55, 0.085, 0.68, 0.53)'
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|||||||
@@ -186,8 +186,7 @@ const cz: Translation = {
|
|||||||
BUFFER_SIZE: 'Maximální velikost vyrovnávací paměti',
|
BUFFER_SIZE: 'Maximální velikost vyrovnávací paměti',
|
||||||
COMPACT: 'Kompaktní',
|
COMPACT: 'Kompaktní',
|
||||||
DOWNLOAD_SETTINGS_TEXT: 'Vytvořte zálohu svého nastavení a konfigurace',
|
DOWNLOAD_SETTINGS_TEXT: 'Vytvořte zálohu svého nastavení a konfigurace',
|
||||||
DOWNLOAD_SETTINGS_TEXT2: 'Exportovat všechny hodnoty',
|
DOWNLOAD_SETTINGS_TEXT2: 'Exportovat všechna data',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'Systémová záloha',
|
|
||||||
UPLOAD_TEXT: 'Nahrajte nový soubor firmwaru (.bin) nebo záložní soubor (.json)',
|
UPLOAD_TEXT: 'Nahrajte nový soubor firmwaru (.bin) nebo záložní soubor (.json)',
|
||||||
UPLOAD_DROP_TEXT: 'Přetáhněte soubor sem nebo klikněte pro výběr',
|
UPLOAD_DROP_TEXT: 'Přetáhněte soubor sem nebo klikněte pro výběr',
|
||||||
ERROR: 'Neočekávaná chyba, zkuste to prosím znovu',
|
ERROR: 'Neočekávaná chyba, zkuste to prosím znovu',
|
||||||
@@ -220,7 +219,6 @@ const cz: Translation = {
|
|||||||
MQTT_PUBLISH_TEXT_3: 'Povolit MQTT Discovery',
|
MQTT_PUBLISH_TEXT_3: 'Povolit MQTT Discovery',
|
||||||
MQTT_PUBLISH_TEXT_4: 'Prefix pro Discovery témata',
|
MQTT_PUBLISH_TEXT_4: 'Prefix pro Discovery témata',
|
||||||
MQTT_PUBLISH_TEXT_5: 'Typ Discovery',
|
MQTT_PUBLISH_TEXT_5: 'Typ Discovery',
|
||||||
MQTT_INPUT_NUMBER_FORMAT: 'Formát čísla',
|
|
||||||
MQTT_PUBLISH_INTERVALS: 'Intervaly publikování',
|
MQTT_PUBLISH_INTERVALS: 'Intervaly publikování',
|
||||||
MQTT_INT_BOILER: 'Kotle a tepelná čerpadla',
|
MQTT_INT_BOILER: 'Kotle a tepelná čerpadla',
|
||||||
MQTT_INT_THERMOSTATS: 'Termostaty',
|
MQTT_INT_THERMOSTATS: 'Termostaty',
|
||||||
@@ -358,8 +356,7 @@ const cz: Translation = {
|
|||||||
FIRMWARE_VERSION_INFO: 'Informace o verzi firmwaru',
|
FIRMWARE_VERSION_INFO: 'Informace o verzi firmwaru',
|
||||||
NO_DATA: 'Žádná data',
|
NO_DATA: 'Žádná data',
|
||||||
USER_PROFILE: 'Uživatelský profil',
|
USER_PROFILE: 'Uživatelský profil',
|
||||||
STORED_VERSIONS: 'Uložené verze',
|
STORED_VERSIONS: 'Uložené verze'
|
||||||
ONLINE_HELP: 'online nápověda'
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default cz;
|
export default cz;
|
||||||
|
|||||||
@@ -186,8 +186,7 @@ const de: Translation = {
|
|||||||
BUFFER_SIZE: 'Max. Puffergröße',
|
BUFFER_SIZE: 'Max. Puffergröße',
|
||||||
COMPACT: 'Kompakte Darstellung',
|
COMPACT: 'Kompakte Darstellung',
|
||||||
DOWNLOAD_SETTINGS_TEXT: 'Erstellen Sie eine Sicherung Ihrer Konfigurationen und Einstellungen',
|
DOWNLOAD_SETTINGS_TEXT: 'Erstellen Sie eine Sicherung Ihrer Konfigurationen und Einstellungen',
|
||||||
DOWNLOAD_SETTINGS_TEXT2: 'Exportiere alle Werte',
|
DOWNLOAD_SETTINGS_TEXT2: 'Exportiere alle Daten',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'System Sicherung',
|
|
||||||
UPLOAD_TEXT: 'Laden Sie eine neue Firmware-Datei (.bin) oder eine Sicherungsdatei (.json) hoch',
|
UPLOAD_TEXT: 'Laden Sie eine neue Firmware-Datei (.bin) oder eine Sicherungsdatei (.json) hoch',
|
||||||
UPLOAD_DROP_TEXT: 'Legen Sie eine Firmware-Datei (.bin) ab oder klicken Sie hier',
|
UPLOAD_DROP_TEXT: 'Legen Sie eine Firmware-Datei (.bin) ab oder klicken Sie hier',
|
||||||
ERROR: 'Unerwarteter Fehler, bitte versuchen Sie es erneut.',
|
ERROR: 'Unerwarteter Fehler, bitte versuchen Sie es erneut.',
|
||||||
@@ -220,7 +219,6 @@ const de: Translation = {
|
|||||||
MQTT_PUBLISH_TEXT_3: 'Aktiviere `MQTT Discovery`',
|
MQTT_PUBLISH_TEXT_3: 'Aktiviere `MQTT Discovery`',
|
||||||
MQTT_PUBLISH_TEXT_4: 'Prefix für die `Discovery`-Topics',
|
MQTT_PUBLISH_TEXT_4: 'Prefix für die `Discovery`-Topics',
|
||||||
MQTT_PUBLISH_TEXT_5: 'Discovery Typ',
|
MQTT_PUBLISH_TEXT_5: 'Discovery Typ',
|
||||||
MQTT_INPUT_NUMBER_FORMAT: 'Zahlenformat',
|
|
||||||
MQTT_PUBLISH_INTERVALS: 'Veröffentlichungs-Intervalle',
|
MQTT_PUBLISH_INTERVALS: 'Veröffentlichungs-Intervalle',
|
||||||
MQTT_INT_BOILER: 'Boiler und Wärmepumpen',
|
MQTT_INT_BOILER: 'Boiler und Wärmepumpen',
|
||||||
MQTT_INT_THERMOSTATS: 'Thermostate',
|
MQTT_INT_THERMOSTATS: 'Thermostate',
|
||||||
@@ -358,8 +356,7 @@ const de: Translation = {
|
|||||||
FIRMWARE_VERSION_INFO: 'Firmware-Versionsinformation',
|
FIRMWARE_VERSION_INFO: 'Firmware-Versionsinformation',
|
||||||
NO_DATA: 'Keine Daten',
|
NO_DATA: 'Keine Daten',
|
||||||
USER_PROFILE: 'Benutzerprofil',
|
USER_PROFILE: 'Benutzerprofil',
|
||||||
STORED_VERSIONS: 'Gespeicherte Versionen',
|
STORED_VERSIONS: 'Gespeicherte Versionen'
|
||||||
ONLINE_HELP: 'Online-Hilfe'
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default de;
|
export default de;
|
||||||
|
|||||||
@@ -186,8 +186,7 @@ const en: Translation = {
|
|||||||
BUFFER_SIZE: 'Max Buffer Size',
|
BUFFER_SIZE: 'Max Buffer Size',
|
||||||
COMPACT: 'Compact',
|
COMPACT: 'Compact',
|
||||||
DOWNLOAD_SETTINGS_TEXT: 'Create a backup of your configuration and settings',
|
DOWNLOAD_SETTINGS_TEXT: 'Create a backup of your configuration and settings',
|
||||||
DOWNLOAD_SETTINGS_TEXT2: 'Export all values',
|
DOWNLOAD_SETTINGS_TEXT2: 'Export all data',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'System Backup',
|
|
||||||
UPLOAD_TEXT: 'Upload a new firmware file (.bin) or a backup file (.json)',
|
UPLOAD_TEXT: 'Upload a new firmware file (.bin) or a backup file (.json)',
|
||||||
UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here',
|
UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here',
|
||||||
ERROR: 'Unexpected Error, please try again',
|
ERROR: 'Unexpected Error, please try again',
|
||||||
@@ -220,7 +219,6 @@ const en: Translation = {
|
|||||||
MQTT_PUBLISH_TEXT_3: 'Enable MQTT Discovery',
|
MQTT_PUBLISH_TEXT_3: 'Enable MQTT Discovery',
|
||||||
MQTT_PUBLISH_TEXT_4: 'Prefix for the Discovery topics',
|
MQTT_PUBLISH_TEXT_4: 'Prefix for the Discovery topics',
|
||||||
MQTT_PUBLISH_TEXT_5: 'Discovery type',
|
MQTT_PUBLISH_TEXT_5: 'Discovery type',
|
||||||
MQTT_INPUT_NUMBER_FORMAT: 'Input Number Fomat',
|
|
||||||
MQTT_PUBLISH_INTERVALS: 'Publish Intervals',
|
MQTT_PUBLISH_INTERVALS: 'Publish Intervals',
|
||||||
MQTT_INT_BOILER: 'Boilers and Heat Pumps',
|
MQTT_INT_BOILER: 'Boilers and Heat Pumps',
|
||||||
MQTT_INT_THERMOSTATS: 'Thermostats',
|
MQTT_INT_THERMOSTATS: 'Thermostats',
|
||||||
@@ -358,8 +356,7 @@ const en: Translation = {
|
|||||||
FIRMWARE_VERSION_INFO: 'Firmware Version Information',
|
FIRMWARE_VERSION_INFO: 'Firmware Version Information',
|
||||||
NO_DATA: 'No data',
|
NO_DATA: 'No data',
|
||||||
USER_PROFILE: 'User Profile',
|
USER_PROFILE: 'User Profile',
|
||||||
STORED_VERSIONS: 'Stored Versions',
|
STORED_VERSIONS: 'Stored Versions'
|
||||||
ONLINE_HELP: 'online help'
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default en;
|
export default en;
|
||||||
|
|||||||
@@ -186,8 +186,7 @@ const fr: Translation = {
|
|||||||
BUFFER_SIZE: 'Max taille du buffer',
|
BUFFER_SIZE: 'Max taille du buffer',
|
||||||
COMPACT: 'Compact',
|
COMPACT: 'Compact',
|
||||||
DOWNLOAD_SETTINGS_TEXT: 'Créer une sauvegarde de vos paramètres et configurations',
|
DOWNLOAD_SETTINGS_TEXT: 'Créer une sauvegarde de vos paramètres et configurations',
|
||||||
DOWNLOAD_SETTINGS_TEXT2: 'Exporter toutes les valeurs',
|
DOWNLOAD_SETTINGS_TEXT2: 'Exporter toutes les données',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'Sauvegarde système',
|
|
||||||
UPLOAD_TEXT: 'Télécharger un nouveau fichier firmware (.bin) ou une sauvegarde (.json)',
|
UPLOAD_TEXT: 'Télécharger un nouveau fichier firmware (.bin) ou une sauvegarde (.json)',
|
||||||
UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here',
|
UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here',
|
||||||
ERROR: 'Erreur inattendue, veuillez réessayer',
|
ERROR: 'Erreur inattendue, veuillez réessayer',
|
||||||
@@ -220,7 +219,6 @@ const fr: Translation = {
|
|||||||
MQTT_PUBLISH_TEXT_3: 'Activer la découverte MQTT',
|
MQTT_PUBLISH_TEXT_3: 'Activer la découverte MQTT',
|
||||||
MQTT_PUBLISH_TEXT_4: 'Préfixe pour les topics découverte',
|
MQTT_PUBLISH_TEXT_4: 'Préfixe pour les topics découverte',
|
||||||
MQTT_PUBLISH_TEXT_5: 'Type de découverte',
|
MQTT_PUBLISH_TEXT_5: 'Type de découverte',
|
||||||
MQTT_INPUT_NUMBER_FORMAT: 'Format des nombres',
|
|
||||||
MQTT_PUBLISH_INTERVALS: 'Intervalles de publication',
|
MQTT_PUBLISH_INTERVALS: 'Intervalles de publication',
|
||||||
MQTT_INT_BOILER: 'Chaudières et pompes à chaleur',
|
MQTT_INT_BOILER: 'Chaudières et pompes à chaleur',
|
||||||
MQTT_INT_THERMOSTATS: 'Thermostats',
|
MQTT_INT_THERMOSTATS: 'Thermostats',
|
||||||
@@ -358,8 +356,7 @@ const fr: Translation = {
|
|||||||
FIRMWARE_VERSION_INFO: 'Informations sur la version du firmware',
|
FIRMWARE_VERSION_INFO: 'Informations sur la version du firmware',
|
||||||
NO_DATA: 'Aucune donnée',
|
NO_DATA: 'Aucune donnée',
|
||||||
USER_PROFILE: 'Profil utilisateur',
|
USER_PROFILE: 'Profil utilisateur',
|
||||||
STORED_VERSIONS: 'Versions stockées',
|
STORED_VERSIONS: 'Versions stockées'
|
||||||
ONLINE_HELP: 'aide en ligne'
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default fr;
|
export default fr;
|
||||||
|
|||||||
@@ -186,8 +186,7 @@ const it: Translation = {
|
|||||||
BUFFER_SIZE: 'Max Buffer Size',
|
BUFFER_SIZE: 'Max Buffer Size',
|
||||||
COMPACT: 'Compatto',
|
COMPACT: 'Compatto',
|
||||||
DOWNLOAD_SETTINGS_TEXT: 'Create a backup of your configuration and settings',
|
DOWNLOAD_SETTINGS_TEXT: 'Create a backup of your configuration and settings',
|
||||||
DOWNLOAD_SETTINGS_TEXT2: 'Esporta tutti i valori',
|
DOWNLOAD_SETTINGS_TEXT2: 'Esporta tutti i dati',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'Backup sistema',
|
|
||||||
UPLOAD_TEXT: 'Upload a new firmware file (.bin) or a backup file (.json)',
|
UPLOAD_TEXT: 'Upload a new firmware file (.bin) or a backup file (.json)',
|
||||||
UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here',
|
UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here',
|
||||||
ERROR: 'Errore Inaspettato, prego tenta ancora',
|
ERROR: 'Errore Inaspettato, prego tenta ancora',
|
||||||
@@ -220,7 +219,6 @@ const it: Translation = {
|
|||||||
MQTT_PUBLISH_TEXT_3: 'Abilita rilevamento MQTT (Home Assistant, Domoticz)',
|
MQTT_PUBLISH_TEXT_3: 'Abilita rilevamento MQTT (Home Assistant, Domoticz)',
|
||||||
MQTT_PUBLISH_TEXT_4: 'Prefisso per gli argomenti di scoperta',
|
MQTT_PUBLISH_TEXT_4: 'Prefisso per gli argomenti di scoperta',
|
||||||
MQTT_PUBLISH_TEXT_5: 'Discovery type',
|
MQTT_PUBLISH_TEXT_5: 'Discovery type',
|
||||||
MQTT_INPUT_NUMBER_FORMAT: 'Formato numero di input',
|
|
||||||
MQTT_PUBLISH_INTERVALS: 'Pubblica intervalli',
|
MQTT_PUBLISH_INTERVALS: 'Pubblica intervalli',
|
||||||
MQTT_INT_BOILER: 'Caldaie e Pompe di Calore',
|
MQTT_INT_BOILER: 'Caldaie e Pompe di Calore',
|
||||||
MQTT_INT_THERMOSTATS: 'Termostati',
|
MQTT_INT_THERMOSTATS: 'Termostati',
|
||||||
@@ -358,8 +356,7 @@ const it: Translation = {
|
|||||||
FIRMWARE_VERSION_INFO: 'Informazioni sulla versione del firmware',
|
FIRMWARE_VERSION_INFO: 'Informazioni sulla versione del firmware',
|
||||||
NO_DATA: 'Nessun dato',
|
NO_DATA: 'Nessun dato',
|
||||||
USER_PROFILE: 'Profilo utente',
|
USER_PROFILE: 'Profilo utente',
|
||||||
STORED_VERSIONS: 'Versioni memorizzate',
|
STORED_VERSIONS: 'Versioni memorizzate'
|
||||||
ONLINE_HELP: 'aiuto online'
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default it;
|
export default it;
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ const nl: Translation = {
|
|||||||
REFRESH: 'Ververs',
|
REFRESH: 'Ververs',
|
||||||
EXPORT: 'Export',
|
EXPORT: 'Export',
|
||||||
FAVORITES: "Favorieten",
|
FAVORITES: "Favorieten",
|
||||||
DEVICE_DETAILS: 'Apparaat Gegevens',
|
DEVICE_DETAILS: 'Device Gegevens',
|
||||||
ID_OF: '{0} ID',
|
ID_OF: '{0} ID',
|
||||||
DEVICE: 'Apparaat',
|
DEVICE: 'Apparaat',
|
||||||
PRODUCT: 'Product',
|
PRODUCT: 'Product',
|
||||||
@@ -65,7 +65,7 @@ const nl: Translation = {
|
|||||||
TEMP_SENSOR: 'Temperatuur sensor',
|
TEMP_SENSOR: 'Temperatuur sensor',
|
||||||
TEMP_SENSORS: 'Temperatuur Sensoren',
|
TEMP_SENSORS: 'Temperatuur Sensoren',
|
||||||
WRITE_CMD_SENT: 'Schrijf commando gestuurd',
|
WRITE_CMD_SENT: 'Schrijf commando gestuurd',
|
||||||
EMS_BUS_WARNING: 'EMS bus niet gevonden. Als deze waarschuwing blijft staan na een paar seconden loop dan de instellingen na en in het bijzonder het apparaat type profiel.',
|
EMS_BUS_WARNING: 'EMS bus niet gevonden. Als deze waarschuwing blijft staan na een paar seconden dan loop de instellingen na en in het bijzonder het apparaat type profiel na.',
|
||||||
EMS_BUS_SCANNING: 'Scannen naar EMS apparaten...',
|
EMS_BUS_SCANNING: 'Scannen naar EMS apparaten...',
|
||||||
CONNECTED: 'Verbonden',
|
CONNECTED: 'Verbonden',
|
||||||
TX_ISSUES: 'Tx bus probleem. Probeer een andere Tx verzendmodus',
|
TX_ISSUES: 'Tx bus probleem. Probeer een andere Tx verzendmodus',
|
||||||
@@ -75,7 +75,7 @@ const nl: Translation = {
|
|||||||
EMS_DEVICE: 'EMS Apparaat',
|
EMS_DEVICE: 'EMS Apparaat',
|
||||||
SUCCESS: 'SUCCESS',
|
SUCCESS: 'SUCCESS',
|
||||||
FAIL: 'MISLUKT',
|
FAIL: 'MISLUKT',
|
||||||
QUALITY: 'KWALITEIT',
|
QUALITY: 'QUALITEIT',
|
||||||
SCAN: 'Scan',
|
SCAN: 'Scan',
|
||||||
STATUS_NAMES: [
|
STATUS_NAMES: [
|
||||||
'EMS Telegrammen ontvangen (Rx)',
|
'EMS Telegrammen ontvangen (Rx)',
|
||||||
@@ -120,7 +120,7 @@ const nl: Translation = {
|
|||||||
ENABLE_SHOWER_TIMER: 'Activeer Douche Timer (tijdmeting)',
|
ENABLE_SHOWER_TIMER: 'Activeer Douche Timer (tijdmeting)',
|
||||||
ENABLE_SHOWER_ALERT: 'Activeer Douchemelding',
|
ENABLE_SHOWER_ALERT: 'Activeer Douchemelding',
|
||||||
TRIGGER_TIME: 'Trigger tijd',
|
TRIGGER_TIME: 'Trigger tijd',
|
||||||
COLD_SHOT_DURATION: 'Lengte koud water puls',
|
COLD_SHOT_DURATION: 'Tijd Shot koud water',
|
||||||
FORMATTING_OPTIONS: 'Formatteringsopties',
|
FORMATTING_OPTIONS: 'Formatteringsopties',
|
||||||
BOOLEAN_FORMAT_DASHBOARD: 'Boolean formaat web',
|
BOOLEAN_FORMAT_DASHBOARD: 'Boolean formaat web',
|
||||||
BOOLEAN_FORMAT_API: 'Boolean formaat API/MQTT',
|
BOOLEAN_FORMAT_API: 'Boolean formaat API/MQTT',
|
||||||
@@ -143,7 +143,7 @@ const nl: Translation = {
|
|||||||
CUSTOMIZATIONS_FULL: 'Te veel entiteiten geselecteerd. Sla op in delen aub',
|
CUSTOMIZATIONS_FULL: 'Te veel entiteiten geselecteerd. Sla op in delen aub',
|
||||||
CUSTOMIZATIONS_SAVED: 'Custom aanpassingen opgeslagen',
|
CUSTOMIZATIONS_SAVED: 'Custom aanpassingen opgeslagen',
|
||||||
CUSTOMIZATIONS_HELP_1: 'Selecteer een apparaat en pas de entiteiten aan door middel van de opties',
|
CUSTOMIZATIONS_HELP_1: 'Selecteer een apparaat en pas de entiteiten aan door middel van de opties',
|
||||||
CUSTOMIZATIONS_HELP_2: 'Markeer als favoriet',
|
CUSTOMIZATIONS_HELP_2: 'Markeer as favoriet',
|
||||||
CUSTOMIZATIONS_HELP_3: 'Zet schrijfacties uit',
|
CUSTOMIZATIONS_HELP_3: 'Zet schrijfacties uit',
|
||||||
CUSTOMIZATIONS_HELP_4: 'Uitsluiten van MQTT en API',
|
CUSTOMIZATIONS_HELP_4: 'Uitsluiten van MQTT en API',
|
||||||
CUSTOMIZATIONS_HELP_5: 'verbergen voor apparaten',
|
CUSTOMIZATIONS_HELP_5: 'verbergen voor apparaten',
|
||||||
@@ -186,13 +186,12 @@ const nl: Translation = {
|
|||||||
BUFFER_SIZE: 'Max buffer grootte',
|
BUFFER_SIZE: 'Max buffer grootte',
|
||||||
COMPACT: 'Compact',
|
COMPACT: 'Compact',
|
||||||
DOWNLOAD_SETTINGS_TEXT: 'Maak een back-up van uw configuratie en instellingen',
|
DOWNLOAD_SETTINGS_TEXT: 'Maak een back-up van uw configuratie en instellingen',
|
||||||
DOWNLOAD_SETTINGS_TEXT2: 'Exporteer alle waarden',
|
DOWNLOAD_SETTINGS_TEXT2: 'Exporteer alle data',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'Systeem Backup',
|
|
||||||
UPLOAD_TEXT: 'Upload een nieuw firmwarebestand (.bin) of een back-upbestand (.json)',
|
UPLOAD_TEXT: 'Upload een nieuw firmwarebestand (.bin) of een back-upbestand (.json)',
|
||||||
UPLOAD_DROP_TEXT: 'Sleep en firmware .bin bestand hierheen of klik hier',
|
UPLOAD_DROP_TEXT: 'Sleep en firmware .bin bestand hierheen of klik hier',
|
||||||
ERROR: 'Onverwachte fout, probeer opnieuw',
|
ERROR: 'Onverwachte fout, probeer opnieuw',
|
||||||
TIME_SET: 'Tijd ingesteld',
|
TIME_SET: 'Tijd ingesteld',
|
||||||
MANAGE_USERS: 'Gebruikersbeheer',
|
MANAGE_USERS: 'Beheer Gebruikers',
|
||||||
IS_ADMIN: 'is Admin',
|
IS_ADMIN: 'is Admin',
|
||||||
USER_WARNING: 'U dient tenminste 1 admin gebruiker te configureren',
|
USER_WARNING: 'U dient tenminste 1 admin gebruiker te configureren',
|
||||||
ADD: 'Toevoegen',
|
ADD: 'Toevoegen',
|
||||||
@@ -201,7 +200,7 @@ const nl: Translation = {
|
|||||||
GENERATING_TOKEN: 'Token aan het genereren',
|
GENERATING_TOKEN: 'Token aan het genereren',
|
||||||
USER: 'Gebruiker',
|
USER: 'Gebruiker',
|
||||||
MODIFY: 'Aanpassen',
|
MODIFY: 'Aanpassen',
|
||||||
SU_TEXT: 'Het su (super user) wachtwoord wordt gebruikt om authorisatie tokens te ondertekenen en ook om admin privileges te activeren in de console.',
|
SU_TEXT: 'Het su (super user) wachtwoord wordt gebruikt om authorisatie tokens te signeren en ook om admin privileges te activeren in de console.',
|
||||||
NOT_ENABLED: 'Niet geactiveerd',
|
NOT_ENABLED: 'Niet geactiveerd',
|
||||||
ERRORS_OF: '{0} Foutmeldingen',
|
ERRORS_OF: '{0} Foutmeldingen',
|
||||||
DISCONNECT_REASON: 'Verbinding verbroken vanwege',
|
DISCONNECT_REASON: 'Verbinding verbroken vanwege',
|
||||||
@@ -220,7 +219,6 @@ const nl: Translation = {
|
|||||||
MQTT_PUBLISH_TEXT_3: 'Activeer MQTT Discovery',
|
MQTT_PUBLISH_TEXT_3: 'Activeer MQTT Discovery',
|
||||||
MQTT_PUBLISH_TEXT_4: 'Prefix voor de Discovery topics',
|
MQTT_PUBLISH_TEXT_4: 'Prefix voor de Discovery topics',
|
||||||
MQTT_PUBLISH_TEXT_5: 'Discovery type',
|
MQTT_PUBLISH_TEXT_5: 'Discovery type',
|
||||||
MQTT_INPUT_NUMBER_FORMAT: 'Getalformaat',
|
|
||||||
MQTT_PUBLISH_INTERVALS: 'Publicatie intervallen',
|
MQTT_PUBLISH_INTERVALS: 'Publicatie intervallen',
|
||||||
MQTT_INT_BOILER: 'CV ketels en warmtepompen',
|
MQTT_INT_BOILER: 'CV ketels en warmtepompen',
|
||||||
MQTT_INT_THERMOSTATS: 'Thermostaten',
|
MQTT_INT_THERMOSTATS: 'Thermostaten',
|
||||||
@@ -358,8 +356,7 @@ const nl: Translation = {
|
|||||||
FIRMWARE_VERSION_INFO: 'Informatie over firmwareversie',
|
FIRMWARE_VERSION_INFO: 'Informatie over firmwareversie',
|
||||||
NO_DATA: 'Geen data',
|
NO_DATA: 'Geen data',
|
||||||
USER_PROFILE: 'Gebruikersprofiel',
|
USER_PROFILE: 'Gebruikersprofiel',
|
||||||
STORED_VERSIONS: 'Opgeslagen versies',
|
STORED_VERSIONS: 'Opgeslagen versies'
|
||||||
ONLINE_HELP: 'online help'
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default nl;
|
export default nl;
|
||||||
@@ -186,8 +186,7 @@ const no: Translation = {
|
|||||||
BUFFER_SIZE: 'Max Buffer Størrelse',
|
BUFFER_SIZE: 'Max Buffer Størrelse',
|
||||||
COMPACT: 'Komprimere',
|
COMPACT: 'Komprimere',
|
||||||
DOWNLOAD_SETTINGS_TEXT: 'Lag en sikkerhetskopi av dine konfigurasjon og innstillinger',
|
DOWNLOAD_SETTINGS_TEXT: 'Lag en sikkerhetskopi av dine konfigurasjon og innstillinger',
|
||||||
DOWNLOAD_SETTINGS_TEXT2: 'Eksporter alle verdier',
|
DOWNLOAD_SETTINGS_TEXT2: 'Eksporter alle data',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'System Sikkerhetskopi',
|
|
||||||
UPLOAD_TEXT: 'Last opp en ny firmware fil (.bin) eller en sikkerhetskopi fil (.json)',
|
UPLOAD_TEXT: 'Last opp en ny firmware fil (.bin) eller en sikkerhetskopi fil (.json)',
|
||||||
UPLOAD_DROP_TEXT: 'Dropp en firmware fil (.bin) eller klikk her',
|
UPLOAD_DROP_TEXT: 'Dropp en firmware fil (.bin) eller klikk her',
|
||||||
ERROR: 'Ukjent feil, prøv igjen',
|
ERROR: 'Ukjent feil, prøv igjen',
|
||||||
@@ -220,7 +219,6 @@ const no: Translation = {
|
|||||||
MQTT_PUBLISH_TEXT_3: 'Aktiver MQTT Discovery',
|
MQTT_PUBLISH_TEXT_3: 'Aktiver MQTT Discovery',
|
||||||
MQTT_PUBLISH_TEXT_4: 'Prefiks for Discovery topics',
|
MQTT_PUBLISH_TEXT_4: 'Prefiks for Discovery topics',
|
||||||
MQTT_PUBLISH_TEXT_5: 'Discovery type',
|
MQTT_PUBLISH_TEXT_5: 'Discovery type',
|
||||||
MQTT_INPUT_NUMBER_FORMAT: 'Nummerformat',
|
|
||||||
MQTT_PUBLISH_INTERVALS: 'Publiseringsintervall',
|
MQTT_PUBLISH_INTERVALS: 'Publiseringsintervall',
|
||||||
MQTT_INT_BOILER: 'Fyr/Varmepumpe',
|
MQTT_INT_BOILER: 'Fyr/Varmepumpe',
|
||||||
MQTT_INT_THERMOSTATS: 'Termostat',
|
MQTT_INT_THERMOSTATS: 'Termostat',
|
||||||
@@ -358,8 +356,7 @@ const no: Translation = {
|
|||||||
FIRMWARE_VERSION_INFO: 'Informasjon om firmwareversjon',
|
FIRMWARE_VERSION_INFO: 'Informasjon om firmwareversjon',
|
||||||
NO_DATA: 'Ingen data',
|
NO_DATA: 'Ingen data',
|
||||||
USER_PROFILE: 'Brukerprofil',
|
USER_PROFILE: 'Brukerprofil',
|
||||||
STORED_VERSIONS: 'Lagret versjoner',
|
STORED_VERSIONS: 'Lagret versjoner'
|
||||||
ONLINE_HELP: 'online hjelp'
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default no;
|
export default no;
|
||||||
|
|||||||
@@ -186,8 +186,7 @@ const pl: BaseTranslation = {
|
|||||||
BUFFER_SIZE: 'Maksymalna pojemność bufora (ilość wpisów)',
|
BUFFER_SIZE: 'Maksymalna pojemność bufora (ilość wpisów)',
|
||||||
COMPACT: 'Kompaktowy',
|
COMPACT: 'Kompaktowy',
|
||||||
DOWNLOAD_SETTINGS_TEXT: 'Utwórz kopię swoich ustawień i konfiguracji',
|
DOWNLOAD_SETTINGS_TEXT: 'Utwórz kopię swoich ustawień i konfiguracji',
|
||||||
DOWNLOAD_SETTINGS_TEXT2: 'Eksportuj wszystkie wartości',
|
DOWNLOAD_SETTINGS_TEXT2: 'Eksportuj wszystkie dane',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'Kopia zapasowa systemu',
|
|
||||||
UPLOAD_TEXT: 'Wgraj nowy plik firmware (.bin) lub kopię ustawień (.json)',
|
UPLOAD_TEXT: 'Wgraj nowy plik firmware (.bin) lub kopię ustawień (.json)',
|
||||||
UPLOAD_DROP_TEXT: 'Upuść plik firmware .bin lub kliknij tutaj',
|
UPLOAD_DROP_TEXT: 'Upuść plik firmware .bin lub kliknij tutaj',
|
||||||
ERROR: 'Nieoczekiwany błąd, spróbuj ponownie!',
|
ERROR: 'Nieoczekiwany błąd, spróbuj ponownie!',
|
||||||
@@ -220,7 +219,6 @@ const pl: BaseTranslation = {
|
|||||||
MQTT_PUBLISH_TEXT_3: 'Włącz opcję "MQTT discovery"',
|
MQTT_PUBLISH_TEXT_3: 'Włącz opcję "MQTT discovery"',
|
||||||
MQTT_PUBLISH_TEXT_4: 'Prefiks dla "MQTT discovery"',
|
MQTT_PUBLISH_TEXT_4: 'Prefiks dla "MQTT discovery"',
|
||||||
MQTT_PUBLISH_TEXT_5: 'Typ "MQTT discovery"',
|
MQTT_PUBLISH_TEXT_5: 'Typ "MQTT discovery"',
|
||||||
MQTT_INPUT_NUMBER_FORMAT: 'Format liczby',
|
|
||||||
MQTT_PUBLISH_INTERVALS: 'Interwały publikowania',
|
MQTT_PUBLISH_INTERVALS: 'Interwały publikowania',
|
||||||
MQTT_INT_BOILER: 'Kotły i pompy ciepła',
|
MQTT_INT_BOILER: 'Kotły i pompy ciepła',
|
||||||
MQTT_INT_THERMOSTATS: 'Termostaty',
|
MQTT_INT_THERMOSTATS: 'Termostaty',
|
||||||
@@ -358,8 +356,7 @@ const pl: BaseTranslation = {
|
|||||||
FIRMWARE_VERSION_INFO: 'Informacje o wersji firmware',
|
FIRMWARE_VERSION_INFO: 'Informacje o wersji firmware',
|
||||||
NO_DATA: 'Brak danych',
|
NO_DATA: 'Brak danych',
|
||||||
USER_PROFILE: 'Profil użytkownika',
|
USER_PROFILE: 'Profil użytkownika',
|
||||||
STORED_VERSIONS: 'Zapisane wersje',
|
STORED_VERSIONS: 'Zapisane wersje'
|
||||||
ONLINE_HELP: 'pomoc online'
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default pl;
|
export default pl;
|
||||||
|
|||||||
@@ -186,8 +186,7 @@ const sk: Translation = {
|
|||||||
BUFFER_SIZE: 'Buffer-max. veľkosť',
|
BUFFER_SIZE: 'Buffer-max. veľkosť',
|
||||||
COMPACT: 'Kompaktné',
|
COMPACT: 'Kompaktné',
|
||||||
DOWNLOAD_SETTINGS_TEXT: 'Vytvorte zálohu svojej konfigurácie a nastavení',
|
DOWNLOAD_SETTINGS_TEXT: 'Vytvorte zálohu svojej konfigurácie a nastavení',
|
||||||
DOWNLOAD_SETTINGS_TEXT2: 'Exportovať všetky hodnoty',
|
DOWNLOAD_SETTINGS_TEXT2: 'Exportovať všetky dáta',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'Systémová záloha',
|
|
||||||
UPLOAD_TEXT: 'Nahrajte nový súbor firmvéru (.bin) alebo súbor zálohy (.json)',
|
UPLOAD_TEXT: 'Nahrajte nový súbor firmvéru (.bin) alebo súbor zálohy (.json)',
|
||||||
UPLOAD_DROP_TEXT: 'Presuňte súbor .bin firmvéru alebo kliknite sem',
|
UPLOAD_DROP_TEXT: 'Presuňte súbor .bin firmvéru alebo kliknite sem',
|
||||||
ERROR: 'Neočakávaná chyba, prosím skúste to znova',
|
ERROR: 'Neočakávaná chyba, prosím skúste to znova',
|
||||||
@@ -220,7 +219,6 @@ const sk: Translation = {
|
|||||||
MQTT_PUBLISH_TEXT_3: 'Povolenie zisťovania MQTT',
|
MQTT_PUBLISH_TEXT_3: 'Povolenie zisťovania MQTT',
|
||||||
MQTT_PUBLISH_TEXT_4: 'Predpona tém Discovery',
|
MQTT_PUBLISH_TEXT_4: 'Predpona tém Discovery',
|
||||||
MQTT_PUBLISH_TEXT_5: 'Typ zistenia',
|
MQTT_PUBLISH_TEXT_5: 'Typ zistenia',
|
||||||
MQTT_INPUT_NUMBER_FORMAT: 'Formát čísla',
|
|
||||||
MQTT_PUBLISH_INTERVALS: 'Intervaly zverejňovania',
|
MQTT_PUBLISH_INTERVALS: 'Intervaly zverejňovania',
|
||||||
MQTT_INT_BOILER: 'Kotly a tepelné čerpadlá',
|
MQTT_INT_BOILER: 'Kotly a tepelné čerpadlá',
|
||||||
MQTT_INT_THERMOSTATS: 'Termostaty',
|
MQTT_INT_THERMOSTATS: 'Termostaty',
|
||||||
@@ -358,8 +356,7 @@ const sk: Translation = {
|
|||||||
FIRMWARE_VERSION_INFO: 'Informácie o verzii firmware',
|
FIRMWARE_VERSION_INFO: 'Informácie o verzii firmware',
|
||||||
NO_DATA: 'Žiadne dáta',
|
NO_DATA: 'Žiadne dáta',
|
||||||
USER_PROFILE: 'Profil používateľa',
|
USER_PROFILE: 'Profil používateľa',
|
||||||
STORED_VERSIONS: 'Uložené verzie',
|
STORED_VERSIONS: 'Uložené verzie'
|
||||||
ONLINE_HELP: 'online pomoc'
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default sk;
|
export default sk;
|
||||||
|
|||||||
@@ -186,8 +186,7 @@ const sv: Translation = {
|
|||||||
BUFFER_SIZE: 'Max bufferstorlek',
|
BUFFER_SIZE: 'Max bufferstorlek',
|
||||||
COMPACT: 'Komprimerad',
|
COMPACT: 'Komprimerad',
|
||||||
DOWNLOAD_SETTINGS_TEXT: 'Skapa en säkerhetskopia av din konfiguration och inställningar',
|
DOWNLOAD_SETTINGS_TEXT: 'Skapa en säkerhetskopia av din konfiguration och inställningar',
|
||||||
DOWNLOAD_SETTINGS_TEXT2: 'Exportera alla värden',
|
DOWNLOAD_SETTINGS_TEXT2: 'Exportera alla data',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'System säkerhetskopia',
|
|
||||||
UPLOAD_TEXT: 'Ladda upp en ny firmwarefil (.bin) eller en säkerhetskopiafil (.json)',
|
UPLOAD_TEXT: 'Ladda upp en ny firmwarefil (.bin) eller en säkerhetskopiafil (.json)',
|
||||||
UPLOAD_DROP_TEXT: 'Droppa en firmware .bin fil eller klicka här',
|
UPLOAD_DROP_TEXT: 'Droppa en firmware .bin fil eller klicka här',
|
||||||
ERROR: 'Okänt fel, var god försök igen',
|
ERROR: 'Okänt fel, var god försök igen',
|
||||||
@@ -220,7 +219,6 @@ const sv: Translation = {
|
|||||||
MQTT_PUBLISH_TEXT_3: 'Aktivera MQTT Discovery',
|
MQTT_PUBLISH_TEXT_3: 'Aktivera MQTT Discovery',
|
||||||
MQTT_PUBLISH_TEXT_4: 'Prefix för Discovery topics',
|
MQTT_PUBLISH_TEXT_4: 'Prefix för Discovery topics',
|
||||||
MQTT_PUBLISH_TEXT_5: 'Discoverytyp',
|
MQTT_PUBLISH_TEXT_5: 'Discoverytyp',
|
||||||
MQTT_INPUT_NUMBER_FORMAT: 'Nummerformat',
|
|
||||||
MQTT_PUBLISH_INTERVALS: 'Publiceringsintervall',
|
MQTT_PUBLISH_INTERVALS: 'Publiceringsintervall',
|
||||||
MQTT_INT_BOILER: 'Värmepump/panna',
|
MQTT_INT_BOILER: 'Värmepump/panna',
|
||||||
MQTT_INT_THERMOSTATS: 'Termostater',
|
MQTT_INT_THERMOSTATS: 'Termostater',
|
||||||
@@ -358,8 +356,7 @@ const sv: Translation = {
|
|||||||
FIRMWARE_VERSION_INFO: 'Information om firmwareversion',
|
FIRMWARE_VERSION_INFO: 'Information om firmwareversion',
|
||||||
NO_DATA: 'Ingen data',
|
NO_DATA: 'Ingen data',
|
||||||
USER_PROFILE: 'Användarprofil',
|
USER_PROFILE: 'Användarprofil',
|
||||||
STORED_VERSIONS: 'Lagrad versioner',
|
STORED_VERSIONS: 'Lagrad versioner'
|
||||||
ONLINE_HELP: 'online hjälp'
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default sv;
|
export default sv;
|
||||||
|
|||||||
@@ -186,8 +186,7 @@ const tr: Translation = {
|
|||||||
BUFFER_SIZE: 'En fazla bellek boyutu',
|
BUFFER_SIZE: 'En fazla bellek boyutu',
|
||||||
COMPACT: 'Sıkışık',
|
COMPACT: 'Sıkışık',
|
||||||
DOWNLOAD_SETTINGS_TEXT: 'Yapılandırma ve ayarlarınızın yedekleme yapın',
|
DOWNLOAD_SETTINGS_TEXT: 'Yapılandırma ve ayarlarınızın yedekleme yapın',
|
||||||
DOWNLOAD_SETTINGS_TEXT2: 'Tüm değerleri dışarı al',
|
DOWNLOAD_SETTINGS_TEXT2: 'Tüm verileri dışarı al',
|
||||||
DOWNLOAD_SYSTEM_BACKUP: 'Sistem yedekleme',
|
|
||||||
UPLOAD_TEXT: 'Yeni bir firmware dosyası (.bin) veya yedek dosyası (.json) yükle',
|
UPLOAD_TEXT: 'Yeni bir firmware dosyası (.bin) veya yedek dosyası (.json) yükle',
|
||||||
UPLOAD_DROP_TEXT: 'Bir firmware .bin dosyası veya buraya tıklayın',
|
UPLOAD_DROP_TEXT: 'Bir firmware .bin dosyası veya buraya tıklayın',
|
||||||
ERROR: 'Beklenemedik hata, lütfen tekrar deneyin.',
|
ERROR: 'Beklenemedik hata, lütfen tekrar deneyin.',
|
||||||
@@ -220,7 +219,6 @@ const tr: Translation = {
|
|||||||
MQTT_PUBLISH_TEXT_3: 'MQTT keşfi etkinleştir (Home Assistant, Domoticz)',
|
MQTT_PUBLISH_TEXT_3: 'MQTT keşfi etkinleştir (Home Assistant, Domoticz)',
|
||||||
MQTT_PUBLISH_TEXT_4: 'Keşif konuları için ön ek',
|
MQTT_PUBLISH_TEXT_4: 'Keşif konuları için ön ek',
|
||||||
MQTT_PUBLISH_TEXT_5: 'Domoticz Format',
|
MQTT_PUBLISH_TEXT_5: 'Domoticz Format',
|
||||||
MQTT_INPUT_NUMBER_FORMAT: 'Sayı Biçimi',
|
|
||||||
MQTT_PUBLISH_INTERVALS: 'Yayınlama aralıkları',
|
MQTT_PUBLISH_INTERVALS: 'Yayınlama aralıkları',
|
||||||
MQTT_INT_BOILER: 'Kazanlar ve Isı Pompaları',
|
MQTT_INT_BOILER: 'Kazanlar ve Isı Pompaları',
|
||||||
MQTT_INT_THERMOSTATS: 'Termostatlar',
|
MQTT_INT_THERMOSTATS: 'Termostatlar',
|
||||||
@@ -358,8 +356,7 @@ const tr: Translation = {
|
|||||||
FIRMWARE_VERSION_INFO: 'Firmware Sürüm Bilgisi',
|
FIRMWARE_VERSION_INFO: 'Firmware Sürüm Bilgisi',
|
||||||
NO_DATA: 'Hiçbir veri yok',
|
NO_DATA: 'Hiçbir veri yok',
|
||||||
USER_PROFILE: 'Kullanıcı Profili',
|
USER_PROFILE: 'Kullanıcı Profili',
|
||||||
STORED_VERSIONS: 'Kaydedilmiş Sürümler',
|
STORED_VERSIONS: 'Kaydedilmiş Sürümler'
|
||||||
ONLINE_HELP: 'online yardım'
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default tr;
|
export default tr;
|
||||||
|
|||||||
@@ -49,5 +49,4 @@ export interface MqttSettingsType {
|
|||||||
publish_single2cmd: boolean;
|
publish_single2cmd: boolean;
|
||||||
discovery_prefix: string;
|
discovery_prefix: string;
|
||||||
discovery_type: number;
|
discovery_type: number;
|
||||||
ha_number_mode: number;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ export interface SystemStatus {
|
|||||||
free_psram?: number;
|
free_psram?: number;
|
||||||
free_caps: number;
|
free_caps: number;
|
||||||
model: string;
|
model: string;
|
||||||
board: string;
|
|
||||||
has_loader: boolean;
|
has_loader: boolean;
|
||||||
has_partition: boolean;
|
has_partition: boolean;
|
||||||
partitions: {
|
partitions: {
|
||||||
|
|||||||
@@ -23,8 +23,6 @@ export const saveFile = (
|
|||||||
}, 100);
|
}, 100);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Failed to save file:', error);
|
console.error('Failed to save file:', error);
|
||||||
throw new Error(`Unable to save file: ${filename}${extension}`, {
|
throw new Error(`Unable to save file: ${filename}${extension}`);
|
||||||
cause: error
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,8 +2,9 @@ import preact from '@preact/preset-vite';
|
|||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import { visualizer } from 'rollup-plugin-visualizer';
|
import { visualizer } from 'rollup-plugin-visualizer';
|
||||||
import { Plugin, PluginOption, defineConfig } from 'vite';
|
import { Plugin, defineConfig } from 'vite';
|
||||||
import viteImagemin from 'vite-plugin-imagemin';
|
import viteImagemin from 'vite-plugin-imagemin';
|
||||||
|
import viteTsconfigPaths from 'vite-tsconfig-paths';
|
||||||
import zlib from 'zlib';
|
import zlib from 'zlib';
|
||||||
|
|
||||||
// @ts-expect-error - mock server doesn't have type declarations
|
// @ts-expect-error - mock server doesn't have type declarations
|
||||||
@@ -98,31 +99,16 @@ const createPreactPlugin = (devToolsEnabled: boolean) =>
|
|||||||
prefreshEnabled: false
|
prefreshEnabled: false
|
||||||
});
|
});
|
||||||
|
|
||||||
// Patch preact/compat to export stub React 19 APIs (use, useOptimistic) so that
|
|
||||||
// react-router v7 doesn't trigger IMPORT_IS_UNDEFINED warnings from Rolldown.
|
|
||||||
const preactCompatPatchPlugin = (): Plugin => ({
|
|
||||||
name: 'preact-compat-react19-patch',
|
|
||||||
transform(code, id) {
|
|
||||||
if (id.includes('preact') && id.includes('compat.module.js')) {
|
|
||||||
return {
|
|
||||||
code:
|
|
||||||
code +
|
|
||||||
'\nexport var use = undefined;\nexport var useOptimistic = undefined;\n',
|
|
||||||
map: null
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Common base plugins
|
// Common base plugins
|
||||||
const createBasePlugins = (
|
const createBasePlugins = (
|
||||||
devToolsEnabled: boolean,
|
devToolsEnabled: boolean,
|
||||||
includeBundleReporter = true
|
includeBundleReporter = true
|
||||||
): PluginOption[] => {
|
) => {
|
||||||
const plugins: PluginOption[] = [
|
const plugins = [
|
||||||
createPreactPlugin(devToolsEnabled),
|
createPreactPlugin(devToolsEnabled),
|
||||||
preactCompatPatchPlugin()
|
viteTsconfigPaths({
|
||||||
|
projects: ['./tsconfig.json']
|
||||||
|
})
|
||||||
];
|
];
|
||||||
if (includeBundleReporter) {
|
if (includeBundleReporter) {
|
||||||
plugins.push(bundleSizeReporter());
|
plugins.push(bundleSizeReporter());
|
||||||
@@ -150,16 +136,9 @@ const createManualChunks = (detailed = false) => {
|
|||||||
return 'vendor';
|
return 'vendor';
|
||||||
}
|
}
|
||||||
if (detailed) {
|
if (detailed) {
|
||||||
// Group circularly dependent modules together to avoid circular chunk warnings
|
if (id.includes('components/')) return 'components';
|
||||||
// components, app, and utils are tightly coupled, so combine them
|
if (id.includes('app/')) return 'app';
|
||||||
if (
|
if (id.includes('utils/')) return 'utils';
|
||||||
id.includes('components/') ||
|
|
||||||
id.includes('app/') ||
|
|
||||||
id.includes('utils/')
|
|
||||||
) {
|
|
||||||
return 'app';
|
|
||||||
}
|
|
||||||
// Keep api separate as it's typically more independent
|
|
||||||
if (id.includes('api/')) return 'api';
|
if (id.includes('api/')) return 'api';
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
@@ -248,8 +227,7 @@ export default defineConfig(
|
|||||||
plugins: [...createBasePlugins(true, true), mockServer()],
|
plugins: [...createBasePlugins(true, true), mockServer()],
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: RESOLVE_ALIASES,
|
alias: RESOLVE_ALIASES,
|
||||||
extensions: RESOLVE_EXTENSIONS,
|
extensions: RESOLVE_EXTENSIONS
|
||||||
tsconfigPaths: true
|
|
||||||
},
|
},
|
||||||
server: {
|
server: {
|
||||||
open: true,
|
open: true,
|
||||||
@@ -278,8 +256,7 @@ export default defineConfig(
|
|||||||
plugins: createBasePlugins(false, true),
|
plugins: createBasePlugins(false, true),
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: RESOLVE_ALIASES,
|
alias: RESOLVE_ALIASES,
|
||||||
extensions: RESOLVE_EXTENSIONS,
|
extensions: RESOLVE_EXTENSIONS
|
||||||
tsconfigPaths: true
|
|
||||||
},
|
},
|
||||||
build: {
|
build: {
|
||||||
...createBaseBuildConfig(),
|
...createBaseBuildConfig(),
|
||||||
@@ -313,8 +290,7 @@ export default defineConfig(
|
|||||||
],
|
],
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: RESOLVE_ALIASES,
|
alias: RESOLVE_ALIASES,
|
||||||
extensions: RESOLVE_EXTENSIONS,
|
extensions: RESOLVE_EXTENSIONS
|
||||||
tsconfigPaths: true
|
|
||||||
},
|
},
|
||||||
build: {
|
build: {
|
||||||
...createBaseBuildConfig(),
|
...createBaseBuildConfig(),
|
||||||
@@ -323,7 +299,8 @@ export default defineConfig(
|
|||||||
rollupOptions: {
|
rollupOptions: {
|
||||||
treeshake: {
|
treeshake: {
|
||||||
moduleSideEffects: false,
|
moduleSideEffects: false,
|
||||||
propertyReadSideEffects: false as const,
|
propertyReadSideEffects: false,
|
||||||
|
tryCatchDeoptimization: false,
|
||||||
unknownGlobalSideEffects: false
|
unknownGlobalSideEffects: false
|
||||||
},
|
},
|
||||||
output: {
|
output: {
|
||||||
|
|||||||
@@ -148,7 +148,9 @@
|
|||||||
#elif defined(ARDUINO_ARCH_ESP32)
|
#elif defined(ARDUINO_ARCH_ESP32)
|
||||||
#include <driver/rtc_io.h>
|
#include <driver/rtc_io.h>
|
||||||
#include <soc/gpio_struct.h>
|
#include <soc/gpio_struct.h>
|
||||||
|
#if ESP_IDF_VERSION_MAJOR >= 5
|
||||||
#include "soc/gpio_periph.h"
|
#include "soc/gpio_periph.h"
|
||||||
|
#endif // ESP_IDF_VERSION_MAJOR >= 5
|
||||||
#define PIN_TO_BASEREG(pin) (0)
|
#define PIN_TO_BASEREG(pin) (0)
|
||||||
#define PIN_TO_BITMASK(pin) (pin)
|
#define PIN_TO_BITMASK(pin) (pin)
|
||||||
#define IO_REG_TYPE uint32_t
|
#define IO_REG_TYPE uint32_t
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ ModbusClientTCPasync::~ModbusClientTCPasync() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// force close client
|
// force close client
|
||||||
MTA_client.close();
|
MTA_client.close(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// optionally manually connect to modbus server. Otherwise connection will be made upon first request
|
// optionally manually connect to modbus server. Otherwise connection will be made upon first request
|
||||||
@@ -79,7 +79,7 @@ void ModbusClientTCPasync::connect(IPAddress host, uint16_t port) {
|
|||||||
// manually disconnect from modbus server. Connection will also auto close after idle time
|
// manually disconnect from modbus server. Connection will also auto close after idle time
|
||||||
void ModbusClientTCPasync::disconnect(bool force) {
|
void ModbusClientTCPasync::disconnect(bool force) {
|
||||||
LOG_D("disconnecting\n");
|
LOG_D("disconnecting\n");
|
||||||
MTA_client.close();
|
MTA_client.close(force);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set timeout value
|
// Set timeout value
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ void ModbusServerTCPasync::onClientConnect(AsyncClient* client) {
|
|||||||
LOG_D("nr clients: %u\n", clients.size());
|
LOG_D("nr clients: %u\n", clients.size());
|
||||||
} else {
|
} else {
|
||||||
LOG_D("max number of clients reached, closing new\n");
|
LOG_D("max number of clients reached, closing new\n");
|
||||||
client->close();
|
client->close(true);
|
||||||
delete client;
|
delete client;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,9 +12,7 @@
|
|||||||
// Include all library components
|
// Include all library components
|
||||||
#include "esp32-psram/AllocatorPSRAM.h" // PSRAM-backed vector
|
#include "esp32-psram/AllocatorPSRAM.h" // PSRAM-backed vector
|
||||||
#include "esp32-psram/VectorPSRAM.h" // PSRAM-backed vector
|
#include "esp32-psram/VectorPSRAM.h" // PSRAM-backed vector
|
||||||
#if CONFIG_IDF_TARGET_ESP32
|
#include "esp32-psram/VectorHIMEM.h" // HIMEM-backed vector
|
||||||
#include "esp32-psram/VectorHIMEM.h" // HIMEM-backed vector (ESP32 only)
|
|
||||||
#endif
|
|
||||||
// #include "esp32-psram/InMemoryFile.h" // File interface using vectors
|
// #include "esp32-psram/InMemoryFile.h" // File interface using vectors
|
||||||
// #include "esp32-psram/PSRAM.h" // PSRAM file system
|
// #include "esp32-psram/PSRAM.h" // PSRAM file system
|
||||||
// #include "esp32-psram/HIMEM.h" // HIMEM file system
|
// #include "esp32-psram/HIMEM.h" // HIMEM file system
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
// HIMEM is only available on original ESP32
|
|
||||||
#if CONFIG_IDF_TARGET_ESP32
|
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
@@ -363,5 +360,3 @@ class HimemBlock {
|
|||||||
};
|
};
|
||||||
|
|
||||||
} // namespace esp32_psram
|
} // namespace esp32_psram
|
||||||
|
|
||||||
#endif // CONFIG_IDF_TARGET_ESP32
|
|
||||||
|
|||||||
@@ -238,9 +238,7 @@ using RingBufferStreamPSRAM = RingBufferStream<VectorPSRAM<uint8_t>>;
|
|||||||
/**
|
/**
|
||||||
* @brief Type alias for a RingBufferStream that uses HIMEM-backed vector storage
|
* @brief Type alias for a RingBufferStream that uses HIMEM-backed vector storage
|
||||||
*/
|
*/
|
||||||
#if CONFIG_IDF_TARGET_ESP32
|
|
||||||
using RingBufferStreamHIMEM = RingBufferStream<VectorHIMEM<uint8_t>>;
|
using RingBufferStreamHIMEM = RingBufferStream<VectorHIMEM<uint8_t>>;
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Type alias for a RingBufferStream that uses std::vector storage
|
* @brief Type alias for a RingBufferStream that uses std::vector storage
|
||||||
|
|||||||
@@ -209,10 +209,8 @@ using TypedRingBufferRAM = TypedRingBuffer<T, std::vector<T>>;
|
|||||||
/**
|
/**
|
||||||
* @brief Type alias for a typed ring buffer that uses HIMEM-backed vector storage
|
* @brief Type alias for a typed ring buffer that uses HIMEM-backed vector storage
|
||||||
*/
|
*/
|
||||||
#if CONFIG_IDF_TARGET_ESP32
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
using TypedRingBufferHIMEM = TypedRingBuffer<T, VectorHIMEM<T>>;
|
using TypedRingBufferHIMEM = TypedRingBuffer<T, VectorHIMEM<T>>;
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Type alias for a typed ring buffer that uses PSRAM-backed vector storage
|
* @brief Type alias for a typed ring buffer that uses PSRAM-backed vector storage
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
// HIMEM is only available on original ESP32
|
|
||||||
#if CONFIG_IDF_TARGET_ESP32
|
|
||||||
|
|
||||||
#include "HimemBlock.h"
|
#include "HimemBlock.h"
|
||||||
|
|
||||||
namespace esp32_psram {
|
namespace esp32_psram {
|
||||||
@@ -530,5 +527,3 @@ void swap(VectorHIMEM<T>& lhs, VectorHIMEM<T>& rhs) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} // namespace esp32_psram
|
} // namespace esp32_psram
|
||||||
|
|
||||||
#endif // CONFIG_IDF_TARGET_ESP32
|
|
||||||
@@ -49,10 +49,6 @@ the LICENSE file.
|
|||||||
#define EMC_CLIENTID_LENGTH 23 + 1
|
#define EMC_CLIENTID_LENGTH 23 + 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef EMSESP_MQTT_STACKSIZE
|
|
||||||
#define EMC_TASK_STACK_SIZE EMSESP_MQTT_STACKSIZE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EMC_TASK_STACK_SIZE
|
#ifndef EMC_TASK_STACK_SIZE
|
||||||
#define EMC_TASK_STACK_SIZE 5120
|
#define EMC_TASK_STACK_SIZE 5120
|
||||||
#endif
|
#endif
|
||||||
@@ -70,10 +66,14 @@ the LICENSE file.
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if EMC_USE_MEMPOOL
|
#if EMC_USE_MEMPOOL
|
||||||
#ifndef EMC_NUM_POOL_ELEMENTS
|
#ifndef EMC_NUM_POOL_ELEMENTS
|
||||||
#define EMC_NUM_POOL_ELEMENTS 32
|
#define EMC_NUM_POOL_ELEMENTS 32
|
||||||
#endif
|
#endif
|
||||||
#ifndef EMC_SIZE_POOL_ELEMENTS
|
#ifndef EMC_SIZE_POOL_ELEMENTS
|
||||||
#define EMC_SIZE_POOL_ELEMENTS 128
|
#define EMC_SIZE_POOL_ELEMENTS 128
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef TASMOTA_SDK
|
||||||
|
#define EMC_CLIENT_SECURE
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -62,19 +62,14 @@ MqttClient::MqttClient(espMqttClientTypes::UseInternalTask useInternalTask, uint
|
|||||||
_xSemaphore = xSemaphoreCreateMutex();
|
_xSemaphore = xSemaphoreCreateMutex();
|
||||||
EMC_SEMAPHORE_GIVE(); // release before first use
|
EMC_SEMAPHORE_GIVE(); // release before first use
|
||||||
if (_useInternalTask == espMqttClientTypes::UseInternalTask::YES) {
|
if (_useInternalTask == espMqttClientTypes::UseInternalTask::YES) {
|
||||||
if (core > 1) {
|
|
||||||
xTaskCreate((TaskFunction_t)_loop, "mqttclient", EMC_TASK_STACK_SIZE, this, priority, &_taskHandle);
|
|
||||||
} else {
|
|
||||||
xTaskCreatePinnedToCore((TaskFunction_t)_loop, "mqttclient", EMC_TASK_STACK_SIZE, this, priority, &_taskHandle, core);
|
xTaskCreatePinnedToCore((TaskFunction_t)_loop, "mqttclient", EMC_TASK_STACK_SIZE, this, priority, &_taskHandle, core);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
(void) useInternalTask;
|
(void) useInternalTask;
|
||||||
(void) priority;
|
(void) priority;
|
||||||
(void) core;
|
(void) core;
|
||||||
#endif
|
#endif
|
||||||
_clientId = _generatedClientId;
|
_clientId = _generatedClientId;
|
||||||
_core = core;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MqttClient::~MqttClient() {
|
MqttClient::~MqttClient() {
|
||||||
|
|||||||
@@ -69,16 +69,6 @@ class MqttClient {
|
|||||||
const char* getClientId() const;
|
const char* getClientId() const;
|
||||||
size_t queueSize(); // No const because of mutex
|
size_t queueSize(); // No const because of mutex
|
||||||
void loop();
|
void loop();
|
||||||
uint32_t stack() {
|
|
||||||
#ifndef EMSESP_STANDALONE
|
|
||||||
return uxTaskGetStackHighWaterMark(_taskHandle);
|
|
||||||
#else
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
uint8_t core() {
|
|
||||||
return _core;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
explicit MqttClient(espMqttClientTypes::UseInternalTask useInternalTask, uint8_t priority = 1, uint8_t core = 1);
|
explicit MqttClient(espMqttClientTypes::UseInternalTask useInternalTask, uint8_t priority = 1, uint8_t core = 1);
|
||||||
@@ -108,7 +98,6 @@ class MqttClient {
|
|||||||
uint8_t _willQos;
|
uint8_t _willQos;
|
||||||
bool _willRetain;
|
bool _willRetain;
|
||||||
uint32_t _timeout;
|
uint32_t _timeout;
|
||||||
uint8_t _core;
|
|
||||||
|
|
||||||
// state is protected to allow state changes by the transport system, defined in child classes
|
// state is protected to allow state changes by the transport system, defined in child classes
|
||||||
// eg. to allow AsyncTCP
|
// eg. to allow AsyncTCP
|
||||||
|
|||||||
@@ -321,14 +321,7 @@ bool Packet::_allocate(size_t remainingLength, bool check) {
|
|||||||
#if EMC_USE_MEMPOOL
|
#if EMC_USE_MEMPOOL
|
||||||
_data = reinterpret_cast<uint8_t*>(_memPool.malloc(_size));
|
_data = reinterpret_cast<uint8_t*>(_memPool.malloc(_size));
|
||||||
#else
|
#else
|
||||||
#ifdef EMSESP_STANDALONE
|
|
||||||
_data = reinterpret_cast<uint8_t*>(malloc(_size));
|
_data = reinterpret_cast<uint8_t*>(malloc(_size));
|
||||||
#else
|
|
||||||
_data = reinterpret_cast<uint8_t*>(ps_malloc(_size));
|
|
||||||
if (!_data) {
|
|
||||||
_data = reinterpret_cast<uint8_t*>(malloc(_size));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
if (!_data) {
|
if (!_data) {
|
||||||
_size = 0;
|
_size = 0;
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ int ClientAsync::read(uint8_t* buf, size_t size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ClientAsync::stop() {
|
void ClientAsync::stop() {
|
||||||
client.close();
|
client.close(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClientAsync::connected() {
|
bool ClientAsync::connected() {
|
||||||
|
|||||||
@@ -6,50 +6,51 @@ For a copy, see <https://opensource.org/licenses/MIT> or
|
|||||||
the LICENSE file.
|
the LICENSE file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef NO_TLS_SUPPORT
|
#if defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32)
|
||||||
|
|
||||||
#include "ClientSecureSync.h"
|
#include "ClientSecureSync.h"
|
||||||
#include <lwip/sockets.h>
|
#include <lwip/sockets.h> // socket options
|
||||||
#include "../Config.h"
|
|
||||||
|
|
||||||
namespace espMqttClientInternals {
|
namespace espMqttClientInternals {
|
||||||
|
|
||||||
ClientSecureSync::ClientSecureSync()
|
ClientSecureSync::ClientSecureSync()
|
||||||
: client() {
|
: client() {
|
||||||
client.setClient(&basic_client, true);
|
// empty
|
||||||
client.setBufferSizes(EMC_RX_BUFFER_SIZE, EMC_TX_BUFFER_SIZE);
|
|
||||||
client.setSessionTimeout(120); // Set the timeout in seconds (>=120 seconds)
|
|
||||||
}
|
|
||||||
|
|
||||||
ClientSecureSync::~ClientSecureSync() {
|
|
||||||
stop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClientSecureSync::connect(IPAddress ip, uint16_t port) {
|
bool ClientSecureSync::connect(IPAddress ip, uint16_t port) {
|
||||||
bool ret = client.connect(ip, port); // implicit conversion of return code int --> bool
|
bool ret = client.connect(ip, port); // implicit conversion of return code int --> bool
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
#if defined(ARDUINO_ARCH_ESP8266)
|
||||||
|
client.setNoDelay(true);
|
||||||
|
#elif defined(ARDUINO_ARCH_ESP32)
|
||||||
// Set TCP option directly to bypass lack of working setNoDelay for WiFiClientSecure
|
// Set TCP option directly to bypass lack of working setNoDelay for WiFiClientSecure
|
||||||
int val = true;
|
int val = true;
|
||||||
basic_client.setSocketOption(IPPROTO_TCP, TCP_NODELAY, &val, sizeof(int));
|
client.setSocketOption(IPPROTO_TCP, TCP_NODELAY, &val, sizeof(int));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClientSecureSync::connect(const char * host, uint16_t port) {
|
bool ClientSecureSync::connect(const char* host, uint16_t port) {
|
||||||
bool ret = client.connect(host, port); // implicit conversion of return code int --> bool
|
bool ret = client.connect(host, port); // implicit conversion of return code int --> bool
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
#if defined(ARDUINO_ARCH_ESP8266)
|
||||||
|
client.setNoDelay(true);
|
||||||
|
#elif defined(ARDUINO_ARCH_ESP32)
|
||||||
// Set TCP option directly to bypass lack of working setNoDelay for WiFiClientSecure
|
// Set TCP option directly to bypass lack of working setNoDelay for WiFiClientSecure
|
||||||
int val = true;
|
int val = true;
|
||||||
basic_client.setSocketOption(IPPROTO_TCP, TCP_NODELAY, &val, sizeof(int));
|
client.setSocketOption(IPPROTO_TCP, TCP_NODELAY, &val, sizeof(int));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ClientSecureSync::write(const uint8_t * buf, size_t size) {
|
size_t ClientSecureSync::write(const uint8_t* buf, size_t size) {
|
||||||
return client.write(buf, size);
|
return client.write(buf, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ClientSecureSync::read(uint8_t * buf, size_t size) {
|
int ClientSecureSync::read(uint8_t* buf, size_t size) {
|
||||||
return client.read(buf, size);
|
return client.read(buf, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,11 +8,15 @@ the LICENSE file.
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#ifndef NO_TLS_SUPPORT
|
#if defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32)
|
||||||
|
|
||||||
// #include "esp_tls.h"
|
// Added for EMS-ESP
|
||||||
|
#include "../Config.h"
|
||||||
|
#if defined(EMC_CLIENT_SECURE)
|
||||||
|
#include <WiFiClientSecure.h> // includes IPAddress
|
||||||
|
#else
|
||||||
#include <WiFiClient.h>
|
#include <WiFiClient.h>
|
||||||
#include <ESP_SSLClient.h>
|
#endif
|
||||||
#include "Transport.h"
|
#include "Transport.h"
|
||||||
|
|
||||||
namespace espMqttClientInternals {
|
namespace espMqttClientInternals {
|
||||||
@@ -20,7 +24,6 @@ namespace espMqttClientInternals {
|
|||||||
class ClientSecureSync : public Transport {
|
class ClientSecureSync : public Transport {
|
||||||
public:
|
public:
|
||||||
ClientSecureSync();
|
ClientSecureSync();
|
||||||
~ClientSecureSync();
|
|
||||||
bool connect(IPAddress ip, uint16_t port) override;
|
bool connect(IPAddress ip, uint16_t port) override;
|
||||||
bool connect(const char * host, uint16_t port) override;
|
bool connect(const char * host, uint16_t port) override;
|
||||||
size_t write(const uint8_t * buf, size_t size) override;
|
size_t write(const uint8_t * buf, size_t size) override;
|
||||||
@@ -28,9 +31,12 @@ class ClientSecureSync : public Transport {
|
|||||||
void stop() override;
|
void stop() override;
|
||||||
bool connected() override;
|
bool connected() override;
|
||||||
bool disconnected() override;
|
bool disconnected() override;
|
||||||
|
// added for EMS-ESP
|
||||||
WiFiClient basic_client;
|
#if defined(EMC_CLIENT_SECURE)
|
||||||
ESP_SSLClient client;
|
WiFiClientSecure client;
|
||||||
|
#else
|
||||||
|
WiFiClient client;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace espMqttClientInternals
|
} // namespace espMqttClientInternals
|
||||||
|
|||||||
@@ -8,6 +8,50 @@ the LICENSE file.
|
|||||||
|
|
||||||
#include "espMqttClient.h"
|
#include "espMqttClient.h"
|
||||||
|
|
||||||
|
#if defined(ARDUINO_ARCH_ESP8266)
|
||||||
|
espMqttClient::espMqttClient()
|
||||||
|
: MqttClientSetup(espMqttClientTypes::UseInternalTask::NO)
|
||||||
|
, _client() {
|
||||||
|
_transport = &_client;
|
||||||
|
}
|
||||||
|
|
||||||
|
espMqttClientSecure::espMqttClientSecure()
|
||||||
|
: MqttClientSetup(espMqttClientTypes::UseInternalTask::NO)
|
||||||
|
, _client() {
|
||||||
|
_transport = &_client;
|
||||||
|
}
|
||||||
|
|
||||||
|
espMqttClientSecure & espMqttClientSecure::setInsecure() {
|
||||||
|
_client.client.setInsecure();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
espMqttClientSecure & espMqttClientSecure::setFingerprint(const uint8_t fingerprint[20]) {
|
||||||
|
_client.client.setFingerprint(fingerprint);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
espMqttClientSecure & espMqttClientSecure::setTrustAnchors(const X509List * ta) {
|
||||||
|
_client.client.setTrustAnchors(ta);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
espMqttClientSecure & espMqttClientSecure::setClientRSACert(const X509List * cert, const PrivateKey * sk) {
|
||||||
|
_client.client.setClientRSACert(cert, sk);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
espMqttClientSecure & espMqttClientSecure::setClientECCert(const X509List * cert, const PrivateKey * sk, unsigned allowed_usages, unsigned cert_issuer_key_type) {
|
||||||
|
_client.client.setClientECCert(cert, sk, allowed_usages, cert_issuer_key_type);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
espMqttClientSecure & espMqttClientSecure::setCertStore(CertStoreBase * certStore) {
|
||||||
|
_client.client.setCertStore(certStore);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(ARDUINO_ARCH_ESP32)
|
#if defined(ARDUINO_ARCH_ESP32)
|
||||||
espMqttClient::espMqttClient(espMqttClientTypes::UseInternalTask useInternalTask)
|
espMqttClient::espMqttClient(espMqttClientTypes::UseInternalTask useInternalTask)
|
||||||
: MqttClientSetup(useInternalTask)
|
: MqttClientSetup(useInternalTask)
|
||||||
@@ -34,35 +78,36 @@ espMqttClientSecure::espMqttClientSecure(uint8_t priority, uint8_t core)
|
|||||||
}
|
}
|
||||||
|
|
||||||
espMqttClientSecure & espMqttClientSecure::setInsecure() {
|
espMqttClientSecure & espMqttClientSecure::setInsecure() {
|
||||||
#ifndef NO_TLS_SUPPORT
|
#if defined(EMC_CLIENT_SECURE)
|
||||||
_client.client.setInsecure();
|
_client.client.setInsecure();
|
||||||
#endif
|
#endif
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
espMqttClientSecure & espMqttClientSecure::setCACert(const char * rootCA) {
|
espMqttClientSecure & espMqttClientSecure::setCACert(const char * rootCA) {
|
||||||
#ifndef NO_TLS_SUPPORT
|
#if defined(EMC_CLIENT_SECURE)
|
||||||
_client.client.setCACert(rootCA);
|
_client.client.setCACert(rootCA);
|
||||||
#endif
|
#endif
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
espMqttClientSecure & espMqttClientSecure::setCertificate(const char * clientCa) {
|
espMqttClientSecure & espMqttClientSecure::setCertificate(const char * clientCa) {
|
||||||
#ifndef NO_TLS_SUPPORT
|
#if defined(EMC_CLIENT_SECURE)
|
||||||
_client.client.setCertificate(clientCa);
|
_client.client.setCertificate(clientCa);
|
||||||
#endif
|
#endif
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
espMqttClientSecure & espMqttClientSecure::setPrivateKey(const char * privateKey) {
|
espMqttClientSecure & espMqttClientSecure::setPrivateKey(const char * privateKey) {
|
||||||
#ifndef NO_TLS_SUPPORT
|
#if defined(EMC_CLIENT_SECURE)
|
||||||
_client.client.setPrivateKey(privateKey);
|
_client.client.setPrivateKey(privateKey);
|
||||||
#endif
|
#endif
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
espMqttClientSecure & espMqttClientSecure::setPreSharedKey(const char * pskIdent, const char * psKey) {
|
espMqttClientSecure & espMqttClientSecure::setPreSharedKey(const char * pskIdent, const char * psKey) {
|
||||||
#ifndef NO_TLS_SUPPORT
|
#if defined(EMC_CLIENT_SECURE)
|
||||||
|
_client.client.setPreSharedKey(pskIdent, psKey);
|
||||||
#endif
|
#endif
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@@ -75,4 +120,9 @@ espMqttClient::espMqttClient()
|
|||||||
, _client() {
|
, _client() {
|
||||||
_transport = &_client;
|
_transport = &_client;
|
||||||
}
|
}
|
||||||
|
#elif defined(_WIN32) || defined(__APPLE__)
|
||||||
|
// Windows
|
||||||
|
espMqttClient::espMqttClient()
|
||||||
|
: MqttClientSetup(espMqttClientTypes::UseInternalTask::NO) {
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -65,16 +65,10 @@ class espMqttClientSecure : public MqttClientSetup<espMqttClientSecure> {
|
|||||||
espMqttClientSecure & setPreSharedKey(const char * pskIdent, const char * psKey);
|
espMqttClientSecure & setPreSharedKey(const char * pskIdent, const char * psKey);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
#ifndef NO_TLS_SUPPORT
|
|
||||||
espMqttClientInternals::ClientSecureSync _client;
|
espMqttClientInternals::ClientSecureSync _client;
|
||||||
#else
|
|
||||||
espMqttClientInternals::ClientSync _client;
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#elif defined(__linux__)
|
||||||
|
|
||||||
#if defined(__linux__)
|
|
||||||
class espMqttClient : public MqttClientSetup<espMqttClient> {
|
class espMqttClient : public MqttClientSetup<espMqttClient> {
|
||||||
public:
|
public:
|
||||||
espMqttClient();
|
espMqttClient();
|
||||||
@@ -82,4 +76,10 @@ class espMqttClient : public MqttClientSetup<espMqttClient> {
|
|||||||
protected:
|
protected:
|
||||||
espMqttClientInternals::ClientPosix _client;
|
espMqttClientInternals::ClientPosix _client;
|
||||||
};
|
};
|
||||||
|
#elif defined(_WIN32) || defined(__APPLE__)
|
||||||
|
class espMqttClient : public MqttClientSetup<espMqttClient> {
|
||||||
|
public:
|
||||||
|
espMqttClient();
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -34,7 +34,6 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <esp32-psram.h>
|
|
||||||
#include <uuid/common.h>
|
#include <uuid/common.h>
|
||||||
#include <uuid/log.h>
|
#include <uuid/log.h>
|
||||||
|
|
||||||
@@ -1648,13 +1647,13 @@ class Shell : public std::enable_shared_from_this<Shell>, public uuid::log::Hand
|
|||||||
|
|
||||||
Stream & stream_; /*!< Stream used for the input/output of this shell. @since 3.0.0 */
|
Stream & stream_; /*!< Stream used for the input/output of this shell. @since 3.0.0 */
|
||||||
std::shared_ptr<Commands> commands_; /*!< Commands available for execution in this shell. @since 0.1.0 */
|
std::shared_ptr<Commands> commands_; /*!< Commands available for execution in this shell. @since 0.1.0 */
|
||||||
std::deque<unsigned int, AllocatorPSRAM<unsigned int>> context_; /*!< Context stack for this shell. Affects which commands are available. Should never be empty. @since 0.1.0 */
|
std::deque<unsigned int> context_; /*!< Context stack for this shell. Affects which commands are available. Should never be empty. @since 0.1.0 */
|
||||||
unsigned int flags_ = 0; /*!< Current flags for this shell. Affects which commands are available. @since 0.1.0 */
|
unsigned int flags_ = 0; /*!< Current flags for this shell. Affects which commands are available. @since 0.1.0 */
|
||||||
#if UUID_CONSOLE_THREAD_SAFE
|
#if UUID_CONSOLE_THREAD_SAFE
|
||||||
mutable std::mutex mutex_; /*!< Mutex for queued log messages. @since 1.0.0 */
|
mutable std::mutex mutex_; /*!< Mutex for queued log messages. @since 1.0.0 */
|
||||||
#endif
|
#endif
|
||||||
unsigned long log_message_id_ = 0; /*!< The next identifier to use for queued log messages. @since 0.1.0 */
|
unsigned long log_message_id_ = 0; /*!< The next identifier to use for queued log messages. @since 0.1.0 */
|
||||||
std::list<QueuedLogMessage, AllocatorPSRAM<QueuedLogMessage>> log_messages_; /*!< Queued log messages, in the order they were received. @since 0.1.0 */
|
std::list<QueuedLogMessage> log_messages_; /*!< Queued log messages, in the order they were received. @since 0.1.0 */
|
||||||
size_t maximum_log_messages_ = MAX_LOG_MESSAGES; /*!< Maximum command line length in bytes. @since 0.6.0 */
|
size_t maximum_log_messages_ = MAX_LOG_MESSAGES; /*!< Maximum command line length in bytes. @since 0.6.0 */
|
||||||
std::string line_buffer_; /*!< Command line buffer. Limited to maximum_command_line_length() bytes. @since 0.1.0 */
|
std::string line_buffer_; /*!< Command line buffer. Limited to maximum_command_line_length() bytes. @since 0.1.0 */
|
||||||
size_t maximum_command_line_length_ = MAX_COMMAND_LINE_LENGTH; /*!< Maximum command line length in bytes. @since 0.6.0 */
|
size_t maximum_command_line_length_ = MAX_COMMAND_LINE_LENGTH; /*!< Maximum command line length in bytes. @since 0.6.0 */
|
||||||
@@ -1787,7 +1786,7 @@ class CommandLine {
|
|||||||
* @return A reference to the parameters.
|
* @return A reference to the parameters.
|
||||||
* @since 0.6.0
|
* @since 0.6.0
|
||||||
*/
|
*/
|
||||||
inline std::vector<std::string, AllocatorPSRAM<std::string>> & operator*() {
|
inline std::vector<std::string> & operator*() {
|
||||||
return parameters_;
|
return parameters_;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@@ -1796,7 +1795,7 @@ class CommandLine {
|
|||||||
* @return A reference to the parameters.
|
* @return A reference to the parameters.
|
||||||
* @since 0.6.0
|
* @since 0.6.0
|
||||||
*/
|
*/
|
||||||
inline const std::vector<std::string, AllocatorPSRAM<std::string>> & operator*() const {
|
inline const std::vector<std::string> & operator*() const {
|
||||||
return parameters_;
|
return parameters_;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@@ -1805,7 +1804,7 @@ class CommandLine {
|
|||||||
* @return A pointer to the parameters.
|
* @return A pointer to the parameters.
|
||||||
* @since 0.4.0
|
* @since 0.4.0
|
||||||
*/
|
*/
|
||||||
inline std::vector<std::string, AllocatorPSRAM<std::string>> * operator->() {
|
inline std::vector<std::string> * operator->() {
|
||||||
return ¶meters_;
|
return ¶meters_;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@@ -1814,7 +1813,7 @@ class CommandLine {
|
|||||||
* @return A pointer to the parameters.
|
* @return A pointer to the parameters.
|
||||||
* @since 0.4.0
|
* @since 0.4.0
|
||||||
*/
|
*/
|
||||||
inline const std::vector<std::string, AllocatorPSRAM<std::string>> * operator->() const {
|
inline const std::vector<std::string> * operator->() const {
|
||||||
return ¶meters_;
|
return ¶meters_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1844,7 +1843,7 @@ class CommandLine {
|
|||||||
bool trailing_space = false; /*!< Command line has a trailing space. @since 0.4.0 */
|
bool trailing_space = false; /*!< Command line has a trailing space. @since 0.4.0 */
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<std::string, AllocatorPSRAM<std::string>> parameters_; /*!< Separate command line parameters. @since 0.4.0 */
|
std::vector<std::string> parameters_; /*!< Separate command line parameters. @since 0.4.0 */
|
||||||
size_t escape_parameters_ = std::numeric_limits<size_t>::max(); /*!< Number of initial arguments to escape in output. @since 0.5.0 */
|
size_t escape_parameters_ = std::numeric_limits<size_t>::max(); /*!< Number of initial arguments to escape in output. @since 0.5.0 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -232,7 +232,7 @@ void Logger::vlog(Level level, const char * format, va_list ap) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Logger::vlog(Level level, Facility facility, const char * format, va_list ap) const {
|
void Logger::vlog(Level level, Facility facility, const char * format, va_list ap) const {
|
||||||
std::vector<char, AllocatorPSRAM<char>> text(MAX_LOG_LENGTH + 1);
|
std::vector<char> text(MAX_LOG_LENGTH + 1);
|
||||||
|
|
||||||
if (vsnprintf(text.data(), text.size(), format, ap) <= 0) {
|
if (vsnprintf(text.data(), text.size(), format, ap) <= 0) {
|
||||||
return;
|
return;
|
||||||
@@ -241,7 +241,7 @@ void Logger::vlog(Level level, Facility facility, const char * format, va_list a
|
|||||||
dispatch(level, facility, text);
|
dispatch(level, facility, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Logger::dispatch(Level level, Facility facility, std::vector<char, AllocatorPSRAM<char>> & text) const {
|
void Logger::dispatch(Level level, Facility facility, std::vector<char> & text) const {
|
||||||
std::shared_ptr<Message> message = std::make_shared<Message>(get_uptime_ms(), level, facility, name_, text.data());
|
std::shared_ptr<Message> message = std::make_shared<Message>(get_uptime_ms(), level, facility, name_, text.data());
|
||||||
text.resize(0);
|
text.resize(0);
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <esp32-psram.h>
|
|
||||||
#include <uuid/common.h>
|
#include <uuid/common.h>
|
||||||
|
|
||||||
#ifndef UUID_COMMON_THREAD_SAFE
|
#ifndef UUID_COMMON_THREAD_SAFE
|
||||||
@@ -646,7 +645,7 @@ class Logger {
|
|||||||
* @param[in] text Log message text.
|
* @param[in] text Log message text.
|
||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
*/
|
*/
|
||||||
void dispatch(Level level, Facility facility, std::vector<char, AllocatorPSRAM<char>> & text) const;
|
void dispatch(Level level, Facility facility, std::vector<char> & text) const;
|
||||||
|
|
||||||
static std::atomic<Level> global_level_; /*!< Minimum global log level across all handlers. @since 3.0.0 */
|
static std::atomic<Level> global_level_; /*!< Minimum global log level across all handlers. @since 3.0.0 */
|
||||||
#if UUID_LOG_THREAD_SAFE
|
#if UUID_LOG_THREAD_SAFE
|
||||||
@@ -724,7 +723,7 @@ class PrintHandler : public uuid::log::Handler {
|
|||||||
mutable std::mutex mutex_; /*!< Mutex for configuration, state and queued log messages. @since 2.3.0 */
|
mutable std::mutex mutex_; /*!< Mutex for configuration, state and queued log messages. @since 2.3.0 */
|
||||||
#endif
|
#endif
|
||||||
size_t maximum_log_messages_ = MAX_LOG_MESSAGES; /*!< Maximum number of log messages to buffer before they are output. @since 2.2.0 */
|
size_t maximum_log_messages_ = MAX_LOG_MESSAGES; /*!< Maximum number of log messages to buffer before they are output. @since 2.2.0 */
|
||||||
std::list<std::shared_ptr<Message>, AllocatorPSRAM<std::shared_ptr<Message>>> log_messages_; /*!< Queued log messages, in the order they were received. @since 2.2.0 */
|
std::list<std::shared_ptr<Message>> log_messages_; /*!< Queued log messages, in the order they were received. @since 2.2.0 */
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace log
|
} // namespace log
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
#include "../../src/core/emsesp.h"
|
#include "../../src/core/emsesp.h"
|
||||||
|
|
||||||
#ifndef UUID_SYSLOG_HAVE_GETTIMEOFDAY
|
#ifndef UUID_SYSLOG_HAVE_GETTIMEOFDAY
|
||||||
#if defined(ARDUINO_ARCH_ESP8266)
|
#if defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32)
|
||||||
// time() does not return UTC on the ESP8266: https://github.com/esp8266/Arduino/issues/4637
|
// time() does not return UTC on the ESP8266: https://github.com/esp8266/Arduino/issues/4637
|
||||||
#define UUID_SYSLOG_HAVE_GETTIMEOFDAY 1
|
#define UUID_SYSLOG_HAVE_GETTIMEOFDAY 1
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -28,7 +28,6 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include <esp32-psram.h>
|
|
||||||
#include <uuid/log.h>
|
#include <uuid/log.h>
|
||||||
|
|
||||||
#ifndef UUID_LOG_THREAD_SAFE
|
#ifndef UUID_LOG_THREAD_SAFE
|
||||||
@@ -322,7 +321,7 @@ class SyslogService : public uuid::log::Handler {
|
|||||||
#endif
|
#endif
|
||||||
size_t maximum_log_messages_ = MAX_LOG_MESSAGES; /*!< Maximum number of log messages to buffer before they are output. @since 1.0.0 */
|
size_t maximum_log_messages_ = MAX_LOG_MESSAGES; /*!< Maximum number of log messages to buffer before they are output. @since 1.0.0 */
|
||||||
unsigned long log_message_id_ = 0; /*!< The next identifier to use for queued log messages. @since 1.0.0 */
|
unsigned long log_message_id_ = 0; /*!< The next identifier to use for queued log messages. @since 1.0.0 */
|
||||||
std::list<QueuedLogMessage, AllocatorPSRAM<QueuedLogMessage>> log_messages_; /*!< Queued log messages, in the order they were received. @since 1.0.0 */
|
std::list<QueuedLogMessage> log_messages_; /*!< Queued log messages, in the order they were received. @since 1.0.0 */
|
||||||
uint64_t mark_interval_ = 0; /*!< Mark interval in milliseconds. @since 2.0.0 */
|
uint64_t mark_interval_ = 0; /*!< Mark interval in milliseconds. @since 2.0.0 */
|
||||||
uint64_t last_message_ = 0; /*!< Last message/mark time. @since 2.0.0 */
|
uint64_t last_message_ = 0; /*!< Last message/mark time. @since 2.0.0 */
|
||||||
|
|
||||||
|
|||||||
@@ -249,7 +249,7 @@ size_t TelnetStream::write(uint8_t data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
size_t TelnetStream::write(const uint8_t * buffer, size_t size) {
|
size_t TelnetStream::write(const uint8_t * buffer, size_t size) {
|
||||||
std::vector<unsigned char, AllocatorPSRAM<unsigned char>> data;
|
std::vector<unsigned char> data;
|
||||||
data.reserve(size);
|
data.reserve(size);
|
||||||
|
|
||||||
while (size-- > 0) {
|
while (size-- > 0) {
|
||||||
@@ -310,7 +310,7 @@ size_t TelnetStream::raw_write(unsigned char data) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t TelnetStream::raw_write(const std::vector<unsigned char, AllocatorPSRAM<unsigned char>> & data) {
|
size_t TelnetStream::raw_write(const std::vector<unsigned char> & data) {
|
||||||
return raw_write(reinterpret_cast<const unsigned char *>(data.data()), data.size());
|
return raw_write(reinterpret_cast<const unsigned char *>(data.data()), data.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,6 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <esp32-psram.h>
|
|
||||||
#include <uuid/console.h>
|
#include <uuid/console.h>
|
||||||
|
|
||||||
namespace uuid {
|
namespace uuid {
|
||||||
@@ -204,7 +203,7 @@ class TelnetStream : public ::Stream {
|
|||||||
* @return The number of bytes that were output.
|
* @return The number of bytes that were output.
|
||||||
* @since 0.1.0
|
* @since 0.1.0
|
||||||
*/
|
*/
|
||||||
size_t raw_write(const std::vector<unsigned char, AllocatorPSRAM<unsigned char>> & data);
|
size_t raw_write(const std::vector<unsigned char> & data);
|
||||||
/**
|
/**
|
||||||
* Write an array of bytes directly to the output stream.
|
* Write an array of bytes directly to the output stream.
|
||||||
*
|
*
|
||||||
@@ -223,7 +222,7 @@ class TelnetStream : public ::Stream {
|
|||||||
unsigned char previous_in_ = 0; /*!< Previous character that was received. Used to detect CR NUL. @since 0.1.0 */
|
unsigned char previous_in_ = 0; /*!< Previous character that was received. Used to detect CR NUL. @since 0.1.0 */
|
||||||
unsigned char previous_out_ = 0; /*!< Previous character that was sent. Used to insert NUL after CR without LF. @since 0.1.0 */
|
unsigned char previous_out_ = 0; /*!< Previous character that was sent. Used to insert NUL after CR without LF. @since 0.1.0 */
|
||||||
int peek_ = -1; /*!< Previously read data cached by peek(). @since 0.1.0 */
|
int peek_ = -1; /*!< Previously read data cached by peek(). @since 0.1.0 */
|
||||||
std::vector<char, AllocatorPSRAM<char>> output_buffer_; /*!< Buffer data to be output until a read function is called. @since 0.1.0 */
|
std::vector<char> output_buffer_; /*!< Buffer data to be output until a read function is called. @since 0.1.0 */
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -426,7 +425,7 @@ class TelnetService {
|
|||||||
|
|
||||||
WiFiServer server_; /*!< TCP server. @since 0.1.0 */
|
WiFiServer server_; /*!< TCP server. @since 0.1.0 */
|
||||||
size_t maximum_connections_ = MAX_CONNECTIONS; /*!< Maximum number of concurrent open connections. @since 0.1.0 */
|
size_t maximum_connections_ = MAX_CONNECTIONS; /*!< Maximum number of concurrent open connections. @since 0.1.0 */
|
||||||
std::list<Connection, AllocatorPSRAM<Connection>> connections_; /*!< Open connections. @since 0.1.0 */
|
std::list<Connection> connections_; /*!< Open connections. @since 0.1.0 */
|
||||||
shell_factory_function shell_factory_; /*!< Function to create a shell. @since 0.1.0 */
|
shell_factory_function shell_factory_; /*!< Function to create a shell. @since 0.1.0 */
|
||||||
unsigned long initial_idle_timeout_ = DEFAULT_IDLE_TIMEOUT; /*!< Initial idle timeout (in seconds). @since 0.1.0 */
|
unsigned long initial_idle_timeout_ = DEFAULT_IDLE_TIMEOUT; /*!< Initial idle timeout (in seconds). @since 0.1.0 */
|
||||||
unsigned long write_timeout_ = DEFAULT_WRITE_TIMEOUT; /*!< Write timeout (in milliseconds). @since 0.1.0 */
|
unsigned long write_timeout_ = DEFAULT_WRITE_TIMEOUT; /*!< Write timeout (in milliseconds). @since 0.1.0 */
|
||||||
|
|||||||
@@ -145,7 +145,6 @@ double ledcSetup(uint8_t chan, double freq, uint8_t bit_num) {
|
|||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
void ledcAttachPin(uint8_t pin, uint8_t chan) {};
|
void ledcAttachPin(uint8_t pin, uint8_t chan) {};
|
||||||
void ledcAttach(uint8_t pin, uint8_t chan, uint8_t bit_num) {};
|
|
||||||
void ledcWrite(uint8_t chan, uint32_t duty) {};
|
void ledcWrite(uint8_t chan, uint32_t duty) {};
|
||||||
void neopixelWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val) {};
|
void neopixelWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val) {};
|
||||||
void rgbLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val) {};
|
void rgbLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val) {};
|
||||||
|
|||||||
@@ -72,15 +72,10 @@ void analogSetAttenuation(adc_attenuation_t attenuation);
|
|||||||
void dacWrite(uint8_t pin, uint8_t value);
|
void dacWrite(uint8_t pin, uint8_t value);
|
||||||
double ledcSetup(uint8_t chan, double freq, uint8_t bit_num);
|
double ledcSetup(uint8_t chan, double freq, uint8_t bit_num);
|
||||||
void ledcAttachPin(uint8_t pin, uint8_t chan);
|
void ledcAttachPin(uint8_t pin, uint8_t chan);
|
||||||
void ledcAttach(uint8_t pin, uint8_t chan, uint8_t bit_num);
|
|
||||||
void ledcWrite(uint8_t chan, uint32_t duty);
|
void ledcWrite(uint8_t chan, uint32_t duty);
|
||||||
void neopixelWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val);
|
void neopixelWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val);
|
||||||
void rgbLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val);
|
void rgbLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val);
|
||||||
|
|
||||||
inline int rtc_get_reset_reason(int cpu_no) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define PROGMEM
|
#define PROGMEM
|
||||||
#define PGM_P const char *
|
#define PGM_P const char *
|
||||||
|
|
||||||
|
|||||||
@@ -19,164 +19,12 @@ class AsyncClient {
|
|||||||
class AsyncServer {
|
class AsyncServer {
|
||||||
public:
|
public:
|
||||||
AsyncServer(uint16_t port)
|
AsyncServer(uint16_t port)
|
||||||
: _port(port) {};
|
: _port(port){};
|
||||||
~AsyncServer() {};
|
~AsyncServer(){};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
uint16_t _port;
|
uint16_t _port;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace asyncsrv {
|
|
||||||
|
|
||||||
static constexpr const char empty[] = "";
|
|
||||||
|
|
||||||
static constexpr const char T__opaque[] = "\", opaque=\"";
|
|
||||||
static constexpr const char T_100_CONTINUE[] = "100-continue";
|
|
||||||
static constexpr const char T_13[] = "13";
|
|
||||||
static constexpr const char T_ACCEPT[] = "Accept";
|
|
||||||
static constexpr const char T_Accept_Ranges[] = "Accept-Ranges";
|
|
||||||
static constexpr const char T_attachment[] = "attachment; filename=\"";
|
|
||||||
static constexpr const char T_AUTH[] = "Authorization";
|
|
||||||
static constexpr const char T_auth_nonce[] = "\", qop=\"auth\", nonce=\"";
|
|
||||||
static constexpr const char T_BASIC[] = "Basic";
|
|
||||||
static constexpr const char T_BASIC_REALM[] = "Basic realm=\"";
|
|
||||||
static constexpr const char T_BEARER[] = "Bearer";
|
|
||||||
static constexpr const char T_BODY[] = "body";
|
|
||||||
static constexpr const char T_Cache_Control[] = "Cache-Control";
|
|
||||||
static constexpr const char T_chunked[] = "chunked";
|
|
||||||
static constexpr const char T_close[] = "close";
|
|
||||||
static constexpr const char T_cnonce[] = "cnonce";
|
|
||||||
static constexpr const char T_Connection[] = "Connection";
|
|
||||||
static constexpr const char T_Content_Disposition[] = "Content-Disposition";
|
|
||||||
static constexpr const char T_Content_Encoding[] = "Content-Encoding";
|
|
||||||
static constexpr const char T_Content_Length[] = "Content-Length";
|
|
||||||
static constexpr const char T_Content_Type[] = "Content-Type";
|
|
||||||
static constexpr const char T_Content_Location[] = "Content-Location";
|
|
||||||
static constexpr const char T_Cookie[] = "Cookie";
|
|
||||||
static constexpr const char T_CORS_ACAC[] = "Access-Control-Allow-Credentials";
|
|
||||||
static constexpr const char T_CORS_ACAH[] = "Access-Control-Allow-Headers";
|
|
||||||
static constexpr const char T_CORS_ACAM[] = "Access-Control-Allow-Methods";
|
|
||||||
static constexpr const char T_CORS_ACAO[] = "Access-Control-Allow-Origin";
|
|
||||||
static constexpr const char T_CORS_ACMA[] = "Access-Control-Max-Age";
|
|
||||||
static constexpr const char T_CORS_O[] = "Origin";
|
|
||||||
static constexpr const char T_data_[] = "data: ";
|
|
||||||
static constexpr const char T_Date[] = "Date";
|
|
||||||
static constexpr const char T_DIGEST[] = "Digest";
|
|
||||||
static constexpr const char T_DIGEST_[] = "Digest ";
|
|
||||||
static constexpr const char T_ETag[] = "ETag";
|
|
||||||
static constexpr const char T_event_[] = "event: ";
|
|
||||||
static constexpr const char T_EXPECT[] = "Expect";
|
|
||||||
static constexpr const char T_FALSE[] = "false";
|
|
||||||
static constexpr const char T_filename[] = "filename";
|
|
||||||
static constexpr const char T_gzip[] = "gzip";
|
|
||||||
static constexpr const char T_Host[] = "host";
|
|
||||||
static constexpr const char T_HTTP_1_0[] = "HTTP/1.0";
|
|
||||||
static constexpr const char T_HTTP_100_CONT[] = "HTTP/1.1 100 Continue\r\n\r\n";
|
|
||||||
static constexpr const char T_id__[] = "id: ";
|
|
||||||
static constexpr const char T_IMS[] = "If-Modified-Since";
|
|
||||||
static constexpr const char T_INM[] = "If-None-Match";
|
|
||||||
static constexpr const char T_inline[] = "inline";
|
|
||||||
static constexpr const char T_keep_alive[] = "keep-alive";
|
|
||||||
static constexpr const char T_Last_Event_ID[] = "Last-Event-ID";
|
|
||||||
static constexpr const char T_Last_Modified[] = "Last-Modified";
|
|
||||||
static constexpr const char T_LOCATION[] = "Location";
|
|
||||||
static constexpr const char T_LOGIN_REQ[] = "Login Required";
|
|
||||||
static constexpr const char T_MULTIPART_[] = "multipart/";
|
|
||||||
static constexpr const char T_name[] = "name";
|
|
||||||
static constexpr const char T_nc[] = "nc";
|
|
||||||
static constexpr const char T_no_cache[] = "no-cache";
|
|
||||||
static constexpr const char T_nonce[] = "nonce";
|
|
||||||
static constexpr const char T_none[] = "none";
|
|
||||||
static constexpr const char T_opaque[] = "opaque";
|
|
||||||
static constexpr const char T_qop[] = "qop";
|
|
||||||
static constexpr const char T_realm[] = "realm";
|
|
||||||
static constexpr const char T_realm__[] = "realm=\"";
|
|
||||||
static constexpr const char T_response[] = "response";
|
|
||||||
static constexpr const char T_retry_[] = "retry: ";
|
|
||||||
static constexpr const char T_retry_after[] = "Retry-After";
|
|
||||||
static constexpr const char T_nn[] = "\n\n";
|
|
||||||
static constexpr const char T_rn[] = "\r\n";
|
|
||||||
static constexpr const char T_rnrn[] = "\r\n\r\n";
|
|
||||||
static constexpr const char T_Server[] = "Server";
|
|
||||||
static constexpr const char T_Transfer_Encoding[] = "Transfer-Encoding";
|
|
||||||
static constexpr const char T_TRUE[] = "true";
|
|
||||||
static constexpr const char T_UPGRADE[] = "Upgrade";
|
|
||||||
static constexpr const char T_uri[] = "uri";
|
|
||||||
static constexpr const char T_username[] = "username";
|
|
||||||
static constexpr const char T_WS[] = "websocket";
|
|
||||||
static constexpr const char T_WWW_AUTH[] = "WWW-Authenticate";
|
|
||||||
|
|
||||||
// HTTP Methods
|
|
||||||
static constexpr const char T_ANY[] = "ANY";
|
|
||||||
static constexpr const char T_GET[] = "GET";
|
|
||||||
static constexpr const char T_POST[] = "POST";
|
|
||||||
static constexpr const char T_PUT[] = "PUT";
|
|
||||||
static constexpr const char T_DELETE[] = "DELETE";
|
|
||||||
static constexpr const char T_PATCH[] = "PATCH";
|
|
||||||
static constexpr const char T_HEAD[] = "HEAD";
|
|
||||||
static constexpr const char T_OPTIONS[] = "OPTIONS";
|
|
||||||
static constexpr const char T_UNKNOWN[] = "UNKNOWN";
|
|
||||||
|
|
||||||
// Req content types
|
|
||||||
static constexpr const char T_RCT_NOT_USED[] = "RCT_NOT_USED";
|
|
||||||
static constexpr const char T_RCT_DEFAULT[] = "RCT_DEFAULT";
|
|
||||||
static constexpr const char T_RCT_HTTP[] = "RCT_HTTP";
|
|
||||||
static constexpr const char T_RCT_WS[] = "RCT_WS";
|
|
||||||
static constexpr const char T_RCT_EVENT[] = "RCT_EVENT";
|
|
||||||
static constexpr const char T_ERROR[] = "ERROR";
|
|
||||||
|
|
||||||
// extensions & MIME-Types
|
|
||||||
static constexpr const char T__avif[] = ".avif"; // AVIF: Highly compressed images. Compatible with all modern browsers.
|
|
||||||
static constexpr const char T__csv[] = ".csv"; // CSV: Data logging and configuration
|
|
||||||
static constexpr const char T__css[] = ".css"; // CSS: Styling for web interfaces
|
|
||||||
static constexpr const char T__gif[] = ".gif"; // GIF: Simple animations. Legacy support
|
|
||||||
static constexpr const char T__gz[] = ".gz"; // GZ: compressed files
|
|
||||||
static constexpr const char T__htm[] = ".htm"; // HTM: Web interface files
|
|
||||||
static constexpr const char T__html[] = ".html"; // HTML: Web interface files
|
|
||||||
static constexpr const char T__ico[] = ".ico"; // ICO: Favicons, system icons. Legacy support
|
|
||||||
static constexpr const char T__jpg[] = ".jpg"; // JPEG/JPG: Photos. Legacy support
|
|
||||||
static constexpr const char T__js[] = ".js"; // JavaScript: Interactive functionality
|
|
||||||
static constexpr const char T__json[] = ".json"; // JSON: Data exchange format
|
|
||||||
static constexpr const char T__mp4[] = ".mp4"; // MP4: Proprietary format. Worse compression than WEBM.
|
|
||||||
static constexpr const char T__mjs[] = ".mjs"; // MJS: JavaScript module format
|
|
||||||
static constexpr const char T__opus[] = ".opus"; // OPUS: High compression audio format
|
|
||||||
static constexpr const char T__pdf[] = ".pdf"; // PDF: Universal document format
|
|
||||||
static constexpr const char T__png[] = ".png"; // PNG: Icons, logos, transparency. Legacy support
|
|
||||||
static constexpr const char T__svg[] = ".svg"; // SVG: Vector graphics, icons (scalable, tiny file sizes)
|
|
||||||
static constexpr const char T__ttf[] = ".ttf"; // TTF: Font file. Legacy support
|
|
||||||
static constexpr const char T__txt[] = ".txt"; // TXT: Plain text files
|
|
||||||
static constexpr const char T__webm[] = ".webm"; // WebM: Video. Open source, optimized for web. Compatible with all modern browsers.
|
|
||||||
static constexpr const char T__webp[] = ".webp"; // WebP: Highly compressed images. Compatible with all modern browsers.
|
|
||||||
static constexpr const char T__woff[] = ".woff"; // WOFF: Font file. Legacy support
|
|
||||||
static constexpr const char T__woff2[] = ".woff2"; // WOFF2: Better compression. Compatible with all modern browsers.
|
|
||||||
static constexpr const char T__xml[] = ".xml"; // XML: Configuration and data files
|
|
||||||
static constexpr const char T_application_javascript[] = "application/javascript"; // Obsolete type for JavaScript
|
|
||||||
static constexpr const char T_application_json[] = "application/json";
|
|
||||||
static constexpr const char T_application_msgpack[] = "application/msgpack";
|
|
||||||
static constexpr const char T_application_octet_stream[] = "application/octet-stream";
|
|
||||||
static constexpr const char T_application_pdf[] = "application/pdf";
|
|
||||||
static constexpr const char T_app_xform_urlencoded[] = "application/x-www-form-urlencoded";
|
|
||||||
static constexpr const char T_audio_opus[] = "audio/opus";
|
|
||||||
static constexpr const char T_font_ttf[] = "font/ttf";
|
|
||||||
static constexpr const char T_font_woff[] = "font/woff";
|
|
||||||
static constexpr const char T_font_woff2[] = "font/woff2";
|
|
||||||
static constexpr const char T_image_avif[] = "image/avif";
|
|
||||||
static constexpr const char T_image_gif[] = "image/gif";
|
|
||||||
static constexpr const char T_image_jpeg[] = "image/jpeg";
|
|
||||||
static constexpr const char T_image_png[] = "image/png";
|
|
||||||
static constexpr const char T_image_svg_xml[] = "image/svg+xml";
|
|
||||||
static constexpr const char T_image_webp[] = "image/webp";
|
|
||||||
static constexpr const char T_image_x_icon[] = "image/x-icon";
|
|
||||||
static constexpr const char T_text_css[] = "text/css";
|
|
||||||
static constexpr const char T_text_csv[] = "text/csv";
|
|
||||||
static constexpr const char T_text_event_stream[] = "text/event-stream";
|
|
||||||
static constexpr const char T_text_html[] = "text/html";
|
|
||||||
static constexpr const char T_text_javascript[] = "text/javascript";
|
|
||||||
static constexpr const char T_text_plain[] = "text/plain";
|
|
||||||
static constexpr const char T_text_xml[] = "text/xml";
|
|
||||||
static constexpr const char T_video_mp4[] = "video/mp4";
|
|
||||||
static constexpr const char T_video_webm[] = "video/webm";
|
|
||||||
} // namespace asyncsrv
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ class DummySettings {
|
|||||||
uint8_t nested_format = 1; // 1=nested 2=single
|
uint8_t nested_format = 1; // 1=nested 2=single
|
||||||
String discovery_prefix = "homeassistant";
|
String discovery_prefix = "homeassistant";
|
||||||
uint8_t discovery_type = 0; // HA
|
uint8_t discovery_type = 0; // HA
|
||||||
uint8_t ha_number_mode = 0; // box
|
|
||||||
bool ha_enabled = true;
|
bool ha_enabled = true;
|
||||||
String base = "ems-esp";
|
String base = "ems-esp";
|
||||||
bool publish_single = false;
|
bool publish_single = false;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* EMS-ESP - https://github.com/emsesp/EMS-ESP
|
* EMS-ESP - https://github.com/emsesp/EMS-ESP
|
||||||
* Copyright 2020-2025 emsesp.org
|
* Copyright 2020-2025 emsesp.org - proddy, MichaelDvP
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* EMS-ESP - https://github.com/emsesp/EMS-ESP
|
* EMS-ESP - https://github.com/emsesp/EMS-ESP
|
||||||
* Copyright 2020-2025 emsesp.org
|
* Copyright 2020-2025 emsesp.org - proddy, MichaelDvP
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -67,9 +67,6 @@ class Preferences {
|
|||||||
size_t putString(const char * key, String value) {
|
size_t putString(const char * key, String value) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
bool isKey(const char * key) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// unused....
|
// unused....
|
||||||
|
|
||||||
@@ -87,6 +84,7 @@ class Preferences {
|
|||||||
// size_t putBool(const char * key, bool value);
|
// size_t putBool(const char * key, bool value);
|
||||||
|
|
||||||
// size_t putBytes(const char * key, const void * value, size_t len);
|
// size_t putBytes(const char * key, const void * value, size_t len);
|
||||||
|
// bool isKey(const char * key);
|
||||||
// PreferenceType getType(const char * key);
|
// PreferenceType getType(const char * key);
|
||||||
// int8_t getChar(const char * key, int8_t defaultValue = 0);
|
// int8_t getChar(const char * key, int8_t defaultValue = 0);
|
||||||
// int16_t getShort(const char * key, int16_t defaultValue = 0);
|
// int16_t getShort(const char * key, int16_t defaultValue = 0);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* EMS-ESP - https://github.com/emsesp/EMS-ESP
|
* EMS-ESP - https://github.com/emsesp/EMS-ESP
|
||||||
* Copyright 2020-2025 emsesp.org
|
* Copyright 2020-2025 emsesp.org - proddy, MichaelDvP
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* EMS-ESP - https://github.com/emsesp/EMS-ESP
|
* EMS-ESP - https://github.com/emsesp/EMS-ESP
|
||||||
* Copyright 2020-2025 emsesp.org
|
* Copyright 2020-2025 emsesp.org - proddy, MichaelDvP
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1 +1,13 @@
|
|||||||
Refer to the [EMS-ESP documentation](https://emsesp.org/Building#webui-development) on how to run the mock Web server.
|
When developing and testing the web interface, it's handy not to bother with re-flashing an ESP32 each time. The idea is to mimic the ESP using a mock/stub server that responds to the REST (HTTP POST & GET) and WebSocket calls.
|
||||||
|
|
||||||
|
# prerequisites
|
||||||
|
|
||||||
|
- Install the latest LTS of NodeJS
|
||||||
|
- install corepack `npm install -g corepack@latest` and `orepack enable`
|
||||||
|
- Install pnpm (`corepack use pnpm@latest-10` on linux or `winget install -e --id pnpm.pnpm` on windows). See <https://pnpm.io/installation>
|
||||||
|
- Install bun (<https://bun.sh/docs/installation>)
|
||||||
|
- type `pnpm install` from this `mock-api` folder to build
|
||||||
|
|
||||||
|
# To run
|
||||||
|
|
||||||
|
- `pnpm standalone` from the main `interface` folder and then navigate to <http://localhost:3000>
|
||||||
|
|||||||
@@ -10,10 +10,10 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@msgpack/msgpack": "^3.1.3",
|
"@msgpack/msgpack": "^3.1.3",
|
||||||
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
"@trivago/prettier-plugin-sort-imports": "^6.0.0",
|
||||||
"formidable": "^3.5.4",
|
"formidable": "^3.5.4",
|
||||||
"itty-router": "^5.0.23",
|
"itty-router": "^5.0.22",
|
||||||
"prettier": "^3.8.1"
|
"prettier": "^3.7.4"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@10.32.1+sha512.a706938f0e89ac1456b6563eab4edf1d1faf3368d1191fc5c59790e96dc918e4456ab2e67d613de1043d2e8c81f87303e6b40d4ffeca9df15ef1ad567348f2be"
|
"packageManager": "pnpm@10.27.0+sha512.72d699da16b1179c14ba9e64dc71c9a40988cbdc65c264cb0e489db7de917f20dcf4d64d8723625f2969ba52d4b7e2a1170682d9ac2a5dcaeaab732b7e16f04a"
|
||||||
}
|
}
|
||||||
|
|||||||
316
mock-api/pnpm-lock.yaml
generated
316
mock-api/pnpm-lock.yaml
generated
@@ -1,316 +0,0 @@
|
|||||||
lockfileVersion: '9.0'
|
|
||||||
|
|
||||||
settings:
|
|
||||||
autoInstallPeers: true
|
|
||||||
excludeLinksFromLockfile: false
|
|
||||||
|
|
||||||
importers:
|
|
||||||
|
|
||||||
.:
|
|
||||||
dependencies:
|
|
||||||
'@msgpack/msgpack':
|
|
||||||
specifier: ^3.1.3
|
|
||||||
version: 3.1.3
|
|
||||||
'@trivago/prettier-plugin-sort-imports':
|
|
||||||
specifier: ^6.0.2
|
|
||||||
version: 6.0.2(prettier@3.8.1)
|
|
||||||
formidable:
|
|
||||||
specifier: ^3.5.4
|
|
||||||
version: 3.5.4
|
|
||||||
itty-router:
|
|
||||||
specifier: ^5.0.23
|
|
||||||
version: 5.0.23
|
|
||||||
prettier:
|
|
||||||
specifier: ^3.8.1
|
|
||||||
version: 3.8.1
|
|
||||||
|
|
||||||
packages:
|
|
||||||
|
|
||||||
'@babel/code-frame@7.29.0':
|
|
||||||
resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==}
|
|
||||||
engines: {node: '>=6.9.0'}
|
|
||||||
|
|
||||||
'@babel/generator@7.29.1':
|
|
||||||
resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==}
|
|
||||||
engines: {node: '>=6.9.0'}
|
|
||||||
|
|
||||||
'@babel/helper-globals@7.28.0':
|
|
||||||
resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
|
|
||||||
engines: {node: '>=6.9.0'}
|
|
||||||
|
|
||||||
'@babel/helper-string-parser@7.27.1':
|
|
||||||
resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
|
|
||||||
engines: {node: '>=6.9.0'}
|
|
||||||
|
|
||||||
'@babel/helper-validator-identifier@7.28.5':
|
|
||||||
resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
|
|
||||||
engines: {node: '>=6.9.0'}
|
|
||||||
|
|
||||||
'@babel/parser@7.29.2':
|
|
||||||
resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==}
|
|
||||||
engines: {node: '>=6.0.0'}
|
|
||||||
hasBin: true
|
|
||||||
|
|
||||||
'@babel/template@7.28.6':
|
|
||||||
resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==}
|
|
||||||
engines: {node: '>=6.9.0'}
|
|
||||||
|
|
||||||
'@babel/traverse@7.29.0':
|
|
||||||
resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==}
|
|
||||||
engines: {node: '>=6.9.0'}
|
|
||||||
|
|
||||||
'@babel/types@7.29.0':
|
|
||||||
resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
|
|
||||||
engines: {node: '>=6.9.0'}
|
|
||||||
|
|
||||||
'@jridgewell/gen-mapping@0.3.13':
|
|
||||||
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
|
|
||||||
|
|
||||||
'@jridgewell/resolve-uri@3.1.2':
|
|
||||||
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
|
|
||||||
engines: {node: '>=6.0.0'}
|
|
||||||
|
|
||||||
'@jridgewell/sourcemap-codec@1.5.5':
|
|
||||||
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
|
|
||||||
|
|
||||||
'@jridgewell/trace-mapping@0.3.31':
|
|
||||||
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
|
|
||||||
|
|
||||||
'@msgpack/msgpack@3.1.3':
|
|
||||||
resolution: {integrity: sha512-47XIizs9XZXvuJgoaJUIE2lFoID8ugvc0jzSHP+Ptfk8nTbnR8g788wv48N03Kx0UkAv559HWRQ3yzOgzlRNUA==}
|
|
||||||
engines: {node: '>= 18'}
|
|
||||||
|
|
||||||
'@noble/hashes@1.8.0':
|
|
||||||
resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==}
|
|
||||||
engines: {node: ^14.21.3 || >=16}
|
|
||||||
|
|
||||||
'@paralleldrive/cuid2@2.3.1':
|
|
||||||
resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==}
|
|
||||||
|
|
||||||
'@trivago/prettier-plugin-sort-imports@6.0.2':
|
|
||||||
resolution: {integrity: sha512-3DgfkukFyC/sE/VuYjaUUWoFfuVjPK55vOFDsxD56XXynFMCZDYFogH2l/hDfOsQAm1myoU/1xByJ3tWqtulXA==}
|
|
||||||
engines: {node: '>= 20'}
|
|
||||||
peerDependencies:
|
|
||||||
'@vue/compiler-sfc': 3.x
|
|
||||||
prettier: 2.x - 3.x
|
|
||||||
prettier-plugin-ember-template-tag: '>= 2.0.0'
|
|
||||||
prettier-plugin-svelte: 3.x
|
|
||||||
svelte: 4.x || 5.x
|
|
||||||
peerDependenciesMeta:
|
|
||||||
'@vue/compiler-sfc':
|
|
||||||
optional: true
|
|
||||||
prettier-plugin-ember-template-tag:
|
|
||||||
optional: true
|
|
||||||
prettier-plugin-svelte:
|
|
||||||
optional: true
|
|
||||||
svelte:
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
asap@2.0.6:
|
|
||||||
resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
|
|
||||||
|
|
||||||
balanced-match@1.0.2:
|
|
||||||
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
|
||||||
|
|
||||||
brace-expansion@2.0.2:
|
|
||||||
resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
|
|
||||||
|
|
||||||
debug@4.4.3:
|
|
||||||
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
|
|
||||||
engines: {node: '>=6.0'}
|
|
||||||
peerDependencies:
|
|
||||||
supports-color: '*'
|
|
||||||
peerDependenciesMeta:
|
|
||||||
supports-color:
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
dezalgo@1.0.4:
|
|
||||||
resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==}
|
|
||||||
|
|
||||||
formidable@3.5.4:
|
|
||||||
resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==}
|
|
||||||
engines: {node: '>=14.0.0'}
|
|
||||||
|
|
||||||
itty-router@5.0.23:
|
|
||||||
resolution: {integrity: sha512-i49WU+SNPrwOZA4Z61En1RYd5h2Lcqa+5IvCpMrNi4dxymzJK15ozUUnRrWIUAv95Zamd4eJPAot2UvHRrQg7w==}
|
|
||||||
|
|
||||||
javascript-natural-sort@0.7.1:
|
|
||||||
resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==}
|
|
||||||
|
|
||||||
js-tokens@4.0.0:
|
|
||||||
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
|
|
||||||
|
|
||||||
jsesc@3.1.0:
|
|
||||||
resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
|
|
||||||
engines: {node: '>=6'}
|
|
||||||
hasBin: true
|
|
||||||
|
|
||||||
lodash-es@4.17.23:
|
|
||||||
resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==}
|
|
||||||
|
|
||||||
minimatch@9.0.9:
|
|
||||||
resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==}
|
|
||||||
engines: {node: '>=16 || 14 >=14.17'}
|
|
||||||
|
|
||||||
ms@2.1.3:
|
|
||||||
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
|
|
||||||
|
|
||||||
once@1.4.0:
|
|
||||||
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
|
|
||||||
|
|
||||||
parse-imports-exports@0.2.4:
|
|
||||||
resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==}
|
|
||||||
|
|
||||||
parse-statements@1.0.11:
|
|
||||||
resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==}
|
|
||||||
|
|
||||||
picocolors@1.1.1:
|
|
||||||
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
|
|
||||||
|
|
||||||
prettier@3.8.1:
|
|
||||||
resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==}
|
|
||||||
engines: {node: '>=14'}
|
|
||||||
hasBin: true
|
|
||||||
|
|
||||||
wrappy@1.0.2:
|
|
||||||
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
|
||||||
|
|
||||||
snapshots:
|
|
||||||
|
|
||||||
'@babel/code-frame@7.29.0':
|
|
||||||
dependencies:
|
|
||||||
'@babel/helper-validator-identifier': 7.28.5
|
|
||||||
js-tokens: 4.0.0
|
|
||||||
picocolors: 1.1.1
|
|
||||||
|
|
||||||
'@babel/generator@7.29.1':
|
|
||||||
dependencies:
|
|
||||||
'@babel/parser': 7.29.2
|
|
||||||
'@babel/types': 7.29.0
|
|
||||||
'@jridgewell/gen-mapping': 0.3.13
|
|
||||||
'@jridgewell/trace-mapping': 0.3.31
|
|
||||||
jsesc: 3.1.0
|
|
||||||
|
|
||||||
'@babel/helper-globals@7.28.0': {}
|
|
||||||
|
|
||||||
'@babel/helper-string-parser@7.27.1': {}
|
|
||||||
|
|
||||||
'@babel/helper-validator-identifier@7.28.5': {}
|
|
||||||
|
|
||||||
'@babel/parser@7.29.2':
|
|
||||||
dependencies:
|
|
||||||
'@babel/types': 7.29.0
|
|
||||||
|
|
||||||
'@babel/template@7.28.6':
|
|
||||||
dependencies:
|
|
||||||
'@babel/code-frame': 7.29.0
|
|
||||||
'@babel/parser': 7.29.2
|
|
||||||
'@babel/types': 7.29.0
|
|
||||||
|
|
||||||
'@babel/traverse@7.29.0':
|
|
||||||
dependencies:
|
|
||||||
'@babel/code-frame': 7.29.0
|
|
||||||
'@babel/generator': 7.29.1
|
|
||||||
'@babel/helper-globals': 7.28.0
|
|
||||||
'@babel/parser': 7.29.2
|
|
||||||
'@babel/template': 7.28.6
|
|
||||||
'@babel/types': 7.29.0
|
|
||||||
debug: 4.4.3
|
|
||||||
transitivePeerDependencies:
|
|
||||||
- supports-color
|
|
||||||
|
|
||||||
'@babel/types@7.29.0':
|
|
||||||
dependencies:
|
|
||||||
'@babel/helper-string-parser': 7.27.1
|
|
||||||
'@babel/helper-validator-identifier': 7.28.5
|
|
||||||
|
|
||||||
'@jridgewell/gen-mapping@0.3.13':
|
|
||||||
dependencies:
|
|
||||||
'@jridgewell/sourcemap-codec': 1.5.5
|
|
||||||
'@jridgewell/trace-mapping': 0.3.31
|
|
||||||
|
|
||||||
'@jridgewell/resolve-uri@3.1.2': {}
|
|
||||||
|
|
||||||
'@jridgewell/sourcemap-codec@1.5.5': {}
|
|
||||||
|
|
||||||
'@jridgewell/trace-mapping@0.3.31':
|
|
||||||
dependencies:
|
|
||||||
'@jridgewell/resolve-uri': 3.1.2
|
|
||||||
'@jridgewell/sourcemap-codec': 1.5.5
|
|
||||||
|
|
||||||
'@msgpack/msgpack@3.1.3': {}
|
|
||||||
|
|
||||||
'@noble/hashes@1.8.0': {}
|
|
||||||
|
|
||||||
'@paralleldrive/cuid2@2.3.1':
|
|
||||||
dependencies:
|
|
||||||
'@noble/hashes': 1.8.0
|
|
||||||
|
|
||||||
'@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.1)':
|
|
||||||
dependencies:
|
|
||||||
'@babel/generator': 7.29.1
|
|
||||||
'@babel/parser': 7.29.2
|
|
||||||
'@babel/traverse': 7.29.0
|
|
||||||
'@babel/types': 7.29.0
|
|
||||||
javascript-natural-sort: 0.7.1
|
|
||||||
lodash-es: 4.17.23
|
|
||||||
minimatch: 9.0.9
|
|
||||||
parse-imports-exports: 0.2.4
|
|
||||||
prettier: 3.8.1
|
|
||||||
transitivePeerDependencies:
|
|
||||||
- supports-color
|
|
||||||
|
|
||||||
asap@2.0.6: {}
|
|
||||||
|
|
||||||
balanced-match@1.0.2: {}
|
|
||||||
|
|
||||||
brace-expansion@2.0.2:
|
|
||||||
dependencies:
|
|
||||||
balanced-match: 1.0.2
|
|
||||||
|
|
||||||
debug@4.4.3:
|
|
||||||
dependencies:
|
|
||||||
ms: 2.1.3
|
|
||||||
|
|
||||||
dezalgo@1.0.4:
|
|
||||||
dependencies:
|
|
||||||
asap: 2.0.6
|
|
||||||
wrappy: 1.0.2
|
|
||||||
|
|
||||||
formidable@3.5.4:
|
|
||||||
dependencies:
|
|
||||||
'@paralleldrive/cuid2': 2.3.1
|
|
||||||
dezalgo: 1.0.4
|
|
||||||
once: 1.4.0
|
|
||||||
|
|
||||||
itty-router@5.0.23: {}
|
|
||||||
|
|
||||||
javascript-natural-sort@0.7.1: {}
|
|
||||||
|
|
||||||
js-tokens@4.0.0: {}
|
|
||||||
|
|
||||||
jsesc@3.1.0: {}
|
|
||||||
|
|
||||||
lodash-es@4.17.23: {}
|
|
||||||
|
|
||||||
minimatch@9.0.9:
|
|
||||||
dependencies:
|
|
||||||
brace-expansion: 2.0.2
|
|
||||||
|
|
||||||
ms@2.1.3: {}
|
|
||||||
|
|
||||||
once@1.4.0:
|
|
||||||
dependencies:
|
|
||||||
wrappy: 1.0.2
|
|
||||||
|
|
||||||
parse-imports-exports@0.2.4:
|
|
||||||
dependencies:
|
|
||||||
parse-statements: 1.0.11
|
|
||||||
|
|
||||||
parse-statements@1.0.11: {}
|
|
||||||
|
|
||||||
picocolors@1.1.1: {}
|
|
||||||
|
|
||||||
prettier@3.8.1: {}
|
|
||||||
|
|
||||||
wrappy@1.0.2: {}
|
|
||||||
@@ -130,9 +130,7 @@ let system_status = {
|
|||||||
// partitions: [],
|
// partitions: [],
|
||||||
developer_mode: true,
|
developer_mode: true,
|
||||||
model: '',
|
model: '',
|
||||||
board: '',
|
|
||||||
// model: 'BBQKees Electronics EMS Gateway E32 V2 (E32 V2.0 P3/2024011)',
|
// model: 'BBQKees Electronics EMS Gateway E32 V2 (E32 V2.0 P3/2024011)',
|
||||||
// board: 'E32V2',
|
|
||||||
// status: 0,
|
// status: 0,
|
||||||
status: 3
|
status: 3
|
||||||
};
|
};
|
||||||
@@ -363,8 +361,6 @@ function export_data(type: string) {
|
|||||||
return emsesp_modules;
|
return emsesp_modules;
|
||||||
case 'allvalues':
|
case 'allvalues':
|
||||||
return emsesp_allvalues;
|
return emsesp_allvalues;
|
||||||
case 'systembackup':
|
|
||||||
return emsesp_systembackup;
|
|
||||||
default:
|
default:
|
||||||
return status(404);
|
return status(404);
|
||||||
}
|
}
|
||||||
@@ -588,7 +584,6 @@ let mqtt_settings = {
|
|||||||
keep_alive: 60,
|
keep_alive: 60,
|
||||||
clean_session: true,
|
clean_session: true,
|
||||||
entity_format: 1,
|
entity_format: 1,
|
||||||
ha_number_mode: 0,
|
|
||||||
publish_time_boiler: 10,
|
publish_time_boiler: 10,
|
||||||
publish_time_thermostat: 10,
|
publish_time_thermostat: 10,
|
||||||
publish_time_solar: 10,
|
publish_time_solar: 10,
|
||||||
@@ -734,8 +729,6 @@ const emsesp_info = {
|
|||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
const emsesp_systembackup = {};
|
|
||||||
|
|
||||||
const emsesp_allvalues = {
|
const emsesp_allvalues = {
|
||||||
'Boiler Nefit Trendline HRC30 (DeviceID:0x08, ProductID:123, Version:06.01)': {
|
'Boiler Nefit Trendline HRC30 (DeviceID:0x08, ProductID:123, Version:06.01)': {
|
||||||
'force heating off': 'off',
|
'force heating off': 'off',
|
||||||
@@ -4568,7 +4561,7 @@ router
|
|||||||
let sorted_devices = [...emsesp_coredata.devices].sort((a, b) => a.t - b.t);
|
let sorted_devices = [...emsesp_coredata.devices].sort((a, b) => a.t - b.t);
|
||||||
// append emsesp_coredata to sorted_devices so Custom is always at the end of the list
|
// append emsesp_coredata to sorted_devices so Custom is always at the end of the list
|
||||||
sorted_devices.push(emsesp_coredata_custom);
|
sorted_devices.push(emsesp_coredata_custom);
|
||||||
// return { connected: false, devices: [] }; // uncomment if simulating no devices...
|
// sorted_devices = []; // uncomment if simulating no devices...
|
||||||
return { connected: true, devices: sorted_devices };
|
return { connected: true, devices: sorted_devices };
|
||||||
})
|
})
|
||||||
.get(EMSESP_SENSOR_DATA_ENDPOINT, () => {
|
.get(EMSESP_SENSOR_DATA_ENDPOINT, () => {
|
||||||
|
|||||||
@@ -15,14 +15,15 @@ description = EMS-ESP Firmware for the ESP32
|
|||||||
src_dir = src
|
src_dir = src
|
||||||
lib_dir = lib
|
lib_dir = lib
|
||||||
boards_dir = boards
|
boards_dir = boards
|
||||||
|
; build_cache_dir = .pio/build_cache
|
||||||
|
|
||||||
extra_configs =
|
extra_configs =
|
||||||
factory_settings.ini
|
factory_settings.ini
|
||||||
pio_local.ini
|
pio_local.ini
|
||||||
|
|
||||||
[common]
|
[common]
|
||||||
core_build_flags = -std=c++17 -std=gnu++17 -O3 -Wno-type-limits -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -Wno-format -Wno-missing-field-initializers
|
core_build_flags = -std=c++17 -std=gnu++17 -O3 -flto=auto -Wno-type-limits -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -Wno-format
|
||||||
core_unbuild_flags = -std=gnu++11
|
core_unbuild_flags = -std=gnu++11 -fno-lto
|
||||||
|
|
||||||
my_build_flags =
|
my_build_flags =
|
||||||
|
|
||||||
@@ -53,21 +54,13 @@ build_flags =
|
|||||||
unbuild_flags =
|
unbuild_flags =
|
||||||
${common.core_unbuild_flags}
|
${common.core_unbuild_flags}
|
||||||
|
|
||||||
; 4MB Flash variants
|
|
||||||
[espressif32_base_4M]
|
|
||||||
framework = arduino
|
|
||||||
board_build.partitions = partitions/esp32_partition_4M.csv
|
|
||||||
board_upload.flash_size = 4MB
|
|
||||||
board_build.app_partition_name = app0
|
|
||||||
platform = https://github.com/tasmota/platform-espressif32/releases/download/2026.03.50/platform-espressif32.zip ; Tasmota Arduino Core 3.3.7 based on IDF 5.5.3.260313
|
|
||||||
|
|
||||||
; 16MB Flash variants
|
; 16MB Flash variants
|
||||||
[espressif32_base_16M]
|
[espressif32_base_16M]
|
||||||
framework = arduino
|
framework = arduino
|
||||||
board_build.partitions = partitions/esp32_partition_16M.csv
|
board_build.partitions = partitions/esp32_partition_16M.csv
|
||||||
board_upload.flash_size = 16MB
|
board_upload.flash_size = 16MB
|
||||||
board_build.app_partition_name = app0
|
board_build.app_partition_name = app0
|
||||||
platform = https://github.com/tasmota/platform-espressif32/releases/download/2026.03.50/platform-espressif32.zip ; Tasmota Arduino Core 3.3.7 based on IDF 5.5.3.260313
|
platform = espressif32@6.12.0 ; Arduino Core 2.0.17 / IDF 4.4.7
|
||||||
|
|
||||||
; 32MB Flash variants
|
; 32MB Flash variants
|
||||||
[espressif32_base_32M]
|
[espressif32_base_32M]
|
||||||
@@ -75,7 +68,29 @@ framework = arduino
|
|||||||
board_build.partitions = partitions/esp32_partition_32M.csv
|
board_build.partitions = partitions/esp32_partition_32M.csv
|
||||||
board_upload.flash_size = 32MB
|
board_upload.flash_size = 32MB
|
||||||
board_build.app_partition_name = app0
|
board_build.app_partition_name = app0
|
||||||
platform = https://github.com/tasmota/platform-espressif32/releases/download/2026.03.50/platform-espressif32.zip ; Tasmota Arduino Core 3.3.7 based on IDF 5.5.3.260313
|
platform = espressif32@6.12.0 ; Arduino Core 2.0.17 / IDF 4.4.7
|
||||||
|
|
||||||
|
; use Tasmota's library for 4MB Flash variants.
|
||||||
|
; Removes libs (like mbedtsl, so no WiFi_secure.h) to increase available heap
|
||||||
|
[espressif32_base_T_4M]
|
||||||
|
framework = arduino
|
||||||
|
board_build.partitions = partitions/esp32_partition_4M.csv
|
||||||
|
board_upload.flash_size = 4MB
|
||||||
|
board_build.app_partition_name = app0
|
||||||
|
platform = https://github.com/tasmota/platform-espressif32/releases/download/2024.06.00/platform-espressif32.zip ; Arduino Core 2.0.18 with IPv6 support, based on IDF 4.4.8
|
||||||
|
; Tasmota Arduino Core 3.1.3.250302 based on IDF 5.3.2.250228
|
||||||
|
; platform = https://github.com/tasmota/platform-espressif32/releases/download/2025.03.30/platform-espressif32.zip
|
||||||
|
|
||||||
|
; use Tasmota's library for 16MB Flash variants.
|
||||||
|
; Removes libs (like mbedtsl, so no WiFi_secure.h) to increase available heap
|
||||||
|
[espressif32_base_T_16M]
|
||||||
|
framework = arduino
|
||||||
|
board_build.partitions = partitions/esp32_partition_16M.csv
|
||||||
|
board_upload.flash_size = 16MB
|
||||||
|
board_build.app_partition_name = app0
|
||||||
|
platform = https://github.com/tasmota/platform-espressif32/releases/download/2024.06.00/platform-espressif32.zip ; Arduino Core 2.0.18 with IPv6 support, based on IDF 4.4.8
|
||||||
|
; Tasmota Arduino Core 3.1.3.250302 based on IDF 5.3.2.250228
|
||||||
|
; platform = https://github.com/tasmota/platform-espressif32/releases/download/2025.03.30/platform-espressif32.zip
|
||||||
|
|
||||||
[env]
|
[env]
|
||||||
build_flags =
|
build_flags =
|
||||||
@@ -90,11 +105,10 @@ build_type = release
|
|||||||
board_build.filesystem = littlefs
|
board_build.filesystem = littlefs
|
||||||
lib_deps =
|
lib_deps =
|
||||||
bblanchon/ArduinoJson @ 7.4.2
|
bblanchon/ArduinoJson @ 7.4.2
|
||||||
ESP32Async/AsyncTCP @ 3.4.10
|
ESP32Async/AsyncTCP @ 3.4.9
|
||||||
ESP32Async/ESPAsyncWebServer @ 3.10.3
|
ESP32Async/ESPAsyncWebServer @ 3.9.3
|
||||||
https://github.com/mobizt/ReadyMail.git @ 0.3.8
|
https://github.com/emsesp/EMS-ESP-Modules.git @ 1.0.8
|
||||||
https://github.com/mobizt/ESP_SSLClient.git @ 3.1.3
|
|
||||||
; https://github.com/emsesp/EMS-ESP-Modules.git @ 1.0.8
|
|
||||||
|
|
||||||
; builds the web interface only, not the firmware
|
; builds the web interface only, not the firmware
|
||||||
[env:build_webUI]
|
[env:build_webUI]
|
||||||
@@ -106,17 +120,18 @@ build_src_filter = -<*>
|
|||||||
|
|
||||||
;
|
;
|
||||||
; Builds for different board types
|
; Builds for different board types
|
||||||
|
; We use Tasmota for boards without PSRAM as this framework has mbedtls removed to save memory.
|
||||||
; If you're building for a single target environment, we recommend creating a pio_local.ini (see example file)
|
; If you're building for a single target environment, we recommend creating a pio_local.ini (see example file)
|
||||||
;
|
;
|
||||||
|
|
||||||
[env:s_4M]
|
[env:s_4M]
|
||||||
; 4MB ESP32 - no SSL, no PSRAM - like a BBQKees older S32 and E32 models
|
; 4MB ESP32 - no SSL, no PSRAM - like a BBQKees older S32 and E32 models - uses Tasmota
|
||||||
extends = espressif32_base_4M
|
extends = espressif32_base_T_4M
|
||||||
board = s_4M
|
board = s_4M
|
||||||
|
|
||||||
[env:s_16M]
|
[env:s_16M]
|
||||||
; 16MB ESP32 - no PSRAM - like a BBQKees later S32 V2 models
|
; 16MB ESP32 - no PSRAM - like a BBQKees later S32 V2 models - uses Tasmota
|
||||||
extends = espressif32_base_16M
|
extends = espressif32_base_T_16M
|
||||||
board = s_16M
|
board = s_16M
|
||||||
|
|
||||||
[env:s_16M_P]
|
[env:s_16M_P]
|
||||||
@@ -135,29 +150,36 @@ extends = espressif32_base_32M
|
|||||||
board = s3_32M_P
|
board = s3_32M_P
|
||||||
|
|
||||||
[env:s2_4M_P]
|
[env:s2_4M_P]
|
||||||
; based on lolin_s2_mini 4MB with 2MB PSRAM
|
; based on lolin_s2_mini 4MB with 2MB PSRAM - uses Tasmota
|
||||||
extends = espressif32_base_4M
|
extends = espressif32_base_T_4M
|
||||||
board = s2_4M_P
|
board = s2_4M_P
|
||||||
|
|
||||||
[env:c3_mini_4M]
|
[env:c3_mini_4M]
|
||||||
; based on lolin_c3_mini 4MB, no PSRAM
|
; based on lolin_c3_mini 4MB, no PSRAM - uses Tasmota
|
||||||
extends = espressif32_base_4M
|
extends = espressif32_base_T_4M
|
||||||
board = c3_mini_4M
|
board = c3_mini_4M
|
||||||
|
|
||||||
; lolin C3 mini v1 needs special wifi initialization
|
; lolin C3 mini v1 needs special wifi initialization
|
||||||
; https://www.wemos.cc/en/latest/c3/c3_mini_1_0_0.html#about-wifi
|
; https://www.wemos.cc/en/latest/c3/c3_mini_1_0_0.html#about-wifi
|
||||||
[env:c3_miniv1_4M]
|
[env:c3_miniv1_4M]
|
||||||
extends = espressif32_base_4M
|
extends = espressif32_base_T_4M
|
||||||
board = c3_mini_4M
|
board = c3_mini_4M
|
||||||
build_flags =
|
build_flags =
|
||||||
${common.build_flags}
|
${common.build_flags}
|
||||||
-DBOARD_C3_MINI_V1
|
-DBOARD_C3_MINI_V1
|
||||||
|
|
||||||
; XIAO ESP32C - 512KB SRAM & 4MB Flash - https://wiki.seeedstudio.com/xiao_esp32c6_getting_started/
|
; XIAO ESP32C - 512KB SRAM & 4MB Flash - https://wiki.seeedstudio.com/xiao_esp32c6_getting_started/
|
||||||
[env:c6_xiao_4M]
|
[env:c6]
|
||||||
extends = espressif32_base_4M
|
framework = arduino
|
||||||
|
board_build.partitions = partitions/esp32_partition_4M.csv
|
||||||
|
board_upload.flash_size = 4MB
|
||||||
board_build.app_partition_name = app0
|
board_build.app_partition_name = app0
|
||||||
|
platform = https://github.com/pioarduino/platform-espressif32/releases/download/54.03.21-2/platform-espressif32.zip ; Arduino Release v3.2.1 based on ESP-IDF v5.4.2
|
||||||
|
; platform = https://github.com/pioarduino/platform-espressif32/releases/download/55.03.30-2/platform-espressif32.zip ; Arduino Release v3.3.0 based on ESP-IDF v5.5.0
|
||||||
board = seeed_xiao_esp32c6
|
board = seeed_xiao_esp32c6
|
||||||
|
build_flags =
|
||||||
|
${common.build_flags}
|
||||||
|
-DBOARD_C6
|
||||||
|
|
||||||
; foundation for building and testing natively, standalone without an ESP32
|
; foundation for building and testing natively, standalone without an ESP32
|
||||||
; use the `standalone` environment instead of `native` for testing
|
; use the `standalone` environment instead of `native` for testing
|
||||||
@@ -168,7 +190,6 @@ build_flags =
|
|||||||
build_src_flags =
|
build_src_flags =
|
||||||
-DEMSESP_STANDALONE -DEMSESP_TEST
|
-DEMSESP_STANDALONE -DEMSESP_TEST
|
||||||
-DARDUINOJSON_ENABLE_ARDUINO_STRING=1
|
-DARDUINOJSON_ENABLE_ARDUINO_STRING=1
|
||||||
-DNO_TLS_SUPPORT
|
|
||||||
-std=gnu++17 -Og -ggdb
|
-std=gnu++17 -Og -ggdb
|
||||||
-Wall -Wextra
|
-Wall -Wextra
|
||||||
-Wno-unused-parameter -Wno-sign-compare -Wno-missing-braces
|
-Wno-unused-parameter -Wno-sign-compare -Wno-missing-braces
|
||||||
@@ -191,8 +212,6 @@ build_src_filter =
|
|||||||
-<../lib/uuid-syslog>
|
-<../lib/uuid-syslog>
|
||||||
-<../lib/eModbus>
|
-<../lib/eModbus>
|
||||||
-<../lib/OneWire>
|
-<../lib/OneWire>
|
||||||
-<../lib/mbedtls_ssl/src>
|
|
||||||
-<../src/core/ModuleLibrary.cpp>
|
|
||||||
lib_ldf_mode = off
|
lib_ldf_mode = off
|
||||||
lib_deps =
|
lib_deps =
|
||||||
|
|
||||||
@@ -209,8 +228,7 @@ build_src_flags =
|
|||||||
-DEMSESP_STANDALONE -DEMSESP_TEST
|
-DEMSESP_STANDALONE -DEMSESP_TEST
|
||||||
-DEMSESP_UNITY
|
-DEMSESP_UNITY
|
||||||
-DARDUINOJSON_ENABLE_ARDUINO_STRING=1
|
-DARDUINOJSON_ENABLE_ARDUINO_STRING=1
|
||||||
-DNO_TLS_SUPPORT
|
-DEMSESP_DEFAULT_LOCALE=\"en\" -DEMSESP_DEFAULT_TX_MODE=8 -DEMSESP_DEFAULT_VERSION=\"3.8.0-dev.0\" -DEMSESP_DEFAULT_BOARD_PROFILE=\"S32\"
|
||||||
-DEMSESP_DEFAULT_LOCALE=\"en\" -DEMSESP_DEFAULT_BOARD_PROFILE=\"S32\"
|
|
||||||
-std=gnu++17 -Og -ggdb
|
-std=gnu++17 -Og -ggdb
|
||||||
-Wall -Wextra
|
-Wall -Wextra
|
||||||
-Wno-unused-parameter -Wno-sign-compare -Wno-missing-braces
|
-Wno-unused-parameter -Wno-sign-compare -Wno-missing-braces
|
||||||
@@ -236,8 +254,6 @@ build_src_filter =
|
|||||||
-<../lib/uuid-syslog>
|
-<../lib/uuid-syslog>
|
||||||
-<../lib/eModbus>
|
-<../lib/eModbus>
|
||||||
-<../lib/OneWire>
|
-<../lib/OneWire>
|
||||||
-<../lib/mbedtls_ssl/src>
|
|
||||||
-<../src/core/ModuleLibrary.cpp>
|
|
||||||
lib_ldf_mode = off
|
lib_ldf_mode = off
|
||||||
lib_deps = Unity
|
lib_deps = Unity
|
||||||
test_testing_command =
|
test_testing_command =
|
||||||
@@ -268,7 +284,7 @@ build_flags =
|
|||||||
[env:standalone]
|
[env:standalone]
|
||||||
extends = env:native
|
extends = env:native
|
||||||
build_flags =
|
build_flags =
|
||||||
-DEMSESP_DEFAULT_LOCALE=\"en\" -DEMSESP_DEFAULT_BOARD_PROFILE=\"S32\"
|
-DEMSESP_DEFAULT_LOCALE=\"en\" -DEMSESP_DEFAULT_TX_MODE=8 -DEMSESP_DEFAULT_VERSION=\"3.8.0-dev.0\" -DEMSESP_DEFAULT_BOARD_PROFILE=\"S32\"
|
||||||
|
|
||||||
; Modbus
|
; Modbus
|
||||||
; Creates the file modbus_entity_parameters.hpp
|
; Creates the file modbus_entity_parameters.hpp
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -94,9 +94,8 @@ def print_device_entities(device_name, device_entities):
|
|||||||
type_suffix = split_type[1] if len(split_type) > 1 else ""
|
type_suffix = split_type[1] if len(split_type) > 1 else ""
|
||||||
|
|
||||||
# Optimize type_rest extraction and int range detection
|
# Optimize type_rest extraction and int range detection
|
||||||
type_rest_str = ""
|
type_rest_str = type_suffix
|
||||||
if "int" in type_base and "(" in type_suffix:
|
if "int" in type_base and "(" in type_suffix:
|
||||||
print(type_base)
|
|
||||||
try:
|
try:
|
||||||
# Extract inner part of parentheses
|
# Extract inner part of parentheses
|
||||||
range_inner = type_suffix[type_suffix.index("(")+1:type_suffix.index(")")]
|
range_inner = type_suffix[type_suffix.index("(")+1:type_suffix.index(")")]
|
||||||
@@ -107,12 +106,14 @@ def print_device_entities(device_name, device_entities):
|
|||||||
elif "/" in range_inner:
|
elif "/" in range_inner:
|
||||||
min_value, max_value = range_inner.split("/")
|
min_value, max_value = range_inner.split("/")
|
||||||
if min_value is not None and max_value is not None:
|
if min_value is not None and max_value is not None:
|
||||||
type_rest_str = f" (>={min_value.strip()}<={max_value.strip()})"
|
type_rest_str = f"(>={min_value.strip()}<={max_value.strip()})"
|
||||||
|
else:
|
||||||
|
type_rest_str = ""
|
||||||
except Exception:
|
except Exception:
|
||||||
# fallback to original
|
# fallback to original
|
||||||
pass
|
pass
|
||||||
|
|
||||||
print(f"| {entity['shortname']} | {entity['fullname']} | {type_base}{type_rest_str} | "
|
print(f"| {entity['shortname']} | {entity['fullname']} | {type_base} {type_rest_str} | "
|
||||||
f"{entity['uom']} | {entity['writeable']} | {tag_type} | {entity['modbus offset']} | "
|
f"{entity['uom']} | {entity['writeable']} | {tag_type} | {entity['modbus offset']} | "
|
||||||
f"{entity['modbus count']} | {entity['modbus scale factor']} |")
|
f"{entity['modbus count']} | {entity['modbus scale factor']} |")
|
||||||
print()
|
print()
|
||||||
@@ -134,9 +135,6 @@ def print_device_type_devices(device_type, devices):
|
|||||||
|
|
||||||
def print_header():
|
def print_header():
|
||||||
"""Print the markdown document header."""
|
"""Print the markdown document header."""
|
||||||
print("---")
|
|
||||||
print("id: Modbus-Entity-Registers")
|
|
||||||
print("---")
|
|
||||||
print("# Modbus Entity/Register Mapping")
|
print("# Modbus Entity/Register Mapping")
|
||||||
print()
|
print()
|
||||||
print(":::warning")
|
print(":::warning")
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ APSettingsService::APSettingsService(AsyncWebServer * server, FS * fs, SecurityM
|
|||||||
, _reconfigureAp(false)
|
, _reconfigureAp(false)
|
||||||
, _connected(0) {
|
, _connected(0) {
|
||||||
addUpdateHandler([this] { reconfigureAP(); }, false);
|
addUpdateHandler([this] { reconfigureAP(); }, false);
|
||||||
|
WiFi.onEvent([this](WiFiEvent_t event, WiFiEventInfo_t info) { WiFiEvent(event); });
|
||||||
}
|
}
|
||||||
|
|
||||||
void APSettingsService::begin() {
|
void APSettingsService::begin() {
|
||||||
@@ -18,40 +19,51 @@ void APSettingsService::begin() {
|
|||||||
// reconfigureAP();
|
// reconfigureAP();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// wait 10 sec on STA disconnect before starting AP
|
||||||
|
void APSettingsService::WiFiEvent(WiFiEvent_t event) {
|
||||||
|
uint8_t was_connected = _connected;
|
||||||
|
switch (event) {
|
||||||
|
case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
|
||||||
|
_connected &= ~1;
|
||||||
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_DISCONNECTED:
|
||||||
|
_connected &= ~2;
|
||||||
|
break;
|
||||||
|
case ARDUINO_EVENT_WIFI_STA_GOT_IP:
|
||||||
|
case ARDUINO_EVENT_WIFI_STA_GOT_IP6:
|
||||||
|
_connected |= 1;
|
||||||
|
break;
|
||||||
|
case ARDUINO_EVENT_ETH_GOT_IP:
|
||||||
|
case ARDUINO_EVENT_ETH_GOT_IP6:
|
||||||
|
_connected |= 2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// wait 10 sec before starting AP
|
||||||
|
if (was_connected && !_connected) {
|
||||||
|
_lastManaged = uuid::get_uptime();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void APSettingsService::reconfigureAP() {
|
void APSettingsService::reconfigureAP() {
|
||||||
_lastManaged = uuid::get_uptime() - MANAGE_NETWORK_DELAY;
|
_lastManaged = uuid::get_uptime() - MANAGE_NETWORK_DELAY;
|
||||||
_reconfigureAp = true;
|
_reconfigureAp = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void APSettingsService::loop() {
|
void APSettingsService::loop() {
|
||||||
const uint8_t was_connected = _connected;
|
unsigned long currentMillis = uuid::get_uptime();
|
||||||
if (WiFi.isConnected()) {
|
unsigned long manageElapsed = static_cast<uint32_t>(currentMillis - _lastManaged);
|
||||||
_connected |= 1U;
|
if (manageElapsed >= MANAGE_NETWORK_DELAY) {
|
||||||
} else {
|
|
||||||
_connected &= ~1U;
|
|
||||||
}
|
|
||||||
if (ETH.connected()) {
|
|
||||||
_connected |= 2U;
|
|
||||||
} else {
|
|
||||||
_connected &= ~2U;
|
|
||||||
}
|
|
||||||
// wait 10 sec before starting AP
|
|
||||||
if (was_connected && !_connected) {
|
|
||||||
_lastManaged = uuid::get_uptime();
|
|
||||||
}
|
|
||||||
const unsigned long currentMillis = uuid::get_uptime();
|
|
||||||
if ((currentMillis - _lastManaged) >= MANAGE_NETWORK_DELAY) {
|
|
||||||
_lastManaged = currentMillis;
|
_lastManaged = currentMillis;
|
||||||
manageAP();
|
manageAP();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_dnsServer) {
|
|
||||||
handleDNS();
|
handleDNS();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void APSettingsService::manageAP() {
|
void APSettingsService::manageAP() {
|
||||||
const WiFiMode_t currentWiFiMode = WiFi.getMode();
|
WiFiMode_t currentWiFiMode = WiFi.getMode();
|
||||||
if (_state.provisionMode == AP_MODE_ALWAYS || (_state.provisionMode == AP_MODE_DISCONNECTED && !_connected)) {
|
if (_state.provisionMode == AP_MODE_ALWAYS || (_state.provisionMode == AP_MODE_DISCONNECTED && !_connected)) {
|
||||||
if (_reconfigureAp || currentWiFiMode == WIFI_OFF || currentWiFiMode == WIFI_STA) {
|
if (_reconfigureAp || currentWiFiMode == WIFI_OFF || currentWiFiMode == WIFI_STA) {
|
||||||
startAP();
|
startAP();
|
||||||
@@ -63,7 +75,11 @@ void APSettingsService::manageAP() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void APSettingsService::startAP() {
|
void APSettingsService::startAP() {
|
||||||
|
#if ESP_IDF_VERSION_MAJOR < 5
|
||||||
|
WiFi.softAPenableIpV6(); // force IPV6, same as for WiFi - fixes https://github.com/emsesp/EMS-ESP32/issues/1922
|
||||||
|
#else
|
||||||
WiFi.softAPenableIPv6(); // force IPV6, same as for WiFi - fixes https://github.com/emsesp/EMS-ESP32/issues/1922
|
WiFi.softAPenableIPv6(); // force IPV6, same as for WiFi - fixes https://github.com/emsesp/EMS-ESP32/issues/1922
|
||||||
|
#endif
|
||||||
WiFi.softAPConfig(_state.localIP, _state.gatewayIP, _state.subnetMask);
|
WiFi.softAPConfig(_state.localIP, _state.gatewayIP, _state.subnetMask);
|
||||||
esp_wifi_set_bandwidth(static_cast<wifi_interface_t>(ESP_IF_WIFI_AP), WIFI_BW_HT20);
|
esp_wifi_set_bandwidth(static_cast<wifi_interface_t>(ESP_IF_WIFI_AP), WIFI_BW_HT20);
|
||||||
WiFi.softAP(_state.ssid.c_str(), _state.password.c_str(), _state.channel, _state.ssidHidden, _state.maxClients);
|
WiFi.softAP(_state.ssid.c_str(), _state.password.c_str(), _state.channel, _state.ssidHidden, _state.maxClients);
|
||||||
@@ -71,10 +87,8 @@ void APSettingsService::startAP() {
|
|||||||
WiFi.setTxPower(WIFI_POWER_8_5dBm); // https://www.wemos.cc/en/latest/c3/c3_mini_1_0_0.html#about-wifi
|
WiFi.setTxPower(WIFI_POWER_8_5dBm); // https://www.wemos.cc/en/latest/c3/c3_mini_1_0_0.html#about-wifi
|
||||||
#endif
|
#endif
|
||||||
if (!_dnsServer) {
|
if (!_dnsServer) {
|
||||||
const IPAddress apIp = WiFi.softAPIP();
|
IPAddress apIp = WiFi.softAPIP();
|
||||||
char ipStr[16];
|
emsesp::EMSESP::logger().info("Starting Access Point with captive portal on %s", apIp.toString().c_str());
|
||||||
snprintf(ipStr, sizeof(ipStr), "%u.%u.%u.%u", apIp[0], apIp[1], apIp[2], apIp[3]);
|
|
||||||
emsesp::EMSESP::logger().info("Starting Access Point with captive portal on %s", ipStr);
|
|
||||||
_dnsServer = new DNSServer;
|
_dnsServer = new DNSServer;
|
||||||
_dnsServer->start(DNS_PORT, "*", apIp);
|
_dnsServer->start(DNS_PORT, "*", apIp);
|
||||||
}
|
}
|
||||||
@@ -97,8 +111,8 @@ void APSettingsService::handleDNS() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
APNetworkStatus APSettingsService::getAPNetworkStatus() {
|
APNetworkStatus APSettingsService::getAPNetworkStatus() {
|
||||||
const WiFiMode_t currentWiFiMode = WiFi.getMode();
|
WiFiMode_t currentWiFiMode = WiFi.getMode();
|
||||||
const bool apActive = (currentWiFiMode == WIFI_AP || currentWiFiMode == WIFI_AP_STA);
|
bool apActive = currentWiFiMode == WIFI_AP || currentWiFiMode == WIFI_AP_STA;
|
||||||
|
|
||||||
if (apActive && _state.provisionMode != AP_MODE_ALWAYS && WiFi.status() == WL_CONNECTED) {
|
if (apActive && _state.provisionMode != AP_MODE_ALWAYS && WiFi.status() == WL_CONNECTED) {
|
||||||
return APNetworkStatus::LINGERING;
|
return APNetworkStatus::LINGERING;
|
||||||
@@ -121,7 +135,7 @@ void APSettings::read(const APSettings & settings, JsonObject root) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
StateUpdateResult APSettings::update(JsonObject root, APSettings & settings) {
|
StateUpdateResult APSettings::update(JsonObject root, APSettings & settings) {
|
||||||
APSettings newSettings{};
|
APSettings newSettings = {};
|
||||||
newSettings.provisionMode = static_cast<uint8_t>(root["provision_mode"] | FACTORY_AP_PROVISION_MODE);
|
newSettings.provisionMode = static_cast<uint8_t>(root["provision_mode"] | FACTORY_AP_PROVISION_MODE);
|
||||||
|
|
||||||
switch (settings.provisionMode) {
|
switch (settings.provisionMode) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef APSettingsService_h
|
#ifndef APSettingsConfig_h
|
||||||
#define APSettingsService_h
|
#define APSettingsConfig_h
|
||||||
|
|
||||||
#include "HttpEndpoint.h"
|
#include "HttpEndpoint.h"
|
||||||
#include "FSPersistence.h"
|
#include "FSPersistence.h"
|
||||||
@@ -58,21 +58,21 @@ enum APNetworkStatus { ACTIVE = 0, INACTIVE, LINGERING };
|
|||||||
|
|
||||||
class APSettings {
|
class APSettings {
|
||||||
public:
|
public:
|
||||||
uint8_t provisionMode = FACTORY_AP_PROVISION_MODE; // 0 = on, 2 = off
|
uint8_t provisionMode; // 0 = on, 2 = off
|
||||||
String ssid = FACTORY_AP_SSID;
|
String ssid;
|
||||||
String password = FACTORY_AP_PASSWORD;
|
String password;
|
||||||
uint8_t channel = FACTORY_AP_CHANNEL;
|
uint8_t channel;
|
||||||
bool ssidHidden = FACTORY_AP_SSID_HIDDEN;
|
bool ssidHidden;
|
||||||
uint8_t maxClients = FACTORY_AP_MAX_CLIENTS;
|
uint8_t maxClients;
|
||||||
|
|
||||||
IPAddress localIP;
|
IPAddress localIP;
|
||||||
IPAddress gatewayIP;
|
IPAddress gatewayIP;
|
||||||
IPAddress subnetMask;
|
IPAddress subnetMask;
|
||||||
|
|
||||||
bool operator==(const APSettings & settings) const {
|
bool operator==(const APSettings & settings) const {
|
||||||
return provisionMode == settings.provisionMode && channel == settings.channel && ssidHidden == settings.ssidHidden && maxClients == settings.maxClients
|
return provisionMode == settings.provisionMode && ssid == settings.ssid && password == settings.password && channel == settings.channel
|
||||||
&& localIP == settings.localIP && gatewayIP == settings.gatewayIP && subnetMask == settings.subnetMask && ssid == settings.ssid
|
&& ssidHidden == settings.ssidHidden && maxClients == settings.maxClients && localIP == settings.localIP && gatewayIP == settings.gatewayIP
|
||||||
&& password == settings.password;
|
&& subnetMask == settings.subnetMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void read(const APSettings & settings, JsonObject root);
|
static void read(const APSettings & settings, JsonObject root);
|
||||||
@@ -96,14 +96,15 @@ class APSettingsService : public StatefulService<APSettings> {
|
|||||||
|
|
||||||
// for the management delay loop
|
// for the management delay loop
|
||||||
volatile unsigned long _lastManaged;
|
volatile unsigned long _lastManaged;
|
||||||
volatile bool _reconfigureAp;
|
volatile boolean _reconfigureAp;
|
||||||
volatile uint8_t _connected;
|
uint8_t _connected;
|
||||||
|
|
||||||
void reconfigureAP();
|
void reconfigureAP();
|
||||||
void manageAP();
|
void manageAP();
|
||||||
void startAP();
|
void startAP();
|
||||||
void stopAP();
|
void stopAP();
|
||||||
void handleDNS();
|
void handleDNS();
|
||||||
|
void WiFiEvent(WiFiEvent_t event);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user